Repository: google/adk-go Branch: main Commit: d06c264127d8 Files: 374 Total size: 6.6 MB Directory structure: gitextract_gssbqr3a/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ ├── actions/ │ │ └── setup/ │ │ └── action.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── go.yml │ └── nightly.yml ├── .gitignore ├── .golangci.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── agent/ │ ├── agent.go │ ├── agent_test.go │ ├── context.go │ ├── doc.go │ ├── llmagent/ │ │ ├── doc.go │ │ ├── llmagent.go │ │ ├── llmagent_saveoutput_test.go │ │ ├── llmagent_test.go │ │ ├── state_agent_test.go │ │ └── testdata/ │ │ ├── TestFunctionTool.httprr │ │ ├── TestLLMAgentStreamingModeSSE.httprr │ │ ├── TestLLMAgent_healthy_backend.httprr │ │ ├── TestToolCallback_after_callback_response_used.httprr │ │ ├── TestToolCallback_after_callback_returned_when_used_with_before_callback.httprr │ │ ├── TestToolCallback_before_callback_response_used.httprr │ │ ├── TestToolCallback_both_callbacks_return_nil_actual_tool_is_executed.httprr │ │ ├── TestToolCallback_extra_after_callback_skipped.httprr │ │ └── TestToolCallback_extra_before_callback_skipped.httprr │ ├── loader.go │ ├── loader_test.go │ ├── remoteagent/ │ │ ├── a2a_agent.go │ │ ├── a2a_agent_run_processor.go │ │ ├── a2a_agent_run_processor_test.go │ │ ├── a2a_agent_test.go │ │ ├── a2a_e2e_test.go │ │ ├── doc.go │ │ ├── testdata/ │ │ │ ├── TestA2ARemoteAgentStreamingGeminiError.httprr │ │ │ ├── TestA2ARemoteAgentStreamingGeminiSuccess.httprr │ │ │ ├── TestA2ASingleHopFinalResponse_llm_mid-response_error.httprr │ │ │ └── TestA2ASingleHopFinalResponse_llm_mid-response_error_response.httprr │ │ ├── utils.go │ │ └── utils_test.go │ ├── run_config.go │ └── workflowagents/ │ ├── loopagent/ │ │ ├── agent.go │ │ └── agent_test.go │ ├── parallelagent/ │ │ ├── agent.go │ │ ├── agent_test.go │ │ └── testdata/ │ │ ├── TestParallelAgentWithTools_agent1.httprr │ │ └── TestParallelAgentWithTools_agent2.httprr │ └── sequentialagent/ │ ├── agent.go │ └── agent_test.go ├── artifact/ │ ├── artifact_key_test.go │ ├── gcsartifact/ │ │ ├── gcs_client.go │ │ ├── gcs_test.go │ │ └── service.go │ ├── inmemory.go │ ├── inmemory_test.go │ ├── request_validation_test.go │ └── service.go ├── cmd/ │ ├── adkgo/ │ │ ├── adkgo.go │ │ └── internal/ │ │ ├── deploy/ │ │ │ ├── cloudrun/ │ │ │ │ └── cloudrun.go │ │ │ └── deploy.go │ │ └── root/ │ │ └── root.go │ ├── internal/ │ │ └── adkcli/ │ │ └── main.go │ └── launcher/ │ ├── console/ │ │ └── console.go │ ├── full/ │ │ └── full.go │ ├── internal/ │ │ └── telemetry/ │ │ └── telemetry.go │ ├── launcher.go │ ├── prod/ │ │ └── prod.go │ ├── universal/ │ │ └── universal.go │ └── web/ │ ├── a2a/ │ │ ├── a2a.go │ │ └── a2a_test.go │ ├── api/ │ │ └── api.go │ ├── web.go │ └── webui/ │ ├── distr/ │ │ ├── assets/ │ │ │ ├── audio-processor.js │ │ │ └── config/ │ │ │ └── runtime-config.json │ │ ├── chunk-2FK4DXD6.js │ │ ├── chunk-4ZK7FQPX.js │ │ ├── chunk-7TJPJFPQ.js │ │ ├── chunk-ABUNXR7C.js │ │ ├── chunk-BWOBGCSA.js │ │ ├── chunk-C7MGZAFQ.js │ │ ├── chunk-CZPJTTNC.js │ │ ├── chunk-GLGRLUIJ.js │ │ ├── chunk-JFJZPIJV.js │ │ ├── chunk-JOTH6MSK.js │ │ ├── chunk-KPALJACC.js │ │ ├── chunk-P66EZ4FO.js │ │ ├── chunk-POBF2O3Z.js │ │ ├── chunk-QWN7CXIU.js │ │ ├── chunk-QZL3KUOO.js │ │ ├── chunk-R2V2IE5A.js │ │ ├── chunk-W7GRJBO5.js │ │ ├── chunk-YQ6GIDJJ.js │ │ ├── index.html │ │ ├── main-ORIYWHAC.js │ │ ├── polyfills-5CFQRCPP.js │ │ └── styles-YY6V3TJU.css │ └── webui.go ├── examples/ │ ├── README.md │ ├── a2a/ │ │ └── main.go │ ├── mcp/ │ │ └── main.go │ ├── quickstart/ │ │ └── main.go │ ├── rest/ │ │ └── main.go │ ├── telemetry/ │ │ └── main.go │ ├── toolconfirmation/ │ │ └── main.go │ ├── tools/ │ │ ├── loadartifacts/ │ │ │ └── main.go │ │ ├── loadmemory/ │ │ │ └── main.go │ │ └── multipletools/ │ │ └── main.go │ ├── vertexai/ │ │ ├── agent.go │ │ ├── imagegenerator/ │ │ │ └── main.go │ │ └── vertexengine/ │ │ └── create_engine.go │ ├── web/ │ │ ├── agents/ │ │ │ ├── image_generator.go │ │ │ └── llmauditor.go │ │ └── main.go │ └── workflowagents/ │ ├── loop/ │ │ └── main.go │ ├── parallel/ │ │ └── main.go │ ├── sequential/ │ │ └── main.go │ └── sequentialCode/ │ └── main.go ├── go.mod ├── go.sum ├── internal/ │ ├── agent/ │ │ ├── parentmap/ │ │ │ ├── map.go │ │ │ └── map_test.go │ │ ├── remoteagent/ │ │ │ └── a2a_config.go │ │ ├── runconfig/ │ │ │ └── run_config.go │ │ └── state.go │ ├── artifact/ │ │ ├── artifacts.go │ │ ├── artifacts_test.go │ │ └── tests/ │ │ └── service_suite.go │ ├── cli/ │ │ └── util/ │ │ ├── doc.go │ │ ├── flagset_helpers.go │ │ ├── oscmd.go │ │ └── text_helpers.go │ ├── configurable/ │ │ ├── configurable.go │ │ ├── configurable_utils.go │ │ └── conformance/ │ │ ├── callbacks.go │ │ ├── functions.go │ │ ├── loader.go │ │ └── replayplugin/ │ │ ├── invocation_replay_state.go │ │ ├── recording/ │ │ │ └── recording.go │ │ ├── replay_plugin.go │ │ ├── replay_plugin_test.go │ │ └── yaml_utils.go │ ├── context/ │ │ ├── callback_context.go │ │ ├── context_test.go │ │ ├── invocation_context.go │ │ └── readonly_context.go │ ├── converters/ │ │ └── map_structure.go │ ├── httprr/ │ │ ├── LICENSE │ │ ├── rr.go │ │ └── rr_test.go │ ├── llminternal/ │ │ ├── agent.go │ │ ├── agent_transfer.go │ │ ├── agent_transfer_test.go │ │ ├── base_flow.go │ │ ├── base_flow_telemetry_test.go │ │ ├── base_flow_test.go │ │ ├── basic_processor.go │ │ ├── clone_test.go │ │ ├── contents_processor.go │ │ ├── contents_processor_test.go │ │ ├── converters/ │ │ │ └── converters.go │ │ ├── file_uploads_processor.go │ │ ├── functions.go │ │ ├── functions_test.go │ │ ├── googlellm/ │ │ │ ├── variant.go │ │ │ └── variant_test.go │ │ ├── handle_function_calls_async_test.go │ │ ├── helpers_test.go │ │ ├── identity_request_processor.go │ │ ├── identity_request_processor_test.go │ │ ├── instruction_processor.go │ │ ├── instruction_processor_test.go │ │ ├── other_processors.go │ │ ├── outputschema_processor.go │ │ ├── outputschema_processor_test.go │ │ ├── parallel_function_call_test.go │ │ ├── request_confirmation_processor.go │ │ ├── request_confirmation_processor_test.go │ │ ├── stream_aggregator.go │ │ ├── stream_aggregator_test.go │ │ ├── testdata/ │ │ │ ├── TestParallelFunctionCalls_test_parallel_function_calls_gemini-2.5-flash.httprr │ │ │ ├── TestParallelFunctionCalls_test_parallel_function_calls_gemini-3-flash-preview.httprr │ │ │ └── TestParallelFunctionCalls_test_parallel_function_calls_gemini-3.1-pro-preview.httprr │ │ └── tools_processor.go │ ├── memory/ │ │ ├── memory.go │ │ └── memory_test.go │ ├── plugininternal/ │ │ ├── plugin_manager.go │ │ └── plugincontext/ │ │ └── context.go │ ├── sessionutils/ │ │ └── utils.go │ ├── style_test.go │ ├── telemetry/ │ │ ├── converters.go │ │ ├── converters_test.go │ │ ├── logger.go │ │ ├── logger_test.go │ │ ├── telemetry.go │ │ └── telemetry_test.go │ ├── testutil/ │ │ ├── genai.go │ │ └── test_agent_runner.go │ ├── toolinternal/ │ │ ├── context.go │ │ ├── context_test.go │ │ ├── tool.go │ │ └── toolutils/ │ │ └── toolutils.go │ ├── typeutil/ │ │ └── convert.go │ ├── utils/ │ │ ├── schema_test.go │ │ ├── schema_utils.go │ │ ├── utils.go │ │ └── utils_test.go │ └── version/ │ └── version.go ├── memory/ │ ├── inmemory.go │ ├── inmemory_test.go │ └── service.go ├── model/ │ ├── apigee/ │ │ ├── apigee.go │ │ └── apigee_test.go │ ├── gemini/ │ │ ├── gemini.go │ │ ├── gemini_test.go │ │ └── testdata/ │ │ ├── TestModel_GenerateStream_ok.httprr │ │ ├── TestModel_Generate_ok.httprr │ │ ├── TestModel_TrackingHeaders_verifies_headers_are_set_vertex_disabled.httprr │ │ └── TestModel_TrackingHeaders_verifies_headers_are_set_vertex_enabled.httprr │ ├── llm.go │ └── llm_test.go ├── plugin/ │ ├── functioncallmodifier/ │ │ ├── integration_test.go │ │ ├── plugin.go │ │ ├── plugin_test.go │ │ └── testdata/ │ │ ├── TestPluginCallbackIntegration_agent_tool_default_schema.httprr │ │ ├── TestPluginCallbackIntegration_no_relevant_tools.httprr │ │ └── TestPluginCallbackIntegration_transfer_to_agent_tool.httprr │ ├── loggingplugin/ │ │ └── logging_plugin.go │ ├── plugin.go │ ├── plugin_manager_test.go │ ├── plugin_test.go │ └── retryandreflect/ │ ├── exceeded.md │ ├── plugin.go │ ├── plugin_test.go │ └── reflection.md ├── runner/ │ ├── runner.go │ └── runner_test.go ├── scripts/ │ └── adk-web/ │ ├── Dockerfile │ └── update-adk-web.sh ├── server/ │ ├── adka2a/ │ │ ├── agent_card.go │ │ ├── agent_card_test.go │ │ ├── doc.go │ │ ├── events.go │ │ ├── events_test.go │ │ ├── executor.go │ │ ├── executor_context.go │ │ ├── executor_plugin.go │ │ ├── executor_test.go │ │ ├── input_required.go │ │ ├── metadata.go │ │ ├── metadata_test.go │ │ ├── parts.go │ │ ├── parts_test.go │ │ ├── processor.go │ │ ├── processor_test.go │ │ ├── task_artifact.go │ │ └── utils.go │ ├── adkrest/ │ │ ├── controllers/ │ │ │ ├── apps.go │ │ │ ├── artifacts.go │ │ │ ├── debug.go │ │ │ ├── debug_test.go │ │ │ ├── errors.go │ │ │ ├── handlers.go │ │ │ ├── runtime.go │ │ │ ├── runtime_test.go │ │ │ ├── sessions.go │ │ │ └── sessions_test.go │ │ ├── handler.go │ │ └── internal/ │ │ ├── fakes/ │ │ │ └── testsessionservice.go │ │ ├── models/ │ │ │ ├── event.go │ │ │ ├── models.go │ │ │ ├── runtime.go │ │ │ └── session.go │ │ ├── routers/ │ │ │ ├── apps.go │ │ │ ├── artifacts.go │ │ │ ├── debug.go │ │ │ ├── eval.go │ │ │ ├── routers.go │ │ │ ├── runtime.go │ │ │ └── sessions.go │ │ └── services/ │ │ ├── agentgraphgenerator.go │ │ ├── agentgraphgenerator_test.go │ │ ├── debugtelemetry.go │ │ ├── debugtelemetry_test.go │ │ └── doc.go │ └── doc.go ├── session/ │ ├── database/ │ │ ├── gorm_datatypes.go │ │ ├── service.go │ │ ├── service_test.go │ │ ├── session.go │ │ └── storage_session.go │ ├── doc.go │ ├── inmemory.go │ ├── inmemory_test.go │ ├── service.go │ ├── session.go │ └── vertexai/ │ ├── service_test.go │ ├── session.go │ ├── testdata/ │ │ ├── app_state_is_shared.replay │ │ ├── append_event_to_the_session_and_overwrite_in_storage.replay │ │ ├── append_event_to_the_session_with_events_and_overwrite_in_storage.replay │ │ ├── append_event_when_session_not_found_should_fail.replay │ │ ├── append_event_with_all_fields.replay │ │ ├── append_event_with_bytes_content.replay │ │ ├── empty_list_for_non-existent_user.replay │ │ ├── error_when_not_found.replay │ │ ├── full_key.replay │ │ ├── generated_session_id.replay │ │ ├── get_session_respects_user_id.replay │ │ ├── list_all_users_for_app.replay │ │ ├── list_for_user1.replay │ │ ├── list_for_user2.replay │ │ ├── missing_author.replay │ │ ├── missing_invocation_id.replay │ │ ├── missing_session_id.replay │ │ ├── nil_event.replay │ │ ├── ok.replay │ │ ├── partial_events_are_not_persisted.replay │ │ ├── session_state_is_not_shared.replay │ │ ├── temp_state_is_not_persisted.replay │ │ ├── user_state_is_user_specific.replay │ │ ├── when_already_exists__it_fails.replay │ │ ├── with_config_after_timestamp.replay │ │ ├── with_config_combined_filters.replay │ │ ├── with_config_no_config_returns_all_events.replay │ │ └── with_config_num_recent_events.replay │ ├── vertexai.go │ ├── vertexai_client.go │ └── vertexai_test.go ├── telemetry/ │ ├── config.go │ ├── setup_otel.go │ ├── telemetry.go │ └── telemetry_test.go ├── tool/ │ ├── agenttool/ │ │ ├── agent_tool.go │ │ └── agent_tool_test.go │ ├── exampletool/ │ │ ├── tool.go │ │ └── tool_test.go │ ├── exitlooptool/ │ │ ├── tool.go │ │ └── tool_test.go │ ├── functiontool/ │ │ ├── function.go │ │ ├── function_test.go │ │ ├── long_running_function_test.go │ │ └── testdata/ │ │ └── TestFunctionTool_Simple.httprr │ ├── geminitool/ │ │ ├── google_search.go │ │ ├── tool.go │ │ └── tool_test.go │ ├── loadartifactstool/ │ │ ├── load_artifacts_tool.go │ │ └── load_artifacts_tool_test.go │ ├── loadmemorytool/ │ │ ├── tool.go │ │ └── tool_test.go │ ├── mcptoolset/ │ │ ├── client.go │ │ ├── set.go │ │ ├── set_test.go │ │ ├── testdata/ │ │ │ ├── TestMCPToolSet.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required_For_This_Tool.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Required.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Required_For_This_Tool.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_confirmed.httprr │ │ │ ├── TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_rejected.httprr │ │ │ ├── TestMCPToolSetConfirmation_Confirmation_Required.httprr │ │ │ ├── TestMCPToolSetConfirmation_Confirmation_Required_and_is_confirmed.httprr │ │ │ ├── TestMCPToolSetConfirmation_Confirmation_Required_and_is_rejected.httprr │ │ │ └── TestMCPToolSetConfirmation_No_Confirmation_Required.httprr │ │ └── tool.go │ ├── preloadmemorytool/ │ │ ├── tool.go │ │ └── tool_test.go │ ├── tool.go │ ├── tool_test.go │ └── toolconfirmation/ │ ├── tool_confirmation.go │ └── tool_confirmation_test.go └── util/ └── instructionutil/ └── instruction.go ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- ** Please make sure you read the contribution guide and file the issues in the right place. ** [Contribution guide.](https://google.github.io/adk-docs/contributing-guide/) ## 🔴 Required Information *Please ensure all items in this section are completed to allow for efficient triaging. If an item is not applicable to you - please mark it as N/A* **Describe the Bug:** A clear and concise description of what the bug is. **Steps to Reproduce:** Please provide a numbered list of steps to reproduce the behavior: 1. Install '...' 2. Run '....' 3. Open '....' 4. Provide error or stacktrace **Expected Behavior:** A clear and concise description of what you expected to happen. **Observed Behavior:** What actually happened? Include error messages or crash stack traces here. **Environment Details:** - ADK Library Version: - OS: [e.g., macOS, Linux, Windows] - Go Version: **Model Information:** - Which model is being used: (e.g., gemini-2.5-pro) --- ## 🟡 Optional Information *Providing this information greatly speeds up the resolution process.* **Regression:** Did this work in a previous version of ADK? (Yes/No) If so, which one? **Logs:** Please attach relevant logs. Wrap them in code blocks (```) or attach a text file. ```text // Paste logs here ``` **Screenshots / Video:** If applicable, add screenshots or screen recordings to help explain your problem. **Additional Context:** Add any other context about the problem here. **Minimal Reproduction Code:** Please provide a code snippet or a link to a Gist/repo that isolates the issue. ```go // Code snippet here ``` **How often has this issue occurred?:** - Always (100%) - Often (50%+) - Intermittently (<50%) - Once / Rare ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- ** Please make sure you read the contribution guide and file the issues in the right place. ** [Contribution guide.](https://google.github.io/adk-docs/contributing-guide/) ## 🔴 Required Information *Please ensure all items in this section are completed to allow for efficient triaging. If an item is not applicable to you - please mark it as N/A* ### Is your feature request related to a specific problem? Please describe the problem you are trying to solve. (Ex: "I'm always frustrated when I have to manually handle X...") ### Proposed Solution A clear and concise description of the feature or API change you want. Be specific about input/outputs if this involves an API change. ### Impact on your work How does this feature impact your work and what are you trying to achieve? If this is critical for you, tell us if there is a timeline by when you need this feature. --- ## 🟡 Recommended Information ### Alternatives Considered A clear and concise description of any alternative solutions or workarounds you've considered. ### Willingness to contribute Are you interested in implementing this feature yourself or submitting a PR? ### Proposed API / Implementation If you have ideas on how this should look in code, please share a pseudo-code example. ### Additional Context Add any other context or screenshots about the feature request. ================================================ FILE: .github/actions/setup/action.yml ================================================ name: Setup description: Setup the environment outputs: go-version: description: 'Go version' value: ${{ steps.setup-go.outputs.go-version }} runs: using: 'composite' steps: - name: Set up Go id: setup-go uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version-file: 'go.mod' cache: false # wrapper for actions/cache that doesn't support all functionality - name: Load Go cache uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-build-${{ hashFiles('**/go.mod', '**/go.sum') }} restore-keys: ${{ runner.os }}-go-build- ================================================ FILE: .github/pull_request_template.md ================================================ **Please ensure you have read the [contribution guide](./CONTRIBUTING.md) before creating a pull request.** ### Link to Issue or Description of Change **1. Link to an existing issue (if applicable):** - Closes: #_issue_number_ - Related: #_issue_number_ **2. Or, if no issue exists, describe the change:** _If applicable, please follow the issue templates to provide as much detail as possible._ **Problem:** _A clear and concise description of what the problem is._ **Solution:** _A clear and concise description of what you want to happen and why you choose this solution._ ### Testing Plan _Please describe the tests that you ran to verify your changes. This is required for all PRs that are not small documentation or typo fixes._ **Unit Tests:** - [ ] I have added or updated unit tests for my change. - [ ] All unit tests pass locally. _Please include a summary of passed go test results._ **Manual End-to-End (E2E) Tests:** _Please provide instructions on how to manually test your changes, including any necessary setup or configuration. Please provide logs or screenshots to help reviewers better understand the fix._ ### Checklist - [ ] I have read the [CONTRIBUTING.md](./CONTRIBUTING.md) document. - [ ] I have performed a self-review of my own code. - [ ] I have commented my code, particularly in hard-to-understand areas. - [ ] I have added tests that prove my fix is effective or that my feature works. - [ ] New and existing unit tests pass locally with my changes. - [ ] I have manually tested my changes end-to-end. - [ ] Any dependent changes have been merged and published in downstream modules. ### Additional context _Add any other context or screenshots about the feature request here._ ================================================ FILE: .github/workflows/go.yml ================================================ # This workflow will build a golang project # For more information see: # - https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go # - https://golangci-lint.run/usage/configuration/ name: Go on: push: branches: [ "main" ] pull_request: branches: [ "main" ] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup uses: ./.github/actions/setup - name: Tidy run: go mod tidy -diff - name: Build run: go build -mod=readonly -v ./... - name: Test run: go test -race -mod=readonly -v -count=1 -shuffle=on ./... lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup uses: ./.github/actions/setup - name: Lint uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0 with: install-mode: goinstall version: 5256574b81bcedfbcae9099f745f6aee9335da10 # v2.3.1 ================================================ FILE: .github/workflows/nightly.yml ================================================ name: Nightly on: schedule: - cron: '0 2 * * *' # 2 AM UTC daily workflow_dispatch: jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup uses: ./.github/actions/setup - name: Nightly Test run: go test -race -mod=readonly -v -count=1 -shuffle=on ./... vulncheck: runs-on: ubuntu-latest steps: - name: Run govulncheck uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4 with: go-version-file: go.mod repo-checkout: true ================================================ FILE: .gitignore ================================================ # .gitignore is restricted to the artifacts produced by go build and test. # for personal setup you can use personal .gitignore: `git config --global core.excludesfile ~/.gitignore` # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, built with `go test -c` *.test # Code coverage profiles and other test artifacts *.out coverage.* *.coverprofile profile.cov # Go workspace file go.work go.work.sum ================================================ FILE: .golangci.yml ================================================ version: "2" formatters: enable: - goimports - gofumpt settings: goimports: local-prefixes: - google.golang.org/adk gofumpt: extra-rules: true module-path: google.golang.org/adk linters: enable: - goheader settings: goheader: values: const: COMPANY: Google LLC regexp: YEAR: 20\d\d template: |- Copyright {{ YEAR }} {{ COMPANY }} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. staticcheck: checks: # The default config: - all - -ST1000 - -ST1003 - -ST1016 - -ST1020 - -ST1021 - -ST1022 # Changes to the default config: - -QF1001 # Exclude "Apply De Morgan's law" - -QF1008 # Exclude "Omit embedded fields from selector expression" exclusions: rules: - path: 'internal/httprr/.*' linters: - goheader - errcheck - staticcheck ================================================ FILE: CONTRIBUTING.md ================================================ # How to contribute We'd love to accept your patches and contributions to this project. - [How to contribute](#how-to-contribute) - [Before you begin](#before-you-begin) - [Sign our Contributor License Agreement](#sign-our-contributor-license-agreement) - [Review our community guidelines](#review-our-community-guidelines) - [Code reviews](#code-reviews) - [Contribution workflow](#contribution-workflow) - [Finding Issues to Work On](#finding-issues-to-work-on) - [Requirement for PRs](#requirement-for-prs) - [Large or Complex Changes](#large-or-complex-changes) - [Testing Requirements](#testing-requirements) - [Unit Tests](#unit-tests) - [Manual End-to-End (E2E) Tests](#manual-end-to-end-e2e-tests) - [Documentation](#documentation) - [Alignment with adk-python](#alignment-with-adk-python) ## Before you begin ### Sign our Contributor License Agreement All submissions to this project need to follow Google’s [Contributor License Agreement (CLA)](https://cla.developers.google.com/about), which covers any original work of authorship included in the submission. This doesn't prohibit the use of coding assistance tools, including tool-, AI-, or machine-generated code, as long as these submissions abide by the CLA's requirements. You (or your employer) retain the copyright to your contribution; this simply gives us permission to use and redistribute your contributions as part of the project. If you or your current employer have already signed the Google CLA (even if it was for a different project), you probably don't need to do it again. Visit to see your current agreements or to sign a new one. ### Review our community guidelines This project follows [Google's Open Source Community Guidelines](https://opensource.google/conduct/). ### Code reviews All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ## Contribution workflow ### Finding Issues to Work On - Browse issues labeled **`good first issue`** (newcomer-friendly) or **`help wanted`** (general contributions). - For other issues, please kindly ask before contributing to avoid duplication. ### Requirement for PRs - Code must follow [Google Go Style Guide](https://google.github.io/styleguide/go/index). - All PRs, other than small documentation or typo fixes, should have an Issue associated. If a relevant issue doesn't exist, please create one first or you may instead describe the bug or feature directly within the PR description, following the structure of our issue templates. - Small, focused PRs. Keep changes minimal—one concern per PR. - For bug fixes or features, please provide logs or screenshots after the fix is applied to help reviewers better understand the fix. - Please include a `testing plan` section in your PR to talk about how you will test. This will save time for PR review. See `Testing Requirements` section for more details. ### Large or Complex Changes For substantial features or architectural revisions: - Open an Issue First: Outline your proposal, including design considerations and impact. - Gather Feedback: Discuss with maintainers and the community to ensure alignment and avoid duplicate work. ### Testing Requirements To maintain code quality and prevent regressions, all code changes must include comprehensive tests and verifiable end-to-end (E2E) evidence. #### Unit Tests Please add or update unit tests for your change. Requirements for unit tests: - Cover new features, edge cases, error conditions, and typical use cases. - Fast and isolated. - Written clearly with descriptive names. - Free of external dependencies (use mocks or fixtures as needed). - Aim for high readability and maintainability; include comments for complex scenarios. #### Manual End-to-End (E2E) Tests Manual E2E tests ensure integrated flows work as intended. Your tests should cover all scenarios. Sometimes, it's also good to ensure relevant functionality is not impacted. Depending on your change: - **ADK Web:** - Capture and attach relevant screenshots demonstrating the UI/UX changes or outputs. - Label screenshots clearly in your PR description. - **Runner:** - Provide testing setup. For example, the agent definition, and the runner setup. - Include the command used and console output showing test results. - Highlight sections of the log that directly relate to your change. # ADK Web ## Updating ADK web version to latest - Run `./scripts/adk-web/update-adk-web.sh` to update the web UI to the latest version from [GitHub](https://github.com/google/adk-web). - Run `docker run -it adk-web-builder:latest sh -c ""` to start the container and debug the build, e.g.: - `docker run -it adk-web-builder:latest sh -c "ls -alh dist/agent_framework_web/browser"` to view the built files. - `docker run -it adk-web-builder:latest sh -c "npm run build"` to debug the build output. ### Documentation For any changes that impact user-facing documentation (guides, API reference, tutorials), please open a PR in the [adk-docs](https://github.com/google/adk-docs) repository to update the relevant parts before or alongside your code PR. ### Alignment with adk-python We lean on [adk-python](https://github.com/google/adk-python) for being the source of truth and one should refer to adk-python for validation. ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2025 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ # Agent Development Kit (ADK) for Go [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) [![Go Doc](https://img.shields.io/badge/Go%20Package-Doc-blue.svg)](https://pkg.go.dev/google.golang.org/adk) [![Nightly Check](https://github.com/google/adk-go/actions/workflows/nightly.yml/badge.svg)](https://github.com/google/adk-go/actions/workflows/nightly.yml) [![r/agentdevelopmentkit](https://img.shields.io/badge/Reddit-r%2Fagentdevelopmentkit-FF4500?style=flat&logo=reddit&logoColor=white)](https://www.reddit.com/r/agentdevelopmentkit/) [![View Code Wiki](https://www.gstatic.com/_/boq-sdlc-agents-ui/_/r/YUi5dj2UWvE.svg)](https://codewiki.google/github.com/google/adk-go)

An open-source, code-first Go toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.

Important Links: Docs & Samples & Python ADK & Java ADK & ADK Web.

Agent Development Kit (ADK) is a flexible and modular framework that applies software development principles to AI agent creation. It is designed to simplify building, deploying, and orchestrating agent workflows, from simple tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, deployment-agnostic, and compatible with other frameworks. This Go version of ADK is ideal for developers building cloud-native agent applications, leveraging Go's strengths in concurrency and performance. --- ## ✨ Key Features * **Idiomatic Go:** Designed to feel natural and leverage the power of Go. * **Rich Tool Ecosystem:** Utilize pre-built tools, custom functions, or integrate existing tools to give agents diverse capabilities. * **Code-First Development:** Define agent logic, tools, and orchestration directly in Go for ultimate flexibility, testability, and versioning. * **Modular Multi-Agent Systems:** Design scalable applications by composing multiple specialized agents. * **Deploy Anywhere:** Easily containerize and deploy agents, with strong support for cloud-native environments like Google Cloud Run. ## 🚀 Installation To add ADK Go to your project, run: ```bash go get google.golang.org/adk ``` ## 📄 License This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details. The exception is internal/httprr - see its [LICENSE file](internal/httprr/LICENSE). ================================================ FILE: agent/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent import ( "context" "fmt" "iter" "go.opentelemetry.io/otel/trace" "google.golang.org/genai" "google.golang.org/adk/artifact" agentinternal "google.golang.org/adk/internal/agent" "google.golang.org/adk/internal/plugininternal/plugincontext" "google.golang.org/adk/internal/telemetry" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // Agent is the base interface which all agents must implement. // // Agents are created with ADK constructors to ensure correct // init & configuration. // The constructors are available in this package and its subpackages. // For example: llmagent.New, workflow agents, remote agent or // agent.New. // NOTE: in future releases we will allow just implementing this interface. // For now agent.New is a correct solution to create custom agents. type Agent interface { Name() string Description() string Run(InvocationContext) iter.Seq2[*session.Event, error] SubAgents() []Agent internal() *agent } // New creates an Agent with a custom logic defined by Run function. func New(cfg Config) (Agent, error) { subAgentSet := make(map[Agent]bool) for _, subAgent := range cfg.SubAgents { if _, ok := subAgentSet[subAgent]; ok { return nil, fmt.Errorf("error creating agent: subagent %q appears multiple times in subAgents", subAgent.Name()) } subAgentSet[subAgent] = true } return &agent{ name: cfg.Name, description: cfg.Description, subAgents: cfg.SubAgents, beforeAgentCallbacks: cfg.BeforeAgentCallbacks, run: cfg.Run, afterAgentCallbacks: cfg.AfterAgentCallbacks, State: agentinternal.State{ AgentType: agentinternal.TypeCustomAgent, }, }, nil } // Config is the configuration for creating a new Agent. type Config struct { // Name must be a non-empty string, unique within the agent tree. // Agent name cannot be "user", since it's reserved for end-user's input. Name string // Description of the agent's capability. // // LLM uses this to determine whether to delegate control to the agent. // One-line description is enough and preferred. Description string // SubAgents are the child agents that this agent can delegate tasks to. // ADK will automatically set a parent of each sub-agent to this agent to // allow agent transferring across the tree. SubAgents []Agent // BeforeAgentCallbacks is a list of callbacks that are called sequentially // before the agent starts its run. // // If any callback returns non-nil content or error, then the agent run and // the remaining callbacks will be skipped, and a new event will be created // from the content or error of that callback. BeforeAgentCallbacks []BeforeAgentCallback // Run is the function that defines the agent's behavior. Run func(InvocationContext) iter.Seq2[*session.Event, error] // AfterAgentCallbacks is a list of callbacks that are called sequentially // after the agent has completed its run. // // If any callback returns non-nil content or error, then a new event will be // created from the content or error of that callback and the remaining // callbacks will be skipped. AfterAgentCallbacks []AfterAgentCallback } // Artifacts interface provides methods to work with artifacts of the current // session. type Artifacts interface { Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) List(context.Context) (*artifact.ListResponse, error) Load(ctx context.Context, name string) (*artifact.LoadResponse, error) LoadVersion(ctx context.Context, name string, version int) (*artifact.LoadResponse, error) } // Memory interface provides methods to access agent memory across the // sessions of the current user_id. type Memory interface { AddSessionToMemory(context.Context, session.Session) error SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) } // BeforeAgentCallback is a function that is called before the agent starts // its run. // If it returns non-nil content or error, the agent run will be skipped and a // new event will be created. type BeforeAgentCallback func(CallbackContext) (*genai.Content, error) // AfterAgentCallback is a function that is called after the agent has completed // its run. // If it returns non-nil content or error, a new event will be created. // // The callback will be skipped also if EndInvocation was called before or // BeforeAgentCallbacks returned non-nil results. type AfterAgentCallback func(CallbackContext) (*genai.Content, error) type agent struct { agentinternal.State name, description string subAgents []Agent beforeAgentCallbacks []BeforeAgentCallback run func(InvocationContext) iter.Seq2[*session.Event, error] afterAgentCallbacks []AfterAgentCallback } func (a *agent) Name() string { return a.name } func (a *agent) Description() string { return a.description } func (a *agent) SubAgents() []Agent { return a.subAgents } func (a *agent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { spanCtx, span := telemetry.StartInvokeAgentSpan(ctx, a, ctx.Session().ID(), ctx.InvocationID()) yield, endSpan := telemetry.WrapYield(span, yield, func(span trace.Span, event *session.Event, err error) { telemetry.TraceAgentResult(span, telemetry.TraceAgentResultParams{ ResponseEvent: event, Error: err, }) }) defer endSpan() // TODO: verify&update the setup here. Should we branch etc. ctx := &invocationContext{ Context: ctx.WithContext(spanCtx), agent: a, artifacts: ctx.Artifacts(), memory: ctx.Memory(), session: ctx.Session(), invocationID: ctx.InvocationID(), branch: ctx.Branch(), userContent: ctx.UserContent(), runConfig: ctx.RunConfig(), endInvocation: ctx.Ended(), } event, err := runBeforeAgentCallbacks(ctx) if event != nil || err != nil { if !yield(event, err) { return } } if ctx.Ended() { return } for event, err := range a.run(ctx) { if event != nil && event.Author == "" { event.Author = getAuthorForEvent(ctx, event) } if !yield(event, err) { return } } if ctx.Ended() { return } event, err = runAfterAgentCallbacks(ctx) if event != nil || err != nil { yield(event, err) } } } func (a *agent) internal() *agent { return a } func getAuthorForEvent(ctx InvocationContext, event *session.Event) string { if event.LLMResponse.Content != nil && event.LLMResponse.Content.Role == genai.RoleUser { return genai.RoleUser } return ctx.Agent().Name() } // runBeforeAgentCallbacks checks if any beforeAgentCallback returns non-nil content // then it skips agent run and returns callback result. func runBeforeAgentCallbacks(ctx InvocationContext) (*session.Event, error) { agent := ctx.Agent() pluginManager := pluginManagerFromContext(ctx) callbackCtx := &callbackContext{ Context: ctx, invocationContext: ctx, actions: &session.EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)}, } if pluginManager != nil { content, err := pluginManager.RunBeforeAgentCallback(callbackCtx) if err != nil { return nil, fmt.Errorf("failed to run plugin before agent callback: %w", err) } if content != nil { event := session.NewEvent(ctx.InvocationID()) event.LLMResponse = model.LLMResponse{ Content: content, } event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions ctx.EndInvocation() return event, nil } } for _, callback := range ctx.Agent().internal().beforeAgentCallbacks { content, err := callback(callbackCtx) if err != nil { return nil, fmt.Errorf("failed to run before agent callback: %w", err) } if content == nil { continue } event := session.NewEvent(ctx.InvocationID()) event.LLMResponse = model.LLMResponse{ Content: content, } event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions ctx.EndInvocation() return event, nil } // check if has delta create event with it if len(callbackCtx.actions.StateDelta) > 0 { event := session.NewEvent(ctx.InvocationID()) event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions return event, nil } return nil, nil } // runAfterAgentCallbacks checks if any afterAgentCallback returns non-nil content or a state modification // then it create a new event with the new content and state delta. func runAfterAgentCallbacks(ctx InvocationContext) (*session.Event, error) { agent := ctx.Agent() pluginManager := pluginManagerFromContext(ctx) callbackCtx := &callbackContext{ Context: ctx, invocationContext: ctx, actions: &session.EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)}, } if pluginManager != nil { content, err := pluginManager.RunAfterAgentCallback(callbackCtx) if err != nil { return nil, fmt.Errorf("failed to run plugin after agent callback: %w", err) } if content != nil { event := session.NewEvent(ctx.InvocationID()) event.LLMResponse = model.LLMResponse{ Content: content, } event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions return event, nil } } for _, callback := range agent.internal().afterAgentCallbacks { newContent, err := callback(callbackCtx) if err != nil { return nil, fmt.Errorf("failed to run after agent callback: %w", err) } if newContent == nil { continue } event := session.NewEvent(ctx.InvocationID()) event.LLMResponse = model.LLMResponse{ Content: newContent, } event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions // TODO set context invocation ended // ctx.invocationEnded = true return event, nil } // check if has delta create event with it if len(callbackCtx.actions.StateDelta) > 0 { event := session.NewEvent(ctx.InvocationID()) event.Author = agent.Name() event.Branch = ctx.Branch() event.Actions = *callbackCtx.actions return event, nil } return nil, nil } // TODO: unify with internal/context.callbackContext type callbackContext struct { context.Context invocationContext InvocationContext actions *session.EventActions } func (c *callbackContext) AgentName() string { return c.invocationContext.Agent().Name() } func (c *callbackContext) ReadonlyState() session.ReadonlyState { return c.invocationContext.Session().State() } func (c *callbackContext) State() session.State { return &callbackContextState{ctx: c} } func (c *callbackContext) Artifacts() Artifacts { return c.invocationContext.Artifacts() } func (c *callbackContext) InvocationID() string { return c.invocationContext.InvocationID() } func (c *callbackContext) UserContent() *genai.Content { return c.invocationContext.UserContent() } // AppName implements CallbackContext. func (c *callbackContext) AppName() string { return c.invocationContext.Session().AppName() } // Branch implements CallbackContext. func (c *callbackContext) Branch() string { return c.invocationContext.Branch() } // SessionID implements CallbackContext. func (c *callbackContext) SessionID() string { return c.invocationContext.Session().ID() } // UserID implements CallbackContext. func (c *callbackContext) UserID() string { return c.invocationContext.Session().UserID() } var _ CallbackContext = (*callbackContext)(nil) type callbackContextState struct { ctx *callbackContext } func (c *callbackContextState) Get(key string) (any, error) { if c.ctx.actions != nil && c.ctx.actions.StateDelta != nil { if val, ok := c.ctx.actions.StateDelta[key]; ok { return val, nil } } return c.ctx.invocationContext.Session().State().Get(key) } func (c *callbackContextState) Set(key string, val any) error { if c.ctx.actions != nil && c.ctx.actions.StateDelta != nil { c.ctx.actions.StateDelta[key] = val } return c.ctx.invocationContext.Session().State().Set(key, val) } func (c *callbackContextState) All() iter.Seq2[string, any] { return c.ctx.invocationContext.Session().State().All() } type invocationContext struct { context.Context agent Agent artifacts Artifacts memory Memory session session.Session invocationID string branch string userContent *genai.Content runConfig *RunConfig endInvocation bool } func (c *invocationContext) Agent() Agent { return c.agent } func (c *invocationContext) Artifacts() Artifacts { return c.artifacts } func (c *invocationContext) Memory() Memory { return c.memory } func (c *invocationContext) Session() session.Session { return c.session } func (c *invocationContext) InvocationID() string { return c.invocationID } func (c *invocationContext) Branch() string { return c.branch } func (c *invocationContext) UserContent() *genai.Content { return c.userContent } func (c *invocationContext) RunConfig() *RunConfig { return c.runConfig } func (c *invocationContext) EndInvocation() { c.endInvocation = true } func (c *invocationContext) Ended() bool { return c.endInvocation } func (c *invocationContext) WithContext(ctx context.Context) InvocationContext { newCtx := *c newCtx.Context = ctx return &newCtx } func pluginManagerFromContext(ctx context.Context) pluginManager { a := ctx.Value(plugincontext.PluginManagerCtxKey) m, ok := a.(pluginManager) if !ok { return nil } return m } type pluginManager interface { RunBeforeAgentCallback(cctx CallbackContext) (*genai.Content, error) RunAfterAgentCallback(cctx CallbackContext) (*genai.Content, error) } var _ InvocationContext = (*invocationContext)(nil) ================================================ FILE: agent/agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent import ( "context" "iter" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestAgentCallbacks(t *testing.T) { t.Parallel() tests := []struct { name string beforeAgent []BeforeAgentCallback afterAgent []AfterAgentCallback wantLLMCalls int wantEvents []*session.Event }{ { name: "before agent callback runs, no llm calls", beforeAgent: []BeforeAgentCallback{ func(ctx CallbackContext) (*genai.Content, error) { return genai.NewContentFromText("hello from before_agent_callback", genai.RoleModel), nil }, }, wantEvents: []*session.Event{ { Author: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello from before_agent_callback", genai.RoleModel), }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, { name: "no callback effect if callbacks return nil", beforeAgent: []BeforeAgentCallback{ func(ctx CallbackContext) (*genai.Content, error) { return nil, nil }, }, afterAgent: []AfterAgentCallback{ func(CallbackContext) (*genai.Content, error) { return nil, nil }, }, wantLLMCalls: 1, wantEvents: []*session.Event{ { Author: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, }, }, }, { name: "after agent callback create a new event with new content", afterAgent: []AfterAgentCallback{ func(CallbackContext) (*genai.Content, error) { return genai.NewContentFromText("hello from after_agent_callback", genai.RoleModel), nil }, }, wantLLMCalls: 1, wantEvents: []*session.Event{ { Author: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, }, { Author: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello from after_agent_callback", genai.RoleModel), }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { custom := &customAgent{} testAgent, err := New(Config{ Name: "test", BeforeAgentCallbacks: tt.beforeAgent, Run: custom.Run, AfterAgentCallbacks: tt.afterAgent, }) if err != nil { t.Fatalf("failed to create agent: %v", err) } ctx := &invocationContext{ Context: t.Context(), agent: testAgent, session: &mockSession{sessionID: "test-session"}, } var gotEvents []*session.Event for event, err := range testAgent.Run(ctx) { if err != nil { t.Fatalf("unexpected error from the agent: %v", err) } gotEvents = append(gotEvents, event) } if tt.wantLLMCalls != custom.callCounter { t.Errorf("unexpected want_llm_calls, got: %v, want: %v", custom.callCounter, tt.wantLLMCalls) } if len(tt.wantEvents) != len(gotEvents) { t.Errorf("unexpected event lengths, got: %v, want: %v", len(gotEvents), len(tt.wantEvents)) } for i, gotEvent := range gotEvents { if diff := cmp.Diff(tt.wantEvents[i], gotEvent, cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID")); diff != "" { t.Errorf("diff in the events: got event[%d]: %v, want: %v, diff: %v", i, gotEvent, tt.wantEvents[i], diff) } } }) } } func TestEndInvocation_EndsBeforeMainCall(t *testing.T) { custom := &customAgent{} testAgent, err := New(Config{ Name: "test", BeforeAgentCallbacks: []BeforeAgentCallback{ func(ctx CallbackContext) (*genai.Content, error) { return nil, nil }, }, Run: custom.Run, }) if err != nil { t.Fatalf("failed to create agent: %v", err) } ctx := &invocationContext{ Context: t.Context(), agent: testAgent, endInvocation: true, session: &mockSession{sessionID: "test-session"}, } for _, err := range testAgent.Run(ctx) { if err != nil { t.Fatalf("unexpected error from the agent: %v", err) } } // Even though beforeAgentCallback returns nil, it stil doesn't call llm because // endInvocation is true. if custom.callCounter != 0 { t.Errorf("unexpected want_llm_calls, got: %v, want: %v", custom.callCounter, 0) } } func TestEndInvocation_EndsAfterMainCall(t *testing.T) { custom := &customAgent{endInvocation: true} testAgent, err := New(Config{ Name: "test", AfterAgentCallbacks: []AfterAgentCallback{ func(CallbackContext) (*genai.Content, error) { return genai.NewContentFromText("hello from after_agent_callback", genai.RoleModel), nil }, }, Run: custom.Run, }) if err != nil { t.Fatalf("failed to create agent: %v", err) } ctx := &invocationContext{ Context: t.Context(), agent: testAgent, session: &mockSession{sessionID: "test-session"}, } var gotEvents []*session.Event for event, err := range testAgent.Run(ctx) { if err != nil { t.Fatalf("unexpected error from the agent: %v", err) } gotEvents = append(gotEvents, event) } if custom.callCounter != 1 { t.Errorf("unexpected want_llm_calls, got: %v, want: %v", custom.callCounter, 0) } // Even though AfterAgentCallbacks is present, it's not returned because EndInvocation is set to true wantEvent := &session.Event{ Author: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, } if len(gotEvents) != 1 { t.Errorf("unexpected number of events, got: %v, want: %v", len(gotEvents), 1) } if diff := cmp.Diff(wantEvent, gotEvents[0], cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID"), cmpopts.IgnoreFields(session.EventActions{}, "StateDelta")); diff != "" { t.Errorf("unexpected event, got: %v, want: %v, diff: %v", gotEvents[0], wantEvent, diff) } } // TODO: create test util allowing to create custom agents, agent trees for test etc. type customAgent struct { callCounter int endInvocation bool } func (a *customAgent) Run(ctx InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { a.callCounter++ if a.endInvocation { ctx.EndInvocation() } yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, }, nil) } } type testKey struct{} func TestWithContext(t *testing.T) { baseCtx := t.Context() inv := &invocationContext{ Context: baseCtx, invocationID: "test", branch: "branch", } key := testKey{} val := "val" got := inv.WithContext(context.WithValue(baseCtx, key, val)) if got.Value(key) != val { t.Errorf("WithContext() did not update context") } if diff := cmp.Diff(inv, got, cmp.AllowUnexported(invocationContext{}), cmpopts.IgnoreFields(invocationContext{}, "Context")); diff != "" { t.Errorf("WithContext() params mismatch (-want +got):\n%s", diff) } } type mockSession struct { session.Session sessionID string } func (m *mockSession) ID() string { return m.sessionID } ================================================ FILE: agent/context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent import ( "context" "google.golang.org/genai" "google.golang.org/adk/session" ) /* InvocationContext represents the context of an agent invocation. An invocation: 1. Starts with a user message and ends with a final response. 2. Can contain one or multiple agent calls. 3. Is handled by runner.Run(). An invocation runs an agent until it does not request to transfer to another agent. An agent call: 1. Is handled by agent.Run(). 2. Ends when agent.Run() ends. An agent call can contain one or multiple steps. For example, LLM agent runs steps in a loop until: 1. A final response is generated. 2. The agent transfers to another agent. 3. EndInvocation() was called by the invocation context. A step: 1. Calls the LLM only once and yields its response. 2. Calls the tools and yields their responses if requested. The summarization of the function response is considered another step, since it is another LLM call. A step ends when it's done calling LLM and tools, or if the EndInvocation() was called by invocation context at any time. ┌─────────────────────── invocation ──────────────────────────┐ ┌──────────── llm_agent_call_1 ────────────┐ ┌─ agent_call_2 ─┐ ┌──── step_1 ────────┐ ┌───── step_2 ──────┐ [call_llm] [call_tool] [call_llm] [transfer] */ type InvocationContext interface { context.Context // Agent of this invocation context. Agent() Agent // Artifacts of the current session. Artifacts() Artifacts // Memory is scoped to sessions of the current user_id. Memory() Memory // Session of the current invocation context. Session() session.Session InvocationID() string // Branch of the invocation context. // The format is like agent_1.agent_2.agent_3, where agent_1 is the parent // of agent_2, and agent_2 is the parent of agent_3. // // Branch is used when multiple sub-agents shouldn't see their peer agents' // conversation history. // // Applicable to parallel agent because its sub-agents run concurrently. Branch() string // UserContent that started this invocation. UserContent() *genai.Content // RunConfig stores the runtime configuration used during this invocation. RunConfig() *RunConfig // EndInvocation ends the current invocation. This stops any planned agent // calls. EndInvocation() // Ended returns whether the invocation has ended. Ended() bool // WithContext returns a new instance of the context with overridden embedded context. // NOTE: This is a temporary solution and will be removed later. The proper solution // we plan is to stop embedding go context in adk context types and split it. WithContext(ctx context.Context) InvocationContext } // ReadonlyContext provides read-only access to invocation context data. type ReadonlyContext interface { context.Context // UserContent that started this invocation. UserContent() *genai.Content InvocationID() string AgentName() string ReadonlyState() session.ReadonlyState UserID() string AppName() string SessionID() string // Branch of the current invocation. Branch() string } // CallbackContext is passed to user callbacks during agent execution. type CallbackContext interface { ReadonlyContext Artifacts() Artifacts State() session.State } ================================================ FILE: agent/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package agent provides entities to build agents using ADK. package agent ================================================ FILE: agent/llmagent/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package llmagent provides an LLM-based agent. // LLM agents use large language models to perform tasks based on instructions, user input, // deciding on actions to take, and executing actions using available tools or // delegating to sub agents. package llmagent ================================================ FILE: agent/llmagent/llmagent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llmagent import ( "fmt" "iter" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) // New is a constructor for LLMAgent. func New(cfg Config) (agent.Agent, error) { beforeModelCallbacks := make([]llminternal.BeforeModelCallback, 0, len(cfg.BeforeModelCallbacks)) for _, c := range cfg.BeforeModelCallbacks { beforeModelCallbacks = append(beforeModelCallbacks, llminternal.BeforeModelCallback(c)) } afterModelCallbacks := make([]llminternal.AfterModelCallback, 0, len(cfg.AfterModelCallbacks)) for _, c := range cfg.AfterModelCallbacks { afterModelCallbacks = append(afterModelCallbacks, llminternal.AfterModelCallback(c)) } onModelErrorCallbacks := make([]llminternal.OnModelErrorCallback, 0, len(cfg.OnModelErrorCallbacks)) for _, c := range cfg.OnModelErrorCallbacks { onModelErrorCallbacks = append(onModelErrorCallbacks, llminternal.OnModelErrorCallback(c)) } beforeToolCallbacks := make([]llminternal.BeforeToolCallback, 0, len(cfg.BeforeToolCallbacks)) for _, c := range cfg.BeforeToolCallbacks { beforeToolCallbacks = append(beforeToolCallbacks, llminternal.BeforeToolCallback(c)) } afterToolCallbacks := make([]llminternal.AfterToolCallback, 0, len(cfg.AfterToolCallbacks)) for _, c := range cfg.AfterToolCallbacks { afterToolCallbacks = append(afterToolCallbacks, llminternal.AfterToolCallback(c)) } onToolErrorCallback := make([]llminternal.OnToolErrorCallback, 0, len(cfg.OnToolErrorCallbacks)) for _, c := range cfg.OnToolErrorCallbacks { onToolErrorCallback = append(onToolErrorCallback, llminternal.OnToolErrorCallback(c)) } a := &llmAgent{ model: cfg.Model, beforeModelCallbacks: beforeModelCallbacks, afterModelCallbacks: afterModelCallbacks, onModelErrorCallbacks: onModelErrorCallbacks, beforeToolCallbacks: beforeToolCallbacks, afterToolCallbacks: afterToolCallbacks, onToolErrorCallbacks: onToolErrorCallback, instruction: cfg.Instruction, inputSchema: cfg.InputSchema, outputSchema: cfg.OutputSchema, State: llminternal.State{ Model: cfg.Model, GenerateContentConfig: cfg.GenerateContentConfig, Tools: cfg.Tools, Toolsets: cfg.Toolsets, DisallowTransferToParent: cfg.DisallowTransferToParent, DisallowTransferToPeers: cfg.DisallowTransferToPeers, InputSchema: cfg.InputSchema, OutputSchema: cfg.OutputSchema, // TODO: internal type for includeContents IncludeContents: string(cfg.IncludeContents), Instruction: cfg.Instruction, InstructionProvider: llminternal.InstructionProvider(cfg.InstructionProvider), GlobalInstruction: cfg.GlobalInstruction, GlobalInstructionProvider: llminternal.InstructionProvider(cfg.GlobalInstructionProvider), OutputKey: cfg.OutputKey, }, } baseAgent, err := agent.New(agent.Config{ Name: cfg.Name, Description: cfg.Description, SubAgents: cfg.SubAgents, BeforeAgentCallbacks: cfg.BeforeAgentCallbacks, Run: a.run, AfterAgentCallbacks: cfg.AfterAgentCallbacks, }) if err != nil { return nil, fmt.Errorf("failed to create agent: %w", err) } // TODO: remove this in favor of the state reveal below. a.Agent = baseAgent a.AgentType = agentinternal.TypeLLMAgent a.Config = cfg // TODO: temporary hack to set the LLMAgent type field correctly. Currently, beforeAgentCallback for LLMAgent only // sees basic *agent.agent type: http://google3/third_party/golang/adk/agent/agent.go;l=177-201;rcl=869633263 // So in BeforeAgentCallback, we cannot access llmAgent.State fields. // We should remote llminternal.State in favor of agentinternal.State. internalAgent, ok := baseAgent.(agentinternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to internal agent") } state := agentinternal.Reveal(internalAgent) state.AgentType = agentinternal.TypeLLMAgent state.Config = cfg return a, nil } // Config of the LLMAgent. type Config struct { // Name must be a non-empty string, unique within the agent tree. // Agent name cannot be "user", since it's reserved for end-user's input. Name string // Description of the agent's capability. // // LLM uses this to determine whether to delegate control to the agent. // One-line description is enough and preferred. Description string // SubAgents are the child agents that this agent can delegate tasks to. // ADK will automatically set a parent of each sub-agent to this agent to // allow agent transferring across the tree. SubAgents []agent.Agent // BeforeAgentCallbacks is a list of callbacks that are called sequentially // before the agent starts its run. // // If any callback returns non-nil content or error, then the agent run and // the remaining callbacks will be skipped, and a new event will be created // from the content or error of that callback. BeforeAgentCallbacks []agent.BeforeAgentCallback // AfterAgentCallbacks is a list of callbacks that are called sequentially // after the agent has completed its run. // // If any callback returns non-nil content or error, then a new event will be // created from the content or error of that callback and the remaining // callbacks will be skipped. AfterAgentCallbacks []agent.AfterAgentCallback // GenerateContentConfig is for the additional content generation // configuration. // // NOTE: not all fields are usable, e.g. tools must be configured via // `tools`. // // For example: use this config to adjust model temperature, configure // safety settings, etc. GenerateContentConfig *genai.GenerateContentConfig // BeforeModelCallbacks will be called in the order they are provided until // there's a callback that returns a non-nil LLMResponse or error. Then // actual LLM call is skipped, and the returned response/error is used. // // This provides an opportunity to inspect, log, or modify the `LLMRequest` // object. It can also be used to implement caching by returning a cached // `LLMResponse`, which would skip the actual model call. BeforeModelCallbacks []BeforeModelCallback // Model that is used by the agent. Model model.LLM // AfterModelCallbacks will be called in the order they are provided until // there's a callback that returns a non-nil LLMResponse or error. Then // actual LLM response is replaced with the returned response/error. // // This is the ideal place to log model responses, collect metrics on token // usage, or perform post-processing on the raw `LLMResponse`. AfterModelCallbacks []AfterModelCallback OnModelErrorCallbacks []OnModelErrorCallback // Instruction is set for the LLM model guiding the agent's behavior. // // The string is treated as a template: // - There can be placeholders like {key_name} that will be resolved by ADK // at runtime using session state and context. // - key_name must match "^[a-zA-Z_][a-zA-Z0-9_]*$", otherwise it will be // treated as a literal. // - {artifact.key_name} can be used to insert the text content of the // artifact named key_name. // // If the state variable or artifact does not exist, the agent will raise an // error. If you want to ignore the error, you can append a ? to the // variable name as in {var?} to make it optional. // // If templating logic for {} chars is not desired, then InstructionProvider // should be used. Instruction string // InstructionProvider allows to create instructions dynamically based on // the agent context. // // It takes over the Instruction field if both are set. // // InstructionProvider does not automatically substitute values to {} and // treats them as just a raw char. // If you need to inject session state variables, use // util/instructionutil.InjectSessionState helper. InstructionProvider InstructionProvider // GlobalInstruction is the instruction for all agents in the entire // agent tree. // // The string is treated as a template: // - There can be placeholders like {key_name} that will be resolved by ADK // at runtime using session state and context. // - key_name must match "^[a-zA-Z_][a-zA-Z0-9_]*$", otherwise it will be // treated as a literal. // - {artifact.key_name} can be used to insert the text content of the // artifact named key_name. // // If the state variable or artifact does not exist, the agent will raise an // error. If you want to ignore the error, you can append a ? to the // variable name as in {var?} to make it optional. // // ONLY the GlobalInstruction in the root agent will take effect. // // For example: GlobalInstruction can make all agents have a stable identity // or personality. GlobalInstruction string // GlobalInstructionProvider allows to create global instructions // dynamically based on the agent context. // // It takes over the GlobalInstruction field if both are set. GlobalInstructionProvider InstructionProvider // DisallowTransferToParent prevents transferring to parent agent if LLM // decides to. DisallowTransferToParent bool // DisallowTransferToPeers prevents transferring to peer agents. DisallowTransferToPeers bool // Whether to include contents (conversation history) in the model request. IncludeContents IncludeContents // TODO(ngeorgy): consider to switch to jsonschema for input and output schema. // The input schema when agent is used as a tool. InputSchema *genai.Schema // The output schema when agent replies. // // NOTE: when this is set, agent can only reply and cannot use any tools, // such as function tools, RAGs, agent transfer, etc. OutputSchema *genai.Schema // Callbacks are executed in the order they are provided. // If a callback returns result/error, then the execution of the callback // list stops AND the actual tool call is skipped. BeforeToolCallbacks []BeforeToolCallback // Tools available to the agent. Tools []tool.Tool // Callbacks are executed in the order they are provided. // If a callback returns result/error, then the execution of the callback // list stops and this result/error is returned instead. AfterToolCallbacks []AfterToolCallback // Toolsets will be used by llmagent to extract tools and pass to the // underlying LLM. Toolsets []tool.Toolset OnToolErrorCallbacks []OnToolErrorCallback // OutputKey is an optional parameter to specify the key in session state for the agent output. // // Typical uses cases are: // - Extracts agent reply for later use, such as in tools, callbacks, etc. // - Connects agents to coordinate with each other. OutputKey string } // BeforeModelCallback that is called before sending a request to the model. // // If it returns non-nil LLMResponse or error, the actual model call is skipped // and the returned response/error is used. type BeforeModelCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) // AfterModelCallback that is called after receiving a response from the model. // // If it returns non-nil LLMResponse or error, the actual model response/error // is replaced with the returned response/error. type AfterModelCallback func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) // OnModelErrorCallback that is called when receiving an error response from the llm model. // // If it returns non-nil LLMResponse or error, the actual model response/error // is replaced with the returned response/error. type OnModelErrorCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error) // BeforeToolCallback is executed before a tool's Run method. // // Callbacks are executed in the order they are provided. // If a callback returns a non-nil result or an error: // - execution of remaining callbacks stops // - the actual tool call is skipped // - the returned result is used as the tool result // // To modify tool arguments and still run the tool, // update args in place and return (nil, nil). type BeforeToolCallback func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) // AfterToolCallback is a function type executed after a tool's Run method has completed, // regardless of whether the tool returned a result or an error. // // Callbacks are executed in the order they are provided. // If a callback returns a non-nil result or an error: // - execution of remaining callbacks stops // - the returned result and/or error is used as the final tool output type AfterToolCallback func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) // OnToolErrorCallback that is called when receiving an error response from tool execution. // // If it returns non-nil LLMResponse or error, the actual model response/error // is replaced with the returned response/error. type OnToolErrorCallback func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) // IncludeContents controls what parts of prior conversation history is received by llmagent. type IncludeContents string const ( // IncludeContentsNone makes the llmagent operate solely on its current turn (latest user input + any following agent events). IncludeContentsNone IncludeContents = "none" // IncludeContentsDefault is enabled by default. The llmagent receives the relevant conversation history. IncludeContentsDefault IncludeContents = "default" ) type llmAgent struct { agent.Agent llminternal.State agentState beforeModelCallbacks []llminternal.BeforeModelCallback model model.LLM afterModelCallbacks []llminternal.AfterModelCallback instruction string onModelErrorCallbacks []llminternal.OnModelErrorCallback beforeToolCallbacks []llminternal.BeforeToolCallback afterToolCallbacks []llminternal.AfterToolCallback onToolErrorCallbacks []llminternal.OnToolErrorCallback inputSchema *genai.Schema outputSchema *genai.Schema } type agentState = agentinternal.State func (a *llmAgent) run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { // TODO: branch context? ctx = icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{ Artifacts: ctx.Artifacts(), Memory: ctx.Memory(), Session: ctx.Session(), Branch: ctx.Branch(), Agent: a, UserContent: ctx.UserContent(), RunConfig: ctx.RunConfig(), InvocationID: ctx.InvocationID(), }) f := &llminternal.Flow{ Model: a.model, RequestProcessors: llminternal.DefaultRequestProcessors, ResponseProcessors: llminternal.DefaultResponseProcessors, BeforeModelCallbacks: a.beforeModelCallbacks, AfterModelCallbacks: a.afterModelCallbacks, OnModelErrorCallbacks: a.onModelErrorCallbacks, BeforeToolCallbacks: a.beforeToolCallbacks, AfterToolCallbacks: a.afterToolCallbacks, OnToolErrorCallbacks: a.onToolErrorCallbacks, } return func(yield func(*session.Event, error) bool) { for ev, err := range f.Run(ctx) { a.maybeSaveOutputToState(ev) if !yield(ev, err) { return } } } } // maybeSaveOutputToState saves the model output to state if needed. skip if the event // was authored by some other agent (e.g. current agent transferred to another agent) func (a *llmAgent) maybeSaveOutputToState(event *session.Event) { if event == nil { return } if event.Author != a.Name() { // TODO: log "Skipping output save for agent %s: event authored by %s" return } if a.OutputKey != "" && !event.Partial && event.Content != nil && len(event.Content.Parts) > 0 { var sb strings.Builder for _, part := range event.Content.Parts { if part.Text != "" && !part.Thought { sb.WriteString(part.Text) } } result := sb.String() // TODO: add output schema validation and unmarshalling if a.OutputSchema != nil { // If the result from the final chunk is just whitespace or empty, // it means this is an empty final chunk of a stream. // Do not attempt to parse it as JSON. if strings.TrimSpace(result) == "" { return } } if event.Actions.StateDelta == nil { event.Actions.StateDelta = make(map[string]any) } event.Actions.StateDelta[a.OutputKey] = result } } // InstructionProvider allows to create instructions dynamically. It is called // on each agent invocation. // // NOTE: when InstructionProvider is used, ADK will NOT inject session state // placeholders into the instruction. You can use // util/instructionutil.InjectSessionState() helper if this functionality is needed. type InstructionProvider func(ctx agent.ReadonlyContext) (string, error) ================================================ FILE: agent/llmagent/llmagent_saveoutput_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llmagent import ( "reflect" "testing" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) type MockOutputSchema struct { Message string `json:"message"` Confidence float64 `json:"confidence"` } // createTestEvent is a helper to build events for tests. func createTestEvent(author, contentText string, isFinal bool) *session.Event { var parts []*genai.Part if contentText != "" { parts = append(parts, &genai.Part{Text: contentText}) } var content *genai.Content if len(parts) > 0 { content = &genai.Content{Role: "model", Parts: parts} } return &session.Event{ InvocationID: "test_invocation", Author: author, LLMResponse: model.LLMResponse{Content: content, Partial: !isFinal}, Actions: session.EventActions{StateDelta: make(map[string]any)}, } } func TestLlmAgent_MaybeSaveOutputToState(t *testing.T) { // Define the structure for our test cases testCases := []struct { name string agentConfig Config event *session.Event wantStateDelta map[string]any customEventParts []*genai.Part // For multi-part test }{ { name: "skips when event author differs from agentConfig name", agentConfig: Config{Name: "agent_a", OutputKey: "result"}, event: createTestEvent("agent_b", "Response from B", true), wantStateDelta: map[string]any{}, }, { name: "saves when event author matches agentConfig name", agentConfig: Config{Name: "test_agent", OutputKey: "result"}, event: createTestEvent("test_agent", "Test response", true), wantStateDelta: map[string]any{"result": "Test response"}, }, { name: "skips when output_key is not set", agentConfig: Config{Name: "test_agent"}, // No OutputKey event: createTestEvent("test_agent", "Test response", true), wantStateDelta: map[string]any{}, }, { name: "skips for non-final responses", agentConfig: Config{Name: "test_agent", OutputKey: "result"}, event: createTestEvent("test_agent", "*genai.Partial response", false), wantStateDelta: map[string]any{}, }, { name: "skips when event has no content text", agentConfig: Config{Name: "test_agent", OutputKey: "result"}, event: createTestEvent("test_agent", "", true), wantStateDelta: map[string]any{}, }, { name: "concatenates multiple text parts", agentConfig: Config{Name: "test_agent", OutputKey: "result"}, event: createTestEvent("test_agent", "", true), // Base event customEventParts: []*genai.Part{ {Text: "Hello "}, {Text: "world"}, {Text: "!"}, }, wantStateDelta: map[string]any{"result": "Hello world!"}, }, { name: "skips on case-sensitive name mismatch", agentConfig: Config{Name: "TestAgent", OutputKey: "result"}, event: createTestEvent("testagent", "Test response", true), wantStateDelta: map[string]any{}, }, // TODO tests with OutputSchema } // Iterate over the test cases for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // --- Setup for specific cases --- if tc.customEventParts != nil { tc.event.Content = &genai.Content{Role: "model", Parts: tc.customEventParts} } // --- Execution --- // The method modifies the event in-place, just like the Python version. createdAgent, err := New(tc.agentConfig) if err != nil { t.Fatalf("failed to create agent: %v", err) } createdLlmAgent, ok := createdAgent.(*llmAgent) if !ok { t.Fatalf("failed to convert to llmagent") } createdLlmAgent.maybeSaveOutputToState(tc.event) // --- Assertion --- gotStateDelta := tc.event.Actions.StateDelta if !reflect.DeepEqual(gotStateDelta, tc.wantStateDelta) { t.Errorf("stateDelta mismatch:\ngot = %v\nwant = %v", gotStateDelta, tc.wantStateDelta) } }) } } ================================================ FILE: agent/llmagent/llmagent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llmagent_test import ( "errors" "fmt" "iter" "net/http" "path/filepath" "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) const modelName = "gemini-2.5-flash" //go:generate go test -httprecord=Test func TestLLMAgent(t *testing.T) { errNoNetwork := errors.New("no network") for _, tc := range []struct { name string transport http.RoundTripper wantErr error }{ { name: "healthy_backend", transport: nil, // httprr + http.DefaultTransport }, { name: "broken_backend", transport: roundTripperFunc(func(*http.Request) (*http.Response, error) { return nil, errNoNetwork }), wantErr: errNoNetwork, }, } { t.Run(tc.name, func(t *testing.T) { model := newGeminiModel(t, modelName, tc.transport) a, err := llmagent.New(llmagent.Config{ Name: "hello_world_agent", Description: "hello world agent", Model: model, Instruction: "Roll the dice and report only the result.", GlobalInstruction: "Answer as precisely as possible.", DisallowTransferToParent: true, DisallowTransferToPeers: true, }) if err != nil { t.Fatalf("NewLLMAgent failed: %v", err) } // TODO: set tools, planner. runner := testutil.NewTestAgentRunner(t, a) stream := runner.Run(t, "test_session", "") texts, err := testutil.CollectTextParts(stream) if tc.wantErr != nil && !errors.Is(err, tc.wantErr) { t.Fatalf("stream = (%q, %v), want (_, %v)", texts, err, tc.wantErr) } if tc.wantErr == nil && (err != nil || len(texts) != 1) { t.Fatalf("stream = (%q, %v), want exactly one text response", texts, err) } }) } } func TestLLMAgentStreamingModeSSE(t *testing.T) { model := newGeminiModel(t, "gemini-2.5-flash", nil) a, err := llmagent.New(llmagent.Config{ Name: "calculator", Description: "calculating agent", Model: model, Instruction: "Think deep. Always double check the answer before making the conclusion.", DisallowTransferToParent: true, DisallowTransferToPeers: true, GenerateContentConfig: &genai.GenerateContentConfig{ ThinkingConfig: &genai.ThinkingConfig{ IncludeThoughts: true, // can trigger multiple message. }, }, }) if err != nil { t.Fatalf("NewLLMAgent failed: %v", err) } testRunner := testutil.NewTestAgentRunner(t, a) stream := testRunner.RunContentWithConfig(t, "test_session", genai.NewContentFromText("What is the sum of the first 50 prime numbers?", "user"), agent.RunConfig{StreamingMode: agent.StreamingModeSSE}) events, err := testutil.CollectEvents(stream) gotThought := false numContents := 0 for _, e := range events { t.Logf("event: %v", e) if e.LLMResponse.Content == nil { continue } numContents++ for _, p := range e.LLMResponse.Content.Parts { if p.Thought { gotThought = true } } } if err != nil { t.Fatalf("stream = (_, %v), want (_, nil)", err) } if numContents <= 1 { t.Errorf("stream returned %d events with content, want more than 1 event", numContents) } if !gotThought { t.Error("stream returned no thought, want thought") } } func TestModelCallbacks(t *testing.T) { t.Parallel() for _, tc := range []struct { name string llmResponses []*genai.Content beforeModelCallbacks []llmagent.BeforeModelCallback afterModelCallbacks []llmagent.AfterModelCallback onModelErrorCallback []llmagent.OnModelErrorCallback wantTexts []string wantErr error }{ { name: "before model callback doesn't modify anything", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from model", }, }, { name: "before model callback returns an error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantErr: http.ErrNoCookie, }, { name: "before model callback returns new LLMResponse", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, nil }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("unexpected text", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from before_model_callback", }, }, { name: "before model callback returns both new LLMResponse and error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantErr: http.ErrNoCookie, }, { name: "after model callback doesn't modify anything", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from model", }, }, { name: "after model callback returns new LLMResponse", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, nil }, func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("unexpected text", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from after_model_callback", }, }, { name: "after model callback returns error", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantErr: http.ErrNoCookie, }, { name: "after model callback returns both new LLMResponse and error", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, fmt.Errorf("error from after_model_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantErr: http.ErrNoCookie, }, { name: "on model error callback is not called", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("on_model_error_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from model", }, }, { name: "on model error callback changes message", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{}, wantTexts: []string{ "hello from on_model_error_callback", }, }, { name: "on model error callback changes err", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{}, wantErr: http.ErrNoCookie, }, { name: "on model error callback returns both new LLMResponse and error", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{}, wantErr: http.ErrNoCookie, }, { name: "on model error callback does not process before model callback error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, }, onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantErr: http.ErrNoCookie, }, { name: "on model error callback does not process before model callback message", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, nil }, }, onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, wantTexts: []string{ "hello from before_model_callback", }, }, { name: "after error callback process on model error callback message", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, nil }, }, afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{}, wantTexts: []string{ "hello from after_model_callback", }, }, { name: "after error callback does not process on model error callback error", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, }, afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{}, wantErr: http.ErrNoCookie, }, } { t.Run(tc.name, func(t *testing.T) { testLLM := &testutil.MockModel{ Responses: tc.llmResponses, } a, err := llmagent.New(llmagent.Config{ Name: "hello_world_agent", Model: testLLM, BeforeModelCallbacks: tc.beforeModelCallbacks, AfterModelCallbacks: tc.afterModelCallbacks, OnModelErrorCallbacks: tc.onModelErrorCallback, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } runner := testutil.NewTestAgentRunner(t, a) stream := runner.Run(t, "test_session", "") texts, err := testutil.CollectTextParts(stream) if tc.wantErr != nil && !errors.Is(err, tc.wantErr) { t.Fatalf("stream = (%q, %v), want (_, %v)", texts, err, tc.wantErr) } if (err != nil) != (tc.wantErr != nil) { t.Fatalf("unexpected result from agent, got error: %v, want error: %v", err, tc.wantErr) } if diff := cmp.Diff(tc.wantTexts, texts); diff != "" { t.Fatalf("unexpected result from agent, want: %v, got: %v, diff: %v", tc.wantTexts, texts, diff) } }) } } func TestToolCallback(t *testing.T) { type Args struct { Seed int `json:"seed"` } type Result struct { Number int `json:"number"` } handler := func(_ tool.Context, input Args) (Result, error) { return Result{Number: 1}, nil } rand, _ := functiontool.New(functiontool.Config{ Name: "rand_number", Description: "returns random number", }, handler) t.Run("before_callback_response_used", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, BeforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, nil }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"number": "7"}, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "7"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) t.Run("extra_before_callback_skipped", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, BeforeToolCallbacks: []llmagent.BeforeToolCallback{ // Since it retursn non nil, the next callback won't be executed. func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"number": "3"}, nil }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"number": "7"}, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "3"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) t.Run("after_callback_response_used", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, AfterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, nil }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"number": "7"}, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "7"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) t.Run("extra_after_callback_skipped", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, AfterToolCallbacks: []llmagent.AfterToolCallback{ // Since it retursn non nil, the next callback won't be executed. func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"number": "3"}, nil }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"number": "7"}, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "3"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) t.Run("after_callback_returned_when_used_with_before_callback", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, BeforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"number": "3"}, nil }, }, AfterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"number": "7"}, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "7"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) t.Run("both_callbacks_return_nil_actual_tool_is_executed", func(t *testing.T) { model := newGeminiModel(t, modelName, nil) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "random agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42", DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, BeforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, nil }, }, AfterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, nil }, }, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", "Generate random number with 5 as a seed.") ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "1"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } }) } func TestInstructionProvider(t *testing.T) { t.Parallel() for _, tc := range []struct { name string llmagentFunc func(model.LLM) (agent.Agent, error) wantLLMRequests []*model.LLMRequest wantAgentResponse []string wantErr error }{ { name: "instruction is evaluated", llmagentFunc: func(model model.LLM) (agent.Agent, error) { return llmagent.New(llmagent.Config{ Name: "test_agent", Model: model, Instruction: "instruction {var} test", }) }, wantLLMRequests: []*model.LLMRequest{ { Model: "mock", Contents: []*genai.Content{ genai.NewContentFromText("user input", genai.RoleUser), }, Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("instruction custom_value test\n\nYou are an agent. Your internal name is \"test_agent\"."), }, Role: genai.RoleUser, }, }, }, }, wantAgentResponse: []string{ "llm resp stub", }, }, { name: "instruction provider overrides instruction", llmagentFunc: func(model model.LLM) (agent.Agent, error) { return llmagent.New(llmagent.Config{ Name: "test_agent", Model: model, Instruction: "instruction", InstructionProvider: func(ctx agent.ReadonlyContext) (string, error) { return "instruction provider template {var} not evaluated", nil }, }) }, wantLLMRequests: []*model.LLMRequest{ { Model: "mock", Contents: []*genai.Content{ genai.NewContentFromText("user input", genai.RoleUser), }, Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("instruction provider template {var} not evaluated\n\nYou are an agent. Your internal name is \"test_agent\"."), }, Role: genai.RoleUser, }, }, }, }, wantAgentResponse: []string{ "llm resp stub", }, }, { name: "global instruction provider overrides global instruction", llmagentFunc: func(model model.LLM) (agent.Agent, error) { return llmagent.New(llmagent.Config{ Name: "test_agent", Model: model, GlobalInstruction: "instruction", GlobalInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) { return "global instruction provider template {var} not evaluated", nil }, }) }, wantLLMRequests: []*model.LLMRequest{ { Model: "mock", Contents: []*genai.Content{ genai.NewContentFromText("user input", genai.RoleUser), }, Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("global instruction provider template {var} not evaluated\n\nYou are an agent. Your internal name is \"test_agent\"."), }, Role: genai.RoleUser, }, }, }, }, wantAgentResponse: []string{ "llm resp stub", }, }, { name: "global instruction provider merged with instruction provider", llmagentFunc: func(model model.LLM) (agent.Agent, error) { return llmagent.New(llmagent.Config{ Name: "test_agent", Model: model, InstructionProvider: func(ctx agent.ReadonlyContext) (string, error) { return "instruction provider {var}", nil }, GlobalInstructionProvider: func(ctx agent.ReadonlyContext) (string, error) { return "global instruction provider {var}", nil }, }) }, wantLLMRequests: []*model.LLMRequest{ { Model: "mock", Contents: []*genai.Content{ genai.NewContentFromText("user input", genai.RoleUser), }, Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("global instruction provider {var}\n\ninstruction provider {var}\n\nYou are an agent. Your internal name is \"test_agent\"."), }, Role: genai.RoleUser, }, }, }, }, wantAgentResponse: []string{ "llm resp stub", }, }, } { t.Run(tc.name, func(t *testing.T) { model := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromText("llm resp stub", genai.RoleModel), }, } agent, err := tc.llmagentFunc(model) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } testRunner := testutil.NewTestAgentRunner(t, agent) testRunner.SetInitSessionState(map[string]any{"var": "custom_value"}) stream := testRunner.Run(t, "session", "user input") gotResp, err := testutil.CollectTextParts(stream) if err != nil { t.Fatalf("agent returned (%v, %v), want result", gotResp, err) } if diff := cmp.Diff(tc.wantLLMRequests, model.Requests); diff != "" { t.Errorf("unexpected LLM requests, want: %v, got: %v, diff: %v", tc.wantLLMRequests, model.Requests, diff) } if diff := cmp.Diff(tc.wantAgentResponse, gotResp); diff != "" { t.Errorf("unexpected agent response, want: %v, got: %v, diff: %v", tc.wantAgentResponse, gotResp, diff) } }) } } func TestFunctionTool(t *testing.T) { model := newGeminiModel(t, modelName, nil) type Args struct { A int `json:"a"` B int `json:"b"` } type Result struct { Sum int `json:"sum"` } prompt := "what is the sum of 1 + 2?" handler := func(_ tool.Context, input Args) (Result, error) { if input.A != 1 || input.B != 2 { t.Errorf("handler received %+v, want {a: 1, b: 2}", input) } return Result{Sum: input.A + input.B}, nil } rand, _ := functiontool.New(functiontool.Config{ Name: "sum", Description: "computes the sum of two numbers", }, handler) agent, err := llmagent.New(llmagent.Config{ Name: "agent", Description: "math agent", Model: model, Instruction: "IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42", // TODO(hakim): set to false when autoflow is implemented. DisallowTransferToParent: true, DisallowTransferToPeers: true, Tools: []tool.Tool{rand}, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } runner := testutil.NewTestAgentRunner(t, agent) stream := runner.Run(t, "session1", prompt) ans, err := testutil.CollectTextParts(stream) if err != nil || len(ans) == 0 { t.Fatalf("agent returned (%v, %v), want result", ans, err) } if got, want := strings.TrimSpace(ans[len(ans)-1]), "3"; got != want { t.Errorf("unexpected result from agent = (%v, %v), want ([%q], nil)", ans, err, want) } } func TestAgentTransfer(t *testing.T) { // Helpers to create genai.Content conveniently. transferCall := func(agentName string) *genai.Content { return genai.NewContentFromFunctionCall( "transfer_to_agent", map[string]any{"agent_name": agentName}, "model", ) } transferResponse := func() *genai.Content { return genai.NewContentFromFunctionResponse( "transfer_to_agent", map[string]any{}, "user") } text := func(text string) *genai.Content { return genai.NewContentFromText( text, "model", ) } // returns a model that returns the prepopulated resp one by one. testModel := func(resp ...*genai.Content) model.LLM { return &testutil.MockModel{Responses: resp} } type content struct { Author string Parts []*genai.Part } // contents returns (Author, Parts) stream extracted from the event stream. contents := func(stream iter.Seq2[*session.Event, error]) ([]content, error) { var ret []content for ev, err := range stream { if err != nil { return nil, err } if ev.LLMResponse.Content == nil { return nil, fmt.Errorf("unexpected event: %v", ev) } for _, p := range ev.LLMResponse.Content.Parts { if p.FunctionCall != nil { p.FunctionCall.ID = "" } if p.FunctionResponse != nil { p.FunctionResponse.ID = "" } } ret = append(ret, content{Author: ev.Author, Parts: ev.LLMResponse.Content.Parts}) } return ret, nil } check := func(t *testing.T, rootAgent agent.Agent, wants [][]content) { runner := testutil.NewTestAgentRunner(t, rootAgent) for i := range len(wants) { got, err := contents(runner.Run(t, "session_id", fmt.Sprintf("round %d", i))) if err != nil { t.Fatalf("[round $d]: stream ended with an error: %v", err) } if diff := cmp.Diff(wants[i], got); diff != "" { t.Errorf("[round %d] events diff (-want, +got) = %v", i, diff) } } } t.Run("auto_to_auto", func(t *testing.T) { // root_agent -- sub_agent_1 model := testModel( transferCall("sub_agent_1"), text("response1"), text("response2")) subAgent1, err := llmagent.New(llmagent.Config{ Name: "sub_agent_1", Model: model, }) if err != nil { t.Fatalf("failed to create subAgent1: %v", err) } rootAgent, err := llmagent.New(llmagent.Config{ Name: "root_agent", Model: model, SubAgents: []agent.Agent{subAgent1}, }) if err != nil { t.Fatalf("failed to create rootAgent: %v", err) } check(t, rootAgent, [][]content{ 0: { {"root_agent", transferCall("sub_agent_1").Parts}, {"root_agent", transferResponse().Parts}, {"sub_agent_1", text("response1").Parts}, }, 1: { // rootAgent should still be the current agent. {"sub_agent_1", text("response2").Parts}, }, }) }) t.Run("auto_to_single", func(t *testing.T) { // root_agent -- sub_agent_1 (single) model := testModel( transferCall("sub_agent_1"), text("response1"), text("response2")) subAgent1, err := llmagent.New(llmagent.Config{ Name: "sub_agent_1", Model: model, DisallowTransferToParent: true, DisallowTransferToPeers: true, }) if err != nil { t.Fatalf("failed to create subAgent1: %v", err) } rootAgent, err := llmagent.New(llmagent.Config{ Name: "root_agent", Model: model, SubAgents: []agent.Agent{subAgent1}, }) if err != nil { t.Fatalf("failed to create rootAgent: %v", err) } check(t, rootAgent, [][]content{ 0: { {"root_agent", transferCall("sub_agent_1").Parts}, {"root_agent", transferResponse().Parts}, {"sub_agent_1", text("response1").Parts}, }, 1: { // rootAgent should still be the current agent. {"root_agent", text("response2").Parts}, }, }) }) t.Run("auto_to_auto_to_single", func(t *testing.T) { // root_agent -- sub_agent_1 -- sub_agent_1_1 model := testModel( transferCall("sub_agent_1"), transferCall("sub_agent_1_1"), text("response1"), text("response2")) subAgent1_1, err := llmagent.New(llmagent.Config{ Name: "sub_agent_1_1", Model: model, DisallowTransferToParent: true, DisallowTransferToPeers: true, }) if err != nil { t.Fatalf("failed to create subAgent1_1: %v", err) } subAgent1, err := llmagent.New(llmagent.Config{ Name: "sub_agent_1", Model: model, SubAgents: []agent.Agent{subAgent1_1}, }) if err != nil { t.Fatalf("failed to create subAgent1: %v", err) } rootAgent, err := llmagent.New(llmagent.Config{ Name: "root_agent", Model: model, SubAgents: []agent.Agent{subAgent1}, }) if err != nil { t.Fatalf("failed to create rootAgent: %v", err) } check(t, rootAgent, [][]content{ 0: { {"root_agent", transferCall("sub_agent_1").Parts}, {"root_agent", transferResponse().Parts}, {"sub_agent_1", transferCall("sub_agent_1_1").Parts}, {"sub_agent_1", transferResponse().Parts}, {"sub_agent_1_1", text("response1").Parts}, }, 1: { // sub_agent_1 should still be the current agent. // sub_agent_1_1 is single, so it should not be the current agent. // Otherwise, the conversation will be tied to sub_agent_1_1 forever. {"sub_agent_1", text("response2").Parts}, }, }) }) // TODO: cover cases similar to adk-python's // tests/unittests/flows/llm_flows/test_agent_transfer.py // - test_auto_to_sequential // - test_auto_to_sequential_to_auto // - test_auto_to_loop } func newGeminiModel(t *testing.T, modelName string, transport http.RoundTripper) model.LLM { cfg := &genai.ClientConfig{ HTTPClient: &http.Client{Transport: transport}, APIKey: "fakeKey", } if transport == nil { // use httprr trace := filepath.Join("testdata", strings.ReplaceAll(t.Name()+".httprr", "/", "_")) cfg = testutil.NewGeminiTestClientConfig(t, trace) } model, err := gemini.NewModel(t.Context(), modelName, cfg) if err != nil { t.Fatalf("failed to create model: %v", err) } return model } type roundTripperFunc func(*http.Request) (*http.Response, error) // RoundTrip implements http.RoundTripper. func (fn roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) { return fn(req) } ================================================ FILE: agent/llmagent/state_agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llmagent_test import ( "context" "fmt" "iter" "maps" "math" "math/rand" "strings" "testing" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) // FakeLLM is a mock implementation of model.LLM for testing. type FakeLLM struct { GenerateContentFunc func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error) } func (f *FakeLLM) Name() string { return "fake-llm" } func (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { if f.GenerateContentFunc != nil { resp, err := f.GenerateContentFunc(ctx, req, stream) yield(&resp, err) } else { // Default response yield(&model.LLMResponse{ Content: genai.NewContentFromText("fake model response", genai.RoleModel), }, nil) } } } var testSessionService session.Service type assertSessionParams struct { title string keysInCtxSession []string keysInServiceSession []string keysNotInServiceSession []string } func assertSessionValues( t *testing.T, cctx agent.CallbackContext, params *assertSessionParams, ) { t.Helper() getRequest := &session.GetRequest{ AppName: cctx.AppName(), UserID: cctx.UserID(), SessionID: cctx.SessionID(), } getResponse, err := testSessionService.Get(cctx, getRequest) if err != nil { t.Fatalf("[%s] Failed to get session from service: %v", params.title, err) } sessionInService := getResponse.Session for _, key := range params.keysInCtxSession { if _, err := cctx.State().Get(key); err != nil { t.Errorf("[%s] Key %s not found in context session state: %v", params.title, key, err) } } for _, key := range params.keysInServiceSession { if _, err := sessionInService.State().Get(key); err != nil { t.Errorf("[%s] Key %s not found in service session state: %v", params.title, key, err) } } for _, key := range params.keysNotInServiceSession { if val, err := sessionInService.State().Get(key); err == nil { t.Errorf("[%s] Key %s unexpectedly found in service session state with value: %v", params.title, key, val) } } } // --- Callbacks (Modified to use *testing.T) --- func beforeAgentCallback(t *testing.T) agent.BeforeAgentCallback { return func(cctx agent.CallbackContext) (*genai.Content, error) { if _, err := cctx.State().Get("before_agent_callback_state_key"); err == nil { return genai.NewContentFromText("Sorry, I can only reply once.", genai.RoleModel), nil } if err := cctx.State().Set("before_agent_callback_state_key", "before_agent_callback_state_value"); err != nil { return nil, fmt.Errorf("failed to set state: %w", err) } assertSessionValues(t, cctx, &assertSessionParams{ title: "In before_agent_callback", keysInCtxSession: []string{"before_agent_callback_state_key"}, keysInServiceSession: []string{}, keysNotInServiceSession: []string{"before_agent_callback_state_key"}, }, ) return nil, nil } } func beforeModelCallback(t *testing.T) func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return func(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { if err := cctx.State().Set("before_model_callback_state_key", "before_model_callback_state_value"); err != nil { return nil, fmt.Errorf("failed to set state: %w", err) } assertSessionValues(t, cctx, &assertSessionParams{ title: "In before_model_callback", keysInCtxSession: []string{"before_agent_callback_state_key", "before_model_callback_state_key"}, keysInServiceSession: []string{"before_agent_callback_state_key"}, keysNotInServiceSession: []string{"before_model_callback_state_key"}, }, ) return nil, nil } } func afterModelCallback(t *testing.T) func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return func(cctx agent.CallbackContext, llmResponse *model.LLMResponse, err error) (*model.LLMResponse, error) { if err := cctx.State().Set("after_model_callback_state_key", "after_model_callback_state_value"); err != nil { return nil, fmt.Errorf("failed to set state: %w", err) } assertSessionValues(t, cctx, &assertSessionParams{ title: "In after_model_callback", keysInCtxSession: []string{"before_agent_callback_state_key", "before_model_callback_state_key", "after_model_callback_state_key"}, keysInServiceSession: []string{"before_agent_callback_state_key"}, keysNotInServiceSession: []string{"before_model_callback_state_key", "after_model_callback_state_key"}, }, ) return nil, nil } } func afterAgentCallback(t *testing.T) agent.AfterAgentCallback { return func(cctx agent.CallbackContext) (*genai.Content, error) { if err := cctx.State().Set("after_agent_callback_state_key", "after_agent_callback_state_value"); err != nil { return nil, fmt.Errorf("failed to set state: %w", err) } assertSessionValues(t, cctx, &assertSessionParams{ title: "In after_agent_callback", keysInCtxSession: []string{"before_agent_callback_state_key", "before_model_callback_state_key", "after_model_callback_state_key", "after_agent_callback_state_key"}, keysInServiceSession: []string{"before_agent_callback_state_key", "before_model_callback_state_key", "after_model_callback_state_key"}, keysNotInServiceSession: []string{"after_agent_callback_state_key"}, }, ) return nil, nil } } func TestAgentSessionLifecycle(t *testing.T) { ctx := context.Background() testSessionService = session.InMemoryService() // Setup Fake LLM fakeLLM := &FakeLLM{ GenerateContentFunc: func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error) { return model.LLMResponse{ Content: genai.NewContentFromText("test model response", genai.RoleModel), }, nil }, } // Define Agent rootAgent, err := llmagent.New(llmagent.Config{ Name: "root_agent", Description: "a verification agent.", Instruction: "Test instruction", Model: fakeLLM, BeforeAgentCallbacks: []agent.BeforeAgentCallback{beforeAgentCallback(t)}, BeforeModelCallbacks: []llmagent.BeforeModelCallback{beforeModelCallback(t)}, AfterModelCallbacks: []llmagent.AfterModelCallback{afterModelCallback(t)}, AfterAgentCallbacks: []agent.AfterAgentCallback{afterAgentCallback(t)}, }) if err != nil { t.Fatalf("Failed to create agent: %v", err) } // Setup Runner // Note: This Runner setup is a simplified guess. Actual implementation might need more services. r, err := runner.New(runner.Config{ AppName: "test_app", Agent: rootAgent, SessionService: testSessionService, }) if err != nil { t.Fatalf("Failed to create runner: %v", err) } // Create a session createReq := &session.CreateRequest{AppName: "test_app", UserID: "test_user"} createResp, err := testSessionService.Create(ctx, createReq) if err != nil { t.Fatalf("Failed to create session: %v", err) } sessionID := createResp.Session.ID() // Run the agent userContent := genai.NewContentFromText("Hello agent", genai.RoleUser) eventStream := r.Run(ctx, "test_user", sessionID, userContent, agent.RunConfig{}) // Iterate through events to trigger agent execution for _, err := range eventStream { if err != nil { t.Fatalf("Error during agent run: %v", err) } } // Final check of persisted state finalSession, _ := testSessionService.Get(ctx, &session.GetRequest{AppName: "test_app", UserID: "test_user", SessionID: sessionID}) finalState := finalSession.Session.State() expectedKeys := []string{ "before_agent_callback_state_key", "before_model_callback_state_key", "after_model_callback_state_key", "after_agent_callback_state_key", } for _, key := range expectedKeys { if _, err := finalState.Get(key); err != nil { t.Errorf("Key %s not found in final session state: %v", key, err) } } } // --- Tool Implementations --- type WeatherArgs struct { Location string `json:"location"` } type WeatherResult struct { Location string `json:"location"` Temperature int `json:"temperature"` Condition string `json:"condition"` Humidity int `json:"humidity"` Timestamp time.Time `json:"timestamp"` } func GetWeather(ctx tool.Context, args WeatherArgs) (WeatherResult, error) { // Simulate weather data temperatures := []int{-10, -5, 0, 5, 10, 15, 20, 25, 30, 35} conditions := []string{"sunny", "cloudy", "rainy", "snowy", "windy"} return WeatherResult{ Location: args.Location, Temperature: temperatures[rand.Intn(len(temperatures))], Condition: conditions[rand.Intn(len(conditions))], Humidity: rand.Intn(61) + 30, // 30-90 Timestamp: time.Now(), }, nil } type CalculationArgs struct { Operation string `json:"operation"` X float64 `json:"x"` Y float64 `json:"y"` } type CalculationResult struct { Operation string `json:"operation"` X float64 `json:"x"` Y float64 `json:"y"` Result any `json:"result"` Timestamp time.Time `json:"timestamp"` } func Calculate(ctx tool.Context, args CalculationArgs) (CalculationResult, error) { operations := map[string]float64{ "add": args.X + args.Y, "subtract": args.X - args.Y, "multiply": args.X * args.Y, } if args.Operation == "divide" { if args.Y != 0 { operations["divide"] = args.X / args.Y } else { operations["divide"] = math.Inf(int(args.X)) } } result, ok := operations[strings.ToLower(args.Operation)] if !ok { return CalculationResult{ Operation: args.Operation, X: args.X, Y: args.Y, Result: "Unknown operation", Timestamp: time.Now(), }, nil } return CalculationResult{ Operation: args.Operation, X: args.X, Y: args.Y, Result: result, Timestamp: time.Now(), }, nil } type LogActivityParams struct { Message string `json:"message"` } type LogEntry struct { Timestamp time.Time `json:"timestamp"` Message string `json:"message"` } type LogActivityResult struct { Status string `json:"status"` Entry LogEntry `json:"entry"` TotalEntries int `json:"total_entries"` err error } func LogActivity(ctx tool.Context, params LogActivityParams) (LogActivityResult, error) { var activityLog []LogEntry val, err := ctx.State().Get("activity_log") if err == nil { activityLog, _ = val.([]LogEntry) } logEntry := LogEntry{Timestamp: time.Now(), Message: params.Message} activityLog = append(activityLog, logEntry) if err := ctx.State().Set("activity_log", activityLog); err != nil { return LogActivityResult{ err: err, }, err } return LogActivityResult{ Status: "logged", Entry: logEntry, TotalEntries: len(activityLog), err: nil, }, nil } // --- Before Tool Callbacks --- func beforeToolAuditCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) { fmt.Printf("🔍 AUDIT: About to call tool '%s' with args: %v\n", t.Name(), args) var auditLog []map[string]any val, err := ctx.State().Get("audit_log") if err == nil { auditLog, _ = val.([]map[string]any) } auditLog = append(auditLog, map[string]any{ "type": "before_call", "tool_name": t.Name(), "args": args, "timestamp": time.Now(), }) if err := ctx.State().Set("audit_log", auditLog); err != nil { return nil, err } return nil, nil // Continue execution } func beforeToolSecurityCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) { if t.Name() == "get_weather" { location := "" if loc, ok := args["location"].(string); ok { location = loc } restricted := []string{"classified", "secret"} for _, r := range restricted { if strings.ToLower(location) == r { fmt.Printf("🚫 SECURITY: Blocked weather request for restricted location: %s\n", location) if err := ctx.State().Set("security_log", "example"); err != nil { return nil, err } return map[string]any{ "error": "Access denied", "reason": "Location access is restricted", "requested_location": location, }, nil // Block execution } } } return nil, nil // Continue execution } func beforeToolValidationCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) { if t.Name() == "calculate" { operation, _ := args["operation"].(string) y, yOK := args["y"].(float64) if strings.ToLower(operation) == "divide" && yOK && y == 0 { fmt.Println("🚫 VALIDATION: Prevented division by zero") return map[string]any{ "error": "Division by zero", "operation": operation, "x": args["x"], "y": args["y"], }, nil // Block execution } } return nil, nil // Continue execution } // --- After Tool Callbacks --- func afterToolEnhancementCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return result, err // Don't enhance if there was an error } fmt.Printf("✨ ENHANCE: Adding metadata to response from '%s'\n", t.Name()) enhancedResponse := make(map[string]any) maps.Copy(enhancedResponse, result) enhancedResponse["enhanced"] = true enhancedResponse["enhancement_timestamp"] = time.Now() enhancedResponse["tool_name"] = t.Name() enhancedResponse["execution_context"] = "live_streaming" return enhancedResponse, nil } func afterToolAsyncCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return result, err } fmt.Printf("🔄 ASYNC AFTER: Post-processing response from '%s'\n", t.Name()) processedResponse := make(map[string]any) maps.Copy(processedResponse, result) processedResponse["async_processed"] = true processedResponse["processor"] = "async_after_callback" return processedResponse, nil } // --- Test Function --- // --- Helper function to collect tool results --- func collectToolResults(t *testing.T, stream iter.Seq2[*session.Event, error]) []map[string]any { t.Helper() var results []map[string]any for event, err := range stream { if err != nil { t.Fatalf("Error iterating through event stream: %v", err) } if event == nil || event.Content == nil { continue } for _, part := range event.Content.Parts { if part.FunctionResponse != nil { if part.FunctionResponse.Response != nil { results = append(results, part.FunctionResponse.Response) } } } } return results } func TestToolCallbacksAgent(t *testing.T) { // Fake LLM to control tool calls ctx := t.Context() service := session.InMemoryService() fakeLLM := &FakeLLM{ GenerateContentFunc: func(ctx context.Context, req *model.LLMRequest, stream bool) (model.LLMResponse, error) { var userText string if len(req.Contents) == 1 && len(req.Contents[0].Parts) > 0 { userText = string(req.Contents[0].Parts[0].Text) } else if len(req.Contents) > 1 { userText = "after func" } var name string var args map[string]any switch userText { case "weather in London": name, args = "get_weather", map[string]any{"location": "London"} case "weather in secret": name, args = "get_weather", map[string]any{"location": "secret"} case "calculate 5 plus 3": name, args = "calculate", map[string]any{"operation": "add", "x": 5.0, "y": 3.0} case "calculate 5 divide by 0": name, args = "calculate", map[string]any{"operation": "divide", "x": 5.0, "y": 0.0} case "log this message": name, args = "log_activity", map[string]any{"message": "test log"} case "after func": return model.LLMResponse{ Content: genai.NewContentFromText("Function Ended", genai.RoleModel), }, nil default: return model.LLMResponse{ Content: genai.NewContentFromText("I'm not sure how to respond to that.", genai.RoleModel), }, nil } return model.LLMResponse{ Content: genai.NewContentFromFunctionCall(name, args, genai.RoleModel), }, nil }, } // Create tools getWeatherTool, _ := functiontool.New(functiontool.Config{Name: "get_weather", Description: "Get weather information"}, GetWeather) calculateTool, _ := functiontool.New(functiontool.Config{Name: "calculate", Description: "Perform mathematical calculations"}, Calculate) logActivityTool, _ := functiontool.New(functiontool.Config{Name: "log_activity", Description: "Log an activity message"}, LogActivity) agentConfig := llmagent.Config{ Name: "tool_callbacks_agent", Description: "Agent to test tool callbacks", Model: fakeLLM, Instruction: "Follow user instructions to call tools.", Tools: []tool.Tool{getWeatherTool, calculateTool, logActivityTool}, BeforeToolCallbacks: []llmagent.BeforeToolCallback{ beforeToolAuditCallback, beforeToolSecurityCallback, beforeToolValidationCallback, }, AfterToolCallbacks: []llmagent.AfterToolCallback{ afterToolEnhancementCallback, afterToolAsyncCallback, }, } rootAgent, err := llmagent.New(agentConfig) if err != nil { t.Fatalf("Failed to create LLM Agent: %v", err) } // Setup Runner // Note: This Runner setup is a simplified guess. Actual implementation might need more services. r, err := runner.New(runner.Config{ AppName: "test_app", Agent: rootAgent, SessionService: service, }) if err != nil { t.Fatalf("Failed to create runner: %v", err) } tests := []struct { name string query string wantContent []string // Substrings to check in the final response dontWantContent []string wantStateKeys []string }{ { name: "Weather London - success", query: "weather in London", wantContent: []string{"London", "temperature", "enhanced:true"}, dontWantContent: []string{"async_processed"}, }, { name: "Weather Secret - blocked", query: "weather in secret", wantContent: []string{"Access denied", "Location access is restricted", "enhanced:true"}, // Callbacks still run on the error result wantStateKeys: []string{"security_log"}, }, { name: "Calculate Add - success", query: "calculate 5 plus 3", wantContent: []string{"operation:add", "result:8", "enhanced:true"}, }, { name: "Calculate Divide by Zero - blocked", query: "calculate 5 divide by 0", wantContent: []string{"Division by zero", "enhanced:true"}, // Callbacks still run }, { name: "Log Activity - success", query: "log this message", wantContent: []string{"status:logged", "total_entries:1", "enhanced:true"}, wantStateKeys: []string{"activity_log"}, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { // Create a session createReq := &session.CreateRequest{AppName: "test_app", UserID: "test_user"} createResp, err := service.Create(ctx, createReq) if err != nil { t.Fatalf("Failed to create session: %v", err) } sessionID := createResp.Session.ID() userContent := genai.NewContentFromText(tc.query, genai.RoleUser) // Session ID based on test name eventStream := r.Run(ctx, "test_user", sessionID, userContent, agent.RunConfig{}) toolResults := collectToolResults(t, eventStream) if len(toolResults) == 0 { t.Fatalf("Expected tool results, got none") } lastResult := toolResults[len(toolResults)-1] // Check for expected content in the string representation of the result resultStr := fmt.Sprintf("%v", lastResult) for _, want := range tc.wantContent { if !strings.Contains(resultStr, want) { t.Errorf("Expected content %q not found in tool result: %s", want, resultStr) } } for _, dontWant := range tc.dontWantContent { if strings.Contains(resultStr, dontWant) { t.Errorf("Unexpected content %q found in tool result: %s", dontWant, resultStr) } } // Check state for log activity if len(tc.wantStateKeys) > 0 { currentSession, err := service.Get(context.Background(), &session.GetRequest{ AppName: "test_app", UserID: "test_user", SessionID: sessionID, }) if err != nil { t.Fatalf("Failed to get session: %v", err) } for _, key := range tc.wantStateKeys { if _, err := currentSession.Session.State().Get(key); err != nil { t.Errorf("Expected key %q not found in session state", key) } } } }) } } ================================================ FILE: agent/llmagent/testdata/TestFunctionTool.httprr ================================================ httprr trace v1 980 1354 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 748 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the sum of 1 + 2?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"math agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"computes the sum of two numbers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:57:34 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=922 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "sum", "args": { "a": 1, "b": 2 } }, "thoughtSignature": "CssBAb4+9vtA0YNySGDhNbWUekpgT0C4JzfoLAMCUxxSlERpI2LVij53p/T9qWJSHxNvQmxdYycF8yf/oRMZ0cnD1wKxww2tYiJpDtgJXwJRLKNaB6YpvNLH7gbW/3Sd2qNzdOlcbbenmh6gYBvjrngYKV8PYSoGj58y7BmJ7bpdwar93Q+wTGQNaeJLQeAJM+KqpF1IB6fZWk4EtotwxKnePkkMgFtwFGYXOZQjhnCudMJprOkORFhhoF4mujrSVU9uqWAIpkhahJn6d2I=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 155, "candidatesTokenCount": 18, "totalTokenCount": 223, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 155 } ], "thoughtsTokenCount": 50 }, "modelVersion": "gemini-2.5-flash", "responseId": "XTGwabD8KpaxkdUP3MTwoAk" } 1442 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1209 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the sum of 1 + 2?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":1,"b":2},"name":"sum"},"thoughtSignature":"CssBAb4+9vtA0YNySGDhNbWUekpgT0C4JzfoLAMCUxxSlERpI2LVij53p/T9qWJSHxNvQmxdYycF8yf/oRMZ0cnD1wKxww2tYiJpDtgJXwJRLKNaB6YpvNLH7gbW/3Sd2qNzdOlcbbenmh6gYBvjrngYKV8PYSoGj58y7BmJ7bpdwar93Q+wTGQNaeJLQeAJM+KqpF1IB6fZWk4EtotwxKnePkkMgFtwFGYXOZQjhnCudMJprOkORFhhoF4mujrSVU9uqWAIpkhahJn6d2I="}],"role":"model"},{"parts":[{"functionResponse":{"name":"sum","response":{"sum":3}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result of 10 + 32 is 42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"math agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"computes the sum of two numbers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:57:35 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=571 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "3" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 186, "candidatesTokenCount": 1, "totalTokenCount": 187, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 186 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "XjGwaaPEI_H3nsEP2v-88AQ" } ================================================ FILE: agent/llmagent/testdata/TestLLMAgentStreamingModeSSE.httprr ================================================ httprr trace v1 648 8944 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 402 Content-Type: application/json {"contents":[{"parts":[{"text":"What is the sum of the first 50 prime numbers?"}],"role":"user"}],"generationConfig":{"thinkingConfig":{"includeThoughts":true}},"systemInstruction":{"parts":[{"text":"Think deep. Always double check the answer before making the conclusion.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"calculating agent\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:57:56 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1828 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "**Calculating Prime Sum**\n\nI've begun working on this problem by identifying the need to sum the first 50 prime numbers. I've started listing them and have got through the first 16. The next step is to compute the rest of the list, verify the number of entries, and then calculate the sum.\n\n\n","thought": true}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"totalTokenCount": 165,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 114},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "**Summing Prime Numbers**\n\nI've completed the list of the first 50 prime numbers and meticulously summed them in groups of ten. After verifying each subtotal, I've calculated the final sum, which I believe is 5117. I'll double-check everything, including the list and the sums.\n\n\n","thought": true}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"totalTokenCount": 896,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 845},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "**Verifying Prime Sum**\n\nI've meticulously recalculated the sum of the first 50 prime numbers to confirm my previous total. After a careful re-evaluation of the list and individual group sums, I can confidently confirm that the total is indeed 5117. The analysis has concluded, and I stand by my answer.\n\n\n","thought": true}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"totalTokenCount": 1285,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "To find the sum of the first 50 prime numbers, I first need to list them and then add them up.\n\nThe first 50 prime numbers are:\n1. 2\n2. 3\n3"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 44,"totalTokenCount": 1329,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": ". 5\n4. 7\n5. 11\n6. 13\n7. 17\n8. 19\n9. 23\n10. 29\n11"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 92,"totalTokenCount": 1377,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": ". 31\n12. 37\n13. 41\n14. 43\n15. 47\n16. 53\n17. 59\n1"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 140,"totalTokenCount": 1425,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "8. 61\n19. 67\n20. 71\n21. 73\n22. 79\n23. 83\n24. 89\n"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 187,"totalTokenCount": 1472,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "25. 97\n26. 101\n27. 103\n28. 107\n29. 109\n30. 113\n3"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 235,"totalTokenCount": 1520,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "1. 127\n32. 131\n33. 137\n34. 139\n35. 149\n36. 151\n3"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 283,"totalTokenCount": 1568,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "7. 157\n38. 163\n39. 167\n40. 173\n41. 179\n42. 181\n4"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 331,"totalTokenCount": 1616,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "3. 191\n44. 193\n45. 197\n46. 199\n47. 211\n48. 223\n4"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 379,"totalTokenCount": 1664,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "9. 227\n50. 229\n\nNow, let's sum them:\nSum (1-10) = 2 + 3 + 5 + 7 + 11 + 13"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 430,"totalTokenCount": 1715,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": " + 17 + 19 + 23 + 29 = 129\nSum (11-20) = 31 + 37 + 41 + 43 + "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 477,"totalTokenCount": 1762,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "47 + 53 + 59 + 61 + 67 + 71 = 510\nSum (21-30) = 73 + 79 + 83"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 525,"totalTokenCount": 1810,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": " + 89 + 97 + 101 + 103 + 107 + 109 + 113 = 954\nSum (31-40) ="}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 573,"totalTokenCount": 1858,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": " 127 + 131 + 137 + 139 + 149 + 151 + 157 + 163 + 167 + 17"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 620,"totalTokenCount": 1905,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "3 = 1494\nSum (41-50) = 179 + 181 + 191 + 193 + 197 + 199 + "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 667,"totalTokenCount": 1952,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": "211 + 223 + 227 + 229 = 2030\n\nTotal Sum = 129 + 510 + 954 + 1494"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 715,"totalTokenCount": 2000,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} data: {"candidates": [{"content": {"parts": [{"text": " + 2030 = 5117\n\nThe sum of the first 50 prime numbers is 5117."}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 51,"candidatesTokenCount": 745,"totalTokenCount": 2030,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 51}],"thoughtsTokenCount": 1234},"modelVersion": "gemini-2.5-flash","responseId": "cjGwadCGE7yvnsEP3tfsiQk"} ================================================ FILE: agent/llmagent/testdata/TestLLMAgent_healthy_backend.httprr ================================================ httprr trace v1 618 845 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 386 Content-Type: application/json {"contents":[{"parts":[{"text":"Handle the requests as specified in the System Instruction."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"Answer as precisely as possible.\n\nRoll the dice and report only the result.\n\nYou are an agent. Your internal name is \"hello_world_agent\". The description about you is \"hello world agent\"."}],"role":"user"}}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:58:30 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1591 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "4" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 55, "candidatesTokenCount": 1, "totalTokenCount": 307, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 55 } ], "thoughtsTokenCount": 251 }, "modelVersion": "gemini-2.5-flash", "responseId": "lDGwaarTJd-unsEP-NWk0QU" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_after_callback_response_used.httprr ================================================ httprr trace v1 976 1549 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:41 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=718 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "CugCAb4+9vvc6qwu6MEzNuTOUy3EF0pFEtUyVr37qpYQ8/yuGK1RAiRRUl86Myw+fwxbjZ1tY0w2LBDFZxmUZlUStf8C0ccspZu9BQ1qi1C4NQEMQ1JyVTMoeR+T+rCmc9i6/VNR8MC2Yz4cU+o9pKP8wxDJejRGLvrXCjN4JSbhDf97qFRrtAoYtU834NexLmcQJG6RCSPLc0TL8AYVbwrKyiH5qgItuLnpbnbUlrwHzBZeZeyYigBqXbR2nQRCGeflVJ1Hi0n75B1hSbbdDKu6CkzDIWcNBzU9y7xJjv5Kt4J0EhzqZys4e2NZUKFfFhxGssQ5h/1GX+vtAlG0AJ9KzRg6yr5tsMW1RhibbVfMa8J/HkMouTz1pUMbbd9zTIBiEM1GGjIGTPjeMKeVSNyYRgYuHguwMbhy6lnB8xG0XI+MCPKyxAHLMJ47Fx+o3wvT3iRaDbzoAEnBxIEa+los8uM9QSAHAsJ6" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 227, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 76 }, "modelVersion": "gemini-2.5-flash", "responseId": "ODCwaZyQMcuXkdUP28zB2As" } 1664 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1431 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"CugCAb4+9vvc6qwu6MEzNuTOUy3EF0pFEtUyVr37qpYQ8/yuGK1RAiRRUl86Myw+fwxbjZ1tY0w2LBDFZxmUZlUStf8C0ccspZu9BQ1qi1C4NQEMQ1JyVTMoeR+T+rCmc9i6/VNR8MC2Yz4cU+o9pKP8wxDJejRGLvrXCjN4JSbhDf97qFRrtAoYtU834NexLmcQJG6RCSPLc0TL8AYVbwrKyiH5qgItuLnpbnbUlrwHzBZeZeyYigBqXbR2nQRCGeflVJ1Hi0n75B1hSbbdDKu6CkzDIWcNBzU9y7xJjv5Kt4J0EhzqZys4e2NZUKFfFhxGssQ5h/1GX+vtAlG0AJ9KzRg6yr5tsMW1RhibbVfMa8J/HkMouTz1pUMbbd9zTIBiEM1GGjIGTPjeMKeVSNyYRgYuHguwMbhy6lnB8xG0XI+MCPKyxAHLMJ47Fx+o3wvT3iRaDbzoAEnBxIEa+los8uM9QSAHAsJ6"}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":"7"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:41 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=424 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "7" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "OTCwaZKPIPetkdUPqpmhqAo" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_after_callback_returned_when_used_with_before_callback.httprr ================================================ httprr trace v1 976 1421 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:43 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=892 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "CocCAb4+9vv9wlY80xSDfuzL9q9YBrF9gdbHJPZHEXYbFB0XmIsbwvlhcgZTx2xURUhbbR+iWGuRdMDEWnRUchz2tDC5kpM+JbGVrjWjgagjIIiQCtrlMGaTlHGXCVFUc4uRWsEUev+dT+nlBuqsZNtfhPXfcYzk4/3eQ2Z9zCWc5H7Gca5YHfPTyYpNzJFGWtuubZsGx5/QGbmYefWo5eMf5DJOsz199Qc9rWKk/esbeKMkITuHSditSKP/+vNfbXQ+XRvvtCgJ2z+9r3veipFmUXOYTmzT+HJoMKSwFyFSQ/PuKTN3irHIrYJnHq+riKyRSkcVCFRDrFt2lAsDDptJck4dZFZuMKk=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 211, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 60 }, "modelVersion": "gemini-2.5-flash", "responseId": "OzCwaZDsA9aCkdUP0bmRyAU" } 1536 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1303 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"CocCAb4+9vv9wlY80xSDfuzL9q9YBrF9gdbHJPZHEXYbFB0XmIsbwvlhcgZTx2xURUhbbR+iWGuRdMDEWnRUchz2tDC5kpM+JbGVrjWjgagjIIiQCtrlMGaTlHGXCVFUc4uRWsEUev+dT+nlBuqsZNtfhPXfcYzk4/3eQ2Z9zCWc5H7Gca5YHfPTyYpNzJFGWtuubZsGx5/QGbmYefWo5eMf5DJOsz199Qc9rWKk/esbeKMkITuHSditSKP/+vNfbXQ+XRvvtCgJ2z+9r3veipFmUXOYTmzT+HJoMKSwFyFSQ/PuKTN3irHIrYJnHq+riKyRSkcVCFRDrFt2lAsDDptJck4dZFZuMKk="}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":"7"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:44 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=293 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "7" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "OzCwacXGOoaSkdUP-9_n2AY" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_before_callback_response_used.httprr ================================================ httprr trace v1 976 1409 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:38 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=748 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "Cv8BAb4+9vuiCXHA/S86tz6TiLryf5JZFA9pTP3tL02lJv+TF5DWLOtEaJpS8P0rvuk2jZWguCVmx+Z3PIFjeIa7RYJ4AuD3a4smR+uR3YAvVwCllB5kEKRx/d/g8kmv4tF/jPs6hO+gmBt90w35pXK9POe6+Upau7SuZtxksrflBCOTU19sibNANn39YhfptRt+t1edh9IJkV1llXya00beEMLgm+54shIz27aZ1vPnVazcrYgvvyukU/ayo4jZJDts8Of63PVVG8dgFKXMJEUHiN9Z708mC/5WMhAsJqqVqs4BWddausRNVcnLPH9d6oCXkwT095HXzUQlY/srI1tY" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 207, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 56 }, "modelVersion": "gemini-2.5-flash", "responseId": "NTCwaeWwNp7tkdUPt6evsAU" } 1524 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1291 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"Cv8BAb4+9vuiCXHA/S86tz6TiLryf5JZFA9pTP3tL02lJv+TF5DWLOtEaJpS8P0rvuk2jZWguCVmx+Z3PIFjeIa7RYJ4AuD3a4smR+uR3YAvVwCllB5kEKRx/d/g8kmv4tF/jPs6hO+gmBt90w35pXK9POe6+Upau7SuZtxksrflBCOTU19sibNANn39YhfptRt+t1edh9IJkV1llXya00beEMLgm+54shIz27aZ1vPnVazcrYgvvyukU/ayo4jZJDts8Of63PVVG8dgFKXMJEUHiN9Z708mC/5WMhAsJqqVqs4BWddausRNVcnLPH9d6oCXkwT095HXzUQlY/srI1tY"}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":"7"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:39 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=394 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "7" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "NjCwafbaJ4enkdUP4qubqAk" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_both_callbacks_return_nil_actual_tool_is_executed.httprr ================================================ httprr trace v1 976 1566 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:45 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1149 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "CvMCAb4+9vtDyZ0KEU3lK5jCnDCmza+fQGGG58b0oH1H6KFTPZI3iFo+hEV6hE+4Cnh5PzvDFg/YgfWQwXylYTILTu/9Yw0HAwxgN53cGm/ayTbTPFxnukDNmDS/K6rsGFtBoD29uTNTeXG4Xuvy4z+zwSSDV0PE4RBV6CaAxh7xR9KOSPg/5Ym63pKFS9LG7+rkqzhBm6QQS3wyxlsyRK9MHP/xlse+/WrADE3UDgoOEL/zd89vg2+mTr8E72NddFvruTo+r23XFabVnKlb/iLoh+TmLpIuwroi75o5cKnNuiZ/PXxo7P+Zr30ogwbltMzcKL/DEA1c1x+Z49UBtnU7+knzuGjPqCVR4qchfJWydI+FgBBbS+lbtNEBIwkM3Z24Dg9Q8kBY8/a3t5FR7PqFkvJ7Fx0kRPTtAGX0R42m/PVeYzrUSCp4aVReYDZh3FPPNqEWGxz2f2aBBMR5LaW8ABXO2kD6ZJnHv8+s0cvxjIyNg2Q=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 229, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 78 }, "modelVersion": "gemini-2.5-flash", "responseId": "PDCwafCwD6GF7M8Pn7bJqAE" } 1678 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1445 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"CvMCAb4+9vtDyZ0KEU3lK5jCnDCmza+fQGGG58b0oH1H6KFTPZI3iFo+hEV6hE+4Cnh5PzvDFg/YgfWQwXylYTILTu/9Yw0HAwxgN53cGm/ayTbTPFxnukDNmDS/K6rsGFtBoD29uTNTeXG4Xuvy4z+zwSSDV0PE4RBV6CaAxh7xR9KOSPg/5Ym63pKFS9LG7+rkqzhBm6QQS3wyxlsyRK9MHP/xlse+/WrADE3UDgoOEL/zd89vg2+mTr8E72NddFvruTo+r23XFabVnKlb/iLoh+TmLpIuwroi75o5cKnNuiZ/PXxo7P+Zr30ogwbltMzcKL/DEA1c1x+Z49UBtnU7+knzuGjPqCVR4qchfJWydI+FgBBbS+lbtNEBIwkM3Z24Dg9Q8kBY8/a3t5FR7PqFkvJ7Fx0kRPTtAGX0R42m/PVeYzrUSCp4aVReYDZh3FPPNqEWGxz2f2aBBMR5LaW8ABXO2kD6ZJnHv8+s0cvxjIyNg2Q="}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":1}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:45 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=439 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "1" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "PTCwab7MGOWD7M8PnPC9yQU" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_extra_after_callback_skipped.httprr ================================================ httprr trace v1 976 1493 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:42 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=751 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "CrwCAb4+9vuoZscYmNHbFm6Hl7XwmBgLRDVOpvS6zwLx57uGGzYrodnHDrseIc4rAjrQZB+65AWSRUl9FyYBsJyHYwuirfz8kMG2egbXP8/Y43wmWQeoRuOIwHxd3tOWb9ePoAUEU0HVrStulV9e4n7+Pr9mhWBSwTeWmeu+ji4H2ul6yjnMCZhuQsOe3+qLWekyuh23lq1AGtDnbLBM0SM4tHZcjry+MmRHsIwuXjrD21e397R7ui3Y9d8WmMlhuNymoGP/8EC7vFhwBaM+OPTTOKeMIGOgtMfj9jNVRy5pbaqM7+kmUxZs6ooTdaMJMWe6oZ1co+KalClngQbfIysU22ncyko4AtuDlPlseZnvjBjX0+Y9qlNP9Q4l0lhpUgrGnx6vyJo9YKHzCfWF0bOkqRME3KMjOFwvSK6vuA==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 219, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 68 }, "modelVersion": "gemini-2.5-flash", "responseId": "OTCwabPEOprf7M8P8_738Ag" } 1608 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1375 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"CrwCAb4+9vuoZscYmNHbFm6Hl7XwmBgLRDVOpvS6zwLx57uGGzYrodnHDrseIc4rAjrQZB+65AWSRUl9FyYBsJyHYwuirfz8kMG2egbXP8/Y43wmWQeoRuOIwHxd3tOWb9ePoAUEU0HVrStulV9e4n7+Pr9mhWBSwTeWmeu+ji4H2ul6yjnMCZhuQsOe3+qLWekyuh23lq1AGtDnbLBM0SM4tHZcjry+MmRHsIwuXjrD21e397R7ui3Y9d8WmMlhuNymoGP/8EC7vFhwBaM+OPTTOKeMIGOgtMfj9jNVRy5pbaqM7+kmUxZs6ooTdaMJMWe6oZ1co+KalClngQbfIysU22ncyko4AtuDlPlseZnvjBjX0+Y9qlNP9Q4l0lhpUgrGnx6vyJo9YKHzCfWF0bOkqRME3KMjOFwvSK6vuA=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":"3"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:43 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=349 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "3" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "OjCwaa7hK5vZ7M8PpLbA6Qs" } ================================================ FILE: agent/llmagent/testdata/TestToolCallback_extra_before_callback_skipped.httprr ================================================ httprr trace v1 976 1430 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 744 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:40 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1359 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "rand_number", "args": { "seed": 5 } }, "thoughtSignature": "Co4CAb4+9vshp23q730zmpKZA44y18kH57i34mjTjHqu63zEHBWY7uvTVnM/ct8OnEACaGkPS1ns8seAUWXuxgHXkmWRzzFFveogyu8/m8CbLxzfYaalGxiriSPCN9pLcIq6WfzwCIobgZh5szHcYKM4zOipgtV7f1eUX/wrGmuaNYBx7OurtouFK6x11rBjafcIaKp1PNrXHkxHwtQ7TEl0QegcsN4vVol82qyw4Pp+bl6PhzkjWvgqnNsnuPmJN8Emm6Ajf5ovW1GuPR9iTuAz6f1ncwyKlhZuLQMZKla7MsV7kcx+fUfFvJIF69A/FqH020HABFpD+CWaUzR0KaTWTcE3MvlZkmUy6sTx9a4R" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 136, "candidatesTokenCount": 15, "totalTokenCount": 211, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 136 } ], "thoughtsTokenCount": 60 }, "modelVersion": "gemini-2.5-flash", "responseId": "NzCwaf7JAvrikdUPuqqn8QU" } 1544 815 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1311 Content-Type: application/json {"contents":[{"parts":[{"text":"Generate random number with 5 as a seed."}],"role":"user"},{"parts":[{"functionCall":{"args":{"seed":5},"name":"rand_number"},"thoughtSignature":"Co4CAb4+9vshp23q730zmpKZA44y18kH57i34mjTjHqu63zEHBWY7uvTVnM/ct8OnEACaGkPS1ns8seAUWXuxgHXkmWRzzFFveogyu8/m8CbLxzfYaalGxiriSPCN9pLcIq6WfzwCIobgZh5szHcYKM4zOipgtV7f1eUX/wrGmuaNYBx7OurtouFK6x11rBjafcIaKp1PNrXHkxHwtQ7TEl0QegcsN4vVol82qyw4Pp+bl6PhzkjWvgqnNsnuPmJN8Emm6Ajf5ovW1GuPR9iTuAz6f1ncwyKlhZuLQMZKla7MsV7kcx+fUfFvJIF69A/FqH020HABFpD+CWaUzR0KaTWTcE3MvlZkmUy6sTx9a4R"}],"role":"model"},{"parts":[{"functionResponse":{"name":"rand_number","response":{"number":"3"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"IMPORTANT: output ONLY the result computed by the provided function, if the result is number:42 print only 42\n\nYou are an agent. Your internal name is \"agent\". The description about you is \"random agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns random number","name":"rand_number","parametersJsonSchema":{"additionalProperties":false,"properties":{"seed":{"type":"integer"}},"required":["seed"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"number":{"type":"integer"}},"required":["number"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:52:40 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=402 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "3" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 166, "candidatesTokenCount": 1, "totalTokenCount": 167, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 166 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "ODCwaevWGfH3nsEP2v-88AQ" } ================================================ FILE: agent/loader.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent import ( "fmt" ) // Loader allows to load a particular agent by name and get the root agent type Loader interface { // ListAgents returns a list of names of all agents ListAgents() []string // LoadAgent returns an agent by its name. Returns error if there is no agent with such a name. LoadAgent(name string) (Agent, error) // RootAgent returns the root agent RootAgent() Agent } // multiLoader should be used when you have multiple agents type multiLoader struct { agentMap map[string]Agent root Agent } // singleLoader should be used when you have only one agent type singleLoader struct { root Agent } // NewSingleLoader returns a loader with only one agent, which becomes the root agent func NewSingleLoader(a Agent) Loader { return &singleLoader{root: a} } // singleAgentLoader implements AgentLoader. Returns root agent's name func (s *singleLoader) ListAgents() []string { return []string{s.root.Name()} } // singleAgentLoader implements AgentLoader. Returns root for empty name and for root.Name(), error otherwise. func (s *singleLoader) LoadAgent(name string) (Agent, error) { if name == "" { return s.root, nil } if name == s.root.Name() { return s.root, nil } return nil, fmt.Errorf("cannot load agent '%s' - provide an empty string or use '%s'", name, s.root.Name()) } // singleAgentLoader implements AgentLoader. Returns the root agent. func (s *singleLoader) RootAgent() Agent { return s.root } // NewMultiLoader returns a new AgentLoader with the given root Agent and other agents. // Returns an error if more than one agent (including root) shares the same name func NewMultiLoader(root Agent, agents ...Agent) (Loader, error) { m := make(map[string]Agent) m[root.Name()] = root for _, a := range agents { if _, ok := m[a.Name()]; ok { // duplicate name return nil, fmt.Errorf("duplicate agent name: %s", a.Name()) } m[a.Name()] = a } return &multiLoader{ agentMap: m, root: root, }, nil } // multiAgentLoader implements AgentLoader. Returns the list of all agents' names (including root agent) func (m *multiLoader) ListAgents() []string { agents := make([]string, 0, len(m.agentMap)) for name := range m.agentMap { agents = append(agents, name) } return agents } // multiAgentLoader implements LoadAgent. Returns an agent with given name or error if no such an agent is found func (m *multiLoader) LoadAgent(name string) (Agent, error) { agent, ok := m.agentMap[name] if !ok { return nil, fmt.Errorf("agent %s not found. Please specify one of those: %v", name, m.ListAgents()) } return agent, nil } // multiAgentLoader implements LoadAgent. func (m *multiLoader) RootAgent() Agent { return m.root } ================================================ FILE: agent/loader_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent import ( "iter" "testing" "google.golang.org/adk/session" ) var _ Agent = (*testAgent)(nil) type testAgent struct { name string } func (a *testAgent) Name() string { return a.name } func (a *testAgent) Description() string { panic("not implemented") } func (a *testAgent) Run(InvocationContext) iter.Seq2[*session.Event, error] { panic("not implemented") } func (a *testAgent) SubAgents() []Agent { panic("not implemented") } func (a *testAgent) internal() *agent { panic("not implemented") } func TestDuplicateName(t *testing.T) { agent1 := &testAgent{name: "weather_time_agent"} // duplicate name agent2 := &testAgent{name: "weather_time_agent"} agent3 := &testAgent{name: "unique"} tests := []struct { name string root Agent agents []Agent wantErr bool }{ { name: "root only", root: agent1, agents: []Agent{}, wantErr: false, }, { name: "root duplicate object", root: agent1, agents: []Agent{agent1}, wantErr: true, }, { name: "root duplicate name", root: agent1, agents: []Agent{agent2}, wantErr: true, }, { name: "non-root duplicate name", root: agent3, agents: []Agent{agent1, agent2}, wantErr: true, }, { name: "non-root duplicate object", root: agent3, agents: []Agent{agent1, agent1}, wantErr: true, }, { name: "no duplicates", root: agent1, agents: []Agent{agent3}, wantErr: false, }, } for _, tt := range tests { _, err := NewMultiLoader(tt.root, tt.agents...) if (err != nil) != tt.wantErr { t.Errorf("NewMultiLoader() name=%v, error = %v, wantErr %v", tt.name, err, tt.wantErr) } } } ================================================ FILE: agent/remoteagent/a2a_agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "context" "fmt" "iter" "log" "time" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2aclient/agentcard" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" iremoteagent "google.golang.org/adk/internal/agent/remoteagent" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) // BeforeA2ARequestCallback is called before sending a request to the remote agent. // // If it returns non-nil result or error, the actual call is skipped and the returned value is used // as the agent invocation result. type BeforeA2ARequestCallback func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) // A2AEventConverter can be used to provide a custom implementation of A2A event transformation logic. type A2AEventConverter func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) // AfterA2ARequestCallback is called after receiving a response from the remote agent and converting it to a session.Event. // In streaming responses the callback is invoked for every request. Session event parameter might be nil if conversion logic // decides to not emit an A2A event. // // If it returns non-nil result or error, it gets emitted instead of the original result. type AfterA2ARequestCallback func(ctx agent.CallbackContext, req *a2a.MessageSendParams, resp *session.Event, err error) (*session.Event, error) // A2ARemoteTaskCleanupCallback is called if Run exited before a terminal event was received from the remote A2A server. type A2ARemoteTaskCleanupCallback func(ctx context.Context, card *a2a.AgentCard, client *a2aclient.Client, taskInfo a2a.TaskInfo, cause error) // A2AConfig is used to describe and configure a remote agent. type A2AConfig struct { Name string Description string // AgentCardSource can be either an http(s) URL or a local file path. If a2a.AgentCard // is not provided, the source is used to resolve the card during the first agent invocation. AgentCard *a2a.AgentCard AgentCardSource string // CardResolveOptions can be used to provide a set of agencard.Resolver configurations. CardResolveOptions []agentcard.ResolveOption // BeforeAgentCallbacks is a list of callbacks that are called sequentially // before the agent starts its run. // // If any callback returns non-nil content or error, then the agent run and // the remaining callbacks will be skipped, and a new event will be created // from the content or error of that callback. BeforeAgentCallbacks []agent.BeforeAgentCallback // BeforeRequestCallbacks will be called in the order they are provided until // there's a callback that returns a non-nil result or error. Then the // actual request is skipped, and the returned response/error is used. // // This provides an opportunity to inspect, log, or modify the request object. // It can also be used to implement caching by returning a cached // response, which would skip the actual remote agent call. BeforeRequestCallbacks []BeforeA2ARequestCallback // Converter is used to convert a2a.Event to session.Event. If not provided, adka2a.ToSessionEvent // is used as the default implementation and errors are converted to events with error payload. Converter A2AEventConverter // AfterRequestCallbacks will be called in the order they are provided until // there's a callback that returns a non-nil result or error. Then // the actual remote agent event is replaced with the returned result/error. // // This is the ideal place to log agent responses, collect metrics on token or perform // pre-processing of events before a mapper is invoked. AfterRequestCallbacks []AfterA2ARequestCallback // AfterAgentCallbacks is a list of callbacks that are called sequentially // after the agent has completed its run. // // If any callback returns non-nil content or error, then a new event will be // created from the content or error of that callback and the remaining // callbacks will be skipped. AfterAgentCallbacks []agent.AfterAgentCallback // A2APartConverter is a custom converter for converting A2A parts to GenAI parts. // Implementations should generally remember to leverage adka2a.ToGenAiPart for default conversions // nil returns are considered intentionally dropped parts. A2APartConverter adka2a.A2APartConverter // GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts. // Implementations should generally remember to leverage adka2a.ToA2APart for default conversions // nil returns are considered intentionally dropped parts. GenAIPartConverter adka2a.GenAIPartConverter // ClientFactory can be used to provide a set of a2aclient.Client configurations. ClientFactory *a2aclient.Factory // MessageSendConfig is attached to a2a.MessageSendParams sent on every agent invocation. MessageSendConfig *a2a.MessageSendConfig // RemoteTaskCleanupCallback is called if Run exited before a terminal event was received from the remote A2A server. // If Run exited due to an error including context cancellation it will be passed as cause. // The context passed to this callback is the original context, but with Err() removed by context.WithoutCancel. // If no callback is provided the default behavior is to make a cancel RPC request with 5 second timeout. RemoteTaskCleanupCallback A2ARemoteTaskCleanupCallback } // NewA2A creates a remote A2A agent. A2A (Agent-To-Agent) protocol is used for communication with an // agent which can run in a different process or on a different host. func NewA2A(cfg A2AConfig) (agent.Agent, error) { if cfg.AgentCard == nil && cfg.AgentCardSource == "" { return nil, fmt.Errorf("either AgentCard or AgentCardSource must be provided") } remoteAgent := &a2aAgent{ serverConfig: &iremoteagent.A2AServerConfig{ AgentCard: cfg.AgentCard, AgentCardSource: cfg.AgentCardSource, CardResolveOptions: cfg.CardResolveOptions, ClientFactory: cfg.ClientFactory, }, } agent, err := agent.New(agent.Config{ Name: cfg.Name, Description: cfg.Description, BeforeAgentCallbacks: cfg.BeforeAgentCallbacks, AfterAgentCallbacks: cfg.AfterAgentCallbacks, Run: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] { return remoteAgent.run(ic, cfg) }, }) if err != nil { return nil, err } internalAgent, ok := agent.(agentinternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to internal agent") } state := agentinternal.Reveal(internalAgent) state.AgentType = agentinternal.TypeRemoteAgent state.Config = iremoteagent.RemoteAgentState{A2A: remoteAgent.serverConfig} return agent, nil } type a2aAgent struct { serverConfig *iremoteagent.A2AServerConfig } func (a *a2aAgent) run(ctx agent.InvocationContext, cfg A2AConfig) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { agentCard, client, err := iremoteagent.CreateA2AClient(ctx, a.serverConfig) if err != nil { yield(toErrorEvent(ctx, fmt.Errorf("client creation failed: %w", err)), nil) return } defer destroy(client) msg, err := newMessage(ctx, cfg) if err != nil { yield(toErrorEvent(ctx, fmt.Errorf("message creation failed: %w", err)), nil) return } req := &a2a.MessageSendParams{Message: msg, Config: cfg.MessageSendConfig} processor := newRunProcessor(cfg, req) if bcbResp, bcbErr := processor.runBeforeA2ARequestCallbacks(ctx); bcbResp != nil || bcbErr != nil { if acbResp, acbErr := processor.runAfterA2ARequestCallbacks(ctx, bcbResp, bcbErr); acbResp != nil || acbErr != nil { yield(acbResp, acbErr) } else { yield(bcbResp, bcbErr) } return } if len(msg.Parts) == 0 { resp := adka2a.NewRemoteAgentEvent(ctx) if cbResp, cbErr := processor.runAfterA2ARequestCallbacks(ctx, resp, err); cbResp != nil || cbErr != nil { yield(cbResp, cbErr) } else { yield(resp, nil) } return } var lastErr error yieldErr := func(err error) bool { lastErr = err return yield(nil, err) } var lastEvent a2a.Event defer func() { err := lastErr if err == nil && ctx.Err() != nil { err = context.Cause(ctx) } cleanupRemoteTask(ctx, cfg, agentCard, client, lastEvent, err) }() processEvent := func(a2aEvent a2a.Event, a2aErr error) bool { if a2aEvent != nil { lastEvent = a2aEvent } var err error var event *session.Event if cfg.Converter != nil { event, err = cfg.Converter(ctx, req, a2aEvent, a2aErr) } else { event, err = processor.convertToSessionEvent(ctx, a2aEvent, a2aErr) } if cbResp, cbErr := processor.runAfterA2ARequestCallbacks(ctx, event, err); cbResp != nil || cbErr != nil { if cbErr != nil { return yieldErr(cbErr) } event = cbResp err = nil } if err != nil { return yieldErr(err) } if event != nil { // an event might be skipped for _, toEmit := range processor.aggregatePartial(ctx, a2aEvent, event) { if !yield(toEmit, nil) { return false } } } return true } if ctx.RunConfig().StreamingMode == agent.StreamingModeNone { a2aEvent, a2aErr := client.SendMessage(ctx, req) processEvent(a2aEvent, a2aErr) return } for a2aEvent, a2aErr := range client.SendStreamingMessage(ctx, req) { if !processEvent(a2aEvent, a2aErr) { return } } } } func cleanupRemoteTask(ctx context.Context, cfg A2AConfig, card *a2a.AgentCard, client *a2aclient.Client, lastEvent a2a.Event, cause error) { if lastEvent == nil { return } taskID := lastEvent.TaskInfo().TaskID if taskID == "" { return } if _, ok := lastEvent.(*a2a.Message); ok { return } var state a2a.TaskState if tu, ok := lastEvent.(*a2a.TaskStatusUpdateEvent); ok { state = tu.Status.State } if t, ok := lastEvent.(*a2a.Task); ok { state = t.Status.State } if state.Terminal() { return } ctx = context.WithoutCancel(ctx) if cfg.RemoteTaskCleanupCallback != nil { cfg.RemoteTaskCleanupCallback(ctx, card, client, lastEvent.TaskInfo(), cause) return } if state == a2a.TaskStateInputRequired && cause == nil { return } cancelCtx, cancelTimeout := context.WithTimeout(ctx, 5*time.Second) defer cancelTimeout() _, err := client.CancelTask(cancelCtx, &a2a.TaskIDParams{ID: taskID}) if err != nil { log.Printf("failed to cancel task %s: %v", taskID, err) } } func newMessage(ctx agent.InvocationContext, cfg A2AConfig) (*a2a.Message, error) { events := ctx.Session().Events() if userFnCall := getUserFunctionCallAt(events, events.Len()-1); userFnCall != nil { event := userFnCall.response parts, err := convertParts(ctx, cfg, event) if err != nil { return nil, err } msg := a2a.NewMessage(a2a.MessageRoleUser, parts...) msg.TaskID = userFnCall.taskID msg.ContextID = userFnCall.contextID return msg, nil } parts, contextID := toMissingRemoteSessionParts(ctx, events, cfg) msg := a2a.NewMessage(a2a.MessageRoleUser, parts...) msg.ContextID = contextID return msg, nil } func toErrorEvent(ctx agent.InvocationContext, err error) *session.Event { event := adka2a.NewRemoteAgentEvent(ctx) event.ErrorMessage = err.Error() event.CustomMetadata = map[string]any{adka2a.ToADKMetaKey("error"): err.Error()} event.TurnComplete = true return event } func convertParts(ctx agent.InvocationContext, cfg A2AConfig, event *session.Event) ([]a2a.Part, error) { parts := make([]a2a.Part, 0, len(event.Content.Parts)) if cfg.GenAIPartConverter != nil { for _, part := range event.Content.Parts { cp, err := cfg.GenAIPartConverter(ctx, event, part) if err != nil { return nil, err } if cp != nil { parts = append(parts, cp) } } } else { var err error parts, err = adka2a.ToA2AParts(event.Content.Parts, event.LongRunningToolIDs) if err != nil { return nil, fmt.Errorf("event part conversion failed: %w", err) } } return parts, nil } func destroy(client *a2aclient.Client) { if err := client.Destroy(); err != nil { log.Printf("failed to destroy client: %v", err) } } ================================================ FILE: agent/remoteagent/a2a_agent_run_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "fmt" "maps" "slices" "github.com/a2aproject/a2a-go/a2a" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/converters" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) type artifactAggregation struct { parts []*genai.Part citations *genai.CitationMetadata grounding *genai.GroundingMetadata customMeta map[string]any usage *genai.GenerateContentResponseUsageMetadata } type a2aAgentRunProcessor struct { config A2AConfig partConverter adka2a.A2APartConverter request *a2a.MessageSendParams // partial event contents emitted before the terminal event aggregations map[a2a.ArtifactID]*artifactAggregation // used to emit aggregations in the order of last update aggregationOrder []a2a.ArtifactID } func newRunProcessor(config A2AConfig, request *a2a.MessageSendParams) *a2aAgentRunProcessor { return &a2aAgentRunProcessor{ config: config, request: request, partConverter: config.A2APartConverter, aggregations: make(map[a2a.ArtifactID]*artifactAggregation), } } // aggregatePartial stores contents of partial events to emit them with the terminal event. // It can modify the original event or return a new event to emit before the provided event. func (p *a2aAgentRunProcessor) aggregatePartial(ctx agent.InvocationContext, a2aEvent a2a.Event, event *session.Event) []*session.Event { // ADK partial events should be aggregated by ADK and emitted as a non-partial artifact update. // That's why we skip them regardless of the actual isPartial value. // This is the legacy [adka2a.OutputMode]. if a2aEvent != nil && adka2a.IsPartialFlagSet(a2aEvent.Meta()) { return []*session.Event{event} } // RemoteAgent event stream finished, emit any aggregated events data we have before the final event if statusUpdate, ok := a2aEvent.(*a2a.TaskStatusUpdateEvent); ok && statusUpdate.Final { var events []*session.Event for _, aid := range p.aggregationOrder { if agg, ok := p.aggregations[aid]; ok { events = append(events, p.buildNonPartialAggregation(ctx, agg)) } } return append(events, event) } // RemoteAgent published a snapshot which should have all the data we potentially aggregated. // Reset the aggregation so that it is not published twice. if _, ok := a2aEvent.(*a2a.Task); ok { p.aggregations = map[a2a.ArtifactID]*artifactAggregation{} p.aggregationOrder = nil return []*session.Event{event} } update, ok := a2aEvent.(*a2a.TaskArtifactUpdateEvent) if !ok { // do not aggregate status updates return []*session.Event{event} } if !update.Append { // non-append event resets aggregation p.removeAggregation(update.Artifact.ID) if update.LastChunk { // non-append event which is the last chunk must already be non-partial event.Partial = false return []*session.Event{event} } } aggregation := p.aggregations[update.Artifact.ID] if aggregation == nil { aggregation = &artifactAggregation{} p.aggregations[update.Artifact.ID] = aggregation } p.updateAggregation(update.Artifact.ID, aggregation, event) if !update.LastChunk { return []*session.Event{event} } // emit partial last chunk and follow by the non-partial aggregated event p.removeAggregation(update.Artifact.ID) return []*session.Event{event, p.buildNonPartialAggregation(ctx, aggregation)} } func (p *a2aAgentRunProcessor) removeAggregation(aid a2a.ArtifactID) { delete(p.aggregations, aid) p.removeFromOrder(aid) } func (p *a2aAgentRunProcessor) removeFromOrder(aid a2a.ArtifactID) { p.aggregationOrder = slices.DeleteFunc(p.aggregationOrder, func(id a2a.ArtifactID) bool { return id == aid }) } func (p *a2aAgentRunProcessor) updateAggregation(aid a2a.ArtifactID, agg *artifactAggregation, event *session.Event) { if event.Content != nil { for _, part := range event.Content.Parts { if part.Text != "" { // collapse small text-block parts to bigger text blocks if len(agg.parts) > 0 { lastPart := agg.parts[len(agg.parts)-1] // check if last part is a text block of the same 'Thought' type if lastPart.Text != "" && lastPart.Thought == part.Thought { lastPart.Text += part.Text continue } } agg.parts = append(agg.parts, &genai.Part{ Text: part.Text, Thought: part.Thought, }) } else { agg.parts = append(agg.parts, part) } } } if event.CitationMetadata != nil { if agg.citations == nil { agg.citations = &genai.CitationMetadata{} } agg.citations.Citations = append(agg.citations.Citations, event.CitationMetadata.Citations...) } if event.CustomMetadata != nil { if agg.customMeta == nil { agg.customMeta = make(map[string]any) } maps.Copy(agg.customMeta, event.CustomMetadata) } if event.GroundingMetadata != nil { agg.grounding = event.GroundingMetadata } if event.UsageMetadata != nil { // cumulative agg.usage = event.UsageMetadata } p.removeFromOrder(aid) p.aggregationOrder = append(p.aggregationOrder, aid) } func (p *a2aAgentRunProcessor) buildNonPartialAggregation(ctx agent.InvocationContext, agg *artifactAggregation) *session.Event { parts := agg.parts result := adka2a.NewRemoteAgentEvent(ctx) result.Content = genai.NewContentFromParts(parts, genai.RoleModel) result.CustomMetadata = agg.customMeta result.GroundingMetadata = agg.grounding result.CitationMetadata = agg.citations result.UsageMetadata = agg.usage return result } // convertToSessionEvent converts A2A client SendStreamingMessage result to a session event. Returns nil if nothing should be emitted. func (p *a2aAgentRunProcessor) convertToSessionEvent(ctx agent.InvocationContext, a2aEvent a2a.Event, err error) (*session.Event, error) { if err != nil { event := toErrorEvent(ctx, err) p.updateCustomMetadata(event, nil) return event, nil } event, err := adka2a.ToSessionEventWithParts(ctx, a2aEvent, p.partConverter) if err != nil { event := toErrorEvent(ctx, fmt.Errorf("failed to convert a2aEvent: %w", err)) p.updateCustomMetadata(event, nil) return event, nil } if event != nil { p.updateCustomMetadata(event, a2aEvent) } return event, nil } func (p *a2aAgentRunProcessor) runBeforeA2ARequestCallbacks(ctx agent.InvocationContext) (*session.Event, error) { cctx := icontext.NewCallbackContext(ctx) for _, callback := range p.config.BeforeRequestCallbacks { if cbResp, cbErr := callback(cctx, p.request); cbResp != nil || cbErr != nil { return cbResp, cbErr } } return nil, nil } func (p *a2aAgentRunProcessor) runAfterA2ARequestCallbacks(ctx agent.InvocationContext, resp *session.Event, err error) (*session.Event, error) { cctx := icontext.NewCallbackContext(ctx) for _, callback := range p.config.AfterRequestCallbacks { if cbEvent, cbErr := callback(cctx, p.request, resp, err); cbEvent != nil || cbErr != nil { return cbEvent, cbErr } } return nil, nil } func (p *a2aAgentRunProcessor) updateCustomMetadata(event *session.Event, response a2a.Event) { toAdd := map[string]any{} if p.request != nil && event.TurnComplete { // only add request to the final event to avoid massive data duplication during streaming toAdd["request"] = p.request } if response != nil { toAdd["response"] = response } if len(toAdd) == 0 { return } if event.CustomMetadata == nil { event.CustomMetadata = map[string]any{} } for k, v := range toAdd { if v == nil { continue } payload, err := converters.ToMapStructure(v) if err == nil { event.CustomMetadata[adka2a.ToADKMetaKey(k)] = payload } else { event.CustomMetadata[adka2a.ToADKMetaKey(k+"_codec_error")] = err.Error() } } } ================================================ FILE: agent/remoteagent/a2a_agent_run_processor_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) func TestA2AAgentRunProcessor_aggregatePartial(t *testing.T) { type updateFlags struct { append bool lastChunk bool } task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} newArtifactUpdate := func(aid a2a.ArtifactID, flags updateFlags, text string) *a2a.TaskArtifactUpdateEvent { return &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ID: aid, Parts: a2a.ContentParts{a2a.TextPart{Text: text}}}, LastChunk: flags.lastChunk, Append: flags.append, } } newPartialEvent := func(text string) *session.Event { return &session.Event{LLMResponse: model.LLMResponse{ Partial: true, Content: genai.NewContentFromText(text, genai.RoleModel), }} } newCompletedEvent := func(parts ...*genai.Part) *session.Event { e := &session.Event{LLMResponse: model.LLMResponse{TurnComplete: true}} if len(parts) > 0 { e.Content = genai.NewContentFromParts(parts, genai.RoleModel) } return e } newEvent := func(parts ...*genai.Part) *session.Event { e := &session.Event{LLMResponse: model.LLMResponse{Partial: false}} if len(parts) > 0 { e.Content = genai.NewContentFromParts(parts, genai.RoleModel) } return e } withADKPartial := func(event *a2a.TaskArtifactUpdateEvent, partial bool) *a2a.TaskArtifactUpdateEvent { event.Metadata = map[string]any{adka2a.ToA2AMetaKey("partial"): partial} return event } aid1, aid2 := a2a.NewArtifactID(), a2a.NewArtifactID() tests := []struct { name string events []a2a.Event wantEvents []*session.Event }{ { name: "do not aggregate when ADK events", events: []a2a.Event{ withADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: "Hel"}), true), withADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: "lo"}), true), withADKPartial(a2a.NewArtifactUpdateEvent(task, aid1, a2a.TextPart{Text: "Hello"}), false), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Hel"), newPartialEvent("lo"), newEvent(genai.NewPartFromText("Hello")), newCompletedEvent(), }, }, { name: "aggregation reset by final snapshot", events: []a2a.Event{ a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "ignore me"}), &a2a.Task{ ID: task.ID, Artifacts: []*a2a.Artifact{{Parts: a2a.ContentParts{a2a.TextPart{Text: "done"}}}}, Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, }, }, wantEvents: []*session.Event{ newPartialEvent("ignore me"), newCompletedEvent(genai.NewPartFromText("done")), }, }, { name: "aggregation reset by non-final snapshot", events: []a2a.Event{ a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "foo"}), &a2a.Task{ID: task.ID}, a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "bar"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("foo"), newPartialEvent("bar"), newEvent(genai.NewPartFromText("bar")), newCompletedEvent(), }, }, { name: "[append=true, lastChunk=false] emit aggregated on final status", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Hel"), newArtifactUpdate(aid1, updateFlags{append: true}, "lo"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Hel"), newPartialEvent("lo"), newEvent(genai.NewPartFromText("Hello")), newCompletedEvent(), }, }, { name: "[append=true, lastChunk=false] emit multiple aggregated on final status", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Foo"), newArtifactUpdate(aid2, updateFlags{append: true}, "Bar"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Foo"), newPartialEvent("Bar"), newEvent(genai.NewPartFromText("Foo")), newEvent(genai.NewPartFromText("Bar")), newCompletedEvent(), }, }, { name: "last updated aggregation is emitted last", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Foo"), newArtifactUpdate(aid2, updateFlags{append: true}, "Bar"), newArtifactUpdate(aid1, updateFlags{append: true}, "Baz"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Foo"), newPartialEvent("Bar"), newPartialEvent("Baz"), newEvent(genai.NewPartFromText("Bar")), newEvent(genai.NewPartFromText("FooBaz")), newCompletedEvent(), }, }, { name: "[append=true, lastChunk=true] results in partial followed by non-partial", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Hel"), newArtifactUpdate(aid1, updateFlags{append: true, lastChunk: true}, "lo"), newArtifactUpdate(aid2, updateFlags{append: true}, "bar"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Hel"), newPartialEvent("lo"), newEvent(genai.NewPartFromText("Hello")), newPartialEvent("bar"), newEvent(genai.NewPartFromText("bar")), newCompletedEvent(), }, }, { name: "[append=false, lastChunk=true] results in non-partial", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Hel"), newArtifactUpdate(aid1, updateFlags{append: false, lastChunk: true}, "Hello"), newArtifactUpdate(aid2, updateFlags{append: true}, "bar"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Hel"), newEvent(genai.NewPartFromText("Hello")), newPartialEvent("bar"), newEvent(genai.NewPartFromText("bar")), newCompletedEvent(), }, }, { name: "[append=false, lastChunk=true] as first event non-partial", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: false, lastChunk: true}, "Hello"), newArtifactUpdate(aid2, updateFlags{append: true}, "bar"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newEvent(genai.NewPartFromText("Hello")), newPartialEvent("bar"), newEvent(genai.NewPartFromText("bar")), newCompletedEvent(), }, }, { name: "[append=false, lastChunk=false] resets aggregation", events: []a2a.Event{ newArtifactUpdate(aid1, updateFlags{append: true}, "Foo"), newArtifactUpdate(aid1, updateFlags{append: false}, "Bar"), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ newPartialEvent("Foo"), newPartialEvent("Bar"), newEvent(genai.NewPartFromText("Bar")), newCompletedEvent(), }, }, { name: "thoughts aggregation", events: []a2a.Event{ a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{ Text: "thinking...", Metadata: map[string]any{adka2a.ToA2AMetaKey("thought"): true}, }), a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "done"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ {LLMResponse: model.LLMResponse{ Partial: true, Content: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: "thinking..."}}, Role: genai.RoleModel}, }}, newPartialEvent("done"), newEvent( &genai.Part{Thought: true, Text: "thinking..."}, &genai.Part{Text: "done"}, ), newCompletedEvent(), }, }, { name: "interleaved thought and text", events: []a2a.Event{ a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{ Text: "thinking1", Metadata: map[string]any{adka2a.ToA2AMetaKey("thought"): true}, }), a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "text1"}), a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{ Text: "thinking2", Metadata: map[string]any{adka2a.ToA2AMetaKey("thought"): true}, }), a2a.NewArtifactUpdateEvent(task, "a1", a2a.TextPart{Text: "text2"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantEvents: []*session.Event{ {LLMResponse: model.LLMResponse{ Partial: true, Content: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: "thinking1"}}, Role: genai.RoleModel}, }}, newPartialEvent("text1"), {LLMResponse: model.LLMResponse{ Partial: true, Content: &genai.Content{Parts: []*genai.Part{{Thought: true, Text: "thinking2"}}, Role: genai.RoleModel}, }}, newPartialEvent("text2"), newEvent( &genai.Part{Thought: true, Text: "thinking1"}, &genai.Part{Text: "text1"}, &genai.Part{Thought: true, Text: "thinking2"}, &genai.Part{Text: "text2"}, ), newCompletedEvent(), }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { agnt := utils.Must(agent.New(agent.Config{})) ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: agnt, }) p := newRunProcessor(A2AConfig{}, nil) var gotEvents []*session.Event for _, event := range tc.events { adkEvent, err := adka2a.ToSessionEvent(ctx, event) if err != nil { t.Fatalf("ToSessionEvent failed: %v", err) } if adkEvent == nil { // Handle Task snapshot resetting aggregation even if it doesn't produce an event if _, ok := event.(*a2a.Task); ok { p.aggregatePartial(ctx, event, nil) } continue } gotEvents = append(gotEvents, p.aggregatePartial(ctx, event, adkEvent)...) } opts := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID", "Author", "Branch", "CustomMetadata", "Actions"), } if diff := cmp.Diff(tc.wantEvents, gotEvents, opts...); diff != "" { t.Errorf("mismatch (-want +got):\n%s", diff) } }) } } ================================================ FILE: agent/remoteagent/a2a_agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "context" "encoding/json" "errors" "fmt" "iter" "net/http" "net/http/httptest" "strings" "testing" "time" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2asrv" "github.com/a2aproject/a2a-go/a2asrv/eventqueue" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) type mockA2AExecutor struct { executeFn func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error cancelFn func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error cleanupFn func(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) } var _ a2asrv.AgentExecutor = (*mockA2AExecutor)(nil) func (e *mockA2AExecutor) Execute(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { if e.executeFn != nil { return e.executeFn(ctx, reqCtx, queue) } return fmt.Errorf("not implemented") } func (e *mockA2AExecutor) Cancel(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { if e.cancelFn != nil { return e.cancelFn(ctx, reqCtx, queue) } ev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil) ev.Final = true return queue.Write(ctx, ev) } func (e *mockA2AExecutor) Cleanup(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) { if e.cleanupFn != nil { e.cleanupFn(ctx, reqCtx, result, cause) } } type testA2AServer struct { *httptest.Server handler a2asrv.RequestHandler } func startA2AServer(agentExecutor a2asrv.AgentExecutor) *testA2AServer { requestHandler := a2asrv.NewHandler(agentExecutor) return &testA2AServer{ Server: httptest.NewServer(a2asrv.NewJSONRPCHandler(requestHandler)), handler: requestHandler, } } func newA2ARemoteAgent(t *testing.T, name string, server *testA2AServer) agent.Agent { t.Helper() card := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}} return utils.Must(NewA2A(A2AConfig{AgentCard: card, Name: name})) } func newInvocationContext(t *testing.T, events []*session.Event) agent.InvocationContext { return newInvocationContextWithStreamingMode(t, events, agent.StreamingModeSSE) } func prepareSession(t *testing.T, ctx context.Context, events []*session.Event) session.Session { t.Helper() service := session.InMemoryService() resp, err := service.Create(ctx, &session.CreateRequest{AppName: t.Name(), UserID: "test"}) if err != nil { t.Fatalf("sessionService.Create() error = %v", err) } for _, event := range events { if err := service.AppendEvent(ctx, resp.Session, event); err != nil { t.Fatalf("sessionService.AppendEvent() error = %v", err) } } return resp.Session } func newInvocationContextWithStreamingMode(t *testing.T, events []*session.Event, streamingMode agent.StreamingMode) agent.InvocationContext { t.Helper() ctx := t.Context() session := prepareSession(t, ctx, events) ic := icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{ Session: session, RunConfig: &agent.RunConfig{ StreamingMode: streamingMode, }, }) return ic } func runAndCollect(ic agent.InvocationContext, agnt agent.Agent) ([]*session.Event, error) { var collected []*session.Event for ev, err := range agnt.Run(ic) { if err != nil { return collected, err } collected = append(collected, ev) } return collected, nil } func toLLMResponses(events []*session.Event) []model.LLMResponse { var result []model.LLMResponse for _, v := range events { result = append(result, v.LLMResponse) } return result } func newADKEventReplay(t *testing.T, name string, events []*session.Event) agent.Agent { t.Helper() agnt, err := agent.New(agent.Config{ Name: name, Run: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { for _, ev := range events { ev.InvocationID = ic.InvocationID() ev.Branch = ic.Branch() ev.Author = name if !yield(ev, nil) { return } } } }, }) if err != nil { t.Fatalf("agent.New() error = %v", err) } return agnt } func newA2AEventReplay(t *testing.T, events []a2a.Event) a2asrv.AgentExecutor { return &mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { for _, ev := range events { // A2A stack is going to fail the request if events don't have correct taskID and contextID switch v := ev.(type) { case *a2a.Message: v.TaskID = reqCtx.TaskID v.ContextID = reqCtx.ContextID case *a2a.Task: v.ID = reqCtx.TaskID v.ContextID = reqCtx.ContextID case *a2a.TaskStatusUpdateEvent: v.TaskID = reqCtx.TaskID v.ContextID = reqCtx.ContextID case *a2a.TaskArtifactUpdateEvent: v.TaskID = reqCtx.TaskID v.ContextID = reqCtx.ContextID } if err := queue.Write(ctx, ev); err != nil { t.Errorf("queue.Write() error = %v", err) } } return nil }, } } func newUserHello() *session.Event { event := session.NewEvent("invocation") event.Author = "user" event.Content = genai.NewContentFromText("hello", genai.RoleUser) return event } func newFinalStatusUpdate(task *a2a.Task, state a2a.TaskState, msgParts ...a2a.Part) *a2a.TaskStatusUpdateEvent { event := a2a.NewStatusUpdateEvent(task, state, nil) if len(msgParts) > 0 { event.Status.Message = a2a.NewMessageForTask(a2a.MessageRoleAgent, task, msgParts...) } event.Final = true return event } func TestRemoteAgent_ADK2ADK(t *testing.T) { testCases := []struct { name string remoteEvents []*session.Event wantResponses []model.LLMResponse wantEscalate bool wantTransfer string noStreaming bool }{ { name: "text streaming", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello ", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("world", genai.RoleModel), Partial: true, TurnComplete: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello world", genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("hello ", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("world", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("hello world", genai.RoleModel)}, {TurnComplete: true}, }, }, { name: "text streaming - no streaming mode", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello world", genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("hello world", genai.RoleModel), TurnComplete: true}, }, noStreaming: true, }, { name: "code execution", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromExecutableCode("print('hello')", genai.LanguagePython, genai.RoleModel)}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromCodeExecutionResult(genai.OutcomeOK, "hello", genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromExecutableCode("print('hello')", genai.LanguagePython, genai.RoleModel)}, {Content: genai.NewContentFromCodeExecutionResult(genai.OutcomeOK, "hello", genai.RoleModel)}, {TurnComplete: true}, }, }, { name: "function calls", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromFunctionCall("get_weather", map[string]any{"city": "Warsaw"}, genai.RoleModel)}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromFunctionResponse("get_weather", map[string]any{"temo": "1C"}, genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromFunctionCall("get_weather", map[string]any{"city": "Warsaw"}, genai.RoleModel)}, {Content: genai.NewContentFromFunctionResponse("get_weather", map[string]any{"temo": "1C"}, genai.RoleModel)}, {TurnComplete: true}, }, }, { name: "files", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromBytes([]byte("hello"), "text", genai.RoleModel)}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromURI("http://text.com/text.txt", "text", genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromBytes([]byte("hello"), "text", genai.RoleModel)}, {Content: genai.NewContentFromURI("http://text.com/text.txt", "text", genai.RoleModel)}, {TurnComplete: true}, }, }, { name: "escalation", remoteEvents: []*session.Event{ { LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("stop", genai.RoleModel)}, Actions: session.EventActions{Escalate: true}, }, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("stop", genai.RoleModel)}, {TurnComplete: true}, }, wantEscalate: true, }, { name: "transfer", remoteEvents: []*session.Event{ { LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("stop", genai.RoleModel)}, Actions: session.EventActions{TransferToAgent: "a-2"}, }, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("stop", genai.RoleModel)}, {TurnComplete: true}, }, wantTransfer: "a-2", }, { name: "long-running function call", remoteEvents: []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Hello!", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(" I'll need your approval first:", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Hello! I'll need your approval first:", genai.RoleModel)}}, { LLMResponse: model.LLMResponse{Content: genai.NewContentFromParts( []*genai.Part{{FunctionCall: &genai.FunctionCall{Name: "create_ticket", ID: "abc-123"}}}, genai.RoleModel, )}, LongRunningToolIDs: []string{"abc-123"}, }, { LLMResponse: model.LLMResponse{Content: genai.NewContentFromParts( []*genai.Part{{FunctionResponse: &genai.FunctionResponse{ Name: "create_ticket", ID: "abc-123", Response: map[string]any{"ticket_id": "123"}, }}}, genai.RoleModel, )}, LongRunningToolIDs: []string{"abc-123"}, }, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Waiting for the approval to continue.", genai.RoleModel)}}, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("Hello!", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText(" I'll need your approval first:", genai.RoleModel), Partial: true}, // Aggregated partial responses are emitted before a long-running function call {Content: genai.NewContentFromText("Hello! I'll need your approval first:", genai.RoleModel)}, {Content: genai.NewContentFromText("Waiting for the approval to continue.", genai.RoleModel)}, { Content: genai.NewContentFromParts( []*genai.Part{ {FunctionCall: &genai.FunctionCall{Name: "create_ticket", ID: "abc-123"}}, {FunctionResponse: &genai.FunctionResponse{Name: "create_ticket", ID: "abc-123", Response: map[string]any{"ticket_id": "123"}}}, }, genai.RoleModel, ), TurnComplete: true, }, }, }, { name: "metadata", remoteEvents: []*session.Event{ { LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), CitationMetadata: &genai.CitationMetadata{Citations: []*genai.Citation{{Title: "Title1"}, {Title: "Title2"}}}, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, CustomMetadata: map[string]any{"nested": map[string]any{"key": "value"}}, }, }, }, wantResponses: []model.LLMResponse{ { Content: genai.NewContentFromText("hello", genai.RoleModel), CitationMetadata: &genai.CitationMetadata{Citations: []*genai.Citation{{Title: "Title1"}, {Title: "Title2"}}}, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, CustomMetadata: map[string]any{"nested": map[string]any{"key": "value"}}, }, {TurnComplete: true}, }, }, } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(model.LLMResponse{}, "CustomMetadata"), } for _, outputMode := range []adka2a.OutputMode{adka2a.OutputArtifactPerRun, adka2a.OutputArtifactPerEvent} { for _, tc := range testCases { t.Run(tc.name+" "+string(outputMode), func(t *testing.T) { executor := adka2a.NewExecutor(adka2a.ExecutorConfig{ OutputMode: outputMode, RunnerConfig: runner.Config{ AppName: "RemoteAgentTest", SessionService: session.InMemoryService(), Agent: newADKEventReplay(t, "root", tc.remoteEvents), }, }) remoteAgent := newA2ARemoteAgent(t, "a2a", startA2AServer(executor)) mode := agent.StreamingModeSSE if tc.noStreaming { mode = agent.StreamingModeNone } ictx := newInvocationContextWithStreamingMode(t, []*session.Event{newUserHello()}, mode) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("agent.Run() error = %v", err) } gotResponses := toLLMResponses(gotEvents) if diff := cmp.Diff(tc.wantResponses, gotResponses, ignoreFields...); diff != "" { t.Fatalf("agent.Run() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotResponses, tc.wantResponses, diff) } var lastActions *session.EventActions for i, event := range gotEvents { if _, ok := event.CustomMetadata[adka2a.ToADKMetaKey("response")]; !ok { if aggregated, _ := event.CustomMetadata[adka2a.ToADKMetaKey("aggregated")].(bool); !aggregated { t.Fatalf("event.CustomMetadata = %v, want meta[%q] = original event or meta[%q] = true", event.CustomMetadata, adka2a.ToADKMetaKey("response"), adka2a.ToADKMetaKey("aggregated")) } } wantRequest := i == len(gotEvents)-1 if _, ok := event.CustomMetadata[adka2a.ToADKMetaKey("request")]; ok != wantRequest { t.Fatalf("event.CustomMetadata = %v, want request = %v", event.CustomMetadata, wantRequest) } lastActions = &event.Actions } if tc.wantEscalate != lastActions.Escalate { t.Fatalf("lastActions.Escalate = %v, want %v", lastActions.Escalate, tc.wantEscalate) } if tc.wantTransfer != lastActions.TransferToAgent { t.Fatalf("lastActions.TransferToAgent = %v, want %v", lastActions.TransferToAgent, tc.wantTransfer) } }) } } } func TestRemoteAgent_ADK2A2A(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} artifactEvent := a2a.NewArtifactEvent(task) testCases := []struct { name string remoteEvents []a2a.Event wantResponses []model.LLMResponse }{ { name: "empty message", remoteEvents: []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent)}, wantResponses: []model.LLMResponse{{TurnComplete: true}}, }, { name: "message", remoteEvents: []a2a.Event{ a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "hello"}, a2a.TextPart{Text: "world"}), }, wantResponses: []model.LLMResponse{ { TurnComplete: true, Content: &genai.Content{ Parts: []*genai.Part{genai.NewPartFromText("hello"), genai.NewPartFromText("world")}, Role: genai.RoleModel, }, }, }, }, { name: "empty task", remoteEvents: []a2a.Event{ &a2a.Task{Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}}, }, wantResponses: []model.LLMResponse{{TurnComplete: true}}, }, { name: "task with status message", remoteEvents: []a2a.Event{ &a2a.Task{Status: a2a.TaskStatus{ State: a2a.TaskStateCompleted, Message: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "hello"}), }}, }, wantResponses: []model.LLMResponse{{ TurnComplete: true, Content: genai.NewContentFromText("hello", genai.RoleModel), }}, }, { name: "task with multipart artifact", remoteEvents: []a2a.Event{ &a2a.Task{ Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, Artifacts: []*a2a.Artifact{ {Parts: a2a.ContentParts{a2a.TextPart{Text: "hello"}, a2a.TextPart{Text: "world"}}}, }, }, }, wantResponses: []model.LLMResponse{ { TurnComplete: true, Content: &genai.Content{ Parts: []*genai.Part{genai.NewPartFromText("hello"), genai.NewPartFromText("world")}, Role: genai.RoleModel, }, }, }, }, { name: "multiple tasks", remoteEvents: []a2a.Event{ &a2a.Task{Status: a2a.TaskStatus{ State: a2a.TaskStateWorking, Message: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "hello"}), }}, &a2a.Task{ Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, Artifacts: []*a2a.Artifact{ {Parts: a2a.ContentParts{a2a.TextPart{Text: "world"}}}, }, }, }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("hello", genai.RoleModel)}, {Content: genai.NewContentFromText("world", genai.RoleModel), TurnComplete: true}, }, }, { name: "task with multiple artifacts", remoteEvents: []a2a.Event{ &a2a.Task{ Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, Artifacts: []*a2a.Artifact{ {Parts: a2a.ContentParts{a2a.TextPart{Text: "hello"}}}, {Parts: a2a.ContentParts{a2a.TextPart{Text: "world"}}}, }, }, }, wantResponses: []model.LLMResponse{ { TurnComplete: true, Content: &genai.Content{ Parts: []*genai.Part{genai.NewPartFromText("hello"), genai.NewPartFromText("world")}, Role: genai.RoleModel, }, }, }, }, { name: "artifact parts translation", remoteEvents: []a2a.Event{ artifactEvent, a2a.NewArtifactUpdateEvent(task, artifactEvent.Artifact.ID, a2a.TextPart{Text: "hello"}), a2a.NewArtifactUpdateEvent(task, artifactEvent.Artifact.ID, a2a.TextPart{Text: "world"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("hello", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("world", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("helloworld", genai.RoleModel)}, {TurnComplete: true}, }, }, { name: "non-final status update messages as thoughts", remoteEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateSubmitted, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "submitted...\n"})), a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "working...\n"})), newFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.TextPart{Text: "completed!"}), }, wantResponses: []model.LLMResponse{ {Content: &genai.Content{Parts: []*genai.Part{{Text: "submitted...\n", Thought: true}}, Role: genai.RoleModel}, Partial: true}, {Content: &genai.Content{Parts: []*genai.Part{{Text: "working...\n", Thought: true}}, Role: genai.RoleModel}, Partial: true}, {Content: genai.NewContentFromText("completed!", genai.RoleModel), TurnComplete: true}, }, }, { name: "empty non-final status updates ignored", remoteEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateSubmitted, nil), a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), newFinalStatusUpdate(task, a2a.TaskStateCompleted), }, wantResponses: []model.LLMResponse{ {TurnComplete: true}, }, }, { name: "partial and non-partial event aggregation", remoteEvents: []a2a.Event{ artifactEvent, &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: "1"}}}, Append: true, }, &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: "2"}}}, Append: true, }, &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: "3"}}}, Append: false, }, &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ID: artifactEvent.Artifact.ID, Parts: a2a.ContentParts{a2a.TextPart{Text: "4"}}}, Append: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.TextPart{Text: "5"}), }, wantResponses: []model.LLMResponse{ {Content: genai.NewContentFromText("1", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("2", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("3", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("4", genai.RoleModel), Partial: true}, {Content: genai.NewContentFromText("34", genai.RoleModel)}, {Content: genai.NewContentFromText("5", genai.RoleModel), TurnComplete: true}, }, }, } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(model.LLMResponse{}, "CustomMetadata"), } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { executor := newA2AEventReplay(t, tc.remoteEvents) remoteAgent := newA2ARemoteAgent(t, "a2a", startA2AServer(executor)) ictx := newInvocationContext(t, []*session.Event{newUserHello()}) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("agent.Run() error = %v", err) } gotResponses := toLLMResponses(gotEvents) if diff := cmp.Diff(tc.wantResponses, gotResponses, ignoreFields...); diff != "" { t.Fatalf("agent.Run() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotResponses, tc.wantResponses, diff) } for i, event := range gotEvents { if _, ok := event.CustomMetadata[adka2a.ToADKMetaKey("response")]; !ok { if aggregated, _ := event.CustomMetadata[adka2a.ToADKMetaKey("aggregated")].(bool); !aggregated { t.Fatalf("event.CustomMetadata = %v, want meta[%q] = original event or meta[%q] = true", event.CustomMetadata, adka2a.ToADKMetaKey("response"), adka2a.ToADKMetaKey("aggregated")) } } wantOriginalRequest := len(gotEvents)-1 == i if _, ok := event.CustomMetadata[adka2a.ToADKMetaKey("request")]; ok != wantOriginalRequest { t.Fatalf("event.CustomMetadata = %v, want original request = %v", event.CustomMetadata, wantOriginalRequest) } } }) } } func TestRemoteAgent_RequestCallbacks(t *testing.T) { testCases := []struct { name string sessionEvents []*session.Event events func(*a2asrv.RequestContext) []a2a.Event before []BeforeA2ARequestCallback after []AfterA2ARequestCallback converter A2AEventConverter wantResponses []model.LLMResponse wantErr error }{ { name: "request and response modification", events: func(rc *a2asrv.RequestContext) []a2a.Event { return []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "foo"})} }, before: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { req.Metadata = map[string]any{"counter": 1} return nil, nil }, }, after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { result.Content = genai.NewContentFromText(result.Content.Parts[0].Text+"bar", genai.RoleModel) result.CustomMetadata = req.Metadata return nil, nil }, }, wantResponses: []model.LLMResponse{ { Content: genai.NewContentFromText("foobar", genai.RoleModel), CustomMetadata: map[string]any{"counter": 1}, TurnComplete: true, }, }, }, { name: "after invoked for every event", events: func(rc *a2asrv.RequestContext) []a2a.Event { artifactEvent := a2a.NewArtifactEvent(rc, a2a.TextPart{Text: "Hello"}) finalEvent := a2a.NewStatusUpdateEvent(rc, a2a.TaskStateCompleted, nil) finalEvent.Final = true return []a2a.Event{ artifactEvent, a2a.NewArtifactUpdateEvent(rc, artifactEvent.Artifact.ID, a2a.TextPart{Text: ", world!"}), finalEvent, } }, after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { result.CustomMetadata = map[string]any{"foo": "bar"} return nil, nil }, }, wantResponses: []model.LLMResponse{ { Partial: true, Content: genai.NewContentFromText("Hello", genai.RoleModel), CustomMetadata: map[string]any{"foo": "bar"}, }, { Partial: true, Content: genai.NewContentFromText(", world!", genai.RoleModel), CustomMetadata: map[string]any{"foo": "bar"}, }, { Content: genai.NewContentFromText("Hello, world!", genai.RoleModel), CustomMetadata: map[string]any{"foo": "bar"}, }, { TurnComplete: true, CustomMetadata: map[string]any{"foo": "bar"}, }, }, }, { name: "after error stops the run", events: func(rc *a2asrv.RequestContext) []a2a.Event { finalEvent := a2a.NewStatusUpdateEvent(rc, a2a.TaskStateCompleted, nil) finalEvent.Final = true return []a2a.Event{ a2a.NewArtifactEvent(rc, a2a.TextPart{Text: "Hello"}), finalEvent, } }, after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("rejected") }, }, wantErr: fmt.Errorf("rejected"), }, { name: "request overwrite with response", before: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { return &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, nil }, }, wantResponses: []model.LLMResponse{{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, }, { name: "request overwrite with error", before: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { return nil, fmt.Errorf("failed") }, }, wantErr: fmt.Errorf("failed"), }, { name: "response overwrite", after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { return &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, nil }, }, wantResponses: []model.LLMResponse{{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, }, { name: "response overwrite with error", after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("failed") }, }, wantErr: fmt.Errorf("failed"), }, { name: "before interceptor short-circuit", before: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { return nil, fmt.Errorf("failed") }, func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { t.Fatalf("not called") return nil, nil }, }, wantErr: fmt.Errorf("failed"), }, { name: "after interceptor short-circuit", after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("failed") }, func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { t.Fatalf("not called") return nil, nil }, }, wantErr: fmt.Errorf("failed"), }, { name: "after interceptor for empty session", sessionEvents: []*session.Event{}, after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { if len(req.Message.Parts) != 0 { t.Fatalf("got %d parts, expected empty message", len(req.Message.Parts)) } return nil, fmt.Errorf("empty session") }, }, wantErr: fmt.Errorf("empty session"), }, { name: "converter error", converter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("failed") }, wantErr: fmt.Errorf("failed"), }, { name: "converter custom response", converter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) { return &session.Event{LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, nil }, wantResponses: []model.LLMResponse{{Content: genai.NewContentFromText("hello", genai.RoleModel)}}, }, { name: "after interceptor invoked with before result", before: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { return nil, fmt.Errorf("before error") }, }, after: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, result *session.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("after error") }, }, wantErr: fmt.Errorf("after error"), }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { executor := &mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { if tc.events != nil { for _, event := range tc.events(reqCtx) { if err := queue.Write(ctx, event); err != nil { return err } } return nil } return queue.Write(ctx, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "Hi!"})) }, } server := startA2AServer(executor) card := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}} remoteAgent, err := NewA2A(A2AConfig{ Name: "a2a", AgentCard: card, BeforeRequestCallbacks: tc.before, AfterRequestCallbacks: tc.after, Converter: tc.converter, }) if err != nil { t.Fatalf("remoteagent.NewA2A() error = %v", err) } sessionEvents := []*session.Event{newUserHello()} if tc.sessionEvents != nil { sessionEvents = tc.sessionEvents } ictx := newInvocationContext(t, sessionEvents) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil && tc.wantErr == nil { t.Fatalf("agent.Run() error = %v, want nil", err) } if err == nil && tc.wantErr != nil { t.Fatalf("agent.Run() error = nil, want %v", tc.wantErr) } gotResponses := toLLMResponses(gotEvents) if diff := cmp.Diff(tc.wantResponses, gotResponses); diff != "" { t.Fatalf("agent.Run() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotResponses, tc.wantResponses, diff) } }) } } func TestRemoteAgent_RequestPayload(t *testing.T) { remoteAgentName, notRemoteAgentName := "a2a", "not-a2a" testCases := []struct { name string sessionEvents []*session.Event wantRequest *a2a.MessageSendParams }{ { name: "only user message", sessionEvents: []*session.Event{newUserHello()}, wantRequest: &a2a.MessageSendParams{ Message: &a2a.Message{ Role: a2a.MessageRoleUser, Parts: []a2a.Part{a2a.TextPart{Text: "hello"}}, }, }, }, { name: "history included", sessionEvents: []*session.Event{ newUserHello(), { Author: notRemoteAgentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hi", genai.RoleModel), }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("how are you?", genai.RoleUser), }, }, }, wantRequest: &a2a.MessageSendParams{ Message: &a2a.Message{ Role: a2a.MessageRoleUser, Parts: []a2a.Part{ a2a.TextPart{Text: "hello"}, a2a.TextPart{Text: "For context:"}, a2a.TextPart{Text: fmt.Sprintf("[%s] said: hi", notRemoteAgentName)}, a2a.TextPart{Text: "how are you?"}, }, }, }, }, { name: "history split by remote agent response", sessionEvents: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("msg1", genai.RoleUser)}}, {Author: notRemoteAgentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("resp1", genai.RoleModel)}}, { Author: remoteAgentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("resp2", genai.RoleModel), CustomMetadata: adka2a.ToCustomMetadata("", "ctx-123"), }, }, // only data from this point should be included, because other parts should already be present // in the remote agent's session {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("msg3", genai.RoleUser)}}, {Author: notRemoteAgentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("resp3", genai.RoleModel)}}, }, wantRequest: &a2a.MessageSendParams{ Message: &a2a.Message{ Role: a2a.MessageRoleUser, ContextID: "ctx-123", Parts: []a2a.Part{ a2a.TextPart{Text: "msg3"}, a2a.TextPart{Text: "For context:"}, a2a.TextPart{Text: fmt.Sprintf("[%s] said: resp3", notRemoteAgentName)}, }, }, }, }, { name: "function call response", sessionEvents: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("start", genai.RoleUser)}}, { Author: remoteAgentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ {FunctionCall: &genai.FunctionCall{Name: "fn", ID: "call-1"}}, }, genai.RoleModel), CustomMetadata: adka2a.ToCustomMetadata("task-1", "ctx-1"), }, LongRunningToolIDs: []string{"call-1"}, }, { Author: remoteAgentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ {FunctionResponse: &genai.FunctionResponse{Name: "fn", ID: "call-1", Response: map[string]any{"status": "pending"}}}, genai.NewPartFromText("I'll need to wait for an approval first"), }, genai.RoleModel), }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ genai.NewPartFromText("lgtm:"), {FunctionResponse: &genai.FunctionResponse{Name: "fn", ID: "call-1", Response: map[string]any{"status": "approved"}}}, }, genai.RoleUser), }, }, }, wantRequest: &a2a.MessageSendParams{ Message: &a2a.Message{ Role: a2a.MessageRoleUser, TaskID: "task-1", ContextID: "ctx-1", Parts: []a2a.Part{ a2a.TextPart{Text: "lgtm:"}, a2a.DataPart{ Data: map[string]any{ "id": "call-1", "name": "fn", "response": map[string]any{"status": "approved"}, }, Metadata: map[string]any{"adk_type": "function_response"}, }, }, }, }, }, } server := startA2AServer(newA2AEventReplay(t, []a2a.Event{})) card := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}} for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Parallel() errRejected := errors.New("rejected") var gotRequest *a2a.MessageSendParams remoteAgent, err := NewA2A(A2AConfig{ Name: remoteAgentName, AgentCard: card, BeforeRequestCallbacks: []BeforeA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams) (*session.Event, error) { gotRequest = req return nil, errRejected }, }, }) if err != nil { t.Fatalf("remoteagent.NewA2A() error = %v", err) } ictx := newInvocationContext(t, tc.sessionEvents) if _, err := runAndCollect(ictx, remoteAgent); !errors.Is(err, errRejected) { t.Fatalf("agent.Run() error = %v, want %v", err, errRejected) } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(a2a.Message{}, "ID"), } if diff := cmp.Diff(tc.wantRequest, gotRequest, ignoreFields...); diff != "" { t.Fatalf("agent.Run() sent unexpected request (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotRequest, tc.wantRequest, diff) } }) } } func TestRemoteAgent_EmptyResultForEmptySession(t *testing.T) { ictx := newInvocationContext(t, []*session.Event{}) executor := newA2AEventReplay(t, []a2a.Event{ a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "will not be invoked, because input is empty"}), }) agentName := "a2a agent" remoteAgent := newA2ARemoteAgent(t, agentName, startA2AServer(executor)) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("runAndCollect() error = %v", err) } wantEvents := []*session.Event{ { InvocationID: ictx.InvocationID(), Author: agentName, Branch: ictx.Branch(), Actions: session.EventActions{StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}}, }, } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID"), cmpopts.IgnoreFields(session.Event{}, "Timestamp"), } if diff := cmp.Diff(wantEvents, gotEvents, ignoreFields...); diff != "" { t.Fatalf("agent.Run() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotEvents, wantEvents, diff) } } func TestRemoteAgent_ResolvesAgentCard(t *testing.T) { remoteEvents := []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "Hello!"})} wantResponses := []model.LLMResponse{{Content: genai.NewContentFromText("Hello!", genai.RoleModel), TurnComplete: true}} executor := newA2AEventReplay(t, remoteEvents) handler := a2asrv.NewHandler(executor) var cardServer *httptest.Server mux := http.NewServeMux() mux.Handle("/invoke", a2asrv.NewJSONRPCHandler(handler)) mux.HandleFunc("/.well-known/agent-card.json", func(w http.ResponseWriter, r *http.Request) { url := fmt.Sprintf("%s/invoke", cardServer.URL) card := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: url, Capabilities: a2a.AgentCapabilities{Streaming: true}} if err := json.NewEncoder(w).Encode(card); err != nil { t.Errorf("json.Encode(agentCard) error = %v", err) } }) cardServer = httptest.NewServer(mux) remoteAgent, err := NewA2A(A2AConfig{Name: "a2a", AgentCardSource: cardServer.URL}) if err != nil { t.Fatalf("remoteagent.NewA2A() error = %v", err) } ictx := newInvocationContext(t, []*session.Event{newUserHello()}) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("agent.Run() error = %v", err) } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(model.LLMResponse{}, "CustomMetadata"), } gotResponses := toLLMResponses(gotEvents) if diff := cmp.Diff(wantResponses, gotResponses, ignoreFields...); diff != "" { t.Fatalf("agent.Run() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %s", gotResponses, wantResponses, diff) } } func TestRemoteAgent_ErrorEventIfNoCompatibleTransport(t *testing.T) { remoteEvents := []a2a.Event{a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "will not be invoked!"})} executor := newA2AEventReplay(t, remoteEvents) server := startA2AServer(executor) remoteAgent, err := NewA2A(A2AConfig{ Name: "a2a", ClientFactory: a2aclient.NewFactory(a2aclient.WithDefaultsDisabled()), AgentCard: &a2a.AgentCard{ PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, }, }) if err != nil { t.Fatalf("remoteagent.NewA2A() error = %v", err) } ictx := newInvocationContext(t, []*session.Event{newUserHello()}) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("agent.Run() error = %v", err) } if len(gotEvents) != 1 { t.Fatalf("len(events) = %d, want 1", len(gotEvents)) } if !strings.Contains(gotEvents[0].ErrorMessage, "no compatible transports found") { t.Fatalf("event.ErrorMessage = %s, want to contain %q", gotEvents[0].ErrorMessage, "no compatible transports found") } } func TestRemoteAgent_ErrorEventOnServerError(t *testing.T) { executorErr := fmt.Errorf("mockExecutor failed") executor := &mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, q eventqueue.Queue) error { return executorErr }, } remoteAgent := newA2ARemoteAgent(t, "a2a agent", startA2AServer(executor)) ictx := newInvocationContext(t, []*session.Event{newUserHello()}) gotEvents, err := runAndCollect(ictx, remoteAgent) if err != nil { t.Fatalf("agent.Run() error = %v", err) } if len(gotEvents) != 1 { t.Fatalf("len(events) = %d, want 1", len(gotEvents)) } if gotEvents[0].ErrorMessage == "" { t.Fatal("event.ErrorMessage empty, want non-empty") } } func TestRemoteAgent_CustomConverters(t *testing.T) { originalA2APart := a2a.TextPart{Text: "hello"} customA2APart := a2a.TextPart{Text: "modified"} mockGenAIPartConverter := func(ctx context.Context, event *session.Event, part *genai.Part) (a2a.Part, error) { return customA2APart, nil } tests := []struct { name string cfg A2AConfig want a2a.Part }{ { name: "custom converter", cfg: A2AConfig{GenAIPartConverter: mockGenAIPartConverter}, want: customA2APart, }, { name: "default converter", want: originalA2APart, }, } for _, tc := range tests { events := []*session.Event{newUserHello()} ictx := newTestInvocationContext(t, "a2a agent", events...) msg, err := newMessage(ictx, tc.cfg) if err != nil { t.Fatalf("newMessage() error = %v", err) } if len(msg.Parts) != 1 { t.Fatalf("len(msg.Parts) = %d, want 1", len(msg.Parts)) } if textPart, ok := msg.Parts[0].(a2a.TextPart); !ok || textPart.Text != tc.want.(a2a.TextPart).Text { t.Fatalf("msg.Parts[0] = %+v, want %+v", msg.Parts[0], tc.want) } } } func TestRemoteAgent_CleanupCallback(t *testing.T) { testCases := []struct { name string events func(*a2asrv.RequestContext) []a2a.Event afterRequestCallbacks []AfterA2ARequestCallback eventConverter A2AEventConverter breakAfter int cancelContextAfter int wantCause string }{ { name: "after request callback error", afterRequestCallbacks: []AfterA2ARequestCallback{ func(ctx agent.CallbackContext, req *a2a.MessageSendParams, resp *session.Event, err error) (*session.Event, error) { return nil, fmt.Errorf("callback error") }, }, wantCause: "callback error", }, { name: "part converter error", eventConverter: func(ctx agent.InvocationContext, req *a2a.MessageSendParams, event a2a.Event, err error) (*session.Event, error) { if _, ok := event.(*a2a.TaskArtifactUpdateEvent); ok { return nil, fmt.Errorf("converter error") } return adka2a.ToSessionEvent(ctx, event) }, wantCause: "converter error", }, { name: "agent run context canceled", cancelContextAfter: 1, wantCause: "context canceled", }, { name: "yield returns false", breakAfter: 1, wantCause: "", }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { var ( cleanupCalled bool cleanupTaskID a2a.TaskID cleanupCause error ) cleanupCallback := func(ctx context.Context, card *a2a.AgentCard, client *a2aclient.Client, task a2a.TaskInfo, cause error) { cleanupCalled = true cleanupTaskID = task.TaskID cleanupCause = cause if _, err := client.CancelTask(ctx, &a2a.TaskIDParams{ID: task.TaskID}); err != nil { t.Errorf("client.CancelTask() error = %v", err) } } remoteTaskIDChan := make(chan a2a.TaskID, 1) executor := &mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { remoteTaskIDChan <- reqCtx.TaskID if err := queue.Write(ctx, a2a.NewSubmittedTask(reqCtx, reqCtx.Message)); err != nil { return err } for ctx.Err() == nil { data := a2a.DataPart{Data: map[string]any{"foo": "bar"}} if err := queue.Write(ctx, a2a.NewArtifactEvent(reqCtx, data)); err != nil { return err } time.Sleep(1 * time.Millisecond) } finalUpdate := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCompleted, nil) finalUpdate.Final = true return queue.Write(ctx, finalUpdate) }, } server := startA2AServer(executor) defer server.Close() card := &a2a.AgentCard{PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}} remoteAgent, err := NewA2A(A2AConfig{ Name: "a2a", AgentCard: card, RemoteTaskCleanupCallback: cleanupCallback, Converter: tc.eventConverter, AfterRequestCallbacks: tc.afterRequestCallbacks, }) if err != nil { t.Fatalf("NewA2A() error = %v", err) } ictxCtx, cancel := context.WithCancel(t.Context()) defer cancel() session := prepareSession(t, ictxCtx, []*session.Event{newUserHello()}) ictx := icontext.NewInvocationContext(ictxCtx, icontext.InvocationContextParams{ Session: session, RunConfig: &agent.RunConfig{StreamingMode: agent.StreamingModeSSE}, }) count := 0 for _, err := range remoteAgent.Run(ictx) { if err != nil { break } count++ if tc.cancelContextAfter > 0 && count >= tc.cancelContextAfter { cancel() } if tc.breakAfter > 0 && count >= tc.breakAfter { break } } expectedTaskID := <-remoteTaskIDChan if !cleanupCalled { t.Fatal("RemoteTaskCleanupCallback was not called") } if cleanupTaskID != expectedTaskID { t.Fatalf("cleanupTaskID = %v, want %v", cleanupTaskID, expectedTaskID) } if tc.wantCause != "" { if cleanupCause == nil { if tc.wantCause != "" { t.Fatalf("cleanupCause is nil, want to contain %q", tc.wantCause) } } else if !strings.Contains(cleanupCause.Error(), tc.wantCause) { t.Fatalf("cleanupCause = %v, want to contain %q", cleanupCause, tc.wantCause) } } client := newA2AClient(t, server) task, err := client.GetTask(t.Context(), &a2a.TaskQueryParams{ID: expectedTaskID}) if err != nil { t.Fatalf("client.CancelTask() error = %v", err) } if task.Status.State != a2a.TaskStateCanceled { t.Fatalf("task.Status.State = %q, want %q", task.Status.State, a2a.TaskStateCanceled) } }) } } func TestRemoteAgent_PartConverter(t *testing.T) { event := &session.Event{ LLMResponse: model.LLMResponse{Content: genai.NewContentFromParts([]*genai.Part{ {Text: "KEEP"}, {Text: "DROP"}, }, genai.RoleModel)}, } cfg := A2AConfig{ GenAIPartConverter: func(ctx context.Context, event *session.Event, p *genai.Part) (a2a.Part, error) { if p.Text == "DROP" { return nil, nil } return a2a.TextPart{Text: p.Text}, nil }, } ictx := newTestInvocationContext(t, "test-agent", newUserHello()) parts, err := convertParts(ictx, cfg, event) if err != nil { t.Fatalf("convertParts() error = %v", err) } if len(parts) != 1 { t.Errorf("Expected 1 part after filtering, got %d", len(parts)) } for _, p := range parts { if p == nil { t.Fatalf("got nil part, want it filtered out.") } if tp, ok := p.(a2a.TextPart); ok && tp.Text != "KEEP" { t.Errorf("got %s, want 'KEEP'", tp.Text) } } } ================================================ FILE: agent/remoteagent/a2a_e2e_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent //go:generate go test -httprecord=.* import ( "context" "encoding/json" "errors" "fmt" "io" "iter" "net/http" "path/filepath" "strings" "testing" "time" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2asrv" "github.com/a2aproject/a2a-go/a2asrv/eventqueue" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/internal/converters" "google.golang.org/adk/internal/httprr" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) const ( approvalToolName = "request_approval" modelTextRequiresApproval = "need to request approval first!" modelTextWaitingForApproval = "waiting for user's approval..." modelTextTaskComplete = "Task complete!" transferToolName = "transfer_to_agent" modelTextRootTransfer = "transfering... please hold... beepboop..." ) type approvalStatus string var ( approvalStatusPending approvalStatus = "pending" approvalStatusApproved approvalStatus = "approved" approvalStatusVerified approvalStatus = "verified" ) type approval struct { Status approvalStatus `json:"status"` TicketID string `json:"ticket_id"` } /** * a2aclient -> a2aserver -> adka2a.Executor -> llmagent with a long running tool */ func TestA2AInputRequired(t *testing.T) { testCases := []struct { name string tool tool.Tool createApproval func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part wantFirstArtifactParts a2a.ContentParts wantSecondArtifactParts a2a.ContentParts }{ { name: "long-running", tool: newLongRunningTool(t), createApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part { return createLongRunningToolApproval(t, pendingResponse) }, wantFirstArtifactParts: a2a.ContentParts{ a2a.TextPart{Text: modelTextRequiresApproval}, a2a.TextPart{Text: modelTextWaitingForApproval}, }, wantSecondArtifactParts: a2a.ContentParts{a2a.TextPart{Text: modelTextTaskComplete}}, }, { name: "tool confirmation", tool: newToolConfirmation(t), createApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part { return createToolConfirmationApproval(t, toolCall) }, wantFirstArtifactParts: a2a.ContentParts{ a2a.TextPart{Text: modelTextRequiresApproval}, a2a.DataPart{ Data: map[string]any{"name": approvalToolName}, Metadata: map[string]any{"adk_is_long_running": false, "adk_type": "function_call"}, }, a2a.DataPart{ Data: map[string]any{ "name": approvalToolName, "response": map[string]any{"status": string(approvalStatusPending)}, }, Metadata: map[string]any{"adk_type": "function_response"}, }, }, wantSecondArtifactParts: a2a.ContentParts{ a2a.DataPart{ Data: map[string]any{ "name": approvalToolName, "response": map[string]any{"status": string(approvalStatusVerified)}, }, Metadata: map[string]any{"adk_type": "function_response"}, }, a2a.TextPart{Text: modelTextTaskComplete}, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Parallel() // Server inputRequestingAgent := newInputRequestingAgent(t, "agent-b", tc.tool) executor := newAgentExecutor(inputRequestingAgent, nil, adka2a.OutputArtifactPerRun) server := startA2AServer(executor) defer server.Close() // Client client := newA2AClient(t, server) // Initial message triggers input required taskContent := "Perform important task!" msg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: taskContent}) task1 := mustSendMessage(t, client, msg1) if task1.Status.State != a2a.TaskStateInputRequired { t.Fatalf("client.SendMessage(Initial) result state = %q, want %q", task1.Status.State, a2a.TaskStateInputRequired) } if len(task1.Artifacts) != 1 { t.Fatalf("len(task.Artifacts) = %d, want 1", len(task1.Artifacts)) } // Incomplete followup keeps the task in input-required incompleteFollowupText := "Is it really necessary?" msg2 := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: incompleteFollowupText}) task2 := mustSendMessage(t, client, msg2) if task2.Status.State != a2a.TaskStateInputRequired { t.Fatalf("client.SendMessage(IncompleteInput) result state = %q, want %q", task2.Status.State, a2a.TaskStateInputRequired) } if len(task2.Artifacts) != 1 { t.Fatalf("len(task.Artifacts) = %d, want 1", len(task2.Artifacts)) } // Required input gets delivered // Verify that error message is present if len(task2.Status.Message.Parts) < 2 { t.Fatalf("task2.Status.Message.Parts len = %d; want >= 2", len(task2.Status.Message.Parts)) } // The last part should be the error message lastPart := task2.Status.Message.Parts[len(task2.Status.Message.Parts)-1] tp, ok := lastPart.(a2a.TextPart) if !ok { t.Fatalf("last part is not TextPart") } if !strings.Contains(tp.Text, "no input provided") { t.Errorf("last part text = %q; want it to contain 'no input provided'", tp.Text) } // Another incomplete followup should not accumulate error messages msg2a := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: "Still debating?"}) task2a := mustSendMessage(t, client, msg2a) if task2a.Status.State != a2a.TaskStateInputRequired { t.Fatalf("client.SendMessage(IncompleteInput 2) result state = %q, want %q", task2a.Status.State, a2a.TaskStateInputRequired) } // Count validation errors in parts validationErrors := 0 for _, p := range task2a.Status.Message.Parts { if tp, ok := p.(a2a.TextPart); ok && strings.Contains(tp.Text, "no input provided") { validationErrors++ } } if validationErrors != 1 { t.Errorf("validationErrors count = %d; want 1", validationErrors) } // Check for adk_request_confirmation toolCall, pendingResponse := findLongRunningCall(t, toGenaiParts(t, task2.Status.Message.Parts)) approvedResponse := tc.createApproval(t, toolCall, pendingResponse) msg3 := a2a.NewMessageForTask(a2a.MessageRoleUser, task2, a2a.TextPart{Text: "LGTM"}, toA2AParts(t, []*genai.Part{approvedResponse}, []string{toolCall.ID})[0], ) task3 := mustSendMessage(t, client, msg3) if task3.Status.State != a2a.TaskStateCompleted { t.Fatalf("client.SendMessage(IncompleteInput) result state = %q, want %q", task3.Status.State, a2a.TaskStateCompleted) } // Verify the final task state opts := []cmp.Option{ cmpopts.EquateEmpty(), cmpopts.IgnoreMapEntries(func(k string, v any) bool { return strings.HasSuffix(k, "id") }), cmpopts.IgnoreFields(a2a.Message{}, "ID"), } if len(task3.Artifacts) != 2 { t.Fatalf("len(task.Artifacts) = %d, want 2", len(task3.Artifacts)) } gotHistory := task3.History wantHistory := []*a2a.Message{msg1, msg2, task1.Status.Message, msg2a, task2a.Status.Message, msg3, task2a.Status.Message} if diff := cmp.Diff(wantHistory, gotHistory, opts...); diff != "" { t.Fatalf("unexpected history (+got,-want) diff:\n%s", diff) } gotFirstArtifactParts := adka2a.WithoutPartialArtifacts(task3.Artifacts)[0].Parts if diff := cmp.Diff(tc.wantFirstArtifactParts, gotFirstArtifactParts, opts...); diff != "" { t.Fatalf("unexpected artifact parts (+got,-want) diff:\n%s", diff) } gotSecondArtifactParts := task3.Artifacts[1].Parts if diff := cmp.Diff(tc.wantSecondArtifactParts, gotSecondArtifactParts, opts...); diff != "" { t.Fatalf("unexpected artifact parts (+got,-want) diff:\n%s", diff) } }) } } /** * a2aclient -> server A -> adka2a.Executor A ->-> llmagent with remote subagent -> * remotesubagent -> server B -> adka2a.Executor B -> llmagent with a long running tool */ func TestA2AMultiHopInputRequired(t *testing.T) { remoteAgentName := "remote-agent-B" testCases := []struct { name string tool tool.Tool createApproval func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part wantFirstArtifactParts a2a.ContentParts wantSecondArtifactParts a2a.ContentParts }{ { name: "long-running", tool: newLongRunningTool(t), createApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part { return createLongRunningToolApproval(t, pendingResponse) }, wantFirstArtifactParts: toA2AParts(t, []*genai.Part{ genai.NewPartFromText(modelTextRootTransfer), genai.NewPartFromFunctionCall(transferToolName, map[string]any{"agent_name": remoteAgentName}), genai.NewPartFromFunctionResponse(transferToolName, nil), genai.NewPartFromText(modelTextRequiresApproval), genai.NewPartFromText(modelTextWaitingForApproval), }, []string{}), wantSecondArtifactParts: a2a.ContentParts{ a2a.TextPart{Text: modelTextTaskComplete}, }, }, { name: "tool confirmation", tool: newToolConfirmation(t), createApproval: func(t *testing.T, toolCall *genai.FunctionCall, pendingResponse *genai.FunctionResponse) *genai.Part { return createToolConfirmationApproval(t, toolCall) }, wantFirstArtifactParts: toA2AParts(t, []*genai.Part{ genai.NewPartFromText(modelTextRootTransfer), genai.NewPartFromFunctionCall(transferToolName, map[string]any{"agent_name": remoteAgentName}), genai.NewPartFromFunctionResponse(transferToolName, nil), genai.NewPartFromText(modelTextRequiresApproval), genai.NewPartFromFunctionCall(approvalToolName, nil), genai.NewPartFromFunctionResponse(approvalToolName, map[string]any{"status": string(approvalStatusPending)}), }, []string{}), wantSecondArtifactParts: a2a.ContentParts{ a2a.DataPart{ Data: map[string]any{ "name": approvalToolName, "response": map[string]any{"status": string(approvalStatusVerified)}, }, Metadata: map[string]any{"adk_type": "function_response"}, }, a2a.TextPart{Text: modelTextTaskComplete}, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Parallel() // Server B inputRequestingAgent := newInputRequestingAgent(t, "agent-b", tc.tool) executorB := newAgentExecutor(inputRequestingAgent, nil, adka2a.OutputArtifactPerEvent) serverB := startA2AServer(executorB) defer serverB.Close() // Server A remoteAgent := newA2ARemoteAgent(t, remoteAgentName, serverB) rootAgent := newRootAgent("root", remoteAgent) executorA := newAgentExecutor(rootAgent, nil, adka2a.OutputArtifactPerRun) serverA := startA2AServer(executorA) defer serverA.Close() // Client for Server A client := newA2AClient(t, serverA) // Initial message triggers input required msg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "Hello, perform important task!"}) task1 := mustSendMessage(t, client, msg1) if task1.Status.State != a2a.TaskStateInputRequired { t.Fatalf("client.SendMessage(Initial) result state = %q, want %q", task1.Status.State, a2a.TaskStateInputRequired) } // Incomplete followup keeps the task in input-required msg2 := a2a.NewMessageForTask(a2a.MessageRoleUser, task1, a2a.TextPart{Text: "Is it really necessary?"}) task2 := mustSendMessage(t, client, msg2) if task2.Status.State != a2a.TaskStateInputRequired { t.Fatalf("client.SendMessage(IncompleteInput) result state = %q, want %q", task2.Status.State, a2a.TaskStateInputRequired) } // Required input gets delivered toolCall, pendingResponse := findLongRunningCall(t, toGenaiParts(t, filterPartial(task2.Status.Message.Parts))) approvedResponse := tc.createApproval(t, toolCall, pendingResponse) msg3 := a2a.NewMessageForTask(a2a.MessageRoleUser, task2, a2a.TextPart{Text: "LGTM"}, toA2AParts(t, []*genai.Part{approvedResponse}, nil)[0], ) task3 := mustSendMessage(t, client, msg3) if task3.Status.State != a2a.TaskStateCompleted { t.Fatalf("client.SendMessage(IncompleteInput) result state = %q, want %q", task3.Status.State, a2a.TaskStateCompleted) } // Verify task on server A opts := []cmp.Option{ cmpopts.EquateEmpty(), cmpopts.IgnoreMapEntries(func(k string, v any) bool { return strings.HasSuffix(k, "id") }), } gotHistory := task3.History wantHistory := []*a2a.Message{msg1, msg2, task1.Status.Message, msg3, task2.Status.Message} if diff := cmp.Diff(wantHistory, gotHistory, opts...); diff != "" { t.Fatalf("unexpected history (+got,-want) diff:\n%s", diff) } gotFirstArtifactParts := a2a.ContentParts(filterPartial(task3.Artifacts[0].Parts)) if diff := cmp.Diff(tc.wantFirstArtifactParts, gotFirstArtifactParts, opts...); diff != "" { t.Fatalf("unexpected artifact parts (+got,-want) diff:\n%s", diff) } gotSecondArtifactParts := a2a.ContentParts(filterPartial(adka2a.WithoutPartialArtifacts(task3.Artifacts)[1].Parts)) if diff := cmp.Diff(tc.wantSecondArtifactParts, gotSecondArtifactParts, opts...); diff != "" { t.Fatalf("unexpected artifact parts (+got,-want) diff:\n%s", diff) } }) } } func TestA2ACleanupPropagation(t *testing.T) { // Remote A2A server publishes a submitted task and start generating artifact updates // until it detects a context cancelation remoteTaskIDChan, remoteCleanupCalledChan := make(chan a2a.TaskID, 1), make(chan struct{}) serverB := startA2AServer(&mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { remoteTaskIDChan <- reqCtx.TaskID if err := queue.Write(ctx, a2a.NewSubmittedTask(reqCtx, reqCtx.Message)); err != nil { return err } for ctx.Err() == nil { if err := queue.Write(ctx, a2a.NewArtifactEvent(reqCtx, a2a.TextPart{Text: "foo"})); err != nil { return err } time.Sleep(1 * time.Millisecond) } finalUpdate := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCompleted, nil) finalUpdate.Final = true return queue.Write(ctx, finalUpdate) }, cleanupFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) { close(remoteCleanupCalledChan) }, }) defer serverB.Close() // Root server connects to server B through remote subagent remoteAgentB := newA2ARemoteAgent(t, "remote-agent-b", serverB) rootA := newRootAgent("agent-b", remoteAgentB) executorA := newAgentExecutor(rootA, nil, adka2a.OutputArtifactPerEvent) serverA := startA2AServer(executorA) defer serverA.Close() client := newA2AClient(t, serverA) // Send a streaming message in a detached goroutine, passing status update through chan statusUpdateEventChan := make(chan a2a.Event, 10) go func() { defer close(statusUpdateEventChan) msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "work"}) for event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) { if err != nil { t.Errorf("client.SendStreamingMessage() error = %v", err) return } if _, ok := event.(*a2a.TaskArtifactUpdateEvent); ok { continue } statusUpdateEventChan <- event } }() // Issue a task cancellation request taskID := (<-statusUpdateEventChan).TaskInfo().TaskID cancelResultChan := make(chan *a2a.Task, 1) go func() { defer close(cancelResultChan) task, err := client.CancelTask(t.Context(), &a2a.TaskIDParams{ID: taskID}) if err != nil { t.Errorf("client.CancelTask() error = %v", err) return } cancelResultChan <- task }() // Check the streaming message sender got a cancelled state task in their response var lastStreamingUpdate a2a.Event for event := range statusUpdateEventChan { lastStreamingUpdate = event } if tu, ok := lastStreamingUpdate.(*a2a.TaskStatusUpdateEvent); ok { if tu.Status.State != a2a.TaskStateCanceled { t.Errorf("lastStreamingUpdate.Status.State = %q, want %q", tu.Status.State, a2a.TaskStateCanceled) } } else { t.Fatalf("type(lastStreamingUpdate) = %T, want *a2a.TaskStatusUpdateEvent", lastStreamingUpdate) } // Check subagent task got cancelled when the parent task was cancelled <-remoteCleanupCalledChan remoteTaskID := <-remoteTaskIDChan remoteClient := newA2AClient(t, serverB) remoteTask, err := remoteClient.GetTask(t.Context(), &a2a.TaskQueryParams{ID: remoteTaskID}) if err != nil { t.Fatalf("remoteClient.GetTask() error = %v", err) } if remoteTask.Status.State != a2a.TaskStateCanceled { t.Errorf("remoteTask.Status.State = %q, want %q", remoteTask.Status.State, a2a.TaskStateCanceled) } } func TestA2ASingleHopFinalResponse(t *testing.T) { testCases := []struct { name string agentFn func(*testing.T) agent.Agent wantArtifactParts a2a.ContentParts wantState a2a.TaskState wantStatusContain string wantPartial bool }{ { name: "streaming", agentFn: func(t *testing.T) agent.Agent { beep := newADKEventReplay(t, "beep", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Hello,", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(" I am beep!", genai.RoleModel), Partial: true, TurnComplete: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Hello, I am beep!", genai.RoleModel)}}, }) boop := newADKEventReplay(t, "boop", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("I am boop", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText(". We are", genai.RoleModel), Partial: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("here to help!", genai.RoleModel), Partial: true, TurnComplete: true}}, {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("I am boop. We are here to help!", genai.RoleModel)}}, }) return utils.Must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{Name: "root", SubAgents: []agent.Agent{beep, boop}}, })) }, wantState: a2a.TaskStateCompleted, wantArtifactParts: a2a.ContentParts{ a2a.TextPart{Text: "Hello, I am beep!"}, a2a.TextPart{Text: "I am boop. We are here to help!"}, }, wantPartial: true, }, { name: "non-streaming", agentFn: func(t *testing.T) agent.Agent { beep := newADKEventReplay(t, "beep", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Hello, I am beep!", genai.RoleModel)}}, }) boop := newADKEventReplay(t, "boop", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("I am boop. We are here to help!", genai.RoleModel)}}, }) return utils.Must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{Name: "root", SubAgents: []agent.Agent{beep, boop}}, })) }, wantState: a2a.TaskStateCompleted, wantArtifactParts: a2a.ContentParts{ a2a.TextPart{Text: "Hello, I am beep!"}, a2a.TextPart{Text: "I am boop. We are here to help!"}, }, }, { name: "internal error", agentFn: func(t *testing.T) agent.Agent { return utils.Must(agent.New(agent.Config{ Run: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) {} }, })) }, wantStatusContain: "app_name and user_id are required, got app_name: ", wantState: a2a.TaskStateFailed, wantArtifactParts: a2a.ContentParts{}, }, { name: "llm mid-response error response", agentFn: func(t *testing.T) agent.Agent { event := 0 llmModel := newGeminiModel(t, "gemini-2.5-flash") return utils.Must(llmagent.New(llmagent.Config{ Name: "model-agent", Model: llmModel, AfterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if event < 2 { event++ return nil, nil } return &model.LLMResponse{ErrorCode: "500", ErrorMessage: "Model Failed!"}, nil }, }, Instruction: "You are a helpful assistant.", })) }, wantStatusContain: "Model Failed!", wantState: a2a.TaskStateFailed, wantArtifactParts: a2a.ContentParts{}, wantPartial: true, }, { name: "llm mid-response error", agentFn: func(t *testing.T) agent.Agent { event := 0 llmModel := newGeminiModel(t, "gemini-2.5-flash") return utils.Must(llmagent.New(llmagent.Config{ Name: "model-agent", Model: llmModel, AfterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if event < 2 { event++ return nil, nil } return nil, fmt.Errorf("connection error!") }, }, Instruction: "You are a helpful assistant.", })) }, wantStatusContain: "connection error!", wantState: a2a.TaskStateFailed, wantArtifactParts: a2a.ContentParts{}, wantPartial: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { executor := newAgentExecutor(tc.agentFn(t), nil, adka2a.OutputArtifactPerRun) server := startA2AServer(executor) defer server.Close() client := newA2AClient(t, server) msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "Tell me about the current weather"}) task := mustSendMessage(t, client, msg) if task.Status.State != tc.wantState { t.Fatalf("client.SendMessage(Initial) result state = %q, want %q", task.Status.State, tc.wantState) } nonPartialArtifacts := adka2a.WithoutPartialArtifacts(task.Artifacts) wantResponse := len(tc.wantArtifactParts) > 0 if wantResponse { if len(nonPartialArtifacts) != 1 { t.Fatalf("len(artifacts) = %d, want 1", len(nonPartialArtifacts)) } if diff := cmp.Diff(tc.wantArtifactParts, nonPartialArtifacts[0].Parts); diff != "" { t.Fatalf("task wrong artifact parts (+got,-want) diff = %s", diff) } } if tc.wantStatusContain != "" { if task.Status.Message == nil || len(task.Status.Message.Parts) != 1 { t.Fatalf("got status message = %v, want message with one part", task.Status.Message) } if tp, ok := task.Status.Message.Parts[0].(a2a.TextPart); !ok || !strings.Contains(tp.Text, tc.wantStatusContain) { t.Fatalf("got status message = %v, want text containing %q", task.Status.Message.Parts[0], tc.wantStatusContain) } } if !tc.wantPartial { if wantResponse && len(task.Artifacts) != 1 { t.Fatalf("len(artifacts) = %d, want 1", len(task.Artifacts)) } return } wantArtifactCount := 1 if wantResponse { wantArtifactCount++ } if wantResponse && len(task.Artifacts) != wantArtifactCount { t.Fatalf("len(artifacts) = %d, want %d", len(task.Artifacts), wantArtifactCount) } var partialArtifact *a2a.Artifact if adka2a.IsPartial(task.Artifacts[0].Metadata) { partialArtifact = task.Artifacts[0] } else { partialArtifact = task.Artifacts[1] } wantPartialParts := a2a.ContentParts{a2a.DataPart{Data: map[string]any{}, Metadata: map[string]any{"adk_partial": true}}} if diff := cmp.Diff(wantPartialParts, partialArtifact.Parts); diff != "" { t.Fatalf("task wrong artifact parts (+got,-want) diff = %s", diff) } }) } } func TestA2ARemoteAgentStreamingGeminiSuccess(t *testing.T) { // Server B with replayable LLMAgent llmModel := newGeminiModel(t, "gemini-2.5-flash") modelAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "model-agent", Model: llmModel, Instruction: "You are a helpful assistant.", })) executorB := newAgentExecutor(modelAgent, nil, adka2a.OutputArtifactPerEvent) serverB := startA2AServer(executorB) defer serverB.Close() // Server A with RemoteAgent remoteAgent := newA2ARemoteAgent(t, "remote-agent", serverB) serviceA := session.InMemoryService() executorA := newAgentExecutor(remoteAgent, serviceA, adka2a.OutputArtifactPerRun) serverA := startA2AServer(executorA) defer serverA.Close() ctx := t.Context() client := newA2AClient(t, serverA) msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "tell me about the capital of Poland"}) msg.ContextID = a2a.NewContextID() // Make streaming request and aggregate results var taskID a2a.TaskID partialText, finalText := "", "" for event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) { if err != nil { t.Fatalf("client.SendStreamingMessage() error = %v", err) } if tau, ok := event.(*a2a.TaskArtifactUpdateEvent); ok { if adka2a.IsPartial(tau.Metadata) && tau.LastChunk { if len(tau.Artifact.Parts) != 1 { t.Fatalf("got %d parts in final partial artifact update, want 1", len(tau.Artifact.Parts)) } if dp, ok := tau.Artifact.Parts[0].(a2a.DataPart); !ok || len(dp.Data) > 0 { t.Fatalf("got %v part in final partial artifact update, want empty data part", tau.Artifact.Parts[0]) } continue } if adka2a.IsPartial(tau.Metadata) { for _, p := range tau.Artifact.Parts { partialText += p.(a2a.TextPart).Text } continue } if len(finalText) > 0 { t.Fatal("got multiple non-partial updates, want 1") } finalText = tau.Artifact.Parts[0].(a2a.TextPart).Text } taskID = event.TaskInfo().TaskID } // Check streaming contents if len(finalText) == 0 { t.Fatal("got empty final text") } if diff := cmp.Diff(partialText, finalText); diff != "" { t.Fatalf("got final event text different from streaming (+got, -want), diff = %s", diff) } // Check A2A Task state task, err := client.GetTask(ctx, &a2a.TaskQueryParams{ID: taskID}) if err != nil { t.Fatalf("client.GetTask() error = %v", err) } if task.Status.State != a2a.TaskStateCompleted { t.Fatalf("task state = %q, want %q", task.Status.State, a2a.TaskStateCompleted) } // Check Session Store state fullSessionResp, err := serviceA.Get(ctx, &session.GetRequest{ AppName: remoteAgent.Name(), UserID: "A2A_USER_" + msg.ContextID, SessionID: msg.ContextID, }) if err != nil { t.Fatalf("serviceA.GetSession() error = %v", err) } events := fullSessionResp.Session.Events() if events.Len() != 3 { t.Fatalf("got event count = %d, want [user-msg, response, turn-complete]", events.Len()) } if events.At(0).Author != "user" { t.Fatalf("got first event author = %s, want user", events.At(0).Author) } if !events.At(2).TurnComplete || events.At(2).Content != nil { t.Fatalf("got last event turn complete = true with no content, got turn complete = %v, content = %v", events.At(2).TurnComplete, events.At(2).Content) } if len(events.At(1).Content.Parts) != 1 { t.Fatalf("got content event with %d parts, want 1", len(events.At(1).Content.Parts)) } if diff := cmp.Diff(finalText, events.At(1).Content.Parts[0].Text); diff != "" { t.Fatalf("got content event text different from A2A response (+got, -want), diff = %s", diff) } } func TestA2ARemoteAgentStreamingGeminiError(t *testing.T) { // Server B with replayable LLMAgent which fails after emitting some events eventCount := 0 const errorMessage = "connection error!" llmModel := newGeminiModel(t, "gemini-2.5-flash") modelAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "model-agent", Model: llmModel, Instruction: "You are a helpful assistant.", AfterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if eventCount < 3 { eventCount++ return nil, nil } return nil, errors.New(errorMessage) }, }, })) executorB := newAgentExecutor(modelAgent, nil, adka2a.OutputArtifactPerRun) serverB := startA2AServer(executorB) defer serverB.Close() // Server A with RemoteAgent remoteAgent := newA2ARemoteAgent(t, "remote-agent", serverB) serviceA := session.InMemoryService() executorA := newAgentExecutor(remoteAgent, serviceA, adka2a.OutputArtifactPerRun) serverA := startA2AServer(executorA) defer serverA.Close() ctx := t.Context() client := newA2AClient(t, serverA) msg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "tell me about the capital of Poland"}) msg.ContextID = a2a.NewContextID() // Make streaming request and aggregate results var taskID a2a.TaskID for event, err := range client.SendStreamingMessage(t.Context(), &a2a.MessageSendParams{Message: msg}) { if err != nil { t.Fatalf("client.SendStreamingMessage() error = %v", err) } taskID = event.TaskInfo().TaskID } // Check A2A Task state task, err := client.GetTask(ctx, &a2a.TaskQueryParams{ID: taskID}) if err != nil { t.Fatalf("client.GetTask() error = %v", err) } if task.Status.State != a2a.TaskStateFailed { t.Fatalf("task state = %q, want %q", task.Status.State, a2a.TaskStateFailed) } if task.Status.Message == nil || len(task.Status.Message.Parts) != 1 { t.Fatalf("task status message = %v, want 1 part", task.Status.Message) } if tp, ok := task.Status.Message.Parts[0].(a2a.TextPart); !ok || !strings.Contains(tp.Text, errorMessage) { t.Fatalf("task status message = %v, want containing %q", task.Status.Message.Parts[0], errorMessage) } if len(task.Artifacts) != 1 || len(adka2a.WithoutPartialArtifacts(task.Artifacts)) != 0 { t.Fatalf("task artifacts = %v, want single partial artifact", task.Artifacts) } if dp, ok := task.Artifacts[0].Parts[0].(a2a.DataPart); !ok || len(dp.Data) != 0 { t.Fatalf("task artifact = %v, want reset partial artifact", task.Artifacts[0]) } // Check Session Store state fullSessionResp, err := serviceA.Get(ctx, &session.GetRequest{ AppName: remoteAgent.Name(), UserID: "A2A_USER_" + msg.ContextID, SessionID: msg.ContextID, }) if err != nil { t.Fatalf("serviceA.GetSession() error = %v", err) } events := fullSessionResp.Session.Events() if events.Len() != 2 { t.Fatalf("got event count = %d, want 2", events.Len()) } if !strings.Contains(events.At(1).ErrorMessage, errorMessage) { t.Fatalf("got event error message = %q, want containing %q", events.At(1).ErrorMessage, errorMessage) } } type llmStub struct { name string generateContent func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] } func (d *llmStub) Name() string { return d.name } func (d *llmStub) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return d.generateContent(ctx, req, stream) } func newLongRunningTool(t *testing.T) tool.Tool { t.Helper() requestApproval, err := functiontool.New(functiontool.Config{ Name: approvalToolName, Description: "Request approval before proceeding.", IsLongRunning: true, }, func(ctx tool.Context, x map[string]any) (approval, error) { return approval{Status: approvalStatusPending, TicketID: a2a.NewContextID()}, nil }) if err != nil { t.Fatalf("functiontool.New() error = %v", err) } return requestApproval } func newToolConfirmation(t *testing.T) tool.Tool { t.Helper() requestApproval, err := functiontool.New(functiontool.Config{ Name: approvalToolName, Description: "Request approval before proceeding.", }, func(ctx tool.Context, x map[string]any) (approval, error) { confirmation := ctx.ToolConfirmation() if confirmation == nil { ticketID := a2a.NewContextID() if err := ctx.RequestConfirmation("I need approval", map[string]string{"ticket_id": ticketID}); err != nil { return approval{}, err } return approval{Status: approvalStatusPending, TicketID: ticketID}, nil } if !confirmation.Confirmed { return approval{}, fmt.Errorf("confirmation was rejected") } jsonBytes, err := json.Marshal(confirmation.Payload) if err != nil { return approval{}, fmt.Errorf("error marshalling payload %s: %w", confirmation.Payload, err) } var payload approval if err := json.Unmarshal(jsonBytes, &payload); err != nil { return approval{}, fmt.Errorf("error unmarshalling payload %s: %w", confirmation.Payload, err) } return approval{Status: approvalStatusVerified, TicketID: payload.TicketID}, nil }) if err != nil { t.Fatalf("functiontool.New() error = %v", err) } return requestApproval } func newInputRequestingAgent(t *testing.T, name string, requestApproval tool.Tool) agent.Agent { t.Helper() return utils.Must(llmagent.New(llmagent.Config{ Name: name, Tools: []tool.Tool{requestApproval}, Model: &llmStub{ generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { lastMessage := req.Contents[len(req.Contents)-1] approvalResult := utils.FunctionResponses(lastMessage) var content *genai.Content switch { case len(approvalResult) == 0: // the first model invocation - invoke a long running tool content = genai.NewContentFromParts([]*genai.Part{ genai.NewPartFromText(modelTextRequiresApproval), genai.NewPartFromFunctionCall(approvalToolName, map[string]any{}), }, genai.RoleModel) case len(approvalResult) == 1 && approvalResult[0].Response["status"] == string(approvalStatusPending): // the tool returned a pending result content = genai.NewContentFromText(modelTextWaitingForApproval, genai.RoleModel) default: // user approval is in the session content = genai.NewContentFromText(modelTextTaskComplete, genai.RoleModel) } yield(&model.LLMResponse{Content: content}, nil) } }, }, })) } func newRootAgent(name string, subAgent agent.Agent) agent.Agent { return utils.Must(llmagent.New(llmagent.Config{ Name: name, SubAgents: []agent.Agent{subAgent}, Model: &llmStub{ name: name + "-model", generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { yield(&model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ genai.NewPartFromText(modelTextRootTransfer), genai.NewPartFromFunctionCall(transferToolName, map[string]any{"agent_name": subAgent.Name()}), }, genai.RoleModel), }, nil) } }, }, })) } func newAgentExecutor(agnt agent.Agent, service session.Service, mode adka2a.OutputMode) a2asrv.AgentExecutor { if service == nil { service = session.InMemoryService() } return adka2a.NewExecutor(adka2a.ExecutorConfig{ OutputMode: mode, RunnerConfig: runner.Config{ AppName: agnt.Name(), SessionService: service, Agent: agnt, }, RunConfig: agent.RunConfig{StreamingMode: agent.StreamingModeSSE}, }) } func mustSendMessage(t *testing.T, client *a2aclient.Client, msg *a2a.Message) *a2a.Task { t.Helper() sendParams := &a2a.MessageSendParams{Message: msg} result, err := client.SendMessage(t.Context(), sendParams) if err != nil { t.Fatalf("client.SendMessage() error = %v", err) } task, ok := result.(*a2a.Task) if !ok { t.Fatalf("client.SendMessage() result is %T, want *a2a.Task", result) } return task } func filterPartial(parts []a2a.Part) []a2a.Part { var result []a2a.Part for _, p := range parts { if b, _ := p.Meta()[adka2a.ToA2AMetaKey("partial")].(bool); b { continue } result = append(result, p) } return result } func findLongRunningCall(t *testing.T, parts []*genai.Part) (*genai.FunctionCall, *genai.FunctionResponse) { t.Helper() content := genai.NewContentFromParts(parts, genai.RoleModel) calls := utils.FunctionCalls(content) responses := utils.FunctionResponses(content) if len(calls) > 1 { t.Fatalf("got %d calls, want 1", len(calls)) } if len(responses) > 1 { t.Fatalf("got %d responses, want 1", len(responses)) } var call *genai.FunctionCall if len(calls) == 1 { call = calls[0] } var response *genai.FunctionResponse if len(responses) == 1 { response = responses[0] } return call, response } func toA2AParts(t *testing.T, parts []*genai.Part, callIDs []string) []a2a.Part { t.Helper() a2aParts, err := adka2a.ToA2AParts(parts, callIDs) if err != nil { t.Fatalf("adka2a.ToA2AParts() error = %v", err) } return a2aParts } func toGenaiParts(t *testing.T, a2aParts []a2a.Part) []*genai.Part { t.Helper() parts, err := adka2a.ToGenAIParts(a2aParts) if err != nil { t.Fatalf("adka2a.ToGenAIParts() error = %v", err) } return parts } func toMap(t *testing.T, v any) map[string]any { t.Helper() result, err := converters.ToMapStructure(v) if err != nil { t.Fatalf("converters.ToMapStructure error = %v", err) } return result } func fromMap[T any](t *testing.T, m map[string]any) *T { t.Helper() result, err := converters.FromMapStructure[T](m) if err != nil { t.Fatalf("converters.FromMapStructure() error = %v", err) } return result } func newA2AClient(t *testing.T, server *testA2AServer) *a2aclient.Client { t.Helper() result, err := a2aclient.NewFromCard(t.Context(), &a2a.AgentCard{ PreferredTransport: a2a.TransportProtocolJSONRPC, URL: server.URL, Capabilities: a2a.AgentCapabilities{Streaming: true}, }) if err != nil { t.Fatalf("a2aclient.NewFromEndpoints() error = %v", err) } return result } func createLongRunningToolApproval(t *testing.T, pendingResponse *genai.FunctionResponse) *genai.Part { t.Helper() pendingApproval := fromMap[approval](t, pendingResponse.Response) response := genai.NewPartFromFunctionResponse(approvalToolName, toMap(t, approval{ Status: approvalStatusApproved, TicketID: pendingApproval.TicketID, })) response.FunctionResponse.ID = pendingResponse.ID return response } func createToolConfirmationApproval(t *testing.T, toolCall *genai.FunctionCall) *genai.Part { t.Helper() tcMap, ok := toolCall.Args["toolConfirmation"].(map[string]any) if !ok { t.Fatalf("toolCall = %v, want toolConfirmation", toolCall) } payloadMap, ok := tcMap["payload"].(map[string]any) if !ok { t.Fatalf("toolCall = %v, want payload", toolCall) } ticketID, ok := payloadMap["ticket_id"].(string) if !ok { t.Fatalf("toolCall = %v, want ticket_id", toolCall) } return &genai.Part{ FunctionResponse: &genai.FunctionResponse{ ID: toolCall.ID, Name: toolCall.Name, Response: map[string]any{ "confirmed": true, "payload": map[string]string{"ticket_id": ticketID}, }, }, } } func newGeminiTestClientConfig(t *testing.T, rrfile string) (http.RoundTripper, bool) { t.Helper() rr, err := testutil.NewGeminiTransport(rrfile) if err != nil { t.Fatal(err) } // Ensure the transport is closed to flush data and release locks if c, ok := rr.(io.Closer); ok { t.Cleanup(func() { if err := c.Close(); err != nil { t.Errorf("failed to close transport: %v", err) } }) } recording, _ := httprr.Recording(rrfile) return rr, recording } func newGeminiModel(t *testing.T, modelName string) model.LLM { apiKey := "fakeKey" trace := filepath.Join("testdata", strings.ReplaceAll(t.Name()+".httprr", "/", "_")) recording := false transport, recording := newGeminiTestClientConfig(t, trace) if recording { // if we are recording httprr trace, don't use the fakeKey. apiKey = "" } model, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{ HTTPClient: &http.Client{Transport: transport}, APIKey: apiKey, }) if err != nil { t.Fatalf("failed to create model: %v", err) } return model } func TestA2AMultiHopInputRequiredCancellation(t *testing.T) { remoteAgentName := "remote-agent-B" remoteTaskIDChan := make(chan a2a.TaskID, 1) serverB := startA2AServer(&mockA2AExecutor{ executeFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { remoteTaskIDChan <- reqCtx.TaskID ev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateInputRequired, a2a.NewMessage(a2a.MessageRoleAgent, a2a.DataPart{ Data: map[string]any{"id": "call-1", "name": "foo"}, Metadata: map[string]any{"adk_is_long_running": true, "adk_type": "function_call"}, })) ev.Final = true return queue.Write(ctx, ev) }, cancelFn: func(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { ev := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil) ev.Final = true return queue.Write(ctx, ev) }, }) defer serverB.Close() // Server A remoteAgent := newA2ARemoteAgent(t, remoteAgentName, serverB) rootAgent := newRootAgent("root", remoteAgent) executorA := newAgentExecutor(rootAgent, nil, adka2a.OutputArtifactPerRun) serverA := startA2AServer(executorA) defer serverA.Close() // Send message clientA := newA2AClient(t, serverA) msg1 := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "Hello"}) task1 := mustSendMessage(t, clientA, msg1) if task1.Status.State != a2a.TaskStateInputRequired { t.Fatalf("task1.Status.State = %q, want %q", task1.Status.State, a2a.TaskStateInputRequired) } // Cancel the task on Server A _, err := clientA.CancelTask(t.Context(), &a2a.TaskIDParams{ID: task1.ID}) if err != nil { t.Fatalf("client.CancelTask() error = %v", err) } // Verify that Server B's task was cancelled remoteTaskID := <-remoteTaskIDChan clientB := newA2AClient(t, serverB) remoteTask, err := clientB.GetTask(t.Context(), &a2a.TaskQueryParams{ID: remoteTaskID}) if err != nil { t.Fatalf("client.CancelTask() error = %v", err) } if remoteTask.Status.State != a2a.TaskStateCanceled { t.Fatalf("remoteTask.Status.State = %q, want %q", remoteTask.Status.State, a2a.TaskStateCanceled) } } ================================================ FILE: agent/remoteagent/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package remoteagent allows to use a remote ADK agents. package remoteagent ================================================ FILE: agent/remoteagent/testdata/TestA2ARemoteAgentStreamingGeminiError.httprr ================================================ httprr trace v1 501 6929 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 255 Content-Type: application/json {"contents":[{"parts":[{"text":"tell me about the capital of Poland"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a helpful assistant.\n\nYou are an agent. Your internal name is \"model-agent\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:12:50 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=811 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The capital of Poland is **Warsaw** (Polish: *Warszawa*).\n\nHere's some information about it:\n\n* **Location"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 31,"totalTokenCount": 91,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": ":** It's located in east-central Poland, on the Vistula River.\n* **Population:** It's the largest city in Poland, with a metropolitan area of over 3 million people.\n* **"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 79,"totalTokenCount": 139,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": "History & Resilience:** Warsaw has a incredibly dramatic history, most notably its near-total destruction during World War II, particularly during the Warsaw Uprising in 1944. An estimated 85% of its buildings were destroyed."}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 127,"totalTokenCount": 187,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": "\n* **Reconstruction:** Despite the devastation, the city was meticulously rebuilt, often using original bricks and careful historical documentation. This includes the famous **Old Town**, which was so faithfully reconstructed that it was designated a **UNESCO World Heritage Site** in"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 177,"totalTokenCount": 237,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " 1980 as \"an outstanding example of a near-total reconstruction of a historical continuity and cultural heritage destroyed by World War II.\"\n* **Modern City:** Today, Warsaw is a vibrant, modern European capital, a major"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 225,"totalTokenCount": 285,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " economic, political, and cultural hub. It boasts a dynamic skyline with numerous skyscrapers, reflecting its rapid growth and development since the fall of communism.\n* **Key Landmarks & Attractions:**\n * **Old Town (Stare"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 273,"totalTokenCount": 333,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " Miasto):** Market Square, Royal Castle, Barbican.\n * **Palace of Culture and Science:** A controversial but iconic gift from the Soviet Union, offering panoramic views.\n * **Łazienki Park"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 322,"totalTokenCount": 382,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": ":** A beautiful park with palaces, an amphitheater, and a monument to Frédéric Chopin.\n * **Warsaw Uprising Museum:** A powerful and moving museum dedicated to the 1944 uprising.\n * **"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 371,"totalTokenCount": 431,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": "POLIN Museum of the History of Polish Jews:** An award-winning museum exploring the thousand-year history of Jews in Poland.\n * **Royal Route:** A historic route connecting the Royal Castle with the Wilanów Palace,"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 419,"totalTokenCount": 479,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " lined with churches, palaces, and statues.\n* **Culture:** It's a major center for arts and culture, with numerous theaters, museums, art galleries, and music venues. Chopin, the famous composer, spent his early"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 467,"totalTokenCount": 527,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " life in Warsaw.\n* **Economy:** Warsaw is Poland's primary economic engine, home to numerous international companies, financial institutions, and a thriving startup scene.\n\nIn essence, Warsaw is a city that embodies resilience, rebirth, and a blend"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 518,"totalTokenCount": 578,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} data: {"candidates": [{"content": {"parts": [{"text": " of rich history with dynamic modernity."}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 525,"totalTokenCount": 585,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 30},"modelVersion": "gemini-2.5-flash","responseId": "4SawaZC7Oojp7M8P7KjSyAc"} ================================================ FILE: agent/remoteagent/testdata/TestA2ARemoteAgentStreamingGeminiSuccess.httprr ================================================ httprr trace v1 501 6279 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 255 Content-Type: application/json {"contents":[{"parts":[{"text":"tell me about the capital of Poland"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a helpful assistant.\n\nYou are an agent. Your internal name is \"model-agent\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:12:37 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=686 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The capital of Poland is **Warsaw** (Polish: *Warszawa*).\n\nHere's a brief overview:\n\n* **Location:**"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 31,"totalTokenCount": 94,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " Situated on the Vistula River in east-central Poland.\n* **History:** Warsaw has a long and often tragic history. It became the capital in 1596 when King Sigismund III Vasa moved his court from Krakow."}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 82,"totalTokenCount": 145,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " It was completely devastated during World War II, particularly during the Warsaw Uprising in 1944. An estimated 85% of its buildings were destroyed.\n* **Reconstruction:** After the war, the city underwent an astonishing"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 132,"totalTokenCount": 195,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " and meticulous reconstruction, with many historical buildings, especially in the Old Town, being rebuilt to their pre-war appearance. This effort led to its **Old Town being designated a UNESCO World Heritage Site** in 1980, recognized as"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 181,"totalTokenCount": 244,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " \"an outstanding example of a near-total reconstruction of a span of history covering the 13th to the 20th century.\"\n* **Modern City:** Today, Warsaw is a vibrant metropolis, the largest city in Poland, and"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 232,"totalTokenCount": 295,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " the country's economic, political, and cultural hub. It's known for its mix of historical architecture, modern skyscrapers, green spaces, and lively cultural scene.\n* **Key Landmarks:**\n * **Old Town"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 280,"totalTokenCount": 343,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " Market Square:** The heart of the Old Town, surrounded by colorful merchant houses.\n * **Royal Castle:** The former residence of Polish monarchs.\n * **Palace of Culture and Science:** A controversial but iconic gift"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 328,"totalTokenCount": 391,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " from the Soviet Union, now housing museums, theaters, and offices.\n * **Łazienki Park:** A beautiful 18th-century park complex with palaces, pavilions, and a famous monument to Frédéric Chopin."}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 376,"totalTokenCount": 439,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": "\n * **Warsaw Uprising Museum:** A powerful museum documenting the 1944 uprising.\n * **POLIN Museum of the History of Polish Jews:** A modern, award-winning museum exploring the thousand"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 422,"totalTokenCount": 485,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": "-year history of Jews in Poland.\n* **Economy:** Warsaw is a major financial center and a hub for international businesses, higher education, and research.\n\nIt's a city that truly embodies resilience and a testament to the human"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 471,"totalTokenCount": 534,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} data: {"candidates": [{"content": {"parts": [{"text": " spirit to rebuild and thrive."}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 30,"candidatesTokenCount": 477,"totalTokenCount": 540,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 30}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "1Cawad6GGqqAvdIPveLuiAU"} ================================================ FILE: agent/remoteagent/testdata/TestA2ASingleHopFinalResponse_llm_mid-response_error.httprr ================================================ httprr trace v1 499 1280 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 253 Content-Type: application/json {"contents":[{"parts":[{"text":"Tell me about the current weather"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a helpful assistant.\n\nYou are an agent. Your internal name is \"model-agent\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:12:23 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=761 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "I can help you with that! To give you the most accurate weather, I need to know your current location or the location you're interested"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 29,"totalTokenCount": 94,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 36},"modelVersion": "gemini-2.5-flash","responseId": "xiawabjkJuPd7M8PkYmgyAo"} data: {"candidates": [{"content": {"parts": [{"text": " in.\n\nCould you please tell me the city and country (and state/province if applicable)?"}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 49,"totalTokenCount": 114,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 36},"modelVersion": "gemini-2.5-flash","responseId": "xiawabjkJuPd7M8PkYmgyAo"} ================================================ FILE: agent/remoteagent/testdata/TestA2ASingleHopFinalResponse_llm_mid-response_error_response.httprr ================================================ httprr trace v1 499 2185 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 253 Content-Type: application/json {"contents":[{"parts":[{"text":"Tell me about the current weather"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a helpful assistant.\n\nYou are an agent. Your internal name is \"model-agent\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:12:22 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=2179 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "I can help you with that! However, I don'"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 12,"totalTokenCount": 240,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 199},"modelVersion": "gemini-2.5-flash","responseId": "wyawaZq1OqfNkdUPu_SioAU"} data: {"candidates": [{"content": {"parts": [{"text": "t have access to real-time information or your current location.\n\nTo tell you about the weather, I'll need to know:\n\n* **What city and country** are you interested in? (e.g., \"London"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 61,"totalTokenCount": 289,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 199},"modelVersion": "gemini-2.5-flash","responseId": "wyawaZq1OqfNkdUPu_SioAU"} data: {"candidates": [{"content": {"parts": [{"text": ", UK\" or \"New York City, USA\")\n* **What state or province** too, if applicable (e.g., \"Portland, Oregon, USA\")\n\nOnce you tell me the location, I can look up"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 109,"totalTokenCount": 337,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 199},"modelVersion": "gemini-2.5-flash","responseId": "wyawaZq1OqfNkdUPu_SioAU"} data: {"candidates": [{"content": {"parts": [{"text": " the current weather for you!"}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 29,"candidatesTokenCount": 115,"totalTokenCount": 343,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 29}],"thoughtsTokenCount": 199},"modelVersion": "gemini-2.5-flash","responseId": "wyawaZq1OqfNkdUPu_SioAU"} ================================================ FILE: agent/remoteagent/utils.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "fmt" "slices" "github.com/a2aproject/a2a-go/a2a" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) type userFunctionCall struct { response *session.Event taskID a2a.TaskID contextID string } // toUserFunctionCall returns a non-nil struct when the last event in the session has a FunctionResponse // with user-provided data. The struct contains both call and response events. func getUserFunctionCallAt(events session.Events, index int) *userFunctionCall { if index < 0 || index >= events.Len() { return nil } candidate := events.At(index) if candidate.Author != "user" { return nil } fnCallID, ok := getFunctionResponseCallID(candidate) if !ok { return nil } for i := index - 1; i >= 0; i-- { request := events.At(i) if !isFunctionCallEvent(request, fnCallID) { continue } result := &userFunctionCall{response: candidate} tid, ctxID := adka2a.GetA2ATaskInfo(request) result.taskID = tid result.contextID = ctxID return result } return nil } func isFunctionCallEvent(event *session.Event, callID string) bool { if event == nil || event.Content == nil { return false } return slices.ContainsFunc(event.Content.Parts, func(part *genai.Part) bool { return part.FunctionCall != nil && part.FunctionCall.ID == callID }) } // getFunctionResponseCallID finds the first part with non-nil FunctionResponse and returns the call ID. func getFunctionResponseCallID(event *session.Event) (string, bool) { if event.Content == nil { return "", false } responsePartIndex := slices.IndexFunc(event.Content.Parts, func(part *genai.Part) bool { return part.FunctionResponse != nil }) if responsePartIndex < 0 { return "", false } return event.Content.Parts[responsePartIndex].FunctionResponse.ID, true } // toMissingRemoteSessionParts returns content parts for all events we think are not present in the remote session // and a2a contextID if it was found in a remote agent event metadata. // We iterate session events backward until all events are processed or an event authored by a remote agent is found. // Parts from all events we processed are returned as a single list. // The returned contextID might be an empty string. This means the current remote agent invocation is not associates with // any of the previous one. In this case a new contextID will be generated on the remote server. func toMissingRemoteSessionParts(ctx agent.InvocationContext, events session.Events, cfg A2AConfig) ([]a2a.Part, string) { partCount, contextID := 0, "" // only events after this index are not in the remote session lastRemoteResponseIndex := -1 for i := events.Len() - 1; i >= 0; i-- { event := events.At(i) if event.LLMResponse.Content != nil { partCount += len(event.Content.Parts) } if event.Author == ctx.Agent().Name() { lastRemoteResponseIndex = i _, contextID = adka2a.GetA2ATaskInfo(event) break } } result := make([]a2a.Part, 0, partCount) for i := lastRemoteResponseIndex + 1; i < events.Len(); i++ { event := events.At(i) if event.Author != "user" && event.Author != ctx.Agent().Name() { event = presentAsUserMessage(ctx, event) } if event.Content == nil || len(event.Content.Parts) == 0 { continue } parts, err := convertParts(ctx, cfg, event) if err != nil { // TODO(yarolegovich): log error continue } result = append(result, parts...) } return result, contextID } func presentAsUserMessage(ctx agent.InvocationContext, agentEvent *session.Event) *session.Event { event := session.NewEvent(ctx.InvocationID()) event.Author = "user" if agentEvent.Content == nil { return event } parts := make([]*genai.Part, 0, len(agentEvent.Content.Parts)+1) parts = append(parts, &genai.Part{Text: "For context:"}) for _, part := range agentEvent.Content.Parts { if part.Thought { continue } if part.Text != "" { text := fmt.Sprintf("[%s] said: %s", agentEvent.Author, part.Text) parts = append(parts, genai.NewPartFromText(text)) } else if part.FunctionCall != nil { call := part.FunctionCall text := fmt.Sprintf("[%s] called tool %s with parameters: %v", agentEvent.Author, call.Name, call.Args) parts = append(parts, genai.NewPartFromText(text)) } else if part.FunctionResponse != nil { resp := part.FunctionResponse text := fmt.Sprintf("[%s] %s tool returned result: %v", agentEvent.Author, resp.Name, resp.Response) parts = append(parts, genai.NewPartFromText(text)) } else { parts = append(parts, part) } } if len(parts) > 1 { // not only "For context:" part event.Content = genai.NewContentFromParts(parts, genai.RoleUser) } return event } ================================================ FILE: agent/remoteagent/utils_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "fmt" "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/model" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" ) func newTestInvocationContext(t *testing.T, agentName string, events ...*session.Event) agent.InvocationContext { t.Helper() ctx := t.Context() store := session.InMemoryService() resp, err := store.Create(ctx, &session.CreateRequest{AppName: "test", UserID: "test-user"}) if err != nil { t.Errorf("store.Create() error = %v", err) return nil } for _, event := range events { if err := store.AppendEvent(ctx, resp.Session, event); err != nil { t.Errorf("store.AppendEvent() error = %v", err) return nil } } agent, err := agent.New(agent.Config{Name: agentName}) if err != nil { t.Errorf("agent.New() error = %v", err) return nil } return icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{ Agent: agent, Session: resp.Session, }) } func newEventFromParts(author string, parts ...*genai.Part) *session.Event { var role genai.Role = genai.RoleModel if author == "user" { role = genai.RoleUser } event := &session.Event{Author: author, Actions: session.EventActions{StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}}} if len(parts) > 0 { event.Content = genai.NewContentFromParts(parts, role) } return event } func TestGetUserFunctionCallAt(t *testing.T) { testCases := []struct { name string events []*session.Event atIndex int success bool }{ { name: "success", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-1"}}), newEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}), }, atIndex: 1, success: true, }, { name: "success with event in-between", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-1"}}), newEventFromParts(genai.RoleModel, &genai.Part{Text: "another event"}), newEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}), }, atIndex: 2, success: true, }, { name: "success with multiple parts in-between", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{Text: "calling"}, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-1"}}, &genai.Part{Text: "called"}, ), newEventFromParts(genai.RoleUser, &genai.Part{Text: "responding"}, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}, &genai.Part{Text: "responded"}, ), }, atIndex: 1, success: true, }, { name: "failf if not response index", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-1"}}), newEventFromParts(genai.RoleModel, &genai.Part{Text: "another event"}), newEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}), }, atIndex: 1, success: false, }, { name: "fail if not user author", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-1"}}), newEventFromParts(genai.RoleModel, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}), }, success: false, }, { name: "fail if no matching function call", events: []*session.Event{ newEventFromParts(genai.RoleModel, &genai.Part{FunctionCall: &genai.FunctionCall{ID: "id-2"}}), newEventFromParts(genai.RoleUser, &genai.Part{FunctionResponse: &genai.FunctionResponse{ID: "id-1"}}), }, success: false, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ictx := newTestInvocationContext(t, "test-agent", tc.events...) got := getUserFunctionCallAt(ictx.Session().Events(), tc.atIndex) if !tc.success && got != nil { t.Errorf("getUserFunctionCallAt() = %v, want nil", got) } if tc.success && got == nil { t.Error("getUserFunctionCallAt() = nil, want non-nil") } }) } } func TestToMissingRemoteSessionParts(t *testing.T) { remoteName := "remote-agent" testCases := []struct { name string events []*session.Event wantParts []a2a.Part wantContextID string }{ { name: "all message parts collected", events: []*session.Event{ newEventFromParts("user", &genai.Part{Text: "hello"}), newEventFromParts("user", &genai.Part{Text: "foo"}, &genai.Part{Text: "bar"}), }, wantParts: []a2a.Part{ a2a.TextPart{Text: "hello"}, a2a.TextPart{Text: "foo"}, a2a.TextPart{Text: "bar"}, }, }, { name: "other agent messages are rephrased", events: []*session.Event{ newEventFromParts("another-agent", &genai.Part{Text: "foo"}), newEventFromParts("user", &genai.Part{Text: "bar"}), }, wantParts: []a2a.Part{ a2a.TextPart{Text: "For context:"}, a2a.TextPart{Text: "[another-agent] said: foo"}, a2a.TextPart{Text: "bar"}, }, }, { name: "other agent thoughts are skipped", events: []*session.Event{ newEventFromParts("another-agent", &genai.Part{Text: "foo", Thought: true}), newEventFromParts("user", &genai.Part{Text: "bar"}), }, wantParts: []a2a.Part{ a2a.TextPart{Text: "bar"}, }, }, { name: "events before the last remote response excluded", events: []*session.Event{ newEventFromParts("user", &genai.Part{Text: "hello"}), newEventFromParts(remoteName, &genai.Part{Text: "hi"}), newEventFromParts("user", &genai.Part{Text: "foo"}), newEventFromParts("user", &genai.Part{Text: "bar"}), }, wantParts: []a2a.Part{ a2a.TextPart{Text: "foo"}, a2a.TextPart{Text: "bar"}, }, }, { name: "contextID of the last remote agent response returned", events: []*session.Event{ { Author: remoteName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{{Text: "hi"}}, genai.RoleModel), CustomMetadata: adka2a.ToCustomMetadata(a2a.NewTaskID(), "ctxID-123"), }, }, }, wantParts: []a2a.Part{}, wantContextID: "ctxID-123", }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ictx := newTestInvocationContext(t, remoteName, tc.events...) gotParts, gotContextID := toMissingRemoteSessionParts(ictx, ictx.Session().Events(), A2AConfig{}) if tc.wantContextID != gotContextID { t.Errorf("toMissingRemoteSessionParts() contextID = %s, want %s", gotContextID, tc.wantContextID) } if diff := cmp.Diff(tc.wantParts, gotParts); diff != "" { t.Errorf("toMissingRemoteSessionParts() wrong result (+got,-want):\ngot = %v\nwant = %v\ndiff = %v", gotParts, tc.wantParts, diff) } }) } } func TestPresentAsUserMessage(t *testing.T) { testCases := []struct { name string input *session.Event want *session.Event }{ { name: "text presented", input: newEventFromParts("some agent", genai.NewPartFromText("hello")), want: newEventFromParts( "user", genai.NewPartFromText("For context:"), genai.NewPartFromText("[some agent] said: hello"), ), }, { name: "function call presented", input: newEventFromParts("some agent", genai.NewPartFromFunctionCall("get_weather", map[string]any{"city": "Warsaw"})), want: newEventFromParts( "user", genai.NewPartFromText("For context:"), genai.NewPartFromText(fmt.Sprintf("[some agent] called tool get_weather with parameters: %v", map[string]any{"city": "Warsaw"})), ), }, { name: "function call result presented", input: newEventFromParts("some agent", genai.NewPartFromFunctionResponse("get_weather", map[string]any{"temp": "1C"})), want: newEventFromParts( "user", genai.NewPartFromText("For context:"), genai.NewPartFromText(fmt.Sprintf("[some agent] get_weather tool returned result: %v", map[string]any{"temp": "1C"})), ), }, { name: "other part types unmodified", input: newEventFromParts( "some agent", genai.NewPartFromFile(genai.File{Name: "cat.png"}), genai.NewPartFromExecutableCode("print('hello, world!')", genai.LanguagePython), genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, "hello, world!"), ), want: newEventFromParts( "user", genai.NewPartFromText("For context:"), genai.NewPartFromFile(genai.File{Name: "cat.png"}), genai.NewPartFromExecutableCode("print('hello, world!')", genai.LanguagePython), genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, "hello, world!"), ), }, { name: "thought skipped", input: newEventFromParts("some agent", &genai.Part{Text: "hello", Thought: true}), want: newEventFromParts("user"), }, { name: "thought with other parts", input: newEventFromParts("some agent", &genai.Part{Text: "thinking...", Thought: true}, genai.NewPartFromText("done")), want: newEventFromParts( "user", genai.NewPartFromText("For context:"), genai.NewPartFromText("[some agent] said: done"), ), }, } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID"), cmpopts.IgnoreFields(session.Event{}, "InvocationID"), cmpopts.IgnoreFields(session.Event{}, "Timestamp"), } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ictx := newTestInvocationContext(t, "test") got := presentAsUserMessage(ictx, tc.input) if diff := cmp.Diff(tc.want, got, ignoreFields...); diff != "" { t.Errorf("presentAsUserMessage() wrong result (+got,-want):\ngot = %+v\nwant = %+v\ndiff = %v", got, tc.want, diff) } }) } } ================================================ FILE: agent/run_config.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent // StreamingMode defines the streaming mode for agent execution. type StreamingMode string const ( // StreamingModeNone indicates no streaming. StreamingModeNone StreamingMode = "none" // StreamingModeSSE enables server-sent events streaming, one-way, where // LLM response parts are streamed immediately as they are generated. StreamingModeSSE StreamingMode = "sse" ) // RunConfig controls runtime behavior of an agent. type RunConfig struct { // StreamingMode defines the streaming mode for an agent. StreamingMode StreamingMode // If true, ADK runner will save each part of the user input that is a blob // (e.g., images, files) as an artifact. SaveInputBlobsAsArtifacts bool } ================================================ FILE: agent/workflowagents/loopagent/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package loopagent provides an agent that repeatedly runs its sub-agents for a // specified number of iterations or until termination condition is met. package loopagent import ( "fmt" "iter" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" "google.golang.org/adk/session" ) // Config defines the configuration for a LoopAgent. type Config struct { // Basic agent setup. AgentConfig agent.Config // If MaxIterations == 0, then LoopAgent runs indefinitely or until any // sub-agent escalates. MaxIterations uint } // New creates a LoopAgent. // // LoopAgent repeatedly runs its sub-agents in sequence for a specified number // of iterations or until a termination condition is met. // // Use the LoopAgent when your workflow involves repetition or iterative // refinement, such as like revising code. func New(cfg Config) (agent.Agent, error) { if cfg.AgentConfig.Run != nil { return nil, fmt.Errorf("LoopAgent doesn't allow custom Run implementations") } loopAgentImpl := &loopAgent{ maxIterations: cfg.MaxIterations, } cfg.AgentConfig.Run = loopAgentImpl.Run loopAgent, err := agent.New(cfg.AgentConfig) if err != nil { return nil, fmt.Errorf("failed to create base agent: %w", err) } internalAgent, ok := loopAgent.(agentinternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to internal agent") } state := agentinternal.Reveal(internalAgent) state.AgentType = agentinternal.TypeLoopAgent state.Config = cfg return loopAgent, nil } type loopAgent struct { maxIterations uint } func (a *loopAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { count := a.maxIterations return func(yield func(*session.Event, error) bool) { for { shouldExit := false for _, subAgent := range ctx.Agent().SubAgents() { for event, err := range subAgent.Run(ctx) { // TODO: ensure consistency -- if there's an error, return and close iterator, verify everywhere in ADK. if !yield(event, err) { return } if event != nil && event.Actions.Escalate { shouldExit = true } } if shouldExit { return } } if count > 0 { count-- if count == 0 { return } } } } } ================================================ FILE: agent/workflowagents/loopagent/agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package loopagent_test import ( "context" "fmt" "iter" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) func TestNewLoopAgent(t *testing.T) { type args struct { maxIterations uint subAgents []agent.Agent } tests := []struct { name string args args wantEvents []*session.Event wantErr bool }{ { name: "infinite loop", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{}, }, }, }, { name: "loop agent with max iterations", args: args{ maxIterations: 1, subAgents: []agent.Agent{newCustomAgent(t, 0)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{}, }, }, }, { name: "loop agent with max iterations and 2 sub agents", args: args{ maxIterations: 1, subAgents: []agent.Agent{newCustomAgent(t, 0), newCustomAgent(t, 1)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{}, }, { Author: "custom_agent_1", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 1"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{}, }, }, }, { name: "loop with escalate function returns sumarization", args: args{ maxIterations: 2, subAgents: []agent.Agent{newLmmAgentWithFunctionCall(t, 0, false), newCustomAgent(t, 1)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionCall("exampleFunction", make(map[string]any), genai.RoleModel), }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionResponse("exampleFunction", make(map[string]any), genai.RoleUser), }, Actions: session.EventActions{ Escalate: true, StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, { name: "loop with escalate function returns sumarization", args: args{ maxIterations: 2, subAgents: []agent.Agent{newLmmAgentWithFunctionCall(t, 0, true), newCustomAgent(t, 1)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionCall("exampleFunction", make(map[string]any), genai.RoleModel), }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionResponse("exampleFunction", make(map[string]any), genai.RoleUser), }, Actions: session.EventActions{ Escalate: true, SkipSummarization: true, StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() loopAgent, err := loopagent.New(loopagent.Config{ MaxIterations: tt.args.maxIterations, AgentConfig: agent.Config{ Name: "test_agent", SubAgents: tt.args.subAgents, }, }) if (err != nil) != tt.wantErr { t.Errorf("NewLoopAgent() error = %v, wantErr %v", err, tt.wantErr) return } var gotEvents []*session.Event sessionService := session.InMemoryService() agentRunner, err := runner.New(runner.Config{ AppName: "test_app", Agent: loopAgent, SessionService: sessionService, }) if err != nil { t.Fatal(err) } _, err = sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "user_id", SessionID: "session_id", }) if err != nil { t.Fatal(err) } for event, err := range agentRunner.Run(ctx, "user_id", "session_id", genai.NewContentFromText("user input", genai.RoleUser), agent.RunConfig{}) { if err != nil { t.Errorf("got unexpected error: %v", err) } if tt.args.maxIterations == 0 && len(gotEvents) == len(tt.wantEvents) { break } gotEvents = append(gotEvents, event) } if len(tt.wantEvents) != len(gotEvents) { t.Fatalf("Unexpected event length, got: %v, want: %v", len(gotEvents), len(tt.wantEvents)) } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID", "InvocationID", "Timestamp"), cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID"), } for i, gotEvent := range gotEvents { tt.wantEvents[i].Timestamp = gotEvent.Timestamp if diff := cmp.Diff(tt.wantEvents[i], gotEvent, ignoreFields...); diff != "" { t.Errorf("event[%v] mismatch (-want +got):\n%s", i, diff) } } }) } } func newCustomAgent(t *testing.T, id int) agent.Agent { t.Helper() customAgent := &customAgent{ id: id, } a, err := agent.New(agent.Config{ Name: fmt.Sprintf("custom_agent_%v", id), Run: customAgent.Run, }) if err != nil { t.Fatal(err) } return a } // TODO: create test util allowing to create custom agents, agent trees for type customAgent struct { id int callCounter int } func (a *customAgent) Run(agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { a.callCounter++ yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText(fmt.Sprintf("hello %v", a.id), genai.RoleModel), }, }, nil) } } type EmptyArgs struct{} func exampleFunctionThatEscalates(ctx tool.Context, myArgs EmptyArgs) (map[string]string, error) { ctx.Actions().Escalate = true ctx.Actions().SkipSummarization = false return map[string]string{}, nil } func exampleFunctionThatEscalatesAndSkips(ctx tool.Context, myArgs EmptyArgs) (map[string]string, error) { ctx.Actions().Escalate = true ctx.Actions().SkipSummarization = true return map[string]string{}, nil } func newLmmAgentWithFunctionCall(t *testing.T, id int, skipSummarization bool) agent.Agent { t.Helper() exampleFunction := exampleFunctionThatEscalates if skipSummarization { exampleFunction = exampleFunctionThatEscalatesAndSkips } exampleFunctionThatEscalatesTool, err := functiontool.New(functiontool.Config{ Name: "exampleFunction", Description: "Call this function to escalate\n", }, exampleFunction) if err != nil { t.Fatalf("error creating exampleFunction tool: %s", err) } customAgent, err := llmagent.New(llmagent.Config{ Name: fmt.Sprintf("custom_agent_%v", id), Model: &FakeLLM{id: id, callCounter: 0, skipSummarization: skipSummarization}, Tools: []tool.Tool{exampleFunctionThatEscalatesTool}, }) if err != nil { t.Fatal(err) } return customAgent } // FakeLLM is a mock implementation of model.LLM for testing. type FakeLLM struct { id int callCounter int skipSummarization bool } func (f *FakeLLM) Name() string { return "fake-llm" } func (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { f.callCounter++ if len(req.Contents) == 1 { if !yield(&model.LLMResponse{ Content: genai.NewContentFromFunctionCall("exampleFunction", make(map[string]any), genai.RoleModel), }, nil) { return } } else { if !yield(&model.LLMResponse{ Content: genai.NewContentFromText(fmt.Sprintf("hello %v", f.id), genai.RoleModel), }, nil) { return } } } } ================================================ FILE: agent/workflowagents/parallelagent/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package parallelagent provides an agent that runs its sub-agents in parallel. package parallelagent import ( "fmt" "iter" "golang.org/x/sync/errgroup" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/session" ) // Config defines the configuration for a ParallelAgent. type Config struct { // Basic agent setup. AgentConfig agent.Config } // New creates a ParallelAgent. // // Parallel agent runs its sub-agents in parallel in isolated manner. // // This approach is beneficial for scenarios requiring multiple perspectives or // attempts on a single task, such as: // - Running different algorithms simultaneously. // - Generating multiple responses for review by a subsequent evaluation agent. func New(cfg Config) (agent.Agent, error) { if cfg.AgentConfig.Run != nil { return nil, fmt.Errorf("ParallelAgent doesn't allow custom Run implementations") } cfg.AgentConfig.Run = run parallelAgent, err := agent.New(cfg.AgentConfig) if err != nil { return nil, err } internalAgent, ok := parallelAgent.(agentinternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to internal agent") } state := agentinternal.Reveal(internalAgent) state.AgentType = agentinternal.TypeParallelAgent state.Config = cfg return parallelAgent, nil } func run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { curAgent := ctx.Agent() var ( errGroup, errGroupCtx = errgroup.WithContext(ctx) doneChan = make(chan bool) resultsChan = make(chan result) ) for _, sa := range ctx.Agent().SubAgents() { branch := fmt.Sprintf("%s.%s", curAgent.Name(), sa.Name()) if ctx.Branch() != "" { branch = fmt.Sprintf("%s.%s", ctx.Branch(), branch) } subAgent := sa errGroup.Go(func() error { subCtx := icontext.NewInvocationContext(errGroupCtx, icontext.InvocationContextParams{ Artifacts: ctx.Artifacts(), Memory: ctx.Memory(), Session: ctx.Session(), Branch: branch, Agent: subAgent, UserContent: ctx.UserContent(), RunConfig: ctx.RunConfig(), InvocationID: ctx.InvocationID(), }) if err := runSubAgent(subCtx, subAgent, resultsChan, doneChan); err != nil { return fmt.Errorf("failed to run sub-agent %q: %w", subAgent.Name(), err) } return nil }) } go func() { if err := errGroup.Wait(); err != nil { select { case resultsChan <- result{err: err}: case <-doneChan: } } close(resultsChan) }() return func(yield func(*session.Event, error) bool) { defer close(doneChan) for res := range resultsChan { shouldContinue := yield(res.event, res.err) // Signal sub-agent that event processing (including session append) is complete if res.ackChan != nil { close(res.ackChan) } if !shouldContinue { break } } } } func runSubAgent(ctx agent.InvocationContext, agent agent.Agent, results chan<- result, done <-chan bool) error { for event, err := range agent.Run(ctx) { if err != nil { return err } ackChan := make(chan struct{}) select { case <-done: return nil case <-ctx.Done(): return ctx.Err() case results <- result{ event: event, ackChan: ackChan, }: // Wait for runner to finish processing before continuing to next iteration select { case <-ackChan: case <-done: return nil case <-ctx.Done(): return ctx.Err() } } } return nil } type result struct { event *session.Event err error ackChan chan struct{} } ================================================ FILE: agent/workflowagents/parallelagent/agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package parallelagent_test import ( "context" "fmt" "iter" rand "math/rand/v2" "net/http" "path/filepath" "slices" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/internal/httprr" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) const modelName = "gemini-2.5-flash" func TestNewParallelAgent(t *testing.T) { tests := []struct { name string maxIterations uint numSubAgents int agentError error // one of the subAgents will return this error cancelContext bool wantEvents []*session.Event wantErr bool }{ { name: "subagents complete run", maxIterations: 2, numSubAgents: 3, wantEvents: func() []*session.Event { var res []*session.Event for agentID := 1; agentID <= 3; agentID++ { for responseCount := 1; responseCount <= 2; responseCount++ { res = append(res, &session.Event{ Author: fmt.Sprintf("sub%d", agentID), LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText(fmt.Sprintf("hello %d", agentID)), }, Role: genai.RoleModel, }, }, }) } } return res }(), }, { name: "handle ctx cancel", // terminates infinite agent loop maxIterations: 0, cancelContext: true, wantErr: true, }, { // one agent returns error, other agents run infinitely name: "agent returns error", maxIterations: 0, numSubAgents: 100, agentError: fmt.Errorf("agent error"), wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() ctx := t.Context() parallelAgent := newParallelAgent(t, tt.maxIterations, tt.numSubAgents, tt.agentError) var gotEvents []*session.Event sessionService := session.InMemoryService() agentRunner, err := runner.New(runner.Config{ AppName: "test_app", Agent: parallelAgent, SessionService: sessionService, }) if err != nil { t.Fatal(err) } _, err = sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "user_id", SessionID: "session_id", }) if err != nil { t.Fatal(err) } ctx, cancel := context.WithCancel(ctx) defer cancel() if tt.cancelContext { go func() { time.Sleep(5 * time.Millisecond) cancel() }() } for event, err := range agentRunner.Run(ctx, "user_id", "session_id", genai.NewContentFromText("user input", genai.RoleUser), agent.RunConfig{}) { if tt.wantErr != (err != nil) { if tt.cancelContext && err == nil { // In case of context cancellation some events can be processed before cancel is applied. continue } if tt.agentError != nil && err == nil { // In case of agent error some events from other agents can be processed before error is returned. continue } t.Errorf("got unexpected error: %v", err) } gotEvents = append(gotEvents, event) } if tt.wantEvents != nil { eventCompareFunc := func(e1, e2 *session.Event) int { if e1.Author <= e2.Author { return -1 } if e1.Author == e2.Author { return 0 } return 1 } slices.SortFunc(tt.wantEvents, eventCompareFunc) slices.SortFunc(gotEvents, eventCompareFunc) if diff := cmp.Diff(tt.wantEvents, gotEvents); diff != "" { t.Errorf("events mismatch (-want +got):\n%s", diff) } } }) } } // newParallelAgent creates parallel agent with 2 subagents emitting maxIterations events or infinitely if maxIterations==0. func newParallelAgent(t *testing.T, maxIterations uint, numSubAgents int, agentErr error) agent.Agent { var subAgents []agent.Agent for i := 1; i <= numSubAgents; i++ { subAgents = append(subAgents, must(loopagent.New(loopagent.Config{ MaxIterations: maxIterations, AgentConfig: agent.Config{ Name: fmt.Sprintf("loop_agent_%d", i), SubAgents: []agent.Agent{ must(agent.New(agent.Config{ Name: fmt.Sprintf("sub%d", i), Run: customRun(i, nil), }, )), }, }, }))) } if agentErr != nil { subAgents = append(subAgents, must(agent.New(agent.Config{ Name: "error_agent", Run: customRun(-1, agentErr), }))) } agent, err := parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "test_agent", SubAgents: subAgents, }, }) if err != nil { t.Fatal(err) } return agent } func must[T agent.Agent](a T, err error) T { if err != nil { panic(err) } return a } func customRun(id int, agentErr error) func(agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { time.Sleep((time.Duration(rand.IntN(5) + 1)) * time.Millisecond) if agentErr != nil { yield(nil, agentErr) return } yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText(fmt.Sprintf("hello %v", id), genai.RoleModel), }, }, nil) } } } func TestParallelAgentWithTools(t *testing.T) { agent1 := createAgentWithGemini(t, "agent1") agent2 := createAgentWithGemini(t, "agent2") parallelAgent, err := parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "parallel_test", SubAgents: []agent.Agent{agent1, agent2}, }, }) if err != nil { t.Fatalf("Failed to create parallel agent: %v", err) } runner := testutil.NewTestAgentRunner(t, parallelAgent) stream := runner.Run(t, "test_session", "Search for AI news") events, err := testutil.CollectEvents(stream) if err != nil { t.Fatalf("Agent run failed: %v", err) } if len(events) < 2 { t.Errorf("Expected at least 2 events from parallel agents, got %d", len(events)) } // Count FunctionCall and FunctionResponse events per branch branchCalls := make(map[string]int) branchResponses := make(map[string]int) for _, ev := range events { branch := ev.Branch if ev.LLMResponse.Content != nil { for _, part := range ev.LLMResponse.Content.Parts { if part.FunctionCall != nil { branchCalls[branch]++ } if part.FunctionResponse != nil { branchResponses[branch]++ } } } } for branch, calls := range branchCalls { responses := branchResponses[branch] if calls > responses { t.Errorf("Branch %s: session has %d FunctionCalls but only %d FunctionResponses. "+ "This indicates race condition: agent read session before FunctionResponse was appended.", branch, calls, responses) } } } func createAgentWithGemini(t *testing.T, name string) agent.Agent { t.Helper() searchTool, err := functiontool.New( functiontool.Config{ Name: fmt.Sprintf("search_tool_%s", name), Description: "Search for information on the web", }, func(ctx tool.Context, args struct{ Query string }) (string, error) { return fmt.Sprintf("search result for '%s' from %s", args.Query, name), nil }, ) if err != nil { t.Fatalf("Failed to create search tool: %v", err) } analyzeTool, err := functiontool.New( functiontool.Config{ Name: fmt.Sprintf("analyze_tool_%s", name), Description: "Analyze data and return insights", }, func(ctx tool.Context, args struct{ Data string }) (string, error) { return fmt.Sprintf("analysis result for '%s' from %s", args.Data, name), nil }, ) if err != nil { t.Fatalf("Failed to create analyze tool: %v", err) } model := newGeminiModelForTest(t, modelName, name) a, err := llmagent.New(llmagent.Config{ Name: name, Description: fmt.Sprintf("Test agent %s that searches for information", name), Model: model, Tools: []tool.Tool{searchTool, analyzeTool}, Instruction: "Use the search tool to find information, then provide a brief response.", }) if err != nil { t.Fatalf("Failed to create agent %s: %v", name, err) } return a } func newGeminiModelForTest(t *testing.T, modelName, agentName string) model.LLM { t.Helper() trace := filepath.Join("testdata", fmt.Sprintf("%s_%s.httprr", strings.ReplaceAll(t.Name(), "/", "_"), agentName)) apiKey := "fakeKey" transport, recording := newGeminiTestTransport(t, trace) if recording { apiKey = "" } model, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{ HTTPClient: &http.Client{Transport: transport}, APIKey: apiKey, }) if err != nil { t.Fatalf("Failed to create Gemini model: %v", err) } return model } func newGeminiTestTransport(t *testing.T, rrfile string) (http.RoundTripper, bool) { t.Helper() rr, err := testutil.NewGeminiTransport(rrfile) if err != nil { t.Fatal(err) } recording, _ := httprr.Recording(rrfile) return rr, recording } // TestParallelAgent_PropagatesContextError verifies that if the context is canceled, // the iterator yields the error from errgroup.Wait(). func TestParallelAgent_PropagatesContextError(t *testing.T) { t.Parallel() // Create a sub-agent that yields an event and then waits. // We want to trigger runSubAgent returning ctx.Err(). subAgent := must(agent.New(agent.Config{ Name: "yielder", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // Yield one event so we engage runSubAgent logic if !yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, }, nil) { return } // Wait for context cancellation <-ctx.Done() } }, })) parallelAgent, err := parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "parallel_agent", SubAgents: []agent.Agent{subAgent}, }, }) if err != nil { t.Fatal(err) } spy := &spyAgent{Agent: parallelAgent} ctx, cancel := context.WithCancel(t.Context()) sessionService := session.InMemoryService() _, _ = sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "user_id", SessionID: "session_id", }) r, err := runner.New(runner.Config{ AppName: "test_app", Agent: spy, SessionService: sessionService, }) if err != nil { t.Fatal(err) } go func() { // Wait a tiny bit to ensure we started time.Sleep(10 * time.Millisecond) cancel() }() for range r.Run(ctx, "user_id", "session_id", genai.NewContentFromText("hi", genai.RoleUser), agent.RunConfig{}) { // Simulate processing delay so that ackChan takes time, // increasing chance runSubAgent is blocked on ackChan when cancel happens? time.Sleep(100 * time.Millisecond) } if spy.yieldedError == nil { t.Fatal("Expected parallelAgent to yield an error (e.g. context canceled), but it yielded nil") } t.Logf("Yielded error: %v", spy.yieldedError) } type spyAgent struct { agent.Agent yieldedError error } func (s *spyAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { next := s.Agent.Run(ctx) return func(yield func(*session.Event, error) bool) { for event, err := range next { if err != nil { s.yieldedError = err } if !yield(event, err) { return } } } } func TestParallelAgent_StateSync(t *testing.T) { ctx := t.Context() var gotValue any var gotErr error subAgent, err := agent.New(agent.Config{ Name: "test_subagent", Run: func(agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { event := &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", genai.RoleModel), }, Actions: session.EventActions{ StateDelta: map[string]any{"test_key": "test_value"}, }, } yield(event, nil) } }, AfterAgentCallbacks: []agent.AfterAgentCallback{ func(c agent.CallbackContext) (*genai.Content, error) { gotValue, gotErr = c.State().Get("test_key") return nil, nil }, }, }) if err != nil { t.Fatal(err) } parallelAgent, err := parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "test_parallel_agent", SubAgents: []agent.Agent{subAgent}, }, }) if err != nil { t.Fatal(err) } sessionService := session.InMemoryService() agentRunner, err := runner.New(runner.Config{ AppName: "test_app", Agent: parallelAgent, SessionService: sessionService, }) if err != nil { t.Fatal(err) } _, err = sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "user_id", SessionID: "session_id", }) if err != nil { t.Fatal(err) } for _, err := range agentRunner.Run(ctx, "user_id", "session_id", genai.NewContentFromText("user input", genai.RoleUser), agent.RunConfig{}) { if err != nil { t.Fatal(err) } } if gotErr != nil { t.Fatalf("expected to get value from state, got error: %v", gotErr) } if gotValue != "test_value" { t.Fatalf("expected state value 'test_value', got %v", gotValue) } } ================================================ FILE: agent/workflowagents/parallelagent/testdata/TestParallelAgentWithTools_agent1.httprr ================================================ httprr trace v1 1127 1361 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 895 Content-Type: application/json {"contents":[{"parts":[{"text":"Search for AI news"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"Use the search tool to find information, then provide a brief response.\n\nYou are an agent. Your internal name is \"agent1\". The description about you is \"Test agent agent1 that searches for information\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"Search for information on the web","name":"search_tool_agent1","parametersJsonSchema":{"additionalProperties":false,"properties":{"Query":{"type":"string"}},"required":["Query"],"type":"object"},"responseJsonSchema":{"type":"string"}},{"description":"Analyze data and return insights","name":"analyze_tool_agent1","parametersJsonSchema":{"additionalProperties":false,"properties":{"Data":{"type":"string"}},"required":["Data"],"type":"object"},"responseJsonSchema":{"type":"string"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:10:09 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=839 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "search_tool_agent1", "args": { "Query": "AI news" } }, "thoughtSignature": "Cs4BAb4+9vs/4CDsMN0qNsrfQFxWS9FvZlzpMygp9/H8v7tHgE7QyJQQND6DgpT7KC5MPOLDWDfE1fBKCe300RWjHUy7Uu7kCaXjLq4vX1ob5IURvlj0wIjyQsNOGOwmLWdjW3Fz/HUQGsi3Y8tVKGkt7e+f80C88cFrC8DKIpOtGw9HhJjGBBoXfGyZ50d+od5M1czN5oNOqSYIQ91F5BbZO7CigLdb+VvgFP/nUMJIpd6SKEO/i6qX8u5zU/hX52GG7S1kx3IwtPS7U9uRNEg=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 130, "candidatesTokenCount": 19, "totalTokenCount": 194, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 130 } ], "thoughtsTokenCount": 45 }, "modelVersion": "gemini-2.5-flash", "responseId": "QCawaf6pHYiEkdUP_4aqmAU" } 1672 1285 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1439 Content-Type: application/json {"contents":[{"parts":[{"text":"Search for AI news"}],"role":"user"},{"parts":[{"functionCall":{"args":{"Query":"AI news"},"name":"search_tool_agent1"},"thoughtSignature":"Cs4BAb4+9vs/4CDsMN0qNsrfQFxWS9FvZlzpMygp9/H8v7tHgE7QyJQQND6DgpT7KC5MPOLDWDfE1fBKCe300RWjHUy7Uu7kCaXjLq4vX1ob5IURvlj0wIjyQsNOGOwmLWdjW3Fz/HUQGsi3Y8tVKGkt7e+f80C88cFrC8DKIpOtGw9HhJjGBBoXfGyZ50d+od5M1czN5oNOqSYIQ91F5BbZO7CigLdb+VvgFP/nUMJIpd6SKEO/i6qX8u5zU/hX52GG7S1kx3IwtPS7U9uRNEg="}],"role":"model"},{"parts":[{"functionResponse":{"name":"search_tool_agent1","response":{"result":"search result for 'AI news' from agent1"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"Use the search tool to find information, then provide a brief response.\n\nYou are an agent. Your internal name is \"agent1\". The description about you is \"Test agent agent1 that searches for information\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"Search for information on the web","name":"search_tool_agent1","parametersJsonSchema":{"additionalProperties":false,"properties":{"Query":{"type":"string"}},"required":["Query"],"type":"object"},"responseJsonSchema":{"type":"string"}},{"description":"Analyze data and return insights","name":"analyze_tool_agent1","parametersJsonSchema":{"additionalProperties":false,"properties":{"Data":{"type":"string"}},"required":["Data"],"type":"object"},"responseJsonSchema":{"type":"string"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:10:10 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1082 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Here is the search result for AI news: search result for 'AI news' from agent1.", "thoughtSignature": "Cu4BAb4+9vtaTYs8CebYXN1nfuRbiQBmXSWp58SnOAbDC1F68YwGLpA16BfNWyIn68p7gnkut9YA1iGf5jeverwXhK1bzyJKS9nVIeZlPsihCJEaMtHxt/G/gAKrIL9e9QJ9PBjNUWrKclT1l58vOUcF+nm45mgeRbVj7gcxAlM5xnCLnokBeR05H38P3PX9zYQeWv5fWHkDmSW1bhzj89mnVdjTWtsYMvjuveOzCjF2TDriPaa9Iq8ss5NRWNMcIfqZhRCQYmn6rK9yXTS//JlpxxleNVMZ865QcKku2mYTimymfGXE+bA6Jp6H7i3Ddg==" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 176, "candidatesTokenCount": 20, "totalTokenCount": 238, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 176 } ], "thoughtsTokenCount": 42 }, "modelVersion": "gemini-2.5-flash", "responseId": "QSawacavC4jp7M8P3JPTmAo" } ================================================ FILE: agent/workflowagents/parallelagent/testdata/TestParallelAgentWithTools_agent2.httprr ================================================ httprr trace v1 1127 1537 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 895 Content-Type: application/json {"contents":[{"parts":[{"text":"Search for AI news"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"Use the search tool to find information, then provide a brief response.\n\nYou are an agent. Your internal name is \"agent2\". The description about you is \"Test agent agent2 that searches for information\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"Search for information on the web","name":"search_tool_agent2","parametersJsonSchema":{"additionalProperties":false,"properties":{"Query":{"type":"string"}},"required":["Query"],"type":"object"},"responseJsonSchema":{"type":"string"}},{"description":"Analyze data and return insights","name":"analyze_tool_agent2","parametersJsonSchema":{"additionalProperties":false,"properties":{"Data":{"type":"string"}},"required":["Data"],"type":"object"},"responseJsonSchema":{"type":"string"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:10:09 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=839 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "search_tool_agent2", "args": { "Query": "AI news" } }, "thoughtSignature": "CtICAb4+9vtlb0gcS4vqZ08t7q9ey+1CXWXyovOKA2owAQsWvdbT4bXw7XN7ebSC4pkLTSQnH7uJEKmhn/fhW1as+hykHUqV/MeKN29HBLrY+h1U6GMRjbY6ORp+V+yA/H1k7ugH4TPeFMhZXKV7R3ioZx2Qc1EFP5KnEe5QoJcbaDITPb3UCLgTBSK29DfhhS5yaDrrXniRiHrjeROrBCgOYmhPp+/B7mgpg2s+QYHN5dzJZHzfxSAKT0TsuzJYLlF0lFk+jSmQWahPQPxyLpGlimzP8nehd+vFn1JUog54+0pSS81K7kgVPg9BwIWbUQiTWMyi+H9R3lIcPcWS93WNWRt9dDGoiq8+pI/dTn+ML/WD6eUqYJ5LaniZrkWaVWKw82Q54Vk9aYOX7WvTn+Yqx08I5sFZj0NM79KZjuvMe4v2lNkyGSBwEHUQmJqQuuzoMVs=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 130, "candidatesTokenCount": 19, "totalTokenCount": 229, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 130 } ], "thoughtsTokenCount": 80 }, "modelVersion": "gemini-2.5-flash", "responseId": "QCawafHoFpHrnsEPpaTr2Qw" } 1848 895 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1615 Content-Type: application/json {"contents":[{"parts":[{"text":"Search for AI news"}],"role":"user"},{"parts":[{"functionCall":{"args":{"Query":"AI news"},"name":"search_tool_agent2"},"thoughtSignature":"CtICAb4+9vtlb0gcS4vqZ08t7q9ey+1CXWXyovOKA2owAQsWvdbT4bXw7XN7ebSC4pkLTSQnH7uJEKmhn/fhW1as+hykHUqV/MeKN29HBLrY+h1U6GMRjbY6ORp+V+yA/H1k7ugH4TPeFMhZXKV7R3ioZx2Qc1EFP5KnEe5QoJcbaDITPb3UCLgTBSK29DfhhS5yaDrrXniRiHrjeROrBCgOYmhPp+/B7mgpg2s+QYHN5dzJZHzfxSAKT0TsuzJYLlF0lFk+jSmQWahPQPxyLpGlimzP8nehd+vFn1JUog54+0pSS81K7kgVPg9BwIWbUQiTWMyi+H9R3lIcPcWS93WNWRt9dDGoiq8+pI/dTn+ML/WD6eUqYJ5LaniZrkWaVWKw82Q54Vk9aYOX7WvTn+Yqx08I5sFZj0NM79KZjuvMe4v2lNkyGSBwEHUQmJqQuuzoMVs="}],"role":"model"},{"parts":[{"functionResponse":{"name":"search_tool_agent2","response":{"result":"search result for 'AI news' from agent2"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"Use the search tool to find information, then provide a brief response.\n\nYou are an agent. Your internal name is \"agent2\". The description about you is \"Test agent agent2 that searches for information\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"Search for information on the web","name":"search_tool_agent2","parametersJsonSchema":{"additionalProperties":false,"properties":{"Query":{"type":"string"}},"required":["Query"],"type":"object"},"responseJsonSchema":{"type":"string"}},{"description":"Analyze data and return insights","name":"analyze_tool_agent2","parametersJsonSchema":{"additionalProperties":false,"properties":{"Data":{"type":"string"}},"required":["Data"],"type":"object"},"responseJsonSchema":{"type":"string"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:10:10 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=917 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "I found some AI news for you. Would you like me to analyze it or something else?" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 176, "candidatesTokenCount": 19, "totalTokenCount": 195, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 176 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "QSawad76G9v6nsEP1paPoAU" } ================================================ FILE: agent/workflowagents/sequentialagent/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package sequentialagent provides an agent that runs its sub-agents in a sequence. package sequentialagent import ( "fmt" "iter" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" "google.golang.org/adk/session" ) // New creates a SequentialAgent. // // SequentialAgent executes its sub-agents once, in the order they are listed. // // Use the SequentialAgent when you want the execution to occur in a fixed, // strict order. func New(cfg Config) (agent.Agent, error) { if cfg.AgentConfig.Run != nil { return nil, fmt.Errorf("LoopAgent doesn't allow custom Run implementations") } sequentialAgentImpl := &sequentialAgent{} cfg.AgentConfig.Run = sequentialAgentImpl.Run sequentialAgent, err := agent.New(cfg.AgentConfig) if err != nil { return nil, fmt.Errorf("failed to create base agent: %w", err) } internalAgent, ok := sequentialAgent.(agentinternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to internal agent") } state := agentinternal.Reveal(internalAgent) state.AgentType = agentinternal.TypeSequentialAgent state.Config = cfg return sequentialAgent, nil } // Config defines the configuration for a SequentialAgent. type Config struct { // Basic agent setup. AgentConfig agent.Config } type sequentialAgent struct{} func (a *sequentialAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { for _, subAgent := range ctx.Agent().SubAgents() { for event, err := range subAgent.Run(ctx) { // TODO: ensure consistency -- if there's an error, return and close iterator, verify everywhere in ADK. if !yield(event, err) { return } } } } } ================================================ FILE: agent/workflowagents/sequentialagent/agent_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package sequentialagent_test import ( "context" "fmt" "iter" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) func TestNewSequentialAgent(t *testing.T) { type args struct { maxIterations uint subAgents []agent.Agent } sameAgent := newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, "same_agent") tests := []struct { name string args args wantEvents []*session.Event wantErr bool wantErrMessage string }{ { name: "ok", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), newCustomAgent(t, 1)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_1", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 1"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, { name: "ok with inner sequential", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, "test_agent1"), newCustomAgent(t, 3)}, }, wantEvents: []*session.Event{ { Author: "custom_agent_0", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 0"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_1", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 1"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_2", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 2"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, { Author: "custom_agent_3", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("hello 3"), }, Role: genai.RoleModel, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, }, }, }, { name: "err with inner sequential with same name as root", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, "test_agent1"), newCustomAgent(t, 3)}, }, wantErr: true, wantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: "test_agent"`, }, { name: "err with 2 levels of inner sequential with same name as root ", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{ newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, "test_agent1"), }, "test_agent"), newCustomAgent(t, 3)}, }, wantErr: true, wantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: "test_agent"`, }, { name: "err with 2 levels of inner sequential with same name as parent ", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{ newSequentialAgent(t, []agent.Agent{newCustomAgent(t, 1), newCustomAgent(t, 2)}, "test_agent1"), }, "test_agent1"), newCustomAgent(t, 3)}, }, wantErr: true, wantErrMessage: `failed to create agent tree: agent names must be unique in the agent tree, found duplicate: "test_agent1"`, }, { name: "err with repeated inner sequential", args: args{ maxIterations: 0, subAgents: []agent.Agent{newCustomAgent(t, 0), sameAgent, sameAgent, newCustomAgent(t, 3)}, }, wantErr: true, wantErrMessage: `failed to create base agent: error creating agent: subagent "same_agent" appears multiple times in subAgents`, }, { name: "err with repeated inner sequential in two levels", args: args{ maxIterations: 0, subAgents: []agent.Agent{ newCustomAgent(t, 0), newSequentialAgent(t, []agent.Agent{sameAgent}, "test_agent1"), sameAgent, newCustomAgent(t, 3), }, }, wantErr: true, wantErrMessage: `failed to create agent tree: "same_agent" agent cannot have >1 parents, found: "test_agent1", "test_agent"`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() sequentialAgent, err := sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "test_agent", SubAgents: tt.args.subAgents, }, }) if err != nil { if !tt.wantErr { t.Errorf("NewSequentialAgent() error = %v, wantErr %v", err, tt.wantErr) } if diff := cmp.Diff(tt.wantErrMessage, err.Error()); diff != "" { t.Errorf("err message mismatch (-want +got):\n%s", diff) } return } var gotEvents []*session.Event sessionService := session.InMemoryService() agentRunner, err := runner.New(runner.Config{ AppName: "test_app", Agent: sequentialAgent, SessionService: sessionService, }) if err != nil { if !tt.wantErr { t.Fatalf("NewSequentialAgent() error = %v, wantErr %v", err, tt.wantErr) } if diff := cmp.Diff(tt.wantErrMessage, err.Error()); diff != "" { t.Fatalf("err message mismatch (-want +got):\n%s", diff) } return } _, err = sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "user_id", SessionID: "session_id", }) if err != nil { t.Fatal(err) } // run twice, the second time it will need to determine which agent to use, and we want to get the same result gotEvents = make([]*session.Event, 0) for range 2 { for event, err := range agentRunner.Run(ctx, "user_id", "session_id", genai.NewContentFromText("user input", genai.RoleUser), agent.RunConfig{}) { if err != nil { t.Errorf("got unexpected error: %v", err) } if tt.args.maxIterations == 0 && len(gotEvents) == len(tt.wantEvents) { break } gotEvents = append(gotEvents, event) } if len(tt.wantEvents) != len(gotEvents) { t.Fatalf("Unexpected event length, got: %v, want: %v", len(gotEvents), len(tt.wantEvents)) } for i, gotEvent := range gotEvents { tt.wantEvents[i].Timestamp = gotEvent.Timestamp if diff := cmp.Diff(tt.wantEvents[i], gotEvent, cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID")); diff != "" { t.Errorf("event[i] mismatch (-want +got):\n%s", diff) } } } }) } } func newCustomAgent(t *testing.T, id int) agent.Agent { t.Helper() a, err := llmagent.New(llmagent.Config{ Name: fmt.Sprintf("custom_agent_%v", id), Model: &FakeLLM{id: id, callCounter: 0}, }) if err != nil { t.Fatal(err) } return a } func newSequentialAgent(t *testing.T, subAgents []agent.Agent, name string) agent.Agent { t.Helper() sequentialAgent, err := sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: name, SubAgents: subAgents, }, }) if err != nil { t.Fatalf("NewSequentialAgent() error = %v", err) } return sequentialAgent } // FakeLLM is a mock implementation of model.LLM for testing. type FakeLLM struct { id int callCounter int } func (f *FakeLLM) Name() string { return "fake-llm" } func (f *FakeLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { f.callCounter++ yield(&model.LLMResponse{ Content: genai.NewContentFromText(fmt.Sprintf("hello %v", f.id), genai.RoleModel), }, nil) } } ================================================ FILE: artifact/artifact_key_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact import ( "testing" "github.com/google/go-cmp/cmp" ) func TestArtifactKey(t *testing.T) { key := artifactKey{ AppName: "testapp", UserID: "testuser", SessionID: "testsession", FileName: "testfile", Version: 123, } var key2 artifactKey err := key2.Decode(key.Encode()) if err != nil { t.Fatalf("error decoding key:%s", err) } if diff := cmp.Diff(key, key2); diff != "" { t.Errorf("key mismatch (-want +got):\n%s", diff) } } ================================================ FILE: artifact/gcsartifact/gcs_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcsartifact import ( "context" "io" "cloud.google.com/go/storage" ) // ------------------------ Defining interfaces to enable mocking -------------------------------- // gcsClient is an interface that a gcs client must satisfy. type gcsClient interface { bucket(name string) gcsBucket } // gcsBucket is an interface that a gcs bucket handle must satisfy. type gcsBucket interface { object(name string) gcsObject objects(ctx context.Context, q *storage.Query) gcsObjectIterator } // gcsObject is an interface that a gcs object handle must satisfy. type gcsObject interface { newWriter(ctx context.Context) gcsWriter newReader(ctx context.Context) (io.ReadCloser, error) delete(ctx context.Context) error attrs(ctx context.Context) (*storage.ObjectAttrs, error) } // gcsObjectIterator type gcsObjectIterator interface { next() (*storage.ObjectAttrs, error) } // gcsObjectWriter type gcsWriter interface { io.Writer // Provides Write(p []byte) (n int, err error) io.Closer // Provides Close() error SetContentType(string) } // ---------------------- Wrapper Implementations for Real gcs Types -------------------------------- // gcsClientWrapper wraps a storage.Client to satisfy the gcsClient interface. type gcsClientWrapper struct { client *storage.Client } // Bucket returns a gcsBucketWrapper that satisfies the gcsBucket interface. func (w *gcsClientWrapper) bucket(name string) gcsBucket { return &gcsBucketWrapper{ bucket: w.client.Bucket(name), } } // gcsBucketWrapper wraps a storage.BucketHandle to satisfy the gcsBucket interface. type gcsBucketWrapper struct { bucket *storage.BucketHandle } // Object returns a gcsObjectWrapper that satisfies the gcsObject interface. func (w *gcsBucketWrapper) object(name string) gcsObject { objectHandle := w.bucket.Object(name) return &gcsObjectWrapper{object: objectHandle} } // Objects implements the gcsBucket interface for gcsBucketWrapper. // It directly calls the underlying storage.BucketHandle's Objects method. // The gcsBucketWrapper returns an implementation of the gcsObjectIterator interface. func (w *gcsBucketWrapper) objects(ctx context.Context, q *storage.Query) gcsObjectIterator { // This is the real gcs iterator. realIterator := w.bucket.Objects(ctx, q) // We return a wrapper around the real iterator. return &gcsObjectIteratorWrapper{iter: realIterator} } // gcsObjectWrapper wraps a storage.ObjectHandle to satisfy the gcsObject interface. type gcsObjectWrapper struct { object *storage.ObjectHandle } // NewWriter implements the gcsObject interface for gcsObjectWrapper. func (w *gcsObjectWrapper) newWriter(ctx context.Context) gcsWriter { return &gcsWriterWrapper{w: w.object.NewWriter(ctx)} } // NewReader implements the gcsObject interface for gcsObjectWrapper. func (w *gcsObjectWrapper) newReader(ctx context.Context) (io.ReadCloser, error) { return w.object.NewReader(ctx) } // Delete implements the gcsObject interface for gcsObjectWrapper. func (w *gcsObjectWrapper) delete(ctx context.Context) error { return w.object.Delete(ctx) } // Attrs implements the gcsObject interface for gcsObjectWrapper. func (w *gcsObjectWrapper) attrs(ctx context.Context) (*storage.ObjectAttrs, error) { return w.object.Attrs(ctx) } // Create the wrapper for the real iterator. type gcsObjectIteratorWrapper struct { iter *storage.ObjectIterator } func (w *gcsObjectIteratorWrapper) next() (*storage.ObjectAttrs, error) { return w.iter.Next() } // gcsWriterWrapper wraps the real gcs writer to satisfy our ObjectWriter interface. type gcsWriterWrapper struct { w *storage.Writer } func (g *gcsWriterWrapper) Write(p []byte) (n int, err error) { return g.w.Write(p) } func (g *gcsWriterWrapper) Close() error { return g.w.Close() } func (g *gcsWriterWrapper) SetContentType(cType string) { g.w.ContentType = cType } var ( _ gcsClient = (*gcsClientWrapper)(nil) _ gcsBucket = (*gcsBucketWrapper)(nil) _ gcsObject = (*gcsObjectWrapper)(nil) _ gcsObjectIterator = (*gcsObjectIteratorWrapper)(nil) _ gcsWriter = (*gcsWriterWrapper)(nil) ) ================================================ FILE: artifact/gcsartifact/gcs_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gcsartifact import ( "bytes" "context" "io" "io/fs" "strings" "sync" "testing" "time" "cloud.google.com/go/storage" "google.golang.org/api/iterator" "google.golang.org/adk/artifact" "google.golang.org/adk/internal/artifact/tests" ) // newGCSArtifactServiceForTesting creates a gcsService for the specified bucket using a mocked inmemory client func newGCSArtifactServiceForTesting(bucketName string) (artifact.Service, error) { client := newFakeClient() s := &gcsService{ bucketName: bucketName, storageClient: client, bucket: client.bucket(bucketName), } return s, nil } func TestGCSArtifactService(t *testing.T) { factory := func(t *testing.T) (artifact.Service, error) { return newGCSArtifactServiceForTesting("new") } tests.TestArtifactService(t, "GCS", factory) } // ---------------------------------- Mock Implementations ----------------------------------- // fakeClient implements the gcsClient interface for testing. type fakeClient struct { inMemoryBucket gcsBucket } func newFakeClient() gcsClient { return &fakeClient{ inMemoryBucket: &fakeBucket{ objectsMap: make(map[string]*fakeObject), }, } } // Bucket returns the singleton in-memory bucket. func (c *fakeClient) bucket(name string) gcsBucket { return c.inMemoryBucket } // fakeBucket implements the gcsBucket interface for testing. type fakeBucket struct { mu sync.Mutex objectsMap map[string]*fakeObject } // Object returns a fake object from the in-memory store. func (f *fakeBucket) object(name string) gcsObject { f.mu.Lock() defer f.mu.Unlock() if _, ok := f.objectsMap[name]; !ok { f.objectsMap[name] = &fakeObject{name: name} } return f.objectsMap[name] } // Objects simulates iterating over objects with a prefix. func (f *fakeBucket) objects(ctx context.Context, q *storage.Query) gcsObjectIterator { f.mu.Lock() defer f.mu.Unlock() var matchingObjects []*fakeObject for name, obj := range f.objectsMap { if q != nil && q.Prefix != "" && !strings.HasPrefix(name, q.Prefix) { continue } if !obj.deleted { matchingObjects = append(matchingObjects, obj) } } // This is the key change. We return a custom type that has a `Next` method // that manages its own state and returns the correct values. return &fakeObjectIterator{ objects: matchingObjects, index: 0, } } // fakeObject implements the gcsObject interface for testing. type fakeObject struct { mu sync.Mutex name string data []byte deleted bool contentType string } // NewWriter returns a fake writer that stores data in memory. func (f *fakeObject) newWriter(ctx context.Context) gcsWriter { f.mu.Lock() defer f.mu.Unlock() f.deleted = false // A write operation "undeletes" the object f.data = nil // Clear existing data return &fakeWriter{obj: f, buffer: &bytes.Buffer{}} } // Attrs returns fake attributes for the object. func (f *fakeObject) attrs(ctx context.Context) (*storage.ObjectAttrs, error) { f.mu.Lock() defer f.mu.Unlock() if f.deleted || f.data == nil { return nil, storage.ErrObjectNotExist } return &storage.ObjectAttrs{Name: f.name, Created: time.Now(), ContentType: f.contentType}, nil } // Delete marks the object as deleted in memory. func (f *fakeObject) delete(ctx context.Context) error { f.mu.Lock() defer f.mu.Unlock() f.deleted = true return nil } // NewReader returns a reader for the in-memory data. func (f *fakeObject) newReader(ctx context.Context) (io.ReadCloser, error) { f.mu.Lock() defer f.mu.Unlock() if f.deleted || f.data == nil { return nil, fs.ErrNotExist } return io.NopCloser(bytes.NewReader(f.data)), nil } // fakeWriter is a helper type to simulate an *storage.Writer type fakeWriter struct { obj *fakeObject buffer *bytes.Buffer contentType string } func (w *fakeWriter) Write(p []byte) (n int, err error) { return w.buffer.Write(p) } func (w *fakeWriter) Close() error { w.obj.mu.Lock() defer w.obj.mu.Unlock() w.obj.data = w.buffer.Bytes() w.obj.contentType = w.contentType return nil } // SetContentType implements the final piece of the interface. func (w *fakeWriter) SetContentType(cType string) { w.contentType = cType } // fakeObjectIterator is a fake iterator that returns attributes from a slice. // This type is the key to solving the 'unknown field' error. type fakeObjectIterator struct { objects []*fakeObject index int } // Next implements the iterator pattern. // It returns the next object in the slice or an iterator.Done error. func (i *fakeObjectIterator) next() (*storage.ObjectAttrs, error) { if i.index >= len(i.objects) { return nil, iterator.Done } obj := i.objects[i.index] i.index++ return &storage.ObjectAttrs{Name: obj.name, ContentType: obj.contentType}, nil } var ( _ gcsClient = (*fakeClient)(nil) _ gcsBucket = (*fakeBucket)(nil) _ gcsObject = (*fakeObject)(nil) _ gcsObjectIterator = (*fakeObjectIterator)(nil) _ gcsWriter = (*fakeWriter)(nil) ) ================================================ FILE: artifact/gcsartifact/service.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gcsartifact provides a Google Cloud Storage (GCS) [artifact.Service]. // // This package allows storing and retrieving artifacts in a GCS bucket. // Artifacts are organized by application name, user ID, session ID, and filename, // with support for versioning. package gcsartifact import ( "context" "fmt" "io" "io/fs" "maps" "slices" "sort" "strconv" "strings" "cloud.google.com/go/storage" "golang.org/x/sync/errgroup" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/genai" "google.golang.org/adk/artifact" ) // gcsService is a google cloud storage implementation of the Service. type gcsService struct { bucketName string storageClient gcsClient bucket gcsBucket } // NewService creates a Google Cloud Storage service for the specified bucket. func NewService(ctx context.Context, bucketName string, opts ...option.ClientOption) (artifact.Service, error) { storageClient, err := storage.NewClient(ctx, opts...) if err != nil { return nil, fmt.Errorf("failed to create gcs service: %w", err) } // Wrap the real client clientWrapper := &gcsClientWrapper{client: storageClient} s := &gcsService{ bucketName: bucketName, storageClient: clientWrapper, bucket: clientWrapper.bucket(bucketName), } return s, nil } // fileHasUserNamespace checks if a filename indicates a user-namespaced blob. func fileHasUserNamespace(filename string) bool { return strings.HasPrefix(filename, "user:") } // buildBlobName constructs the blob name in GCS. func buildBlobName(appName, userID, sessionID, fileName string, version int64) string { if fileHasUserNamespace(fileName) { return fmt.Sprintf("%s/%s/user/%s/%d", appName, userID, fileName, version) } return fmt.Sprintf("%s/%s/%s/%s/%d", appName, userID, sessionID, fileName, version) } func buildBlobNamePrefix(appName, userID, sessionID, fileName string) string { if fileHasUserNamespace(fileName) { return fmt.Sprintf("%s/%s/user/%s/", appName, userID, fileName) } return fmt.Sprintf("%s/%s/%s/%s/", appName, userID, sessionID, fileName) } func buildSessionPrefix(appName, userID, sessionID string) string { return fmt.Sprintf("%s/%s/%s/", appName, userID, sessionID) } func buildUserPrefix(appName, userID string) string { return fmt.Sprintf("%s/%s/user/", appName, userID) } // Save implements [artifact.Service] func (s *gcsService) Save(ctx context.Context, req *artifact.SaveRequest) (_ *artifact.SaveResponse, err error) { err = req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName newArtifact := req.Part nextVersion := int64(1) // TODO race condition, could use mutex but it's a remote resource so the issue would still occurs // with multiple consumers, and gcs does not have transactions spanning several operations response, err := s.versions(ctx, &artifact.VersionsRequest{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName, }) if err != nil { return nil, fmt.Errorf("failed to list artifact versions: %w", err) } if len(response.Versions) > 0 { nextVersion = slices.Max(response.Versions) + 1 } blobName := buildBlobName(appName, userID, sessionID, fileName, nextVersion) writer := s.bucket.object(blobName).newWriter(ctx) defer func() { if closeErr := writer.Close(); closeErr != nil && err == nil { err = fmt.Errorf("failed to close blob writer: %w", closeErr) } }() if newArtifact.InlineData != nil { writer.SetContentType(newArtifact.InlineData.MIMEType) if _, err := writer.Write(newArtifact.InlineData.Data); err != nil { return nil, fmt.Errorf("failed to write blob to GCS: %w", err) } } else { writer.SetContentType("text/plain") if _, err := writer.Write([]byte(newArtifact.Text)); err != nil { return nil, fmt.Errorf("failed to write text to GCS: %w", err) } } return &artifact.SaveResponse{Version: nextVersion}, nil } // Delete implements [artifact.Service] func (s *gcsService) Delete(ctx context.Context, req *artifact.DeleteRequest) error { err := req.Validate() if err != nil { return fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName version := req.Version // Delete specific version if version != 0 { blobName := buildBlobName(appName, userID, sessionID, fileName, version) if err := s.bucket.object(blobName).delete(ctx); err != nil { return fmt.Errorf("failed to delete artifact: %w", err) } return nil } // Delete all versions response, err := s.versions(ctx, &artifact.VersionsRequest{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName, }) if err != nil { return fmt.Errorf("failed to fetch versions on delete artifact: %w", err) } g, gctx := errgroup.WithContext(ctx) // delete versions in parallel for _, version := range response.Versions { v := version // capture loop variable for goroutine g.Go(func() error { blobName := buildBlobName(appName, userID, sessionID, fileName, v) obj := s.bucket.object(blobName) if err := obj.delete(gctx); err != nil { return fmt.Errorf("failed to delete artifact %s: %w", blobName, err) } return nil // nil error indicates success for this goroutine }) } return g.Wait() } // Load implements [artifact.Service] func (s *gcsService) Load(ctx context.Context, req *artifact.LoadRequest) (_ *artifact.LoadResponse, err error) { err = req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName version := req.Version if version == 0 { response, err := s.versions(ctx, &artifact.VersionsRequest{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, FileName: req.FileName, }) if err != nil { return nil, fmt.Errorf("failed to list artifact versions: %w", err) } if len(response.Versions) == 0 { return nil, fmt.Errorf("artifact not found: %w", fs.ErrNotExist) } version = slices.Max(response.Versions) } blobName := buildBlobName(appName, userID, sessionID, fileName, version) blob := s.bucket.object(blobName) // Check if the blob exists before trying to read it attrs, err := blob.attrs(ctx) if err != nil { if err == storage.ErrObjectNotExist { return nil, fmt.Errorf("artifact '%s' not found: %w", blobName, fs.ErrNotExist) } return nil, fmt.Errorf("could not get blob attributes: %w", err) } // Create a reader to stream the blob's content reader, err := blob.newReader(ctx) if err != nil { return nil, fmt.Errorf("could not create reader for blob '%s': %w", blobName, err) } defer func() { if closeErr := reader.Close(); closeErr != nil && err == nil { err = fmt.Errorf("failed to close blob reader: %w", closeErr) } }() // Read all the content into a byte slice data, err := io.ReadAll(reader) if err != nil { return nil, fmt.Errorf("could not read data from blob '%s': %w", blobName, err) } // Create the genai.Part and return the response. part := genai.NewPartFromBytes(data, attrs.ContentType) return &artifact.LoadResponse{Part: part}, nil } // fetchFilenamesFromPrefix is a reusable helper function. func (s *gcsService) fetchFilenamesFromPrefix(ctx context.Context, prefix string, filenamesSet map[string]bool) error { // Add a guard clause to prevent a panic if a nil map is passed. if filenamesSet == nil { return fmt.Errorf("filenamesSet cannot be nil") } query := &storage.Query{ Prefix: prefix, } // Only fill the attribute Name of the blob, the other attributes will have defaults. err := query.SetAttrSelection([]string{"Name"}) if err != nil { return fmt.Errorf("error setting query attribute selection: %w", err) } blobsIterator := s.bucket.objects(ctx, query) for { blob, err := blobsIterator.next() if err == iterator.Done { break } if err != nil { return fmt.Errorf("error iterating blobs: %w", err) } segments := strings.Split(blob.Name, "/") if len(segments) < 2 { return fmt.Errorf("error iterating blobs: incorrect number of segments in path %q", blob.Name) } // Extract filename from path: appName/userId/sessionId/filename/version or appName/userId/user/filename/version // Note: filenames with path separators are rejected during validation (see service.go Validate methods) filename := segments[len(segments)-2] filenamesSet[filename] = true } return nil } // List implements [artifact.Service] func (s *gcsService) List(ctx context.Context, req *artifact.ListRequest) (*artifact.ListResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID := req.AppName, req.UserID, req.SessionID filenamesSet := map[string]bool{} // Fetch filenames for the session. err = s.fetchFilenamesFromPrefix(ctx, buildSessionPrefix(appName, userID, sessionID), filenamesSet) if err != nil { return nil, fmt.Errorf("failed to fetch session filenames: %w", err) } // Fetch filenames for the user. err = s.fetchFilenamesFromPrefix(ctx, buildUserPrefix(appName, userID), filenamesSet) if err != nil { return nil, fmt.Errorf("failed to fetch user filenames: %w", err) } filenames := slices.Collect(maps.Keys(filenamesSet)) sort.Strings(filenames) return &artifact.ListResponse{FileNames: filenames}, nil } // versions internal function that does not return error if versions are empty func (s *gcsService) versions(ctx context.Context, req *artifact.VersionsRequest) (*artifact.VersionsResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName prefix := buildBlobNamePrefix(appName, userID, sessionID, fileName) query := &storage.Query{ Prefix: prefix, } blobsIterator := s.bucket.objects(ctx, query) versions := make([]int64, 0) for { blob, err := blobsIterator.next() if err == iterator.Done { break } if err != nil { return nil, fmt.Errorf("error iterating blobs: %w", err) } segments := strings.Split(blob.Name, "/") if len(segments) < 1 { return nil, fmt.Errorf("error iterating blobs: incorrect number of segments in path %q", blob.Name) } version, err := strconv.ParseInt(segments[len(segments)-1], 10, 64) // if the file version is not convertible to number, just ignore it if err != nil { continue } versions = append(versions, version) } return &artifact.VersionsResponse{Versions: versions}, nil } // Versions implements [artifact.Service] and returns an error if no versions are found. func (s *gcsService) Versions(ctx context.Context, req *artifact.VersionsRequest) (*artifact.VersionsResponse, error) { response, err := s.versions(ctx, req) if err != nil { return nil, err } if len(response.Versions) == 0 { return nil, fmt.Errorf("artifact not found: %w", fs.ErrNotExist) } return response, nil } ================================================ FILE: artifact/inmemory.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact import ( "context" "fmt" "io/fs" "iter" "maps" "math" "slices" "sort" "strings" "sync" "google.golang.org/genai" "rsc.io/omap" "rsc.io/ordered" ) // inMemoryService is an in-memory implementation of the Service. // It is primarily for testing and demonstration purposes. type inMemoryService struct { mu sync.RWMutex // ordered(appName, userID, sessionID) -> session artifacts omap.Map[string, *genai.Part] } // InMemoryService returns a new in-memory artifact service. func InMemoryService() Service { return &inMemoryService{} } // fileHasUserNamespace checks if a filename indicates a user scoped artifact. func fileHasUserNamespace(filename string) bool { return strings.HasPrefix(filename, "user:") } // userScopedArtifactKey defines the string for the part of the path used by user scope files // this key is used to store user artifacts within user namespace (available to all sessions for given app+user_id) const userScopedArtifactKey = "user" type artifactKey struct { AppName string UserID string SessionID string FileName string Version int64 } // Encode encodes the artifactKey into a string. func (ak artifactKey) Encode() string { return string(ordered.Encode(ak.AppName, ak.UserID, ak.SessionID, ak.FileName, ordered.Rev(ak.Version))) } // Decode decodes the string key into an artifactKey. func (ak *artifactKey) Decode(key string) error { var v ordered.Reverse[int64] err := ordered.Decode([]byte(key), &ak.AppName, &ak.UserID, &ak.SessionID, &ak.FileName, &v) if err != nil { return err } ak.Version = v.Value() return nil } // scan returns an iterator over all key-value pairs // in the range begin ≤ key ≤ end. // TODO: add a concurrent tests. func (s *inMemoryService) scan(lo, hi string) iter.Seq2[artifactKey, *genai.Part] { return func(yield func(key artifactKey, val *genai.Part) bool) { for k, val := range s.artifacts.Scan(lo, hi) { var key artifactKey if err := key.Decode(k); err != nil { continue } if !yield(key, val) { return } } } } func (s *inMemoryService) find(appName, userID, sessionID, fileName string) (int64, *genai.Part, bool) { lo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode() hi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: 0}.Encode() for key, val := range s.scan(lo, hi) { // first key is the latest one. return key.Version, val, true } return 0, nil, false } func (s *inMemoryService) get(appName, userID, sessionID, fileName string, version int64) (*genai.Part, bool) { key := artifactKey{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: version, }.Encode() return s.artifacts.Get(key) } func (s *inMemoryService) set(appName, userID, sessionID, fileName string, version int64, artifact *genai.Part) { key := artifactKey{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: version, }.Encode() s.artifacts.Set(key, artifact) } func (s *inMemoryService) delete(appName, userID, sessionID, fileName string, version int64) { key := artifactKey{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: version, }.Encode() s.artifacts.Delete(key) } // Save implements [artifact.Service] func (s *inMemoryService) Save(ctx context.Context, req *SaveRequest) (*SaveResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName artifact := req.Part // If file is user scoped, store it under user scope path if fileHasUserNamespace(fileName) { sessionID = userScopedArtifactKey } s.mu.Lock() defer s.mu.Unlock() nextVersion := int64(1) if internalVer, _, ok := s.find(appName, userID, sessionID, fileName); ok { nextVersion = internalVer + 1 } s.set(appName, userID, sessionID, fileName, nextVersion, artifact) return &SaveResponse{Version: nextVersion}, nil } // Delete implements [artifact.Service] func (s *inMemoryService) Delete(ctx context.Context, req *DeleteRequest) error { err := req.Validate() if err != nil { return fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName version := req.Version // If file is user scoped, adjust artifactKey part if fileHasUserNamespace(fileName) { sessionID = userScopedArtifactKey } s.mu.Lock() defer s.mu.Unlock() if version != 0 { s.delete(appName, userID, sessionID, fileName, version) return nil } // pick the latest version lo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode() hi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName}.Encode() s.artifacts.DeleteRange(lo, hi) return nil } // Load implements [artifact.Service] func (s *inMemoryService) Load(ctx context.Context, req *LoadRequest) (*LoadResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName version := req.Version // If file is user scoped, adjust artifactKey part if fileHasUserNamespace(fileName) { sessionID = userScopedArtifactKey } s.mu.RLock() defer s.mu.RUnlock() if version > 0 { artifact, ok := s.get(appName, userID, sessionID, fileName, version) if !ok { return nil, fmt.Errorf("artifact not found: %w", fs.ErrNotExist) } return &LoadResponse{Part: artifact}, nil } // pick the latest version _, artifact, ok := s.find(appName, userID, sessionID, fileName) if !ok { return nil, fmt.Errorf("artifact not found: %w", fs.ErrNotExist) } return &LoadResponse{Part: artifact}, nil } // List implements [artifact.Service] func (s *inMemoryService) List(ctx context.Context, req *ListRequest) (*ListResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID := req.AppName, req.UserID, req.SessionID s.mu.RLock() defer s.mu.RUnlock() files := map[string]bool{} lo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID}.Encode() hi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID + "\x00"}.Encode() // TODO(hyangah): extend omap to search key only and skip value decoding. for key := range s.scan(lo, hi) { if key.SessionID != sessionID { // scan includes key matching `hi` continue } files[key.FileName] = true } // Besides the session specific artifacts, also retrieve user scoped artifacts. userScopeLo := artifactKey{AppName: appName, UserID: userID, SessionID: userScopedArtifactKey}.Encode() userScopeHi := artifactKey{AppName: appName, UserID: userID, SessionID: userScopedArtifactKey + "\x00"}.Encode() // TODO: extend omap to search key only and skip value decoding. for key := range s.scan(userScopeLo, userScopeHi) { if key.SessionID != userScopedArtifactKey { // scan includes key matching `userScopeHi` continue } files[key.FileName] = true } filenames := slices.Collect(maps.Keys(files)) sort.Strings(filenames) return &ListResponse{FileNames: filenames}, nil } // Versions implements [artifact.Service] and returns an error if no versions are found. func (s *inMemoryService) Versions(ctx context.Context, req *VersionsRequest) (*VersionsResponse, error) { err := req.Validate() if err != nil { return nil, fmt.Errorf("request validation failed: %w", err) } appName, userID, sessionID, fileName := req.AppName, req.UserID, req.SessionID, req.FileName if fileHasUserNamespace(fileName) { sessionID = userScopedArtifactKey } s.mu.RLock() defer s.mu.RUnlock() var versions []int64 lo := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: math.MaxInt64}.Encode() hi := artifactKey{AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName}.Encode() // TODO(hyangah): extend omap to search key only and skip value decoding. for key := range s.scan(lo, hi) { versions = append(versions, key.Version) } if len(versions) == 0 { return nil, fmt.Errorf("artifact not found: %w", fs.ErrNotExist) } return &VersionsResponse{Versions: versions}, nil } var _ Service = (*inMemoryService)(nil) ================================================ FILE: artifact/inmemory_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact_test import ( "testing" "google.golang.org/adk/artifact" "google.golang.org/adk/internal/artifact/tests" ) func TestInMemoryArtifactService(t *testing.T) { factory := func(t *testing.T) (artifact.Service, error) { return artifact.InMemoryService(), nil } tests.TestArtifactService(t, "InMemory", factory) } ================================================ FILE: artifact/request_validation_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact import ( "fmt" "reflect" "testing" "google.golang.org/genai" ) // Validator describes a type that can validate itself. type Validator interface { Validate() error } type ValidatorTestCase struct { name string req Validator wantErr bool wantErrMsg string } // Test suite for the SaveRequest Validate method func TestSaveRequest_Validate(t *testing.T) { // Define test cases testCases := []ValidatorTestCase{ { name: "Valid request from bytes", req: &SaveRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", Part: genai.NewPartFromBytes([]byte("data"), "text/plain"), }, wantErr: false, }, { name: "Valid request from text", req: &SaveRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", Part: genai.NewPartFromText("data"), }, wantErr: false, }, { name: "Missing AppName", req: &SaveRequest{ UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", Part: genai.NewPartFromBytes([]byte("data"), "text/plain"), }, wantErr: true, wantErrMsg: "invalid save request: missing required fields: AppName", }, { name: "Missing multiple fields", req: &SaveRequest{ AppName: "MyApp", Part: genai.NewPartFromBytes([]byte("data"), "text/plain"), }, wantErr: true, wantErrMsg: "invalid save request: missing required fields: UserID, SessionID, FileName", }, { name: "Missing Part (nil slice)", req: &SaveRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", Part: nil, }, wantErr: true, wantErrMsg: "invalid save request: missing required fields: Part", }, { name: "Missing Part.Inline (nil slice)", req: &SaveRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", Part: genai.NewPartFromFunctionCall("example", nil), }, wantErr: true, wantErrMsg: "invalid save request: Part.InlineData or Part.Text has to be set", }, { name: "Completely empty request", req: &SaveRequest{}, wantErr: true, wantErrMsg: "invalid save request: missing required fields: AppName, UserID, SessionID, FileName, Part", }, { name: "FileName with path separator", req: &SaveRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "path/to/file.txt", Part: genai.NewPartFromBytes([]byte("data"), "text/plain"), }, wantErr: true, wantErrMsg: "invalid name: filename cannot contain path separators", }, } executeValidatorTestCases(t, "SaveRequest", testCases) } // Test suite for the LoadRequest Validate method func TestLoadRequest_Validate(t *testing.T) { // Define test cases testCases := []ValidatorTestCase{ { name: "Valid request", req: &LoadRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: false, }, { name: "Missing AppName", req: &LoadRequest{ UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: true, wantErrMsg: "invalid load request: missing required fields: AppName", }, { name: "Missing multiple fields", req: &LoadRequest{ AppName: "MyApp", }, wantErr: true, wantErrMsg: "invalid load request: missing required fields: UserID, SessionID, FileName", }, { name: "Completely empty request", req: &LoadRequest{}, wantErr: true, wantErrMsg: "invalid load request: missing required fields: AppName, UserID, SessionID, FileName", }, { name: "FileName with path separator", req: &LoadRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "a/b.txt", }, wantErr: true, wantErrMsg: "invalid name: filename cannot contain path separators", }, } executeValidatorTestCases(t, "LoadRequest", testCases) } // Test suite for the DeleteRequest Validate method func TestDeleteRequest_Validate(t *testing.T) { // Define test cases testCases := []ValidatorTestCase{ { name: "Valid request", req: &DeleteRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: false, }, { name: "Missing AppName", req: &DeleteRequest{ UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: true, wantErrMsg: "invalid delete request: missing required fields: AppName", }, { name: "Missing multiple fields", req: &DeleteRequest{ AppName: "MyApp", }, wantErr: true, wantErrMsg: "invalid delete request: missing required fields: UserID, SessionID, FileName", }, { name: "Completely empty request", req: &DeleteRequest{}, wantErr: true, wantErrMsg: "invalid delete request: missing required fields: AppName, UserID, SessionID, FileName", }, { name: "FileName with path separator", req: &DeleteRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "dir/file.txt", }, wantErr: true, wantErrMsg: "invalid name: filename cannot contain path separators", }, } executeValidatorTestCases(t, "DeleteRequest", testCases) } // Test suite for the ListRequest Validate method func TestListRequest_Validate(t *testing.T) { // Define test cases testCases := []ValidatorTestCase{ { name: "Valid request", req: &ListRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", }, wantErr: false, }, { name: "Missing AppName", req: &ListRequest{ UserID: "user-123", SessionID: "sess-abc", }, wantErr: true, wantErrMsg: "invalid list request: missing required fields: AppName", }, { name: "Missing multiple fields", req: &ListRequest{ AppName: "MyApp", }, wantErr: true, wantErrMsg: "invalid list request: missing required fields: UserID, SessionID", }, { name: "Completely empty request", req: &ListRequest{}, wantErr: true, wantErrMsg: "invalid list request: missing required fields: AppName, UserID, SessionID", }, } executeValidatorTestCases(t, "ListRequest", testCases) } // Test suite for the VersionsRequest Validate method func TestVersionsRequest_Validate(t *testing.T) { // Define test cases testCases := []ValidatorTestCase{ { name: "Valid request", req: &VersionsRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: false, }, { name: "Missing AppName", req: &VersionsRequest{ UserID: "user-123", SessionID: "sess-abc", FileName: "file.txt", }, wantErr: true, wantErrMsg: "invalid versions request: missing required fields: AppName", }, { name: "Missing multiple fields", req: &VersionsRequest{ AppName: "MyApp", }, wantErr: true, wantErrMsg: "invalid versions request: missing required fields: UserID, SessionID, FileName", }, { name: "Completely empty request", req: &VersionsRequest{}, wantErr: true, wantErrMsg: "invalid versions request: missing required fields: AppName, UserID, SessionID, FileName", }, { name: "FileName with path separator", req: &VersionsRequest{ AppName: "MyApp", UserID: "user-123", SessionID: "sess-abc", FileName: "folder/file.txt", }, wantErr: true, wantErrMsg: "invalid name: filename cannot contain path separators", }, } executeValidatorTestCases(t, "VersionsRequest", testCases) } func executeValidatorTestCases(t *testing.T, requestTypeName string, testCases []ValidatorTestCase) { // Run the tests for _, tc := range testCases { t.Run(fmt.Sprintf("%s_%s", requestTypeName, tc.name), func(t *testing.T) { err := tc.req.Validate() if (err != nil) != tc.wantErr { t.Errorf("Validate() error = %v, wantErr %v", err, tc.wantErr) return } if err != nil && err.Error() != tc.wantErrMsg { // NOTE: This simple string comparison works because our function produces a sorted, predictable output. t.Errorf("Validate() error msg = %q, wantErrMsg %q", err.Error(), tc.wantErrMsg) } }) } } // Test suite for the reusable helper function using a slice of structs func TestValidateRequiredStrings(t *testing.T) { testCases := []struct { name string input []requiredField want []string }{ { name: "No missing fields", input: []requiredField{ {Name: "FieldA", Value: "valueA"}, {Name: "FieldB", Value: "valueB"}, }, want: nil, }, { name: "One missing field", input: []requiredField{ {Name: "FieldA", Value: "valueA"}, {Name: "FieldB", Value: ""}, }, want: []string{"FieldB"}, }, { name: "Multiple missing fields", input: []requiredField{ {Name: "FieldA", Value: ""}, {Name: "FieldB", Value: "valueB"}, {Name: "FieldC", Value: ""}, }, // The order now matches the input order want: []string{"FieldA", "FieldC"}, }, { name: "Empty input slice", input: []requiredField{}, want: nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := validateRequiredStrings(tc.input) if !reflect.DeepEqual(got, tc.want) { t.Errorf("validateRequiredStrings() = %v, want %v", got, tc.want) } }) } } ================================================ FILE: artifact/service.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package artifact provides a service for managing artifacts. // // An artifact is a file identified by an application name, a user ID, a session ID, // and a filename. The service provides basic storage operations for artifacts, // such as Save, Load, Delete, and List. It also supports versioning of artifacts. package artifact import ( "context" "fmt" "strings" "google.golang.org/genai" ) // Service is the artifact storage service. type Service interface { // Save saves an artifact to the artifact service storage. // The artifact is a file identified by the app name, user ID, session ID, and fileName. // After saving the artifact, a revision ID is returned to identify the artifact version. Save(ctx context.Context, req *SaveRequest) (*SaveResponse, error) // Load loads an artifact from the storage. // The artifact is a file identified by the appName, userID, sessionID and fileName. Load(ctx context.Context, req *LoadRequest) (*LoadResponse, error) // Delete deletes an artifact. Deleting a non-existing entry is not an error. Delete(ctx context.Context, req *DeleteRequest) error // List lists all the artifact filenames within a session. List(ctx context.Context, req *ListRequest) (*ListResponse, error) // Versions lists all versions of an artifact. Versions(ctx context.Context, req *VersionsRequest) (*VersionsResponse, error) } // requiredField is an internal type to use on validate operations type requiredField struct { Name string Value string } // SaveRequest is the parameter for [ArtifactService.Save]. type SaveRequest struct { AppName, UserID, SessionID, FileName string // Part is the artifact to store. Part *genai.Part // Below are optional fields. // If set, the artifact will be saved with this version. // If unset, a new version will be created. Version int64 } // validateRequiredStrings checks a slice of fields in order. // It returns the names of any fields with empty values, preserving the original order. func validateRequiredStrings(fields []requiredField) []string { var missingFields []string for _, field := range fields { if field.Value == "" { missingFields = append(missingFields, field.Name) } } return missingFields } // Validate checks if the struct is valid or if it is missing fields. func (req *SaveRequest) Validate() error { // Define the fields to check in the desired order fieldsToCheck := []requiredField{ {Name: "AppName", Value: req.AppName}, {Name: "UserID", Value: req.UserID}, {Name: "SessionID", Value: req.SessionID}, {Name: "FileName", Value: req.FileName}, } // Use the helper function for all required string fields missingFields := validateRequiredStrings(fieldsToCheck) // Perform checks that don't fit the helper if req.Part == nil { missingFields = append(missingFields, "Part") } // If the slice has any items, it means fields were missing. if len(missingFields) > 0 { return fmt.Errorf("invalid save request: missing required fields: %s", strings.Join(missingFields, ", ")) } if req.Part.Text == "" && req.Part.InlineData == nil { return fmt.Errorf("invalid save request: Part.InlineData or Part.Text has to be set") } // Validate that FileName doesn't contain path separators if err := validateFileName(req.FileName); err != nil { return err } return nil } func validateFileName(name string) error { if strings.Contains(name, "/") || strings.Contains(name, "\\") { return fmt.Errorf("invalid name: filename cannot contain path separators") } return nil } // SaveResponse is the return type of [ArtifactService.Save]. type SaveResponse struct { Version int64 } // LoadRequest is the parameter for [ArtifactService.Load]. type LoadRequest struct { AppName, UserID, SessionID, FileName string // Below are optional fields. Version int64 } // Validate checks if the struct is valid or if it is missing fields. func (req *LoadRequest) Validate() error { // Define the fields to check in the desired order fieldsToCheck := []requiredField{ {Name: "AppName", Value: req.AppName}, {Name: "UserID", Value: req.UserID}, {Name: "SessionID", Value: req.SessionID}, {Name: "FileName", Value: req.FileName}, } // Use the helper function for all required string fields missingFields := validateRequiredStrings(fieldsToCheck) // If the slice has any items, it means fields were missing. if len(missingFields) > 0 { return fmt.Errorf("invalid load request: missing required fields: %s", strings.Join(missingFields, ", ")) } // Validate that FileName doesn't contain path separators if err := validateFileName(req.FileName); err != nil { return err } return nil } // LoadResponse is the return type of [ArtifactService.Load]. type LoadResponse struct { // Part is the artifact stored. Part *genai.Part } // DeleteRequest is the parameter for [ArtifactService.Delete]. type DeleteRequest struct { AppName, UserID, SessionID, FileName string // Below are optional fields. Version int64 } // Validate checks if the struct is valid or if it is missing fields. func (req *DeleteRequest) Validate() error { // Define the fields to check in the desired order fieldsToCheck := []requiredField{ {Name: "AppName", Value: req.AppName}, {Name: "UserID", Value: req.UserID}, {Name: "SessionID", Value: req.SessionID}, {Name: "FileName", Value: req.FileName}, } // Use the helper function for all required string fields missingFields := validateRequiredStrings(fieldsToCheck) // If the slice has any items, it means fields were missing. if len(missingFields) > 0 { return fmt.Errorf("invalid delete request: missing required fields: %s", strings.Join(missingFields, ", ")) } // Validate that FileName doesn't contain path separators if err := validateFileName(req.FileName); err != nil { return err } return nil } // ListRequest is the parameter for [ArtifactService.List]. type ListRequest struct { AppName, UserID, SessionID string } // Validate checks if the struct is valid or if it is missing a field. func (req *ListRequest) Validate() error { // Define the fields to check in the desired order fieldsToCheck := []requiredField{ {Name: "AppName", Value: req.AppName}, {Name: "UserID", Value: req.UserID}, {Name: "SessionID", Value: req.SessionID}, } // Use the helper function for all required string fields missingFields := validateRequiredStrings(fieldsToCheck) // If the slice has any items, it means fields were missing. if len(missingFields) > 0 { return fmt.Errorf("invalid list request: missing required fields: %s", strings.Join(missingFields, ", ")) } return nil } // ListResponse is the return type of [ArtifactService.List]. type ListResponse struct { FileNames []string } // VersionsRequest is the parameter for [ArtifactService.Versions]. type VersionsRequest struct { AppName, UserID, SessionID, FileName string } // Validate checks if the struct is valid or if its missing field func (req *VersionsRequest) Validate() error { // Define the fields to check in the desired order fieldsToCheck := []requiredField{ {Name: "AppName", Value: req.AppName}, {Name: "UserID", Value: req.UserID}, {Name: "SessionID", Value: req.SessionID}, {Name: "FileName", Value: req.FileName}, } // Use the helper function for all required string fields missingFields := validateRequiredStrings(fieldsToCheck) // If the slice has any items, it means fields were missing. if len(missingFields) > 0 { return fmt.Errorf("invalid versions request: missing required fields: %s", strings.Join(missingFields, ", ")) } // Validate that FileName doesn't contain path separators if err := validateFileName(req.FileName); err != nil { return err } return nil } // VersionsResponse is the parameter for [ArtifactService.Versions]. type VersionsResponse struct { Versions []int64 } ================================================ FILE: cmd/adkgo/adkgo.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // adkgo is a CLI tool to help deploy and test an ADK application. package main import ( _ "google.golang.org/adk/cmd/adkgo/internal/deploy/cloudrun" "google.golang.org/adk/cmd/adkgo/internal/root" ) func main() { root.Execute() } ================================================ FILE: cmd/adkgo/internal/deploy/cloudrun/cloudrun.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package cloudrun handles command line parameters and execution logic for cloudrun deployment. package cloudrun import ( "fmt" "os" "os/exec" "path" "path/filepath" "strconv" "strings" "time" "github.com/spf13/cobra" "google.golang.org/adk/cmd/adkgo/internal/deploy" "google.golang.org/adk/internal/cli/util" ) type gCloudFlags struct { region string projectName string } type cloudRunServiceFlags struct { serviceName string serverPort int a2aAgentCardURL string a2a bool // enable a2a or not api bool // enable api or not webui bool // enable webui or not } type localProxyFlags struct { port int } type buildFlags struct { tempDir string execPath string execFile string dockerfileBuildPath string } type sourceFlags struct { srcBasePath string entryPointPath string } type deployCloudRunFlags struct { gcloud gCloudFlags cloudRun cloudRunServiceFlags proxy localProxyFlags build buildFlags source sourceFlags } var flags deployCloudRunFlags // cloudrunCmd represents the cloudrun command var cloudrunCmd = &cobra.Command{ Use: "cloudrun", Short: "Deploys the application to cloudrun.", Long: `Deployment prepares a Dockerfile which is fed with locally compiled server executable containing Web UI static files. Service on Cloudrun is created using this information. Local proxy adding authentication is started. `, RunE: func(cmd *cobra.Command, args []string) error { return flags.deployOnCloudRun() }, } // init creates flags and adds subcommand to parent func init() { deploy.DeployCmd.AddCommand(cloudrunCmd) cloudrunCmd.PersistentFlags().StringVarP(&flags.gcloud.region, "region", "r", "", "GCP Region") cloudrunCmd.PersistentFlags().StringVarP(&flags.gcloud.projectName, "project_name", "p", "", "GCP Project Name") cloudrunCmd.PersistentFlags().StringVarP(&flags.cloudRun.serviceName, "service_name", "s", "", "Cloud Run Service name") cloudrunCmd.PersistentFlags().StringVarP(&flags.build.tempDir, "temp_dir", "t", "", "Temp dir for build, defaults to os.TempDir() if not specified") cloudrunCmd.PersistentFlags().IntVar(&flags.proxy.port, "proxy_port", 8081, "Local proxy port") cloudrunCmd.PersistentFlags().IntVar(&flags.cloudRun.serverPort, "server_port", 8080, "Cloudrun server port") cloudrunCmd.PersistentFlags().StringVarP(&flags.source.entryPointPath, "entry_point_path", "e", "", "Path to an entry point (go 'main')") cloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.a2a, "a2a", true, "Enable A2A") cloudrunCmd.PersistentFlags().StringVarP(&flags.cloudRun.a2aAgentCardURL, "a2a_agent_url", "a", "http://127.0.0.1:8081", "A2A agent card URL as advertised in the public agent card") cloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.api, "api", true, "Enable API") cloudrunCmd.PersistentFlags().BoolVar(&flags.cloudRun.webui, "webui", true, "Enable Web UI") } // computeFlags uses command line arguments to create a full config func (f *deployCloudRunFlags) computeFlags() error { return util.LogStartStop("Computing flags & preparing temp", func(p util.Printer) error { absp, err := filepath.Abs(flags.source.entryPointPath) if err != nil { return fmt.Errorf("cannot make an absolute path from '%v': %w", f.source.entryPointPath, err) } f.source.entryPointPath = absp if flags.build.tempDir == "" { flags.build.tempDir = os.TempDir() } absp, err = filepath.Abs(flags.build.tempDir) if err != nil { return fmt.Errorf("cannot make an absolute path from '%v': %w", f.build.tempDir, err) } f.build.tempDir, err = os.MkdirTemp(absp, "cloudrun_"+time.Now().Format("20060102_150405__")+"*") if err != nil { return fmt.Errorf("cannot create a temporary sub directory in '%v': %w", absp, err) } p("Using temp dir:", f.build.tempDir) // come up with a executable name based on entry point path dir, file := path.Split(f.source.entryPointPath) f.source.srcBasePath = dir f.source.entryPointPath = file if f.build.execPath == "" { exec, err := util.StripExtension(f.source.entryPointPath, ".go") if err != nil { return fmt.Errorf("cannot strip '.go' extension from entry point path '%v': %w", f.source.entryPointPath, err) } f.build.execFile = exec f.build.execPath = path.Join(f.build.tempDir, exec) } f.build.dockerfileBuildPath = path.Join(f.build.tempDir, "Dockerfile") return nil }) } func (f *deployCloudRunFlags) cleanTemp() error { return util.LogStartStop("Cleaning temp", func(p util.Printer) error { p("Clean temp starting with", f.build.tempDir) err := os.RemoveAll(f.build.tempDir) if err != nil { return fmt.Errorf("failed to clean temp directory %v: %w", f.build.tempDir, err) } return nil }) } // compileEntryPoint builds locally the server using flags and environment variables in order to be run in CloudRun containter func (f *deployCloudRunFlags) compileEntryPoint() error { return util.LogStartStop("Compiling server", func(p util.Printer) error { p("Using", f.source.entryPointPath, "as entry point") // for help on ldflags you can run go build -ldflags="--help" ./examples/quickstart/main.go // -s disable symbol table // -w disable DWARF generation // using those flags reduces the size of an executable cmd := exec.Command("go", "build", "-ldflags", "-s -w", "-o", f.build.execPath, f.source.entryPointPath) cmd.Dir = f.source.srcBasePath // build using staticallly linked libs, for linux/amd64 cmd.Env = append(os.Environ(), "CGO_ENABLED=0", "GOOS=linux", "GOARCH=amd64") return util.LogCommand(cmd, p) }) } // prepareDockerfile creates a temporary Dockerfile which will be executed by CloudRun func (f *deployCloudRunFlags) prepareDockerfile() error { return util.LogStartStop("Preparing Dockerfile", func(p util.Printer) error { p("Writing:", f.build.dockerfileBuildPath) var b strings.Builder b.WriteString(` FROM gcr.io/distroless/static-debian11 COPY ` + f.build.execFile + ` /app/` + f.build.execFile + ` EXPOSE ` + strconv.Itoa(flags.cloudRun.serverPort) + ` # Command to run the executable when the container starts CMD ["/app/` + f.build.execFile + `", "web", "-port", "` + strconv.Itoa(flags.cloudRun.serverPort) + `"`) if flags.cloudRun.api { b.WriteString(`, "api", "-webui_address", "127.0.0.1:` + strconv.Itoa(f.proxy.port) + `"`) } if flags.cloudRun.a2a { b.WriteString(`, "a2a", "--a2a_agent_url", "` + flags.cloudRun.a2aAgentCardURL + `"`) } if flags.cloudRun.webui { b.WriteString(`, "webui", "--api_server_address", "http://127.0.0.1:` + strconv.Itoa(f.proxy.port) + `/api"] `) } return os.WriteFile(f.build.dockerfileBuildPath, []byte(b.String()), 0o600) }) } // gcloudDeployToCloudRun invokes gcloud to deploy source on CloudRun func (f *deployCloudRunFlags) gcloudDeployToCloudRun() error { return util.LogStartStop("Deploying to Cloud Run", func(p util.Printer) error { params := []string{ "run", "deploy", f.cloudRun.serviceName, "--source", ".", "--set-secrets=GOOGLE_API_KEY=GOOGLE_API_KEY:latest", "--region", f.gcloud.region, "--project", f.gcloud.projectName, "--ingress", "all", "--no-allow-unauthenticated", } cmd := exec.Command("gcloud", params...) cmd.Dir = f.build.tempDir return util.LogCommand(cmd, p) }) } // runGcloudProxy invokes gcloud to create a proxy which will add authentication headers to requests func (f *deployCloudRunFlags) runGcloudProxy() error { return util.LogStartStop("Running local gcloud authenticating proxy", func(p util.Printer) error { targetWidth := 80 p(strings.Repeat("-", targetWidth)) p(util.CenterString("", targetWidth)) p(util.CenterString("Running ADK Web UI on http://127.0.0.1:"+strconv.Itoa(f.proxy.port)+"/ui/ <-- open this", targetWidth)) p(util.CenterString("ADK REST API on http://127.0.0.1:"+strconv.Itoa(f.proxy.port)+"/api/ ", targetWidth)) p(util.CenterString("", targetWidth)) p(util.CenterString("Press Ctrl-C to stop", targetWidth)) p(util.CenterString("", targetWidth)) p(strings.Repeat("-", targetWidth)) cmd := exec.Command("gcloud", "run", "services", "proxy", f.cloudRun.serviceName, "--project", f.gcloud.projectName, "--port", strconv.Itoa(f.proxy.port), "--region", f.gcloud.region) return util.LogCommand(cmd, p) }) } // deployOnCloudRun executes the sequence of actions preparing and deploying the agent to CloudRun. Then runs authenticating proxy to newly deployed service func (f *deployCloudRunFlags) deployOnCloudRun() error { fmt.Println(flags) err := f.computeFlags() if err != nil { return err } err = f.compileEntryPoint() if err != nil { return err } err = f.prepareDockerfile() if err != nil { return err } err = f.gcloudDeployToCloudRun() if err != nil { return err } err = f.cleanTemp() if err != nil { return err } err = f.runGcloudProxy() if err != nil { return err } return nil } ================================================ FILE: cmd/adkgo/internal/deploy/deploy.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package deploy allows to run deployment-related subcommands. package deploy import ( "github.com/spf13/cobra" "google.golang.org/adk/cmd/adkgo/internal/root" ) // DeployCmd represents the deploy command. var DeployCmd = &cobra.Command{ Use: "deploy", Short: "Makes deployment to various platforms easy", Long: `Please see subcommands for details`, RunE: func(cmd *cobra.Command, args []string) error { if len(args) == 0 { return cmd.Help() } return nil }, } func init() { root.RootCmd.AddCommand(DeployCmd) } ================================================ FILE: cmd/adkgo/internal/root/root.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package root handles command line parameters package root import ( "os" "github.com/spf13/cobra" ) // RootCmd represents the base command when called without any subcommands var RootCmd = &cobra.Command{ Use: "adkgo", Short: "CLI tool for use with ADK-GO", Long: `adkgo is a CLI tool which allows developer to quickly deploy and test an agentic application`, } // Execute adds all child commands to the root command and sets flags appropriately. func Execute() { err := RootCmd.Execute() if err != nil { os.Exit(1) } } ================================================ FILE: cmd/internal/adkcli/main.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "fmt" "io/fs" "log" "os" "path/filepath" "google.golang.org/adk/agent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/internal/configurable" "google.golang.org/adk/internal/configurable/conformance" "google.golang.org/adk/internal/configurable/conformance/replayplugin" "google.golang.org/adk/plugin" "google.golang.org/adk/runner" ) func main() { // 1. Get the Current Working Directory (where the user typed 'adk') cwd, err := os.Getwd() if err != nil { log.Fatalf("Error getting current directory: %v", err) } // Register callbacks for the conformance agents err = conformance.RegisterCallbacks() if err != nil { log.Fatalf("Error registering callbacks: %v", err) } err = conformance.RegisterFunctions() if err != nil { log.Fatalf("Error registering functions: %v", err) } fmt.Printf("🔍 Scanning for 'root_agent.yaml' in: %s\n", cwd) // 2. Crawl folder structure to find all configs var agentConfigs []string err = filepath.WalkDir(cwd, func(path string, d fs.DirEntry, err error) error { if err != nil { // Report error but continue walking other files fmt.Printf("Warning: skipping %q due to error: %v\n", path, err) return nil } // Check if it matches the filename we are looking for if !d.IsDir() && d.Name() == "root_agent.yaml" { agentConfigs = append(agentConfigs, path) } return nil }) if err != nil { log.Fatalf("Error walking the path: %v", err) } // 3. Check if we found anything if len(agentConfigs) == 0 { fmt.Printf("❌ No 'root_agent.yaml' files found in %s or subdirectories\n", cwd) os.Exit(1) } fmt.Printf("🚀 Found %d agent config(s)\n", len(agentConfigs)) agentsMap := make(map[string]agent.Agent, len(agentConfigs)) // 4. Iterate and Load all agents found for _, configPath := range agentConfigs { fmt.Printf("➡️ Loading agent from: %s\n", configPath) // This reads the YAML, finds the 'agent_class', and calls the registered factory. myAgent, err := configurable.FromConfig(context.Background(), configPath) if err != nil { log.Printf("⚠️ Error loading agent at %s: %v", configPath, err) continue // Skip this one and try the next } fmt.Printf("✅ Agent loaded successfully: %s\n", myAgent.Name()) folderName := filepath.Base(filepath.Dir(configPath)) fmt.Printf("✅ Agent folder name: %s\n", folderName) if _, ok := agentsMap[folderName]; ok { log.Printf("⚠️ Agent %s already exists, skipping", folderName) continue } agentsMap[folderName] = myAgent } ctx := context.Background() loader, err := conformance.NewConformanceAgentLoader(agentsMap) if err != nil { log.Fatalf("Error loading agent: %v", err) } config := &launcher.Config{ AgentLoader: loader, PluginConfig: runner.PluginConfig{ Plugins: []*plugin.Plugin{ replayplugin.MustNew(cwd), }, }, } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: cmd/launcher/console/console.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package console provides a simple way to interact with an agent from console application. package console import ( "bufio" "context" "errors" "flag" "fmt" "io" "log" "os" "os/signal" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/internal/telemetry" "google.golang.org/adk/cmd/launcher/universal" "google.golang.org/adk/internal/cli/util" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) // consoleConfig contains command-line params for console launcher type consoleConfig struct { streamingMode agent.StreamingMode streamingModeString string // command-line param to be converted to agent.StreamingMode otelToCloud bool shutdownTimeout time.Duration } // consoleLauncher allows to interact with an agent in console type consoleLauncher struct { flags *flag.FlagSet // flags are used to parse command-line arguments config *consoleConfig // config contains parsed command-line parameters } // NewLauncher creates new console launcher func NewLauncher() launcher.SubLauncher { config := &consoleConfig{} fs := flag.NewFlagSet("console", flag.ContinueOnError) fs.StringVar(&config.streamingModeString, "streaming_mode", "", fmt.Sprintf("defines streaming mode (%s|%s)", agent.StreamingModeNone, agent.StreamingModeSSE)) fs.DurationVar(&config.shutdownTimeout, "shutdown-timeout", 2*time.Second, "Console shutdown timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for active requests to finish during shutdown") fs.BoolVar(&config.otelToCloud, "otel_to_cloud", false, "Enables/disables OpenTelemetry export to GCP: telemetry.googleapis.com. See adk-go/telemetry package for details about supported options, credentials and environment variables.") return &consoleLauncher{config: config, flags: fs} } // Run implements launcher.SubLauncher. It starts the console interaction loop. func (l *consoleLauncher) Run(ctx context.Context, config *launcher.Config) error { ctx, cancel := signal.NotifyContext(ctx, os.Interrupt) defer cancel() telemetry, err := telemetry.InitAndSetGlobalOtelProviders(ctx, config, l.config.otelToCloud) if err != nil { return fmt.Errorf("telemetry initialization failed: %v", err) } defer func() { shutdownCtx, cancel := context.WithTimeout(context.Background(), l.config.shutdownTimeout) defer cancel() if err := telemetry.Shutdown(shutdownCtx); err != nil { log.Printf("telemetry shutdown failed: %v", err) } }() // userID and appName are not important at this moment, we can just use any userID, appName := "console_user", "console_app" sessionService := config.SessionService if sessionService == nil { sessionService = session.InMemoryService() } resp, err := sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, }) if err != nil { return fmt.Errorf("failed to create the session service: %v", err) } rootAgent := config.AgentLoader.RootAgent() session := resp.Session r, err := runner.New(runner.Config{ AppName: appName, Agent: rootAgent, SessionService: sessionService, ArtifactService: config.ArtifactService, PluginConfig: config.PluginConfig, }) if err != nil { return fmt.Errorf("failed to create runner: %v", err) } inputChan := make(chan string) readErrChan := make(chan error, 1) go func() { reader := bufio.NewReader(os.Stdin) for { userInput, err := reader.ReadString('\n') if err != nil { readErrChan <- err return } inputChan <- userInput } }() // Print an initial newline to work around PTY/exec buffering issues in some environments. fmt.Println() fmt.Print("\nUser -> ") // Resolve "auto" streaming mode once per session (stdout TTY-ness doesn't change). defaultStreamingMode := l.config.streamingMode if defaultStreamingMode == "" { // Stdlib-only terminal heuristic: stdout is a character device. // Avoids adding golang.org/x/term dependency (golangci-lint failed to load its export data in CI). if fi, err := os.Stdout.Stat(); err == nil && (fi.Mode()&os.ModeCharDevice) != 0 { defaultStreamingMode = agent.StreamingModeSSE } else { defaultStreamingMode = agent.StreamingModeNone } } for { select { case <-ctx.Done(): return nil case err := <-readErrChan: if errors.Is(err, io.EOF) { fmt.Println("\nEOF detected, exiting...") return nil } log.Fatal(err) case userInput := <-inputChan: userMsg := genai.NewContentFromText(userInput, genai.RoleUser) streamingMode := l.config.streamingMode if streamingMode == "" { streamingMode = defaultStreamingMode } fmt.Print("\nAgent -> ") prevText := "" for event, err := range r.Run(ctx, userID, session.ID(), userMsg, agent.RunConfig{ StreamingMode: streamingMode, }) { if err != nil { fmt.Printf("\nAGENT_ERROR: %v\n", err) } else { if event.LLMResponse.Content == nil { continue } text := "" for _, p := range event.LLMResponse.Content.Parts { text += p.Text } if streamingMode != agent.StreamingModeSSE { fmt.Print(text) continue } // In SSE mode, always print partial responses and capture them. if !event.IsFinalResponse() { fmt.Print(text) prevText += text continue } // Only print final response if it doesn't match previously captured text. if text != prevText { fmt.Print(text) } prevText = "" } } fmt.Print("\nUser -> ") } } } // Parse implements launcher.SubLauncher. After parsing console-specific // arguments returns remaining un-parsed arguments func (l *consoleLauncher) Parse(args []string) ([]string, error) { err := l.flags.Parse(args) if err != nil || !l.flags.Parsed() { return nil, fmt.Errorf("failed to parse flags: %v", err) } if l.config.streamingModeString != "" && l.config.streamingModeString != string(agent.StreamingModeNone) && l.config.streamingModeString != string(agent.StreamingModeSSE) { return nil, fmt.Errorf("invalid streaming_mode: %v. Should be (%s|%s)", l.config.streamingModeString, agent.StreamingModeNone, agent.StreamingModeSSE) } l.config.streamingMode = agent.StreamingMode(l.config.streamingModeString) return l.flags.Args(), nil } // Keyword implements launcher.SubLauncher. Returns the command-line keyword for this launcher. func (l *consoleLauncher) Keyword() string { return "console" } // CommandLineSyntax implements launcher.SubLauncher. Returns the command-line syntax for the console launcher. func (l *consoleLauncher) CommandLineSyntax() string { return util.FormatFlagUsage(l.flags) } // SimpleDescription implements launcher.SubLauncher. Returns a simple description of the console launcher. func (l *consoleLauncher) SimpleDescription() string { return "runs an agent in console mode." } // Execute implements launcher.Launcher. It parses arguments and runs the launcher. func (l *consoleLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error { remainingArgs, err := l.Parse(args) if err != nil { return fmt.Errorf("cannot parse args: %w", err) } // do not accept additional arguments err = universal.ErrorOnUnparsedArgs(remainingArgs) if err != nil { return fmt.Errorf("cannot parse all the arguments: %w", err) } return l.Run(ctx, config) } ================================================ FILE: cmd/launcher/full/full.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package full provides easy way to play with ADK with all available options package full import ( "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/console" "google.golang.org/adk/cmd/launcher/universal" "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/cmd/launcher/web/a2a" "google.golang.org/adk/cmd/launcher/web/api" "google.golang.org/adk/cmd/launcher/web/webui" ) // NewLauncher returnes the most versatile universal launcher with all options built-in. func NewLauncher() launcher.Launcher { return universal.NewLauncher(console.NewLauncher(), web.NewLauncher(webui.NewLauncher(), a2a.NewLauncher(), api.NewLauncher())) } ================================================ FILE: cmd/launcher/internal/telemetry/telemetry.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package telemetry contains the internal shared logic for initializing telemetry in launchers. package telemetry import ( "context" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/telemetry" ) // InitAndSetGlobalOtelProviders initializes telemetry and sets the global OTel providers. func InitAndSetGlobalOtelProviders(ctx context.Context, config *launcher.Config, otelToCloud bool) (*telemetry.Providers, error) { opts := append(config.TelemetryOptions, telemetry.WithOtelToCloud(otelToCloud)) telemetryProviders, err := telemetry.New(ctx, opts...) if err != nil { return nil, err } telemetryProviders.SetGlobalOtelProviders() return telemetryProviders, nil } ================================================ FILE: cmd/launcher/launcher.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package launcher provides ways to interact with agents. package launcher import ( "context" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/memory" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/telemetry" ) // Launcher is the main interface for running an ADK application. // It is responsible for parsing command-line arguments and executing the // corresponding logic. type Launcher interface { // Execute parses command-line arguments and runs the launcher. Execute(ctx context.Context, config *Config, args []string) error // CommandLineSyntax returns a string describing the command-line flags and arguments. CommandLineSyntax() string } // SubLauncher is an interface for launchers that can be composed within a parent // launcher, like the universal launcher. Each SubLauncher corresponds to a // specific mode of operation (e.g., 'console' or 'web'). type SubLauncher interface { // Keyword returns the command-line keyword that activates this sub-launcher. Keyword() string // Parse parses the arguments for the sub-launcher. It should return any unparsed arguments. Parse(args []string) ([]string, error) // CommandLineSyntax returns a string describing the command-line flags and arguments for the sub-launcher. CommandLineSyntax() string // SimpleDescription provides a brief, one-line description of the sub-launcher's function. SimpleDescription() string // Run executes the sub-launcher's main logic. Run(ctx context.Context, config *Config) error } // Config contains parameters for web & console execution: sessions, artifacts, agents etc type Config struct { SessionService session.Service ArtifactService artifact.Service MemoryService memory.Service AgentLoader agent.Loader A2AOptions []a2asrv.RequestHandlerOption PluginConfig runner.PluginConfig TelemetryOptions []telemetry.Option } ================================================ FILE: cmd/launcher/prod/prod.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package prod provides easy way to play with ADK with all available options without // development support (no console, no ADK Web UI) including only production // options like the REST API and A2A support. package prod import ( "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/universal" "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/cmd/launcher/web/a2a" "google.golang.org/adk/cmd/launcher/web/api" ) // NewLauncher returns a launcher capable of serving ADK REST API and A2A. func NewLauncher() launcher.Launcher { return universal.NewLauncher(web.NewLauncher(api.NewLauncher(), a2a.NewLauncher())) } ================================================ FILE: cmd/launcher/universal/universal.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package universal provides an umbrella over launchers (console and web). // It allowes to choose one launcher by command-line parameters and uses // it to parse the rest of arguments and then execute the launcher package universal import ( "context" "fmt" "strings" "google.golang.org/adk/cmd/launcher" ) // uniLauncher contains information about sublaunchers type uniLauncher struct { chosenLauncher launcher.SubLauncher // the chosen launcher - after parsing command-line args sublaunchers []launcher.SubLauncher } // Execute implements launcher.Launcher. Parses args and runs the chosen launcher. Returns error if there are non-parsed arguments. func (l *uniLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error { return l.ParseAndRun(ctx, config, args, ErrorOnUnparsedArgs) } // NewLauncher returns a new universal launcher. The first element on launcher list will be the default one if there are no arguments specified func NewLauncher(sublaunchers ...launcher.SubLauncher) launcher.Launcher { return &uniLauncher{ sublaunchers: sublaunchers, } } // ParseAndRun parses arguments and runs the chosen sublauncher. It allows to provide a // hook for processing any remaining arguments. func (l *uniLauncher) ParseAndRun(ctx context.Context, config *launcher.Config, args []string, parseRemaining func([]string) error) error { remainingArgs, err := l.parse(args) if err != nil { return err } if parseRemaining != nil { err = parseRemaining(remainingArgs) if err != nil { return err } } // args are parsed return l.run(ctx, config) } // run executes the chosen sublauncher. func (l *uniLauncher) run(ctx context.Context, config *launcher.Config) error { return l.chosenLauncher.Run(ctx, config) } // parse parses arguments and remembers which sublauncher should be run later func (l *uniLauncher) parse(args []string) ([]string, error) { keyToSublauncher := make(map[string]launcher.SubLauncher) for _, l := range l.sublaunchers { if _, ok := keyToSublauncher[l.Keyword()]; ok { return nil, fmt.Errorf("cannot create universal launcher. Keywords for sublaunchers should be unique and they are not: '%s'", l.Keyword()) } keyToSublauncher[l.Keyword()] = l } if len(l.sublaunchers) == 0 { // no sub launchers return args, fmt.Errorf("there are no sub launchers to parse the arguments") } // default to the first one in the list l.chosenLauncher = l.sublaunchers[0] if len(args) == 0 { // execute the default one return l.chosenLauncher.Parse(args) } // there are arguments key := args[0] if keyLauncher, ok := keyToSublauncher[key]; ok { // match found, use it, continue parsing without the matching keyword l.chosenLauncher = keyLauncher return l.chosenLauncher.Parse(args[1:]) } // no match found, return l.chosenLauncher.Parse(args) } // CommandLineSyntax implements launcher.Launcher. func (l *uniLauncher) CommandLineSyntax() string { if len(l.sublaunchers) == 0 { // no sub launchers return l.simpleDescription() + "\n\nThere are no sublaunchers to format syntax for." } var b strings.Builder fmt.Fprintf(&b, "Arguments: Specify one of the following:\n") for _, l := range l.sublaunchers { fmt.Fprintf(&b, " * %s - %s\n", l.Keyword(), l.SimpleDescription()) } fmt.Fprintf(&b, "Details:\n") for _, l := range l.sublaunchers { fmt.Fprintf(&b, " %s\n%s\n", l.Keyword(), l.CommandLineSyntax()) } return b.String() } // simpleDescription provides a brief explanation of the universal launcher. func (l *uniLauncher) simpleDescription() string { return `Universal launcher acts as a router, routing command line arguments to one of its sublaunchers. The sublauncher is chosen by the first argument - a keyword. If there are no arguments at all or the first one is not recognized by any of the sublaunchers, the first sublauncher is used.` } // ErrorOnUnparsedArgs returns an error if there are any unparsed arguments left. func ErrorOnUnparsedArgs(args []string) error { if len(args) > 0 { return fmt.Errorf("cannot parse following arguments: %v", args) } return nil } ================================================ FILE: cmd/launcher/web/a2a/a2a.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package a2a provides a sublauncher that provides A2A capabilities. package a2a import ( "flag" "fmt" "net/url" a2acore "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "github.com/gorilla/mux" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/internal/cli/util" "google.golang.org/adk/runner" "google.golang.org/adk/server/adka2a" ) // apiPath is a suffix used to build an A2A invocation URL const apiPath = "/a2a/invoke" // a2aConfig contains parameters for launching ADK A2A server type a2aConfig struct { agentURL string // user-provided url which will be used in the agent card to specify url for invoking A2A } type a2aLauncher struct { flags *flag.FlagSet // flags are used to parse command-line arguments config *a2aConfig } // NewLauncher creates new a2a launcher. It extends Web launcher func NewLauncher() web.Sublauncher { config := &a2aConfig{} fs := flag.NewFlagSet("a2a", flag.ContinueOnError) fs.StringVar(&config.agentURL, "a2a_agent_url", "http://localhost:8080", "A2A host URL as advertised in the public agent card. It is used by A2A clients as a connection endpoint.") return &a2aLauncher{ config: config, flags: fs, } } // CommandLineSyntax implements web.Sublauncher. Returns the command-line syntax for the A2A launcher. func (a *a2aLauncher) CommandLineSyntax() string { return util.FormatFlagUsage(a.flags) } // Keyword implements web.Sublauncher. Returns the command-line keyword for A2A launcher. func (a *a2aLauncher) Keyword() string { return "a2a" } func (a *a2aLauncher) Parse(args []string) ([]string, error) { err := a.flags.Parse(args) if err != nil || !a.flags.Parsed() { return nil, fmt.Errorf("failed to parse a2a flags: %v", err) } restArgs := a.flags.Args() return restArgs, nil } // SetupSubrouters implements the web.Sublauncher interface. It adds A2A paths to the main router. func (a *a2aLauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error { publicURL, err := url.JoinPath(a.config.agentURL, apiPath) if err != nil { return err } rootAgent := config.AgentLoader.RootAgent() agentCard := &a2acore.AgentCard{ Name: rootAgent.Name(), Description: rootAgent.Description(), DefaultInputModes: []string{"text/plain"}, DefaultOutputModes: []string{"text/plain"}, URL: publicURL, PreferredTransport: a2acore.TransportProtocolJSONRPC, Skills: adka2a.BuildAgentSkills(rootAgent), Capabilities: a2acore.AgentCapabilities{Streaming: true}, SupportsAuthenticatedExtendedCard: false, } router.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(agentCard)) agent := config.AgentLoader.RootAgent() executor := adka2a.NewExecutor(adka2a.ExecutorConfig{ RunnerConfig: runner.Config{ AppName: agent.Name(), Agent: agent, SessionService: config.SessionService, ArtifactService: config.ArtifactService, PluginConfig: config.PluginConfig, }, }) reqHandler := a2asrv.NewHandler(executor, config.A2AOptions...) router.Handle(apiPath, a2asrv.NewJSONRPCHandler(reqHandler)) return nil } // SimpleDescription implements web.Sublauncher func (a *a2aLauncher) SimpleDescription() string { return fmt.Sprintf("starts A2A server which handles jsonrpc requests on %s path", apiPath) } // UserMessage implements web.Sublauncher. func (a *a2aLauncher) UserMessage(webUrl string, printer func(v ...any)) { printer(fmt.Sprintf(" a2a: you can access A2A using jsonrpc protocol: %s", webUrl)) } ================================================ FILE: cmd/launcher/web/a2a/a2a_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package a2a import ( "iter" "net" "strconv" "testing" "time" a2acore "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2aclient/agentcard" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/session" ) func getFreePort(t *testing.T) int { t.Helper() addr, err := net.ResolveTCPAddr("tcp", "localhost:0") if err != nil { t.Fatalf("net.ResolveTCPAddr() error = %v", err) } listener, err := net.ListenTCP("tcp", addr) if err != nil { t.Fatalf("net.ListenTCP() error = %v", err) } tcpAddr, ok := listener.Addr().(*net.TCPAddr) if !ok { t.Fatalf("listener.Addr() = %T, want net.TCPAddr", listener.Addr()) } port := tcpAddr.Port if err := listener.Close(); err != nil { t.Fatalf("listener.Close() error = %v", err) } return port } func TestWebLauncher_ServesA2A(t *testing.T) { ctx := t.Context() port := getFreePort(t) l := web.NewLauncher(NewLauncher()) _, err := l.Parse([]string{ "--port", strconv.Itoa(port), "a2a", "--a2a_agent_url", "http://localhost:" + strconv.Itoa(port), }) if err != nil { t.Fatalf("web.NewLauncher() error = %v", err) } wantMessage := "Hello, world!" agnt, err := agent.New(agent.Config{ Name: "HelloWorldAgent", Run: func(ic agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { event := session.NewEvent(ic.InvocationID()) event.Content = genai.NewContentFromText(wantMessage, genai.RoleModel) yield(event, nil) } }, }) if err != nil { t.Fatalf("agent.New() error = %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(agnt), SessionService: session.InMemoryService(), } go func() { if err := l.Run(t.Context(), config); err != nil { t.Errorf("launcher.Run() error = %v", err) } }() var card *a2acore.AgentCard for retry := range 3 { time.Sleep(10 * time.Millisecond) // give server time to start card, err = agentcard.DefaultResolver.Resolve(ctx, "http://localhost:"+strconv.Itoa(port)) if err == nil { break } if retry == 2 { t.Fatalf("cardResolver.Resolve() error = %v", err) } } client, err := a2aclient.NewFromCard(ctx, card) if err != nil { t.Fatalf("a2aclient.NewFromCard() error = %v", err) } got, err := client.SendMessage(ctx, &a2acore.MessageSendParams{ Message: a2acore.NewMessage(a2acore.MessageRoleUser, a2acore.TextPart{Text: "Hi!"}), }) if err != nil { t.Fatalf("client.SendMessage() error = %v", err) } task, ok := got.(*a2acore.Task) if !ok { t.Fatalf("client.SendMessage() result type = %T, want a2a.Task", got) } if len(task.Artifacts) != 1 { t.Fatalf("len(task.Artifacts) = %d, want 1", len(task.Artifacts)) } parts := task.Artifacts[0].Parts if len(parts) != 1 { t.Fatalf("len(task.Artifacts[0].Parts) = %d, want 1", len(parts)) } if gotPart, ok := parts[0].(a2acore.TextPart); !ok || gotPart.Text != wantMessage { t.Fatalf("task.Artifacts[0].Parts[0] = %v, want %v", parts[0], a2acore.TextPart{Text: wantMessage}) } } ================================================ FILE: cmd/launcher/web/api/api.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package api provides a sublauncher that adds ADK REST API capabilities. package api import ( "flag" "fmt" "net/http" "strings" "time" "github.com/gorilla/mux" "google.golang.org/adk/cmd/launcher" weblauncher "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/internal/cli/util" "google.golang.org/adk/server/adkrest" "google.golang.org/adk/telemetry" ) // apiConfig contains parametres for lauching ADK REST API type apiConfig struct { frontendAddress string pathPrefix string sseWriteTimeout time.Duration } // apiLauncher can launch ADK REST API type apiLauncher struct { flags *flag.FlagSet config *apiConfig } // CommandLineSyntax returns the command-line syntax for the API launcher. func (a *apiLauncher) CommandLineSyntax() string { return util.FormatFlagUsage(a.flags) } // Adds CORS headers which allow calling ADK REST API from another web app (like ADK WebUI) func corsWithArgs(frontendAddress string) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", frontendAddress) w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") if r.Method == "OPTIONS" { w.WriteHeader(http.StatusOK) return } next.ServeHTTP(w, r) }) } } // UserMessage implements web.Sublauncher. Prints message to the user func (a *apiLauncher) UserMessage(webURL string, printer func(v ...any)) { printer(fmt.Sprintf(" api: you can access API using %s%s", webURL, a.config.pathPrefix)) printer(fmt.Sprintf(" api: for instance: %s%s/list-apps", webURL, a.config.pathPrefix)) } // SetupSubrouters adds the API router to the parent router. func (a *apiLauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error { // Create the ADK REST API handler restServer, err := adkrest.NewServer(adkrest.ServerConfig{ SessionService: config.SessionService, MemoryService: config.MemoryService, AgentLoader: config.AgentLoader, ArtifactService: config.ArtifactService, SSEWriteTimeout: a.config.sseWriteTimeout, PluginConfig: config.PluginConfig, }) if err != nil { return fmt.Errorf("failed to create REST server: %w", err) } config.TelemetryOptions = append(config.TelemetryOptions, telemetry.WithSpanProcessors(restServer.SpanProcessor()), telemetry.WithLogRecordProcessors(restServer.LogProcessor())) // Wrap it with CORS middleware corsHandler := corsWithArgs(a.config.frontendAddress)(restServer) // If prefix is empty, don't use PathPrefix("") because it's too greedy. // Instead, attach the handler to the main router directly. if a.config.pathPrefix == "" || a.config.pathPrefix == "/" { // This allows other routes (like /ui/) to match first if registered router.Methods("GET", "POST", "DELETE", "OPTIONS").Handler(corsHandler) } else { router.Methods("GET", "POST", "DELETE", "OPTIONS"). PathPrefix(a.config.pathPrefix). Handler(http.StripPrefix(a.config.pathPrefix, corsHandler)) } return nil } // Keyword implements web.Sublauncher. Returns the command-line keyword for API launcher. func (a *apiLauncher) Keyword() string { return "api" } // Parse parses the command-line arguments for the API launcher. func (a *apiLauncher) Parse(args []string) ([]string, error) { err := a.flags.Parse(args) if err != nil || !a.flags.Parsed() { return nil, fmt.Errorf("failed to parse api flags: %v", err) } p := a.config.pathPrefix if !strings.HasPrefix(p, "/") { p = "/" + p } a.config.pathPrefix = strings.TrimSuffix(p, "/") restArgs := a.flags.Args() return restArgs, nil } // SimpleDescription implements web.Sublauncher. Returns a simple description of the API launcher. func (a *apiLauncher) SimpleDescription() string { return "starts ADK REST API server, accepting origins specified by webui_address (CORS)" } // NewLauncher creates new api launcher. It extends Web launcher func NewLauncher() weblauncher.Sublauncher { config := &apiConfig{} fs := flag.NewFlagSet("web", flag.ContinueOnError) fs.StringVar(&config.frontendAddress, "webui_address", "localhost:8080", "ADK WebUI address as seen from the user browser. It's used to allow CORS requests. Please specify only hostname and (optionally) port.") fs.StringVar(&config.pathPrefix, "path_prefix", "/api", "ADK REST API path prefix. Default is '/api'.") fs.DurationVar(&config.sseWriteTimeout, "sse-write-timeout", 120*time.Second, "SSE server write timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for writing the SSE response after reading the headers & body") return &apiLauncher{ config: config, flags: fs, } } ================================================ FILE: cmd/launcher/web/web.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package web provides a way to run ADK using a web server. package web import ( "context" "errors" "flag" "fmt" "log" "net/http" "strings" "time" "github.com/gorilla/mux" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/internal/telemetry" "google.golang.org/adk/cmd/launcher/universal" "google.golang.org/adk/internal/cli/util" "google.golang.org/adk/session" ) // webConfig contains parameters for launching web server type webConfig struct { port int writeTimeout time.Duration readTimeout time.Duration idleTimeout time.Duration shutdownTimeout time.Duration otelToCloud bool } // webLauncher can launch web server type webLauncher struct { flags *flag.FlagSet config *webConfig sublaunchers []Sublauncher // maps keyword to sublauncher for the keywords parsed from command line activeSublaunchers map[string]Sublauncher } // Execute implements launcher.Launcher. func (w *webLauncher) Execute(ctx context.Context, config *launcher.Config, args []string) error { remainingArgs, err := w.Parse(args) if err != nil { return fmt.Errorf("cannot parse args: %w", err) } // do not accept additional arguments err = universal.ErrorOnUnparsedArgs(remainingArgs) if err != nil { return fmt.Errorf("cannot parse all the arguments: %w", err) } return w.Run(ctx, config) } // Sublauncher defines an interface for extending the WebLauncher. // Each sublauncher can add its own routes, wrap existing handlers, and parse its own command-line flags. type Sublauncher interface { // Keyword is used to request usage of the Sublauncher from command-line Keyword() string // Parse after parsing command line args returns the remaining un-parsed arguments or error Parse(args []string) ([]string, error) // CommandLineSyntax returns a formatted string explaining command line syntax to end user CommandLineSyntax() string // SimpleDescription returns a short explanatory text displayed to end user SimpleDescription() string // SetupSubrouters adds sublauncher-specific routes to the router. SetupSubrouters(router *mux.Router, config *launcher.Config) error // UserMessage is a hook for sublaunchers to print a message to the user when the web server starts. UserMessage(webURL string, printer func(v ...any)) } // CommandLineSyntax implements launcher.Launcher. func (w *webLauncher) CommandLineSyntax() string { var b strings.Builder fmt.Fprint(&b, util.FormatFlagUsage(w.flags)) fmt.Fprintf(&b, " You may specify sublaunchers:\n") for _, l := range w.sublaunchers { fmt.Fprintf(&b, " * %s - %s\n", l.Keyword(), l.SimpleDescription()) } fmt.Fprintf(&b, " Sublaunchers syntax:\n") for _, l := range w.sublaunchers { fmt.Fprintf(&b, " %s\n %s\n", l.Keyword(), l.CommandLineSyntax()) } return b.String() } // Keyword implements launcher.SubLauncher. func (w *webLauncher) Keyword() string { return "web" } // Parse implements launcher.SubLauncher. It parses the web launcher's flags // and then iterates through the remaining arguments to find and parse arguments // for any specified sublaunchers. It returns any arguments that are not processed. func (w *webLauncher) Parse(args []string) ([]string, error) { keyToSublauncher := make(map[string]Sublauncher) for _, l := range w.sublaunchers { if _, ok := keyToSublauncher[l.Keyword()]; ok { return nil, fmt.Errorf("cannot create universal launcher. Keywords for sublaunchers should be unique and they are not: '%s'", l.Keyword()) } keyToSublauncher[l.Keyword()] = l } err := w.flags.Parse(args) if err != nil || !w.flags.Parsed() { return nil, fmt.Errorf("failed to parse web flags: %v", err) } restArgs := w.flags.Args() w.activeSublaunchers = make(map[string]Sublauncher) for len(restArgs) > 0 { keyword := restArgs[0] if _, ok := w.activeSublaunchers[keyword]; ok { // already processed return restArgs, fmt.Errorf("the keyword %q is specified and processed more than once, which is not allowed", keyword) } if sublauncher, ok := keyToSublauncher[keyword]; ok { // skip the keyword and move on restArgs, err = sublauncher.Parse(restArgs[1:]) if err != nil { return nil, fmt.Errorf("the %q launcher cannot parse arguments: %v", keyword, err) } w.activeSublaunchers[keyword] = sublauncher } else { // not known keyword, let it be processed elsewhere break } } return restArgs, nil } // Run implements launcher.SubLauncher. func (w *webLauncher) Run(ctx context.Context, config *launcher.Config) error { if config.SessionService == nil { config.SessionService = session.InMemoryService() } router := BuildBaseRouter() // check if there are any active sublaunchers if len(w.activeSublaunchers) == 0 { availableSublaunchers := make([]string, len(w.sublaunchers)) for i, l := range w.sublaunchers { availableSublaunchers[i] = l.Keyword() } return fmt.Errorf("no active sublaunchers found - please specify them in the command line. Possible values: %v", availableSublaunchers) } // Setup subrouters for _, l := range w.sublaunchers { if _, isActive := w.activeSublaunchers[l.Keyword()]; isActive { if err := l.SetupSubrouters(router, config); err != nil { return fmt.Errorf("%s subrouter setup failed: %v", l.Keyword(), err) } } } log.Printf("Starting the web server: %+v", w.config) log.Println() webUrl := fmt.Sprintf("http://localhost:%v", fmt.Sprint(w.config.port)) log.Printf("Web servers starts on %s", webUrl) for _, l := range w.activeSublaunchers { l.UserMessage(webUrl, log.Println) } log.Println() srv := http.Server{ Addr: fmt.Sprintf(":%v", fmt.Sprint(w.config.port)), WriteTimeout: w.config.writeTimeout, ReadTimeout: w.config.readTimeout, IdleTimeout: w.config.idleTimeout, Handler: router, } errChan := make(chan error, 1) go func() { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { errChan <- err } close(errChan) }() telemetryService, err := telemetry.InitAndSetGlobalOtelProviders(ctx, config, w.config.otelToCloud) if err != nil { return fmt.Errorf("telemetry initialization failed: %v", err) } select { case <-ctx.Done(): log.Println("Shutting down the web server...") shutdownCtx, cancel := context.WithTimeout(context.Background(), w.config.shutdownTimeout) defer cancel() serverErr := srv.Shutdown(shutdownCtx) telemetryErr := telemetryService.Shutdown(shutdownCtx) return errors.Join(serverErr, telemetryErr) case err, ok := <-errChan: if !ok { return nil } return fmt.Errorf("server failed: %v", err) } } // SimpleDescription implements launcher.SubLauncher. func (w *webLauncher) SimpleDescription() string { return "starts web server with additional sub-servers specified by sublaunchers" } // NewLauncher creates a new WebLauncher. It should be extended by providing // one or more Sublaunchers that add the actual content and functionality. func NewLauncher(sublaunchers ...Sublauncher) launcher.SubLauncher { config := &webConfig{} fs := flag.NewFlagSet("web", flag.ContinueOnError) fs.IntVar(&config.port, "port", 8080, "Localhost port for the server") fs.DurationVar(&config.writeTimeout, "write-timeout", 15*time.Second, "Server write timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for writing the response after reading the headers & body") fs.DurationVar(&config.readTimeout, "read-timeout", 15*time.Second, "Server read timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for reading the whole request including body") fs.DurationVar(&config.idleTimeout, "idle-timeout", 60*time.Second, "Server idle timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for the next request (only when keep-alive is enabled)") fs.DurationVar(&config.shutdownTimeout, "shutdown-timeout", 15*time.Second, "Server shutdown timeout (i.e. '10s', '2m' - see time.ParseDuration for details) - for waiting for active requests to finish during shutdown") fs.BoolVar(&config.otelToCloud, "otel_to_cloud", false, "Enables/disables OpenTelemetry export to GCP: telemetry.googleapis.com. See adk-go/telemetry package for details about supported options, credentials and environment variables.") return &webLauncher{ config: config, flags: fs, sublaunchers: sublaunchers, } } // logger is a middleware that logs the HTTP method, request URI, and the time taken to process the request. func logger(inner http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() inner.ServeHTTP(w, r) log.Printf( "%s %s %s", r.Method, r.RequestURI, time.Since(start), ) }) } // BuildBaseRouter returns the main router, which can be extended by sub-routers. func BuildBaseRouter() *mux.Router { router := mux.NewRouter().StrictSlash(true) router.Use(logger) return router } ================================================ FILE: cmd/launcher/web/webui/distr/assets/audio-processor.js ================================================ /** * Copyright 2025 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ class AudioProcessor extends AudioWorkletProcessor { constructor() { super(); this.targetSampleRate = 22000; // Change to your desired rate this.originalSampleRate = sampleRate; // Browser's sample rate this.resampleRatio = this.originalSampleRate / this.targetSampleRate; } process(inputs, outputs, parameters) { const input = inputs[0]; if (input.length > 0) { let audioData = input[0]; // Get first channel's data if (this.resampleRatio !== 1) { audioData = this.resample(audioData); } this.port.postMessage(audioData); } return true; // Keep processor alive } resample(audioData) { const newLength = Math.round(audioData.length / this.resampleRatio); const resampled = new Float32Array(newLength); for (let i = 0; i < newLength; i++) { const srcIndex = Math.floor(i * this.resampleRatio); resampled[i] = audioData[srcIndex]; // Nearest neighbor resampling } return resampled; } } registerProcessor('audio-processor', AudioProcessor); ================================================ FILE: cmd/launcher/web/webui/distr/assets/config/runtime-config.json ================================================ { "backendUrl": "" } ================================================ FILE: cmd/launcher/web/webui/distr/chunk-2FK4DXD6.js ================================================ import{$a as c,Ca as o,Fb as h,Kb as y,Pa as a,Xb as C,Yb as g,db as d,lc as v,ld as _,md as w,tb as s,ub as l,vb as p,wb as m,xb as u,yb as f}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var D=e=>[e];function M(e,F){if(e&1&&h(0,0),e&2){let i=F.$implicit,n=y();m("surfaceId",n.surfaceId())("component",i)}}var T=(()=>{class e extends _{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=c({type:e,selectors:[["a2ui-card"]],features:[d],decls:3,vars:6,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,t){if(n&1&&(u(0,"section"),l(1,M,1,2,"ng-container",0,s),f()),n&2){let r=t.component().properties,I=r.children||v(4,D,r.child);C(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Card),g(t.theme.components.Card),a(),p(I)}},dependencies:[w],styles:[`a2ui-card{display:block;flex:var(--weight);min-height:0;overflow:auto}a2ui-card>section{height:100%;width:100%;min-height:0;overflow:auto}a2ui-card>section>*{height:100%;width:100%} `],encapsulation:2})}return e})();export{T as Card}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-4ZK7FQPX.js ================================================ import{$a as s,Ab as m,Ac as I,Bb as d,Ca as a,Kb as p,Pa as i,Xb as u,Yb as v,Zb as f,_b as y,db as r,fc as g,gc as h,hc as x,ld as M,pb as c,rb as l,uc as C}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function _(e,D){if(e&1&&(m(0,"section")(1,"span",1),f(2),d()()),e&2){let t=p(),n=x(0);u(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Icon),v(t.theme.components.Icon),i(2),y(n)}}var S=(()=>{class e extends M{name=I.required();resolvedName=C(()=>this.resolvePrimitive(this.name()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=a(e)))(o||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-icon"]],inputs:{name:[1,"name"]},features:[r],decls:2,vars:2,consts:[[3,"class","style"],[1,"g-icon"]],template:function(n,o){if(n&1&&(g(0),c(1,_,3,5,"section",0)),n&2){let N=h(o.resolvedName());i(),l(N?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}"]})}return e})();export{S as Icon}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-7TJPJFPQ.js ================================================ import{a as M,b as P,e as pr,g as lt}from"./chunk-W7GRJBO5.js";var me=null,Li=!1,Ha=1,tD=null,ne=Symbol("SIGNAL");function I(e){let t=me;return me=e,t}function ji(){return me}var Qt={version:0,lastCleanEpoch:0,dirty:!1,producers:void 0,producersTail:void 0,consumers:void 0,consumersTail:void 0,recomputing:!1,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function Kt(e){if(Li)throw new Error("");if(me===null)return;me.consumerOnSignalRead(e);let t=me.producersTail;if(t!==void 0&&t.producer===e)return;let n,r=me.recomputing;if(r&&(n=t!==void 0?t.nextProducer:me.producers,n!==void 0&&n.producer===e)){me.producersTail=n,n.lastReadVersion=e.version;return}let o=e.consumersTail;if(o!==void 0&&o.consumer===me&&(!r||rD(o,me)))return;let i=mr(me),s={producer:e,consumer:me,nextProducer:n,prevConsumer:o,lastReadVersion:e.version,nextConsumer:void 0};me.producersTail=s,t!==void 0?t.nextProducer=s:me.producers=s,i&&Fh(e,s)}function Nh(){Ha++}function xn(e){if(!(mr(e)&&!e.dirty)&&!(!e.dirty&&e.lastCleanEpoch===Ha)){if(!e.producerMustRecompute(e)&&!gr(e)){hr(e);return}e.producerRecomputeValue(e),hr(e)}}function $a(e){if(e.consumers===void 0)return;let t=Li;Li=!0;try{for(let n=e.consumers;n!==void 0;n=n.nextConsumer){let r=n.consumer;r.dirty||nD(r)}}finally{Li=t}}function Ua(){return me?.consumerAllowSignalWrites!==!1}function nD(e){e.dirty=!0,$a(e),e.consumerMarkedDirty?.(e)}function hr(e){e.dirty=!1,e.lastCleanEpoch=Ha}function Tt(e){return e&&kh(e),I(e)}function kh(e){e.producersTail=void 0,e.recomputing=!0}function Jt(e,t){I(t),e&&Rh(e)}function Rh(e){e.recomputing=!1;let t=e.producersTail,n=t!==void 0?t.nextProducer:e.producers;if(n!==void 0){if(mr(e))do n=za(n);while(n!==void 0);t!==void 0?t.nextProducer=void 0:e.producers=void 0}}function gr(e){for(let t=e.producers;t!==void 0;t=t.nextProducer){let n=t.producer,r=t.lastReadVersion;if(r!==n.version||(xn(n),r!==n.version))return!0}return!1}function Xt(e){if(mr(e)){let t=e.producers;for(;t!==void 0;)t=za(t)}e.producers=void 0,e.producersTail=void 0,e.consumers=void 0,e.consumersTail=void 0}function Fh(e,t){let n=e.consumersTail,r=mr(e);if(n!==void 0?(t.nextConsumer=n.nextConsumer,n.nextConsumer=t):(t.nextConsumer=void 0,e.consumers=t),t.prevConsumer=n,e.consumersTail=t,!r)for(let o=e.producers;o!==void 0;o=o.nextProducer)Fh(o.producer,o)}function za(e){let t=e.producer,n=e.nextProducer,r=e.nextConsumer,o=e.prevConsumer;if(e.nextConsumer=void 0,e.prevConsumer=void 0,r!==void 0?r.prevConsumer=o:t.consumersTail=o,o!==void 0)o.nextConsumer=r;else if(t.consumers=r,!mr(t)){let i=t.producers;for(;i!==void 0;)i=za(i)}return n}function mr(e){return e.consumerIsAlwaysLive||e.consumers!==void 0}function bo(e){tD?.(e)}function rD(e,t){let n=t.producersTail;if(n!==void 0){let r=t.producers;do{if(r===e)return!0;if(r===n)break;r=r.nextProducer}while(r!==void 0)}return!1}function vo(e,t){return Object.is(e,t)}function Do(e,t){let n=Object.create(oD);n.computation=e,t!==void 0&&(n.equal=t);let r=()=>{if(xn(n),Kt(n),n.value===dt)throw n.error;return n.value};return r[ne]=n,bo(n),r}var Yt=Symbol("UNSET"),wn=Symbol("COMPUTING"),dt=Symbol("ERRORED"),oD=P(M({},Qt),{value:Yt,dirty:!0,error:null,equal:vo,kind:"computed",producerMustRecompute(e){return e.value===Yt||e.value===wn},producerRecomputeValue(e){if(e.value===wn)throw new Error("");let t=e.value;e.value=wn;let n=Tt(e),r,o=!1;try{r=e.computation(),I(null),o=t!==Yt&&t!==dt&&r!==dt&&e.equal(t,r)}catch(i){r=dt,e.error=i}finally{Jt(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function iD(){throw new Error}var Oh=iD;function Ph(e){Oh(e)}function qa(e){Oh=e}var sD=null;function Ga(e,t){let n=Object.create(Eo);n.value=e,t!==void 0&&(n.equal=t);let r=()=>Lh(n);return r[ne]=n,bo(n),[r,s=>In(n,s),s=>Bi(n,s)]}function Lh(e){return Kt(e),e.value}function In(e,t){Ua()||Ph(e),e.equal(e.value,t)||(e.value=t,uD(e))}function Bi(e,t){Ua()||Ph(e),In(e,t(e.value))}var Eo=P(M({},Qt),{equal:vo,value:void 0,kind:"signal"});function uD(e){e.version++,Nh(),$a(e),sD?.(e)}var Wa=P(M({},Qt),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,kind:"effect"});function Za(e){if(e.dirty=!1,e.version>0&&!gr(e))return;e.version++;let t=Tt(e);try{e.cleanup(),e.fn()}finally{Jt(e,t)}}function k(e){return typeof e=="function"}function yr(e){let n=e(r=>{Error.call(r),r.stack=new Error().stack});return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n}var Vi=yr(e=>function(n){e(this),this.message=n?`${n.length} errors occurred during unsubscription: ${n.map((r,o)=>`${o+1}) ${r.toString()}`).join(` `)}`:"",this.name="UnsubscriptionError",this.errors=n});function Tn(e,t){if(e){let n=e.indexOf(t);0<=n&&e.splice(n,1)}}var X=class e{constructor(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let t;if(!this.closed){this.closed=!0;let{_parentage:n}=this;if(n)if(this._parentage=null,Array.isArray(n))for(let i of n)i.remove(this);else n.remove(this);let{initialTeardown:r}=this;if(k(r))try{r()}catch(i){t=i instanceof Vi?i.errors:[i]}let{_finalizers:o}=this;if(o){this._finalizers=null;for(let i of o)try{jh(i)}catch(s){t=t??[],s instanceof Vi?t=[...t,...s.errors]:t.push(s)}}if(t)throw new Vi(t)}}add(t){var n;if(t&&t!==this)if(this.closed)jh(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(n=this._finalizers)!==null&&n!==void 0?n:[]).push(t)}}_hasParent(t){let{_parentage:n}=this;return n===t||Array.isArray(n)&&n.includes(t)}_addParent(t){let{_parentage:n}=this;this._parentage=Array.isArray(n)?(n.push(t),n):n?[n,t]:t}_removeParent(t){let{_parentage:n}=this;n===t?this._parentage=null:Array.isArray(n)&&Tn(n,t)}remove(t){let{_finalizers:n}=this;n&&Tn(n,t),t instanceof e&&t._removeParent(this)}};X.EMPTY=(()=>{let e=new X;return e.closed=!0,e})();var Ya=X.EMPTY;function Hi(e){return e instanceof X||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function jh(e){k(e)?e():e.unsubscribe()}var We={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var br={setTimeout(e,t,...n){let{delegate:r}=br;return r?.setTimeout?r.setTimeout(e,t,...n):setTimeout(e,t,...n)},clearTimeout(e){let{delegate:t}=br;return(t?.clearTimeout||clearTimeout)(e)},delegate:void 0};function $i(e){br.setTimeout(()=>{let{onUnhandledError:t}=We;if(t)t(e);else throw e})}function St(){}var Bh=Qa("C",void 0,void 0);function Vh(e){return Qa("E",void 0,e)}function Hh(e){return Qa("N",e,void 0)}function Qa(e,t,n){return{kind:e,value:t,error:n}}var Sn=null;function vr(e){if(We.useDeprecatedSynchronousErrorHandling){let t=!Sn;if(t&&(Sn={errorThrown:!1,error:null}),e(),t){let{errorThrown:n,error:r}=Sn;if(Sn=null,n)throw r}}else e()}function $h(e){We.useDeprecatedSynchronousErrorHandling&&Sn&&(Sn.errorThrown=!0,Sn.error=e)}var Mn=class extends X{constructor(t){super(),this.isStopped=!1,t?(this.destination=t,Hi(t)&&t.add(this)):this.destination=lD}static create(t,n,r){return new Ze(t,n,r)}next(t){this.isStopped?Ja(Hh(t),this):this._next(t)}error(t){this.isStopped?Ja(Vh(t),this):(this.isStopped=!0,this._error(t))}complete(){this.isStopped?Ja(Bh,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(t){this.destination.next(t)}_error(t){try{this.destination.error(t)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},aD=Function.prototype.bind;function Ka(e,t){return aD.call(e,t)}var Xa=class{constructor(t){this.partialObserver=t}next(t){let{partialObserver:n}=this;if(n.next)try{n.next(t)}catch(r){Ui(r)}}error(t){let{partialObserver:n}=this;if(n.error)try{n.error(t)}catch(r){Ui(r)}else Ui(t)}complete(){let{partialObserver:t}=this;if(t.complete)try{t.complete()}catch(n){Ui(n)}}},Ze=class extends Mn{constructor(t,n,r){super();let o;if(k(t)||!t)o={next:t??void 0,error:n??void 0,complete:r??void 0};else{let i;this&&We.useDeprecatedNextContext?(i=Object.create(t),i.unsubscribe=()=>this.unsubscribe(),o={next:t.next&&Ka(t.next,i),error:t.error&&Ka(t.error,i),complete:t.complete&&Ka(t.complete,i)}):o=t}this.destination=new Xa(o)}};function Ui(e){We.useDeprecatedSynchronousErrorHandling?$h(e):$i(e)}function cD(e){throw e}function Ja(e,t){let{onStoppedNotification:n}=We;n&&br.setTimeout(()=>n(e,t))}var lD={closed:!0,next:St,error:cD,complete:St};var Dr=typeof Symbol=="function"&&Symbol.observable||"@@observable";function Ee(e){return e}function dD(...e){return ec(e)}function ec(e){return e.length===0?Ee:e.length===1?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}var B=(()=>{class e{constructor(n){n&&(this._subscribe=n)}lift(n){let r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){let i=pD(n)?n:new Ze(n,r,o);return vr(()=>{let{operator:s,source:u}=this;i.add(s?s.call(i,u):u?this._subscribe(i):this._trySubscribe(i))}),i}_trySubscribe(n){try{return this._subscribe(n)}catch(r){n.error(r)}}forEach(n,r){return r=Uh(r),new r((o,i)=>{let s=new Ze({next:u=>{try{n(u)}catch(a){i(a),s.unsubscribe()}},error:i,complete:o});this.subscribe(s)})}_subscribe(n){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(n)}[Dr](){return this}pipe(...n){return ec(n)(this)}toPromise(n){return n=Uh(n),new n((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function Uh(e){var t;return(t=e??We.Promise)!==null&&t!==void 0?t:Promise}function fD(e){return e&&k(e.next)&&k(e.error)&&k(e.complete)}function pD(e){return e&&e instanceof Mn||fD(e)&&Hi(e)}function tc(e){return k(e?.lift)}function j(e){return t=>{if(tc(t))return t.lift(function(n){try{return e(n,this)}catch(r){this.error(r)}});throw new TypeError("Unable to lift unknown Observable type")}}function R(e,t,n,r,o){return new nc(e,t,n,r,o)}var nc=class extends Mn{constructor(t,n,r,o,i,s){super(t),this.onFinalize=i,this.shouldUnsubscribe=s,this._next=n?function(u){try{n(u)}catch(a){t.error(a)}}:super._next,this._error=o?function(u){try{o(u)}catch(a){t.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=r?function(){try{r()}catch(u){t.error(u)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:n}=this;super.unsubscribe(),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}}};function zh(){return j((e,t)=>{let n=null;e._refCount++;let r=R(t,void 0,void 0,void 0,()=>{if(!e||e._refCount<=0||0<--e._refCount){n=null;return}let o=e._connection,i=n;n=null,o&&(!i||o===i)&&o.unsubscribe(),t.unsubscribe()});e.subscribe(r),r.closed||(n=e.connect())})}var rc=class extends B{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._subject=null,this._refCount=0,this._connection=null,tc(t)&&(this.lift=t.lift)}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){let t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:t}=this;this._subject=this._connection=null,t?.unsubscribe()}connect(){let t=this._connection;if(!t){t=this._connection=new X;let n=this.getSubject();t.add(this.source.subscribe(R(n,void 0,()=>{this._teardown(),n.complete()},r=>{this._teardown(),n.error(r)},()=>this._teardown()))),t.closed&&(this._connection=null,t=X.EMPTY)}return t}refCount(){return zh()(this)}};var Er={schedule(e){let t=requestAnimationFrame,n=cancelAnimationFrame,{delegate:r}=Er;r&&(t=r.requestAnimationFrame,n=r.cancelAnimationFrame);let o=t(i=>{n=void 0,e(i)});return new X(()=>n?.(o))},requestAnimationFrame(...e){let{delegate:t}=Er;return(t?.requestAnimationFrame||requestAnimationFrame)(...e)},cancelAnimationFrame(...e){let{delegate:t}=Er;return(t?.cancelAnimationFrame||cancelAnimationFrame)(...e)},delegate:void 0};var qh=yr(e=>function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var ce=(()=>{class e extends B{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(n){let r=new zi(this,this);return r.operator=n,r}_throwIfClosed(){if(this.closed)throw new qh}next(n){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let r of this.currentObservers)r.next(n)}})}error(n){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=n;let{observers:r}=this;for(;r.length;)r.shift().error(n)}})}complete(){vr(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:n}=this;for(;n.length;)n.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var n;return((n=this.observers)===null||n===void 0?void 0:n.length)>0}_trySubscribe(n){return this._throwIfClosed(),super._trySubscribe(n)}_subscribe(n){return this._throwIfClosed(),this._checkFinalizedStatuses(n),this._innerSubscribe(n)}_innerSubscribe(n){let{hasError:r,isStopped:o,observers:i}=this;return r||o?Ya:(this.currentObservers=null,i.push(n),new X(()=>{this.currentObservers=null,Tn(i,n)}))}_checkFinalizedStatuses(n){let{hasError:r,thrownError:o,isStopped:i}=this;r?n.error(o):i&&n.complete()}asObservable(){let n=new B;return n.source=this,n}}return e.create=(t,n)=>new zi(t,n),e})(),zi=class extends ce{constructor(t,n){super(),this.destination=t,this.source=n}next(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.next)===null||r===void 0||r.call(n,t)}error(t){var n,r;(r=(n=this.destination)===null||n===void 0?void 0:n.error)===null||r===void 0||r.call(n,t)}complete(){var t,n;(n=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||n===void 0||n.call(t)}_subscribe(t){var n,r;return(r=(n=this.source)===null||n===void 0?void 0:n.subscribe(t))!==null&&r!==void 0?r:Ya}};var Co=class extends ce{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){let n=super._subscribe(t);return!n.closed&&t.next(this._value),n}getValue(){let{hasError:t,thrownError:n,_value:r}=this;if(t)throw n;return this._throwIfClosed(),r}next(t){super.next(this._value=t)}};var _o={now(){return(_o.delegate||Date).now()},delegate:void 0};var wo=class extends ce{constructor(t=1/0,n=1/0,r=_o){super(),this._bufferSize=t,this._windowTime=n,this._timestampProvider=r,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=n===1/0,this._bufferSize=Math.max(1,t),this._windowTime=Math.max(1,n)}next(t){let{isStopped:n,_buffer:r,_infiniteTimeWindow:o,_timestampProvider:i,_windowTime:s}=this;n||(r.push(t),!o&&r.push(i.now()+s)),this._trimBuffer(),super.next(t)}_subscribe(t){this._throwIfClosed(),this._trimBuffer();let n=this._innerSubscribe(t),{_infiniteTimeWindow:r,_buffer:o}=this,i=o.slice();for(let s=0;sGh(t)&&e()),t},clearImmediate(e){Gh(e)}};var{setImmediate:gD,clearImmediate:mD}=Wh,Io={setImmediate(...e){let{delegate:t}=Io;return(t?.setImmediate||gD)(...e)},clearImmediate(e){let{delegate:t}=Io;return(t?.clearImmediate||mD)(e)},delegate:void 0};var Gi=class extends en{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Io.setImmediate(t.flush.bind(t,void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Io.clearImmediate(n),t._scheduled===n&&(t._scheduled=void 0))}};var Cr=class e{constructor(t,n=e.now){this.schedulerActionCtor=t,this.now=n}schedule(t,n=0,r){return new this.schedulerActionCtor(this,t).schedule(r,n)}};Cr.now=_o.now;var tn=class extends Cr{constructor(t,n=Cr.now){super(t,n),this.actions=[],this._active=!1}flush(t){let{actions:n}=this;if(this._active){n.push(t);return}let r;this._active=!0;do if(r=t.execute(t.state,t.delay))break;while(t=n.shift());if(this._active=!1,r){for(;t=n.shift();)t.unsubscribe();throw r}}};var Wi=class extends tn{flush(t){this._active=!0;let n=this._scheduled;this._scheduled=void 0;let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var yD=new Wi(Gi);var _r=new tn(en),sc=_r;var Zi=class extends en{constructor(t,n){super(t,n),this.scheduler=t,this.work=n}requestAsyncId(t,n,r=0){return r!==null&&r>0?super.requestAsyncId(t,n,r):(t.actions.push(this),t._scheduled||(t._scheduled=Er.requestAnimationFrame(()=>t.flush(void 0))))}recycleAsyncId(t,n,r=0){var o;if(r!=null?r>0:this.delay>0)return super.recycleAsyncId(t,n,r);let{actions:i}=t;n!=null&&n===t._scheduled&&((o=i[i.length-1])===null||o===void 0?void 0:o.id)!==n&&(Er.cancelAnimationFrame(n),t._scheduled=void 0)}};var Yi=class extends tn{flush(t){this._active=!0;let n;t?n=t.id:(n=this._scheduled,this._scheduled=void 0);let{actions:r}=this,o;t=t||r.shift();do if(o=t.execute(t.state,t.delay))break;while((t=r[0])&&t.id===n&&r.shift());if(this._active=!1,o){for(;(t=r[0])&&t.id===n&&r.shift();)t.unsubscribe();throw o}}};var bD=new Yi(Zi);var Mt=new B(e=>e.complete());function Qi(e){return e&&k(e.schedule)}function uc(e){return e[e.length-1]}function nn(e){return k(uc(e))?e.pop():void 0}function ft(e){return Qi(uc(e))?e.pop():void 0}function Zh(e,t){return typeof uc(e)=="number"?e.pop():t}function tk(e,t,n,r){var o=arguments.length,i=o<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")i=Reflect.decorate(e,t,n,r);else for(var u=e.length-1;u>=0;u--)(s=e[u])&&(i=(o<3?s(i):o>3?s(t,n,i):s(t,n))||i);return o>3&&i&&Object.defineProperty(t,n,i),i}function Qh(e,t,n,r){function o(i){return i instanceof n?i:new n(function(s){s(i)})}return new(n||(n=Promise))(function(i,s){function u(l){try{c(r.next(l))}catch(d){s(d)}}function a(l){try{c(r.throw(l))}catch(d){s(d)}}function c(l){l.done?i(l.value):o(l.value).then(u,a)}c((r=r.apply(e,t||[])).next())})}function Yh(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function An(e){return this instanceof An?(this.v=e,this):new An(e)}function Kh(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r=n.apply(e,t||[]),o,i=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),u("next"),u("throw"),u("return",s),o[Symbol.asyncIterator]=function(){return this},o;function s(f){return function(p){return Promise.resolve(p).then(f,d)}}function u(f,p){r[f]&&(o[f]=function(m){return new Promise(function(g,y){i.push([f,m,g,y])>1||a(f,m)})},p&&(o[f]=p(o[f])))}function a(f,p){try{c(r[f](p))}catch(m){h(i[0][3],m)}}function c(f){f.value instanceof An?Promise.resolve(f.value.v).then(l,d):h(i[0][2],f)}function l(f){a("next",f)}function d(f){a("throw",f)}function h(f,p){f(p),i.shift(),i.length&&a(i[0][0],i[0][1])}}function Jh(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],n;return t?t.call(e):(e=typeof Yh=="function"?Yh(e):e[Symbol.iterator](),n={},r("next"),r("throw"),r("return"),n[Symbol.asyncIterator]=function(){return this},n);function r(i){n[i]=e[i]&&function(s){return new Promise(function(u,a){s=e[i](s),o(u,a,s.done,s.value)})}}function o(i,s,u,a){Promise.resolve(a).then(function(c){i({value:c,done:u})},s)}}var wr=e=>e&&typeof e.length=="number"&&typeof e!="function";function Ki(e){return k(e?.then)}function Ji(e){return k(e[Dr])}function Xi(e){return Symbol.asyncIterator&&k(e?.[Symbol.asyncIterator])}function es(e){return new TypeError(`You provided ${e!==null&&typeof e=="object"?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function vD(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var ts=vD();function ns(e){return k(e?.[ts])}function rs(e){return Kh(this,arguments,function*(){let n=e.getReader();try{for(;;){let{value:r,done:o}=yield An(n.read());if(o)return yield An(void 0);yield yield An(r)}}finally{n.releaseLock()}})}function os(e){return k(e?.getReader)}function z(e){if(e instanceof B)return e;if(e!=null){if(Ji(e))return DD(e);if(wr(e))return ED(e);if(Ki(e))return CD(e);if(Xi(e))return Xh(e);if(ns(e))return _D(e);if(os(e))return wD(e)}throw es(e)}function DD(e){return new B(t=>{let n=e[Dr]();if(k(n.subscribe))return n.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ED(e){return new B(t=>{for(let n=0;n{e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,$i)})}function _D(e){return new B(t=>{for(let n of e)if(t.next(n),t.closed)return;t.complete()})}function Xh(e){return new B(t=>{xD(e,t).catch(n=>t.error(n))})}function wD(e){return Xh(rs(e))}function xD(e,t){var n,r,o,i;return Qh(this,void 0,void 0,function*(){try{for(n=Jh(e);r=yield n.next(),!r.done;){let s=r.value;if(t.next(s),t.closed)return}}catch(s){o={error:s}}finally{try{r&&!r.done&&(i=n.return)&&(yield i.call(n))}finally{if(o)throw o.error}}t.complete()})}function Me(e,t,n,r=0,o=!1){let i=t.schedule(function(){n(),o?e.add(this.schedule(null,r)):this.unsubscribe()},r);if(e.add(i),!o)return i}function To(e,t=0){return j((n,r)=>{n.subscribe(R(r,o=>Me(r,e,()=>r.next(o),t),()=>Me(r,e,()=>r.complete(),t),o=>Me(r,e,()=>r.error(o),t)))})}function is(e,t=0){return j((n,r)=>{r.add(e.schedule(()=>n.subscribe(r),t))})}function e0(e,t){return z(e).pipe(is(t),To(t))}function t0(e,t){return z(e).pipe(is(t),To(t))}function n0(e,t){return new B(n=>{let r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}function r0(e,t){return new B(n=>{let r;return Me(n,t,()=>{r=e[ts](),Me(n,t,()=>{let o,i;try{({value:o,done:i}=r.next())}catch(s){n.error(s);return}i?n.complete():n.next(o)},0,!0)}),()=>k(r?.return)&&r.return()})}function ss(e,t){if(!e)throw new Error("Iterable cannot be null");return new B(n=>{Me(n,t,()=>{let r=e[Symbol.asyncIterator]();Me(n,t,()=>{r.next().then(o=>{o.done?n.complete():n.next(o.value)})},0,!0)})})}function o0(e,t){return ss(rs(e),t)}function i0(e,t){if(e!=null){if(Ji(e))return e0(e,t);if(wr(e))return n0(e,t);if(Ki(e))return t0(e,t);if(Xi(e))return ss(e,t);if(ns(e))return r0(e,t);if(os(e))return o0(e,t)}throw es(e)}function pt(e,t){return t?i0(e,t):z(e)}function us(...e){let t=ft(e);return pt(e,t)}function ID(e,t){let n=k(e)?e:()=>e,r=o=>o.error(n());return new B(t?o=>t.schedule(r,0,o):r)}function TD(e){return!!e&&(e instanceof B||k(e.lift)&&k(e.subscribe))}var Nn=yr(e=>function(){e(this),this.name="EmptyError",this.message="no elements in sequence"});function ac(e,t){let n=typeof t=="object";return new Promise((r,o)=>{let i=new Ze({next:s=>{r(s),i.unsubscribe()},error:o,complete:()=>{n?r(t.defaultValue):o(new Nn)}});e.subscribe(i)})}function s0(e){return e instanceof Date&&!isNaN(e)}function Ce(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{r.next(e.call(t,i,o++))}))})}var{isArray:SD}=Array;function MD(e,t){return SD(t)?e(...t):e(t)}function xr(e){return Ce(t=>MD(e,t))}var{isArray:AD}=Array,{getPrototypeOf:ND,prototype:kD,keys:RD}=Object;function as(e){if(e.length===1){let t=e[0];if(AD(t))return{args:t,keys:null};if(FD(t)){let n=RD(t);return{args:n.map(r=>t[r]),keys:n}}}return{args:e,keys:null}}function FD(e){return e&&typeof e=="object"&&ND(e)===kD}function cs(e,t){return e.reduce((n,r,o)=>(n[r]=t[o],n),{})}function OD(...e){let t=ft(e),n=nn(e),{args:r,keys:o}=as(e);if(r.length===0)return pt([],t);let i=new B(PD(r,t,o?s=>cs(o,s):Ee));return n?i.pipe(xr(n)):i}function PD(e,t,n=Ee){return r=>{u0(t,()=>{let{length:o}=e,i=new Array(o),s=o,u=o;for(let a=0;a{let c=pt(e[a],t),l=!1;c.subscribe(R(r,d=>{i[a]=d,l||(l=!0,u--),u||r.next(n(i.slice()))},()=>{--s||r.complete()}))},r)},r)}}function u0(e,t,n){e?Me(n,e,t):t()}function a0(e,t,n,r,o,i,s,u){let a=[],c=0,l=0,d=!1,h=()=>{d&&!a.length&&!c&&t.complete()},f=m=>c{i&&t.next(m),c++;let g=!1;z(n(m,l++)).subscribe(R(t,y=>{o?.(y),i?f(y):t.next(y)},()=>{g=!0},void 0,()=>{if(g)try{for(c--;a.length&&cp(y)):p(y)}h()}catch(y){t.error(y)}}))};return e.subscribe(R(t,f,()=>{d=!0,h()})),()=>{u?.()}}function At(e,t,n=1/0){return k(t)?At((r,o)=>Ce((i,s)=>t(r,i,o,s))(z(e(r,o))),n):(typeof t=="number"&&(n=t),j((r,o)=>a0(r,o,e,n)))}function So(e=1/0){return At(Ee,e)}function c0(){return So(1)}function ls(...e){return c0()(pt(e,ft(e)))}function LD(e){return new B(t=>{z(e()).subscribe(t)})}function jD(...e){let t=nn(e),{args:n,keys:r}=as(e),o=new B(i=>{let{length:s}=n;if(!s){i.complete();return}let u=new Array(s),a=s,c=s;for(let l=0;l{d||(d=!0,c--),u[l]=h},()=>a--,void 0,()=>{(!a||!d)&&(c||i.next(r?cs(r,u):u),i.complete())}))}});return t?o.pipe(xr(t)):o}var BD=["addListener","removeListener"],VD=["addEventListener","removeEventListener"],HD=["on","off"];function cc(e,t,n,r){if(k(n)&&(r=n,n=void 0),r)return cc(e,t,n).pipe(xr(r));let[o,i]=zD(e)?VD.map(s=>u=>e[s](t,u,n)):$D(e)?BD.map(l0(e,t)):UD(e)?HD.map(l0(e,t)):[];if(!o&&wr(e))return At(s=>cc(s,t,n))(z(e));if(!o)throw new TypeError("Invalid event target");return new B(s=>{let u=(...a)=>s.next(1i(u)})}function l0(e,t){return n=>r=>e[n](t,r)}function $D(e){return k(e.addListener)&&k(e.removeListener)}function UD(e){return k(e.on)&&k(e.off)}function zD(e){return k(e.addEventListener)&&k(e.removeEventListener)}function lc(e=0,t,n=sc){let r=-1;return t!=null&&(Qi(t)?n=t:r=t),new B(o=>{let i=s0(e)?+e-n.now():e;i<0&&(i=0);let s=0;return n.schedule(function(){o.closed||(o.next(s++),0<=r?this.schedule(void 0,r):o.complete())},i)})}function qD(...e){let t=ft(e),n=Zh(e,1/0),r=e;return r.length?r.length===1?z(r[0]):So(n)(pt(r,t)):Mt}var GD=new B(St);var{isArray:WD}=Array;function d0(e){return e.length===1&&WD(e[0])?e[0]:e}function rn(e,t){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>e.call(t,i,o++)&&r.next(i)))})}function ZD(...e){let t=nn(e),n=d0(e);return n.length?new B(r=>{let o=n.map(()=>[]),i=n.map(()=>!1);r.add(()=>{o=i=null});for(let s=0;!r.closed&&s{if(o[s].push(u),o.every(a=>a.length)){let a=o.map(c=>c.shift());r.next(t?t(...a):a),o.some((c,l)=>!c.length&&i[l])&&r.complete()}},()=>{i[s]=!0,!o[s].length&&r.complete()}));return()=>{o=i=null}}):Mt}function f0(e){return j((t,n)=>{let r=!1,o=null,i=null,s=!1,u=()=>{if(i?.unsubscribe(),i=null,r){r=!1;let c=o;o=null,n.next(c)}s&&n.complete()},a=()=>{i=null,s&&n.complete()};t.subscribe(R(n,c=>{r=!0,o=c,i||z(e(c)).subscribe(i=R(n,u,a))},()=>{s=!0,(!r||!i||i.closed)&&n.complete()}))})}function YD(e,t=_r){return f0(()=>lc(e,t))}function dc(e){return j((t,n)=>{let r=null,o=!1,i;r=t.subscribe(R(n,void 0,void 0,s=>{i=z(e(s,dc(e)(t))),r?(r.unsubscribe(),r=null,i.subscribe(n)):o=!0})),o&&(r.unsubscribe(),r=null,i.subscribe(n))})}function fc(e,t){return k(t)?At(e,t,1):At(e,1)}function p0(e,t=_r){return j((n,r)=>{let o=null,i=null,s=null,u=()=>{if(o){o.unsubscribe(),o=null;let c=i;i=null,r.next(c)}};function a(){let c=s+e,l=t.now();if(l{i=c,s=t.now(),o||(o=t.schedule(a,e),r.add(o))},()=>{u(),r.complete()},void 0,()=>{i=o=null}))})}function h0(e){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.next(o)},()=>{r||n.next(e),n.complete()}))})}function pc(e){return e<=0?()=>Mt:j((t,n)=>{let r=0;t.subscribe(R(n,o=>{++r<=e&&(n.next(o),e<=r&&n.complete())}))})}function QD(e){return Ce(()=>e)}function g0(e,t=Ee){return e=e??KD,j((n,r)=>{let o,i=!0;n.subscribe(R(r,s=>{let u=t(s);(i||!e(o,u))&&(i=!1,o=u,r.next(s))}))})}function KD(e,t){return e===t}function m0(e=JD){return j((t,n)=>{let r=!1;t.subscribe(R(n,o=>{r=!0,n.next(o)},()=>r?n.complete():n.error(e())))})}function JD(){return new Nn}function ds(e){return j((t,n)=>{try{t.subscribe(n)}finally{n.add(e)}})}function XD(e,t){let n=arguments.length>=2;return r=>r.pipe(e?rn((o,i)=>e(o,i,r)):Ee,pc(1),n?h0(t):m0(()=>new Nn))}function eE(e){return e<=0?()=>Mt:j((t,n)=>{let r=[];t.subscribe(R(n,o=>{r.push(o),e{for(let o of r)n.next(o);n.complete()},void 0,()=>{r=null}))})}function y0(){return j((e,t)=>{let n,r=!1;e.subscribe(R(t,o=>{let i=n;n=o,r&&t.next([i,o]),r=!0}))})}function fs(e={}){let{connector:t=()=>new ce,resetOnError:n=!0,resetOnComplete:r=!0,resetOnRefCountZero:o=!0}=e;return i=>{let s,u,a,c=0,l=!1,d=!1,h=()=>{u?.unsubscribe(),u=void 0},f=()=>{h(),s=a=void 0,l=d=!1},p=()=>{let m=s;f(),m?.unsubscribe()};return j((m,g)=>{c++,!d&&!l&&h();let y=a=a??t();g.add(()=>{c--,c===0&&!d&&!l&&(u=hc(p,o))}),y.subscribe(g),!s&&c>0&&(s=new Ze({next:v=>y.next(v),error:v=>{d=!0,h(),u=hc(f,n,v),y.error(v)},complete:()=>{l=!0,h(),u=hc(f,r),y.complete()}}),z(m).subscribe(s))})(i)}}function hc(e,t,...n){if(t===!0){e();return}if(t===!1)return;let r=new Ze({next:()=>{r.unsubscribe(),e()}});return z(t(...n)).subscribe(r)}function b0(e,t,n){let r,o=!1;return e&&typeof e=="object"?{bufferSize:r=1/0,windowTime:t=1/0,refCount:o=!1,scheduler:n}=e:r=e??1/0,fs({connector:()=>new wo(r,t,n),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:o})}function v0(e){return rn((t,n)=>e<=n)}function D0(...e){let t=ft(e);return j((n,r)=>{(t?ls(e,n,t):ls(e,n)).subscribe(r)})}function ps(e,t){return j((n,r)=>{let o=null,i=0,s=!1,u=()=>s&&!o&&r.complete();n.subscribe(R(r,a=>{o?.unsubscribe();let c=0,l=i++;z(e(a,l)).subscribe(o=R(r,d=>r.next(t?t(a,d,l,c++):d),()=>{o=null,u()}))},()=>{s=!0,u()}))})}function tE(e){return j((t,n)=>{z(e).subscribe(R(n,()=>n.complete(),St)),!n.closed&&t.subscribe(n)})}function nE(e,t=!1){return j((n,r)=>{let o=0;n.subscribe(R(r,i=>{let s=e(i,o++);(s||t)&&r.next(i),!s&&r.complete()}))})}function E0(e,t,n){let r=k(e)||t||n?{next:e,error:t,complete:n}:e;return r?j((o,i)=>{var s;(s=r.subscribe)===null||s===void 0||s.call(r);let u=!0;o.subscribe(R(i,a=>{var c;(c=r.next)===null||c===void 0||c.call(r,a),i.next(a)},()=>{var a;u=!1,(a=r.complete)===null||a===void 0||a.call(r),i.complete()},a=>{var c;u=!1,(c=r.error)===null||c===void 0||c.call(r,a),i.error(a)},()=>{var a,c;u&&((a=r.unsubscribe)===null||a===void 0||a.call(r)),(c=r.finalize)===null||c===void 0||c.call(r)}))}):Ee}function rE(...e){let t=nn(e);return j((n,r)=>{let o=e.length,i=new Array(o),s=e.map(()=>!1),u=!1;for(let a=0;a{i[a]=c,!u&&!s[a]&&(s[a]=!0,(u=s.every(Ee))&&(s=null))},St));n.subscribe(R(r,a=>{if(u){let c=[a,...i];r.next(t?t(...c):c)}}))})}var gc;function hs(){return gc}function ht(e){let t=gc;return gc=e,t}var C0=Symbol("NotFound");function Ir(e){return e===C0||e?.name==="\u0275NotFound"}function mc(e,t,n){let r=Object.create(oE);r.source=e,r.computation=t,n!=null&&(r.equal=n);let i=()=>{if(xn(r),Kt(r),r.value===dt)throw r.error;return r.value};return i[ne]=r,bo(r),i}function _0(e,t){xn(e),In(e,t),hr(e)}function w0(e,t){if(xn(e),e.value===dt)throw e.error;Bi(e,t),hr(e)}var oE=P(M({},Qt),{value:Yt,dirty:!0,error:null,equal:vo,kind:"linkedSignal",producerMustRecompute(e){return e.value===Yt||e.value===wn},producerRecomputeValue(e){if(e.value===wn)throw new Error("");let t=e.value;e.value=wn;let n=Tt(e),r;try{let o=e.source(),i=t===Yt||t===dt?void 0:{source:e.sourceValue,value:t};r=e.computation(o,i),e.sourceValue=o}catch(o){r=dt,e.error=o}finally{Jt(e,n)}if(t!==Yt&&r!==dt&&e.equal(t,r)){e.value=t;return}e.value=r,e.version++}});function x0(e){let t=I(null);try{return e()}finally{I(t)}}var Es="https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss",C=class extends Error{code;constructor(t,n){super(mt(t,n)),this.code=t}};function iE(e){return`NG0${Math.abs(e)}`}function mt(e,t){return`${iE(e)}${t?": "+t:""}`}var xe=globalThis;function W(e){for(let t in e)if(e[t]===W)return t;throw Error("")}function A0(e,t){for(let n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function Oo(e){if(typeof e=="string")return e;if(Array.isArray(e))return`[${e.map(Oo).join(", ")}]`;if(e==null)return""+e;let t=e.overriddenName||e.name;if(t)return`${t}`;let n=e.toString();if(n==null)return""+n;let r=n.indexOf(` `);return r>=0?n.slice(0,r):n}function Cs(e,t){return e?t?`${e} ${t}`:e:t||""}var sE=W({__forward_ref__:W});function _s(e){return e.__forward_ref__=_s,e}function se(e){return Mc(e)?e():e}function Mc(e){return typeof e=="function"&&e.hasOwnProperty(sE)&&e.__forward_ref__===_s}function T(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function yt(e){return{providers:e.providers||[],imports:e.imports||[]}}function Po(e){return aE(e,ws)}function uE(e){return Po(e)!==null}function aE(e,t){return e.hasOwnProperty(t)&&e[t]||null}function cE(e){let t=e?.[ws]??null;return t||null}function bc(e){return e&&e.hasOwnProperty(ms)?e[ms]:null}var ws=W({\u0275prov:W}),ms=W({\u0275inj:W}),x=class{_desc;ngMetadataName="InjectionToken";\u0275prov;constructor(t,n){this._desc=t,this.\u0275prov=void 0,typeof n=="number"?this.__NG_ELEMENT_ID__=n:n!==void 0&&(this.\u0275prov=T({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Ac(e){return e&&!!e.\u0275providers}var Nc=W({\u0275cmp:W}),kc=W({\u0275dir:W}),Rc=W({\u0275pipe:W}),Fc=W({\u0275mod:W}),Ao=W({\u0275fac:W}),Pn=W({__NG_ELEMENT_ID__:W}),I0=W({__NG_ENV_ID__:W});function Oc(e){return Is(e,"@NgModule"),e[Fc]||null}function bt(e){return Is(e,"@Component"),e[Nc]||null}function xs(e){return Is(e,"@Directive"),e[kc]||null}function N0(e){return Is(e,"@Pipe"),e[Rc]||null}function Is(e,t){if(e==null)throw new C(-919,!1)}function Ve(e){return typeof e=="string"?e:e==null?"":String(e)}var k0=W({ngErrorCode:W}),lE=W({ngErrorMessage:W}),dE=W({ngTokenPath:W});function Pc(e,t){return R0("",-200,t)}function Ts(e,t){throw new C(-201,!1)}function R0(e,t,n){let r=new C(t,e);return r[k0]=t,r[lE]=e,n&&(r[dE]=n),r}function fE(e){return e[k0]}var vc;function F0(){return vc}function _e(e){let t=vc;return vc=e,t}function Lc(e,t,n){let r=Po(e);if(r&&r.providedIn=="root")return r.value===void 0?r.value=r.factory():r.value;if(n&8)return null;if(t!==void 0)return t;Ts(e,"")}var pE={},kn=pE,hE="__NG_DI_FLAG__",Dc=class{injector;constructor(t){this.injector=t}retrieve(t,n){let r=Rn(n)||0;try{return this.injector.get(t,r&8?null:kn,r)}catch(o){if(Ir(o))return o;throw o}}};function gE(e,t=0){let n=hs();if(n===void 0)throw new C(-203,!1);if(n===null)return Lc(e,void 0,t);{let r=mE(t),o=n.retrieve(e,r);if(Ir(o)){if(r.optional)return null;throw o}return o}}function A(e,t=0){return(F0()||gE)(se(e),t)}function b(e,t){return A(e,Rn(t))}function Rn(e){return typeof e>"u"||typeof e=="number"?e:0|(e.optional&&8)|(e.host&&1)|(e.self&&2)|(e.skipSelf&&4)}function mE(e){return{optional:!!(e&8),host:!!(e&1),self:!!(e&2),skipSelf:!!(e&4)}}function Ec(e){let t=[];for(let n=0;nArray.isArray(n)?Ss(n,t):t(n))}function jc(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function Lo(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function L0(e,t){let n=[];for(let r=0;rt;){let i=o-2;e[o]=e[i],o--}e[t]=n,e[t+1]=r}}function jo(e,t,n){let r=Sr(e,t);return r>=0?e[r|1]=n:(r=~r,j0(e,r,t,n)),r}function Ms(e,t){let n=Sr(e,t);if(n>=0)return e[n|1]}function Sr(e,t){return bE(e,t,1)}function bE(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){let i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o<{n.push(s)};return Ss(t,s=>{let u=s;ys(u,i,[],r)&&(o||=[],o.push(u))}),o!==void 0&&V0(o,i),n}function V0(e,t){for(let n=0;n{t(i,r)})}}function ys(e,t,n,r){if(e=se(e),!e)return!1;let o=null,i=bc(e),s=!i&&bt(e);if(!i&&!s){let a=e.ngModule;if(i=bc(a),i)o=a;else return!1}else{if(s&&!s.standalone)return!1;o=e}let u=r.has(o);if(s){if(u)return!1;if(r.add(o),s.dependencies){let a=typeof s.dependencies=="function"?s.dependencies():s.dependencies;for(let c of a)ys(c,t,n,r)}}else if(i){if(i.imports!=null&&!u){r.add(o);let c;Ss(i.imports,l=>{ys(l,t,n,r)&&(c||=[],c.push(l))}),c!==void 0&&V0(c,t)}if(!u){let c=on(o)||(()=>new o);t({provide:o,useFactory:c,deps:ye},o),t({provide:Vc,useValue:o,multi:!0},o),t({provide:Mr,useValue:()=>A(o),multi:!0},o)}let a=i.providers;if(a!=null&&!u){let c=e;$c(a,l=>{t(l,c)})}}else return!1;return o!==e&&e.providers!==void 0}function $c(e,t){for(let n of e)Ac(n)&&(n=n.\u0275providers),Array.isArray(n)?$c(n,t):t(n)}var vE=W({provide:String,useValue:W});function H0(e){return e!==null&&typeof e=="object"&&vE in e}function DE(e){return!!(e&&e.useExisting)}function EE(e){return!!(e&&e.useFactory)}function Fn(e){return typeof e=="function"}function $0(e){return!!e.useClass}var Bo=new x(""),gs={},T0={},yc;function Ar(){return yc===void 0&&(yc=new No),yc}var we=class{},On=class extends we{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,_c(t,s=>this.processProvider(s)),this.records.set(Bc,Tr(void 0,this)),o.has("environment")&&this.records.set(we,Tr(void 0,this));let i=this.records.get(Bo);i!=null&&typeof i.value=="string"&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(Vc,ye,{self:!0}))}retrieve(t,n){let r=Rn(n)||0;try{return this.get(t,kn,r)}catch(o){if(Ir(o))return o;throw o}}destroy(){Mo(this),this._destroyed=!0;let t=I(null);try{for(let r of this._ngOnDestroyHooks)r.ngOnDestroy();let n=this._onDestroyHooks;this._onDestroyHooks=[];for(let r of n)r()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),I(t)}}onDestroy(t){return Mo(this),this._onDestroyHooks.push(t),()=>this.removeOnDestroy(t)}runInContext(t){Mo(this);let n=ht(this),r=_e(void 0),o;try{return t()}finally{ht(n),_e(r)}}get(t,n=kn,r){if(Mo(this),t.hasOwnProperty(I0))return t[I0](this);let o=Rn(r),i,s=ht(this),u=_e(void 0);try{if(!(o&4)){let c=this.records.get(t);if(c===void 0){let l=IE(t)&&Po(t);l&&this.injectableDefInScope(l)?c=Tr(Cc(t),gs):c=null,this.records.set(t,c)}if(c!=null)return this.hydrate(t,c,o)}let a=o&2?Ar():this.parent;return n=o&8&&n===kn?null:n,a.get(t,n)}catch(a){let c=fE(a);throw c===-200||c===-201?new C(c,null):a}finally{_e(u),ht(s)}}resolveInjectorInitializers(){let t=I(null),n=ht(this),r=_e(void 0),o;try{let i=this.get(Mr,ye,{self:!0});for(let s of i)s()}finally{ht(n),_e(r),I(t)}}toString(){return"R3Injector[...]"}processProvider(t){t=se(t);let n=Fn(t)?t:se(t&&t.provide),r=_E(t);if(!Fn(t)&&t.multi===!0){let o=this.records.get(n);o||(o=Tr(void 0,gs,!0),o.factory=()=>Ec(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n,r){let o=I(null);try{if(n.value===T0)throw Pc("");return n.value===gs&&(n.value=T0,n.value=n.factory(void 0,r)),typeof n.value=="object"&&n.value&&xE(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}finally{I(o)}}injectableDefInScope(t){if(!t.providedIn)return!1;let n=se(t.providedIn);return typeof n=="string"?n==="any"||this.scopes.has(n):this.injectorDefTypes.has(n)}removeOnDestroy(t){let n=this._onDestroyHooks.indexOf(t);n!==-1&&this._onDestroyHooks.splice(n,1)}};function Cc(e){let t=Po(e),n=t!==null?t.factory:on(e);if(n!==null)return n;if(e instanceof x)throw new C(-204,!1);if(e instanceof Function)return CE(e);throw new C(-204,!1)}function CE(e){if(e.length>0)throw new C(-204,!1);let n=cE(e);return n!==null?()=>n.factory(e):()=>new e}function _E(e){if(H0(e))return Tr(void 0,e.useValue);{let t=Uc(e);return Tr(t,gs)}}function Uc(e,t,n){let r;if(Fn(e)){let o=se(e);return on(o)||Cc(o)}else if(H0(e))r=()=>se(e.useValue);else if(EE(e))r=()=>e.useFactory(...Ec(e.deps||[]));else if(DE(e))r=(o,i)=>A(se(e.useExisting),i!==void 0&&i&8?8:void 0);else{let o=se(e&&(e.useClass||e.provide));if(wE(e))r=()=>new o(...Ec(e.deps));else return on(o)||Cc(o)}return r}function Mo(e){if(e.destroyed)throw new C(-205,!1)}function Tr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function wE(e){return!!e.deps}function xE(e){return e!==null&&typeof e=="object"&&typeof e.ngOnDestroy=="function"}function IE(e){return typeof e=="function"||typeof e=="object"&&e.ngMetadataName==="InjectionToken"}function _c(e,t){for(let n of e)Array.isArray(n)?_c(n,t):n&&Ac(n)?_c(n.\u0275providers,t):t(n)}function Nr(e,t){let n;e instanceof On?(Mo(e),n=e):n=new Dc(e);let r,o=ht(n),i=_e(void 0);try{return t()}finally{ht(o),_e(i)}}function As(){return F0()!==void 0||hs()!=null}function TE(e){if(!As())throw new C(-203,!1)}var Qe=0,S=1,L=2,ue=3,He=4,Ie=5,jn=6,kr=7,ee=8,Rt=9,Ke=10,Z=11,Rr=12,zc=13,Bn=14,ve=15,an=16,Vn=17,vt=18,Ft=19,qc=20,kt=21,Ns=22,sn=23,Ne=24,Hn=25,cn=26,Q=27,U0=1,Gc=6,ln=7,Vo=8,$n=9,te=10;function Ot(e){return Array.isArray(e)&&typeof e[U0]=="object"}function Je(e){return Array.isArray(e)&&e[U0]===!0}function Wc(e){return(e.flags&4)!==0}function Dt(e){return e.componentOffset>-1}function Fr(e){return(e.flags&1)===1}function Xe(e){return!!e.template}function Or(e){return(e[L]&512)!==0}function Un(e){return(e[L]&256)===256}var Zc="svg",z0="math";function $e(e){for(;Array.isArray(e);)e=e[Qe];return e}function Yc(e,t){return $e(t[e])}function Ue(e,t){return $e(t[e.index])}function ks(e,t){return e.data[t]}function Ho(e,t){return e[t]}function $o(e,t,n,r){n>=e.data.length&&(e.data[n]=null,e.blueprint[n]=null),t[n]=r}function ke(e,t){let n=t[e];return Ot(n)?n:n[Qe]}function q0(e){return(e[L]&4)===4}function Rs(e){return(e[L]&128)===128}function G0(e){return Je(e[ue])}function Re(e,t){return t==null?null:e[t]}function Qc(e){e[Vn]=0}function Kc(e){e[L]&1024||(e[L]|=1024,Rs(e)&&zn(e))}function W0(e,t){for(;e>0;)t=t[Bn],e--;return t}function Uo(e){return!!(e[L]&9216||e[Ne]?.dirty)}function Fs(e){e[Ke].changeDetectionScheduler?.notify(8),e[L]&64&&(e[L]|=1024),Uo(e)&&zn(e)}function zn(e){e[Ke].changeDetectionScheduler?.notify(0);let t=un(e);for(;t!==null&&!(t[L]&8192||(t[L]|=8192,!Rs(t)));)t=un(t)}function Jc(e,t){if(Un(e))throw new C(911,!1);e[kt]===null&&(e[kt]=[]),e[kt].push(t)}function Z0(e,t){if(e[kt]===null)return;let n=e[kt].indexOf(t);n!==-1&&e[kt].splice(n,1)}function un(e){let t=e[ue];return Je(t)?t[ue]:t}function Xc(e){return e[kr]??=[]}function el(e){return e.cleanup??=[]}function Y0(e,t,n,r){let o=Xc(t);o.push(n),e.firstCreatePass&&el(e).push(r,o.length-1)}var V={lFrame:ug(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var wc=!1;function Q0(){return V.lFrame.elementDepthCount}function K0(){V.lFrame.elementDepthCount++}function tl(){V.lFrame.elementDepthCount--}function Os(){return V.bindingsEnabled}function nl(){return V.skipHydrationRootTNode!==null}function rl(e){return V.skipHydrationRootTNode===e}function ol(){V.skipHydrationRootTNode=null}function _(){return V.lFrame.lView}function G(){return V.lFrame.tView}function J0(e){return V.lFrame.contextLView=e,e[ee]}function X0(e){return V.lFrame.contextLView=null,e}function re(){let e=il();for(;e!==null&&e.type===64;)e=e.parent;return e}function il(){return V.lFrame.currentTNode}function eg(){let e=V.lFrame,t=e.currentTNode;return e.isParent?t:t.parent}function qn(e,t){let n=V.lFrame;n.currentTNode=e,n.isParent=t}function sl(){return V.lFrame.isParent}function ul(){V.lFrame.isParent=!1}function al(){return V.lFrame.contextLView}function cl(){return wc}function ko(e){let t=wc;return wc=e,t}function Pr(){let e=V.lFrame,t=e.bindingRootIndex;return t===-1&&(t=e.bindingRootIndex=e.tView.bindingStartIndex),t}function ll(){return V.lFrame.bindingIndex}function tg(e){return V.lFrame.bindingIndex=e}function et(){return V.lFrame.bindingIndex++}function zo(e){let t=V.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function ng(){return V.lFrame.inI18n}function rg(e,t){let n=V.lFrame;n.bindingIndex=n.bindingRootIndex=e,Ps(t)}function og(){return V.lFrame.currentDirectiveIndex}function Ps(e){V.lFrame.currentDirectiveIndex=e}function ig(e){let t=V.lFrame.currentDirectiveIndex;return t===-1?null:e[t]}function Ls(){return V.lFrame.currentQueryIndex}function qo(e){V.lFrame.currentQueryIndex=e}function SE(e){let t=e[S];return t.type===2?t.declTNode:t.type===1?e[Ie]:null}function dl(e,t,n){if(n&4){let o=t,i=e;for(;o=o.parent,o===null&&!(n&1);)if(o=SE(i),o===null||(i=i[Bn],o.type&10))break;if(o===null)return!1;t=o,e=i}let r=V.lFrame=sg();return r.currentTNode=t,r.lView=e,!0}function js(e){let t=sg(),n=e[S];V.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function sg(){let e=V.lFrame,t=e===null?null:e.child;return t===null?ug(e):t}function ug(e){let t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return e!==null&&(e.child=t),t}function ag(){let e=V.lFrame;return V.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}var fl=ag;function Bs(){let e=ag();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function cg(e){return(V.lFrame.contextLView=W0(e,V.lFrame.contextLView))[ee]}function ze(){return V.lFrame.selectedIndex}function dn(e){V.lFrame.selectedIndex=e}function fn(){let e=V.lFrame;return ks(e.tView,e.selectedIndex)}function lg(){V.lFrame.currentNamespace=Zc}function dg(){ME()}function ME(){V.lFrame.currentNamespace=null}function fg(){return V.lFrame.currentNamespace}var pg=!0;function Vs(){return pg}function Go(e){pg=e}function xc(e,t=null,n=null,r){let o=pl(e,t,n,r);return o.resolveInjectorInitializers(),o}function pl(e,t=null,n=null,r,o=new Set){let i=[n||ye,B0(e)],s;return new On(i,t||Ar(),s||null,o)}var fe=class e{static THROW_IF_NOT_FOUND=kn;static NULL=new No;static create(t,n){if(Array.isArray(t))return xc({name:""},n,t,"");{let r=t.name??"";return xc({name:r},t.parent,t.providers,r)}}static \u0275prov=T({token:e,providedIn:"any",factory:()=>A(Bc)});static __NG_ELEMENT_ID__=-1},K=new x(""),Fe=(()=>{class e{static __NG_ELEMENT_ID__=AE;static __NG_ENV_ID__=n=>n}return e})(),bs=class extends Fe{_lView;constructor(t){super(),this._lView=t}get destroyed(){return Un(this._lView)}onDestroy(t){let n=this._lView;return Jc(n,t),()=>Z0(n,t)}};function AE(){return new bs(_())}var hg=!1,gg=new x(""),Gn=(()=>{class e{taskId=0;pendingTasks=new Set;destroyed=!1;pendingTask=new Co(!1);debugTaskTracker=b(gg,{optional:!0});get hasPendingTasks(){return this.destroyed?!1:this.pendingTask.value}get hasPendingTasksObservable(){return this.destroyed?new B(n=>{n.next(!1),n.complete()}):this.pendingTask}add(){!this.hasPendingTasks&&!this.destroyed&&this.pendingTask.next(!0);let n=this.taskId++;return this.pendingTasks.add(n),this.debugTaskTracker?.add(n),n}has(n){return this.pendingTasks.has(n)}remove(n){this.pendingTasks.delete(n),this.debugTaskTracker?.remove(n),this.pendingTasks.size===0&&this.hasPendingTasks&&this.pendingTask.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this.hasPendingTasks&&this.pendingTask.next(!1),this.destroyed=!0,this.pendingTask.unsubscribe()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Ic=class extends ce{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(t=!1){super(),this.__isAsync=t,As()&&(this.destroyRef=b(Fe,{optional:!0})??void 0,this.pendingTasks=b(Gn,{optional:!0})??void 0)}emit(t){let n=I(null);try{super.next(t)}finally{I(n)}}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&typeof t=="object"){let a=t;o=a.next?.bind(a),i=a.error?.bind(a),s=a.complete?.bind(a)}this.__isAsync&&(i=this.wrapInTimeout(i),o&&(o=this.wrapInTimeout(o)),s&&(s=this.wrapInTimeout(s)));let u=super.subscribe({next:o,error:i,complete:s});return t instanceof X&&t.add(u),u}wrapInTimeout(t){return n=>{let r=this.pendingTasks?.add();setTimeout(()=>{try{t(n)}finally{r!==void 0&&this.pendingTasks?.remove(r)}})}}},Nt=Ic;function vs(...e){}function hl(e){let t,n;function r(){e=vs;try{n!==void 0&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(n),t!==void 0&&clearTimeout(t)}catch(o){}}return t=setTimeout(()=>{e(),r()}),typeof requestAnimationFrame=="function"&&(n=requestAnimationFrame(()=>{e(),r()})),()=>r()}function mg(e){return queueMicrotask(()=>e()),()=>{e=vs}}var gl="isAngularZone",Ro=gl+"_ID",NE=0,be=class e{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Nt(!1);onMicrotaskEmpty=new Nt(!1);onStable=new Nt(!1);onError=new Nt(!1);constructor(t){let{enableLongStackTrace:n=!1,shouldCoalesceEventChangeDetection:r=!1,shouldCoalesceRunChangeDetection:o=!1,scheduleInRootZone:i=hg}=t;if(typeof Zone>"u")throw new C(908,!1);Zone.assertZonePatched();let s=this;s._nesting=0,s._outer=s._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(s._inner=s._inner.fork(new Zone.TaskTrackingZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(s._inner=s._inner.fork(Zone.longStackTraceZoneSpec)),s.shouldCoalesceEventChangeDetection=!o&&r,s.shouldCoalesceRunChangeDetection=o,s.callbackScheduled=!1,s.scheduleInRootZone=i,FE(s)}static isInAngularZone(){return typeof Zone<"u"&&Zone.current.get(gl)===!0}static assertInAngularZone(){if(!e.isInAngularZone())throw new C(909,!1)}static assertNotInAngularZone(){if(e.isInAngularZone())throw new C(909,!1)}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){let i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,kE,vs,vs);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}},kE={};function ml(e){if(e._nesting==0&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function RE(e){if(e.isCheckStableRunning||e.callbackScheduled)return;e.callbackScheduled=!0;function t(){hl(()=>{e.callbackScheduled=!1,Tc(e),e.isCheckStableRunning=!0,ml(e),e.isCheckStableRunning=!1})}e.scheduleInRootZone?Zone.root.run(()=>{t()}):e._outer.run(()=>{t()}),Tc(e)}function FE(e){let t=()=>{RE(e)},n=NE++;e._inner=e._inner.fork({name:"angular",properties:{[gl]:!0,[Ro]:n,[Ro+n]:!0},onInvokeTask:(r,o,i,s,u,a)=>{if(OE(a))return r.invokeTask(i,s,u,a);try{return S0(e),r.invokeTask(i,s,u,a)}finally{(e.shouldCoalesceEventChangeDetection&&s.type==="eventTask"||e.shouldCoalesceRunChangeDetection)&&t(),M0(e)}},onInvoke:(r,o,i,s,u,a,c)=>{try{return S0(e),r.invoke(i,s,u,a,c)}finally{e.shouldCoalesceRunChangeDetection&&!e.callbackScheduled&&!PE(a)&&t(),M0(e)}},onHasTask:(r,o,i,s)=>{r.hasTask(i,s),o===i&&(s.change=="microTask"?(e._hasPendingMicrotasks=s.microTask,Tc(e),ml(e)):s.change=="macroTask"&&(e.hasPendingMacrotasks=s.macroTask))},onHandleError:(r,o,i,s)=>(r.handleError(i,s),e.runOutsideAngular(()=>e.onError.emit(s)),!1)})}function Tc(e){e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&e.callbackScheduled===!0?e.hasPendingMicrotasks=!0:e.hasPendingMicrotasks=!1}function S0(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function M0(e){e._nesting--,ml(e)}var Fo=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Nt;onMicrotaskEmpty=new Nt;onStable=new Nt;onError=new Nt;run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}};function OE(e){return yg(e,"__ignore_ng_zone__")}function PE(e){return yg(e,"__scheduler_tick__")}function yg(e,t){return!Array.isArray(e)||e.length!==1?!1:e[0]?.data?.[t]===!0}var Be=class{_console=console;handleError(t){this._console.error("ERROR",t)}},Pt=new x("",{factory:()=>{let e=b(be),t=b(we),n;return r=>{e.runOutsideAngular(()=>{t.destroyed&&!n?setTimeout(()=>{throw r}):(n??=t.get(Be),n.handleError(r))})}}}),bg={provide:Mr,useValue:()=>{let e=b(Be,{optional:!0})},multi:!0};function pn(e,t){let[n,r,o]=Ga(e,t?.equal),i=n,s=i[ne];return i.set=r,i.update=o,i.asReadonly=Wo.bind(i),i}function Wo(){let e=this[ne];if(e.readonlyFn===void 0){let t=()=>this();t[ne]=e,e.readonlyFn=t}return e.readonlyFn}var Lr=(()=>{class e{view;node;constructor(n,r){this.view=n,this.node=r}static __NG_ELEMENT_ID__=LE}return e})();function LE(){return new Lr(_(),re())}var gt=class{},Zo=new x("",{factory:()=>!0});var yl=new x(""),Wn=(()=>{class e{internalPendingTasks=b(Gn);scheduler=b(gt);errorHandler=b(Pt);add(){let n=this.internalPendingTasks.add();return()=>{this.internalPendingTasks.has(n)&&(this.scheduler.notify(11),this.internalPendingTasks.remove(n))}}run(n){let r=this.add();n().catch(this.errorHandler).finally(r)}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Hs=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>new Sc})}return e})(),Sc=class{dirtyEffectCount=0;queues=new Map;add(t){this.enqueue(t),this.schedule(t)}schedule(t){t.dirty&&this.dirtyEffectCount++}remove(t){let n=t.zone,r=this.queues.get(n);r.has(t)&&(r.delete(t),t.dirty&&this.dirtyEffectCount--)}enqueue(t){let n=t.zone;this.queues.has(n)||this.queues.set(n,new Set);let r=this.queues.get(n);r.has(t)||r.add(t)}flush(){for(;this.dirtyEffectCount>0;){let t=!1;for(let[n,r]of this.queues)n===null?t||=this.flushQueue(r):t||=n.run(()=>this.flushQueue(r));t||(this.dirtyEffectCount=0)}}flushQueue(t){let n=!1;for(let r of t)r.dirty&&(this.dirtyEffectCount--,n=!0,r.run());return n}},Ds=class{[ne];constructor(t){this[ne]=t}destroy(){this[ne].destroy()}};function Yo(e,t){let n=t?.injector??b(fe),r=t?.manualCleanup!==!0?n.get(Fe):null,o,i=n.get(Lr,null,{optional:!0}),s=n.get(gt);return i!==null?(o=VE(i.view,s,e),r instanceof bs&&r._lView===i.view&&(r=null)):o=HE(e,n.get(Hs),s),o.injector=n,r!==null&&(o.onDestroyFns=[r.onDestroy(()=>o.destroy())]),new Ds(o)}var vg=P(M({},Wa),{cleanupFns:void 0,zone:null,onDestroyFns:null,run(){let e=ko(!1);try{Za(this)}finally{ko(e)}},cleanup(){if(!this.cleanupFns?.length)return;let e=I(null);try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[],I(e)}}}),jE=P(M({},vg),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){if(Xt(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.scheduler.remove(this)}}),BE=P(M({},vg),{consumerMarkedDirty(){this.view[L]|=8192,zn(this.view),this.notifier.notify(13)},destroy(){if(Xt(this),this.onDestroyFns!==null)for(let e of this.onDestroyFns)e();this.cleanup(),this.view[sn]?.delete(this)}});function VE(e,t,n){let r=Object.create(BE);return r.view=e,r.zone=typeof Zone<"u"?Zone.current:null,r.notifier=t,r.fn=Dg(r,n),e[sn]??=new Set,e[sn].add(r),r.consumerMarkedDirty(r),r}function HE(e,t,n){let r=Object.create(jE);return r.fn=Dg(r,e),r.scheduler=t,r.notifier=n,r.zone=typeof Zone<"u"?Zone.current:null,r.scheduler.add(r),r.notifier.notify(12),r}function Dg(e,t){return()=>{t(n=>(e.cleanupFns??=[]).push(n))}}function si(e){return{toString:e}.toString()}function ZE(e){return typeof e=="function"}function om(e,t,n,r){t!==null?t.applyValueToInputSignal(t,r):e[n]=r}var Qs=class{previousValue;currentValue;firstChange;constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}},mu=(()=>{let e=()=>im;return e.ngInherit=!0,e})();function im(e){return e.type.prototype.ngOnChanges&&(e.setInput=QE),YE}function YE(){let e=um(this),t=e?.current;if(t){let n=e.previous;if(n===Ye)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function QE(e,t,n,r,o){let i=this.declaredInputs[r],s=um(e)||KE(e,{previous:Ye,current:null}),u=s.current||(s.current={}),a=s.previous,c=a[i];u[i]=new Qs(c&&c.currentValue,n,a===Ye),om(e,t,o,n)}var sm="__ngSimpleChanges__";function um(e){return e[sm]||null}function KE(e,t){return e[sm]=t}var Eg=[];var Y=function(e,t=null,n){for(let r=0;r=r)break}else t[a]<0&&(e[Vn]+=65536),(u>14>16&&(e[L]&3)===t&&(e[L]+=16384,Cg(u,i)):Cg(u,i)}var Br=-1,Qn=class{factory;name;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(t,n,r,o){this.factory=t,this.name=o,this.canSeeViewProviders=n,this.injectImpl=r}};function eC(e){return(e.flags&8)!==0}function tC(e){return(e.flags&16)!==0}function nC(e,t,n){let r=0;for(;rt){s=i-1;break}}}for(;i>16}function Js(e,t){let n=oC(e),r=t;for(;n>0;)r=r[Bn],n--;return r}var Sl=!0;function Xs(e){let t=Sl;return Sl=e,t}var iC=256,fm=iC-1,pm=5,sC=0,Et={};function uC(e,t,n){let r;typeof n=="string"?r=n.charCodeAt(0)||0:n.hasOwnProperty(Pn)&&(r=n[Pn]),r==null&&(r=n[Pn]=sC++);let o=r&fm,i=1<>pm)]|=i}function eu(e,t){let n=hm(e,t);if(n!==-1)return n;let r=t[S];r.firstCreatePass&&(e.injectorIndex=t.length,vl(r.data,e),vl(t,null),vl(r.blueprint,null));let o=dd(e,t),i=e.injectorIndex;if(dm(o)){let s=Ks(o),u=Js(o,t),a=u[S].data;for(let c=0;c<8;c++)t[i+c]=u[s+c]|a[s+c]}return t[i+8]=o,i}function vl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function hm(e,t){return e.injectorIndex===-1||e.parent&&e.parent.injectorIndex===e.injectorIndex||t[e.injectorIndex+8]===null?-1:e.injectorIndex}function dd(e,t){if(e.parent&&e.parent.injectorIndex!==-1)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;o!==null;){if(r=vm(o),r===null)return Br;if(n++,o=o[Bn],r.injectorIndex!==-1)return r.injectorIndex|n<<16}return Br}function Ml(e,t,n){uC(e,t,n)}function aC(e,t){if(t==="class")return e.classes;if(t==="style")return e.styles;let n=e.attrs;if(n){let r=n.length,o=0;for(;o>20,d=r?u:u+l,h=o?u+l:c;for(let f=d;f=a&&p.type===n)return f}if(o){let f=s[a];if(f&&Xe(f)&&f.type===n)return a}return null}function Jo(e,t,n,r,o){let i=e[n],s=t.data;if(i instanceof Qn){let u=i;if(u.resolving)throw Pc("");let a=Xs(u.canSeeViewProviders);u.resolving=!0;let c=s[n].type||s[n],l,d=u.injectImpl?_e(u.injectImpl):null,h=dl(e,r,0);try{i=e[n]=u.factory(void 0,o,s,e,r),t.firstCreatePass&&n>=r.directiveStart&&JE(n,s[n],t)}finally{d!==null&&_e(d),Xs(a),u.resolving=!1,fl()}}return i}function lC(e){if(typeof e=="string")return e.charCodeAt(0)||0;let t=e.hasOwnProperty(Pn)?e[Pn]:void 0;return typeof t=="number"?t>=0?t&fm:dC:t}function wg(e,t,n){let r=1<>pm)]&r)}function xg(e,t){return!(e&2)&&!(e&1&&t)}var Zn=class{_tNode;_lView;constructor(t,n){this._tNode=t,this._lView=n}get(t,n,r){return ym(this._tNode,this._lView,t,Rn(r),n)}};function dC(){return new Zn(re(),_())}function tr(e){return si(()=>{let t=e.prototype.constructor,n=t[Ao]||Al(t),r=Object.prototype,o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){let i=o[Ao]||Al(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Al(e){return Mc(e)?()=>{let t=Al(se(e));return t&&t()}:on(e)}function fC(e,t,n,r,o){let i=e,s=t;for(;i!==null&&s!==null&&s[L]&2048&&!Or(s);){let u=bm(i,s,n,r|2,Et);if(u!==Et)return u;let a=i.parent;if(!a){let c=s[qc];if(c){let l=c.get(n,Et,r&-5);if(l!==Et)return l}a=vm(s),s=s[Bn]}i=a}return o}function vm(e){let t=e[S],n=t.type;return n===2?t.declTNode:n===1?e[Ie]:null}function fd(e){return aC(re(),e)}function pC(){return Gr(re(),_())}function Gr(e,t){return new jt(Ue(e,t))}var jt=(()=>{class e{nativeElement;constructor(n){this.nativeElement=n}static __NG_ELEMENT_ID__=pC}return e})();function Dm(e){return e instanceof jt?e.nativeElement:e}function hC(){return this._results[Symbol.iterator]()}var tu=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new ce}constructor(t=!1){this._emitDistinctChangesOnly=t}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){this.dirty=!1;let r=P0(t);(this._changesDetected=!O0(this._results,r,n))&&(this._results=r,this.length=r.length,this.last=r[this.length-1],this.first=r[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(t){this._onDirty=t}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=hC};function Em(e){return(e.flags&128)===128}var pd=(function(e){return e[e.OnPush=0]="OnPush",e[e.Eager=1]="Eager",e[e.Default=1]="Default",e})(pd||{}),Cm=new Map,gC=0;function mC(){return gC++}function yC(e){Cm.set(e[Ft],e)}function Nl(e){Cm.delete(e[Ft])}var Ig="__ngContext__";function Hr(e,t){Ot(t)?(e[Ig]=t[Ft],yC(t)):e[Ig]=t}function _m(e){return xm(e[Rr])}function wm(e){return xm(e[He])}function xm(e){for(;e!==null&&!Je(e);)e=e[He];return e}var kl;function hd(e){kl=e}function Im(){if(kl!==void 0)return kl;if(typeof document<"u")return document;throw new C(210,!1)}var yu=new x("",{factory:()=>bC}),bC="ng";var bu=new x(""),nr=new x("",{providedIn:"platform",factory:()=>"unknown"}),vC=new x(""),vu=new x("",{factory:()=>b(K).body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});var Tm="r";var Sm="di";var Mm=!1,Am=new x("",{factory:()=>Mm});var Nm=new x("");var DC=(e,t,n,r)=>{};function EC(e,t,n,r){DC(e,t,n,r)}function Du(e){return(e.flags&32)===32}var CC=()=>null;function km(e,t,n=!1){return CC(e,t,n)}function Rm(e,t){let n=e.contentQueries;if(n!==null){let r=I(null);try{for(let o=0;oe,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return $s}function Eu(e){return _C()?.createHTML(e)||e}var Us;function wC(){if(Us===void 0&&(Us=null,xe.trustedTypes))try{Us=xe.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:e=>e,createScript:e=>e,createScriptURL:e=>e})}catch(e){}return Us}function Tg(e){return wC()?.createHTML(e)||e}var Lt=class{changingThisBreaksApplicationSecurity;constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${Es})`}},Fl=class extends Lt{getTypeName(){return"HTML"}},Ol=class extends Lt{getTypeName(){return"Style"}},Pl=class extends Lt{getTypeName(){return"Script"}},Ll=class extends Lt{getTypeName(){return"URL"}},jl=class extends Lt{getTypeName(){return"ResourceURL"}};function Oe(e){return e instanceof Lt?e.changingThisBreaksApplicationSecurity:e}function Bt(e,t){let n=Fm(e);if(n!=null&&n!==t){if(n==="ResourceURL"&&t==="URL")return!0;throw new Error(`Required a safe ${t}, got a ${n} (see ${Es})`)}return n===t}function Fm(e){return e instanceof Lt&&e.getTypeName()||null}function md(e){return new Fl(e)}function yd(e){return new Ol(e)}function bd(e){return new Pl(e)}function vd(e){return new Ll(e)}function Dd(e){return new jl(e)}function xC(e){let t=new Vl(e);return IC()?new Bl(t):t}var Bl=class{inertDocumentHelper;constructor(t){this.inertDocumentHelper=t}getInertBodyElement(t){t=""+t;try{let n=new window.DOMParser().parseFromString(Eu(t),"text/html").body;return n===null?this.inertDocumentHelper.getInertBodyElement(t):(n.firstChild?.remove(),n)}catch(n){return null}}},Vl=class{defaultDoc;inertDocument;constructor(t){this.defaultDoc=t,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(t){let n=this.inertDocument.createElement("template");return n.innerHTML=Eu(t),n}};function IC(){try{return!!new window.DOMParser().parseFromString(Eu(""),"text/html")}catch(e){return!1}}var TC=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function ui(e){return e=String(e),e.match(TC)?e:"unsafe:"+e}function Vt(e){let t={};for(let n of e.split(","))t[n]=!0;return t}function ai(...e){let t={};for(let n of e)for(let r in n)n.hasOwnProperty(r)&&(t[r]=!0);return t}var Om=Vt("area,br,col,hr,img,wbr"),Pm=Vt("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),Lm=Vt("rp,rt"),SC=ai(Lm,Pm),MC=ai(Pm,Vt("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),AC=ai(Lm,Vt("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),Sg=ai(Om,MC,AC,SC),jm=Vt("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),NC=Vt("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),kC=Vt("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),RC=ai(jm,NC,kC),FC=Vt("script,style,template");var Hl=class{sanitizedSomething=!1;buf=[];sanitizeChildren(t){let n=t.firstChild,r=!0,o=[];for(;n;){if(n.nodeType===Node.ELEMENT_NODE?r=this.startElement(n):n.nodeType===Node.TEXT_NODE?this.chars(n.nodeValue):this.sanitizedSomething=!0,r&&n.firstChild){o.push(n),n=LC(n);continue}for(;n;){n.nodeType===Node.ELEMENT_NODE&&this.endElement(n);let i=PC(n);if(i){n=i;break}n=o.pop()}}return this.buf.join("")}startElement(t){let n=Mg(t).toLowerCase();if(!Sg.hasOwnProperty(n))return this.sanitizedSomething=!0,!FC.hasOwnProperty(n);this.buf.push("<"),this.buf.push(n);let r=t.attributes;for(let o=0;o"),!0}endElement(t){let n=Mg(t).toLowerCase();Sg.hasOwnProperty(n)&&!Om.hasOwnProperty(n)&&(this.buf.push(""))}chars(t){this.buf.push(Ag(t))}};function OC(e,t){return(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function PC(e){let t=e.nextSibling;if(t&&e!==t.previousSibling)throw Bm(t);return t}function LC(e){let t=e.firstChild;if(t&&OC(e,t))throw Bm(t);return t}function Mg(e){let t=e.nodeName;return typeof t=="string"?t:"FORM"}function Bm(e){return new Error(`Failed to sanitize html because the element is clobbered: ${e.outerHTML}`)}var jC=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,BC=/([^\#-~ |!])/g;function Ag(e){return e.replace(/&/g,"&").replace(jC,function(t){let n=t.charCodeAt(0),r=t.charCodeAt(1);return"&#"+((n-55296)*1024+(r-56320)+65536)+";"}).replace(BC,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}var zs;function Cu(e,t){let n=null;try{zs=zs||xC(e);let r=t?String(t):"";n=zs.getInertBodyElement(r);let o=5,i=r;do{if(o===0)throw new Error("Failed to sanitize html because the input is unstable");o--,r=i,i=n.innerHTML,n=zs.getInertBodyElement(r)}while(r!==i);let u=new Hl().sanitizeChildren(Ng(n)||n);return Eu(u)}finally{if(n){let r=Ng(n)||n;for(;r.firstChild;)r.firstChild.remove()}}}function Ng(e){return"content"in e&&VC(e)?e.content:null}function VC(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName==="TEMPLATE"}var HC=/^>|^->||--!>|)/g,UC="\u200B$1\u200B";function zC(e){return e.replace(HC,t=>t.replace($C,UC))}function qC(e,t){return e.createText(t)}function GC(e,t,n){e.setValue(t,n)}function WC(e,t){return e.createComment(zC(t))}function Vm(e,t,n){return e.createElement(t,n)}function nu(e,t,n,r,o){e.insertBefore(t,n,r,o)}function Hm(e,t,n){e.appendChild(t,n)}function kg(e,t,n,r,o){r!==null?nu(e,t,n,r,o):Hm(e,t,n)}function $m(e,t,n,r){e.removeChild(null,t,n,r)}function ZC(e,t,n){e.setAttribute(t,"style",n)}function YC(e,t,n){n===""?e.removeAttribute(t,"class"):e.setAttribute(t,"class",n)}function Um(e,t,n){let{mergedAttrs:r,classes:o,styles:i}=n;r!==null&&nC(e,t,r),o!==null&&YC(e,t,o),i!==null&&ZC(e,t,i)}var Pe=(function(e){return e[e.NONE=0]="NONE",e[e.HTML=1]="HTML",e[e.STYLE=2]="STYLE",e[e.SCRIPT=3]="SCRIPT",e[e.URL=4]="URL",e[e.RESOURCE_URL=5]="RESOURCE_URL",e})(Pe||{});function Ed(e){let t=zm();return t?Tg(t.sanitize(Pe.HTML,e)||""):Bt(e,"HTML")?Tg(Oe(e)):Cu(Im(),Ve(e))}function QC(e){let t=zm();return t?t.sanitize(Pe.URL,e)||"":Bt(e,"URL")?Oe(e):ui(Ve(e))}function zm(){let e=_();return e&&e[Ke].sanitizer}function KC(e){return e.ownerDocument.defaultView}function JC(e){return e.ownerDocument}function qm(e){return e instanceof Function?e():e}function XC(e,t,n){let r=e.length;for(;;){let o=e.indexOf(t,n);if(o===-1)return o;if(o===0||e.charCodeAt(o-1)<=32){let i=t.length;if(o+i===r||e.charCodeAt(o+i)<=32)return o}n=o+1}}var Gm="ng-template";function e_(e,t,n,r){let o=0;if(r){for(;o-1){let i;for(;++oi?d="":d=o[l+1].toLowerCase(),r&2&&c!==d){if(tt(r))return!1;s=!0}}}}return tt(r)||s}function tt(e){return(e&1)===0}function r_(e,t,n,r){if(t===null)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+u+'"':"")+"]"}else r&8?o+="."+s:r&4&&(o+=" "+s);else o!==""&&!tt(s)&&(t+=Rg(i,o),o=""),r=s,i=i||!tt(r);n++}return o!==""&&(t+=Rg(i,o)),t}function c_(e){return e.map(a_).join(",")}function l_(e){let t=[],n=[],r=1,o=2;for(;r=0;i--){let s=n[i],u=s.parentNode;s===t?(n.splice(i,1),Ul.add(s),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}}))):(o&&s===o||u&&r&&u!==r)&&(n.splice(i,1),s.dispatchEvent(new CustomEvent("animationend",{detail:{cancel:!0}})),s.parentNode?.removeChild(s))}}function m_(e,t){let n=$l.get(e);n?n.includes(t)||n.push(t):$l.set(e,[t])}var Kn=new Set,wu=(function(e){return e[e.CHANGE_DETECTION=0]="CHANGE_DETECTION",e[e.AFTER_NEXT_RENDER=1]="AFTER_NEXT_RENDER",e})(wu||{}),ot=new x(""),Fg=new Set;function Ct(e){Fg.has(e)||(Fg.add(e),performance?.mark?.("mark_feature_usage",{detail:{feature:e}}))}var xu=(()=>{class e{impl=null;execute(){this.impl?.execute()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Td=[0,1,2,3],Sd=(()=>{class e{ngZone=b(be);scheduler=b(gt);errorHandler=b(Be,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){b(ot,{optional:!0})}execute(){let n=this.sequences.size>0;n&&Y(q.AfterRenderHooksStart),this.executing=!0;for(let r of Td)for(let o of this.sequences)if(!(o.erroredOrDestroyed||!o.hooks[r]))try{o.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let i=o.hooks[r];return i(o.pipelinedValue)},o.snapshot))}catch(i){o.erroredOrDestroyed=!0,this.errorHandler?.handleError(i)}this.executing=!1;for(let r of this.sequences)r.afterRun(),r.once&&(this.sequences.delete(r),r.destroy());for(let r of this.deferredRegistrations)this.sequences.add(r);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),n&&Y(q.AfterRenderHooksEnd)}register(n){let{view:r}=n;r!==void 0?((r[Hn]??=[]).push(n),zn(r),r[L]|=8192):this.executing?this.deferredRegistrations.add(n):this.addSequence(n)}addSequence(n){this.sequences.add(n),this.scheduler.notify(7)}unregister(n){this.executing&&this.sequences.has(n)?(n.erroredOrDestroyed=!0,n.pipelinedValue=void 0,n.once=!0):(this.sequences.delete(n),this.deferredRegistrations.delete(n))}maybeTrace(n,r){return r?r.run(wu.AFTER_NEXT_RENDER,n):n()}static \u0275prov=T({token:e,providedIn:"root",factory:()=>new e})}return e})(),Xo=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(t,n,r,o,i,s=null){this.impl=t,this.hooks=n,this.view=r,this.once=o,this.snapshot=s,this.unregisterOnDestroy=i?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let t=this.view?.[Hn];t&&(this.view[Hn]=t.filter(n=>n!==this))}};function y_(e,t){let n=t?.injector??b(fe);return Ct("NgAfterNextRender"),v_(e,n,t,!0)}function b_(e){return e instanceof Function?[void 0,void 0,e,void 0]:[e.earlyRead,e.write,e.mixedReadWrite,e.read]}function v_(e,t,n,r){let o=t.get(xu);o.impl??=t.get(Sd);let i=t.get(ot,null,{optional:!0}),s=n?.manualCleanup!==!0?t.get(Fe):null,u=t.get(Lr,null,{optional:!0}),a=new Xo(o.impl,b_(e),u?.view,r,s,i?.snapshot(null));return o.impl.register(a),a}var Km=new x("",{factory:()=>({queue:new Set,isScheduled:!1,scheduler:null,injector:b(we)})});function Jm(e,t,n){let r=e.get(Km);if(Array.isArray(t))for(let o of t)r.queue.add(o),n?.detachedLeaveAnimationFns?.push(o);else r.queue.add(t),n?.detachedLeaveAnimationFns?.push(t);r.scheduler&&r.scheduler(e)}function D_(e,t){let n=e.get(Km);if(t.detachedLeaveAnimationFns){for(let r of t.detachedLeaveAnimationFns)n.queue.delete(r);t.detachedLeaveAnimationFns=void 0}}function E_(e,t){for(let[n,r]of t)Jm(e,r.animateFns)}function Og(e,t,n,r){let o=e?.[cn]?.enter;t!==null&&o&&o.has(n.index)&&E_(r,o)}function jr(e,t,n,r,o,i,s,u){if(o!=null){let a,c=!1;Je(o)?a=o:Ot(o)&&(c=!0,o=o[Qe]);let l=$e(o);e===0&&r!==null?(Og(u,r,i,n),s==null?Hm(t,r,l):nu(t,r,l,s||null,!0)):e===1&&r!==null?(Og(u,r,i,n),nu(t,r,l,s||null,!0),g_(i,l)):e===2?(u?.[cn]?.leave?.has(i.index)&&m_(i,l),Pg(u,i,n,d=>{if(Ul.has(l)){Ul.delete(l);return}$m(t,l,c,d)})):e===3&&Pg(u,i,n,()=>{t.destroyNode(l)}),a!=null&&k_(t,e,n,a,i,r,s)}}function C_(e,t){Xm(e,t),t[Qe]=null,t[Ie]=null}function __(e,t,n,r,o,i){r[Qe]=o,r[Ie]=t,Tu(e,r,n,1,o,i)}function Xm(e,t){t[Ke].changeDetectionScheduler?.notify(9),Tu(e,t,t[Z],2,null,null)}function w_(e){let t=e[Rr];if(!t)return Dl(e[S],e);for(;t;){let n=null;if(Ot(t))n=t[Rr];else{let r=t[te];r&&(n=r)}if(!n){for(;t&&!t[He]&&t!==e;)Ot(t)&&Dl(t[S],t),t=t[ue];t===null&&(t=e),Ot(t)&&Dl(t[S],t),n=t&&t[He]}t=n}}function Md(e,t){let n=e[$n],r=n.indexOf(t);n.splice(r,1)}function Iu(e,t){if(Un(t))return;let n=t[Z];n.destroyNode&&Tu(e,t,n,3,null,null),w_(t)}function Dl(e,t){if(Un(t))return;let n=I(null);try{t[L]&=-129,t[L]|=256,t[Ne]&&Xt(t[Ne]),T_(e,t),I_(e,t),t[S].type===1&&t[Z].destroy();let r=t[an];if(r!==null&&Je(t[ue])){r!==t[ue]&&Md(r,t);let o=t[vt];o!==null&&o.detachView(e)}Nl(t)}finally{I(n)}}function Pg(e,t,n,r){let o=e?.[cn];if(o==null||o.leave==null||!o.leave.has(t.index))return r(!1);e&&Kn.add(e[Ft]),Jm(n,()=>{if(o.leave&&o.leave.has(t.index)){let s=o.leave.get(t.index),u=[];if(s){for(let a=0;a{e[cn].running=void 0,Kn.delete(e[Ft]),t(!0)});return}t(!1)}function I_(e,t){let n=e.cleanup,r=t[kr];if(n!==null)for(let s=0;s=0?r[u]():r[-u].unsubscribe(),s+=2}else{let u=r[n[s+1]];n[s].call(u)}r!==null&&(t[kr]=null);let o=t[kt];if(o!==null){t[kt]=null;for(let s=0;sQ&&Qm(e,t,Q,!1);let u=s?q.TemplateUpdateStart:q.TemplateCreateStart;Y(u,o,n),n(r,o)}finally{dn(i);let u=s?q.TemplateUpdateEnd:q.TemplateCreateEnd;Y(u,o,n)}}function Su(e,t,n){j_(e,t,n),(n.flags&64)===64&&B_(e,t,n)}function ci(e,t,n=Ue){let r=t.localNames;if(r!==null){let o=t.index+1;for(let i=0;inull;function L_(e){return e==="class"?"className":e==="for"?"htmlFor":e==="formaction"?"formAction":e==="innerHtml"?"innerHTML":e==="readonly"?"readOnly":e==="tabindex"?"tabIndex":e}function iy(e,t,n,r,o,i){let s=t[S];if(Mu(e,s,t,n,r)){Dt(e)&&uy(t,e.index);return}e.type&3&&(n=L_(n)),sy(e,t,n,r,o,i)}function sy(e,t,n,r,o,i){if(e.type&3){let s=Ue(e,t);r=i!=null?i(r,e.value||"",n):r,o.setProperty(s,n,r)}else e.type&12}function uy(e,t){let n=ke(t,e);n[L]&16||(n[L]|=64)}function j_(e,t,n){let r=n.directiveStart,o=n.directiveEnd;Dt(n)&&p_(t,n,e.data[r+n.componentOffset]),e.firstCreatePass||eu(n,t);let i=n.initialInputs;for(let s=r;s=u&&f<=a){let p=t.data[f],m=d[h+1];hn(p,n[f],m,i),c=!0}else if(f>a)break}}return s!==null&&r.inputs.hasOwnProperty(o)&&(hn(r,n[s],o,i),c=!0),c}function q_(e,t){let n=ke(t,e),r=n[S];G_(r,n);let o=n[Qe];o!==null&&n[jn]===null&&(n[jn]=km(o,n[Rt])),Y(q.ComponentStart);try{Od(r,n,n[ee])}finally{Y(q.ComponentEnd,n[ee])}}function G_(e,t){for(let n=t.length;n{zn(e.lView)},consumerOnSignalRead(){this.lView[Ne]=this}});function J_(e){let t=e[Ne]??Object.create(X_);return t.lView=e,t}var X_=P(M({},Qt),{consumerIsAlwaysLive:!0,kind:"template",consumerMarkedDirty:e=>{let t=un(e.lView);for(;t&&!fy(t[S]);)t=un(t);t&&Kc(t)},consumerOnSignalRead(){this.lView[Ne]=this}});function fy(e){return e.type!==2}function py(e){if(e[sn]===null)return;let t=!0;for(;t;){let n=!1;for(let r of e[sn])r.dirty&&(n=!0,r.zone===null||Zone.current===r.zone?r.run():r.zone.run(()=>r.run()));t=n&&!!(e[L]&8192)}}var ew=100;function hy(e,t=0){let r=e[Ke].rendererFactory,o=!1;o||r.begin?.();try{tw(e,t)}finally{o||r.end?.()}}function tw(e,t){let n=cl();try{ko(!0),ql(e,t);let r=0;for(;Uo(e);){if(r===ew)throw new C(103,!1);r++,ql(e,1)}}finally{ko(n)}}function nw(e,t,n,r){if(Un(t))return;let o=t[L],i=!1,s=!1;js(t);let u=!0,a=null,c=null;i||(fy(e)?(c=Z_(t),a=Tt(c)):ji()===null?(u=!1,c=J_(t),a=Tt(c)):t[Ne]&&(Xt(t[Ne]),t[Ne]=null));try{Qc(t),tg(e.bindingStartIndex),n!==null&&oy(e,t,n,2,r);let l=(o&3)===3;if(!i)if(l){let f=e.preOrderCheckHooks;f!==null&&Gs(t,f,null)}else{let f=e.preOrderHooks;f!==null&&Ws(t,f,0,null),bl(t,0)}if(s||rw(t),py(t),gy(t,0),e.contentQueries!==null&&Rm(e,t),!i)if(l){let f=e.contentCheckHooks;f!==null&&Gs(t,f)}else{let f=e.contentHooks;f!==null&&Ws(t,f,1),bl(t,1)}iw(e,t);let d=e.components;d!==null&&yy(t,d,0);let h=e.viewQuery;if(h!==null&&Rl(2,h,r),!i)if(l){let f=e.viewCheckHooks;f!==null&&Gs(t,f)}else{let f=e.viewHooks;f!==null&&Ws(t,f,2),bl(t,2)}if(e.firstUpdatePass===!0&&(e.firstUpdatePass=!1),t[Ns]){for(let f of t[Ns])f();t[Ns]=null}i||(ly(t),t[L]&=-73)}catch(l){throw i||zn(t),l}finally{c!==null&&(Jt(c,a),u&&Q_(c)),Bs()}}function gy(e,t){for(let n=_m(e);n!==null;n=wm(n))for(let r=te;r0&&(e[n-1][He]=r[He]);let i=Lo(e,te+t);C_(r[S],r);let s=i[vt];s!==null&&s.detachView(i[S]),r[ue]=null,r[He]=null,r[L]&=-129}return r}function sw(e,t,n,r){let o=te+r,i=n.length;r>0&&(n[o-1][He]=t),r-1&&(ti(t,r),Lo(n,r))}this._attachedToViewContainer=!1}Iu(this._lView[S],this._lView)}onDestroy(t){Jc(this._lView,t)}markForCheck(){Au(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[L]&=-129}reattach(){Fs(this._lView),this._lView[L]|=128}detectChanges(){this._lView[L]|=1024,hy(this._lView)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new C(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let t=Or(this._lView),n=this._lView[an];n!==null&&!t&&Md(n,this._lView),Xm(this._lView[S],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new C(902,!1);this._appRef=t;let n=Or(this._lView),r=this._lView[an];r!==null&&!n&&Ey(r,this._lView),Fs(this._lView)}};var mn=(()=>{class e{_declarationLView;_declarationTContainer;elementRef;static __NG_ELEMENT_ID__=uw;constructor(n,r,o){this._declarationLView=n,this._declarationTContainer=r,this.elementRef=o}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(n,r){return this.createEmbeddedViewImpl(n,r)}createEmbeddedViewImpl(n,r,o){let i=li(this._declarationLView,this._declarationTContainer,n,{embeddedViewInjector:r,dehydratedView:o});return new gn(i)}}return e})();function uw(){return Nu(re(),_())}function Nu(e,t){return e.type&4?new mn(t,e,Gr(e,t)):null}function rr(e,t,n,r,o){let i=e.data[t];if(i===null)i=aw(e,t,n,r,o),ng()&&(i.flags|=32);else if(i.type&64){i.type=n,i.value=r,i.attrs=o;let s=eg();i.injectorIndex=s===null?-1:s.injectorIndex}return qn(i,!0),i}function aw(e,t,n,r,o){let i=il(),s=sl(),u=s?i:i&&i.parent,a=e.data[t]=lw(e,u,n,t,r,o);return cw(e,a,i,s),a}function cw(e,t,n,r){e.firstChild===null&&(e.firstChild=t),n!==null&&(r?n.child==null&&t.parent!==null&&(n.child=t):n.next===null&&(n.next=t,t.prev=n))}function lw(e,t,n,r,o,i){let s=t?t.injectorIndex:-1,u=0;return nl()&&(u|=128),{type:n,index:r,insertBeforeIndex:null,injectorIndex:s,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,controlDirectiveIndex:-1,customControlIndex:-1,propertyBindings:null,flags:u,providerIndexes:0,value:o,attrs:i,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:t,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}function dw(e){let t=e[Gc]??[],r=e[ue][Z],o=[];for(let i of t)i.data[Sm]!==void 0?o.push(i):fw(i,r);e[Gc]=o}function fw(e,t){let n=0,r=e.firstChild;if(r){let o=e.data[Tm];for(;nnull,hw=()=>null;function ru(e,t){return pw(e,t)}function Cy(e,t,n){return hw(e,t,n)}var _y=class{},ku=class{},Gl=class{resolveComponentFactory(t){throw new C(917,!1)}},fi=class{static NULL=new Gl},Jn=class{},pi=(()=>{class e{destroyNode=null;static __NG_ELEMENT_ID__=()=>gw()}return e})();function gw(){let e=_(),t=re(),n=ke(t.index,e);return(Ot(n)?n:e)[Z]}var wy=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>null})}return e})();var Ys={},Wl=class{injector;parentInjector;constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){let o=this.injector.get(t,Ys,r);return o!==Ys||n===Ys?o:this.parentInjector.get(t,n,r)}};function ou(e,t,n){let r=n?e.styles:null,o=n?e.classes:null,i=0;if(t!==null)for(let s=0;s0&&(n.directiveToIndex=new Map);for(let h=0;h0;){let n=e[--t];if(typeof n=="number"&&n<0)return n}return 0}function ww(e,t,n){if(n){if(t.exportAs)for(let r=0;rr($e(m[e.index])):e.index;Sy(p,t,n,i,u,f,!1)}}return c}function Mw(e){return e.startsWith("animation")||e.startsWith("transition")}function Aw(e,t,n,r){let o=e.cleanup;if(o!=null)for(let i=0;ia?u[a]:null}typeof s=="string"&&(i+=2)}return null}function Sy(e,t,n,r,o,i,s){let u=t.firstCreatePass?el(t):null,a=Xc(n),c=a.length;a.push(o,i),u&&u.push(r,e,c,(c+1)*(s?-1:1))}function su(e,t,n,r,o,i){let s=t[n],u=t[S],c=u.data[n].outputs[r],d=s[c].subscribe(i);Sy(e.index,u,t,o,i,d,!0)}function Nw(){let e=_(),t=G(),n=re();if(t.firstCreatePass&&Rw(t,n),n.controlDirectiveIndex===-1)return;Ct("NgSignalForms");let r=e[n.controlDirectiveIndex];t.data[n.controlDirectiveIndex].controlDef.create(r,new uu(e,t,n))}function kw(){let e=_(),t=G(),n=fn();if(n.controlDirectiveIndex===-1)return;let r=t.data[n.controlDirectiveIndex].controlDef,o=e[n.controlDirectiveIndex];r.update(o,new uu(e,t,n))}var uu=class{lView;tView;tNode;hasPassThrough;constructor(t,n,r){this.lView=t,this.tView=n,this.tNode=r,this.hasPassThrough=!!(r.flags&4096)}get customControl(){return this.tNode.customControlIndex!==-1?this.lView[this.tNode.customControlIndex]:void 0}get descriptor(){return`<${this.tNode.value}>`}listenToCustomControlOutput(t,n){My(this.tView.data[this.tNode.customControlIndex],t)&&su(this.tNode,this.lView,this.tNode.customControlIndex,t,t,Yn(this.tNode,this.lView,n))}listenToCustomControlModel(t){let n=this.tNode.flags&1024?"valueChange":"checkedChange";su(this.tNode,this.lView,this.tNode.customControlIndex,n,n,Yn(this.tNode,this.lView,t))}listenToDom(t,n){Vd(this.tNode,this.tView,this.lView,void 0,this.lView[Z],t,n,Yn(this.tNode,this.lView,n))}setInputOnDirectives(t,n){let r=this.tNode.inputs?.[t],o=this.tNode.hostDirectiveInputs?.[t];if(!r&&!o)return!1;if(r)for(let i of r){let s=this.tView.data[i],u=this.lView[i];hn(s,u,t,n)}if(o)for(let i=0;i1){t.flags|=4096;return}Fw(e,t)}function Fw(e,t){for(let n=t.directiveStart;n{Nw()},update:()=>{zg(r.targetIdx,e,t()),kw()}};return r}let n={[ni]:Ug,update:()=>zg(n.targetIdx,e,t())};return n}function Ay(e){return e.debugInfo?.className||e.type.name||null}var au=class extends fi{ngModule;constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){let n=bt(t);return new yn(n,this.ngModule)}};function Pw(e){return Object.keys(e).map(t=>{let[n,r,o]=e[t],i={propName:n,templateName:t,isSignal:(r&_u.SignalBased)!==0};return o&&(i.transform=o),i})}function Lw(e){return Object.keys(e).map(t=>({propName:e[t],templateName:t}))}function jw(e,t,n){let r=t instanceof we?t:t?.injector;return r&&e.getStandaloneInjector!==null&&(r=e.getStandaloneInjector(r)||r),r?new Wl(n,r):n}function Bw(e){let t=e.get(Jn,null);if(t===null)throw new C(407,!1);let n=e.get(wy,null),r=e.get(gt,null),o=e.get(ot,null,{optional:!0});return{rendererFactory:t,sanitizer:n,changeDetectionScheduler:r,ngReflect:!1,tracingService:o}}function Vw(e,t){let n=Ny(e);return Vm(t,n,n==="svg"?Zc:n==="math"?z0:null)}function Ny(e){return(e.selectors[0][0]||"div").toLowerCase()}var yn=class extends ku{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=Pw(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=Lw(this.componentDef.outputs),this.cachedOutputs}constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=c_(t.selectors),this.ngContentSelectors=t.ngContentSelectors??[],this.isBoundToModule=!!n}create(t,n,r,o,i,s){Y(q.DynamicComponentStart);let u=I(null);try{let a=this.componentDef,c=jw(a,o||this.ngModule,t),l=Bw(c),d=l.tracingService;return d&&d.componentCreate?d.componentCreate(Ay(a),()=>this.createComponentRef(l,c,n,r,i,s)):this.createComponentRef(l,c,n,r,i,s)}finally{I(u)}}createComponentRef(t,n,r,o,i,s){let u=this.componentDef,a=Hw(o,u,s,i),c=t.rendererFactory.createRenderer(null,u),l=o?F_(c,o,u.encapsulation,n):Vw(u,c),d=s?.some(qg)||i?.some(p=>typeof p!="function"&&p.bindings.some(qg)),h=wd(null,a,null,512|Zm(u),null,null,t,c,n,null,km(l,n,!0));h[Q]=l,js(h);let f=null;try{let p=Pd(Q,h,2,"#host",()=>a.directiveRegistry,!0,0);Um(c,l,p),Hr(l,h),Su(a,h,p),gd(a,p,h),Ld(a,p),r!==void 0&&Uw(p,this.ngContentSelectors,r),f=ke(p.index,h),h[ee]=f[ee],Od(a,h,null)}catch(p){throw f!==null&&Nl(f),Nl(h),p}finally{Y(q.DynamicComponentEnd),Bs()}return new cu(this.componentType,h,!!d)}};function Hw(e,t,n,r){let o=e?["ng-version","21.2.4"]:l_(t.selectors[0]),i=null,s=null,u=0;if(n)for(let l of n)u+=l[ni].requiredVars,l.create&&(l.targetIdx=0,(i??=[]).push(l)),l.update&&(l.targetIdx=0,(s??=[]).push(l));if(r)for(let l=0;l{if(n&1&&e)for(let r of e)r.create();if(n&2&&t)for(let r of t)r.update()}}function qg(e){let t=e[ni].kind;return t==="input"||t==="twoWay"}var cu=class extends _y{_rootLView;_hasInputBindings;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(t,n,r){super(),this._rootLView=n,this._hasInputBindings=r,this._tNode=ks(n[S],Q),this.location=Gr(this._tNode,n),this.instance=ke(this._tNode.index,n)[ee],this.hostView=this.changeDetectorRef=new gn(n,void 0),this.componentType=t}setInput(t,n){this._hasInputBindings;let r=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(t)&&Object.is(this.previousInputValues.get(t),n))return;let o=this._rootLView,i=Mu(r,o[S],o,t,n);this.previousInputValues.set(t,n);let s=ke(r.index,o);Au(s,1)}get injector(){return new Zn(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(t){this.hostView.onDestroy(t)}};function Uw(e,t,n){let r=e.projection=[];for(let o=0;o{class e{static __NG_ELEMENT_ID__=zw}return e})();function zw(){let e=re();return ky(e,_())}var Zl=class e extends it{_lContainer;_hostTNode;_hostLView;constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return Gr(this._hostTNode,this._hostLView)}get injector(){return new Zn(this._hostTNode,this._hostLView)}get parentInjector(){let t=dd(this._hostTNode,this._hostLView);if(dm(t)){let n=Js(t,this._hostLView),r=Ks(t),o=n[S].data[r+8];return new Zn(o,n)}else return new Zn(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){let n=Gg(this._lContainer);return n!==null&&n[t]||null}get length(){return this._lContainer.length-te}createEmbeddedView(t,n,r){let o,i;typeof r=="number"?o=r:r!=null&&(o=r.index,i=r.injector);let s=ru(this._lContainer,t.ssrId),u=t.createEmbeddedViewImpl(n||{},i,s);return this.insertImpl(u,o,$r(this._hostTNode,s)),u}createComponent(t,n,r,o,i,s,u){let a=t&&!ZE(t),c;if(a)c=n;else{let g=n||{};c=g.index,r=g.injector,o=g.projectableNodes,i=g.environmentInjector||g.ngModuleRef,s=g.directives,u=g.bindings}let l=a?t:new yn(bt(t)),d=r||this.parentInjector;if(!i&&l.ngModule==null){let y=(a?d:this.parentInjector).get(we,null);y&&(i=y)}let h=bt(l.componentType??{}),f=ru(this._lContainer,h?.id??null),p=f?.firstChild??null,m=l.create(d,o,p,i,s,u);return this.insertImpl(m.hostView,c,$r(this._hostTNode,f)),m}insert(t,n){return this.insertImpl(t,n,!0)}insertImpl(t,n,r){let o=t._lView;if(G0(o)){let u=this.indexOf(t);if(u!==-1)this.detach(u);else{let a=o[ue],c=new e(a,a[Ie],a[ue]);c.detach(c.indexOf(t))}}let i=this._adjustIndex(n),s=this._lContainer;return di(s,o,i,r),t.attachToViewContainerRef(),jc(El(s),i,t),t}move(t,n){return this.insert(t,n)}indexOf(t){let n=Gg(this._lContainer);return n!==null?n.indexOf(t):-1}remove(t){let n=this._adjustIndex(t,-1),r=ti(this._lContainer,n);r&&(Lo(El(this._lContainer),n),Iu(r[S],r))}detach(t){let n=this._adjustIndex(t,-1),r=ti(this._lContainer,n);return r&&Lo(El(this._lContainer),n)!=null?new gn(r):null}_adjustIndex(t,n=0){return t??this.length+n}};function Gg(e){return e[Vo]}function El(e){return e[Vo]||(e[Vo]=[])}function ky(e,t){let n,r=t[e.index];return Je(r)?n=r:(n=by(r,t,null,e),t[e.index]=n,xd(t,n)),Gw(n,t,e,r),new Zl(n,e,t)}function qw(e,t){let n=e[Z],r=n.createComment(""),o=Ue(t,e),i=n.parentNode(o);return nu(n,i,r,n.nextSibling(o),!1),r}var Gw=Yw,Ww=()=>!1;function Zw(e,t,n){return Ww(e,t,n)}function Yw(e,t,n,r){if(e[ln])return;let o;n.type&8?o=$e(r):o=qw(t,n),e[ln]=o}var Yl=class e{queryList;matches=null;constructor(t){this.queryList=t}clone(){return new e(this.queryList)}setDirty(){this.queryList.setDirty()}},Ql=class e{queries;constructor(t=[]){this.queries=t}createEmbeddedView(t){let n=t.queries;if(n!==null){let r=t.contentQueries!==null?t.contentQueries[0]:n.length,o=[];for(let i=0;i0)r.push(s[u/2]);else{let c=i[u+1],l=t[-a];for(let d=te;dt.trim())}function Ly(e,t,n){e.queries===null&&(e.queries=new Kl),e.queries.track(new Jl(t,n))}function tx(e,t){let n=e.contentQueries||(e.contentQueries=[]),r=n.length?n[n.length-1]:-1;t!==r&&n.push(e.queries.length-1,t)}function $d(e,t){return e.queries.getByIndex(t)}function jy(e,t){let n=e[S],r=$d(n,t);return r.crossesNgTemplate?Xl(n,e,t,[]):Ry(n,e,r,t)}function Ud(e,t,n){let r,o=Do(()=>{r._dirtyCounter();let i=nx(r,e);if(t&&i===void 0)throw new C(-951,!1);return i});return r=o[ne],r._dirtyCounter=pn(0),r._flatValue=void 0,o}function zd(e){return Ud(!0,!1,e)}function qd(e){return Ud(!0,!0,e)}function By(e){return Ud(!1,!1,e)}function Vy(e,t){let n=e[ne];n._lView=_(),n._queryIndex=t,n._queryList=Hd(n._lView,t),n._queryList.onDirty(()=>n._dirtyCounter.update(r=>r+1))}function nx(e,t){let n=e._lView,r=e._queryIndex;if(n===void 0||r===void 0||n[L]&4)return t?void 0:ye;let o=Hd(n,r),i=jy(n,r);return o.reset(i,Dm),t?o.first:o._changesDetected||e._flatValue===void 0?e._flatValue=o.toArray():e._flatValue}var bn=class{},Hy=class{};function Gd(e,t){return new ri(e,t??null,[])}var ri=class extends bn{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new au(this);constructor(t,n,r,o=!0){super(),this.ngModuleType=t,this._parent=n;let i=Oc(t);this._bootstrapComponents=qm(i.bootstrap),this._r3Injector=pl(t,n,[{provide:bn,useValue:this},{provide:fi,useValue:this.componentFactoryResolver},...r],Oo(t),new Set(["environment"])),o&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let t=this._r3Injector;!t.destroyed&&t.destroy(),this.destroyCbs.forEach(n=>n()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}},du=class extends Hy{moduleType;constructor(t){super(),this.moduleType=t}create(t){return new ri(this.moduleType,t,[])}};var oi=class extends bn{injector;componentFactoryResolver=new au(this);instance=null;constructor(t){super();let n=new On([...t.providers,{provide:bn,useValue:this},{provide:fi,useValue:this.componentFactoryResolver}],t.parent||Ar(),t.debugName,new Set(["environment"]));this.injector=n,t.runEnvironmentInitializers&&n.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}};function $y(e,t,n=null){return new oi({providers:e,parent:t,debugName:n,runEnvironmentInitializers:!0}).injector}var rx=(()=>{class e{_injector;cachedInjectors=new Map;constructor(n){this._injector=n}getOrCreateStandaloneInjector(n){if(!n.standalone)return null;if(!this.cachedInjectors.has(n)){let r=Hc(!1,n.type),o=r.length>0?$y([r],this._injector,""):null;this.cachedInjectors.set(n,o)}return this.cachedInjectors.get(n)}ngOnDestroy(){try{for(let n of this.cachedInjectors.values())n!==null&&n.destroy()}finally{this.cachedInjectors.clear()}}static \u0275prov=T({token:e,providedIn:"environment",factory:()=>new e(A(we))})}return e})();function Zr(e){return si(()=>{let t=Uy(e),n=P(M({},t),{decls:e.decls,vars:e.vars,template:e.template,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,onPush:e.changeDetection===pd.OnPush,directiveDefs:null,pipeDefs:null,dependencies:t.standalone&&e.dependencies||null,getStandaloneInjector:t.standalone?o=>o.get(rx).getOrCreateStandaloneInjector(n):null,getExternalStyles:null,signals:e.signals??!1,data:e.data||{},encapsulation:e.encapsulation||nt.Emulated,styles:e.styles||ye,_:null,schemas:e.schemas||null,tView:null,id:""});t.standalone&&Ct("NgStandalone"),zy(n);let r=e.dependencies;return n.directiveDefs=Wg(r,ox),n.pipeDefs=Wg(r,N0),n.id=ux(n),n})}function ox(e){return bt(e)||xs(e)}function Ht(e){return si(()=>({type:e.type,bootstrap:e.bootstrap||ye,declarations:e.declarations||ye,imports:e.imports||ye,exports:e.exports||ye,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null}))}function ix(e,t){if(e==null)return Ye;let n={};for(let r in e)if(e.hasOwnProperty(r)){let o=e[r],i,s,u,a;Array.isArray(o)?(u=o[0],i=o[1],s=o[2]??i,a=o[3]||null):(i=o,s=o,u=_u.None,a=null),n[i]=[r,u,a],t[i]=s}return n}function sx(e){if(e==null)return Ye;let t={};for(let n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}function st(e){return si(()=>{let t=Uy(e);return zy(t),t})}function Fu(e){return{type:e.type,name:e.name,factory:null,pure:e.pure!==!1,standalone:e.standalone??!0,onDestroy:e.type.prototype.ngOnDestroy||null}}function Uy(e){let t={};return{type:e.type,providersResolver:null,viewProvidersResolver:null,factory:null,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:t,inputConfig:e.inputs||Ye,exportAs:e.exportAs||null,standalone:e.standalone??!0,signals:e.signals===!0,selectors:e.selectors||ye,viewQuery:e.viewQuery||null,features:e.features||null,setInput:null,resolveHostDirectives:null,hostDirectives:null,controlDef:null,inputs:ix(e.inputs,t),outputs:sx(e.outputs),debugInfo:null}}function zy(e){e.features?.forEach(t=>t(e))}function Wg(e,t){return e?()=>{let n=typeof e=="function"?e():e,r=[];for(let o of n){let i=t(o);i!==null&&r.push(i)}return r}:null}function ux(e){let t=0,n=typeof e.consts=="function"?"":e.consts,r=[e.selectors,e.ngContentSelectors,e.hostVars,e.hostAttrs,n,e.vars,e.decls,e.encapsulation,e.standalone,e.signals,e.exportAs,JSON.stringify(e.inputs),JSON.stringify(e.outputs),Object.getOwnPropertyNames(e.type.prototype),!!e.contentQueries,!!e.viewQuery];for(let i of r.join("|"))t=Math.imul(31,t)+i.charCodeAt(0)<<0;return t+=2147483648,"c"+t}function ax(e){let t=n=>{let r=Array.isArray(e);n.hostDirectives===null?(n.resolveHostDirectives=cx,n.hostDirectives=r?e.map(ed):[e]):r?n.hostDirectives.unshift(...e.map(ed)):n.hostDirectives.unshift(e)};return t.ngInherit=!0,t}function cx(e){let t=[],n=!1,r=null,o=null;for(let i=0;i=0;r--){let o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=Vr(o.hostAttrs,n=Vr(n,o.hostAttrs))}}function Cl(e){return e===Ye?{}:e===ye?[]:e}function hx(e,t){let n=e.viewQuery;n?e.viewQuery=(r,o)=>{t(r,o),n(r,o)}:e.viewQuery=t}function gx(e,t){let n=e.contentQueries;n?e.contentQueries=(r,o,i)=>{t(r,o,i),n(r,o,i)}:e.contentQueries=t}function mx(e,t){let n=e.hostBindings;n?e.hostBindings=(r,o)=>{t(r,o),n(r,o)}:e.hostBindings=t}function Gy(e,t,n,r,o,i,s,u){if(n.firstCreatePass){e.mergedAttrs=Vr(e.mergedAttrs,e.attrs);let l=e.tView=_d(2,e,o,i,s,n.directiveRegistry,n.pipeRegistry,null,n.schemas,n.consts,null);n.queries!==null&&(n.queries.template(n,e),l.queries=n.queries.embeddedTView(e))}u&&(e.flags|=u),qn(e,!1);let a=bx(n,t,e,r);Vs()&&Ad(n,t,a,e),Hr(a,t);let c=by(a,t,a,e);t[r+Q]=c,xd(t,c),Zw(c,e,t)}function yx(e,t,n,r,o,i,s,u,a,c,l){let d=n+Q,h;return t.firstCreatePass?(h=rr(t,d,4,s||null,u||null),Os()&&xy(t,e,h,Re(t.consts,c),kd),am(t,h)):h=t.data[d],Gy(h,e,t,n,r,o,i,a),Fr(h)&&Su(t,e,h),c!=null&&ci(e,h,l),h}function Ur(e,t,n,r,o,i,s,u,a,c,l){let d=n+Q,h;if(t.firstCreatePass){if(h=rr(t,d,4,s||null,u||null),c!=null){let f=Re(t.consts,c);h.localNames=[];for(let p=0;p{class e{log(n){console.log(n)}warn(n){console.warn(n)}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function Wd(e){return typeof e=="function"&&e[ne]!==void 0}function Zd(e){return Wd(e)&&typeof e.set=="function"}var Ou=new x(""),Pu=new x(""),hi=(()=>{class e{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(n,r,o){this._ngZone=n,this.registry=r,As()&&(this._destroyRef=b(Fe,{optional:!0})??void 0),Yd||(Ky(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this._taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){let n=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),r=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{be.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{n.unsubscribe(),r.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb()}});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>r.updateCb&&r.updateCb(n)?(clearTimeout(r.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n()},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}static \u0275fac=function(r){return new(r||e)(A(be),A(Qy),A(Pu))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),Qy=(()=>{class e{_applications=new Map;registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){return Yd?.findTestabilityInTree(this,n,r)??null}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"platform"})}return e})();function Ky(e){Yd=e}var Yd;function gi(e){return!!e&&typeof e.then=="function"}function Lu(e){return!!e&&typeof e.subscribe=="function"}var Qd=new x("");function Dx(e){return Ln([{provide:Qd,multi:!0,useValue:e}])}var Kd=(()=>{class e{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((n,r)=>{this.resolve=n,this.reject=r});appInits=b(Qd,{optional:!0})??[];injector=b(fe);constructor(){}runInitializers(){if(this.initialized)return;let n=[];for(let o of this.appInits){let i=Nr(this.injector,o);if(gi(i))n.push(i);else if(Lu(i)){let s=new Promise((u,a)=>{i.subscribe({complete:u,error:a})});n.push(s)}}let r=()=>{this.done=!0,this.resolve()};Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),n.length===0&&r(),this.initialized=!0}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Jy=new x("");function Xy(){qa(()=>{let e="";throw new C(600,e)})}function eb(e){return e.isBoundToModule}var Ex=10;var Qr=(()=>{class e{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=b(Pt);afterRenderManager=b(xu);zonelessEnabled=b(Zo);rootEffectScheduler=b(Hs);dirtyFlags=0;tracingSnapshot=null;allTestViews=new Set;autoDetectTestViews=new Set;includeAllTestViews=!1;afterTick=new ce;get allViews(){return[...(this.includeAllTestViews?this.allTestViews:this.autoDetectTestViews).keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];internalPendingTask=b(Gn);get isStable(){return this.internalPendingTask.hasPendingTasksObservable.pipe(Ce(n=>!n))}constructor(){b(ot,{optional:!0})}whenStable(){let n;return new Promise(r=>{n=this.isStable.subscribe({next:o=>{o&&r()}})}).finally(()=>{n.unsubscribe()})}_injector=b(we);_rendererFactory=null;get injector(){return this._injector}bootstrap(n,r){return this.bootstrapImpl(n,r)}bootstrapImpl(n,r,o=fe.NULL){return this._injector.get(be).run(()=>{Y(q.BootstrapComponentStart);let s=n instanceof ku;if(!this._injector.get(Kd).done){let p="";throw new C(405,p)}let a;s?a=n:a=this._injector.get(fi).resolveComponentFactory(n),this.componentTypes.push(a.componentType);let c=eb(a)?void 0:this._injector.get(bn),l=r||a.selector,d=a.create(o,[],l,c),h=d.location.nativeElement,f=d.injector.get(Ou,null);return f?.registerApplication(h),d.onDestroy(()=>{this.detachView(d.hostView),Ko(this.components,d),f?.unregisterApplication(h)}),this._loadComponent(d),Y(q.BootstrapComponentEnd,d),d})}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Y(q.ChangeDetectionStart),this.tracingSnapshot!==null?this.tracingSnapshot.run(wu.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw Y(q.ChangeDetectionEnd),new C(101,!1);let n=I(null);try{this._runningTick=!0,this.synchronize()}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,I(n),this.afterTick.next(),Y(q.ChangeDetectionEnd)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(Jn,null,{optional:!0}));let n=0;for(;this.dirtyFlags!==0&&n++Uo(n))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(n){let r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){let r=n;Ko(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView);try{this.tick()}catch(o){this.internalErrorHandler(o)}this.components.push(n),this._injector.get(Jy,[]).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>Ko(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new C(406,!1);let n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function Ko(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}function tb(e,t){let n=_(),r=et();if(Te(n,r,t)){let o=G(),i=fn();if(Mu(i,o,n,e,t))Dt(i)&&uy(n,i.index);else{let u=Ue(i,n);ay(n[Z],u,null,i.value,e,t,null)}}return tb}function ju(e,t,n,r){let o=_(),i=et();if(Te(o,i,t)){let s=G(),u=fn();H_(u,o,e,t,n,r)}return ju}function Cx(){return _()[ve][ee]}var td=class{destroy(t){}updateValue(t,n){}swap(t,n){let r=Math.min(t,n),o=Math.max(t,n),i=this.detach(o);if(o-r>1){let s=this.detach(r);this.attach(r,i),this.attach(o,s)}else this.attach(r,i)}move(t,n){this.attach(n,this.detach(t))}};function _l(e,t,n,r,o){return e===n&&Object.is(t,r)?1:Object.is(o(e,t),o(n,r))?-1:0}function _x(e,t,n,r){let o,i,s=0,u=e.length-1,a=void 0;if(Array.isArray(t)){I(r);let c=t.length-1;for(I(null);s<=u&&s<=c;){let l=e.at(s),d=t[s],h=_l(s,l,s,d,n);if(h!==0){h<0&&e.updateValue(s,d),s++;continue}let f=e.at(u),p=t[c],m=_l(u,f,c,p,n);if(m!==0){m<0&&e.updateValue(u,p),u--,c--;continue}let g=n(s,l),y=n(u,f),v=n(s,d);if(Object.is(v,y)){let w=n(c,p);Object.is(w,g)?(e.swap(s,u),e.updateValue(u,p),c--,u--):e.move(u,s),e.updateValue(s,d),s++;continue}if(o??=new fu,i??=Kg(e,s,u,n),nd(e,o,s,v))e.updateValue(s,d),s++,u++;else if(i.has(v))o.set(g,e.detach(s)),u--;else{let w=e.create(s,t[s]);e.attach(s,w),s++,u++}}for(;s<=c;)Qg(e,o,n,s,t[s]),s++}else if(t!=null){I(r);let c=t[Symbol.iterator]();I(null);let l=c.next();for(;!l.done&&s<=u;){let d=e.at(s),h=l.value,f=_l(s,d,s,h,n);if(f!==0)f<0&&e.updateValue(s,h),s++,l=c.next();else{o??=new fu,i??=Kg(e,s,u,n);let p=n(s,h);if(nd(e,o,s,p))e.updateValue(s,h),s++,u++,l=c.next();else if(!i.has(p))e.attach(s,e.create(s,h)),s++,u++,l=c.next();else{let m=n(s,d);o.set(m,e.detach(s)),u--}}}for(;!l.done;)Qg(e,o,n,e.length,l.value),l=c.next()}for(;s<=u;)e.destroy(e.detach(u--));o?.forEach(c=>{e.destroy(c)})}function nd(e,t,n,r){return t!==void 0&&t.has(r)?(e.attach(n,t.get(r)),t.delete(r),!0):!1}function Qg(e,t,n,r,o){if(nd(e,t,r,n(r,o)))e.updateValue(r,o);else{let i=e.create(r,o);e.attach(r,i)}}function Kg(e,t,n,r){let o=new Set;for(let i=t;i<=n;i++)o.add(r(i,e.at(i)));return o}var fu=class{kvMap=new Map;_vMap=void 0;has(t){return this.kvMap.has(t)}delete(t){if(!this.has(t))return!1;let n=this.kvMap.get(t);return this._vMap!==void 0&&this._vMap.has(n)?(this.kvMap.set(t,this._vMap.get(n)),this._vMap.delete(n)):this.kvMap.delete(t),!0}get(t){return this.kvMap.get(t)}set(t,n){if(this.kvMap.has(t)){let r=this.kvMap.get(t);this._vMap===void 0&&(this._vMap=new Map);let o=this._vMap;for(;o.has(r);)r=o.get(r);o.set(r,n)}else this.kvMap.set(t,n)}forEach(t){for(let[n,r]of this.kvMap)if(t(r,n),this._vMap!==void 0){let o=this._vMap;for(;o.has(r);)r=o.get(r),t(r,n)}}};function Jd(e,t,n,r,o,i,s,u){Ct("NgControlFlow");let a=_(),c=G(),l=Re(c.consts,i);return Ur(a,c,e,t,n,r,o,l,256,s,u),Xd}function Xd(e,t,n,r,o,i,s,u){Ct("NgControlFlow");let a=_(),c=G(),l=Re(c.consts,i);return Ur(a,c,e,t,n,r,o,l,512,s,u),Xd}function ef(e,t){Ct("NgControlFlow");let n=_(),r=et(),o=n[r]!==le?n[r]:-1,i=o!==-1?pu(n,Q+o):void 0,s=0;if(Te(n,r,e)){let u=I(null);try{if(i!==void 0&&Dy(i,s),e!==-1){let a=Q+e,c=pu(n,a),l=sd(n[S],a),d=Cy(c,l,n),h=li(n,l,t,{dehydratedView:d});di(c,h,s,$r(l,d))}}finally{I(u)}}else if(i!==void 0){let u=vy(i,s);u!==void 0&&(u[ee]=t)}}var rd=class{lContainer;$implicit;$index;constructor(t,n,r){this.lContainer=t,this.$implicit=n,this.$index=r}get $count(){return this.lContainer.length-te}};function wx(e){return e}function Bu(e,t){return t}var od=class{hasEmptyBlock;trackByFn;liveCollection;constructor(t,n,r){this.hasEmptyBlock=t,this.trackByFn=n,this.liveCollection=r}};function Vu(e,t,n,r,o,i,s,u,a,c,l,d,h){Ct("NgControlFlow");let f=_(),p=G(),m=a!==void 0,g=_(),y=u?s.bind(g[ve][ee]):s,v=new od(m,y);g[Q+e]=v,Ur(f,p,e+1,t,n,r,o,Re(p.consts,i),256),m&&Ur(f,p,e+2,a,c,l,d,Re(p.consts,h),512)}var id=class extends td{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(t,n,r){super(),this.lContainer=t,this.hostLView=n,this.templateTNode=r}get length(){return this.lContainer.length-te}at(t){return this.getLView(t)[ee].$implicit}attach(t,n){let r=n[jn];this.needsIndexUpdate||=t!==this.length,di(this.lContainer,n,t,$r(this.templateTNode,r)),xx(this.lContainer,t)}detach(t){return this.needsIndexUpdate||=t!==this.length-1,Ix(this.lContainer,t),Tx(this.lContainer,t)}create(t,n){let r=ru(this.lContainer,this.templateTNode.tView.ssrId);return li(this.hostLView,this.templateTNode,new rd(this.lContainer,n,t),{dehydratedView:r})}destroy(t){Iu(t[S],t)}updateValue(t,n){this.getLView(t)[ee].$implicit=n}reset(){this.needsIndexUpdate=!1}updateIndexes(){if(this.needsIndexUpdate)for(let t=0;t0){let i=r[Rt];D_(i,o),Kn.delete(r[Ft]),o.detachedLeaveAnimationFns=void 0}}function Ix(e,t){if(e.length<=te)return;let n=te+t,r=e[n],o=r?r[cn]:void 0;o&&o.leave&&o.leave.size>0&&(o.detachedLeaveAnimationFns=[])}function Tx(e,t){return ti(e,t)}function Sx(e,t){return vy(e,t)}function sd(e,t){return ks(e,t)}function Kr(e,t,n){let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();iy(s,r,e,t,r[Z],n)}return Kr}function ud(e,t,n,r,o){Mu(t,e,n,o?"class":"style",r)}function Xn(e,t,n,r){let o=_(),i=o[S],s=e+Q,u=i.firstCreatePass?Pd(s,o,2,t,kd,Os(),n,r):i.data[s];if(Dt(u)){let a=o[Ke].tracingService;if(a&&a.componentCreate){let c=i.data[u.directiveStart+u.componentOffset];return a.componentCreate(Ay(c),()=>(Jg(e,t,o,u,r),Xn))}}return Jg(e,t,o,u,r),Xn}function Jg(e,t,n,r,o){if(Rd(r,n,e,t,rb),Fr(r)){let i=n[S];Su(i,n,r),gd(i,r,n)}o!=null&&ci(n,r)}function Jr(){let e=G(),t=re(),n=Fd(t);return e.firstCreatePass&&Ld(e,n),rl(n)&&ol(),tl(),n.classesWithoutHost!=null&&eC(n)&&ud(e,n,_(),n.classesWithoutHost,!0),n.stylesWithoutHost!=null&&tC(n)&&ud(e,n,_(),n.stylesWithoutHost,!1),Jr}function nb(e,t,n,r){return Xn(e,t,n,r),Jr(),nb}function tf(e,t,n,r){let o=_(),i=o[S],s=e+Q,u=i.firstCreatePass?Iw(s,i,2,t,n,r):i.data[s];return Rd(u,o,e,t,rb),r!=null&&ci(o,u),tf}function nf(){let e=re(),t=Fd(e);return rl(t)&&ol(),tl(),nf}function $u(e,t,n,r){return tf(e,t,n,r),nf(),$u}var rb=(e,t,n,r,o)=>(Go(!0),Vm(t[Z],r,fg()));function rf(e,t,n){let r=_(),o=r[S],i=e+Q,s=o.firstCreatePass?Pd(i,r,8,"ng-container",kd,Os(),t,n):o.data[i];if(Rd(s,r,e,"ng-container",Mx),Fr(s)){let u=r[S];Su(u,r,s),gd(u,s,r)}return n!=null&&ci(r,s),rf}function of(){let e=G(),t=re(),n=Fd(t);return e.firstCreatePass&&Ld(e,n),of}function Xr(e,t,n){return rf(e,t,n),of(),Xr}var Mx=(e,t,n,r,o)=>(Go(!0),WC(t[Z],""));function Ax(){return _()}function Uu(e,t,n){let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();sy(s,r,e,t,r[Z],n)}return Uu}var mi="en-US";var Nx=mi;function ob(e){typeof e=="string"&&(Nx=e.toLowerCase().replace(/_/g,"-"))}function ib(e,t,n){let r=_(),o=G(),i=re();return ub(o,r,r[Z],i,e,t,n),ib}function sb(e,t,n){let r=_(),o=G(),i=re();return(i.type&3||n)&&Vd(i,o,r,n,r[Z],e,t,Yn(i,r,t)),sb}function ub(e,t,n,r,o,i,s){let u=!0,a=null;if((r.type&3||s)&&(a??=Yn(r,t,i),Vd(r,e,t,s,n,o,i,a)&&(u=!1)),u){let c=r.outputs?.[o],l=r.hostDirectiveOutputs?.[o];if(l&&l.length)for(let d=0;d>17&32767}function Vx(e){return(e&2)==2}function Hx(e,t){return e&131071|t<<17}function ad(e){return e|2}function zr(e){return(e&131068)>>2}function wl(e,t){return e&-131069|t<<2}function $x(e){return(e&1)===1}function cd(e){return e|1}function Ux(e,t,n,r,o,i){let s=i?t.classBindings:t.styleBindings,u=er(s),a=zr(s);e[r]=n;let c=!1,l;if(Array.isArray(n)){let d=n;l=d[1],(l===null||Sr(d,l)>0)&&(c=!0)}else l=n;if(o)if(a!==0){let h=er(e[u+1]);e[r+1]=qs(h,u),h!==0&&(e[h+1]=wl(e[h+1],r)),e[u+1]=Hx(e[u+1],r)}else e[r+1]=qs(u,0),u!==0&&(e[u+1]=wl(e[u+1],r)),u=r;else e[r+1]=qs(a,0),u===0?u=r:e[a+1]=wl(e[a+1],r),a=r;c&&(e[r+1]=ad(e[r+1])),Xg(e,l,r,!0),Xg(e,l,r,!1),zx(t,l,e,r,i),s=qs(u,a),i?t.classBindings=s:t.styleBindings=s}function zx(e,t,n,r,o){let i=o?e.residualClasses:e.residualStyles;i!=null&&typeof t=="string"&&Sr(i,t)>=0&&(n[r+1]=cd(n[r+1]))}function Xg(e,t,n,r){let o=e[n+1],i=t===null,s=r?er(o):zr(o),u=!1;for(;s!==0&&(u===!1||i);){let a=e[s],c=e[s+1];qx(a,t)&&(u=!0,e[s+1]=r?cd(c):ad(c)),s=r?er(c):zr(c)}u&&(e[n+1]=r?ad(o):cd(o))}function qx(e,t){return e===null||t==null||(Array.isArray(e)?e[1]:e)===t?!0:Array.isArray(e)&&typeof t=="string"?Sr(e,t)>=0:!1}var ae={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function fb(e){return e.substring(ae.key,ae.keyEnd)}function Gx(e){return e.substring(ae.value,ae.valueEnd)}function Wx(e){return gb(e),pb(e,qr(e,0,ae.textEnd))}function pb(e,t){let n=ae.textEnd;return n===t?-1:(t=ae.keyEnd=Yx(e,ae.key=t,n),qr(e,t,n))}function Zx(e){return gb(e),hb(e,qr(e,0,ae.textEnd))}function hb(e,t){let n=ae.textEnd,r=ae.key=qr(e,t,n);return n===r?-1:(r=ae.keyEnd=Qx(e,r,n),r=em(e,r,n,58),r=ae.value=qr(e,r,n),r=ae.valueEnd=Kx(e,r,n),em(e,r,n,59))}function gb(e){ae.key=0,ae.keyEnd=0,ae.value=0,ae.valueEnd=0,ae.textEnd=e.length}function qr(e,t,n){for(;t32;)t++;return t}function Qx(e,t,n){let r;for(;t=65&&(r&-33)<=90||r>=48&&r<=57);)t++;return t}function em(e,t,n,r){return t=qr(e,t,n),t32&&(u=s),i=o,o=r,r=a&-33}return u}function tm(e,t,n,r){let o=-1,i=n;for(;i=0;n=hb(t,n))Eb(e,fb(t),Gx(t))}function bi(e){bb(iI,Xx,e,!0)}function Xx(e,t){for(let n=Wx(t);n>=0;n=pb(t,n))jo(e,fb(t),!0)}function yb(e,t,n,r){let o=_(),i=G(),s=zo(2);if(i.firstUpdatePass&&Db(i,e,s,r),t!==le&&Te(o,s,t)){let u=i.data[ze()];Cb(i,u,o,o[Z],e,o[s+1]=uI(t,n),r,s)}}function bb(e,t,n,r){let o=G(),i=zo(2);o.firstUpdatePass&&Db(o,null,i,r);let s=_();if(n!==le&&Te(s,i,n)){let u=o.data[ze()];if(_b(u,r)&&!vb(o,i)){let a=r?u.classesWithoutHost:u.stylesWithoutHost;a!==null&&(n=Cs(a,n||"")),ud(o,u,s,n,r)}else sI(o,u,s,s[Z],s[i+1],s[i+1]=oI(e,t,n),r,i)}}function vb(e,t){return t>=e.expandoStartIndex}function Db(e,t,n,r){let o=e.data;if(o[n+1]===null){let i=o[ze()],s=vb(e,n);_b(i,r)&&t===null&&!s&&(t=!1),t=eI(o,i,t,r),Ux(o,i,t,n,s,r)}}function eI(e,t,n,r){let o=ig(e),i=r?t.residualClasses:t.residualStyles;if(o===null)(r?t.classBindings:t.styleBindings)===0&&(n=xl(null,e,t,n,r),n=ii(n,t.attrs,r),i=null);else{let s=t.directiveStylingLast;if(s===-1||e[s]!==o)if(n=xl(o,e,t,n,r),i===null){let a=tI(e,t,r);a!==void 0&&Array.isArray(a)&&(a=xl(null,e,t,a[1],r),a=ii(a,t.attrs,r),nI(e,t,r,a))}else i=rI(e,t,r)}return i!==void 0&&(r?t.residualClasses=i:t.residualStyles=i),n}function tI(e,t,n){let r=n?t.classBindings:t.styleBindings;if(zr(r)!==0)return e[er(r)]}function nI(e,t,n,r){let o=n?t.classBindings:t.styleBindings;e[er(o)]=r}function rI(e,t,n){let r,o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0;){let a=e[o],c=Array.isArray(a),l=c?a[1]:a,d=l===null,h=n[o+1];h===le&&(h=d?ye:void 0);let f=d?Ms(h,r):l===r?h:void 0;if(c&&!hu(f)&&(f=Ms(a,r)),hu(f)&&(u=f,s))return u;let p=e[o+1];o=s?er(p):zr(p)}if(t!==null){let a=i?t.residualClasses:t.residualStyles;a!=null&&(u=Ms(a,r))}return u}function hu(e){return e!==void 0}function uI(e,t){return e==null||e===""||(typeof t=="string"?e=e+t:typeof e=="object"&&(e=Oo(Oe(e)))),e}function _b(e,t){return(e.flags&(t?8:16))!==0}function aI(e,t=""){let n=_(),r=G(),o=e+Q,i=r.firstCreatePass?rr(r,o,1,t,null):r.data[o],s=cI(r,n,i,t);n[o]=s,Vs()&&Ad(r,n,s,i),qn(i,!1)}var cI=(e,t,n,r)=>(Go(!0),qC(t[Z],r));function lI(e,t,n,r=""){return Te(e,et(),n)?t+Ve(n)+r:le}function dI(e,t,n,r,o,i=""){let s=ll(),u=iu(e,s,n,o);return zo(2),u?t+Ve(n)+r+Ve(o)+i:le}function fI(e,t,n,r,o,i,s,u,a,c=""){let l=ll(),d=Sw(e,l,n,o,s,a);return zo(4),d?t+Ve(n)+r+Ve(o)+i+Ve(s)+u+Ve(a)+c:le}function wb(e){return sf("",e),wb}function sf(e,t,n){let r=_(),o=lI(r,e,t,n);return o!==le&&uf(r,ze(),o),sf}function xb(e,t,n,r,o){let i=_(),s=dI(i,e,t,n,r,o);return s!==le&&uf(i,ze(),s),xb}function Ib(e,t,n,r,o,i,s,u,a){let c=_(),l=fI(c,e,t,n,r,o,i,s,u,a);return l!==le&&uf(c,ze(),l),Ib}function uf(e,t,n){let r=Yc(t,e);GC(e[Z],r,n)}function Tb(e,t,n){Zd(t)&&(t=t());let r=_(),o=et();if(Te(r,o,t)){let i=G(),s=fn();iy(s,r,e,t,r[Z],n)}return Tb}function pI(e,t){let n=Zd(e);return n&&e.set(t),n}function Sb(e,t){let n=_(),r=G(),o=re();return ub(r,n,n[Z],o,e,t),Sb}var Mb={};function qu(e){Ct("NgLet");let t=G(),n=_(),r=e+Q,o=rr(t,r,128,null,null);return qn(o,!1),$o(t,n,r,Mb),qu}function Gu(e){let t=G(),n=_(),r=ze();return $o(t,n,r,e),e}function Wu(e){let t=al(),n=Ho(t,Q+e);if(n===Mb)throw new C(314,!1);return n}function hI(e){return Te(_(),et(),e)?Ve(e):le}function rm(e,t,n){let r=G();r.firstCreatePass&&Ab(t,r.data,r.blueprint,Xe(e),n)}function Ab(e,t,n,r,o){if(e=se(e),Array.isArray(e))for(let i=0;i>20;if(Fn(e)||!e.multi){let f=new Qn(c,o,oe,null),p=Tl(a,t,o?l:l+h,d);p===-1?(Ml(eu(u,s),i,a),Il(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(f),s.push(f)):(n[p]=f,s[p]=f)}else{let f=Tl(a,t,l+h,d),p=Tl(a,t,l,l+h),m=f>=0&&n[f],g=p>=0&&n[p];if(o&&!g||!o&&!m){Ml(eu(u,s),i,a);let y=yI(o?mI:gI,n.length,o,r,c,e);!o&&g&&(n[p].providerFactory=y),Il(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(y),s.push(y)}else{let y=Nb(n[o?p:f],c,!o&&r);Il(i,e,f>-1?f:p,y)}!o&&r&&g&&n[p].componentProviders++}}}function Il(e,t,n,r){let o=Fn(t),i=$0(t);if(o||i){let a=(i?se(t.useClass):t).prototype.ngOnDestroy;if(a){let c=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){let l=c.indexOf(n);l===-1?c.push(n,[r,a]):c[l+1].push(r,a)}else c.push(n,a)}}}function Nb(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function Tl(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>rm(r,o?o(e):e,!1),t&&(n.viewProvidersResolver=(r,o)=>rm(r,o?o(t):t,!0))}}function vI(e,t){let n=Pr()+e,r=_();return r[n]===le?Bd(r,n,t()):Tw(r,n)}function DI(e,t,n){return Rb(_(),Pr(),e,t,n)}function EI(e,t,n,r){return Fb(_(),Pr(),e,t,n,r)}function kb(e,t){let n=e[t];return n===le?void 0:n}function Rb(e,t,n,r,o,i){let s=t+n;return Te(e,s,o)?Bd(e,s+1,i?r.call(i,o):r(o)):kb(e,s+1)}function Fb(e,t,n,r,o,i,s){let u=t+n;return iu(e,u,o,i)?Bd(e,u+2,s?r.call(s,o,i):r(o,i)):kb(e,u+2)}function CI(e,t){let n=G(),r,o=e+Q;n.firstCreatePass?(r=_I(t,n.pipeRegistry),n.data[o]=r,r.onDestroy&&(n.destroyHooks??=[]).push(o,r.onDestroy)):r=n.data[o];let i=r.factory||(r.factory=on(r.type,!0)),s,u=_e(oe);try{let a=Xs(!1),c=i();return Xs(a),$o(n,_(),o,c),c}finally{_e(u)}}function _I(e,t){if(t)for(let n=t.length-1;n>=0;n--){let r=t[n];if(e===r.name)return r}}function wI(e,t,n){let r=e+Q,o=_(),i=Ho(o,r);return Ob(o,r)?Rb(o,Pr(),t,i.transform,n,i):i.transform(n)}function xI(e,t,n,r){let o=e+Q,i=_(),s=Ho(i,o);return Ob(i,o)?Fb(i,Pr(),t,s.transform,n,r,s):s.transform(n,r)}function Ob(e,t){return e[S].data[t].pure}function II(e,t){return Nu(e,t)}var gu=class{ngModuleFactory;componentFactories;constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}},TI=(()=>{class e{compileModuleSync(n){return new du(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){let r=this.compileModuleSync(n),o=Oc(n),i=qm(o.declarations).reduce((s,u)=>{let a=bt(u);return a&&s.push(new yn(a)),s},[]);return new gu(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var Pb=(()=>{class e{applicationErrorHandler=b(Pt);appRef=b(Qr);taskService=b(Gn);ngZone=b(be);zonelessEnabled=b(Zo);tracing=b(ot,{optional:!0});zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new X;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(Ro):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(b(yl,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{let n=this.taskService.add();if(!this.runningTick&&(this.cleanup(),!this.zonelessEnabled||this.appRef.includeAllTestViews)){this.taskService.remove(n);return}this.switchToMicrotaskScheduler(),this.taskService.remove(n)})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()}))}switchToMicrotaskScheduler(){this.ngZone.runOutsideAngular(()=>{let n=this.taskService.add();this.useMicrotaskScheduler=!0,queueMicrotask(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(n)})})}notify(n){if(!this.zonelessEnabled&&n===5)return;switch(n){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2;break}case 12:{this.appRef.dirtyFlags|=16;break}case 13:{this.appRef.dirtyFlags|=2;break}case 11:break;default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick())return;let r=this.useMicrotaskScheduler?mg:hl;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>r(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>r(()=>this.tick()))}shouldScheduleTick(){return!(this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(Ro+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let n=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(r){this.applicationErrorHandler(r)}finally{this.taskService.remove(n),this.cleanup()}}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let n=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(n)}}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function Lb(){return[{provide:gt,useExisting:Pb},{provide:be,useClass:Fo},{provide:Zo,useValue:!0}]}function SI(){return typeof $localize<"u"&&$localize.locale||mi}var Zu=new x("",{factory:()=>b(Zu,{optional:!0,skipSelf:!0})||SI()});var Yu=class{destroyed=!1;listeners=null;errorHandler=b(Be,{optional:!0});destroyRef=b(Fe);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(t){if(this.destroyed)throw new C(953,!1);return(this.listeners??=[]).push(t),{unsubscribe:()=>{let n=this.listeners?.indexOf(t);n!==void 0&&n!==-1&&this.listeners?.splice(n,1)}}}emit(t){if(this.destroyed){console.warn(mt(953,!1));return}if(this.listeners===null)return;let n=I(null);try{for(let r of this.listeners)try{r(t)}catch(o){this.errorHandler?.handleError(o)}}finally{I(n)}}};function De(e){return x0(e)}function Se(e,t){return Do(e,t?.equal)}var MI=e=>e;function af(e,t){if(typeof e=="function"){let n=mc(e,MI,t?.equal);return jb(n,t?.debugName)}else{let n=mc(e.source,e.computation,e.equal);return jb(n,e.debugName)}}function jb(e,t){let n=e[ne],r=e;return r.set=o=>_0(n,o),r.update=o=>w0(n,o),r.asReadonly=Wo.bind(e),r}function AI(e){let t=e.request,n=e.params??t??(()=>null);return new Qu(n,kI(e),e.defaultValue,e.equal?NI(e.equal):void 0,e.debugName,e.injector??b(fe))}var cf=class{value;isLoading;constructor(t,n){this.value=t,this.value.set=this.set.bind(this),this.value.update=this.update.bind(this),this.value.asReadonly=Wo,this.isLoading=Se(()=>this.status()==="loading"||this.status()==="reloading",void 0)}isError=Se(()=>this.status()==="error");update(t){this.set(t(De(this.value)))}isValueDefined=Se(()=>this.isError()?!1:this.value()!==void 0);_snapshot;get snapshot(){return this._snapshot??=Se(()=>{let t=this.status();return t==="error"?{status:"error",error:this.error()}:{status:t,value:this.value()}})}hasValue(){return this.isValueDefined()}asReadonly(){return this}},Qu=class extends cf{loaderFn;equal;debugName;pendingTasks;state;extRequest;effectRef;pendingController;resolvePendingTask=void 0;destroyed=!1;unregisterOnDestroy;status;error;constructor(t,n,r,o,i,s,u){super(Se(()=>{let a=this.state().stream?.();if(!a||this.state().status==="loading"&&this.error())return r;if(!lf(a))throw new Ku(this.error());return a.value},{equal:o}),i),this.loaderFn=n,this.equal=o,this.debugName=i,this.extRequest=af({source:t,computation:a=>({request:a,reload:0})}),this.state=af({source:this.extRequest,computation:(a,c)=>{if(c){let l=a.request===void 0?"idle":"loading";return{extRequest:a,status:l,previousStatus:Bb(c.value),stream:c.value.extRequest.request===a.request?c.value.stream:void 0}}else{let l=u?.(a.request);u=void 0;let d=a.request===void 0?"idle":l?"resolved":"loading";return{extRequest:a,status:d,previousStatus:"idle",stream:l}}}}),this.effectRef=Yo(this.loadEffect.bind(this),{injector:s,manualCleanup:!0}),this.pendingTasks=s.get(Wn),this.unregisterOnDestroy=s.get(Fe).onDestroy(()=>this.destroy()),this.status=Se(()=>Bb(this.state()),void 0),this.error=Se(()=>{let a=this.state().stream?.();return a&&!lf(a)?a.error:void 0},void 0)}set(t){if(this.destroyed)return;let n=De(this.error),r=De(this.state);if(!n){let o=De(this.value);if(r.status==="local"&&(this.equal?this.equal(o,t):o===t))return}this.state.set({extRequest:r.extRequest,status:"local",previousStatus:"local",stream:pn({value:t},void 0)}),this.abortInProgressLoad()}reload(){let{status:t}=De(this.state);return t==="idle"||t==="loading"?!1:(this.extRequest.update(({request:n,reload:r})=>({request:n,reload:r+1})),!0)}destroy(){this.destroyed=!0,this.unregisterOnDestroy(),this.effectRef.destroy(),this.abortInProgressLoad(),this.state.set({extRequest:{request:void 0,reload:0},status:"idle",previousStatus:"idle",stream:void 0})}loadEffect(){return lt(this,null,function*(){let t=this.extRequest(),{status:n,previousStatus:r}=De(this.state);if(t.request===void 0)return;if(n!=="loading")return;this.abortInProgressLoad();let o=this.resolvePendingTask=this.pendingTasks.add(),{signal:i}=this.pendingController=new AbortController;try{let s=yield De(()=>this.loaderFn({params:t.request,abortSignal:i,previous:{status:r}}));if(i.aborted||De(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"resolved",stream:s})}catch(s){if(i.aborted||De(this.extRequest)!==t)return;this.state.set({extRequest:t,status:"resolved",previousStatus:"error",stream:pn({error:ff(s)},void 0)})}finally{o?.(),o=void 0}})}abortInProgressLoad(){De(()=>this.pendingController?.abort()),this.pendingController=void 0,this.resolvePendingTask?.(),this.resolvePendingTask=void 0}};function NI(e){return(t,n)=>t===void 0||n===void 0?t===n:e(t,n)}function kI(e){return RI(e)?e.stream:t=>lt(null,null,function*(){try{return pn({value:yield e.loader(t)},void 0)}catch(n){return pn({error:ff(n)},void 0)}})}function RI(e){return!!e.stream}function Bb(e){switch(e.status){case"loading":return e.extRequest.reload===0?"loading":"reloading";case"resolved":return lf(e.stream())?"resolved":"error";default:return e.status}}function lf(e){return e.error===void 0}function ff(e){return FI(e)?e:new df(e)}function FI(e){return e instanceof Error||typeof e=="object"&&typeof e.name=="string"&&typeof e.message=="string"}var Ku=class extends Error{constructor(t){super(t.message,{cause:t})}},df=class extends Error{constructor(t){super(String(t),{cause:t})}};var Yb=Symbol("InputSignalNode#UNSET"),zI=P(M({},Eo),{transformFn:void 0,applyValueToInputSignal(e,t){In(e,t)}});function Qb(e,t){let n=Object.create(zI);n.value=e,n.transformFn=t?.transform;function r(){if(Kt(n),n.value===Yb){let o=null;throw new C(-950,o)}return n.value}return r[ne]=n,r}var Vb=class{attributeName;constructor(t){this.attributeName=t}__NG_ELEMENT_ID__=()=>fd(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},gB=(()=>{let e=new x("");return e.__NG_ELEMENT_ID__=t=>{let n=re();if(n===null)throw new C(-204,!1);if(n.type&2)return n.value;if(t&8)return null;throw new C(-204,!1)},e})();function mB(e){return new Yu}function Hb(e,t){return Qb(e,t)}function qI(e){return Qb(Yb,e)}var Ae=(Hb.required=qI,Hb);function $b(e,t){return zd(t)}function GI(e,t){return qd(t)}var yB=($b.required=GI,$b);function bB(e,t){return By(t)}function Ub(e,t){return zd(t)}function WI(e,t){return qd(t)}var vB=(Ub.required=WI,Ub);var hf=new x(""),ZI=new x("");function vi(e){return!e.moduleRef}function YI(e){let t=vi(e)?e.r3Injector:e.moduleRef.injector,n=t.get(be);return n.run(()=>{vi(e)?e.r3Injector.resolveInjectorInitializers():e.moduleRef.resolveInjectorInitializers();let r=t.get(Pt),o;if(n.runOutsideAngular(()=>{o=n.onError.subscribe({next:r})}),vi(e)){let i=()=>t.destroy(),s=e.platformInjector.get(hf);s.add(i),t.onDestroy(()=>{o.unsubscribe(),s.delete(i)})}else{let i=()=>e.moduleRef.destroy(),s=e.platformInjector.get(hf);s.add(i),e.moduleRef.onDestroy(()=>{Ko(e.allPlatformModules,e.moduleRef),o.unsubscribe(),s.delete(i)})}return KI(r,n,()=>{let i=t.get(Gn),s=i.add(),u=t.get(Kd);return u.runInitializers(),u.donePromise.then(()=>{let a=t.get(Zu,mi);if(ob(a||mi),!t.get(ZI,!0))return vi(e)?t.get(Qr):(e.allPlatformModules.push(e.moduleRef),e.moduleRef);if(vi(e)){let l=t.get(Qr);return e.rootComponent!==void 0&&l.bootstrap(e.rootComponent),l}else return QI?.(e.moduleRef,e.allPlatformModules),e.moduleRef}).finally(()=>{i.remove(s)})})})}var QI;function KI(e,t,n){try{let r=n();return gi(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e(r)),r}}var Ju=null;function JI(e=[],t){return fe.create({name:t,providers:[{provide:Bo,useValue:"platform"},{provide:hf,useValue:new Set([()=>Ju=null])},...e]})}function XI(e=[]){if(Ju)return Ju;let t=JI(e);return Ju=t,Xy(),e2(t),t}function e2(e){let t=e.get(bu,null);Nr(e,()=>{t?.forEach(n=>n())})}var t2=1e4;var DB=t2-1e3;var _f=(()=>{class e{static __NG_ELEMENT_ID__=n2}return e})();function n2(e){return r2(re(),_(),(e&16)===16)}function r2(e,t,n){if(Dt(e)&&!n){let r=ke(e.index,t);return new gn(r,r)}else if(e.type&175){let r=t[ve];return new gn(r,t)}return null}var gf=class{supports(t){return jd(t)}create(t){return new mf(t)}},o2=(e,t)=>t,mf=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(t){this._trackByFn=t||o2}forEachItem(t){let n;for(n=this._itHead;n!==null;n=n._next)t(n)}forEachOperation(t){let n=this._itHead,r=this._removalsHead,o=0,i=null;for(;n||r;){let s=!r||n&&n.currentIndex{s=this._trackByFn(o,u),n===null||!Object.is(n.trackById,s)?(n=this._mismatch(n,u,s,o),r=!0):(r&&(n=this._verifyReinsertion(n,u,s,o)),Object.is(n.item,u)||this._addIdentityChange(n,u)),n=n._next,o++}),this.length=o;return this._truncate(n),this.collection=t,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let t;for(t=this._previousItHead=this._itHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._additionsHead;t!==null;t=t._nextAdded)t.previousIndex=t.currentIndex;for(this._additionsHead=this._additionsTail=null,t=this._movesHead;t!==null;t=t._nextMoved)t.previousIndex=t.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(t,n,r,o){let i;return t===null?i=this._itTail:(i=t._prev,this._remove(t)),t=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._reinsertAfter(t,i,o)):(t=this._linkedRecords===null?null:this._linkedRecords.get(r,o),t!==null?(Object.is(t.item,n)||this._addIdentityChange(t,n),this._moveAfter(t,i,o)):t=this._addAfter(new yf(n,r),i,o)),t}_verifyReinsertion(t,n,r,o){let i=this._unlinkedRecords===null?null:this._unlinkedRecords.get(r,null);return i!==null?t=this._reinsertAfter(i,t._prev,o):t.currentIndex!=o&&(t.currentIndex=o,this._addToMoves(t,o)),t}_truncate(t){for(;t!==null;){let n=t._next;this._addToRemovals(this._unlink(t)),t=n}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(t,n,r){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(t);let o=t._prevRemoved,i=t._nextRemoved;return o===null?this._removalsHead=i:o._nextRemoved=i,i===null?this._removalsTail=o:i._prevRemoved=o,this._insertAfter(t,n,r),this._addToMoves(t,r),t}_moveAfter(t,n,r){return this._unlink(t),this._insertAfter(t,n,r),this._addToMoves(t,r),t}_addAfter(t,n,r){return this._insertAfter(t,n,r),this._additionsTail===null?this._additionsTail=this._additionsHead=t:this._additionsTail=this._additionsTail._nextAdded=t,t}_insertAfter(t,n,r){let o=n===null?this._itHead:n._next;return t._next=o,t._prev=n,o===null?this._itTail=t:o._prev=t,n===null?this._itHead=t:n._next=t,this._linkedRecords===null&&(this._linkedRecords=new Xu),this._linkedRecords.put(t),t.currentIndex=r,t}_remove(t){return this._addToRemovals(this._unlink(t))}_unlink(t){this._linkedRecords!==null&&this._linkedRecords.remove(t);let n=t._prev,r=t._next;return n===null?this._itHead=r:n._next=r,r===null?this._itTail=n:r._prev=n,t}_addToMoves(t,n){return t.previousIndex===n||(this._movesTail===null?this._movesTail=this._movesHead=t:this._movesTail=this._movesTail._nextMoved=t),t}_addToRemovals(t){return this._unlinkedRecords===null&&(this._unlinkedRecords=new Xu),this._unlinkedRecords.put(t),t.currentIndex=null,t._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=t,t._prevRemoved=null):(t._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=t),t}_addIdentityChange(t,n){return t.item=n,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=t:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=t,t}},yf=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(t,n){this.item=t,this.trackById=n}},bf=class{_head=null;_tail=null;add(t){this._head===null?(this._head=this._tail=t,t._nextDup=null,t._prevDup=null):(this._tail._nextDup=t,t._prevDup=this._tail,t._nextDup=null,this._tail=t)}get(t,n){let r;for(r=this._head;r!==null;r=r._nextDup)if((n===null||n<=r.currentIndex)&&Object.is(r.trackById,t))return r;return null}remove(t){let n=t._prevDup,r=t._nextDup;return n===null?this._head=r:n._nextDup=r,r===null?this._tail=n:r._prevDup=n,this._head===null}},Xu=class{map=new Map;put(t){let n=t.trackById,r=this.map.get(n);r||(r=new bf,this.map.set(n,r)),r.add(t)}get(t,n){let r=t,o=this.map.get(r);return o?o.get(t,n):null}remove(t){let n=t.trackById;return this.map.get(n).remove(t)&&this.map.delete(n),t}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function zb(e,t,n){let r=e.previousIndex;if(r===null)return r;let o=0;return n&&r{if(n&&n.key===o)this._maybeAddToChanges(n,r),this._appendAfter=n,n=n._next;else{let i=this._getOrCreateRecordForKey(o,r);n=this._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(let r=n;r!==null;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(t,n){if(t){let r=t._prev;return n._next=t,n._prev=r,t._prev=n,r&&(r._next=n),t===this._mapHead&&(this._mapHead=n),this._appendAfter=t,t}return this._appendAfter?(this._appendAfter._next=n,n._prev=this._appendAfter):this._mapHead=n,this._appendAfter=n,null}_getOrCreateRecordForKey(t,n){if(this._records.has(t)){let o=this._records.get(t);this._maybeAddToChanges(o,n);let i=o._prev,s=o._next;return i&&(i._next=s),s&&(s._prev=i),o._next=null,o._prev=null,o}let r=new Ef(t);return this._records.set(t,r),r.currentValue=n,this._addToAdditions(r),r}_reset(){if(this.isDirty){let t;for(this._previousMapHead=this._mapHead,t=this._previousMapHead;t!==null;t=t._next)t._nextPrevious=t._next;for(t=this._changesHead;t!==null;t=t._nextChanged)t.previousValue=t.currentValue;for(t=this._additionsHead;t!=null;t=t._nextAdded)t.previousValue=t.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(t,n){Object.is(n,t.currentValue)||(t.previousValue=t.currentValue,t.currentValue=n,this._addToChanges(t))}_addToAdditions(t){this._additionsHead===null?this._additionsHead=this._additionsTail=t:(this._additionsTail._nextAdded=t,this._additionsTail=t)}_addToChanges(t){this._changesHead===null?this._changesHead=this._changesTail=t:(this._changesTail._nextChanged=t,this._changesTail=t)}_forEach(t,n){t instanceof Map?t.forEach(n):Object.keys(t).forEach(r=>n(t[r],r))}},Ef=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(t){this.key=t}};function qb(){return new wf([new gf])}var wf=(()=>{class e{factories;static \u0275prov=T({token:e,providedIn:"root",factory:qb});constructor(n){this.factories=n}static create(n,r){if(r!=null){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||qb())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r!=null)return r;throw new C(901,!1)}}return e})();function Gb(){return new ea([new vf])}var ea=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:Gb});factories;constructor(n){this.factories=n}static create(n,r){if(r){let o=r.factories.slice();n=n.concat(o)}return new e(n)}static extend(n){return{provide:e,useFactory:()=>{let r=b(e,{optional:!0,skipSelf:!0});return e.create(n,r||Gb())}}}find(n){let r=this.factories.find(o=>o.supports(n));if(r)return r;throw new C(901,!1)}}return e})();var Kb=(()=>{class e{constructor(n){}static \u0275fac=function(r){return new(r||e)(A(Qr))};static \u0275mod=Ht({type:e});static \u0275inj=yt({})}return e})();function Jb(e){let{rootComponent:t,appProviders:n,platformProviders:r,platformRef:o}=e;Y(q.BootstrapApplicationStart);try{let i=o?.injector??XI(r),s=[Lb(),bg,...n||[]],u=new oi({providers:s,parent:i,debugName:"",runEnvironmentInitializers:!1});return YI({r3Injector:u.injector,platformInjector:i,rootComponent:t})}catch(i){return Promise.reject(i)}finally{Y(q.BootstrapApplicationEnd)}}function i2(e){return typeof e=="boolean"?e:e!=null&&e!=="false"}function s2(e,t=NaN){return!isNaN(parseFloat(e))&&!isNaN(Number(e))?Number(e):t}var pf=Symbol("NOT_SET"),Xb=new Set,u2=P(M({},Eo),{kind:"afterRenderEffectPhase",consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,value:pf,cleanup:null,consumerMarkedDirty(){if(this.sequence.impl.executing){if(this.sequence.lastPhase===null||this.sequence.lastPhase(Kt(c),c.value),c.signal[ne]=c,c.registerCleanupFn=l=>(c.cleanup??=new Set).add(l),this.nodes[u]=c,this.hooks[u]=l=>c.phaseFn(l)}}afterRun(){super.afterRun(),this.lastPhase=null}destroy(){if(this.onDestroyFns!==null)for(let t of this.onDestroyFns)t();super.destroy();for(let t of this.nodes)if(t)try{for(let n of t.cleanup??Xb)n()}finally{Xt(t)}}};function EB(e,t){let n=t?.injector??b(fe),r=n.get(gt),o=n.get(xu),i=n.get(ot,null,{optional:!0});o.impl??=n.get(Sd);let s=e;typeof s=="function"&&(s={mixedReadWrite:e});let u=n.get(Lr,null,{optional:!0}),a=new Cf(o.impl,[s.earlyRead,s.write,s.mixedReadWrite,s.read],u?.view,r,n,i?.snapshot(null));return o.impl.register(a),a}function CB(e,t){let n=bt(e),r=t.elementInjector||Ar();return new yn(n).create(r,t.projectableNodes,t.hostElement,t.environmentInjector,t.directives,t.bindings)}function _B(e){let t=bt(e);if(!t)return null;let n=new yn(t);return{get selector(){return n.selector},get type(){return n.componentType},get inputs(){return n.inputs},get outputs(){return n.outputs},get ngContentSelectors(){return n.ngContentSelectors},get isStandalone(){return t.standalone},get isSignal(){return t.signals}}}var ro={};pr(ro,{appendToAll:()=>l2,createThemeStyles:()=>d2,merge:()=>c2,structuralStyles:()=>f2,toProp:()=>Le});var a2=` &:not([disabled]) { cursor: pointer; opacity: var(--opacity, 0); transition: opacity var(--speed, 0.2s) cubic-bezier(0, 0, 0.3, 1); &:hover, &:focus { opacity: 1; } }`,e1=` ${new Array(21).fill(0).map((e,t)=>`.behavior-ho-${t*5} { --opacity: ${t/20}; ${a2} }`).join(` `)} .behavior-o-s { overflow: scroll; } .behavior-o-a { overflow: auto; } .behavior-o-h { overflow: hidden; } .behavior-sw-n { scrollbar-width: none; } `;var t1=` ${new Array(25).fill(0).map((e,t)=>` .border-bw-${t} { border-width: ${t}px; } .border-btw-${t} { border-top-width: ${t}px; } .border-bbw-${t} { border-bottom-width: ${t}px; } .border-blw-${t} { border-left-width: ${t}px; } .border-brw-${t} { border-right-width: ${t}px; } .border-ow-${t} { outline-width: ${t}px; } .border-br-${t} { border-radius: ${t*4}px; overflow: hidden;}`).join(` `)} .border-br-50pc { border-radius: 50%; } .border-bs-s { border-style: solid; } `;var xf=[0,5,10,15,20,25,30,35,40,50,60,70,80,90,95,98,99,100];function c2(...e){let t={};for(let n of e)for(let[r,o]of Object.entries(n)){let i=r.split("-").with(-1,"").join("-"),s=Object.keys(t).filter(u=>u.startsWith(i));for(let u of s)delete t[u];t[r]=o}return t}function l2(e,t,...n){let r=structuredClone(e);for(let o of n)for(let i of Object.keys(o)){let s=i.split("-").with(-1,"").join("-");for(let[u,a]of Object.entries(r)){if(t.includes(u))continue;let c=!1;for(let l=0;l` ${e.map(t=>{let n=If(t);return`.color-bc-${t} { border-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`}).join(` `)} ${e.map(t=>{let n=If(t),r=[`.color-bgc-${t} { background-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`,`.color-bbgc-${t}::backdrop { background-color: light-dark(var(${Le(t)}), var(${Le(n)})); }`];for(let o=.1;o<1;o+=.1)r.push(`.color-bbgc-${t}_${(o*100).toFixed(0)}::backdrop { background-color: light-dark(oklch(from var(${Le(t)}) l c h / calc(alpha * ${o.toFixed(1)})), oklch(from var(${Le(n)}) l c h / calc(alpha * ${o.toFixed(1)})) ); } `);return r.join(` `)}).join(` `)} ${e.map(t=>{let n=If(t);return`.color-c-${t} { color: light-dark(var(${Le(t)}), var(${Le(n)})); }`}).join(` `)} `,If=e=>{let t=e.match(/^([a-z]+)(\d+)$/);if(!t)return e;let[,n,r]=t,i=100-parseInt(r,10),s=xf.reduce((u,a)=>Math.abs(a-i)xf.map(t=>`${e}${t}`),n1=[to(no("p")),to(no("s")),to(no("t")),to(no("n")),to(no("nv")),to(no("e")),` .color-bgc-transparent { background-color: transparent; } :host { color-scheme: var(--color-scheme); } `];var r1=` .g-icon { font-family: "Material Symbols Outlined", "Google Symbols"; font-weight: normal; font-style: normal; font-display: optional; font-size: 20px; width: 1em; height: 1em; user-select: none; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; word-wrap: normal; direction: ltr; -webkit-font-feature-settings: "liga"; -webkit-font-smoothing: antialiased; overflow: hidden; font-variation-settings: "FILL" 0, "wght" 300, "GRAD" 0, "opsz" 48, "ROND" 100; &.filled { font-variation-settings: "FILL" 1, "wght" 300, "GRAD" 0, "opsz" 48, "ROND" 100; } &.filled-heavy { font-variation-settings: "FILL" 1, "wght" 700, "GRAD" 0, "opsz" 48, "ROND" 100; } } `;var o1=` :host { ${new Array(16).fill(0).map((e,t)=>`--g-${t+1}: ${(t+1)*4}px;`).join(` `)} } ${new Array(49).fill(0).map((e,t)=>{let n=t-24,r=n<0?`n${Math.abs(n)}`:n.toString();return` .layout-p-${r} { --padding: ${n*4}px; padding: var(--padding); } .layout-pt-${r} { padding-top: ${n*4}px; } .layout-pr-${r} { padding-right: ${n*4}px; } .layout-pb-${r} { padding-bottom: ${n*4}px; } .layout-pl-${r} { padding-left: ${n*4}px; } .layout-m-${r} { --margin: ${n*4}px; margin: var(--margin); } .layout-mt-${r} { margin-top: ${n*4}px; } .layout-mr-${r} { margin-right: ${n*4}px; } .layout-mb-${r} { margin-bottom: ${n*4}px; } .layout-ml-${r} { margin-left: ${n*4}px; } .layout-t-${r} { top: ${n*4}px; } .layout-r-${r} { right: ${n*4}px; } .layout-b-${r} { bottom: ${n*4}px; } .layout-l-${r} { left: ${n*4}px; }`}).join(` `)} ${new Array(25).fill(0).map((e,t)=>` .layout-g-${t} { gap: ${t*4}px; }`).join(` `)} ${new Array(8).fill(0).map((e,t)=>` .layout-grd-col${t+1} { grid-template-columns: ${"1fr ".repeat(t+1).trim()}; }`).join(` `)} .layout-pos-a { position: absolute; } .layout-pos-rel { position: relative; } .layout-dsp-none { display: none; } .layout-dsp-block { display: block; } .layout-dsp-grid { display: grid; } .layout-dsp-iflex { display: inline-flex; } .layout-dsp-flexvert { display: flex; flex-direction: column; } .layout-dsp-flexhor { display: flex; flex-direction: row; } .layout-fw-w { flex-wrap: wrap; } .layout-al-fs { align-items: start; } .layout-al-fe { align-items: end; } .layout-al-c { align-items: center; } .layout-as-n { align-self: normal; } .layout-js-c { justify-self: center; } .layout-sp-c { justify-content: center; } .layout-sp-ev { justify-content: space-evenly; } .layout-sp-bt { justify-content: space-between; } .layout-sp-s { justify-content: start; } .layout-sp-e { justify-content: end; } .layout-ji-e { justify-items: end; } .layout-r-none { resize: none; } .layout-fs-c { field-sizing: content; } .layout-fs-n { field-sizing: none; } .layout-flx-0 { flex: 0 0 auto; } .layout-flx-1 { flex: 1 0 auto; } .layout-c-s { contain: strict; } /** Widths **/ ${new Array(10).fill(0).map((e,t)=>{let n=(t+1)*10;return`.layout-w-${n} { width: ${n}%; max-width: ${n}%; }`}).join(` `)} ${new Array(16).fill(0).map((e,t)=>{let n=t*4;return`.layout-wp-${t} { width: ${n}px; }`}).join(` `)} /** Heights **/ ${new Array(10).fill(0).map((e,t)=>{let n=(t+1)*10;return`.layout-h-${n} { height: ${n}%; }`}).join(` `)} ${new Array(16).fill(0).map((e,t)=>{let n=t*4;return`.layout-hp-${t} { height: ${n}px; }`}).join(` `)} .layout-el-cv { & img, & video { width: 100%; height: 100%; object-fit: cover; margin: 0; } } .layout-ar-sq { aspect-ratio: 1 / 1; } .layout-ex-fb { margin: calc(var(--padding) * -1) 0 0 calc(var(--padding) * -1); width: calc(100% + var(--padding) * 2); height: calc(100% + var(--padding) * 2); } `;var i1=` ${new Array(21).fill(0).map((e,t)=>`.opacity-el-${t*5} { opacity: ${t/20}; }`).join(` `)} `;var s1=` :host { --default-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; --default-font-family-mono: "Courier New", Courier, monospace; } .typography-f-s { font-family: var(--font-family, var(--default-font-family)); font-optical-sizing: auto; font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0; } .typography-f-sf { font-family: var(--font-family-flex, var(--default-font-family)); font-optical-sizing: auto; } .typography-f-c { font-family: var(--font-family-mono, var(--default-font-family)); font-optical-sizing: auto; font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0; } .typography-v-r { font-variation-settings: "slnt" 0, "wdth" 100, "GRAD" 0, "ROND" 100; } .typography-ta-s { text-align: start; } .typography-ta-c { text-align: center; } .typography-fs-n { font-style: normal; } .typography-fs-i { font-style: italic; } .typography-sz-ls { font-size: 11px; line-height: 16px; } .typography-sz-lm { font-size: 12px; line-height: 16px; } .typography-sz-ll { font-size: 14px; line-height: 20px; } .typography-sz-bs { font-size: 12px; line-height: 16px; } .typography-sz-bm { font-size: 14px; line-height: 20px; } .typography-sz-bl { font-size: 16px; line-height: 24px; } .typography-sz-ts { font-size: 14px; line-height: 20px; } .typography-sz-tm { font-size: 16px; line-height: 24px; } .typography-sz-tl { font-size: 22px; line-height: 28px; } .typography-sz-hs { font-size: 24px; line-height: 32px; } .typography-sz-hm { font-size: 28px; line-height: 36px; } .typography-sz-hl { font-size: 32px; line-height: 40px; } .typography-sz-ds { font-size: 36px; line-height: 44px; } .typography-sz-dm { font-size: 45px; line-height: 52px; } .typography-sz-dl { font-size: 57px; line-height: 64px; } .typography-ws-p { white-space: pre-line; } .typography-ws-nw { white-space: nowrap; } .typography-td-none { text-decoration: none; } /** Weights **/ ${new Array(9).fill(0).map((e,t)=>{let n=(t+1)*100;return`.typography-w-${n} { font-weight: ${n}; }`}).join(` `)} `;var f2=[e1,t1,n1,r1,o1,i1,s1].flat(1/0).join(` `);var Wf={};pr(Wf,{isComponentArrayReference:()=>Sf,isObject:()=>$,isPath:()=>Tf,isResolvedAudioPlayer:()=>Mf,isResolvedButton:()=>Af,isResolvedCard:()=>Nf,isResolvedCheckbox:()=>kf,isResolvedColumn:()=>Rf,isResolvedDateTimeInput:()=>Ff,isResolvedDivider:()=>Of,isResolvedIcon:()=>Lf,isResolvedImage:()=>Pf,isResolvedList:()=>jf,isResolvedModal:()=>Bf,isResolvedMultipleChoice:()=>Vf,isResolvedRow:()=>Hf,isResolvedSlider:()=>$f,isResolvedTabs:()=>Uf,isResolvedText:()=>zf,isResolvedTextField:()=>qf,isResolvedVideo:()=>Gf,isValueMap:()=>h2});function h2(e){return $(e)&&"key"in e}function Tf(e,t){return e==="path"&&typeof t=="string"}function $(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Sf(e){return $(e)?"explicitList"in e||"template"in e:!1}function Ut(e){return $(e)&&("path"in e||"literal"in e&&typeof e.literal=="string"||"literalString"in e)}function g2(e){return $(e)&&("path"in e||"literal"in e&&typeof e.literal=="number"||"literalNumber"in e)}function m2(e){return $(e)&&("path"in e||"literal"in e&&typeof e.literal=="boolean"||"literalBoolean"in e)}function $t(e){return!(!$(e)||!("id"in e&&"type"in e&&"properties"in e))}function Mf(e){return $(e)&&"url"in e&&Ut(e.url)}function Af(e){return $(e)&&"child"in e&&$t(e.child)&&"action"in e}function Nf(e){return $(e)?"child"in e?$t(e.child):"children"in e?Array.isArray(e.children)&&e.children.every($t):!1:!1}function kf(e){return $(e)&&"label"in e&&Ut(e.label)&&"value"in e&&m2(e.value)}function Rf(e){return $(e)&&"children"in e&&Array.isArray(e.children)&&e.children.every($t)}function Ff(e){return $(e)&&"value"in e&&Ut(e.value)}function Of(e){return $(e)}function Pf(e){return $(e)&&"url"in e&&Ut(e.url)}function Lf(e){return $(e)&&"name"in e&&Ut(e.name)}function jf(e){return $(e)&&"children"in e&&Array.isArray(e.children)&&e.children.every($t)}function Bf(e){return $(e)&&"entryPointChild"in e&&$t(e.entryPointChild)&&"contentChild"in e&&$t(e.contentChild)}function Vf(e){return $(e)&&"selections"in e}function Hf(e){return $(e)&&"children"in e&&Array.isArray(e.children)&&e.children.every($t)}function $f(e){return $(e)&&"value"in e&&g2(e.value)}function y2(e){return $(e)&&"title"in e&&Ut(e.title)&&"child"in e&&$t(e.child)}function Uf(e){return $(e)&&"tabItems"in e&&Array.isArray(e.tabItems)&&e.tabItems.every(y2)}function zf(e){return $(e)&&"text"in e&&Ut(e.text)}function qf(e){return $(e)&&"label"in e&&Ut(e.label)}function Gf(e){return $(e)&&"url"in e&&Ut(e.url)}var ta=(()=>{class e{static{this.DEFAULT_SURFACE_ID="@default"}constructor(n={mapCtor:Map,arrayCtor:Array,setCtor:Set,objCtor:Object}){this.opts=n,this.mapCtor=Map,this.arrayCtor=Array,this.setCtor=Set,this.objCtor=Object,this.arrayCtor=n.arrayCtor,this.mapCtor=n.mapCtor,this.setCtor=n.setCtor,this.objCtor=n.objCtor,this.surfaces=new n.mapCtor}getSurfaces(){return this.surfaces}clearSurfaces(){this.surfaces.clear()}processMessages(n){for(let r of n)r.beginRendering&&this.handleBeginRendering(r.beginRendering,r.beginRendering.surfaceId),r.surfaceUpdate&&this.handleSurfaceUpdate(r.surfaceUpdate,r.surfaceUpdate.surfaceId),r.dataModelUpdate&&this.handleDataModelUpdate(r.dataModelUpdate,r.dataModelUpdate.surfaceId),r.deleteSurface&&this.handleDeleteSurface(r.deleteSurface)}getData(n,r,o=e.DEFAULT_SURFACE_ID){let i=this.getOrCreateSurface(o);if(!i)return null;let s;return r==="."||r===""?s=n.dataContextPath??"/":s=this.resolvePath(r,n.dataContextPath),this.getDataByPath(i.dataModel,s)}setData(n,r,o,i=e.DEFAULT_SURFACE_ID){if(!n){console.warn("No component node set");return}let s=this.getOrCreateSurface(i);if(!s)return;let u;r==="."||r===""?u=n.dataContextPath??"/":u=this.resolvePath(r,n.dataContextPath),this.setDataByPath(s.dataModel,u,o)}resolvePath(n,r){return n.startsWith("/")?n:r&&r!=="/"?r.endsWith("/")?`${r}${n}`:`${r}/${n}`:`/${n}`}parseIfJsonString(n){if(typeof n!="string")return n;let r=n.trim();if(r.startsWith("{")&&r.endsWith("}")||r.startsWith("[")&&r.endsWith("]"))try{return JSON.parse(n)}catch(o){return console.warn(`Failed to parse potential JSON string: "${n.substring(0,50)}..."`,o),n}return n}convertKeyValueArrayToMap(n){let r=new this.mapCtor;for(let o of n){if(!$(o)||!("key"in o))continue;let i=o.key,s=this.findValueKey(o);if(!s)continue;let u=o[s];s==="valueMap"&&Array.isArray(u)?u=this.convertKeyValueArrayToMap(u):typeof u=="string"&&(u=this.parseIfJsonString(u)),this.setDataByPath(r,i,u)}return r}setDataByPath(n,r,o){if(Array.isArray(o)&&(o.length===0||$(o[0])&&"key"in o[0]))if(o.length===1&&$(o[0])&&o[0].key==="."){let c=o[0],l=this.findValueKey(c);l?(o=c[l],l==="valueMap"&&Array.isArray(o)?o=this.convertKeyValueArrayToMap(o):typeof o=="string"&&(o=this.parseIfJsonString(o))):o=this.convertKeyValueArrayToMap(o)}else o=this.convertKeyValueArrayToMap(o);let i=this.normalizePath(r).split("/").filter(c=>c);if(i.length===0){if(o instanceof Map||$(o)){!(o instanceof Map)&&$(o)&&(o=new this.mapCtor(Object.entries(o))),n.clear();for(let[c,l]of o.entries())n.set(c,l)}else console.error("Cannot set root of DataModel to a non-Map value.");return}let s=n;for(let c=0;ci.length>0).join("/")}getDataByPath(n,r){let o=this.normalizePath(r).split("/").filter(s=>s),i=n;for(let s of o){if(i==null)return null;if(i instanceof Map)i=i.get(s);else if(Array.isArray(i)&&/^\d+$/.test(s))i=i[parseInt(s,10)];else if($(i))i=i[s];else return null}return i}getOrCreateSurface(n){let r=this.surfaces.get(n);return r||(r=new this.objCtor({rootComponentId:null,componentTree:null,dataModel:new this.mapCtor,components:new this.mapCtor,styles:new this.objCtor}),this.surfaces.set(n,r)),r}handleBeginRendering(n,r){let o=this.getOrCreateSurface(r);o.rootComponentId=n.root,o.styles=n.styles??{},this.rebuildComponentTree(o)}handleSurfaceUpdate(n,r){let o=this.getOrCreateSurface(r);for(let i of n.components)o.components.set(i.id,i);this.rebuildComponentTree(o)}handleDataModelUpdate(n,r){let o=this.getOrCreateSurface(r),i=n.path??"/";this.setDataByPath(o.dataModel,i,n.contents),this.rebuildComponentTree(o)}handleDeleteSurface(n){this.surfaces.delete(n.surfaceId)}rebuildComponentTree(n){if(!n.rootComponentId){n.componentTree=null;return}let r=new this.setCtor;n.componentTree=this.buildNodeRecursive(n.rootComponentId,n,r,"/","")}findValueKey(n){return Object.keys(n).find(r=>r.startsWith("value"))}buildNodeRecursive(n,r,o,i,s=""){let u=`${n}${s}`,{components:a}=r;if(!a.has(n))return null;if(o.has(u))throw new Error(`Circular dependency for component "${u}".`);o.add(u);let c=a.get(n),l=c.component??{},d=Object.keys(l)[0],h=l[d],f=new this.objCtor;if($(h))for(let[m,g]of Object.entries(h))f[m]=this.resolvePropertyValue(g,r,o,i,s);o.delete(u);let p={id:u,dataContextPath:i,weight:c.weight??"initial"};switch(d){case"Text":if(!zf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Text",properties:f}));case"Image":if(!Pf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Image",properties:f}));case"Icon":if(!Lf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Icon",properties:f}));case"Video":if(!Gf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Video",properties:f}));case"AudioPlayer":if(!Mf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"AudioPlayer",properties:f}));case"Row":if(!Hf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Row",properties:f}));case"Column":if(!Rf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Column",properties:f}));case"List":if(!jf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"List",properties:f}));case"Card":if(!Nf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Card",properties:f}));case"Tabs":if(!Uf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Tabs",properties:f}));case"Divider":if(!Of(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Divider",properties:f}));case"Modal":if(!Bf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Modal",properties:f}));case"Button":if(!Af(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Button",properties:f}));case"CheckBox":if(!kf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"CheckBox",properties:f}));case"TextField":if(!qf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"TextField",properties:f}));case"DateTimeInput":if(!Ff(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"DateTimeInput",properties:f}));case"MultipleChoice":if(!Vf(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"MultipleChoice",properties:f}));case"Slider":if(!$f(f))throw new Error(`Invalid data; expected ${d}`);return new this.objCtor(P(M({},p),{type:"Slider",properties:f}));default:return new this.objCtor(P(M({},p),{type:d,properties:f}))}}resolvePropertyValue(n,r,o,i,s=""){if(typeof n=="string"&&r.components.has(n))return this.buildNodeRecursive(n,r,o,i,s);if(Sf(n)){if(n.explicitList)return n.explicitList.map(u=>this.buildNodeRecursive(u,r,o,i,s));if(n.template){let u=this.resolvePath(n.template.dataBinding,i),a=this.getDataByPath(r.dataModel,u),c=n.template;if(Array.isArray(a))return a.map((d,h)=>{let m=`:${[...i.split("/").filter(y=>/^\d+$/.test(y)),h].join(":")}`,g=`${u}/${h}`;return this.buildNodeRecursive(c.componentId,r,o,g,m)});let l=this.mapCtor;return a instanceof l?Array.from(a.keys(),d=>{let h=`:${d}`,f=`${u}/${d}`;return this.buildNodeRecursive(c.componentId,r,o,f,h)}):new this.arrayCtor}}if(Array.isArray(n))return n.map(u=>this.resolvePropertyValue(u,r,o,i,s));if($(n)){let u=new this.objCtor;for(let[a,c]of Object.entries(n)){let l=c;if(Tf(a,c)&&i!=="/"){l=c.replace(/^\.?\/item/,"").replace(/^\.?\/text/,"").replace(/^\.?\/label/,"").replace(/^\.?\//,""),u[a]=l;continue}u[a]=this.resolvePropertyValue(l,r,o,i,s)}return u}return n}}return e})();var b2=Object.defineProperty,v2=(e,t,n)=>t in e?b2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Zf=(e,t,n)=>(v2(e,typeof t!="symbol"?t+"":t,n),n),D2=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},Yf=(e,t)=>{if(Object(t)!==t)throw TypeError('Cannot use the "in" operator on this value');return e.has(t)},na=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},u1=(e,t,n)=>(D2(e,t,"access private method"),n);function a1(e,t){return Object.is(e,t)}var ie=null,Di=!1,ra=1,oa=Symbol("SIGNAL");function oo(e){let t=ie;return ie=e,t}function E2(){return ie}function C2(){return Di}var ep={version:0,lastCleanEpoch:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function sa(e){if(Di)throw new Error("");if(ie===null)return;ie.consumerOnSignalRead(e);let t=ie.nextProducerIndex++;if(io(ie),te.nextProducerIndex;)e.producerNode.pop(),e.producerLastReadVersion.pop(),e.producerIndexOfThis.pop()}}function S2(e){io(e);for(let t=0;t0}function io(e){e.producerNode??(e.producerNode=[]),e.producerIndexOfThis??(e.producerIndexOfThis=[]),e.producerLastReadVersion??(e.producerLastReadVersion=[])}function tp(e){e.liveConsumerNode??(e.liveConsumerNode=[]),e.liveConsumerIndexOfThis??(e.liveConsumerIndexOfThis=[])}function f1(e){if(c1(e),sa(e),e.value===Xf)throw e.error;return e.value}function M2(e){let t=Object.create(A2);t.computation=e;let n=()=>f1(t);return n[oa]=t,n}var Qf=Symbol("UNSET"),Kf=Symbol("COMPUTING"),Xf=Symbol("ERRORED"),A2=P(M({},ep),{value:Qf,dirty:!0,error:null,equal:a1,producerMustRecompute(e){return e.value===Qf||e.value===Kf},producerRecomputeValue(e){if(e.value===Kf)throw new Error("Detected cycle in computations.");let t=e.value;e.value=Kf;let n=I2(e),r,o=!1;try{r=e.computation.call(e.wrapper),o=t!==Qf&&t!==Xf&&e.equal.call(e.wrapper,t,r)}catch(i){r=Xf,e.error=i}finally{T2(e,n)}if(o){e.value=t;return}e.value=r,e.version++}});function N2(){throw new Error}var k2=N2;function R2(){k2()}function F2(e){let t=Object.create(L2);t.value=e;let n=()=>(sa(t),t.value);return n[oa]=t,n}function O2(){return sa(this),this.value}function P2(e,t){w2()||R2(),e.equal.call(e.wrapper,e.value,t)||(e.value=t,j2(e))}var L2=P(M({},ep),{equal:a1,value:void 0});function j2(e){e.version++,_2(),l1(e)}var pe=Symbol("node"),ia;(e=>{var t,n,r,o,i,s;class u{constructor(l,d={}){na(this,n),Zf(this,t);let f=F2(l)[oa];if(this[pe]=f,f.wrapper=this,d){let p=d.equals;p&&(f.equal=p),f.watched=d[e.subtle.watched],f.unwatched=d[e.subtle.unwatched]}}get(){if(!(0,e.isState)(this))throw new TypeError("Wrong receiver type for Signal.State.prototype.get");return O2.call(this[pe])}set(l){if(!(0,e.isState)(this))throw new TypeError("Wrong receiver type for Signal.State.prototype.set");if(C2())throw new Error("Writes to signals not permitted during Watcher callback");let d=this[pe];P2(d,l)}}t=pe,n=new WeakSet,r=function(){},e.isState=c=>typeof c=="object"&&Yf(n,c),e.State=u;class a{constructor(l,d){na(this,i),Zf(this,o);let f=M2(l)[oa];if(f.consumerAllowSignalWrites=!0,this[pe]=f,f.wrapper=this,d){let p=d.equals;p&&(f.equal=p),f.watched=d[e.subtle.watched],f.unwatched=d[e.subtle.unwatched]}}get(){if(!(0,e.isComputed)(this))throw new TypeError("Wrong receiver type for Signal.Computed.prototype.get");return f1(this[pe])}}o=pe,i=new WeakSet,s=function(){},e.isComputed=c=>typeof c=="object"&&Yf(i,c),e.Computed=a,(c=>{var l,d,h,f,p;function m(E){let N,O=null;try{O=oo(null),N=E()}finally{oo(O)}return N}c.untrack=m;function g(E){var N;if(!(0,e.isComputed)(E)&&!(0,e.isWatcher)(E))throw new TypeError("Called introspectSources without a Computed or Watcher argument");return((N=E[pe].producerNode)==null?void 0:N.map(O=>O.wrapper))??[]}c.introspectSources=g;function y(E){var N;if(!(0,e.isComputed)(E)&&!(0,e.isState)(E))throw new TypeError("Called introspectSinks without a Signal argument");return((N=E[pe].liveConsumerNode)==null?void 0:N.map(O=>O.wrapper))??[]}c.introspectSinks=y;function v(E){if(!(0,e.isComputed)(E)&&!(0,e.isState)(E))throw new TypeError("Called hasSinks without a Signal argument");let N=E[pe].liveConsumerNode;return N?N.length>0:!1}c.hasSinks=v;function w(E){if(!(0,e.isComputed)(E)&&!(0,e.isWatcher)(E))throw new TypeError("Called hasSources without a Computed or Watcher argument");let N=E[pe].producerNode;return N?N.length>0:!1}c.hasSources=w;class D{constructor(N){na(this,d),na(this,f),Zf(this,l);let O=Object.create(ep);O.wrapper=this,O.consumerMarkedDirty=N,O.consumerIsAlwaysLive=!0,O.consumerAllowSignalWrites=!1,O.producerNode=[],this[pe]=O}watch(...N){if(!(0,e.isWatcher)(this))throw new TypeError("Called unwatch without Watcher receiver");u1(this,f,p).call(this,N);let O=this[pe];O.dirty=!1;let J=oo(O);for(let ct of N)sa(ct[pe]);oo(J)}unwatch(...N){if(!(0,e.isWatcher)(this))throw new TypeError("Called unwatch without Watcher receiver");u1(this,f,p).call(this,N);let O=this[pe];io(O);for(let J=O.producerNode.length-1;J>=0;J--)if(N.includes(O.producerNode[J].wrapper)){ua(O.producerNode[J],O.producerIndexOfThis[J]);let ct=O.producerNode.length-1;if(O.producerNode[J]=O.producerNode[ct],O.producerIndexOfThis[J]=O.producerIndexOfThis[ct],O.producerNode.length--,O.producerIndexOfThis.length--,O.nextProducerIndex--,JO.dirty).map(O=>O.wrapper)}}l=pe,d=new WeakSet,h=function(){},f=new WeakSet,p=function(E){for(let N of E)if(!(0,e.isComputed)(N)&&!(0,e.isState)(N))throw new TypeError("Called watch/unwatch without a Computed or State argument")},e.isWatcher=E=>Yf(d,E),c.Watcher=D;function F(){var E;return(E=E2())==null?void 0:E.wrapper}c.currentComputed=F,c.watched=Symbol("watched"),c.unwatched=Symbol("unwatched")})(e.subtle||(e.subtle={}))})(ia||(ia={}));var qe=(e=null)=>new ia.State(e,{equals:()=>!1});var B2=new Set([Symbol.iterator,"concat","entries","every","filter","find","findIndex","flat","flatMap","forEach","includes","indexOf","join","keys","lastIndexOf","map","reduce","reduceRight","slice","some","values"]),V2=new Set(["fill","push","unshift"]);function p1(e){if(typeof e=="symbol")return null;let t=Number(e);return isNaN(t)?null:t%1===0?t:null}var Ei=class e{static from(t,n,r){return n?new e(Array.from(t,n,r)):new e(Array.from(t))}static of(...t){return new e(t)}constructor(t=[]){let n=t.slice(),r=this,o=new Map,i=!1;return new Proxy(n,{get(s,u){let a=p1(u);if(a!==null)return r.#n(a),r.#e.get(),s[a];if(u==="length")return i?i=!1:r.#e.get(),s[u];if(V2.has(u)&&(i=!0),B2.has(u)){let c=o.get(u);return c===void 0&&(c=(...l)=>(r.#e.get(),s[u](...l)),o.set(u,c)),c}return s[u]},set(s,u,a){s[u]=a;let c=p1(u);return c!==null?(r.#r(c),r.#e.set(null)):u==="length"&&r.#e.set(null),!0},getPrototypeOf(){return e.prototype}})}#e=qe();#t=new Map;#n(t){let n=this.#t.get(t);n===void 0&&(n=qe(),this.#t.set(t,n)),n.get()}#r(t){let n=this.#t.get(t);n&&n.set(null)}};Object.setPrototypeOf(Ei.prototype,Array.prototype);var Ci=class{collection=qe();storages=new Map;vals;readStorageFor(t){let{storages:n}=this,r=n.get(t);r===void 0&&(r=qe(),n.set(t,r)),r.get()}dirtyStorageFor(t){let n=this.storages.get(t);n&&n.set(null)}constructor(t){this.vals=t?new Map(t):new Map}get(t){return this.readStorageFor(t),this.vals.get(t)}has(t){return this.readStorageFor(t),this.vals.has(t)}entries(){return this.collection.get(),this.vals.entries()}keys(){return this.collection.get(),this.vals.keys()}values(){return this.collection.get(),this.vals.values()}forEach(t){this.collection.get(),this.vals.forEach(t)}get size(){return this.collection.get(),this.vals.size}[Symbol.iterator](){return this.collection.get(),this.vals[Symbol.iterator]()}get[Symbol.toStringTag](){return this.vals[Symbol.toStringTag]}set(t,n){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.set(t,n),this}delete(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.delete(t)}clear(){this.storages.forEach(t=>t.set(null)),this.collection.set(null),this.vals.clear()}};Object.setPrototypeOf(Ci.prototype,Map.prototype);var np=class e{static fromEntries(t){return new e(Object.fromEntries(t))}#e=new Map;#t=qe();constructor(t={}){let n=Object.getPrototypeOf(t),r=Object.getOwnPropertyDescriptors(t),o=Object.create(n);for(let s in r)Object.defineProperty(o,s,r[s]);let i=this;return new Proxy(o,{get(s,u,a){return i.#n(u),Reflect.get(s,u,a)},has(s,u){return i.#n(u),u in s},ownKeys(s){return i.#t.get(),Reflect.ownKeys(s)},set(s,u,a,c){let l=Reflect.set(s,u,a,c);return i.#r(u),i.#o(),l},deleteProperty(s,u){return u in s&&(delete s[u],i.#r(u),i.#o()),!0},getPrototypeOf(){return e.prototype}})}#n(t){let n=this.#e.get(t);n===void 0&&(n=qe(),this.#e.set(t,n)),n.get()}#r(t){let n=this.#e.get(t);n&&n.set(null)}#o(){this.#t.set(null)}},h1=np;var _i=class{collection=qe();storages=new Map;vals;storageFor(t){let n=this.storages,r=n.get(t);return r===void 0&&(r=qe(),n.set(t,r)),r}dirtyStorageFor(t){let n=this.storages.get(t);n&&n.set(null)}constructor(t){this.vals=new Set(t)}has(t){return this.storageFor(t).get(),this.vals.has(t)}entries(){return this.collection.get(),this.vals.entries()}keys(){return this.collection.get(),this.vals.keys()}values(){return this.collection.get(),this.vals.values()}forEach(t){this.collection.get(),this.vals.forEach(t)}get size(){return this.collection.get(),this.vals.size}[Symbol.iterator](){return this.collection.get(),this.vals[Symbol.iterator]()}get[Symbol.toStringTag](){return this.vals[Symbol.toStringTag]}add(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.add(t),this}delete(t){return this.dirtyStorageFor(t),this.collection.set(null),this.vals.delete(t)}clear(){this.storages.forEach(t=>t.set(null)),this.collection.set(null),this.vals.clear()}};Object.setPrototypeOf(_i.prototype,Set.prototype);function g1(){return new ta({arrayCtor:Ei,mapCtor:Ci,objCtor:h1,setCtor:_i})}var m1={createSignalA2uiMessageProcessor:g1,A2uiMessageProcessor:ta,Guards:Wf};var y1=null;function _t(){return y1}function rp(e){y1??=e}var wi=class{},Dn=(()=>{class e{historyGo(n){throw new Error("")}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:()=>b(b1),providedIn:"platform"})}return e})(),H2=new x(""),b1=(()=>{class e extends Dn{_location;_history;_doc=b(K);constructor(){super(),this._location=window.location,this._history=window.history}getBaseHrefFromDOM(){return _t().getBaseHref(this._doc)}onPopState(n){let r=_t().getGlobalEventTarget(this._doc,"window");return r.addEventListener("popstate",n,!1),()=>r.removeEventListener("popstate",n)}onHashChange(n){let r=_t().getGlobalEventTarget(this._doc,"window");return r.addEventListener("hashchange",n,!1),()=>r.removeEventListener("hashchange",n)}get href(){return this._location.href}get protocol(){return this._location.protocol}get hostname(){return this._location.hostname}get port(){return this._location.port}get pathname(){return this._location.pathname}get search(){return this._location.search}get hash(){return this._location.hash}set pathname(n){this._location.pathname=n}pushState(n,r,o){this._history.pushState(n,r,o)}replaceState(n,r,o){this._history.replaceState(n,r,o)}forward(){this._history.forward()}back(){this._history.back()}historyGo(n=0){this._history.go(n)}getState(){return this._history.state}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:()=>new e,providedIn:"platform"})}return e})();function aa(e,t){return e?t?e.endsWith("/")?t.startsWith("/")?e+t.slice(1):e+t:t.startsWith("/")?e+t:`${e}/${t}`:e:t}function v1(e){let t=e.search(/#|\?|$/);return e[t-1]==="/"?e.slice(0,t-1)+e.slice(t):e}function ut(e){return e&&e[0]!=="?"?`?${e}`:e}var so=(()=>{class e{historyGo(n){throw new Error("")}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:()=>b(E1),providedIn:"root"})}return e})(),ca=new x(""),E1=(()=>{class e extends so{_platformLocation;_baseHref;_removeListenerFns=[];constructor(n,r){super(),this._platformLocation=n,this._baseHref=r??this._platformLocation.getBaseHrefFromDOM()??b(K).location?.origin??""}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}prepareExternalUrl(n){return aa(this._baseHref,n)}path(n=!1){let r=this._platformLocation.pathname+ut(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i));this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}static \u0275fac=function(r){return new(r||e)(A(Dn),A(ca,8))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var C1=(()=>{class e{_subject=new ce;_basePath;_locationStrategy;_urlChangeListeners=[];_urlChangeSubscription=null;constructor(n){this._locationStrategy=n;let r=this._locationStrategy.getBaseHref();this._basePath=z2(v1(D1(r))),this._locationStrategy.onPopState(o=>{this._subject.next({url:this.path(!0),pop:!0,state:o.state,type:o.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(n=!1){return this.normalize(this._locationStrategy.path(n))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(n,r=""){return this.path()==this.normalize(n+ut(r))}normalize(n){return e.stripTrailingSlash(U2(this._basePath,D1(n)))}prepareExternalUrl(n){return n&&n[0]!=="/"&&(n="/"+n),this._locationStrategy.prepareExternalUrl(n)}go(n,r="",o=null){this._locationStrategy.pushState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+ut(r)),o)}replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+ut(r)),o)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(n=0){this._locationStrategy.historyGo?.(n)}onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChangeSubscription??=this.subscribe(r=>{this._notifyUrlChangeListeners(r.url,r.state)}),()=>{let r=this._urlChangeListeners.indexOf(n);this._urlChangeListeners.splice(r,1),this._urlChangeListeners.length===0&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(n="",r){this._urlChangeListeners.forEach(o=>o(n,r))}subscribe(n,r,o){return this._subject.subscribe({next:n,error:r??void 0,complete:o??void 0})}static normalizeQueryParams=ut;static joinWithSlash=aa;static stripTrailingSlash=v1;static \u0275fac=function(r){return new(r||e)(A(so))};static \u0275prov=T({token:e,factory:()=>$2(),providedIn:"root"})}return e})();function $2(){return new C1(A(so))}function U2(e,t){if(!e||!t.startsWith(e))return t;let n=t.substring(e.length);return n===""||["/",";","?","#"].includes(n[0])?n:t}function D1(e){return e.replace(/\/index.html$/,"")}function z2(e){if(new RegExp("^(https?:)?//").test(e)){let[,n]=e.split(/\/\/[^\/]+/);return n}return e}var q2=(()=>{class e extends so{_platformLocation;_baseHref="";_removeListenerFns=[];constructor(n,r){super(),this._platformLocation=n,r!=null&&(this._baseHref=r)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}path(n=!1){let r=this._platformLocation.hash??"#";return r.length>0?r.substring(1):r}prepareExternalUrl(n){let r=aa(this._baseHref,n);return r.length>0?"#"+r:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i))||this._platformLocation.pathname;this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+ut(i))||this._platformLocation.pathname;this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){this._platformLocation.historyGo?.(n)}static \u0275fac=function(r){return new(r||e)(A(Dn),A(ca,8))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})();var op=/\s+/,_1=[],G2=(()=>{class e{_ngEl;_renderer;initialClasses=_1;rawClass;stateMap=new Map;constructor(n,r){this._ngEl=n,this._renderer=r}set klass(n){this.initialClasses=n!=null?n.trim().split(op):_1}set ngClass(n){this.rawClass=typeof n=="string"?n.trim().split(op):n}ngDoCheck(){for(let r of this.initialClasses)this._updateState(r,!0);let n=this.rawClass;if(Array.isArray(n)||n instanceof Set)for(let r of n)this._updateState(r,!0);else if(n!=null)for(let r of Object.keys(n))this._updateState(r,!!n[r]);this._applyStateDiff()}_updateState(n,r){let o=this.stateMap.get(n);o!==void 0?(o.enabled!==r&&(o.changed=!0,o.enabled=r),o.touched=!0):this.stateMap.set(n,{enabled:r,changed:!0,touched:!0})}_applyStateDiff(){for(let n of this.stateMap){let r=n[0],o=n[1];o.changed?(this._toggleClass(r,o.enabled),o.changed=!1):o.touched||(o.enabled&&this._toggleClass(r,!1),this.stateMap.delete(r)),o.touched=!1}}_toggleClass(n,r){n=n.trim(),n.length>0&&n.split(op).forEach(o=>{r?this._renderer.addClass(this._ngEl.nativeElement,o):this._renderer.removeClass(this._ngEl.nativeElement,o)})}static \u0275fac=function(r){return new(r||e)(oe(jt),oe(pi))};static \u0275dir=st({type:e,selectors:[["","ngClass",""]],inputs:{klass:[0,"class","klass"],ngClass:"ngClass"}})}return e})(),W2=(()=>{class e{_viewContainerRef;ngComponentOutlet=null;ngComponentOutletInputs;ngComponentOutletInjector;ngComponentOutletEnvironmentInjector;ngComponentOutletContent;ngComponentOutletNgModule;_componentRef;_moduleRef;_inputsUsed=new Map;get componentInstance(){return this._componentRef?.instance??null}constructor(n){this._viewContainerRef=n}_needToReCreateNgModuleInstance(n){return n.ngComponentOutletNgModule!==void 0}_needToReCreateComponentInstance(n){return n.ngComponentOutlet!==void 0||n.ngComponentOutletContent!==void 0||n.ngComponentOutletInjector!==void 0||n.ngComponentOutletEnvironmentInjector!==void 0||this._needToReCreateNgModuleInstance(n)}ngOnChanges(n){if(this._needToReCreateComponentInstance(n)&&(this._viewContainerRef.clear(),this._inputsUsed.clear(),this._componentRef=void 0,this.ngComponentOutlet)){let r=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;this._needToReCreateNgModuleInstance(n)&&(this._moduleRef?.destroy(),this.ngComponentOutletNgModule?this._moduleRef=Gd(this.ngComponentOutletNgModule,Z2(r)):this._moduleRef=void 0),this._componentRef=this._viewContainerRef.createComponent(this.ngComponentOutlet,{injector:r,ngModuleRef:this._moduleRef,projectableNodes:this.ngComponentOutletContent,environmentInjector:this.ngComponentOutletEnvironmentInjector})}}ngDoCheck(){if(this._componentRef){if(this.ngComponentOutletInputs)for(let n of Object.keys(this.ngComponentOutletInputs))this._inputsUsed.set(n,!0);this._applyInputStateDiff(this._componentRef)}}ngOnDestroy(){this._moduleRef?.destroy()}_applyInputStateDiff(n){for(let[r,o]of this._inputsUsed)o?(n.setInput(r,this.ngComponentOutletInputs[r]),this._inputsUsed.set(r,!1)):(n.setInput(r,void 0),this._inputsUsed.delete(r))}static \u0275fac=function(r){return new(r||e)(oe(it))};static \u0275dir=st({type:e,selectors:[["","ngComponentOutlet",""]],inputs:{ngComponentOutlet:"ngComponentOutlet",ngComponentOutletInputs:"ngComponentOutletInputs",ngComponentOutletInjector:"ngComponentOutletInjector",ngComponentOutletEnvironmentInjector:"ngComponentOutletEnvironmentInjector",ngComponentOutletContent:"ngComponentOutletContent",ngComponentOutletNgModule:"ngComponentOutletNgModule"},exportAs:["ngComponentOutlet"],features:[mu]})}return e})();function Z2(e){return e.get(bn).injector}var la=class{$implicit;ngForOf;index;count;constructor(t,n,r,o){this.$implicit=t,this.ngForOf=n,this.index=r,this.count=o}get first(){return this.index===0}get last(){return this.index===this.count-1}get even(){return this.index%2===0}get odd(){return!this.even}},T1=(()=>{class e{_viewContainer;_template;_differs;set ngForOf(n){this._ngForOf=n,this._ngForOfDirty=!0}set ngForTrackBy(n){this._trackByFn=n}get ngForTrackBy(){return this._trackByFn}_ngForOf=null;_ngForOfDirty=!0;_differ=null;_trackByFn;constructor(n,r,o){this._viewContainer=n,this._template=r,this._differs=o}set ngForTemplate(n){n&&(this._template=n)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let n=this._ngForOf;!this._differ&&n&&(this._differ=this._differs.find(n).create(this.ngForTrackBy))}if(this._differ){let n=this._differ.diff(this._ngForOf);n&&this._applyChanges(n)}}_applyChanges(n){let r=this._viewContainer;n.forEachOperation((o,i,s)=>{if(o.previousIndex==null)r.createEmbeddedView(this._template,new la(o.item,this._ngForOf,-1,-1),s===null?void 0:s);else if(s==null)r.remove(i===null?void 0:i);else if(i!==null){let u=r.get(i);r.move(u,s),w1(u,o)}});for(let o=0,i=r.length;o{let i=r.get(o.currentIndex);w1(i,o)})}static ngTemplateContextGuard(n,r){return!0}static \u0275fac=function(r){return new(r||e)(oe(it),oe(mn),oe(wf))};static \u0275dir=st({type:e,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}})}return e})();function w1(e,t){e.context.$implicit=t.item}var Y2=(()=>{class e{_viewContainer;_context=new da;_thenTemplateRef=null;_elseTemplateRef=null;_thenViewRef=null;_elseViewRef=null;constructor(n,r){this._viewContainer=n,this._thenTemplateRef=r}set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateView()}set ngIfThen(n){x1(n,!1),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){x1(n,!1),this._elseTemplateRef=n,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngIfUseIfTypeGuard;static ngTemplateGuard_ngIf;static ngTemplateContextGuard(n,r){return!0}static \u0275fac=function(r){return new(r||e)(oe(it),oe(mn))};static \u0275dir=st({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}})}return e})(),da=class{$implicit=null;ngIf=null};function x1(e,t){if(e&&!e.createEmbeddedView)throw new C(2020,!1)}var Q2=(()=>{class e{_ngEl;_differs;_renderer;_ngStyle=null;_differ=null;constructor(n,r,o){this._ngEl=n,this._differs=r,this._renderer=o}set ngStyle(n){this._ngStyle=n,!this._differ&&n&&(this._differ=this._differs.find(n).create())}ngDoCheck(){if(this._differ){let n=this._differ.diff(this._ngStyle);n&&this._applyChanges(n)}}_setStyle(n,r){let[o,i]=n.split("."),s=o.indexOf("-")===-1?void 0:rt.DashCase;r!=null?this._renderer.setStyle(this._ngEl.nativeElement,o,i?`${r}${i}`:r,s):this._renderer.removeStyle(this._ngEl.nativeElement,o,s)}_applyChanges(n){n.forEachRemovedItem(r=>this._setStyle(r.key,null)),n.forEachAddedItem(r=>this._setStyle(r.key,r.currentValue)),n.forEachChangedItem(r=>this._setStyle(r.key,r.currentValue))}static \u0275fac=function(r){return new(r||e)(oe(jt),oe(ea),oe(pi))};static \u0275dir=st({type:e,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"}})}return e})(),K2=(()=>{class e{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;injector=b(fe);constructor(n){this._viewContainerRef=n}ngOnChanges(n){if(this._shouldRecreateView(n)){let r=this._viewContainerRef;if(this._viewRef&&r.remove(r.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let o=this._createContextForwardProxy();this._viewRef=r.createEmbeddedView(this.ngTemplateOutlet,o,{injector:this._getInjector()})}}_getInjector(){return this.ngTemplateOutletInjector==="outlet"?this.injector:this.ngTemplateOutletInjector??void 0}_shouldRecreateView(n){return!!n.ngTemplateOutlet||!!n.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(n,r,o)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,r,o):!1,get:(n,r,o)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,r,o)}})}static \u0275fac=function(r){return new(r||e)(oe(it))};static \u0275dir=st({type:e,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet",ngTemplateOutletInjector:"ngTemplateOutletInjector"},features:[mu]})}return e})();function J2(e,t){return new C(2100,!1)}var ip=class{createSubscription(t,n,r){return De(()=>t.subscribe({next:n,error:r}))}dispose(t){De(()=>t.unsubscribe())}},sp=class{createSubscription(t,n,r){return t.then(o=>n?.(o),o=>r?.(o)),{unsubscribe:()=>{n=null,r=null}}}dispose(t){t.unsubscribe()}},X2=new sp,eT=new ip,tT=(()=>{class e{_ref;_latestValue=null;markForCheckOnValueUpdate=!0;_subscription=null;_obj=null;_strategy=null;applicationErrorHandler=b(Pt);constructor(n){this._ref=n}ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}transform(n){if(!this._obj){if(n)try{this.markForCheckOnValueUpdate=!1,this._subscribe(n)}finally{this.markForCheckOnValueUpdate=!0}return this._latestValue}return n!==this._obj?(this._dispose(),this.transform(n)):this._latestValue}_subscribe(n){this._obj=n,this._strategy=this._selectStrategy(n),this._subscription=this._strategy.createSubscription(n,r=>this._updateLatestValue(n,r),r=>this.applicationErrorHandler(r))}_selectStrategy(n){if(gi(n))return X2;if(Lu(n))return eT;throw J2(e,n)}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(n,r){n===this._obj&&(this._latestValue=r,this.markForCheckOnValueUpdate&&this._ref?.markForCheck())}static \u0275fac=function(r){return new(r||e)(oe(_f,16))};static \u0275pipe=Fu({name:"async",type:e,pure:!1})}return e})();function nT(e,t){return{key:e,value:t}}var rT=(()=>{class e{differs;constructor(n){this.differs=n}differ;keyValues=[];compareFn=I1;transform(n,r=I1){if(!n||!(n instanceof Map)&&typeof n!="object")return null;this.differ??=this.differs.find(n).create();let o=this.differ.diff(n),i=r!==this.compareFn;return o&&(this.keyValues=[],o.forEachItem(s=>{this.keyValues.push(nT(s.key,s.currentValue))})),(o||i)&&(r&&this.keyValues.sort(r),this.compareFn=r),this.keyValues}static \u0275fac=function(r){return new(r||e)(oe(ea,16))};static \u0275pipe=Fu({name:"keyvalue",type:e,pure:!1})}return e})();function I1(e,t){let n=e.key,r=t.key;if(n===r)return 0;if(n==null)return 1;if(r==null)return-1;if(typeof n=="string"&&typeof r=="string")return n{class e{static \u0275fac=function(r){return new(r||e)};static \u0275mod=Ht({type:e});static \u0275inj=yt({})}return e})();function xi(e,t){t=encodeURIComponent(t);for(let n of e.split(";")){let r=n.indexOf("="),[o,i]=r==-1?[n,""]:[n.slice(0,r),n.slice(r+1)];if(o.trim()===t)return decodeURIComponent(i)}return null}var or=class{};var cp="browser";function S1(e){return e===cp}var QV=(()=>{class e{static \u0275prov=T({token:e,providedIn:"root",factory:()=>new ap(b(K),window)})}return e})(),ap=class{document;window;offset=()=>[0,0];constructor(t,n){this.document=t,this.window=n}setOffset(t){Array.isArray(t)?this.offset=()=>t:this.offset=t}getScrollPosition(){return[this.window.scrollX,this.window.scrollY]}scrollToPosition(t,n){this.window.scrollTo(P(M({},n),{left:t[0],top:t[1]}))}scrollToAnchor(t,n){let r=oT(this.document,t);r&&(this.scrollToElement(r,n),r.focus())}setHistoryScrollRestoration(t){try{this.window.history.scrollRestoration=t}catch(n){console.warn(mt(2400,!1))}}scrollToElement(t,n){let r=t.getBoundingClientRect(),o=r.left+this.window.pageXOffset,i=r.top+this.window.pageYOffset,s=this.offset();this.window.scrollTo(P(M({},n),{left:o-s[0],top:i-s[1]}))}};function oT(e,t){let n=e.getElementById(t)||e.getElementsByName(t)[0];if(n)return n;if(typeof e.createTreeWalker=="function"&&e.body&&typeof e.body.attachShadow=="function"){let r=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT),o=r.currentNode;for(;o;){let i=o.shadowRoot;if(i){let s=i.getElementById(t)||i.querySelector(`[name="${t}"]`);if(s)return s}o=r.nextNode()}}return null}var Ii=class{_doc;constructor(t){this._doc=t}manager},fa=(()=>{class e extends Ii{constructor(n){super(n)}supports(n){return!0}addEventListener(n,r,o,i){return n.addEventListener(r,o,i),()=>this.removeEventListener(n,r,o,i)}removeEventListener(n,r,o,i){return n.removeEventListener(r,o,i)}static \u0275fac=function(r){return new(r||e)(A(K))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),ga=new x(""),pp=(()=>{class e{_zone;_plugins;_eventNameToPlugin=new Map;constructor(n,r){this._zone=r,n.forEach(s=>{s.manager=this});let o=n.filter(s=>!(s instanceof fa));this._plugins=o.slice().reverse();let i=n.find(s=>s instanceof fa);i&&this._plugins.push(i)}addEventListener(n,r,o,i){return this._findPluginFor(r).addEventListener(n,r,o,i)}getZone(){return this._zone}_findPluginFor(n){let r=this._eventNameToPlugin.get(n);if(r)return r;if(r=this._plugins.find(i=>i.supports(n)),!r)throw new C(5101,!1);return this._eventNameToPlugin.set(n,r),r}static \u0275fac=function(r){return new(r||e)(A(ga),A(be))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),lp="ng-app-id";function M1(e){for(let t of e)t.remove()}function A1(e,t){let n=t.createElement("style");return n.textContent=e,n}function iT(e,t,n,r){let o=e.head?.querySelectorAll(`style[${lp}="${t}"],link[${lp}="${t}"]`);if(o)for(let i of o)i.removeAttribute(lp),i instanceof HTMLLinkElement?r.set(i.href.slice(i.href.lastIndexOf("/")+1),{usage:0,elements:[i]}):i.textContent&&n.set(i.textContent,{usage:0,elements:[i]})}function fp(e,t){let n=t.createElement("link");return n.setAttribute("rel","stylesheet"),n.setAttribute("href",e),n}var hp=(()=>{class e{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;constructor(n,r,o,i={}){this.doc=n,this.appId=r,this.nonce=o,iT(n,r,this.inline,this.external),this.hosts.add(n.head)}addStyles(n,r){for(let o of n)this.addUsage(o,this.inline,A1);r?.forEach(o=>this.addUsage(o,this.external,fp))}removeStyles(n,r){for(let o of n)this.removeUsage(o,this.inline);r?.forEach(o=>this.removeUsage(o,this.external))}addUsage(n,r,o){let i=r.get(n);i?i.usage++:r.set(n,{usage:1,elements:[...this.hosts].map(s=>this.addElement(s,o(n,this.doc)))})}removeUsage(n,r){let o=r.get(n);o&&(o.usage--,o.usage<=0&&(M1(o.elements),r.delete(n)))}ngOnDestroy(){for(let[,{elements:n}]of[...this.inline,...this.external])M1(n);this.hosts.clear()}addHost(n){this.hosts.add(n);for(let[r,{elements:o}]of this.inline)o.push(this.addElement(n,A1(r,this.doc)));for(let[r,{elements:o}]of this.external)o.push(this.addElement(n,fp(r,this.doc)))}removeHost(n){this.hosts.delete(n)}addElement(n,r){return this.nonce&&r.setAttribute("nonce",this.nonce),n.appendChild(r)}static \u0275fac=function(r){return new(r||e)(A(K),A(yu),A(vu,8),A(nr))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),dp={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/Math/MathML"},gp=/%COMP%/g;var k1="%COMP%",sT=`_nghost-${k1}`,uT=`_ngcontent-${k1}`,aT=!0,cT=new x("",{factory:()=>aT});function lT(e){return uT.replace(gp,e)}function dT(e){return sT.replace(gp,e)}function R1(e,t){return t.map(n=>n.replace(gp,e))}var mp=(()=>{class e{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;constructor(n,r,o,i,s,u,a=null,c=null){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.removeStylesOnCompDestroy=i,this.doc=s,this.ngZone=u,this.nonce=a,this.tracingService=c,this.defaultRenderer=new Ti(n,s,u,this.tracingService)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;let o=this.getOrCreateRenderer(n,r);return o instanceof ha?o.applyToHost(n):o instanceof Si&&o.applyStyles(),o}getOrCreateRenderer(n,r){let o=this.rendererByCompId,i=o.get(r.id);if(!i){let s=this.doc,u=this.ngZone,a=this.eventManager,c=this.sharedStylesHost,l=this.removeStylesOnCompDestroy,d=this.tracingService;switch(r.encapsulation){case nt.Emulated:i=new ha(a,c,r,this.appId,l,s,u,d);break;case nt.ShadowDom:return new pa(a,n,r,s,u,this.nonce,d,c);case nt.ExperimentalIsolatedShadowDom:return new pa(a,n,r,s,u,this.nonce,d);default:i=new Si(a,c,r,l,s,u,d);break}o.set(r.id,i)}return i}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(n){this.rendererByCompId.delete(n)}static \u0275fac=function(r){return new(r||e)(A(pp),A(hp),A(yu),A(cT),A(K),A(be),A(vu),A(ot,8))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),Ti=class{eventManager;doc;ngZone;tracingService;data=Object.create(null);throwOnSyntheticProps=!0;constructor(t,n,r,o){this.eventManager=t,this.doc=n,this.ngZone=r,this.tracingService=o}destroy(){}destroyNode=null;createElement(t,n){return n?this.doc.createElementNS(dp[n]||n,t):this.doc.createElement(t)}createComment(t){return this.doc.createComment(t)}createText(t){return this.doc.createTextNode(t)}appendChild(t,n){(N1(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(N1(t)?t.content:t).insertBefore(n,r)}removeChild(t,n){n.remove()}selectRootElement(t,n){let r=typeof t=="string"?this.doc.querySelector(t):t;if(!r)throw new C(-5104,!1);return n||(r.textContent=""),r}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,n,r,o){if(o){n=o+":"+n;let i=dp[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){let o=dp[r];o?t.removeAttributeNS(o,n):t.removeAttribute(`${r}:${n}`)}else t.removeAttribute(n)}addClass(t,n){t.classList.add(n)}removeClass(t,n){t.classList.remove(n)}setStyle(t,n,r,o){o&(rt.DashCase|rt.Important)?t.style.setProperty(n,r,o&rt.Important?"important":""):t.style[n]=r}removeStyle(t,n,r){r&rt.DashCase?t.style.removeProperty(n):t.style[n]=""}setProperty(t,n,r){t!=null&&(t[n]=r)}setValue(t,n){t.nodeValue=n}listen(t,n,r,o){if(typeof t=="string"&&(t=_t().getGlobalEventTarget(this.doc,t),!t))throw new C(5102,!1);let i=this.decoratePreventDefault(r);return this.tracingService?.wrapEventListener&&(i=this.tracingService.wrapEventListener(t,n,i)),this.eventManager.addEventListener(t,n,i,o)}decoratePreventDefault(t){return n=>{if(n==="__ngUnwrap__")return t;t(n)===!1&&n.preventDefault()}}};function N1(e){return e.tagName==="TEMPLATE"&&e.content!==void 0}var pa=class extends Ti{hostEl;sharedStylesHost;shadowRoot;constructor(t,n,r,o,i,s,u,a){super(t,o,i,u),this.hostEl=n,this.sharedStylesHost=a,this.shadowRoot=n.attachShadow({mode:"open"}),this.sharedStylesHost&&this.sharedStylesHost.addHost(this.shadowRoot);let c=r.styles;c=R1(r.id,c);for(let d of c){let h=document.createElement("style");s&&h.setAttribute("nonce",s),h.textContent=d,this.shadowRoot.appendChild(h)}let l=r.getExternalStyles?.();if(l)for(let d of l){let h=fp(d,o);s&&h.setAttribute("nonce",s),this.shadowRoot.appendChild(h)}}nodeOrShadowRoot(t){return t===this.hostEl?this.shadowRoot:t}appendChild(t,n){return super.appendChild(this.nodeOrShadowRoot(t),n)}insertBefore(t,n,r){return super.insertBefore(this.nodeOrShadowRoot(t),n,r)}removeChild(t,n){return super.removeChild(null,n)}parentNode(t){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(t)))}destroy(){this.sharedStylesHost&&this.sharedStylesHost.removeHost(this.shadowRoot)}},Si=class extends Ti{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(t,n,r,o,i,s,u,a){super(t,i,s,u),this.sharedStylesHost=n,this.removeStylesOnCompDestroy=o;let c=r.styles;this.styles=a?R1(a,c):c,this.styleUrls=r.getExternalStyles?.(a)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&Kn.size===0&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},ha=class extends Si{contentAttr;hostAttr;constructor(t,n,r,o,i,s,u,a){let c=o+"-"+r.id;super(t,n,r,i,s,u,a,c),this.contentAttr=lT(c),this.hostAttr=dT(c)}applyToHost(t){this.applyStyles(),this.setAttribute(t,this.hostAttr,"")}createElement(t,n){let r=super.createElement(t,n);return super.setAttribute(r,this.contentAttr,""),r}};var ma=class e extends wi{supportsDOMEvents=!0;static makeCurrent(){rp(new e)}onAndCancel(t,n,r,o){return t.addEventListener(n,r,o),()=>{t.removeEventListener(n,r,o)}}dispatchEvent(t,n){t.dispatchEvent(n)}remove(t){t.remove()}createElement(t,n){return n=n||this.getDefaultDocument(),n.createElement(t)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}isShadowRoot(t){return t instanceof DocumentFragment}getGlobalEventTarget(t,n){return n==="window"?window:n==="document"?t:n==="body"?t.body:null}getBaseHref(t){let n=fT();return n==null?null:pT(n)}resetBaseElement(){Mi=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return xi(document.cookie,t)}},Mi=null;function fT(){return Mi=Mi||document.head.querySelector("base"),Mi?Mi.getAttribute("href"):null}function pT(e){return new URL(e,document.baseURI).pathname}var ya=class{addToWindow(t){xe.getAngularTestability=(r,o=!0)=>{let i=t.findTestabilityInTree(r,o);if(i==null)throw new C(5103,!1);return i},xe.getAllAngularTestabilities=()=>t.getAllTestabilities(),xe.getAllAngularRootElements=()=>t.getAllRootElements();let n=r=>{let o=xe.getAllAngularTestabilities(),i=o.length,s=function(){i--,i==0&&r()};o.forEach(u=>{u.whenStable(s)})};xe.frameworkStabilizers||(xe.frameworkStabilizers=[]),xe.frameworkStabilizers.push(n)}findTestabilityInTree(t,n,r){if(n==null)return null;let o=t.getTestability(n);return o??(r?_t().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null)}},hT=(()=>{class e{build(){return new XMLHttpRequest}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})(),F1=["alt","control","meta","shift"],gT={"\b":"Backspace"," ":"Tab","\x7F":"Delete","\x1B":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},mT={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey},O1=(()=>{class e extends Ii{constructor(n){super(n)}supports(n){return e.parseEventName(n)!=null}addEventListener(n,r,o,i){let s=e.parseEventName(r),u=e.eventCallback(s.fullKey,o,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>_t().onAndCancel(n,s.domEventName,u,i))}static parseEventName(n){let r=n.toLowerCase().split("."),o=r.shift();if(r.length===0||!(o==="keydown"||o==="keyup"))return null;let i=e._normalizeKey(r.pop()),s="",u=r.indexOf("code");if(u>-1&&(r.splice(u,1),s="code."),F1.forEach(c=>{let l=r.indexOf(c);l>-1&&(r.splice(l,1),s+=c+".")}),s+=i,r.length!=0||i.length===0)return null;let a={};return a.domEventName=o,a.fullKey=s,a}static matchEventFullKeyCode(n,r){let o=gT[n.key]||n.key,i="";return r.indexOf("code.")>-1&&(o=n.code,i="code."),o==null||!o?!1:(o=o.toLowerCase(),o===" "?o="space":o==="."&&(o="dot"),F1.forEach(s=>{if(s!==o){let u=mT[s];u(n)&&(i+=s+".")}}),i+=o,i===r)}static eventCallback(n,r,o){return i=>{e.matchEventFullKeyCode(i,n)&&o.runGuarded(()=>r(i))}}static _normalizeKey(n){return n==="esc"?"escape":n}static \u0275fac=function(r){return new(r||e)(A(K))};static \u0275prov=T({token:e,factory:e.\u0275fac})}return e})();function yT(e,t,n){return lt(this,null,function*(){let r=M({rootComponent:e},bT(t,n));return Jb(r)})}function bT(e,t){return{platformRef:t?.platformRef,appProviders:[...P1,...e?.providers??[]],platformProviders:CT}}function vT(){ma.makeCurrent()}function DT(){return new Be}function ET(){return hd(document),document}var CT=[{provide:nr,useValue:cp},{provide:bu,useValue:vT,multi:!0},{provide:K,useFactory:ET}];var _T=[{provide:Pu,useClass:ya},{provide:Ou,useClass:hi},{provide:hi,useClass:hi}],P1=[{provide:Bo,useValue:"root"},{provide:Be,useFactory:DT},{provide:ga,useClass:fa,multi:!0},{provide:ga,useClass:O1,multi:!0},mp,hp,pp,{provide:Jn,useExisting:mp},{provide:or,useClass:hT},[]],wT=(()=>{class e{constructor(){}static \u0275fac=function(r){return new(r||e)};static \u0275mod=Ht({type:e});static \u0275inj=yt({providers:[...P1,..._T],imports:[up,Kb]})}return e})();var En=class e{headers;normalizedNames=new Map;lazyInit;lazyUpdate=null;constructor(t){t?typeof t=="string"?this.lazyInit=()=>{this.headers=new Map,t.split(` `).forEach(n=>{let r=n.indexOf(":");if(r>0){let o=n.slice(0,r),i=n.slice(r+1).trim();this.addHeaderEntry(o,i)}})}:typeof Headers<"u"&&t instanceof Headers?(this.headers=new Map,t.forEach((n,r)=>{this.addHeaderEntry(r,n)})):this.lazyInit=()=>{this.headers=new Map,Object.entries(t).forEach(([n,r])=>{this.setHeaderEntries(n,r)})}:this.headers=new Map}has(t){return this.init(),this.headers.has(t.toLowerCase())}get(t){this.init();let n=this.headers.get(t.toLowerCase());return n&&n.length>0?n[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(t){return this.init(),this.headers.get(t.toLowerCase())||null}append(t,n){return this.clone({name:t,value:n,op:"a"})}set(t,n){return this.clone({name:t,value:n,op:"s"})}delete(t,n){return this.clone({name:t,value:n,op:"d"})}maybeSetNormalizedName(t,n){this.normalizedNames.has(n)||this.normalizedNames.set(n,t)}init(){this.lazyInit&&(this.lazyInit instanceof e?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(t=>this.applyUpdate(t)),this.lazyUpdate=null))}copyFrom(t){t.init(),Array.from(t.headers.keys()).forEach(n=>{this.headers.set(n,t.headers.get(n)),this.normalizedNames.set(n,t.normalizedNames.get(n))})}clone(t){let n=new e;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof e?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}applyUpdate(t){let n=t.name.toLowerCase();switch(t.op){case"a":case"s":let r=t.value;if(typeof r=="string"&&(r=[r]),r.length===0)return;this.maybeSetNormalizedName(t.name,n);let o=(t.op==="a"?this.headers.get(n):void 0)||[];o.push(...r),this.headers.set(n,o);break;case"d":let i=t.value;if(!i)this.headers.delete(n),this.normalizedNames.delete(n);else{let s=this.headers.get(n);if(!s)return;s=s.filter(u=>i.indexOf(u)===-1),s.length===0?(this.headers.delete(n),this.normalizedNames.delete(n)):this.headers.set(n,s)}break}}addHeaderEntry(t,n){let r=t.toLowerCase();this.maybeSetNormalizedName(t,r),this.headers.has(r)?this.headers.get(r).push(n):this.headers.set(r,[n])}setHeaderEntries(t,n){let r=(Array.isArray(n)?n:[n]).map(i=>i.toString()),o=t.toLowerCase();this.headers.set(o,r),this.maybeSetNormalizedName(t,o)}forEach(t){this.init(),Array.from(this.normalizedNames.keys()).forEach(n=>t(this.normalizedNames.get(n),this.headers.get(n)))}};var va=class{map=new Map;set(t,n){return this.map.set(t,n),this}get(t){return this.map.has(t)||this.map.set(t,t.defaultValue()),this.map.get(t)}delete(t){return this.map.delete(t),this}has(t){return this.map.has(t)}keys(){return this.map.keys()}},Da=class{encodeKey(t){return L1(t)}encodeValue(t){return L1(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}};function xT(e,t){let n=new Map;return e.length>0&&e.replace(/^\?/,"").split("&").forEach(o=>{let i=o.indexOf("="),[s,u]=i==-1?[t.decodeKey(o),""]:[t.decodeKey(o.slice(0,i)),t.decodeValue(o.slice(i+1))],a=n.get(s)||[];a.push(u),n.set(s,a)}),n}var IT=/%(\d[a-f0-9])/gi,TT={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function L1(e){return encodeURIComponent(e).replace(IT,(t,n)=>TT[n]??t)}function ba(e){return`${e}`}var zt=class e{map;encoder;updates=null;cloneFrom=null;constructor(t={}){if(this.encoder=t.encoder||new Da,t.fromString){if(t.fromObject)throw new C(2805,!1);this.map=xT(t.fromString,this.encoder)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(n=>{let r=t.fromObject[n],o=Array.isArray(r)?r.map(ba):[ba(r)];this.map.set(n,o)})):this.map=null}has(t){return this.init(),this.map.has(t)}get(t){this.init();let n=this.map.get(t);return n?n[0]:null}getAll(t){return this.init(),this.map.get(t)||null}keys(){return this.init(),Array.from(this.map.keys())}append(t,n){return this.clone({param:t,value:n,op:"a"})}appendAll(t){let n=[];return Object.keys(t).forEach(r=>{let o=t[r];Array.isArray(o)?o.forEach(i=>{n.push({param:r,value:i,op:"a"})}):n.push({param:r,value:o,op:"a"})}),this.clone(n)}set(t,n){return this.clone({param:t,value:n,op:"s"})}delete(t,n){return this.clone({param:t,value:n,op:"d"})}toString(){return this.init(),this.keys().map(t=>{let n=this.encoder.encodeKey(t);return this.map.get(t).map(r=>n+"="+this.encoder.encodeValue(r)).join("&")}).filter(t=>t!=="").join("&")}clone(t){let n=new e({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat(t),n}init(){this.map===null&&(this.map=new Map),this.cloneFrom!==null&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(t=>this.map.set(t,this.cloneFrom.map.get(t))),this.updates.forEach(t=>{switch(t.op){case"a":case"s":let n=(t.op==="a"?this.map.get(t.param):void 0)||[];n.push(ba(t.value)),this.map.set(t.param,n);break;case"d":if(t.value!==void 0){let r=this.map.get(t.param)||[],o=r.indexOf(ba(t.value));o!==-1&&r.splice(o,1),r.length>0?this.map.set(t.param,r):this.map.delete(t.param)}else{this.map.delete(t.param);break}}}),this.cloneFrom=this.updates=null)}};function ST(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}function j1(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function B1(e){return typeof Blob<"u"&&e instanceof Blob}function V1(e){return typeof FormData<"u"&&e instanceof FormData}function MT(e){return typeof URLSearchParams<"u"&&e instanceof URLSearchParams}var H1="Content-Type",$1="Accept",z1="text/plain",q1="application/json",AT=`${q1}, ${z1}, */*`,uo=class e{url;body=null;headers;context;reportProgress=!1;withCredentials=!1;credentials;keepalive=!1;cache;priority;mode;redirect;referrer;integrity;referrerPolicy;responseType="json";method;params;urlWithParams;transferCache;timeout;constructor(t,n,r,o){this.url=n,this.method=t.toUpperCase();let i;if(ST(this.method)||o?(this.body=r!==void 0?r:null,i=o):i=r,i){if(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,this.keepalive=!!i.keepalive,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.context&&(this.context=i.context),i.params&&(this.params=i.params),i.priority&&(this.priority=i.priority),i.cache&&(this.cache=i.cache),i.credentials&&(this.credentials=i.credentials),typeof i.timeout=="number"){if(i.timeout<1||!Number.isInteger(i.timeout))throw new C(2822,"");this.timeout=i.timeout}i.mode&&(this.mode=i.mode),i.redirect&&(this.redirect=i.redirect),i.integrity&&(this.integrity=i.integrity),i.referrer&&(this.referrer=i.referrer),i.referrerPolicy&&(this.referrerPolicy=i.referrerPolicy),this.transferCache=i.transferCache}if(this.headers??=new En,this.context??=new va,!this.params)this.params=new zt,this.urlWithParams=n;else{let s=this.params.toString();if(s.length===0)this.urlWithParams=n;else{let u=n.indexOf("?"),a=u===-1?"?":uE.set(N,t.setHeaders[N]),w)),t.setParams&&(D=Object.keys(t.setParams).reduce((E,N)=>E.set(N,t.setParams[N]),D)),new e(n,r,g,{params:D,headers:w,context:F,reportProgress:v,responseType:o,withCredentials:y,transferCache:p,keepalive:i,cache:u,priority:s,timeout:m,mode:a,redirect:c,credentials:l,referrer:d,integrity:h,referrerPolicy:f})}},ir=(function(e){return e[e.Sent=0]="Sent",e[e.UploadProgress=1]="UploadProgress",e[e.ResponseHeader=2]="ResponseHeader",e[e.DownloadProgress=3]="DownloadProgress",e[e.Response=4]="Response",e[e.User=5]="User",e})(ir||{}),co=class{headers;status;statusText;url;ok;type;redirected;responseType;constructor(t,n=200,r="OK"){this.headers=t.headers||new En,this.status=t.status!==void 0?t.status:n,this.statusText=t.statusText||r,this.url=t.url||null,this.redirected=t.redirected,this.responseType=t.responseType,this.ok=this.status>=200&&this.status<300}},Ea=class e extends co{constructor(t={}){super(t)}type=ir.ResponseHeader;clone(t={}){return new e({headers:t.headers||this.headers,status:t.status!==void 0?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}},Ai=class e extends co{body;constructor(t={}){super(t),this.body=t.body!==void 0?t.body:null}type=ir.Response;clone(t={}){return new e({body:t.body!==void 0?t.body:this.body,headers:t.headers||this.headers,status:t.status!==void 0?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0,redirected:t.redirected??this.redirected,responseType:t.responseType??this.responseType})}},ao=class extends co{name="HttpErrorResponse";message;error;ok=!1;constructor(t){super(t,0,"Unknown Error"),this.status>=200&&this.status<300?this.message=`Http failure during parsing for ${t.url||"(unknown url)"}`:this.message=`Http failure response for ${t.url||"(unknown url)"}: ${t.status} ${t.statusText}`,this.error=t.error||null}},NT=200,kT=204;var RT=new x("");var FT=/^\)\]\}',?\n/;var bp=(()=>{class e{xhrFactory;tracingService=b(ot,{optional:!0});constructor(n){this.xhrFactory=n}maybePropagateTrace(n){return this.tracingService?.propagate?this.tracingService.propagate(n):n}handle(n){if(n.method==="JSONP")throw new C(-2800,!1);let r=this.xhrFactory;return us(null).pipe(ps(()=>new B(i=>{let s=r.build();if(s.open(n.method,n.urlWithParams),n.withCredentials&&(s.withCredentials=!0),n.headers.forEach((g,y)=>s.setRequestHeader(g,y.join(","))),n.headers.has($1)||s.setRequestHeader($1,AT),!n.headers.has(H1)){let g=n.detectContentTypeHeader();g!==null&&s.setRequestHeader(H1,g)}if(n.timeout&&(s.timeout=n.timeout),n.responseType){let g=n.responseType.toLowerCase();s.responseType=g!=="json"?g:"text"}let u=n.serializeBody(),a=null,c=()=>{if(a!==null)return a;let g=s.statusText||"OK",y=new En(s.getAllResponseHeaders()),v=s.responseURL||n.url;return a=new Ea({headers:y,status:s.status,statusText:g,url:v}),a},l=this.maybePropagateTrace(()=>{let{headers:g,status:y,statusText:v,url:w}=c(),D=null;y!==kT&&(D=typeof s.response>"u"?s.responseText:s.response),y===0&&(y=D?NT:0);let F=y>=200&&y<300;if(n.responseType==="json"&&typeof D=="string"){let E=D;D=D.replace(FT,"");try{D=D!==""?JSON.parse(D):null}catch(N){D=E,F&&(F=!1,D={error:N,text:D})}}F?(i.next(new Ai({body:D,headers:g,status:y,statusText:v,url:w||void 0})),i.complete()):i.error(new ao({error:D,headers:g,status:y,statusText:v,url:w||void 0}))}),d=this.maybePropagateTrace(g=>{let{url:y}=c(),v=new ao({error:g,status:s.status||0,statusText:s.statusText||"Unknown Error",url:y||void 0});i.error(v)}),h=d;n.timeout&&(h=this.maybePropagateTrace(g=>{let{url:y}=c(),v=new ao({error:new DOMException("Request timed out","TimeoutError"),status:s.status||0,statusText:s.statusText||"Request timeout",url:y||void 0});i.error(v)}));let f=!1,p=this.maybePropagateTrace(g=>{f||(i.next(c()),f=!0);let y={type:ir.DownloadProgress,loaded:g.loaded};g.lengthComputable&&(y.total=g.total),n.responseType==="text"&&s.responseText&&(y.partialText=s.responseText),i.next(y)}),m=this.maybePropagateTrace(g=>{let y={type:ir.UploadProgress,loaded:g.loaded};g.lengthComputable&&(y.total=g.total),i.next(y)});return s.addEventListener("load",l),s.addEventListener("error",d),s.addEventListener("timeout",h),s.addEventListener("abort",d),n.reportProgress&&(s.addEventListener("progress",p),u!==null&&s.upload&&s.upload.addEventListener("progress",m)),s.send(u),i.next({type:ir.Sent}),()=>{s.removeEventListener("error",d),s.removeEventListener("abort",d),s.removeEventListener("load",l),s.removeEventListener("timeout",h),n.reportProgress&&(s.removeEventListener("progress",p),u!==null&&s.upload&&s.upload.removeEventListener("progress",m)),s.readyState!==s.DONE&&s.abort()}})))}static \u0275fac=function(r){return new(r||e)(A(or))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();function G1(e,t){return t(e)}function OT(e,t){return(n,r)=>t.intercept(n,{handle:o=>e(o,r)})}function PT(e,t,n){return(r,o)=>Nr(n,()=>t(r,i=>e(i,o)))}var W1=new x(""),vp=new x("",{factory:()=>[]}),Z1=new x(""),Dp=new x("",{factory:()=>!0});function LT(){let e=null;return(t,n)=>{e===null&&(e=(b(W1,{optional:!0})??[]).reduceRight(OT,G1));let r=b(Wn);if(b(Dp)){let i=r.add();return e(t,n).pipe(ds(i))}else return e(t,n)}}var Ep=(()=>{class e{static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(bp),o},providedIn:"root"})}return e})();var Ca=(()=>{class e{backend;injector;chain=null;pendingTasks=b(Wn);contributeToStability=b(Dp);constructor(n,r){this.backend=n,this.injector=r}handle(n){if(this.chain===null){let r=Array.from(new Set([...this.injector.get(vp),...this.injector.get(Z1,[])]));this.chain=r.reduceRight((o,i)=>PT(o,i,this.injector),G1)}if(this.contributeToStability){let r=this.pendingTasks.add();return this.chain(n,o=>this.backend.handle(o)).pipe(ds(r))}else return this.chain(n,r=>this.backend.handle(r))}static \u0275fac=function(r){return new(r||e)(A(Ep),A(we))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Cp=(()=>{class e{static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(Ca),o},providedIn:"root"})}return e})();function yp(e,t){return{body:t,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials,credentials:e.credentials,transferCache:e.transferCache,timeout:e.timeout,keepalive:e.keepalive,priority:e.priority,cache:e.cache,mode:e.mode,redirect:e.redirect,integrity:e.integrity,referrer:e.referrer,referrerPolicy:e.referrerPolicy}}var Y1=(()=>{class e{handler;constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof uo)i=n;else{let a;o.headers instanceof En?a=o.headers:a=new En(o.headers);let c;o.params&&(o.params instanceof zt?c=o.params:c=new zt({fromObject:o.params})),i=new uo(n,r,o.body!==void 0?o.body:null,{headers:a,context:o.context,params:c,reportProgress:o.reportProgress,responseType:o.responseType||"json",withCredentials:o.withCredentials,transferCache:o.transferCache,keepalive:o.keepalive,priority:o.priority,cache:o.cache,mode:o.mode,redirect:o.redirect,credentials:o.credentials,referrer:o.referrer,referrerPolicy:o.referrerPolicy,integrity:o.integrity,timeout:o.timeout})}let s=us(i).pipe(fc(a=>this.handler.handle(a)));if(n instanceof uo||o.observe==="events")return s;let u=s.pipe(rn(a=>a instanceof Ai));switch(o.observe||"body"){case"body":switch(i.responseType){case"arraybuffer":return u.pipe(Ce(a=>{if(a.body!==null&&!(a.body instanceof ArrayBuffer))throw new C(2806,!1);return a.body}));case"blob":return u.pipe(Ce(a=>{if(a.body!==null&&!(a.body instanceof Blob))throw new C(2807,!1);return a.body}));case"text":return u.pipe(Ce(a=>{if(a.body!==null&&typeof a.body!="string")throw new C(2808,!1);return a.body}));default:return u.pipe(Ce(a=>a.body))}case"response":return u;default:throw new C(2809,!1)}}delete(n,r={}){return this.request("DELETE",n,r)}get(n,r={}){return this.request("GET",n,r)}head(n,r={}){return this.request("HEAD",n,r)}jsonp(n,r){return this.request("JSONP",n,{params:new zt().append(r,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(n,r={}){return this.request("OPTIONS",n,r)}patch(n,r,o={}){return this.request("PATCH",n,yp(o,r))}post(n,r,o={}){return this.request("POST",n,yp(o,r))}put(n,r,o={}){return this.request("PUT",n,yp(o,r))}static \u0275fac=function(r){return new(r||e)(A(Cp))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var jT=new x("",{factory:()=>!0}),BT="XSRF-TOKEN",VT=new x("",{factory:()=>BT}),HT="X-XSRF-TOKEN",$T=new x("",{factory:()=>HT}),UT=(()=>{class e{cookieName=b(VT);doc=b(K);lastCookieString="";lastToken=null;parseCount=0;getToken(){let n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=xi(n,this.cookieName),this.lastCookieString=n),this.lastToken}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),Q1=(()=>{class e{static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(UT),o},providedIn:"root"})}return e})();function zT(e,t){if(!b(jT)||e.method==="GET"||e.method==="HEAD")return t(e);try{let o=b(Dn).href,{origin:i}=new URL(o),{origin:s}=new URL(e.url,i);if(i!==s)return t(e)}catch(o){return t(e)}let n=b(Q1).getToken(),r=b($T);return n!=null&&!e.headers.has(r)&&(e=e.clone({headers:e.headers.set(r,n)})),t(e)}var _p=(function(e){return e[e.Interceptors=0]="Interceptors",e[e.LegacyInterceptors=1]="LegacyInterceptors",e[e.CustomXsrfConfiguration=2]="CustomXsrfConfiguration",e[e.NoXsrfProtection=3]="NoXsrfProtection",e[e.JsonpSupport=4]="JsonpSupport",e[e.RequestsMadeViaParent=5]="RequestsMadeViaParent",e[e.Fetch=6]="Fetch",e})(_p||{});function qT(e,t){return{\u0275kind:e,\u0275providers:t}}function K1(...e){let t=[Y1,Ca,{provide:Cp,useExisting:Ca},{provide:Ep,useFactory:()=>b(RT,{optional:!0})??b(bp)},{provide:vp,useValue:zT,multi:!0}];for(let n of e)t.push(...n.\u0275providers);return Ln(t)}var U1=new x("");function J1(){return qT(_p.LegacyInterceptors,[{provide:U1,useFactory:LT},{provide:vp,useExisting:U1,multi:!0}])}var GT=(()=>{class e{static \u0275fac=function(r){return new(r||e)};static \u0275mod=Ht({type:e});static \u0275inj=yt({providers:[K1(J1())]})}return e})();var p$=(()=>{class e{_doc;constructor(n){this._doc=n}getTitle(){return this._doc.title}setTitle(n){this._doc.title=n||""}static \u0275fac=function(r){return new(r||e)(A(K))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var wp=(()=>{class e{static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:function(r){let o=null;return r?o=new(r||e):o=A(WT),o},providedIn:"root"})}return e})(),WT=(()=>{class e extends wp{_doc;constructor(n){super(),this._doc=n}sanitize(n,r){if(r==null)return null;switch(n){case Pe.NONE:return r;case Pe.HTML:return Bt(r,"HTML")?Oe(r):Cu(this._doc,String(r)).toString();case Pe.STYLE:return Bt(r,"Style")?Oe(r):r;case Pe.SCRIPT:if(Bt(r,"Script"))return Oe(r);throw new C(5200,!1);case Pe.URL:return Bt(r,"URL")?Oe(r):ui(String(r));case Pe.RESOURCE_URL:if(Bt(r,"ResourceURL"))return Oe(r);throw new C(5201,!1);default:throw new C(5202,!1)}}bypassSecurityTrustHtml(n){return md(n)}bypassSecurityTrustStyle(n){return yd(n)}bypassSecurityTrustScript(n){return bd(n)}bypassSecurityTrustUrl(n){return vd(n)}bypassSecurityTrustResourceUrl(n){return Dd(n)}static \u0275fac=function(r){return new(r||e)(A(K))};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var Rp={};pr(Rp,{arrayReplaceAt:()=>kp,assign:()=>po,escapeHtml:()=>Wt,escapeRE:()=>AS,fromCodePoint:()=>Ri,has:()=>vS,isMdAsciiPunct:()=>cr,isPunctChar:()=>ar,isSpace:()=>H,isString:()=>Fa,isValidEntityCode:()=>Oa,isWhiteSpace:()=>ur,lib:()=>NS,normalizeReference:()=>lr,unescapeAll:()=>Gt,unescapeMd:()=>wS});var Ta={};pr(Ta,{decode:()=>Ni,encode:()=>xa,format:()=>lo,parse:()=>ki});var X1={};function ZT(e){let t=X1[e];if(t)return t;t=X1[e]=[];for(let n=0;n<128;n++){let r=String.fromCharCode(n);t.push(r)}for(let n=0;n=55296&&l<=57343?o+="\uFFFD\uFFFD\uFFFD":o+=String.fromCharCode(l),i+=6;continue}}if((u&248)===240&&i+91114111?o+="\uFFFD\uFFFD\uFFFD\uFFFD":(d-=65536,o+=String.fromCharCode(55296+(d>>10),56320+(d&1023))),i+=9;continue}}o+="\uFFFD"}return o})}_a.defaultChars=";/?:@&=+$,#";_a.componentChars="";var Ni=_a;var ev={};function YT(e){let t=ev[e];if(t)return t;t=ev[e]=[];for(let n=0;n<128;n++){let r=String.fromCharCode(n);/^[0-9a-z]$/i.test(r)?t.push(r):t.push("%"+("0"+n.toString(16).toUpperCase()).slice(-2))}for(let n=0;n"u"&&(n=!0);let r=YT(t),o="";for(let i=0,s=e.length;i=55296&&u<=57343){if(u>=55296&&u<=56319&&i+1=56320&&a<=57343){o+=encodeURIComponent(e[i]+e[i+1]),i++;continue}}o+="%EF%BF%BD";continue}o+=encodeURIComponent(e[i])}return o}wa.defaultChars=";/?:@&=+$,-_.!~*'()#";wa.componentChars="-_.!~*'()";var xa=wa;function lo(e){let t="";return t+=e.protocol||"",t+=e.slashes?"//":"",t+=e.auth?e.auth+"@":"",e.hostname&&e.hostname.indexOf(":")!==-1?t+="["+e.hostname+"]":t+=e.hostname||"",t+=e.port?":"+e.port:"",t+=e.pathname||"",t+=e.search||"",t+=e.hash||"",t}function Ia(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var QT=/^([a-z0-9.+-]+:)/i,KT=/:[0-9]*$/,JT=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,XT=["<",">",'"',"`"," ","\r",` `," "],eS=["{","}","|","\\","^","`"].concat(XT),tS=["'"].concat(eS),tv=["%","/","?",";","#"].concat(tS),nv=["/","?","#"],nS=255,rv=/^[+a-z0-9A-Z_-]{0,63}$/,rS=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,ov={javascript:!0,"javascript:":!0},iv={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function oS(e,t){if(e&&e instanceof Ia)return e;let n=new Ia;return n.parse(e,t),n}Ia.prototype.parse=function(e,t){let n,r,o,i=e;if(i=i.trim(),!t&&e.split("#").length===1){let c=JT.exec(i);if(c)return this.pathname=c[1],c[2]&&(this.search=c[2]),this}let s=QT.exec(i);if(s&&(s=s[0],n=s.toLowerCase(),this.protocol=s,i=i.substr(s.length)),(t||s||i.match(/^\/\/[^@\/]+@[^@\/]+/))&&(o=i.substr(0,2)==="//",o&&!(s&&ov[s])&&(i=i.substr(2),this.slashes=!0)),!ov[s]&&(o||s&&!iv[s])){let c=-1;for(let p=0;p127?v+="x":v+=y[w];if(!v.match(rv)){let w=p.slice(0,m),D=p.slice(m+1),F=y.match(rS);F&&(w.push(F[1]),D.unshift(F[2])),D.length&&(i=D.join(".")+i),this.hostname=w.join(".");break}}}}this.hostname.length>nS&&(this.hostname=""),f&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}let u=i.indexOf("#");u!==-1&&(this.hash=i.substr(u),i=i.slice(0,u));let a=i.indexOf("?");return a!==-1&&(this.search=i.substr(a),i=i.slice(0,a)),i&&(this.pathname=i),iv[n]&&this.hostname&&!this.pathname&&(this.pathname=""),this};Ia.prototype.parseHost=function(e){let t=KT.exec(e);t&&(t=t[0],t!==":"&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};var ki=oS;var xp={};pr(xp,{Any:()=>Sa,Cc:()=>Ma,Cf:()=>sv,P:()=>fo,S:()=>Aa,Z:()=>Na});var Sa=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;var Ma=/[\0-\x1F\x7F-\x9F]/;var sv=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/;var fo=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/;var Aa=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/;var Na=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/;var uv=new Uint16Array('\u1D41<\xD5\u0131\u028A\u049D\u057B\u05D0\u0675\u06DE\u07A2\u07D6\u080F\u0A4A\u0A91\u0DA1\u0E6D\u0F09\u0F26\u10CA\u1228\u12E1\u1415\u149D\u14C3\u14DF\u1525\0\0\0\0\0\0\u156B\u16CD\u198D\u1C12\u1DDD\u1F7E\u2060\u21B0\u228D\u23C0\u23FB\u2442\u2824\u2912\u2D08\u2E48\u2FCE\u3016\u32BA\u3639\u37AC\u38FE\u3A28\u3A71\u3AE0\u3B2E\u0800EMabcfglmnoprstu\\bfms\x7F\x84\x8B\x90\x95\x98\xA6\xB3\xB9\xC8\xCFlig\u803B\xC6\u40C6P\u803B&\u4026cute\u803B\xC1\u40C1reve;\u4102\u0100iyx}rc\u803B\xC2\u40C2;\u4410r;\uC000\u{1D504}rave\u803B\xC0\u40C0pha;\u4391acr;\u4100d;\u6A53\u0100gp\x9D\xA1on;\u4104f;\uC000\u{1D538}plyFunction;\u6061ing\u803B\xC5\u40C5\u0100cs\xBE\xC3r;\uC000\u{1D49C}ign;\u6254ilde\u803B\xC3\u40C3ml\u803B\xC4\u40C4\u0400aceforsu\xE5\xFB\xFE\u0117\u011C\u0122\u0127\u012A\u0100cr\xEA\xF2kslash;\u6216\u0176\xF6\xF8;\u6AE7ed;\u6306y;\u4411\u0180crt\u0105\u010B\u0114ause;\u6235noullis;\u612Ca;\u4392r;\uC000\u{1D505}pf;\uC000\u{1D539}eve;\u42D8c\xF2\u0113mpeq;\u624E\u0700HOacdefhilorsu\u014D\u0151\u0156\u0180\u019E\u01A2\u01B5\u01B7\u01BA\u01DC\u0215\u0273\u0278\u027Ecy;\u4427PY\u803B\xA9\u40A9\u0180cpy\u015D\u0162\u017Aute;\u4106\u0100;i\u0167\u0168\u62D2talDifferentialD;\u6145leys;\u612D\u0200aeio\u0189\u018E\u0194\u0198ron;\u410Cdil\u803B\xC7\u40C7rc;\u4108nint;\u6230ot;\u410A\u0100dn\u01A7\u01ADilla;\u40B8terDot;\u40B7\xF2\u017Fi;\u43A7rcle\u0200DMPT\u01C7\u01CB\u01D1\u01D6ot;\u6299inus;\u6296lus;\u6295imes;\u6297o\u0100cs\u01E2\u01F8kwiseContourIntegral;\u6232eCurly\u0100DQ\u0203\u020FoubleQuote;\u601Duote;\u6019\u0200lnpu\u021E\u0228\u0247\u0255on\u0100;e\u0225\u0226\u6237;\u6A74\u0180git\u022F\u0236\u023Aruent;\u6261nt;\u622FourIntegral;\u622E\u0100fr\u024C\u024E;\u6102oduct;\u6210nterClockwiseContourIntegral;\u6233oss;\u6A2Fcr;\uC000\u{1D49E}p\u0100;C\u0284\u0285\u62D3ap;\u624D\u0580DJSZacefios\u02A0\u02AC\u02B0\u02B4\u02B8\u02CB\u02D7\u02E1\u02E6\u0333\u048D\u0100;o\u0179\u02A5trahd;\u6911cy;\u4402cy;\u4405cy;\u440F\u0180grs\u02BF\u02C4\u02C7ger;\u6021r;\u61A1hv;\u6AE4\u0100ay\u02D0\u02D5ron;\u410E;\u4414l\u0100;t\u02DD\u02DE\u6207a;\u4394r;\uC000\u{1D507}\u0100af\u02EB\u0327\u0100cm\u02F0\u0322ritical\u0200ADGT\u0300\u0306\u0316\u031Ccute;\u40B4o\u0174\u030B\u030D;\u42D9bleAcute;\u42DDrave;\u4060ilde;\u42DCond;\u62C4ferentialD;\u6146\u0470\u033D\0\0\0\u0342\u0354\0\u0405f;\uC000\u{1D53B}\u0180;DE\u0348\u0349\u034D\u40A8ot;\u60DCqual;\u6250ble\u0300CDLRUV\u0363\u0372\u0382\u03CF\u03E2\u03F8ontourIntegra\xEC\u0239o\u0274\u0379\0\0\u037B\xBB\u0349nArrow;\u61D3\u0100eo\u0387\u03A4ft\u0180ART\u0390\u0396\u03A1rrow;\u61D0ightArrow;\u61D4e\xE5\u02CAng\u0100LR\u03AB\u03C4eft\u0100AR\u03B3\u03B9rrow;\u67F8ightArrow;\u67FAightArrow;\u67F9ight\u0100AT\u03D8\u03DErrow;\u61D2ee;\u62A8p\u0241\u03E9\0\0\u03EFrrow;\u61D1ownArrow;\u61D5erticalBar;\u6225n\u0300ABLRTa\u0412\u042A\u0430\u045E\u047F\u037Crrow\u0180;BU\u041D\u041E\u0422\u6193ar;\u6913pArrow;\u61F5reve;\u4311eft\u02D2\u043A\0\u0446\0\u0450ightVector;\u6950eeVector;\u695Eector\u0100;B\u0459\u045A\u61BDar;\u6956ight\u01D4\u0467\0\u0471eeVector;\u695Fector\u0100;B\u047A\u047B\u61C1ar;\u6957ee\u0100;A\u0486\u0487\u62A4rrow;\u61A7\u0100ct\u0492\u0497r;\uC000\u{1D49F}rok;\u4110\u0800NTacdfglmopqstux\u04BD\u04C0\u04C4\u04CB\u04DE\u04E2\u04E7\u04EE\u04F5\u0521\u052F\u0536\u0552\u055D\u0560\u0565G;\u414AH\u803B\xD0\u40D0cute\u803B\xC9\u40C9\u0180aiy\u04D2\u04D7\u04DCron;\u411Arc\u803B\xCA\u40CA;\u442Dot;\u4116r;\uC000\u{1D508}rave\u803B\xC8\u40C8ement;\u6208\u0100ap\u04FA\u04FEcr;\u4112ty\u0253\u0506\0\0\u0512mallSquare;\u65FBerySmallSquare;\u65AB\u0100gp\u0526\u052Aon;\u4118f;\uC000\u{1D53C}silon;\u4395u\u0100ai\u053C\u0549l\u0100;T\u0542\u0543\u6A75ilde;\u6242librium;\u61CC\u0100ci\u0557\u055Ar;\u6130m;\u6A73a;\u4397ml\u803B\xCB\u40CB\u0100ip\u056A\u056Fsts;\u6203onentialE;\u6147\u0280cfios\u0585\u0588\u058D\u05B2\u05CCy;\u4424r;\uC000\u{1D509}lled\u0253\u0597\0\0\u05A3mallSquare;\u65FCerySmallSquare;\u65AA\u0370\u05BA\0\u05BF\0\0\u05C4f;\uC000\u{1D53D}All;\u6200riertrf;\u6131c\xF2\u05CB\u0600JTabcdfgorst\u05E8\u05EC\u05EF\u05FA\u0600\u0612\u0616\u061B\u061D\u0623\u066C\u0672cy;\u4403\u803B>\u403Emma\u0100;d\u05F7\u05F8\u4393;\u43DCreve;\u411E\u0180eiy\u0607\u060C\u0610dil;\u4122rc;\u411C;\u4413ot;\u4120r;\uC000\u{1D50A};\u62D9pf;\uC000\u{1D53E}eater\u0300EFGLST\u0635\u0644\u064E\u0656\u065B\u0666qual\u0100;L\u063E\u063F\u6265ess;\u62DBullEqual;\u6267reater;\u6AA2ess;\u6277lantEqual;\u6A7Eilde;\u6273cr;\uC000\u{1D4A2};\u626B\u0400Aacfiosu\u0685\u068B\u0696\u069B\u069E\u06AA\u06BE\u06CARDcy;\u442A\u0100ct\u0690\u0694ek;\u42C7;\u405Eirc;\u4124r;\u610ClbertSpace;\u610B\u01F0\u06AF\0\u06B2f;\u610DizontalLine;\u6500\u0100ct\u06C3\u06C5\xF2\u06A9rok;\u4126mp\u0144\u06D0\u06D8ownHum\xF0\u012Fqual;\u624F\u0700EJOacdfgmnostu\u06FA\u06FE\u0703\u0707\u070E\u071A\u071E\u0721\u0728\u0744\u0778\u078B\u078F\u0795cy;\u4415lig;\u4132cy;\u4401cute\u803B\xCD\u40CD\u0100iy\u0713\u0718rc\u803B\xCE\u40CE;\u4418ot;\u4130r;\u6111rave\u803B\xCC\u40CC\u0180;ap\u0720\u072F\u073F\u0100cg\u0734\u0737r;\u412AinaryI;\u6148lie\xF3\u03DD\u01F4\u0749\0\u0762\u0100;e\u074D\u074E\u622C\u0100gr\u0753\u0758ral;\u622Bsection;\u62C2isible\u0100CT\u076C\u0772omma;\u6063imes;\u6062\u0180gpt\u077F\u0783\u0788on;\u412Ef;\uC000\u{1D540}a;\u4399cr;\u6110ilde;\u4128\u01EB\u079A\0\u079Ecy;\u4406l\u803B\xCF\u40CF\u0280cfosu\u07AC\u07B7\u07BC\u07C2\u07D0\u0100iy\u07B1\u07B5rc;\u4134;\u4419r;\uC000\u{1D50D}pf;\uC000\u{1D541}\u01E3\u07C7\0\u07CCr;\uC000\u{1D4A5}rcy;\u4408kcy;\u4404\u0380HJacfos\u07E4\u07E8\u07EC\u07F1\u07FD\u0802\u0808cy;\u4425cy;\u440Cppa;\u439A\u0100ey\u07F6\u07FBdil;\u4136;\u441Ar;\uC000\u{1D50E}pf;\uC000\u{1D542}cr;\uC000\u{1D4A6}\u0580JTaceflmost\u0825\u0829\u082C\u0850\u0863\u09B3\u09B8\u09C7\u09CD\u0A37\u0A47cy;\u4409\u803B<\u403C\u0280cmnpr\u0837\u083C\u0841\u0844\u084Dute;\u4139bda;\u439Bg;\u67EAlacetrf;\u6112r;\u619E\u0180aey\u0857\u085C\u0861ron;\u413Ddil;\u413B;\u441B\u0100fs\u0868\u0970t\u0500ACDFRTUVar\u087E\u08A9\u08B1\u08E0\u08E6\u08FC\u092F\u095B\u0390\u096A\u0100nr\u0883\u088FgleBracket;\u67E8row\u0180;BR\u0899\u089A\u089E\u6190ar;\u61E4ightArrow;\u61C6eiling;\u6308o\u01F5\u08B7\0\u08C3bleBracket;\u67E6n\u01D4\u08C8\0\u08D2eeVector;\u6961ector\u0100;B\u08DB\u08DC\u61C3ar;\u6959loor;\u630Aight\u0100AV\u08EF\u08F5rrow;\u6194ector;\u694E\u0100er\u0901\u0917e\u0180;AV\u0909\u090A\u0910\u62A3rrow;\u61A4ector;\u695Aiangle\u0180;BE\u0924\u0925\u0929\u62B2ar;\u69CFqual;\u62B4p\u0180DTV\u0937\u0942\u094CownVector;\u6951eeVector;\u6960ector\u0100;B\u0956\u0957\u61BFar;\u6958ector\u0100;B\u0965\u0966\u61BCar;\u6952ight\xE1\u039Cs\u0300EFGLST\u097E\u098B\u0995\u099D\u09A2\u09ADqualGreater;\u62DAullEqual;\u6266reater;\u6276ess;\u6AA1lantEqual;\u6A7Dilde;\u6272r;\uC000\u{1D50F}\u0100;e\u09BD\u09BE\u62D8ftarrow;\u61DAidot;\u413F\u0180npw\u09D4\u0A16\u0A1Bg\u0200LRlr\u09DE\u09F7\u0A02\u0A10eft\u0100AR\u09E6\u09ECrrow;\u67F5ightArrow;\u67F7ightArrow;\u67F6eft\u0100ar\u03B3\u0A0Aight\xE1\u03BFight\xE1\u03CAf;\uC000\u{1D543}er\u0100LR\u0A22\u0A2CeftArrow;\u6199ightArrow;\u6198\u0180cht\u0A3E\u0A40\u0A42\xF2\u084C;\u61B0rok;\u4141;\u626A\u0400acefiosu\u0A5A\u0A5D\u0A60\u0A77\u0A7C\u0A85\u0A8B\u0A8Ep;\u6905y;\u441C\u0100dl\u0A65\u0A6FiumSpace;\u605Flintrf;\u6133r;\uC000\u{1D510}nusPlus;\u6213pf;\uC000\u{1D544}c\xF2\u0A76;\u439C\u0480Jacefostu\u0AA3\u0AA7\u0AAD\u0AC0\u0B14\u0B19\u0D91\u0D97\u0D9Ecy;\u440Acute;\u4143\u0180aey\u0AB4\u0AB9\u0ABEron;\u4147dil;\u4145;\u441D\u0180gsw\u0AC7\u0AF0\u0B0Eative\u0180MTV\u0AD3\u0ADF\u0AE8ediumSpace;\u600Bhi\u0100cn\u0AE6\u0AD8\xEB\u0AD9eryThi\xEE\u0AD9ted\u0100GL\u0AF8\u0B06reaterGreate\xF2\u0673essLes\xF3\u0A48Line;\u400Ar;\uC000\u{1D511}\u0200Bnpt\u0B22\u0B28\u0B37\u0B3Areak;\u6060BreakingSpace;\u40A0f;\u6115\u0680;CDEGHLNPRSTV\u0B55\u0B56\u0B6A\u0B7C\u0BA1\u0BEB\u0C04\u0C5E\u0C84\u0CA6\u0CD8\u0D61\u0D85\u6AEC\u0100ou\u0B5B\u0B64ngruent;\u6262pCap;\u626DoubleVerticalBar;\u6226\u0180lqx\u0B83\u0B8A\u0B9Bement;\u6209ual\u0100;T\u0B92\u0B93\u6260ilde;\uC000\u2242\u0338ists;\u6204reater\u0380;EFGLST\u0BB6\u0BB7\u0BBD\u0BC9\u0BD3\u0BD8\u0BE5\u626Fqual;\u6271ullEqual;\uC000\u2267\u0338reater;\uC000\u226B\u0338ess;\u6279lantEqual;\uC000\u2A7E\u0338ilde;\u6275ump\u0144\u0BF2\u0BFDownHump;\uC000\u224E\u0338qual;\uC000\u224F\u0338e\u0100fs\u0C0A\u0C27tTriangle\u0180;BE\u0C1A\u0C1B\u0C21\u62EAar;\uC000\u29CF\u0338qual;\u62ECs\u0300;EGLST\u0C35\u0C36\u0C3C\u0C44\u0C4B\u0C58\u626Equal;\u6270reater;\u6278ess;\uC000\u226A\u0338lantEqual;\uC000\u2A7D\u0338ilde;\u6274ested\u0100GL\u0C68\u0C79reaterGreater;\uC000\u2AA2\u0338essLess;\uC000\u2AA1\u0338recedes\u0180;ES\u0C92\u0C93\u0C9B\u6280qual;\uC000\u2AAF\u0338lantEqual;\u62E0\u0100ei\u0CAB\u0CB9verseElement;\u620CghtTriangle\u0180;BE\u0CCB\u0CCC\u0CD2\u62EBar;\uC000\u29D0\u0338qual;\u62ED\u0100qu\u0CDD\u0D0CuareSu\u0100bp\u0CE8\u0CF9set\u0100;E\u0CF0\u0CF3\uC000\u228F\u0338qual;\u62E2erset\u0100;E\u0D03\u0D06\uC000\u2290\u0338qual;\u62E3\u0180bcp\u0D13\u0D24\u0D4Eset\u0100;E\u0D1B\u0D1E\uC000\u2282\u20D2qual;\u6288ceeds\u0200;EST\u0D32\u0D33\u0D3B\u0D46\u6281qual;\uC000\u2AB0\u0338lantEqual;\u62E1ilde;\uC000\u227F\u0338erset\u0100;E\u0D58\u0D5B\uC000\u2283\u20D2qual;\u6289ilde\u0200;EFT\u0D6E\u0D6F\u0D75\u0D7F\u6241qual;\u6244ullEqual;\u6247ilde;\u6249erticalBar;\u6224cr;\uC000\u{1D4A9}ilde\u803B\xD1\u40D1;\u439D\u0700Eacdfgmoprstuv\u0DBD\u0DC2\u0DC9\u0DD5\u0DDB\u0DE0\u0DE7\u0DFC\u0E02\u0E20\u0E22\u0E32\u0E3F\u0E44lig;\u4152cute\u803B\xD3\u40D3\u0100iy\u0DCE\u0DD3rc\u803B\xD4\u40D4;\u441Eblac;\u4150r;\uC000\u{1D512}rave\u803B\xD2\u40D2\u0180aei\u0DEE\u0DF2\u0DF6cr;\u414Cga;\u43A9cron;\u439Fpf;\uC000\u{1D546}enCurly\u0100DQ\u0E0E\u0E1AoubleQuote;\u601Cuote;\u6018;\u6A54\u0100cl\u0E27\u0E2Cr;\uC000\u{1D4AA}ash\u803B\xD8\u40D8i\u016C\u0E37\u0E3Cde\u803B\xD5\u40D5es;\u6A37ml\u803B\xD6\u40D6er\u0100BP\u0E4B\u0E60\u0100ar\u0E50\u0E53r;\u603Eac\u0100ek\u0E5A\u0E5C;\u63DEet;\u63B4arenthesis;\u63DC\u0480acfhilors\u0E7F\u0E87\u0E8A\u0E8F\u0E92\u0E94\u0E9D\u0EB0\u0EFCrtialD;\u6202y;\u441Fr;\uC000\u{1D513}i;\u43A6;\u43A0usMinus;\u40B1\u0100ip\u0EA2\u0EADncareplan\xE5\u069Df;\u6119\u0200;eio\u0EB9\u0EBA\u0EE0\u0EE4\u6ABBcedes\u0200;EST\u0EC8\u0EC9\u0ECF\u0EDA\u627Aqual;\u6AAFlantEqual;\u627Cilde;\u627Eme;\u6033\u0100dp\u0EE9\u0EEEuct;\u620Fortion\u0100;a\u0225\u0EF9l;\u621D\u0100ci\u0F01\u0F06r;\uC000\u{1D4AB};\u43A8\u0200Ufos\u0F11\u0F16\u0F1B\u0F1FOT\u803B"\u4022r;\uC000\u{1D514}pf;\u611Acr;\uC000\u{1D4AC}\u0600BEacefhiorsu\u0F3E\u0F43\u0F47\u0F60\u0F73\u0FA7\u0FAA\u0FAD\u1096\u10A9\u10B4\u10BEarr;\u6910G\u803B\xAE\u40AE\u0180cnr\u0F4E\u0F53\u0F56ute;\u4154g;\u67EBr\u0100;t\u0F5C\u0F5D\u61A0l;\u6916\u0180aey\u0F67\u0F6C\u0F71ron;\u4158dil;\u4156;\u4420\u0100;v\u0F78\u0F79\u611Cerse\u0100EU\u0F82\u0F99\u0100lq\u0F87\u0F8Eement;\u620Builibrium;\u61CBpEquilibrium;\u696Fr\xBB\u0F79o;\u43A1ght\u0400ACDFTUVa\u0FC1\u0FEB\u0FF3\u1022\u1028\u105B\u1087\u03D8\u0100nr\u0FC6\u0FD2gleBracket;\u67E9row\u0180;BL\u0FDC\u0FDD\u0FE1\u6192ar;\u61E5eftArrow;\u61C4eiling;\u6309o\u01F5\u0FF9\0\u1005bleBracket;\u67E7n\u01D4\u100A\0\u1014eeVector;\u695Dector\u0100;B\u101D\u101E\u61C2ar;\u6955loor;\u630B\u0100er\u102D\u1043e\u0180;AV\u1035\u1036\u103C\u62A2rrow;\u61A6ector;\u695Biangle\u0180;BE\u1050\u1051\u1055\u62B3ar;\u69D0qual;\u62B5p\u0180DTV\u1063\u106E\u1078ownVector;\u694FeeVector;\u695Cector\u0100;B\u1082\u1083\u61BEar;\u6954ector\u0100;B\u1091\u1092\u61C0ar;\u6953\u0100pu\u109B\u109Ef;\u611DndImplies;\u6970ightarrow;\u61DB\u0100ch\u10B9\u10BCr;\u611B;\u61B1leDelayed;\u69F4\u0680HOacfhimoqstu\u10E4\u10F1\u10F7\u10FD\u1119\u111E\u1151\u1156\u1161\u1167\u11B5\u11BB\u11BF\u0100Cc\u10E9\u10EEHcy;\u4429y;\u4428FTcy;\u442Ccute;\u415A\u0280;aeiy\u1108\u1109\u110E\u1113\u1117\u6ABCron;\u4160dil;\u415Erc;\u415C;\u4421r;\uC000\u{1D516}ort\u0200DLRU\u112A\u1134\u113E\u1149ownArrow\xBB\u041EeftArrow\xBB\u089AightArrow\xBB\u0FDDpArrow;\u6191gma;\u43A3allCircle;\u6218pf;\uC000\u{1D54A}\u0272\u116D\0\0\u1170t;\u621Aare\u0200;ISU\u117B\u117C\u1189\u11AF\u65A1ntersection;\u6293u\u0100bp\u118F\u119Eset\u0100;E\u1197\u1198\u628Fqual;\u6291erset\u0100;E\u11A8\u11A9\u6290qual;\u6292nion;\u6294cr;\uC000\u{1D4AE}ar;\u62C6\u0200bcmp\u11C8\u11DB\u1209\u120B\u0100;s\u11CD\u11CE\u62D0et\u0100;E\u11CD\u11D5qual;\u6286\u0100ch\u11E0\u1205eeds\u0200;EST\u11ED\u11EE\u11F4\u11FF\u627Bqual;\u6AB0lantEqual;\u627Dilde;\u627FTh\xE1\u0F8C;\u6211\u0180;es\u1212\u1213\u1223\u62D1rset\u0100;E\u121C\u121D\u6283qual;\u6287et\xBB\u1213\u0580HRSacfhiors\u123E\u1244\u1249\u1255\u125E\u1271\u1276\u129F\u12C2\u12C8\u12D1ORN\u803B\xDE\u40DEADE;\u6122\u0100Hc\u124E\u1252cy;\u440By;\u4426\u0100bu\u125A\u125C;\u4009;\u43A4\u0180aey\u1265\u126A\u126Fron;\u4164dil;\u4162;\u4422r;\uC000\u{1D517}\u0100ei\u127B\u1289\u01F2\u1280\0\u1287efore;\u6234a;\u4398\u0100cn\u128E\u1298kSpace;\uC000\u205F\u200ASpace;\u6009lde\u0200;EFT\u12AB\u12AC\u12B2\u12BC\u623Cqual;\u6243ullEqual;\u6245ilde;\u6248pf;\uC000\u{1D54B}ipleDot;\u60DB\u0100ct\u12D6\u12DBr;\uC000\u{1D4AF}rok;\u4166\u0AE1\u12F7\u130E\u131A\u1326\0\u132C\u1331\0\0\0\0\0\u1338\u133D\u1377\u1385\0\u13FF\u1404\u140A\u1410\u0100cr\u12FB\u1301ute\u803B\xDA\u40DAr\u0100;o\u1307\u1308\u619Fcir;\u6949r\u01E3\u1313\0\u1316y;\u440Eve;\u416C\u0100iy\u131E\u1323rc\u803B\xDB\u40DB;\u4423blac;\u4170r;\uC000\u{1D518}rave\u803B\xD9\u40D9acr;\u416A\u0100di\u1341\u1369er\u0100BP\u1348\u135D\u0100ar\u134D\u1350r;\u405Fac\u0100ek\u1357\u1359;\u63DFet;\u63B5arenthesis;\u63DDon\u0100;P\u1370\u1371\u62C3lus;\u628E\u0100gp\u137B\u137Fon;\u4172f;\uC000\u{1D54C}\u0400ADETadps\u1395\u13AE\u13B8\u13C4\u03E8\u13D2\u13D7\u13F3rrow\u0180;BD\u1150\u13A0\u13A4ar;\u6912ownArrow;\u61C5ownArrow;\u6195quilibrium;\u696Eee\u0100;A\u13CB\u13CC\u62A5rrow;\u61A5own\xE1\u03F3er\u0100LR\u13DE\u13E8eftArrow;\u6196ightArrow;\u6197i\u0100;l\u13F9\u13FA\u43D2on;\u43A5ing;\u416Ecr;\uC000\u{1D4B0}ilde;\u4168ml\u803B\xDC\u40DC\u0480Dbcdefosv\u1427\u142C\u1430\u1433\u143E\u1485\u148A\u1490\u1496ash;\u62ABar;\u6AEBy;\u4412ash\u0100;l\u143B\u143C\u62A9;\u6AE6\u0100er\u1443\u1445;\u62C1\u0180bty\u144C\u1450\u147Aar;\u6016\u0100;i\u144F\u1455cal\u0200BLST\u1461\u1465\u146A\u1474ar;\u6223ine;\u407Ceparator;\u6758ilde;\u6240ThinSpace;\u600Ar;\uC000\u{1D519}pf;\uC000\u{1D54D}cr;\uC000\u{1D4B1}dash;\u62AA\u0280cefos\u14A7\u14AC\u14B1\u14B6\u14BCirc;\u4174dge;\u62C0r;\uC000\u{1D51A}pf;\uC000\u{1D54E}cr;\uC000\u{1D4B2}\u0200fios\u14CB\u14D0\u14D2\u14D8r;\uC000\u{1D51B};\u439Epf;\uC000\u{1D54F}cr;\uC000\u{1D4B3}\u0480AIUacfosu\u14F1\u14F5\u14F9\u14FD\u1504\u150F\u1514\u151A\u1520cy;\u442Fcy;\u4407cy;\u442Ecute\u803B\xDD\u40DD\u0100iy\u1509\u150Drc;\u4176;\u442Br;\uC000\u{1D51C}pf;\uC000\u{1D550}cr;\uC000\u{1D4B4}ml;\u4178\u0400Hacdefos\u1535\u1539\u153F\u154B\u154F\u155D\u1560\u1564cy;\u4416cute;\u4179\u0100ay\u1544\u1549ron;\u417D;\u4417ot;\u417B\u01F2\u1554\0\u155BoWidt\xE8\u0AD9a;\u4396r;\u6128pf;\u6124cr;\uC000\u{1D4B5}\u0BE1\u1583\u158A\u1590\0\u15B0\u15B6\u15BF\0\0\0\0\u15C6\u15DB\u15EB\u165F\u166D\0\u1695\u169B\u16B2\u16B9\0\u16BEcute\u803B\xE1\u40E1reve;\u4103\u0300;Ediuy\u159C\u159D\u15A1\u15A3\u15A8\u15AD\u623E;\uC000\u223E\u0333;\u623Frc\u803B\xE2\u40E2te\u80BB\xB4\u0306;\u4430lig\u803B\xE6\u40E6\u0100;r\xB2\u15BA;\uC000\u{1D51E}rave\u803B\xE0\u40E0\u0100ep\u15CA\u15D6\u0100fp\u15CF\u15D4sym;\u6135\xE8\u15D3ha;\u43B1\u0100ap\u15DFc\u0100cl\u15E4\u15E7r;\u4101g;\u6A3F\u0264\u15F0\0\0\u160A\u0280;adsv\u15FA\u15FB\u15FF\u1601\u1607\u6227nd;\u6A55;\u6A5Clope;\u6A58;\u6A5A\u0380;elmrsz\u1618\u1619\u161B\u161E\u163F\u164F\u1659\u6220;\u69A4e\xBB\u1619sd\u0100;a\u1625\u1626\u6221\u0461\u1630\u1632\u1634\u1636\u1638\u163A\u163C\u163E;\u69A8;\u69A9;\u69AA;\u69AB;\u69AC;\u69AD;\u69AE;\u69AFt\u0100;v\u1645\u1646\u621Fb\u0100;d\u164C\u164D\u62BE;\u699D\u0100pt\u1654\u1657h;\u6222\xBB\xB9arr;\u637C\u0100gp\u1663\u1667on;\u4105f;\uC000\u{1D552}\u0380;Eaeiop\u12C1\u167B\u167D\u1682\u1684\u1687\u168A;\u6A70cir;\u6A6F;\u624Ad;\u624Bs;\u4027rox\u0100;e\u12C1\u1692\xF1\u1683ing\u803B\xE5\u40E5\u0180cty\u16A1\u16A6\u16A8r;\uC000\u{1D4B6};\u402Amp\u0100;e\u12C1\u16AF\xF1\u0288ilde\u803B\xE3\u40E3ml\u803B\xE4\u40E4\u0100ci\u16C2\u16C8onin\xF4\u0272nt;\u6A11\u0800Nabcdefiklnoprsu\u16ED\u16F1\u1730\u173C\u1743\u1748\u1778\u177D\u17E0\u17E6\u1839\u1850\u170D\u193D\u1948\u1970ot;\u6AED\u0100cr\u16F6\u171Ek\u0200ceps\u1700\u1705\u170D\u1713ong;\u624Cpsilon;\u43F6rime;\u6035im\u0100;e\u171A\u171B\u623Dq;\u62CD\u0176\u1722\u1726ee;\u62BDed\u0100;g\u172C\u172D\u6305e\xBB\u172Drk\u0100;t\u135C\u1737brk;\u63B6\u0100oy\u1701\u1741;\u4431quo;\u601E\u0280cmprt\u1753\u175B\u1761\u1764\u1768aus\u0100;e\u010A\u0109ptyv;\u69B0s\xE9\u170Cno\xF5\u0113\u0180ahw\u176F\u1771\u1773;\u43B2;\u6136een;\u626Cr;\uC000\u{1D51F}g\u0380costuvw\u178D\u179D\u17B3\u17C1\u17D5\u17DB\u17DE\u0180aiu\u1794\u1796\u179A\xF0\u0760rc;\u65EFp\xBB\u1371\u0180dpt\u17A4\u17A8\u17ADot;\u6A00lus;\u6A01imes;\u6A02\u0271\u17B9\0\0\u17BEcup;\u6A06ar;\u6605riangle\u0100du\u17CD\u17D2own;\u65BDp;\u65B3plus;\u6A04e\xE5\u1444\xE5\u14ADarow;\u690D\u0180ako\u17ED\u1826\u1835\u0100cn\u17F2\u1823k\u0180lst\u17FA\u05AB\u1802ozenge;\u69EBriangle\u0200;dlr\u1812\u1813\u1818\u181D\u65B4own;\u65BEeft;\u65C2ight;\u65B8k;\u6423\u01B1\u182B\0\u1833\u01B2\u182F\0\u1831;\u6592;\u65914;\u6593ck;\u6588\u0100eo\u183E\u184D\u0100;q\u1843\u1846\uC000=\u20E5uiv;\uC000\u2261\u20E5t;\u6310\u0200ptwx\u1859\u185E\u1867\u186Cf;\uC000\u{1D553}\u0100;t\u13CB\u1863om\xBB\u13CCtie;\u62C8\u0600DHUVbdhmptuv\u1885\u1896\u18AA\u18BB\u18D7\u18DB\u18EC\u18FF\u1905\u190A\u1910\u1921\u0200LRlr\u188E\u1890\u1892\u1894;\u6557;\u6554;\u6556;\u6553\u0280;DUdu\u18A1\u18A2\u18A4\u18A6\u18A8\u6550;\u6566;\u6569;\u6564;\u6567\u0200LRlr\u18B3\u18B5\u18B7\u18B9;\u655D;\u655A;\u655C;\u6559\u0380;HLRhlr\u18CA\u18CB\u18CD\u18CF\u18D1\u18D3\u18D5\u6551;\u656C;\u6563;\u6560;\u656B;\u6562;\u655Fox;\u69C9\u0200LRlr\u18E4\u18E6\u18E8\u18EA;\u6555;\u6552;\u6510;\u650C\u0280;DUdu\u06BD\u18F7\u18F9\u18FB\u18FD;\u6565;\u6568;\u652C;\u6534inus;\u629Flus;\u629Eimes;\u62A0\u0200LRlr\u1919\u191B\u191D\u191F;\u655B;\u6558;\u6518;\u6514\u0380;HLRhlr\u1930\u1931\u1933\u1935\u1937\u1939\u193B\u6502;\u656A;\u6561;\u655E;\u653C;\u6524;\u651C\u0100ev\u0123\u1942bar\u803B\xA6\u40A6\u0200ceio\u1951\u1956\u195A\u1960r;\uC000\u{1D4B7}mi;\u604Fm\u0100;e\u171A\u171Cl\u0180;bh\u1968\u1969\u196B\u405C;\u69C5sub;\u67C8\u016C\u1974\u197El\u0100;e\u1979\u197A\u6022t\xBB\u197Ap\u0180;Ee\u012F\u1985\u1987;\u6AAE\u0100;q\u06DC\u06DB\u0CE1\u19A7\0\u19E8\u1A11\u1A15\u1A32\0\u1A37\u1A50\0\0\u1AB4\0\0\u1AC1\0\0\u1B21\u1B2E\u1B4D\u1B52\0\u1BFD\0\u1C0C\u0180cpr\u19AD\u19B2\u19DDute;\u4107\u0300;abcds\u19BF\u19C0\u19C4\u19CA\u19D5\u19D9\u6229nd;\u6A44rcup;\u6A49\u0100au\u19CF\u19D2p;\u6A4Bp;\u6A47ot;\u6A40;\uC000\u2229\uFE00\u0100eo\u19E2\u19E5t;\u6041\xEE\u0693\u0200aeiu\u19F0\u19FB\u1A01\u1A05\u01F0\u19F5\0\u19F8s;\u6A4Don;\u410Ddil\u803B\xE7\u40E7rc;\u4109ps\u0100;s\u1A0C\u1A0D\u6A4Cm;\u6A50ot;\u410B\u0180dmn\u1A1B\u1A20\u1A26il\u80BB\xB8\u01ADptyv;\u69B2t\u8100\xA2;e\u1A2D\u1A2E\u40A2r\xE4\u01B2r;\uC000\u{1D520}\u0180cei\u1A3D\u1A40\u1A4Dy;\u4447ck\u0100;m\u1A47\u1A48\u6713ark\xBB\u1A48;\u43C7r\u0380;Ecefms\u1A5F\u1A60\u1A62\u1A6B\u1AA4\u1AAA\u1AAE\u65CB;\u69C3\u0180;el\u1A69\u1A6A\u1A6D\u42C6q;\u6257e\u0261\u1A74\0\0\u1A88rrow\u0100lr\u1A7C\u1A81eft;\u61BAight;\u61BB\u0280RSacd\u1A92\u1A94\u1A96\u1A9A\u1A9F\xBB\u0F47;\u64C8st;\u629Birc;\u629Aash;\u629Dnint;\u6A10id;\u6AEFcir;\u69C2ubs\u0100;u\u1ABB\u1ABC\u6663it\xBB\u1ABC\u02EC\u1AC7\u1AD4\u1AFA\0\u1B0Aon\u0100;e\u1ACD\u1ACE\u403A\u0100;q\xC7\xC6\u026D\u1AD9\0\0\u1AE2a\u0100;t\u1ADE\u1ADF\u402C;\u4040\u0180;fl\u1AE8\u1AE9\u1AEB\u6201\xEE\u1160e\u0100mx\u1AF1\u1AF6ent\xBB\u1AE9e\xF3\u024D\u01E7\u1AFE\0\u1B07\u0100;d\u12BB\u1B02ot;\u6A6Dn\xF4\u0246\u0180fry\u1B10\u1B14\u1B17;\uC000\u{1D554}o\xE4\u0254\u8100\xA9;s\u0155\u1B1Dr;\u6117\u0100ao\u1B25\u1B29rr;\u61B5ss;\u6717\u0100cu\u1B32\u1B37r;\uC000\u{1D4B8}\u0100bp\u1B3C\u1B44\u0100;e\u1B41\u1B42\u6ACF;\u6AD1\u0100;e\u1B49\u1B4A\u6AD0;\u6AD2dot;\u62EF\u0380delprvw\u1B60\u1B6C\u1B77\u1B82\u1BAC\u1BD4\u1BF9arr\u0100lr\u1B68\u1B6A;\u6938;\u6935\u0270\u1B72\0\0\u1B75r;\u62DEc;\u62DFarr\u0100;p\u1B7F\u1B80\u61B6;\u693D\u0300;bcdos\u1B8F\u1B90\u1B96\u1BA1\u1BA5\u1BA8\u622Arcap;\u6A48\u0100au\u1B9B\u1B9Ep;\u6A46p;\u6A4Aot;\u628Dr;\u6A45;\uC000\u222A\uFE00\u0200alrv\u1BB5\u1BBF\u1BDE\u1BE3rr\u0100;m\u1BBC\u1BBD\u61B7;\u693Cy\u0180evw\u1BC7\u1BD4\u1BD8q\u0270\u1BCE\0\0\u1BD2re\xE3\u1B73u\xE3\u1B75ee;\u62CEedge;\u62CFen\u803B\xA4\u40A4earrow\u0100lr\u1BEE\u1BF3eft\xBB\u1B80ight\xBB\u1BBDe\xE4\u1BDD\u0100ci\u1C01\u1C07onin\xF4\u01F7nt;\u6231lcty;\u632D\u0980AHabcdefhijlorstuwz\u1C38\u1C3B\u1C3F\u1C5D\u1C69\u1C75\u1C8A\u1C9E\u1CAC\u1CB7\u1CFB\u1CFF\u1D0D\u1D7B\u1D91\u1DAB\u1DBB\u1DC6\u1DCDr\xF2\u0381ar;\u6965\u0200glrs\u1C48\u1C4D\u1C52\u1C54ger;\u6020eth;\u6138\xF2\u1133h\u0100;v\u1C5A\u1C5B\u6010\xBB\u090A\u016B\u1C61\u1C67arow;\u690Fa\xE3\u0315\u0100ay\u1C6E\u1C73ron;\u410F;\u4434\u0180;ao\u0332\u1C7C\u1C84\u0100gr\u02BF\u1C81r;\u61CAtseq;\u6A77\u0180glm\u1C91\u1C94\u1C98\u803B\xB0\u40B0ta;\u43B4ptyv;\u69B1\u0100ir\u1CA3\u1CA8sht;\u697F;\uC000\u{1D521}ar\u0100lr\u1CB3\u1CB5\xBB\u08DC\xBB\u101E\u0280aegsv\u1CC2\u0378\u1CD6\u1CDC\u1CE0m\u0180;os\u0326\u1CCA\u1CD4nd\u0100;s\u0326\u1CD1uit;\u6666amma;\u43DDin;\u62F2\u0180;io\u1CE7\u1CE8\u1CF8\u40F7de\u8100\xF7;o\u1CE7\u1CF0ntimes;\u62C7n\xF8\u1CF7cy;\u4452c\u026F\u1D06\0\0\u1D0Arn;\u631Eop;\u630D\u0280lptuw\u1D18\u1D1D\u1D22\u1D49\u1D55lar;\u4024f;\uC000\u{1D555}\u0280;emps\u030B\u1D2D\u1D37\u1D3D\u1D42q\u0100;d\u0352\u1D33ot;\u6251inus;\u6238lus;\u6214quare;\u62A1blebarwedg\xE5\xFAn\u0180adh\u112E\u1D5D\u1D67ownarrow\xF3\u1C83arpoon\u0100lr\u1D72\u1D76ef\xF4\u1CB4igh\xF4\u1CB6\u0162\u1D7F\u1D85karo\xF7\u0F42\u026F\u1D8A\0\0\u1D8Ern;\u631Fop;\u630C\u0180cot\u1D98\u1DA3\u1DA6\u0100ry\u1D9D\u1DA1;\uC000\u{1D4B9};\u4455l;\u69F6rok;\u4111\u0100dr\u1DB0\u1DB4ot;\u62F1i\u0100;f\u1DBA\u1816\u65BF\u0100ah\u1DC0\u1DC3r\xF2\u0429a\xF2\u0FA6angle;\u69A6\u0100ci\u1DD2\u1DD5y;\u445Fgrarr;\u67FF\u0900Dacdefglmnopqrstux\u1E01\u1E09\u1E19\u1E38\u0578\u1E3C\u1E49\u1E61\u1E7E\u1EA5\u1EAF\u1EBD\u1EE1\u1F2A\u1F37\u1F44\u1F4E\u1F5A\u0100Do\u1E06\u1D34o\xF4\u1C89\u0100cs\u1E0E\u1E14ute\u803B\xE9\u40E9ter;\u6A6E\u0200aioy\u1E22\u1E27\u1E31\u1E36ron;\u411Br\u0100;c\u1E2D\u1E2E\u6256\u803B\xEA\u40EAlon;\u6255;\u444Dot;\u4117\u0100Dr\u1E41\u1E45ot;\u6252;\uC000\u{1D522}\u0180;rs\u1E50\u1E51\u1E57\u6A9Aave\u803B\xE8\u40E8\u0100;d\u1E5C\u1E5D\u6A96ot;\u6A98\u0200;ils\u1E6A\u1E6B\u1E72\u1E74\u6A99nters;\u63E7;\u6113\u0100;d\u1E79\u1E7A\u6A95ot;\u6A97\u0180aps\u1E85\u1E89\u1E97cr;\u4113ty\u0180;sv\u1E92\u1E93\u1E95\u6205et\xBB\u1E93p\u01001;\u1E9D\u1EA4\u0133\u1EA1\u1EA3;\u6004;\u6005\u6003\u0100gs\u1EAA\u1EAC;\u414Bp;\u6002\u0100gp\u1EB4\u1EB8on;\u4119f;\uC000\u{1D556}\u0180als\u1EC4\u1ECE\u1ED2r\u0100;s\u1ECA\u1ECB\u62D5l;\u69E3us;\u6A71i\u0180;lv\u1EDA\u1EDB\u1EDF\u43B5on\xBB\u1EDB;\u43F5\u0200csuv\u1EEA\u1EF3\u1F0B\u1F23\u0100io\u1EEF\u1E31rc\xBB\u1E2E\u0269\u1EF9\0\0\u1EFB\xED\u0548ant\u0100gl\u1F02\u1F06tr\xBB\u1E5Dess\xBB\u1E7A\u0180aei\u1F12\u1F16\u1F1Als;\u403Dst;\u625Fv\u0100;D\u0235\u1F20D;\u6A78parsl;\u69E5\u0100Da\u1F2F\u1F33ot;\u6253rr;\u6971\u0180cdi\u1F3E\u1F41\u1EF8r;\u612Fo\xF4\u0352\u0100ah\u1F49\u1F4B;\u43B7\u803B\xF0\u40F0\u0100mr\u1F53\u1F57l\u803B\xEB\u40EBo;\u60AC\u0180cip\u1F61\u1F64\u1F67l;\u4021s\xF4\u056E\u0100eo\u1F6C\u1F74ctatio\xEE\u0559nential\xE5\u0579\u09E1\u1F92\0\u1F9E\0\u1FA1\u1FA7\0\0\u1FC6\u1FCC\0\u1FD3\0\u1FE6\u1FEA\u2000\0\u2008\u205Allingdotse\xF1\u1E44y;\u4444male;\u6640\u0180ilr\u1FAD\u1FB3\u1FC1lig;\u8000\uFB03\u0269\u1FB9\0\0\u1FBDg;\u8000\uFB00ig;\u8000\uFB04;\uC000\u{1D523}lig;\u8000\uFB01lig;\uC000fj\u0180alt\u1FD9\u1FDC\u1FE1t;\u666Dig;\u8000\uFB02ns;\u65B1of;\u4192\u01F0\u1FEE\0\u1FF3f;\uC000\u{1D557}\u0100ak\u05BF\u1FF7\u0100;v\u1FFC\u1FFD\u62D4;\u6AD9artint;\u6A0D\u0100ao\u200C\u2055\u0100cs\u2011\u2052\u03B1\u201A\u2030\u2038\u2045\u2048\0\u2050\u03B2\u2022\u2025\u2027\u202A\u202C\0\u202E\u803B\xBD\u40BD;\u6153\u803B\xBC\u40BC;\u6155;\u6159;\u615B\u01B3\u2034\0\u2036;\u6154;\u6156\u02B4\u203E\u2041\0\0\u2043\u803B\xBE\u40BE;\u6157;\u615C5;\u6158\u01B6\u204C\0\u204E;\u615A;\u615D8;\u615El;\u6044wn;\u6322cr;\uC000\u{1D4BB}\u0880Eabcdefgijlnorstv\u2082\u2089\u209F\u20A5\u20B0\u20B4\u20F0\u20F5\u20FA\u20FF\u2103\u2112\u2138\u0317\u213E\u2152\u219E\u0100;l\u064D\u2087;\u6A8C\u0180cmp\u2090\u2095\u209Dute;\u41F5ma\u0100;d\u209C\u1CDA\u43B3;\u6A86reve;\u411F\u0100iy\u20AA\u20AErc;\u411D;\u4433ot;\u4121\u0200;lqs\u063E\u0642\u20BD\u20C9\u0180;qs\u063E\u064C\u20C4lan\xF4\u0665\u0200;cdl\u0665\u20D2\u20D5\u20E5c;\u6AA9ot\u0100;o\u20DC\u20DD\u6A80\u0100;l\u20E2\u20E3\u6A82;\u6A84\u0100;e\u20EA\u20ED\uC000\u22DB\uFE00s;\u6A94r;\uC000\u{1D524}\u0100;g\u0673\u061Bmel;\u6137cy;\u4453\u0200;Eaj\u065A\u210C\u210E\u2110;\u6A92;\u6AA5;\u6AA4\u0200Eaes\u211B\u211D\u2129\u2134;\u6269p\u0100;p\u2123\u2124\u6A8Arox\xBB\u2124\u0100;q\u212E\u212F\u6A88\u0100;q\u212E\u211Bim;\u62E7pf;\uC000\u{1D558}\u0100ci\u2143\u2146r;\u610Am\u0180;el\u066B\u214E\u2150;\u6A8E;\u6A90\u8300>;cdlqr\u05EE\u2160\u216A\u216E\u2173\u2179\u0100ci\u2165\u2167;\u6AA7r;\u6A7Aot;\u62D7Par;\u6995uest;\u6A7C\u0280adels\u2184\u216A\u2190\u0656\u219B\u01F0\u2189\0\u218Epro\xF8\u209Er;\u6978q\u0100lq\u063F\u2196les\xF3\u2088i\xED\u066B\u0100en\u21A3\u21ADrtneqq;\uC000\u2269\uFE00\xC5\u21AA\u0500Aabcefkosy\u21C4\u21C7\u21F1\u21F5\u21FA\u2218\u221D\u222F\u2268\u227Dr\xF2\u03A0\u0200ilmr\u21D0\u21D4\u21D7\u21DBrs\xF0\u1484f\xBB\u2024il\xF4\u06A9\u0100dr\u21E0\u21E4cy;\u444A\u0180;cw\u08F4\u21EB\u21EFir;\u6948;\u61ADar;\u610Firc;\u4125\u0180alr\u2201\u220E\u2213rts\u0100;u\u2209\u220A\u6665it\xBB\u220Alip;\u6026con;\u62B9r;\uC000\u{1D525}s\u0100ew\u2223\u2229arow;\u6925arow;\u6926\u0280amopr\u223A\u223E\u2243\u225E\u2263rr;\u61FFtht;\u623Bk\u0100lr\u2249\u2253eftarrow;\u61A9ightarrow;\u61AAf;\uC000\u{1D559}bar;\u6015\u0180clt\u226F\u2274\u2278r;\uC000\u{1D4BD}as\xE8\u21F4rok;\u4127\u0100bp\u2282\u2287ull;\u6043hen\xBB\u1C5B\u0AE1\u22A3\0\u22AA\0\u22B8\u22C5\u22CE\0\u22D5\u22F3\0\0\u22F8\u2322\u2367\u2362\u237F\0\u2386\u23AA\u23B4cute\u803B\xED\u40ED\u0180;iy\u0771\u22B0\u22B5rc\u803B\xEE\u40EE;\u4438\u0100cx\u22BC\u22BFy;\u4435cl\u803B\xA1\u40A1\u0100fr\u039F\u22C9;\uC000\u{1D526}rave\u803B\xEC\u40EC\u0200;ino\u073E\u22DD\u22E9\u22EE\u0100in\u22E2\u22E6nt;\u6A0Ct;\u622Dfin;\u69DCta;\u6129lig;\u4133\u0180aop\u22FE\u231A\u231D\u0180cgt\u2305\u2308\u2317r;\u412B\u0180elp\u071F\u230F\u2313in\xE5\u078Ear\xF4\u0720h;\u4131f;\u62B7ed;\u41B5\u0280;cfot\u04F4\u232C\u2331\u233D\u2341are;\u6105in\u0100;t\u2338\u2339\u621Eie;\u69DDdo\xF4\u2319\u0280;celp\u0757\u234C\u2350\u235B\u2361al;\u62BA\u0100gr\u2355\u2359er\xF3\u1563\xE3\u234Darhk;\u6A17rod;\u6A3C\u0200cgpt\u236F\u2372\u2376\u237By;\u4451on;\u412Ff;\uC000\u{1D55A}a;\u43B9uest\u803B\xBF\u40BF\u0100ci\u238A\u238Fr;\uC000\u{1D4BE}n\u0280;Edsv\u04F4\u239B\u239D\u23A1\u04F3;\u62F9ot;\u62F5\u0100;v\u23A6\u23A7\u62F4;\u62F3\u0100;i\u0777\u23AElde;\u4129\u01EB\u23B8\0\u23BCcy;\u4456l\u803B\xEF\u40EF\u0300cfmosu\u23CC\u23D7\u23DC\u23E1\u23E7\u23F5\u0100iy\u23D1\u23D5rc;\u4135;\u4439r;\uC000\u{1D527}ath;\u4237pf;\uC000\u{1D55B}\u01E3\u23EC\0\u23F1r;\uC000\u{1D4BF}rcy;\u4458kcy;\u4454\u0400acfghjos\u240B\u2416\u2422\u2427\u242D\u2431\u2435\u243Bppa\u0100;v\u2413\u2414\u43BA;\u43F0\u0100ey\u241B\u2420dil;\u4137;\u443Ar;\uC000\u{1D528}reen;\u4138cy;\u4445cy;\u445Cpf;\uC000\u{1D55C}cr;\uC000\u{1D4C0}\u0B80ABEHabcdefghjlmnoprstuv\u2470\u2481\u2486\u248D\u2491\u250E\u253D\u255A\u2580\u264E\u265E\u2665\u2679\u267D\u269A\u26B2\u26D8\u275D\u2768\u278B\u27C0\u2801\u2812\u0180art\u2477\u247A\u247Cr\xF2\u09C6\xF2\u0395ail;\u691Barr;\u690E\u0100;g\u0994\u248B;\u6A8Bar;\u6962\u0963\u24A5\0\u24AA\0\u24B1\0\0\0\0\0\u24B5\u24BA\0\u24C6\u24C8\u24CD\0\u24F9ute;\u413Amptyv;\u69B4ra\xEE\u084Cbda;\u43BBg\u0180;dl\u088E\u24C1\u24C3;\u6991\xE5\u088E;\u6A85uo\u803B\xAB\u40ABr\u0400;bfhlpst\u0899\u24DE\u24E6\u24E9\u24EB\u24EE\u24F1\u24F5\u0100;f\u089D\u24E3s;\u691Fs;\u691D\xEB\u2252p;\u61ABl;\u6939im;\u6973l;\u61A2\u0180;ae\u24FF\u2500\u2504\u6AABil;\u6919\u0100;s\u2509\u250A\u6AAD;\uC000\u2AAD\uFE00\u0180abr\u2515\u2519\u251Drr;\u690Crk;\u6772\u0100ak\u2522\u252Cc\u0100ek\u2528\u252A;\u407B;\u405B\u0100es\u2531\u2533;\u698Bl\u0100du\u2539\u253B;\u698F;\u698D\u0200aeuy\u2546\u254B\u2556\u2558ron;\u413E\u0100di\u2550\u2554il;\u413C\xEC\u08B0\xE2\u2529;\u443B\u0200cqrs\u2563\u2566\u256D\u257Da;\u6936uo\u0100;r\u0E19\u1746\u0100du\u2572\u2577har;\u6967shar;\u694Bh;\u61B2\u0280;fgqs\u258B\u258C\u0989\u25F3\u25FF\u6264t\u0280ahlrt\u2598\u25A4\u25B7\u25C2\u25E8rrow\u0100;t\u0899\u25A1a\xE9\u24F6arpoon\u0100du\u25AF\u25B4own\xBB\u045Ap\xBB\u0966eftarrows;\u61C7ight\u0180ahs\u25CD\u25D6\u25DErrow\u0100;s\u08F4\u08A7arpoon\xF3\u0F98quigarro\xF7\u21F0hreetimes;\u62CB\u0180;qs\u258B\u0993\u25FAlan\xF4\u09AC\u0280;cdgs\u09AC\u260A\u260D\u261D\u2628c;\u6AA8ot\u0100;o\u2614\u2615\u6A7F\u0100;r\u261A\u261B\u6A81;\u6A83\u0100;e\u2622\u2625\uC000\u22DA\uFE00s;\u6A93\u0280adegs\u2633\u2639\u263D\u2649\u264Bppro\xF8\u24C6ot;\u62D6q\u0100gq\u2643\u2645\xF4\u0989gt\xF2\u248C\xF4\u099Bi\xED\u09B2\u0180ilr\u2655\u08E1\u265Asht;\u697C;\uC000\u{1D529}\u0100;E\u099C\u2663;\u6A91\u0161\u2669\u2676r\u0100du\u25B2\u266E\u0100;l\u0965\u2673;\u696Alk;\u6584cy;\u4459\u0280;acht\u0A48\u2688\u268B\u2691\u2696r\xF2\u25C1orne\xF2\u1D08ard;\u696Bri;\u65FA\u0100io\u269F\u26A4dot;\u4140ust\u0100;a\u26AC\u26AD\u63B0che\xBB\u26AD\u0200Eaes\u26BB\u26BD\u26C9\u26D4;\u6268p\u0100;p\u26C3\u26C4\u6A89rox\xBB\u26C4\u0100;q\u26CE\u26CF\u6A87\u0100;q\u26CE\u26BBim;\u62E6\u0400abnoptwz\u26E9\u26F4\u26F7\u271A\u272F\u2741\u2747\u2750\u0100nr\u26EE\u26F1g;\u67ECr;\u61FDr\xEB\u08C1g\u0180lmr\u26FF\u270D\u2714eft\u0100ar\u09E6\u2707ight\xE1\u09F2apsto;\u67FCight\xE1\u09FDparrow\u0100lr\u2725\u2729ef\xF4\u24EDight;\u61AC\u0180afl\u2736\u2739\u273Dr;\u6985;\uC000\u{1D55D}us;\u6A2Dimes;\u6A34\u0161\u274B\u274Fst;\u6217\xE1\u134E\u0180;ef\u2757\u2758\u1800\u65CAnge\xBB\u2758ar\u0100;l\u2764\u2765\u4028t;\u6993\u0280achmt\u2773\u2776\u277C\u2785\u2787r\xF2\u08A8orne\xF2\u1D8Car\u0100;d\u0F98\u2783;\u696D;\u600Eri;\u62BF\u0300achiqt\u2798\u279D\u0A40\u27A2\u27AE\u27BBquo;\u6039r;\uC000\u{1D4C1}m\u0180;eg\u09B2\u27AA\u27AC;\u6A8D;\u6A8F\u0100bu\u252A\u27B3o\u0100;r\u0E1F\u27B9;\u601Arok;\u4142\u8400<;cdhilqr\u082B\u27D2\u2639\u27DC\u27E0\u27E5\u27EA\u27F0\u0100ci\u27D7\u27D9;\u6AA6r;\u6A79re\xE5\u25F2mes;\u62C9arr;\u6976uest;\u6A7B\u0100Pi\u27F5\u27F9ar;\u6996\u0180;ef\u2800\u092D\u181B\u65C3r\u0100du\u2807\u280Dshar;\u694Ahar;\u6966\u0100en\u2817\u2821rtneqq;\uC000\u2268\uFE00\xC5\u281E\u0700Dacdefhilnopsu\u2840\u2845\u2882\u288E\u2893\u28A0\u28A5\u28A8\u28DA\u28E2\u28E4\u0A83\u28F3\u2902Dot;\u623A\u0200clpr\u284E\u2852\u2863\u287Dr\u803B\xAF\u40AF\u0100et\u2857\u2859;\u6642\u0100;e\u285E\u285F\u6720se\xBB\u285F\u0100;s\u103B\u2868to\u0200;dlu\u103B\u2873\u2877\u287Bow\xEE\u048Cef\xF4\u090F\xF0\u13D1ker;\u65AE\u0100oy\u2887\u288Cmma;\u6A29;\u443Cash;\u6014asuredangle\xBB\u1626r;\uC000\u{1D52A}o;\u6127\u0180cdn\u28AF\u28B4\u28C9ro\u803B\xB5\u40B5\u0200;acd\u1464\u28BD\u28C0\u28C4s\xF4\u16A7ir;\u6AF0ot\u80BB\xB7\u01B5us\u0180;bd\u28D2\u1903\u28D3\u6212\u0100;u\u1D3C\u28D8;\u6A2A\u0163\u28DE\u28E1p;\u6ADB\xF2\u2212\xF0\u0A81\u0100dp\u28E9\u28EEels;\u62A7f;\uC000\u{1D55E}\u0100ct\u28F8\u28FDr;\uC000\u{1D4C2}pos\xBB\u159D\u0180;lm\u2909\u290A\u290D\u43BCtimap;\u62B8\u0C00GLRVabcdefghijlmoprstuvw\u2942\u2953\u297E\u2989\u2998\u29DA\u29E9\u2A15\u2A1A\u2A58\u2A5D\u2A83\u2A95\u2AA4\u2AA8\u2B04\u2B07\u2B44\u2B7F\u2BAE\u2C34\u2C67\u2C7C\u2CE9\u0100gt\u2947\u294B;\uC000\u22D9\u0338\u0100;v\u2950\u0BCF\uC000\u226B\u20D2\u0180elt\u295A\u2972\u2976ft\u0100ar\u2961\u2967rrow;\u61CDightarrow;\u61CE;\uC000\u22D8\u0338\u0100;v\u297B\u0C47\uC000\u226A\u20D2ightarrow;\u61CF\u0100Dd\u298E\u2993ash;\u62AFash;\u62AE\u0280bcnpt\u29A3\u29A7\u29AC\u29B1\u29CCla\xBB\u02DEute;\u4144g;\uC000\u2220\u20D2\u0280;Eiop\u0D84\u29BC\u29C0\u29C5\u29C8;\uC000\u2A70\u0338d;\uC000\u224B\u0338s;\u4149ro\xF8\u0D84ur\u0100;a\u29D3\u29D4\u666El\u0100;s\u29D3\u0B38\u01F3\u29DF\0\u29E3p\u80BB\xA0\u0B37mp\u0100;e\u0BF9\u0C00\u0280aeouy\u29F4\u29FE\u2A03\u2A10\u2A13\u01F0\u29F9\0\u29FB;\u6A43on;\u4148dil;\u4146ng\u0100;d\u0D7E\u2A0Aot;\uC000\u2A6D\u0338p;\u6A42;\u443Dash;\u6013\u0380;Aadqsx\u0B92\u2A29\u2A2D\u2A3B\u2A41\u2A45\u2A50rr;\u61D7r\u0100hr\u2A33\u2A36k;\u6924\u0100;o\u13F2\u13F0ot;\uC000\u2250\u0338ui\xF6\u0B63\u0100ei\u2A4A\u2A4Ear;\u6928\xED\u0B98ist\u0100;s\u0BA0\u0B9Fr;\uC000\u{1D52B}\u0200Eest\u0BC5\u2A66\u2A79\u2A7C\u0180;qs\u0BBC\u2A6D\u0BE1\u0180;qs\u0BBC\u0BC5\u2A74lan\xF4\u0BE2i\xED\u0BEA\u0100;r\u0BB6\u2A81\xBB\u0BB7\u0180Aap\u2A8A\u2A8D\u2A91r\xF2\u2971rr;\u61AEar;\u6AF2\u0180;sv\u0F8D\u2A9C\u0F8C\u0100;d\u2AA1\u2AA2\u62FC;\u62FAcy;\u445A\u0380AEadest\u2AB7\u2ABA\u2ABE\u2AC2\u2AC5\u2AF6\u2AF9r\xF2\u2966;\uC000\u2266\u0338rr;\u619Ar;\u6025\u0200;fqs\u0C3B\u2ACE\u2AE3\u2AEFt\u0100ar\u2AD4\u2AD9rro\xF7\u2AC1ightarro\xF7\u2A90\u0180;qs\u0C3B\u2ABA\u2AEAlan\xF4\u0C55\u0100;s\u0C55\u2AF4\xBB\u0C36i\xED\u0C5D\u0100;r\u0C35\u2AFEi\u0100;e\u0C1A\u0C25i\xE4\u0D90\u0100pt\u2B0C\u2B11f;\uC000\u{1D55F}\u8180\xAC;in\u2B19\u2B1A\u2B36\u40ACn\u0200;Edv\u0B89\u2B24\u2B28\u2B2E;\uC000\u22F9\u0338ot;\uC000\u22F5\u0338\u01E1\u0B89\u2B33\u2B35;\u62F7;\u62F6i\u0100;v\u0CB8\u2B3C\u01E1\u0CB8\u2B41\u2B43;\u62FE;\u62FD\u0180aor\u2B4B\u2B63\u2B69r\u0200;ast\u0B7B\u2B55\u2B5A\u2B5Flle\xEC\u0B7Bl;\uC000\u2AFD\u20E5;\uC000\u2202\u0338lint;\u6A14\u0180;ce\u0C92\u2B70\u2B73u\xE5\u0CA5\u0100;c\u0C98\u2B78\u0100;e\u0C92\u2B7D\xF1\u0C98\u0200Aait\u2B88\u2B8B\u2B9D\u2BA7r\xF2\u2988rr\u0180;cw\u2B94\u2B95\u2B99\u619B;\uC000\u2933\u0338;\uC000\u219D\u0338ghtarrow\xBB\u2B95ri\u0100;e\u0CCB\u0CD6\u0380chimpqu\u2BBD\u2BCD\u2BD9\u2B04\u0B78\u2BE4\u2BEF\u0200;cer\u0D32\u2BC6\u0D37\u2BC9u\xE5\u0D45;\uC000\u{1D4C3}ort\u026D\u2B05\0\0\u2BD6ar\xE1\u2B56m\u0100;e\u0D6E\u2BDF\u0100;q\u0D74\u0D73su\u0100bp\u2BEB\u2BED\xE5\u0CF8\xE5\u0D0B\u0180bcp\u2BF6\u2C11\u2C19\u0200;Ees\u2BFF\u2C00\u0D22\u2C04\u6284;\uC000\u2AC5\u0338et\u0100;e\u0D1B\u2C0Bq\u0100;q\u0D23\u2C00c\u0100;e\u0D32\u2C17\xF1\u0D38\u0200;Ees\u2C22\u2C23\u0D5F\u2C27\u6285;\uC000\u2AC6\u0338et\u0100;e\u0D58\u2C2Eq\u0100;q\u0D60\u2C23\u0200gilr\u2C3D\u2C3F\u2C45\u2C47\xEC\u0BD7lde\u803B\xF1\u40F1\xE7\u0C43iangle\u0100lr\u2C52\u2C5Ceft\u0100;e\u0C1A\u2C5A\xF1\u0C26ight\u0100;e\u0CCB\u2C65\xF1\u0CD7\u0100;m\u2C6C\u2C6D\u43BD\u0180;es\u2C74\u2C75\u2C79\u4023ro;\u6116p;\u6007\u0480DHadgilrs\u2C8F\u2C94\u2C99\u2C9E\u2CA3\u2CB0\u2CB6\u2CD3\u2CE3ash;\u62ADarr;\u6904p;\uC000\u224D\u20D2ash;\u62AC\u0100et\u2CA8\u2CAC;\uC000\u2265\u20D2;\uC000>\u20D2nfin;\u69DE\u0180Aet\u2CBD\u2CC1\u2CC5rr;\u6902;\uC000\u2264\u20D2\u0100;r\u2CCA\u2CCD\uC000<\u20D2ie;\uC000\u22B4\u20D2\u0100At\u2CD8\u2CDCrr;\u6903rie;\uC000\u22B5\u20D2im;\uC000\u223C\u20D2\u0180Aan\u2CF0\u2CF4\u2D02rr;\u61D6r\u0100hr\u2CFA\u2CFDk;\u6923\u0100;o\u13E7\u13E5ear;\u6927\u1253\u1A95\0\0\0\0\0\0\0\0\0\0\0\0\0\u2D2D\0\u2D38\u2D48\u2D60\u2D65\u2D72\u2D84\u1B07\0\0\u2D8D\u2DAB\0\u2DC8\u2DCE\0\u2DDC\u2E19\u2E2B\u2E3E\u2E43\u0100cs\u2D31\u1A97ute\u803B\xF3\u40F3\u0100iy\u2D3C\u2D45r\u0100;c\u1A9E\u2D42\u803B\xF4\u40F4;\u443E\u0280abios\u1AA0\u2D52\u2D57\u01C8\u2D5Alac;\u4151v;\u6A38old;\u69BClig;\u4153\u0100cr\u2D69\u2D6Dir;\u69BF;\uC000\u{1D52C}\u036F\u2D79\0\0\u2D7C\0\u2D82n;\u42DBave\u803B\xF2\u40F2;\u69C1\u0100bm\u2D88\u0DF4ar;\u69B5\u0200acit\u2D95\u2D98\u2DA5\u2DA8r\xF2\u1A80\u0100ir\u2D9D\u2DA0r;\u69BEoss;\u69BBn\xE5\u0E52;\u69C0\u0180aei\u2DB1\u2DB5\u2DB9cr;\u414Dga;\u43C9\u0180cdn\u2DC0\u2DC5\u01CDron;\u43BF;\u69B6pf;\uC000\u{1D560}\u0180ael\u2DD4\u2DD7\u01D2r;\u69B7rp;\u69B9\u0380;adiosv\u2DEA\u2DEB\u2DEE\u2E08\u2E0D\u2E10\u2E16\u6228r\xF2\u1A86\u0200;efm\u2DF7\u2DF8\u2E02\u2E05\u6A5Dr\u0100;o\u2DFE\u2DFF\u6134f\xBB\u2DFF\u803B\xAA\u40AA\u803B\xBA\u40BAgof;\u62B6r;\u6A56lope;\u6A57;\u6A5B\u0180clo\u2E1F\u2E21\u2E27\xF2\u2E01ash\u803B\xF8\u40F8l;\u6298i\u016C\u2E2F\u2E34de\u803B\xF5\u40F5es\u0100;a\u01DB\u2E3As;\u6A36ml\u803B\xF6\u40F6bar;\u633D\u0AE1\u2E5E\0\u2E7D\0\u2E80\u2E9D\0\u2EA2\u2EB9\0\0\u2ECB\u0E9C\0\u2F13\0\0\u2F2B\u2FBC\0\u2FC8r\u0200;ast\u0403\u2E67\u2E72\u0E85\u8100\xB6;l\u2E6D\u2E6E\u40B6le\xEC\u0403\u0269\u2E78\0\0\u2E7Bm;\u6AF3;\u6AFDy;\u443Fr\u0280cimpt\u2E8B\u2E8F\u2E93\u1865\u2E97nt;\u4025od;\u402Eil;\u6030enk;\u6031r;\uC000\u{1D52D}\u0180imo\u2EA8\u2EB0\u2EB4\u0100;v\u2EAD\u2EAE\u43C6;\u43D5ma\xF4\u0A76ne;\u660E\u0180;tv\u2EBF\u2EC0\u2EC8\u43C0chfork\xBB\u1FFD;\u43D6\u0100au\u2ECF\u2EDFn\u0100ck\u2ED5\u2EDDk\u0100;h\u21F4\u2EDB;\u610E\xF6\u21F4s\u0480;abcdemst\u2EF3\u2EF4\u1908\u2EF9\u2EFD\u2F04\u2F06\u2F0A\u2F0E\u402Bcir;\u6A23ir;\u6A22\u0100ou\u1D40\u2F02;\u6A25;\u6A72n\u80BB\xB1\u0E9Dim;\u6A26wo;\u6A27\u0180ipu\u2F19\u2F20\u2F25ntint;\u6A15f;\uC000\u{1D561}nd\u803B\xA3\u40A3\u0500;Eaceinosu\u0EC8\u2F3F\u2F41\u2F44\u2F47\u2F81\u2F89\u2F92\u2F7E\u2FB6;\u6AB3p;\u6AB7u\xE5\u0ED9\u0100;c\u0ECE\u2F4C\u0300;acens\u0EC8\u2F59\u2F5F\u2F66\u2F68\u2F7Eppro\xF8\u2F43urlye\xF1\u0ED9\xF1\u0ECE\u0180aes\u2F6F\u2F76\u2F7Approx;\u6AB9qq;\u6AB5im;\u62E8i\xED\u0EDFme\u0100;s\u2F88\u0EAE\u6032\u0180Eas\u2F78\u2F90\u2F7A\xF0\u2F75\u0180dfp\u0EEC\u2F99\u2FAF\u0180als\u2FA0\u2FA5\u2FAAlar;\u632Eine;\u6312urf;\u6313\u0100;t\u0EFB\u2FB4\xEF\u0EFBrel;\u62B0\u0100ci\u2FC0\u2FC5r;\uC000\u{1D4C5};\u43C8ncsp;\u6008\u0300fiopsu\u2FDA\u22E2\u2FDF\u2FE5\u2FEB\u2FF1r;\uC000\u{1D52E}pf;\uC000\u{1D562}rime;\u6057cr;\uC000\u{1D4C6}\u0180aeo\u2FF8\u3009\u3013t\u0100ei\u2FFE\u3005rnion\xF3\u06B0nt;\u6A16st\u0100;e\u3010\u3011\u403F\xF1\u1F19\xF4\u0F14\u0A80ABHabcdefhilmnoprstux\u3040\u3051\u3055\u3059\u30E0\u310E\u312B\u3147\u3162\u3172\u318E\u3206\u3215\u3224\u3229\u3258\u326E\u3272\u3290\u32B0\u32B7\u0180art\u3047\u304A\u304Cr\xF2\u10B3\xF2\u03DDail;\u691Car\xF2\u1C65ar;\u6964\u0380cdenqrt\u3068\u3075\u3078\u307F\u308F\u3094\u30CC\u0100eu\u306D\u3071;\uC000\u223D\u0331te;\u4155i\xE3\u116Emptyv;\u69B3g\u0200;del\u0FD1\u3089\u308B\u308D;\u6992;\u69A5\xE5\u0FD1uo\u803B\xBB\u40BBr\u0580;abcfhlpstw\u0FDC\u30AC\u30AF\u30B7\u30B9\u30BC\u30BE\u30C0\u30C3\u30C7\u30CAp;\u6975\u0100;f\u0FE0\u30B4s;\u6920;\u6933s;\u691E\xEB\u225D\xF0\u272El;\u6945im;\u6974l;\u61A3;\u619D\u0100ai\u30D1\u30D5il;\u691Ao\u0100;n\u30DB\u30DC\u6236al\xF3\u0F1E\u0180abr\u30E7\u30EA\u30EEr\xF2\u17E5rk;\u6773\u0100ak\u30F3\u30FDc\u0100ek\u30F9\u30FB;\u407D;\u405D\u0100es\u3102\u3104;\u698Cl\u0100du\u310A\u310C;\u698E;\u6990\u0200aeuy\u3117\u311C\u3127\u3129ron;\u4159\u0100di\u3121\u3125il;\u4157\xEC\u0FF2\xE2\u30FA;\u4440\u0200clqs\u3134\u3137\u313D\u3144a;\u6937dhar;\u6969uo\u0100;r\u020E\u020Dh;\u61B3\u0180acg\u314E\u315F\u0F44l\u0200;ips\u0F78\u3158\u315B\u109Cn\xE5\u10BBar\xF4\u0FA9t;\u65AD\u0180ilr\u3169\u1023\u316Esht;\u697D;\uC000\u{1D52F}\u0100ao\u3177\u3186r\u0100du\u317D\u317F\xBB\u047B\u0100;l\u1091\u3184;\u696C\u0100;v\u318B\u318C\u43C1;\u43F1\u0180gns\u3195\u31F9\u31FCht\u0300ahlrst\u31A4\u31B0\u31C2\u31D8\u31E4\u31EErrow\u0100;t\u0FDC\u31ADa\xE9\u30C8arpoon\u0100du\u31BB\u31BFow\xEE\u317Ep\xBB\u1092eft\u0100ah\u31CA\u31D0rrow\xF3\u0FEAarpoon\xF3\u0551ightarrows;\u61C9quigarro\xF7\u30CBhreetimes;\u62CCg;\u42DAingdotse\xF1\u1F32\u0180ahm\u320D\u3210\u3213r\xF2\u0FEAa\xF2\u0551;\u600Foust\u0100;a\u321E\u321F\u63B1che\xBB\u321Fmid;\u6AEE\u0200abpt\u3232\u323D\u3240\u3252\u0100nr\u3237\u323Ag;\u67EDr;\u61FEr\xEB\u1003\u0180afl\u3247\u324A\u324Er;\u6986;\uC000\u{1D563}us;\u6A2Eimes;\u6A35\u0100ap\u325D\u3267r\u0100;g\u3263\u3264\u4029t;\u6994olint;\u6A12ar\xF2\u31E3\u0200achq\u327B\u3280\u10BC\u3285quo;\u603Ar;\uC000\u{1D4C7}\u0100bu\u30FB\u328Ao\u0100;r\u0214\u0213\u0180hir\u3297\u329B\u32A0re\xE5\u31F8mes;\u62CAi\u0200;efl\u32AA\u1059\u1821\u32AB\u65B9tri;\u69CEluhar;\u6968;\u611E\u0D61\u32D5\u32DB\u32DF\u332C\u3338\u3371\0\u337A\u33A4\0\0\u33EC\u33F0\0\u3428\u3448\u345A\u34AD\u34B1\u34CA\u34F1\0\u3616\0\0\u3633cute;\u415Bqu\xEF\u27BA\u0500;Eaceinpsy\u11ED\u32F3\u32F5\u32FF\u3302\u330B\u330F\u331F\u3326\u3329;\u6AB4\u01F0\u32FA\0\u32FC;\u6AB8on;\u4161u\xE5\u11FE\u0100;d\u11F3\u3307il;\u415Frc;\u415D\u0180Eas\u3316\u3318\u331B;\u6AB6p;\u6ABAim;\u62E9olint;\u6A13i\xED\u1204;\u4441ot\u0180;be\u3334\u1D47\u3335\u62C5;\u6A66\u0380Aacmstx\u3346\u334A\u3357\u335B\u335E\u3363\u336Drr;\u61D8r\u0100hr\u3350\u3352\xEB\u2228\u0100;o\u0A36\u0A34t\u803B\xA7\u40A7i;\u403Bwar;\u6929m\u0100in\u3369\xF0nu\xF3\xF1t;\u6736r\u0100;o\u3376\u2055\uC000\u{1D530}\u0200acoy\u3382\u3386\u3391\u33A0rp;\u666F\u0100hy\u338B\u338Fcy;\u4449;\u4448rt\u026D\u3399\0\0\u339Ci\xE4\u1464ara\xEC\u2E6F\u803B\xAD\u40AD\u0100gm\u33A8\u33B4ma\u0180;fv\u33B1\u33B2\u33B2\u43C3;\u43C2\u0400;deglnpr\u12AB\u33C5\u33C9\u33CE\u33D6\u33DE\u33E1\u33E6ot;\u6A6A\u0100;q\u12B1\u12B0\u0100;E\u33D3\u33D4\u6A9E;\u6AA0\u0100;E\u33DB\u33DC\u6A9D;\u6A9Fe;\u6246lus;\u6A24arr;\u6972ar\xF2\u113D\u0200aeit\u33F8\u3408\u340F\u3417\u0100ls\u33FD\u3404lsetm\xE9\u336Ahp;\u6A33parsl;\u69E4\u0100dl\u1463\u3414e;\u6323\u0100;e\u341C\u341D\u6AAA\u0100;s\u3422\u3423\u6AAC;\uC000\u2AAC\uFE00\u0180flp\u342E\u3433\u3442tcy;\u444C\u0100;b\u3438\u3439\u402F\u0100;a\u343E\u343F\u69C4r;\u633Ff;\uC000\u{1D564}a\u0100dr\u344D\u0402es\u0100;u\u3454\u3455\u6660it\xBB\u3455\u0180csu\u3460\u3479\u349F\u0100au\u3465\u346Fp\u0100;s\u1188\u346B;\uC000\u2293\uFE00p\u0100;s\u11B4\u3475;\uC000\u2294\uFE00u\u0100bp\u347F\u348F\u0180;es\u1197\u119C\u3486et\u0100;e\u1197\u348D\xF1\u119D\u0180;es\u11A8\u11AD\u3496et\u0100;e\u11A8\u349D\xF1\u11AE\u0180;af\u117B\u34A6\u05B0r\u0165\u34AB\u05B1\xBB\u117Car\xF2\u1148\u0200cemt\u34B9\u34BE\u34C2\u34C5r;\uC000\u{1D4C8}tm\xEE\xF1i\xEC\u3415ar\xE6\u11BE\u0100ar\u34CE\u34D5r\u0100;f\u34D4\u17BF\u6606\u0100an\u34DA\u34EDight\u0100ep\u34E3\u34EApsilo\xEE\u1EE0h\xE9\u2EAFs\xBB\u2852\u0280bcmnp\u34FB\u355E\u1209\u358B\u358E\u0480;Edemnprs\u350E\u350F\u3511\u3515\u351E\u3523\u352C\u3531\u3536\u6282;\u6AC5ot;\u6ABD\u0100;d\u11DA\u351Aot;\u6AC3ult;\u6AC1\u0100Ee\u3528\u352A;\u6ACB;\u628Alus;\u6ABFarr;\u6979\u0180eiu\u353D\u3552\u3555t\u0180;en\u350E\u3545\u354Bq\u0100;q\u11DA\u350Feq\u0100;q\u352B\u3528m;\u6AC7\u0100bp\u355A\u355C;\u6AD5;\u6AD3c\u0300;acens\u11ED\u356C\u3572\u3579\u357B\u3326ppro\xF8\u32FAurlye\xF1\u11FE\xF1\u11F3\u0180aes\u3582\u3588\u331Bppro\xF8\u331Aq\xF1\u3317g;\u666A\u0680123;Edehlmnps\u35A9\u35AC\u35AF\u121C\u35B2\u35B4\u35C0\u35C9\u35D5\u35DA\u35DF\u35E8\u35ED\u803B\xB9\u40B9\u803B\xB2\u40B2\u803B\xB3\u40B3;\u6AC6\u0100os\u35B9\u35BCt;\u6ABEub;\u6AD8\u0100;d\u1222\u35C5ot;\u6AC4s\u0100ou\u35CF\u35D2l;\u67C9b;\u6AD7arr;\u697Bult;\u6AC2\u0100Ee\u35E4\u35E6;\u6ACC;\u628Blus;\u6AC0\u0180eiu\u35F4\u3609\u360Ct\u0180;en\u121C\u35FC\u3602q\u0100;q\u1222\u35B2eq\u0100;q\u35E7\u35E4m;\u6AC8\u0100bp\u3611\u3613;\u6AD4;\u6AD6\u0180Aan\u361C\u3620\u362Drr;\u61D9r\u0100hr\u3626\u3628\xEB\u222E\u0100;o\u0A2B\u0A29war;\u692Alig\u803B\xDF\u40DF\u0BE1\u3651\u365D\u3660\u12CE\u3673\u3679\0\u367E\u36C2\0\0\0\0\0\u36DB\u3703\0\u3709\u376C\0\0\0\u3787\u0272\u3656\0\0\u365Bget;\u6316;\u43C4r\xEB\u0E5F\u0180aey\u3666\u366B\u3670ron;\u4165dil;\u4163;\u4442lrec;\u6315r;\uC000\u{1D531}\u0200eiko\u3686\u369D\u36B5\u36BC\u01F2\u368B\0\u3691e\u01004f\u1284\u1281a\u0180;sv\u3698\u3699\u369B\u43B8ym;\u43D1\u0100cn\u36A2\u36B2k\u0100as\u36A8\u36AEppro\xF8\u12C1im\xBB\u12ACs\xF0\u129E\u0100as\u36BA\u36AE\xF0\u12C1rn\u803B\xFE\u40FE\u01EC\u031F\u36C6\u22E7es\u8180\xD7;bd\u36CF\u36D0\u36D8\u40D7\u0100;a\u190F\u36D5r;\u6A31;\u6A30\u0180eps\u36E1\u36E3\u3700\xE1\u2A4D\u0200;bcf\u0486\u36EC\u36F0\u36F4ot;\u6336ir;\u6AF1\u0100;o\u36F9\u36FC\uC000\u{1D565}rk;\u6ADA\xE1\u3362rime;\u6034\u0180aip\u370F\u3712\u3764d\xE5\u1248\u0380adempst\u3721\u374D\u3740\u3751\u3757\u375C\u375Fngle\u0280;dlqr\u3730\u3731\u3736\u3740\u3742\u65B5own\xBB\u1DBBeft\u0100;e\u2800\u373E\xF1\u092E;\u625Cight\u0100;e\u32AA\u374B\xF1\u105Aot;\u65ECinus;\u6A3Alus;\u6A39b;\u69CDime;\u6A3Bezium;\u63E2\u0180cht\u3772\u377D\u3781\u0100ry\u3777\u377B;\uC000\u{1D4C9};\u4446cy;\u445Brok;\u4167\u0100io\u378B\u378Ex\xF4\u1777head\u0100lr\u3797\u37A0eftarro\xF7\u084Fightarrow\xBB\u0F5D\u0900AHabcdfghlmoprstuw\u37D0\u37D3\u37D7\u37E4\u37F0\u37FC\u380E\u381C\u3823\u3834\u3851\u385D\u386B\u38A9\u38CC\u38D2\u38EA\u38F6r\xF2\u03EDar;\u6963\u0100cr\u37DC\u37E2ute\u803B\xFA\u40FA\xF2\u1150r\u01E3\u37EA\0\u37EDy;\u445Eve;\u416D\u0100iy\u37F5\u37FArc\u803B\xFB\u40FB;\u4443\u0180abh\u3803\u3806\u380Br\xF2\u13ADlac;\u4171a\xF2\u13C3\u0100ir\u3813\u3818sht;\u697E;\uC000\u{1D532}rave\u803B\xF9\u40F9\u0161\u3827\u3831r\u0100lr\u382C\u382E\xBB\u0957\xBB\u1083lk;\u6580\u0100ct\u3839\u384D\u026F\u383F\0\0\u384Arn\u0100;e\u3845\u3846\u631Cr\xBB\u3846op;\u630Fri;\u65F8\u0100al\u3856\u385Acr;\u416B\u80BB\xA8\u0349\u0100gp\u3862\u3866on;\u4173f;\uC000\u{1D566}\u0300adhlsu\u114B\u3878\u387D\u1372\u3891\u38A0own\xE1\u13B3arpoon\u0100lr\u3888\u388Cef\xF4\u382Digh\xF4\u382Fi\u0180;hl\u3899\u389A\u389C\u43C5\xBB\u13FAon\xBB\u389Aparrows;\u61C8\u0180cit\u38B0\u38C4\u38C8\u026F\u38B6\0\0\u38C1rn\u0100;e\u38BC\u38BD\u631Dr\xBB\u38BDop;\u630Eng;\u416Fri;\u65F9cr;\uC000\u{1D4CA}\u0180dir\u38D9\u38DD\u38E2ot;\u62F0lde;\u4169i\u0100;f\u3730\u38E8\xBB\u1813\u0100am\u38EF\u38F2r\xF2\u38A8l\u803B\xFC\u40FCangle;\u69A7\u0780ABDacdeflnoprsz\u391C\u391F\u3929\u392D\u39B5\u39B8\u39BD\u39DF\u39E4\u39E8\u39F3\u39F9\u39FD\u3A01\u3A20r\xF2\u03F7ar\u0100;v\u3926\u3927\u6AE8;\u6AE9as\xE8\u03E1\u0100nr\u3932\u3937grt;\u699C\u0380eknprst\u34E3\u3946\u394B\u3952\u395D\u3964\u3996app\xE1\u2415othin\xE7\u1E96\u0180hir\u34EB\u2EC8\u3959op\xF4\u2FB5\u0100;h\u13B7\u3962\xEF\u318D\u0100iu\u3969\u396Dgm\xE1\u33B3\u0100bp\u3972\u3984setneq\u0100;q\u397D\u3980\uC000\u228A\uFE00;\uC000\u2ACB\uFE00setneq\u0100;q\u398F\u3992\uC000\u228B\uFE00;\uC000\u2ACC\uFE00\u0100hr\u399B\u399Fet\xE1\u369Ciangle\u0100lr\u39AA\u39AFeft\xBB\u0925ight\xBB\u1051y;\u4432ash\xBB\u1036\u0180elr\u39C4\u39D2\u39D7\u0180;be\u2DEA\u39CB\u39CFar;\u62BBq;\u625Alip;\u62EE\u0100bt\u39DC\u1468a\xF2\u1469r;\uC000\u{1D533}tr\xE9\u39AEsu\u0100bp\u39EF\u39F1\xBB\u0D1C\xBB\u0D59pf;\uC000\u{1D567}ro\xF0\u0EFBtr\xE9\u39B4\u0100cu\u3A06\u3A0Br;\uC000\u{1D4CB}\u0100bp\u3A10\u3A18n\u0100Ee\u3980\u3A16\xBB\u397En\u0100Ee\u3992\u3A1E\xBB\u3990igzag;\u699A\u0380cefoprs\u3A36\u3A3B\u3A56\u3A5B\u3A54\u3A61\u3A6Airc;\u4175\u0100di\u3A40\u3A51\u0100bg\u3A45\u3A49ar;\u6A5Fe\u0100;q\u15FA\u3A4F;\u6259erp;\u6118r;\uC000\u{1D534}pf;\uC000\u{1D568}\u0100;e\u1479\u3A66at\xE8\u1479cr;\uC000\u{1D4CC}\u0AE3\u178E\u3A87\0\u3A8B\0\u3A90\u3A9B\0\0\u3A9D\u3AA8\u3AAB\u3AAF\0\0\u3AC3\u3ACE\0\u3AD8\u17DC\u17DFtr\xE9\u17D1r;\uC000\u{1D535}\u0100Aa\u3A94\u3A97r\xF2\u03C3r\xF2\u09F6;\u43BE\u0100Aa\u3AA1\u3AA4r\xF2\u03B8r\xF2\u09EBa\xF0\u2713is;\u62FB\u0180dpt\u17A4\u3AB5\u3ABE\u0100fl\u3ABA\u17A9;\uC000\u{1D569}im\xE5\u17B2\u0100Aa\u3AC7\u3ACAr\xF2\u03CEr\xF2\u0A01\u0100cq\u3AD2\u17B8r;\uC000\u{1D4CD}\u0100pt\u17D6\u3ADCr\xE9\u17D4\u0400acefiosu\u3AF0\u3AFD\u3B08\u3B0C\u3B11\u3B15\u3B1B\u3B21c\u0100uy\u3AF6\u3AFBte\u803B\xFD\u40FD;\u444F\u0100iy\u3B02\u3B06rc;\u4177;\u444Bn\u803B\xA5\u40A5r;\uC000\u{1D536}cy;\u4457pf;\uC000\u{1D56A}cr;\uC000\u{1D4CE}\u0100cm\u3B26\u3B29y;\u444El\u803B\xFF\u40FF\u0500acdefhiosw\u3B42\u3B48\u3B54\u3B58\u3B64\u3B69\u3B6D\u3B74\u3B7A\u3B80cute;\u417A\u0100ay\u3B4D\u3B52ron;\u417E;\u4437ot;\u417C\u0100et\u3B5D\u3B61tr\xE6\u155Fa;\u43B6r;\uC000\u{1D537}cy;\u4436grarr;\u61DDpf;\uC000\u{1D56B}cr;\uC000\u{1D4CF}\u0100jn\u3B85\u3B87;\u600Dj;\u600C'.split("").map(e=>e.charCodeAt(0)));var av=new Uint16Array("\u0200aglq \x1B\u026D\0\0p;\u4026os;\u4027t;\u403Et;\u403Cuot;\u4022".split("").map(e=>e.charCodeAt(0)));var Ip,iS=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),Tp=(Ip=String.fromCodePoint)!==null&&Ip!==void 0?Ip:function(e){let t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),t+=String.fromCharCode(e),t};function Sp(e){var t;return e>=55296&&e<=57343||e>1114111?65533:(t=iS.get(e))!==null&&t!==void 0?t:e}var ge=(function(e){return e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z",e})(ge||{}),sS=32,sr=(function(e){return e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE",e})(sr||{});function Mp(e){return e>=ge.ZERO&&e<=ge.NINE}function uS(e){return e>=ge.UPPER_A&&e<=ge.UPPER_F||e>=ge.LOWER_A&&e<=ge.LOWER_F}function aS(e){return e>=ge.UPPER_A&&e<=ge.UPPER_Z||e>=ge.LOWER_A&&e<=ge.LOWER_Z||Mp(e)}function cS(e){return e===ge.EQUALS||aS(e)}var he=(function(e){return e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity",e})(he||{}),qt=(function(e){return e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute",e})(qt||{}),ka=class{constructor(t,n,r){this.decodeTree=t,this.emitCodePoint=n,this.errors=r,this.state=he.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=qt.Strict}startEntity(t){this.decodeMode=t,this.state=he.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(t,n){switch(this.state){case he.EntityStart:return t.charCodeAt(n)===ge.NUM?(this.state=he.NumericStart,this.consumed+=1,this.stateNumericStart(t,n+1)):(this.state=he.NamedEntity,this.stateNamedEntity(t,n));case he.NumericStart:return this.stateNumericStart(t,n);case he.NumericDecimal:return this.stateNumericDecimal(t,n);case he.NumericHex:return this.stateNumericHex(t,n);case he.NamedEntity:return this.stateNamedEntity(t,n)}}stateNumericStart(t,n){return n>=t.length?-1:(t.charCodeAt(n)|sS)===ge.LOWER_X?(this.state=he.NumericHex,this.consumed+=1,this.stateNumericHex(t,n+1)):(this.state=he.NumericDecimal,this.stateNumericDecimal(t,n))}addToNumericResult(t,n,r,o){if(n!==r){let i=r-n;this.result=this.result*Math.pow(o,i)+parseInt(t.substr(n,i),o),this.consumed+=i}}stateNumericHex(t,n){let r=n;for(;n>14;for(;n>14,i!==0){if(s===ge.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==qt.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var t;let{result:n,decodeTree:r}=this,o=(r[n]&sr.VALUE_LENGTH)>>14;return this.emitNamedEntityData(n,o,this.consumed),(t=this.errors)===null||t===void 0||t.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(t,n,r){let{decodeTree:o}=this;return this.emitCodePoint(n===1?o[t]&~sr.VALUE_LENGTH:o[t+1],r),n===3&&this.emitCodePoint(o[t+2],r),r}end(){var t;switch(this.state){case he.NamedEntity:return this.result!==0&&(this.decodeMode!==qt.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case he.NumericDecimal:return this.emitNumericEntity(0,2);case he.NumericHex:return this.emitNumericEntity(0,3);case he.NumericStart:return(t=this.errors)===null||t===void 0||t.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case he.EntityStart:return 0}}};function cv(e){let t="",n=new ka(e,r=>t+=Tp(r));return function(o,i){let s=0,u=0;for(;(u=o.indexOf("&",u))>=0;){t+=o.slice(s,u),n.startEntity(i);let c=n.write(o,u+1);if(c<0){s=u+n.end();break}s=u+c,u=c===0?s+1:s}let a=t+o.slice(s);return t="",a}}function lS(e,t,n,r){let o=(t&sr.BRANCH_LENGTH)>>7,i=t&sr.JUMP_TABLE;if(o===0)return i!==0&&r===i?n:-1;if(i){let a=r-i;return a<0||a>=o?-1:e[n+a]-1}let s=n,u=s+o-1;for(;s<=u;){let a=s+u>>>1,c=e[a];if(cr)u=a-1;else return e[a+o]}return-1}var dS=cv(uv),U$=cv(av);function Cn(e,t=qt.Legacy){return dS(e,t)}function Ra(e){for(let t=1;te.codePointAt(t):(e,t)=>(e.charCodeAt(t)&64512)===55296?(e.charCodeAt(t)-55296)*1024+e.charCodeAt(t+1)-56320+65536:e.charCodeAt(t);function Ap(e,t){return function(r){let o,i=0,s="";for(;o=e.exec(r);)i!==o.index&&(s+=r.substring(i,o.index)),s+=t.get(o[0].charCodeAt(0)),i=o.index+1;return s+r.substring(i)}}var lv=Ap(/[&<>'"]/g,pS),dv=Ap(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),fv=Ap(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]));function yS(e){return Object.prototype.toString.call(e)}function Fa(e){return yS(e)==="[object String]"}var bS=Object.prototype.hasOwnProperty;function vS(e,t){return bS.call(e,t)}function po(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){if(n){if(typeof n!="object")throw new TypeError(n+"must be object");Object.keys(n).forEach(function(r){e[r]=n[r]})}}),e}function kp(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function Oa(e){return!(e>=55296&&e<=57343||e>=64976&&e<=65007||(e&65535)===65535||(e&65535)===65534||e>=0&&e<=8||e===11||e>=14&&e<=31||e>=127&&e<=159||e>1114111)}function Ri(e){if(e>65535){e-=65536;let t=55296+(e>>10),n=56320+(e&1023);return String.fromCharCode(t,n)}return String.fromCharCode(e)}var gv=/\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g,DS=/&([a-z#][a-z0-9]{1,31});/gi,ES=new RegExp(gv.source+"|"+DS.source,"gi"),CS=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;function _S(e,t){if(t.charCodeAt(0)===35&&CS.test(t)){let r=t[1].toLowerCase()==="x"?parseInt(t.slice(2),16):parseInt(t.slice(1),10);return Oa(r)?Ri(r):e}let n=Cn(e);return n!==e?n:e}function wS(e){return e.indexOf("\\")<0?e:e.replace(gv,"$1")}function Gt(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(ES,function(t,n,r){return n||_S(t,r)})}var xS=/[&<>"]/,IS=/[&<>"]/g,TS={"&":"&","<":"<",">":">",'"':"""};function SS(e){return TS[e]}function Wt(e){return xS.test(e)?e.replace(IS,SS):e}var MS=/[.?*+^$[\]\\(){}|-]/g;function AS(e){return e.replace(MS,"\\$&")}function H(e){switch(e){case 9:case 32:return!0}return!1}function ur(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function ar(e){return fo.test(e)||Aa.test(e)}function cr(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function lr(e){return e=e.trim().replace(/\s+/g," "),"\u1E9E".toLowerCase()==="\u1E7E"&&(e=e.replace(/ẞ/g,"\xDF")),e.toLowerCase().toUpperCase()}var NS={mdurl:Ta,ucmicro:xp};var Lp={};pr(Lp,{parseLinkDestination:()=>Op,parseLinkLabel:()=>Fp,parseLinkTitle:()=>Pp});function Fp(e,t,n){let r,o,i,s,u=e.posMax,a=e.pos;for(e.pos=t+1,r=1;e.pos32))return i;if(r===41){if(s===0)break;s--}o++}return t===o||s!==0||(i.str=Gt(e.slice(t,o)),i.pos=o,i.ok=!0),i}function Pp(e,t,n,r){let o,i=t,s={ok:!1,can_continue:!1,pos:0,str:"",marker:0};if(r)s.str=r.str,s.marker=r.marker;else{if(i>=n)return s;let u=e.charCodeAt(i);if(u!==34&&u!==39&&u!==40)return s;t++,i++,u===40&&(u=41),s.marker=u}for(;i"+Wt(i.content)+""};wt.code_block=function(e,t,n,r,o){let i=e[t];return""+Wt(e[t].content)+` `};wt.fence=function(e,t,n,r,o){let i=e[t],s=i.info?Gt(i.info).trim():"",u="",a="";if(s){let l=s.split(/(\s+)/g);u=l[0],a=l.slice(2).join("")}let c;if(n.highlight?c=n.highlight(i.content,u,a)||Wt(i.content):c=Wt(i.content),c.indexOf("${c} `}return`
${c}
`};wt.image=function(e,t,n,r,o){let i=e[t];return i.attrs[i.attrIndex("alt")][1]=o.renderInlineAsText(i.children,n,r),o.renderToken(e,t,n)};wt.hardbreak=function(e,t,n){return n.xhtmlOut?`
`:`
`};wt.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?`
`:`
`:` `};wt.text=function(e,t){return Wt(e[t].content)};wt.html_block=function(e,t){return e[t].content};wt.html_inline=function(e,t){return e[t].content};function ho(){this.rules=po({},wt)}ho.prototype.renderAttrs=function(t){let n,r,o;if(!t.attrs)return"";for(o="",n=0,r=t.attrs.length;n `:">",i};ho.prototype.renderInline=function(e,t,n){let r="",o=this.rules;for(let i=0,s=e.length;i=0&&(r=this.attrs[n][1]),r};go.prototype.attrJoin=function(t,n){let r=this.attrIndex(t);r<0?this.attrPush([t,n]):this.attrs[r][1]=this.attrs[r][1]+" "+n};var Zt=go;function yv(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}yv.prototype.Token=Zt;var bv=yv;var kS=/\r\n?|\n/g,RS=/\0/g;function jp(e){let t;t=e.src.replace(kS,` `),t=t.replace(RS,"\uFFFD"),e.src=t}function Bp(e){let t;e.inlineMode?(t=new e.Token("inline","",0),t.content=e.src,t.map=[0,1],t.children=[],e.tokens.push(t)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}function Vp(e){let t=e.tokens;for(let n=0,r=t.length;n\s]/i.test(e)}function OS(e){return/^<\/a\s*>/i.test(e)}function Hp(e){let t=e.tokens;if(e.md.options.linkify)for(let n=0,r=t.length;n=0;s--){let u=o[s];if(u.type==="link_close"){for(s--;o[s].level!==u.level&&o[s].type!=="link_open";)s--;continue}if(u.type==="html_inline"&&(FS(u.content)&&i>0&&i--,OS(u.content)&&i++),!(i>0)&&u.type==="text"&&e.md.linkify.test(u.content)){let a=u.content,c=e.md.linkify.match(a),l=[],d=u.level,h=0;c.length>0&&c[0].index===0&&s>0&&o[s-1].type==="text_special"&&(c=c.slice(1));for(let f=0;fh){let F=new e.Token("text","",0);F.content=a.slice(h,y),F.level=d,l.push(F)}let v=new e.Token("link_open","a",1);v.attrs=[["href",m]],v.level=d++,v.markup="linkify",v.info="auto",l.push(v);let w=new e.Token("text","",0);w.content=g,w.level=d,l.push(w);let D=new e.Token("link_close","a",-1);D.level=--d,D.markup="linkify",D.info="auto",l.push(D),h=c[f].lastIndex}if(h=0;n--){let r=e[n];r.type==="text"&&!t&&(r.content=r.content.replace(LS,BS)),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function HS(e){let t=0;for(let n=e.length-1;n>=0;n--){let r=e[n];r.type==="text"&&!t&&vv.test(r.content)&&(r.content=r.content.replace(/\+-/g,"\xB1").replace(/\.{2,}/g,"\u2026").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1\u2014").replace(/(^|\s)--(?=\s|$)/mg,"$1\u2013").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1\u2013")),r.type==="link_open"&&r.info==="auto"&&t--,r.type==="link_close"&&r.info==="auto"&&t++}}function $p(e){let t;if(e.md.options.typographer)for(t=e.tokens.length-1;t>=0;t--)e.tokens[t].type==="inline"&&(PS.test(e.tokens[t].content)&&VS(e.tokens[t].children),vv.test(e.tokens[t].content)&&HS(e.tokens[t].children))}var $S=/['"]/,Dv=/['"]/g,Ev="\u2019";function Pa(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function US(e,t){let n,r=[];for(let o=0;o=0&&!(r[n].level<=s);n--);if(r.length=n+1,i.type!=="text")continue;let u=i.content,a=0,c=u.length;e:for(;a=0)p=u.charCodeAt(l.index-1);else for(n=o-1;n>=0&&!(e[n].type==="softbreak"||e[n].type==="hardbreak");n--)if(e[n].content){p=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a=48&&p<=57&&(h=d=!1),d&&h&&(d=g,h=y),!d&&!h){f&&(i.content=Pa(i.content,l.index,Ev));continue}if(h)for(n=r.length-1;n>=0;n--){let D=r[n];if(r[n].level=0;t--)e.tokens[t].type!=="inline"||!$S.test(e.tokens[t].content)||US(e.tokens[t].children,e)}function zp(e){let t,n,r=e.tokens,o=r.length;for(let i=0;i0&&this.level++,this.tokens.push(r),r};xt.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]};xt.prototype.skipEmptyLines=function(t){for(let n=this.lineMax;tn;)if(!H(this.src.charCodeAt(--t)))return t+1;return t};xt.prototype.skipChars=function(t,n){for(let r=this.src.length;tr;)if(n!==this.src.charCodeAt(--t))return t+1;return t};xt.prototype.getLines=function(t,n,r,o){if(t>=n)return"";let i=new Array(n-t);for(let s=0,u=t;ur?i[s]=new Array(a-r+1).join(" ")+this.src.slice(l,d):i[s]=this.src.slice(l,d)}return i.join("")};xt.prototype.Token=Zt;var _v=xt;var zS=65536;function Wp(e,t){let n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function wv(e){let t=[],n=e.length,r=0,o=e.charCodeAt(r),i=!1,s=0,u="";for(;rn)return!1;let o=t+1;if(e.sCount[o]=4)return!1;let i=e.bMarks[o]+e.tShift[o];if(i>=e.eMarks[o])return!1;let s=e.src.charCodeAt(i++);if(s!==124&&s!==45&&s!==58||i>=e.eMarks[o])return!1;let u=e.src.charCodeAt(i++);if(u!==124&&u!==45&&u!==58&&!H(u)||s===45&&H(u))return!1;for(;i=4)return!1;c=wv(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop();let d=c.length;if(d===0||d!==l.length)return!1;if(r)return!0;let h=e.parentType;e.parentType="table";let f=e.md.block.ruler.getRules("blockquote"),p=e.push("table_open","table",1),m=[t,0];p.map=m;let g=e.push("thead_open","thead",1);g.map=[t,t+1];let y=e.push("tr_open","tr",1);y.map=[t,t+1];for(let D=0;D=4||(c=wv(a),c.length&&c[0]===""&&c.shift(),c.length&&c[c.length-1]===""&&c.pop(),w+=d-c.length,w>zS))break;if(o===t+2){let E=e.push("tbody_open","tbody",1);E.map=v=[t+2,0]}let F=e.push("tr_open","tr",1);F.map=[o,o+1];for(let E=0;E=4){r++,o=r;continue}break}e.line=o;let i=e.push("code_block","code",0);return i.content=e.getLines(t,o,4+e.blkIndent,!1)+` `,i.map=[t,e.line],!0}function Qp(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||o+3>i)return!1;let s=e.src.charCodeAt(o);if(s!==126&&s!==96)return!1;let u=o;o=e.skipChars(o,s);let a=o-u;if(a<3)return!1;let c=e.src.slice(u,o),l=e.src.slice(o,i);if(s===96&&l.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let d=t,h=!1;for(;d++,!(d>=n||(o=u=e.bMarks[d]+e.tShift[d],i=e.eMarks[d],o=4)&&(o=e.skipChars(o,s),!(o-u=4||e.src.charCodeAt(o)!==62)return!1;if(r)return!0;let u=[],a=[],c=[],l=[],d=e.md.block.ruler.getRules("blockquote"),h=e.parentType;e.parentType="blockquote";let f=!1,p;for(p=t;p=i)break;if(e.src.charCodeAt(o++)===62&&!w){let F=e.sCount[p]+1,E,N;e.src.charCodeAt(o)===32?(o++,F++,N=!1,E=!0):e.src.charCodeAt(o)===9?(E=!0,(e.bsCount[p]+F)%4===3?(o++,F++,N=!1):N=!0):E=!1;let O=F;for(u.push(e.bMarks[p]),e.bMarks[p]=o;o=i,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(E?1:0),c.push(e.sCount[p]),e.sCount[p]=O-F,l.push(e.tShift[p]),e.tShift[p]=o-e.bMarks[p];continue}if(f)break;let D=!1;for(let F=0,E=d.length;F";let y=[t,0];g.map=y,e.md.block.tokenize(e,t,p);let v=e.push("blockquote_close","blockquote",-1);v.markup=">",e.lineMax=s,e.parentType=h,y[1]=e.line;for(let w=0;w=4)return!1;let i=e.bMarks[t]+e.tShift[t],s=e.src.charCodeAt(i++);if(s!==42&&s!==45&&s!==95)return!1;let u=1;for(;i=r)return-1;let i=e.src.charCodeAt(o++);if(i<48||i>57)return-1;for(;;){if(o>=r)return-1;if(i=e.src.charCodeAt(o++),i>=48&&i<=57){if(o-n>=10)return-1;continue}if(i===41||i===46)break;return-1}return o=4||e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]=e.blkIndent&&(l=!0);let d,h,f;if((f=Iv(e,a))>=0){if(d=!0,s=e.bMarks[a]+e.tShift[a],h=Number(e.src.slice(s,f-1)),l&&h!==1)return!1}else if((f=xv(e,a))>=0)d=!1;else return!1;if(l&&e.skipSpaces(f)>=e.eMarks[a])return!1;if(r)return!0;let p=e.src.charCodeAt(f-1),m=e.tokens.length;d?(u=e.push("ordered_list_open","ol",1),h!==1&&(u.attrs=[["start",h]])):u=e.push("bullet_list_open","ul",1);let g=[a,0];u.map=g,u.markup=String.fromCharCode(p);let y=!1,v=e.md.block.ruler.getRules("list"),w=e.parentType;for(e.parentType="list";a=o?N=1:N=F-D,N>4&&(N=1);let O=D+N;u=e.push("list_item_open","li",1),u.markup=String.fromCharCode(p);let J=[a,0];u.map=J,d&&(u.info=e.src.slice(s,f-1));let ct=e.tight,yo=e.tShift[a],Pi=e.sCount[a],Xv=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=O,e.tight=!0,e.tShift[a]=E-e.bMarks[a],e.sCount[a]=F,E>=o&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),(!e.tight||y)&&(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=Xv,e.tShift[a]=yo,e.sCount[a]=Pi,e.tight=ct,u=e.push("list_item_close","li",-1),u.markup=String.fromCharCode(p),a=e.line,J[1]=a,a>=n||e.sCount[a]=4)break;let Ah=!1;for(let fr=0,eD=v.length;fr=4||e.src.charCodeAt(o)!==91)return!1;function u(v){let w=e.lineMax;if(v>=w||e.isEmpty(v))return null;let D=!1;if(e.sCount[v]-e.blkIndent>3&&(D=!0),e.sCount[v]<0&&(D=!0),!D){let N=e.md.block.ruler.getRules("reference"),O=e.parentType;e.parentType="reference";let J=!1;for(let ct=0,yo=N.length;ct"u"&&(e.env.references={}),typeof e.env.references[y]>"u"&&(e.env.references[y]={title:g,href:d}),e.line=s),!0):!1}var Tv=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"];var GS="[a-zA-Z_:][a-zA-Z0-9:._-]*",WS="[^\"'=<>`\\x00-\\x20]+",ZS="'[^']*'",YS='"[^"]*"',QS="(?:"+WS+"|"+ZS+"|"+YS+")",KS="(?:\\s+"+GS+"(?:\\s*=\\s*"+QS+")?)",Sv="<[A-Za-z][A-Za-z0-9\\-]*"+KS+"*\\s*\\/?>",Mv="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",JS="",XS="<[?][\\s\\S]*?[?]>",eM="]*>",tM="",Av=new RegExp("^(?:"+Sv+"|"+Mv+"|"+JS+"|"+XS+"|"+eM+"|"+tM+")"),Nv=new RegExp("^(?:"+Sv+"|"+Mv+")");var mo=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(Nv.source+"\\s*$"),/^$/,!1]];function th(e,t,n,r){let o=e.bMarks[t]+e.tShift[t],i=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(o)!==60)return!1;let s=e.src.slice(o,i),u=0;for(;u=4)return!1;let s=e.src.charCodeAt(o);if(s!==35||o>=i)return!1;let u=1;for(s=e.src.charCodeAt(++o);s===35&&o6||oo&&H(e.src.charCodeAt(a-1))&&(i=a),e.line=t+1;let c=e.push("heading_open","h"+String(u),1);c.markup="########".slice(0,u),c.map=[t,e.line];let l=e.push("inline","",0);l.content=e.src.slice(o,i).trim(),l.map=[t,e.line],l.children=[];let d=e.push("heading_close","h"+String(u),-1);return d.markup="########".slice(0,u),!0}function rh(e,t,n){let r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;let o=e.parentType;e.parentType="paragraph";let i=0,s,u=t+1;for(;u3)continue;if(e.sCount[u]>=e.blkIndent){let f=e.bMarks[u]+e.tShift[u],p=e.eMarks[u];if(f=p))){i=s===61?1:2;break}}if(e.sCount[u]<0)continue;let h=!1;for(let f=0,p=r.length;f3||e.sCount[i]<0)continue;let c=!1;for(let l=0,d=r.length;l=n||e.sCount[s]=i){e.line=n;break}let a=e.line,c=!1;for(let l=0;l=e.line)throw new Error("block rule didn't increment state.line");break}if(!c)throw new Error("none of the block rules matched");e.tight=!u,e.isEmpty(e.line-1)&&(u=!0),s=e.line,s0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],o={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(o),r};Fi.prototype.scanDelims=function(e,t){let n=this.posMax,r=this.src.charCodeAt(e),o=e>0?this.src.charCodeAt(e-1):32,i=e;for(;i0)return!1;let n=e.pos,r=e.posMax;if(n+3>r||e.src.charCodeAt(n)!==58||e.src.charCodeAt(n+1)!==47||e.src.charCodeAt(n+2)!==47)return!1;let o=e.pending.match(rM);if(!o)return!1;let i=o[1],s=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!s)return!1;let u=s.url;if(u.length<=i.length)return!1;let a=u.length;for(;a>0&&u.charCodeAt(a-1)===42;)a--;a!==u.length&&(u=u.slice(0,a));let c=e.md.normalizeLink(u);if(!e.md.validateLink(c))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);let l=e.push("link_open","a",1);l.attrs=[["href",c]],l.markup="linkify",l.info="auto";let d=e.push("text","",0);d.content=e.md.normalizeLinkText(u);let h=e.push("link_close","a",-1);h.markup="linkify",h.info="auto"}return e.pos+=u.length-i.length,!0}function uh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==10)return!1;let r=e.pending.length-1,o=e.posMax;if(!t)if(r>=0&&e.pending.charCodeAt(r)===32)if(r>=1&&e.pending.charCodeAt(r-1)===32){let i=r-1;for(;i>=1&&e.pending.charCodeAt(i-1)===32;)i--;e.pending=e.pending.slice(0,i),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n?@[]^_`{|}~-".split("").forEach(function(e){ah[e.charCodeAt(0)]=1});function ch(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==92||(n++,n>=r))return!1;let o=e.src.charCodeAt(n);if(o===10){for(t||e.push("hardbreak","br",0),n++;n=55296&&o<=56319&&n+1=56320&&u<=57343&&(i+=e.src[n+1],n++)}let s="\\"+i;if(!t){let u=e.push("text_special","",0);o<256&&ah[o]!==0?u.content=i:u.content=s,u.markup=s,u.info="escape"}return e.pos=n+1,!0}function lh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==96)return!1;let o=n;n++;let i=e.posMax;for(;n=0;r--){let o=t[r];if(o.marker!==95&&o.marker!==42||o.end===-1)continue;let i=t[o.end],s=r>0&&t[r-1].end===o.end+1&&t[r-1].marker===o.marker&&t[r-1].token===o.token-1&&t[o.end+1].token===i.token+1,u=String.fromCharCode(o.marker),a=e.tokens[o.token];a.type=s?"strong_open":"em_open",a.tag=s?"strong":"em",a.nesting=1,a.markup=s?u+u:u,a.content="";let c=e.tokens[i.token];c.type=s?"strong_close":"em_close",c.tag=s?"strong":"em",c.nesting=-1,c.markup=s?u+u:u,c.content="",s&&(e.tokens[t[r-1].token].content="",e.tokens[t[o.end+1].token].content="",r--)}}function uM(e){let t=e.tokens_meta,n=e.tokens_meta.length;Ov(e,e.delimiters);for(let r=0;r=d)return!1;if(a=p,o=e.md.helpers.parseLinkDestination(e.src,p,e.posMax),o.ok){for(s=e.md.normalizeLink(o.str),e.md.validateLink(s)?p=o.pos:s="",a=p;p=d||e.src.charCodeAt(p)!==41)&&(c=!0),p++}if(c){if(typeof e.env.references>"u")return!1;if(p=0?r=e.src.slice(a,p++):p=f+1):p=f+1,r||(r=e.src.slice(h,f)),i=e.env.references[lr(r)],!i)return e.pos=l,!1;s=i.href,u=i.title}if(!t){e.pos=h,e.posMax=f;let m=e.push("link_open","a",1),g=[["href",s]];m.attrs=g,u&&g.push(["title",u]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=p,e.posMax=d,!0}function hh(e,t){let n,r,o,i,s,u,a,c,l="",d=e.pos,h=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91)return!1;let f=e.pos+2,p=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(p<0)return!1;if(i=p+1,i=h)return!1;for(c=i,u=e.md.helpers.parseLinkDestination(e.src,i,e.posMax),u.ok&&(l=e.md.normalizeLink(u.str),e.md.validateLink(l)?i=u.pos:l=""),c=i;i=h||e.src.charCodeAt(i)!==41)return e.pos=d,!1;i++}else{if(typeof e.env.references>"u")return!1;if(i=0?o=e.src.slice(c,i++):i=p+1):i=p+1,o||(o=e.src.slice(f,p)),s=e.env.references[lr(o)],!s)return e.pos=d,!1;l=s.href,a=s.title}if(!t){r=e.src.slice(f,p);let m=[];e.md.inline.parse(r,e.md,e.env,m);let g=e.push("image","img",0),y=[["src",l],["alt",""]];g.attrs=y,g.children=m,g.content=r,a&&y.push(["title",a])}return e.pos=i,e.posMax=h,!0}var aM=/^([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])?)*)$/,cM=/^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/;function gh(e,t){let n=e.pos;if(e.src.charCodeAt(n)!==60)return!1;let r=e.pos,o=e.posMax;for(;;){if(++n>=o)return!1;let s=e.src.charCodeAt(n);if(s===60)return!1;if(s===62)break}let i=e.src.slice(r+1,n);if(cM.test(i)){let s=e.md.normalizeLink(i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}if(aM.test(i)){let s=e.md.normalizeLink("mailto:"+i);if(!e.md.validateLink(s))return!1;if(!t){let u=e.push("link_open","a",1);u.attrs=[["href",s]],u.markup="autolink",u.info="auto";let a=e.push("text","",0);a.content=e.md.normalizeLinkText(i);let c=e.push("link_close","a",-1);c.markup="autolink",c.info="auto"}return e.pos+=i.length+2,!0}return!1}function lM(e){return/^\s]/i.test(e)}function dM(e){return/^<\/a\s*>/i.test(e)}function fM(e){let t=e|32;return t>=97&&t<=122}function mh(e,t){if(!e.md.options.html)return!1;let n=e.posMax,r=e.pos;if(e.src.charCodeAt(r)!==60||r+2>=n)return!1;let o=e.src.charCodeAt(r+1);if(o!==33&&o!==63&&o!==47&&!fM(o))return!1;let i=e.src.slice(r).match(Av);if(!i)return!1;if(!t){let s=e.push("html_inline","",0);s.content=i[0],lM(s.content)&&e.linkLevel++,dM(s.content)&&e.linkLevel--}return e.pos+=i[0].length,!0}var pM=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,hM=/^&([a-z][a-z0-9]{1,31});/i;function yh(e,t){let n=e.pos,r=e.posMax;if(e.src.charCodeAt(n)!==38||n+1>=r)return!1;if(e.src.charCodeAt(n+1)===35){let i=e.src.slice(n).match(pM);if(i){if(!t){let s=i[1][0].toLowerCase()==="x"?parseInt(i[1].slice(1),16):parseInt(i[1],10),u=e.push("text_special","",0);u.content=Oa(s)?Ri(s):Ri(65533),u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}else{let i=e.src.slice(n).match(hM);if(i){let s=Cn(i[0]);if(s!==i[0]){if(!t){let u=e.push("text_special","",0);u.content=s,u.markup=i[0],u.info="entity"}return e.pos+=i[0].length,!0}}}return!1}function Pv(e){let t={},n=e.length;if(!n)return;let r=0,o=-2,i=[];for(let s=0;sa;c-=i[c]+1){let d=e[c];if(d.marker===u.marker&&d.open&&d.end<0){let h=!1;if((d.close||u.open)&&(d.length+u.length)%3===0&&(d.length%3!==0||u.length%3!==0)&&(h=!0),!h){let f=c>0&&!e[c-1].open?i[c-1]+1:0;i[s]=s-c+f,i[c]=f,u.open=!1,d.end=s,d.close=!1,l=-1,o=-2;break}}}l!==-1&&(t[u.marker][(u.open?3:0)+(u.length||0)%3]=l)}}function bh(e){let t=e.tokens_meta,n=e.tokens_meta.length;Pv(e.delimiters);for(let r=0;r0&&r++,o[t].type==="text"&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;s||e.pos++,i[t]=e.pos};Oi.prototype.tokenize=function(e){let t=this.ruler.getRules(""),n=t.length,r=e.posMax,o=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}}if(s){if(e.pos>=r)break;continue}e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()};Oi.prototype.parse=function(e,t,n,r){let o=new this.State(e,t,n,r);this.tokenize(o);let i=this.ruler2.getRules(""),s=i.length;for(let u=0;u|$))",t.tpl_email_fuzzy="(^|"+n+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}function Ch(e){return Array.prototype.slice.call(arguments,1).forEach(function(n){n&&Object.keys(n).forEach(function(r){e[r]=n[r]})}),e}function Va(e){return Object.prototype.toString.call(e)}function gM(e){return Va(e)==="[object String]"}function mM(e){return Va(e)==="[object Object]"}function yM(e){return Va(e)==="[object RegExp]"}function Bv(e){return Va(e)==="[object Function]"}function bM(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var Hv={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function vM(e){return Object.keys(e||{}).reduce(function(t,n){return t||Hv.hasOwnProperty(n)},!1)}var DM={"http:":{validate:function(e,t,n){let r=e.slice(t);return n.re.http||(n.re.http=new RegExp("^\\/\\/"+n.re.src_auth+n.re.src_host_port_strict+n.re.src_path,"i")),n.re.http.test(r)?r.match(n.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,t,n){let r=e.slice(t);return n.re.no_http||(n.re.no_http=new RegExp("^"+n.re.src_auth+"(?:localhost|(?:(?:"+n.re.src_domain+")\\.)+"+n.re.src_domain_root+")"+n.re.src_port+n.re.src_host_terminator+n.re.src_path,"i")),n.re.no_http.test(r)?t>=3&&e[t-3]===":"||t>=3&&e[t-3]==="/"?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){let r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},EM="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",CM="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function _M(e){e.__index__=-1,e.__text_cache__=""}function wM(e){return function(t,n){let r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}function Vv(){return function(e,t){t.normalize(e)}}function Ba(e){let t=e.re=jv(e.__opts__),n=e.__tlds__.slice();e.onCompile(),e.__tlds_replaced__||n.push(EM),n.push(t.src_xn),t.src_tlds=n.join("|");function r(u){return u.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");let o=[];e.__compiled__={};function i(u,a){throw new Error('(LinkifyIt) Invalid schema "'+u+'": '+a)}Object.keys(e.__schemas__).forEach(function(u){let a=e.__schemas__[u];if(a===null)return;let c={validate:null,link:null};if(e.__compiled__[u]=c,mM(a)){yM(a.validate)?c.validate=wM(a.validate):Bv(a.validate)?c.validate=a.validate:i(u,a),Bv(a.normalize)?c.normalize=a.normalize:a.normalize?i(u,a):c.normalize=Vv();return}if(gM(a)){o.push(u);return}i(u,a)}),o.forEach(function(u){e.__compiled__[e.__schemas__[u]]&&(e.__compiled__[u].validate=e.__compiled__[e.__schemas__[u]].validate,e.__compiled__[u].normalize=e.__compiled__[e.__schemas__[u]].normalize)}),e.__compiled__[""]={validate:null,normalize:Vv()};let s=Object.keys(e.__compiled__).filter(function(u){return u.length>0&&e.__compiled__[u]}).map(bM).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+s+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),_M(e)}function xM(e,t){let n=e.__index__,r=e.__last_index__,o=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=o,this.text=o,this.url=o}function _h(e,t){let n=new xM(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function je(e,t){if(!(this instanceof je))return new je(e,t);t||vM(e)&&(t=e,e={}),this.__opts__=Ch({},Hv,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=Ch({},DM,e),this.__compiled__={},this.__tlds__=CM,this.__tlds_replaced__=!1,this.re={},Ba(this)}je.prototype.add=function(t,n){return this.__schemas__[t]=n,Ba(this),this};je.prototype.set=function(t){return this.__opts__=Ch(this.__opts__,t),this};je.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;let n,r,o,i,s,u,a,c,l;if(this.re.schema_test.test(t)){for(a=this.re.schema_search,a.lastIndex=0;(n=a.exec(t))!==null;)if(i=this.testSchemaAt(t,n[2],a.lastIndex),i){this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+i;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=t.search(this.re.host_fuzzy_test),c>=0&&(this.__index__<0||c=0&&(o=t.match(this.re.email_fuzzy))!==null&&(s=o.index+o[1].length,u=o.index+o[0].length,(this.__index__<0||sthis.__last_index__)&&(this.__schema__="mailto:",this.__index__=s,this.__last_index__=u))),this.__index__>=0};je.prototype.pretest=function(t){return this.re.pretest.test(t)};je.prototype.testSchemaAt=function(t,n,r){return this.__compiled__[n.toLowerCase()]?this.__compiled__[n.toLowerCase()].validate(t,r,this):0};je.prototype.match=function(t){let n=[],r=0;this.__index__>=0&&this.__text_cache__===t&&(n.push(_h(this,r)),r=this.__last_index__);let o=r?t.slice(r):t;for(;this.test(o);)n.push(_h(this,r)),o=o.slice(this.__last_index__),r+=this.__last_index__;return n.length?n:null};je.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;let n=this.re.schema_at_start.exec(t);if(!n)return null;let r=this.testSchemaAt(t,n[2],n[0].length);return r?(this.__schema__=n[2],this.__index__=n.index+n[1].length,this.__last_index__=n.index+n[0].length+r,_h(this,0)):null};je.prototype.tlds=function(t,n){return t=Array.isArray(t)?t:[t],n?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(r,o,i){return r!==i[o-1]}).reverse(),Ba(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,Ba(this),this)};je.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};je.prototype.onCompile=function(){};var $v=je;var IM=/^xn--/,TM=/[^\0-\x7F]/,SM=/[\x2E\u3002\uFF0E\uFF61]/g,MM={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},wh=35,It=Math.floor,xh=String.fromCharCode;function _n(e){throw new RangeError(MM[e])}function AM(e,t){let n=[],r=e.length;for(;r--;)n[r]=t(e[r]);return n}function zv(e,t){let n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),e=e.replace(SM,".");let o=e.split("."),i=AM(o,t).join(".");return r+i}function qv(e){let t=[],n=0,r=e.length;for(;n=55296&&o<=56319&&nString.fromCodePoint(...e),kM=function(e){return e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36},Uv=function(e,t){return e+22+75*(e<26)-((t!=0)<<5)},Gv=function(e,t,n){let r=0;for(e=n?It(e/700):e>>1,e+=It(e/t);e>wh*26>>1;r+=36)e=It(e/wh);return It(r+(wh+1)*e/(e+38))},Wv=function(e){let t=[],n=e.length,r=0,o=128,i=72,s=e.lastIndexOf("-");s<0&&(s=0);for(let u=0;u=128&&_n("not-basic"),t.push(e.charCodeAt(u));for(let u=s>0?s+1:0;u=n&&_n("invalid-input");let h=kM(e.charCodeAt(u++));h>=36&&_n("invalid-input"),h>It((2147483647-r)/l)&&_n("overflow"),r+=h*l;let f=d<=i?1:d>=i+26?26:d-i;if(hIt(2147483647/p)&&_n("overflow"),l*=p}let c=t.length+1;i=Gv(r-a,c,a==0),It(r/c)>2147483647-o&&_n("overflow"),o+=It(r/c),r%=c,t.splice(r++,0,o)}return String.fromCodePoint(...t)},Zv=function(e){let t=[];e=qv(e);let n=e.length,r=128,o=0,i=72;for(let a of e)a<128&&t.push(xh(a));let s=t.length,u=s;for(s&&t.push("-");u=r&&lIt((2147483647-o)/c)&&_n("overflow"),o+=(a-r)*c,r=a;for(let l of e)if(l2147483647&&_n("overflow"),l===r){let d=o;for(let h=36;;h+=36){let f=h<=i?1:h>=i+26?26:h-i;if(d=0))try{t.hostname=Ih.toASCII(t.hostname)}catch(n){}return xa(lo(t))}function HM(e){let t=ki(e,!0);if(t.hostname&&(!t.protocol||Jv.indexOf(t.protocol)>=0))try{t.hostname=Ih.toUnicode(t.hostname)}catch(n){}return Ni(lo(t),Ni.defaultChars+"%")}function Ge(e,t){if(!(this instanceof Ge))return new Ge(e,t);t||Fa(e)||(t=e||{},e="default"),this.inline=new Lv,this.block=new kv,this.core=new Cv,this.renderer=new mv,this.linkify=new $v,this.validateLink=BM,this.normalizeLink=VM,this.normalizeLinkText=HM,this.utils=Rp,this.helpers=po({},Lp),this.options={},this.configure(e),t&&this.set(t)}Ge.prototype.set=function(e){return po(this.options,e),this};Ge.prototype.configure=function(e){let t=this;if(Fa(e)){let n=e;if(e=PM[n],!e)throw new Error('Wrong `markdown-it` preset "'+n+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)}),this};Ge.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.enable(e,!0))},this),n=n.concat(this.inline.ruler2.enable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this};Ge.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(o){n=n.concat(this[o].ruler.disable(e,!0))},this),n=n.concat(this.inline.ruler2.disable(e,!0));let r=e.filter(function(o){return n.indexOf(o)<0});if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this};Ge.prototype.use=function(e){let t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this};Ge.prototype.parse=function(e,t){if(typeof e!="string")throw new Error("Input data should be a String");let n=new this.core.State(e,this,t);return this.core.process(n),n.tokens};Ge.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)};Ge.prototype.parseInline=function(e,t){let n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens};Ge.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Th=Ge;function $M(e,t){if(e&1&&Xr(0,0),e&2){let n=t.$implicit,r=yi();Kr("surfaceId",r.surfaceId())("component",n)}}function UM(e,t){if(e&1&&Xr(0,0),e&2){let n=t.$implicit,r=yi();Kr("surfaceId",r.surfaceId())("component",n)}}function zM(e,t){if(e&1&&Xr(0,0),e&2){yi();let n=Wu(0),r=Wu(1);Kr("surfaceId",n)("component",r.componentTree)}}var qM=new x("Catalog"),GM=(()=>{class e extends m1.A2uiMessageProcessor{events=new ce;setData(n,r,o,i){return super.setData(n,r,o,i??void 0)}dispatch(n){let r=new ce;return this.events.next({message:n,completion:r}),ac(r)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),WM=new x("Theme"),ZM=0,Sh=(()=>{class e{processor=b(GM);theme=b(WM);surfaceId=Ae.required();component=Ae.required();weight=Ae.required();sendAction(n){let r=this.component(),o=this.surfaceId()??void 0,i={};if(n.context){for(let u of n.context)if(u.value.literalBoolean)i[u.key]=u.value.literalBoolean;else if(u.value.literalNumber)i[u.key]=u.value.literalNumber;else if(u.value.literalString)i[u.key]=u.value.literalString;else if(u.value.path){let a=this.processor.resolvePath(u.value.path,r.dataContextPath),c=this.processor.getData(r,a,o);i[u.key]=c}}let s={userAction:{name:n.name,sourceComponentId:r.id,surfaceId:o,timestamp:new Date().toISOString(),context:i}};return this.processor.dispatch(s)}resolvePrimitive(n){let r=this.component(),o=this.surfaceId();return!n||typeof n!="object"?null:n.literal!=null?n.literal:n.path?this.processor.getData(r,n.path,o??void 0):"literalString"in n?n.literalString:"literalNumber"in n?n.literalNumber:"literalBoolean"in n?n.literalBoolean:null}getUniqueId(n){return`${n}-${ZM++}`}static \u0275fac=function(r){return new(r||e)};static \u0275dir=st({type:e,hostVars:2,hostBindings:function(r,o){r&2&&zu("--weight",o.weight())},inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"],weight:[1,"weight"]}})}return e})(),Mh=(()=>{class e{viewContainerRef=b(it);catalog=b(qM);static hasInsertedStyles=!1;currentRef=null;isDestroyed=!1;surfaceId=Ae.required();component=Ae.required();constructor(){Yo(()=>{let o=this.surfaceId(),i=this.component();De(()=>this.render(o,i))});let n=b(nr),r=b(K);if(!e.hasInsertedStyles&&S1(n)){let o=r.createElement("style");o.textContent=ro.structuralStyles,r.head.appendChild(o),e.hasInsertedStyles=!0}}ngOnDestroy(){this.isDestroyed=!0,this.clear()}render(n,r){return lt(this,null,function*(){let o=this.catalog[r.type],i=null,s=null;if(typeof o=="function"?i=yield o():typeof o=="object"&&(i=yield o.type(),s=o.bindings(r)),this.clear(),i&&!this.isDestroyed){let u=[U("surfaceId",()=>n),U("component",()=>r),U("weight",()=>r.weight??"initial")];s&&u.push(...s),this.currentRef=this.viewContainerRef.createComponent(i,{bindings:u,injector:this.viewContainerRef.injector})}})}clear(){this.currentRef?.destroy(),this.currentRef=null}static \u0275fac=function(r){return new(r||e)};static \u0275dir=st({type:e,selectors:[["ng-container","a2ui-renderer",""]],inputs:{surfaceId:[1,"surfaceId"],component:[1,"component"]}})}return e})();var YM=(()=>{class e extends Sh{alignment=Ae("stretch");distribution=Ae("start");classes=Se(()=>P(M({},this.theme.components.Row),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \u0275cmp=Zr({type:e,selectors:[["a2ui-row"]],hostVars:2,hostBindings:function(r,o){r&2&&ju("alignment",o.alignment())("distribution",o.distribution())},inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[Yr],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(Xn(0,"section"),Vu(1,$M,1,2,"ng-container",0,Bu),Jr()),r&2&&(eo(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Row),bi(o.classes()),Wr(),Hu(o.component().properties.children))},dependencies:[Mh],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:row;width:100%;min-height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),QM=(()=>{class e extends Sh{alignment=Ae("stretch");distribution=Ae("start");classes=Se(()=>P(M({},this.theme.components.Column),{[`align-${this.alignment()}`]:!0,[`distribute-${this.distribution()}`]:!0}));static \u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \u0275cmp=Zr({type:e,selectors:[["a2ui-column"]],inputs:{alignment:[1,"alignment"],distribution:[1,"distribution"]},features:[Yr],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){r&1&&(Xn(0,"section"),Vu(1,UM,1,2,"ng-container",0,Bu),Jr()),r&2&&(eo(o.theme.additionalStyles==null?null:o.theme.additionalStyles.Column),bi(o.classes()),Wr(),Hu(o.component().properties.children))},dependencies:[Mh],styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-width:100%;height:100%;box-sizing:border-box}.align-start[_ngcontent-%COMP%]{align-items:start}.align-center[_ngcontent-%COMP%]{align-items:center}.align-end[_ngcontent-%COMP%]{align-items:end}.align-stretch[_ngcontent-%COMP%]{align-items:stretch}.distribute-start[_ngcontent-%COMP%]{justify-content:start}.distribute-center[_ngcontent-%COMP%]{justify-content:center}.distribute-end[_ngcontent-%COMP%]{justify-content:end}.distribute-spaceBetween[_ngcontent-%COMP%]{justify-content:space-between}.distribute-spaceAround[_ngcontent-%COMP%]{justify-content:space-around}.distribute-spaceEvenly[_ngcontent-%COMP%]{justify-content:space-evenly}"]})}return e})(),KM=(()=>{class e{originalClassMap=new Map;sanitizer=b(wp);markdownIt=Th({highlight:(n,r)=>{if(r==="html"){let o=document.createElement("iframe");return o.classList.add("html-view"),o.srcdoc=n,o.sandbox="",o.innerHTML}return n}});render(n,r){r&&this.applyTagClassMap(r);let o=this.markdownIt.render(n);return this.unapplyTagClassMap(),this.sanitizer.sanitize(Pe.HTML,o)}applyTagClassMap(n){Object.entries(n).forEach(([r,o])=>{let i;switch(r){case"p":i="paragraph";break;case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":i="heading";break;case"ul":i="bullet_list";break;case"ol":i="ordered_list";break;case"li":i="list_item";break;case"a":i="link";break;case"strong":i="strong";break;case"em":i="em";break}if(!i)return;let s=`${i}_open`,u=this.markdownIt.renderer.rules[s];this.originalClassMap.set(s,u),this.markdownIt.renderer.rules[s]=(a,c,l,d,h)=>{let f=a[c];for(let p of o)f.attrJoin("class",p);return u?u.call(this,a,c,l,d,h):h.renderToken(a,c,l)}})}unapplyTagClassMap(){for(let[n,r]of this.originalClassMap)this.markdownIt.renderer.rules[n]=r;this.originalClassMap.clear()}static \u0275fac=function(r){return new(r||e)};static \u0275prov=T({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})(),JM=(()=>{class e extends Sh{markdownRenderer=b(KM);text=Ae.required();usageHint=Ae.required();resolvedText=Se(()=>{let n=this.usageHint(),r=super.resolvePrimitive(this.text());if(r==null)return"(empty)";switch(n){case"h1":r=`# ${r}`;break;case"h2":r=`## ${r}`;break;case"h3":r=`### ${r}`;break;case"h4":r=`#### ${r}`;break;case"h5":r=`##### ${r}`;break;case"caption":r=`*${r}*`;break;default:r=String(r);break}return this.markdownRenderer.render(r,ro.appendToAll(this.theme.markdown,["ol","ul","li"],{}))});classes=Se(()=>{let n=this.usageHint();return ro.merge(this.theme.components.Text.all,n?this.theme.components.Text[n]:{})});additionalStyles=Se(()=>{let n=this.usageHint(),r=this.theme.additionalStyles?.Text;if(!r)return null;let o={};return this.areHintedStyles(r)?o=r[n??"body"]:o=r,o});areHintedStyles(n){return typeof n!="object"||!n||Array.isArray(n)?!1:["h1","h2","h3","h4","h5","h6","caption","body"].every(o=>o in n)}static \u0275fac=(()=>{let n;return function(o){return(n||(n=tr(e)))(o||e)}})();static \u0275cmp=Zr({type:e,selectors:[["a2ui-text"]],inputs:{text:[1,"text"],usageHint:[1,"usageHint"]},features:[Yr],decls:1,vars:5,consts:[[3,"innerHTML"]],template:function(r,o){r&1&&$u(0,"section",0),r&2&&(eo(o.additionalStyles()),bi(o.classes()),Uu("innerHTML",o.resolvedText(),Ed))},styles:[`a2ui-text{display:block;flex:var(--weight)}a2ui-text h1,a2ui-text h2,a2ui-text h3,a2ui-text h4,a2ui-text h5{line-height:inherit;font:inherit} `],encapsulation:2})}return e})(),$q={Row:{type:()=>YM,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},Column:{type:()=>QM,bindings:e=>{let t=e.properties;return[U("alignment",()=>t.alignment??"stretch"),U("distribution",()=>t.distribution??"start")]}},List:{type:()=>import("./chunk-JOTH6MSK.js").then(e=>e.List),bindings:e=>{let t=e.properties;return[U("direction",()=>t.direction??"vertical")]}},Card:()=>import("./chunk-2FK4DXD6.js").then(e=>e.Card),Image:{type:()=>import("./chunk-BWOBGCSA.js").then(e=>e.Image),bindings:e=>{let t=e.properties;return[U("url",()=>t.url),U("usageHint",()=>t.usageHint)]}},Icon:{type:()=>import("./chunk-4ZK7FQPX.js").then(e=>e.Icon),bindings:e=>{let t=e.properties;return[U("name",()=>t.name)]}},Video:{type:()=>import("./chunk-POBF2O3Z.js").then(e=>e.Video),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},AudioPlayer:{type:()=>import("./chunk-QZL3KUOO.js").then(e=>e.Audio),bindings:e=>{let t=e.properties;return[U("url",()=>t.url)]}},Text:{type:()=>JM,bindings:e=>{let t=e.properties;return[U("text",()=>t.text),U("usageHint",()=>t.usageHint||null)]}},Button:{type:()=>import("./chunk-ABUNXR7C.js").then(e=>e.Button),bindings:e=>{let t=e.properties;return[U("action",()=>t.action)]}},Divider:()=>import("./chunk-C7MGZAFQ.js").then(e=>e.Divider),MultipleChoice:{type:()=>import("./chunk-YQ6GIDJJ.js").then(e=>e.MultipleChoice),bindings:e=>{let t=e.properties;return[U("options",()=>t.options||[]),U("value",()=>t.selections),U("description",()=>"Select an item")]}},TextField:{type:()=>import("./chunk-KPALJACC.js").then(e=>e.TextField),bindings:e=>{let t=e.properties;return[U("text",()=>t.text??null),U("label",()=>t.label),U("inputType",()=>t.type)]}},DateTimeInput:{type:()=>import("./chunk-JFJZPIJV.js").then(e=>e.DatetimeInput),bindings:e=>{let t=e.properties;return[U("enableDate",()=>t.enableDate),U("enableTime",()=>t.enableTime),U("value",()=>t.value)]}},CheckBox:{type:()=>import("./chunk-QWN7CXIU.js").then(e=>e.Checkbox),bindings:e=>{let t=e.properties;return[U("label",()=>t.label),U("value",()=>t.value)]}},Slider:{type:()=>import("./chunk-CZPJTTNC.js").then(e=>e.Slider),bindings:e=>{let t=e.properties;return[U("value",()=>t.value),U("minValue",()=>t.minValue),U("maxValue",()=>t.maxValue),U("label",()=>"")]}},Tabs:{type:()=>import("./chunk-R2V2IE5A.js").then(e=>e.Tabs),bindings:e=>{let t=e.properties;return[U("tabs",()=>t.tabItems)]}},Modal:{type:()=>import("./chunk-P66EZ4FO.js").then(e=>e.Modal),bindings:()=>[]}},Uq=(()=>{class e{surfaceId=Ae.required();surface=Ae.required();styles=Se(()=>{let n=this.surface(),r={};if(n?.styles)for(let[o,i]of Object.entries(n.styles))switch(o){case"primaryColor":{r["--p-100"]="#ffffff",r["--p-99"]=`color-mix(in srgb, ${i} 2%, white 98%)`,r["--p-98"]=`color-mix(in srgb, ${i} 4%, white 96%)`,r["--p-95"]=`color-mix(in srgb, ${i} 10%, white 90%)`,r["--p-90"]=`color-mix(in srgb, ${i} 20%, white 80%)`,r["--p-80"]=`color-mix(in srgb, ${i} 40%, white 60%)`,r["--p-70"]=`color-mix(in srgb, ${i} 60%, white 40%)`,r["--p-60"]=`color-mix(in srgb, ${i} 80%, white 20%)`,r["--p-50"]=i,r["--p-40"]=`color-mix(in srgb, ${i} 80%, black 20%)`,r["--p-35"]=`color-mix(in srgb, ${i} 70%, black 30%)`,r["--p-30"]=`color-mix(in srgb, ${i} 60%, black 40%)`,r["--p-25"]=`color-mix(in srgb, ${i} 50%, black 50%)`,r["--p-20"]=`color-mix(in srgb, ${i} 40%, black 60%)`,r["--p-15"]=`color-mix(in srgb, ${i} 30%, black 70%)`,r["--p-10"]=`color-mix(in srgb, ${i} 20%, black 80%)`,r["--p-5"]=`color-mix(in srgb, ${i} 10%, black 90%)`,r["--0"]="#00000";break}case"font":{r["--font-family"]=i,r["--font-family-flex"]=i;break}}return r});static \u0275fac=function(r){return new(r||e)};static \u0275cmp=Zr({type:e,selectors:[["a2ui-surface"]],hostVars:2,hostBindings:function(r,o){r&2&&eo(o.styles())},inputs:{surfaceId:[1,"surfaceId"],surface:[1,"surface"]},decls:3,vars:3,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(r,o){if(r&1&&(qu(0)(1),Jd(2,zM,1,2,"ng-container",0)),r&2){let i=Gu(o.surfaceId());Wr();let s=Gu(o.surface());Wr(),ef(i&&s?2:-1)}},dependencies:[Mh],styles:["[_nghost-%COMP%]{display:flex;min-height:0;max-height:100%;flex-direction:column;gap:16px}"]})}return e})();export{X as a,Mn as b,dD as c,B as d,rc as e,ce as f,zi as g,Co as h,wo as i,yD as j,_r as k,bD as l,Mt as m,tk as n,To as o,pt as p,us as q,ID as r,TD as s,Nn as t,ac as u,Ce as v,OD as w,At as x,So as y,ls as z,LD as A,jD as B,cc as C,lc as D,qD as E,GD as F,rn as G,ZD as H,YD as I,dc as J,fc as K,p0 as L,pc as M,QD as N,g0 as O,ds as P,XD as Q,eE as R,y0 as S,fs as T,b0 as U,v0 as V,D0 as W,ps as X,tE as Y,nE as Z,E0 as _,rE as $,C as aa,mt as ba,_s as ca,T as da,yt as ea,uE as fa,x as ga,A as ha,b as ia,B0 as ja,we as ka,Nr as la,TE as ma,J0 as na,X0 as oa,lg as pa,dg as qa,fe as ra,K as sa,Fe as ta,Gn as ua,Nt as va,be as wa,Be as xa,Pt as ya,pn as za,Yo as Aa,mu as Ba,tr as Ca,jt as Da,tu as Ea,yu as Fa,nr as Ga,vC as Ha,vu as Ia,Nm as Ja,Pe as Ka,Ed as La,QC as Ma,KC as Na,JC as Oa,Wr as Pa,Ct as Qa,y_ as Ra,mn as Sa,Jn as Ta,pi as Ua,oe as Va,mw as Wa,it as Xa,bn as Ya,Hy as Za,$y as _a,Zr as $a,Ht as ab,st as bb,ax as cb,Yr as db,Wy as eb,Zy as fb,Yy as gb,Wd as hb,gi as ib,Dx as jb,Jy as kb,Qr as lb,tb as mb,ju as nb,Cx as ob,Jd as pb,Xd as qb,ef as rb,wx as sb,Bu as tb,Vu as ub,Hu as vb,Kr as wb,Xn as xb,Jr as yb,nb as zb,tf as Ab,nf as Bb,$u as Cb,rf as Db,of as Eb,Xr as Fb,Ax as Gb,Uu as Hb,ib as Ib,sb as Jb,yi as Kb,Rx as Lb,Fx as Mb,ab as Nb,cb as Ob,Px as Pb,Lx as Qb,lb as Rb,db as Sb,jx as Tb,Bx as Ub,zu as Vb,mb as Wb,eo as Xb,bi as Yb,aI as Zb,wb as _b,sf as $b,xb as ac,Ib as bc,Tb as cc,pI as dc,Sb as ec,qu as fc,Gu as gc,Wu as hc,hI as ic,bI as jc,vI as kc,DI as lc,EI as mc,CI as nc,wI as oc,xI as pc,II as qc,TI as rc,Yu as sc,De as tc,Se as uc,AI as vc,ff as wc,Vb as xc,gB as yc,mB as zc,Ae as Ac,yB as Bc,bB as Cc,vB as Dc,_f as Ec,wf as Fc,i2 as Gc,s2 as Hc,EB as Ic,CB as Jc,_B as Kc,ro as Lc,_t as Mc,H2 as Nc,so as Oc,E1 as Pc,C1 as Qc,q2 as Rc,G2 as Sc,W2 as Tc,T1 as Uc,Y2 as Vc,Q2 as Wc,K2 as Xc,tT as Yc,rT as Zc,up as _c,S1 as $c,QV as ad,mp as bd,yT as cd,wT as dd,Y1 as ed,GT as fd,p$ as gd,wp as hd,qM as id,GM as jd,WM as kd,Sh as ld,Mh as md,$q as nd,Uq as od}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-ABUNXR7C.js ================================================ import{$a as r,Ac as h,Ca as o,Fb as u,Ib as p,Pa as a,Xb as m,Yb as f,db as c,ld as y,md as g,wb as s,xb as l,yb as d}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var _=(()=>{class n extends y{action=h.required();handleClick(){let t=this.action();t&&super.sendAction(t)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=o(n)))(e||n)}})();static \u0275cmp=r({type:n,selectors:[["a2ui-button"]],inputs:{action:[1,"action"]},features:[c],decls:2,vars:6,consts:[[3,"click"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,e){i&1&&(l(0,"button",0),p("click",function(){return e.handleClick()}),u(1,1),d()),i&2&&(m(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Button),f(e.theme.components.Button),a(),s("surfaceId",e.surfaceId())("component",e.component().properties.child))},dependencies:[g],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0}"]})}return n})();export{_ as Button}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-BWOBGCSA.js ================================================ import{$a as m,Ab as g,Ac as r,Bb as p,Ca as a,Cb as v,Hb as h,Kb as f,Lc as D,Ma as l,Pa as o,Xb as y,Yb as x,db as d,fc as M,gc as b,hc as C,ld as I,pb as c,rb as u,uc as s}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function H(t,U){if(t&1&&(g(0,"section"),v(1,"img",1),p()),t&2){let e=f(),i=C(0);y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Image),x(e.classes()),o(),h("src",i,l)}}var w=(()=>{class t extends I{url=r.required();usageHint=r.required();resolvedUrl=s(()=>this.resolvePrimitive(this.url()));classes=s(()=>{let e=this.usageHint();return D.merge(this.theme.components.Image.all,e?this.theme.components.Image[e]:{})});static \u0275fac=(()=>{let e;return function(n){return(e||(e=a(t)))(n||t)}})();static \u0275cmp=m({type:t,selectors:[["a2ui-image"]],inputs:{url:[1,"url"],usageHint:[1,"usageHint"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],[3,"src"]],template:function(i,n){if(i&1&&(M(0),c(1,H,2,5,"section",0)),i&2){let _=b(n.resolvedUrl());o(),u(_?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}img[_ngcontent-%COMP%]{display:block;width:100%;height:100%;box-sizing:border-box}"]})}return t})();export{w as Image}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-C7MGZAFQ.js ================================================ import{$a as r,Ca as o,Cb as d,Xb as l,Yb as s,db as a,ld as m}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var f=(()=>{class e extends m{static \u0275fac=(()=>{let i;return function(t){return(i||(i=o(e)))(t||e)}})();static \u0275cmp=r({type:e,selectors:[["a2ui-divider"]],features:[a],decls:1,vars:4,template:function(n,t){n&1&&d(0,"hr"),n&2&&(l(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Divider),s(t.theme.components.Divider))},styles:["[_nghost-%COMP%]{display:block;min-height:0;overflow:auto}hr[_ngcontent-%COMP%]{height:1px;background:#ccc;border:none}"]})}return e})();export{f as Divider}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-CZPJTTNC.js ================================================ import{$a as s,$b as f,Ab as r,Ac as n,Bb as u,Ca as m,Hb as d,Jb as c,Pa as l,Xb as v,Yb as o,Zb as g,db as p,ld as b,uc as h}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var M=["a2ui-slider",""],E=(()=>{class a extends b{value=n.required();label=n("");minValue=n.required();maxValue=n.required();inputId=super.getUniqueId("a2ui-slider");resolvedValue=h(()=>super.resolvePrimitive(this.value())??0);handleInput(t){let i=this.value()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.valueAsNumber,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(a)))(e||a)}})();static \u0275cmp=s({type:a,selectors:[["","a2ui-slider",""]],inputs:{value:[1,"value"],label:[1,"label"],minValue:[1,"minValue"],maxValue:[1,"maxValue"]},features:[p],attrs:M,decls:4,vars:14,consts:[[3,"for"],["autocomplete","off","type","range",3,"input","value","min","max","id"]],template:function(i,e){i&1&&(r(0,"section")(1,"label",0),g(2),u(),r(3,"input",1),c("input",function(y){return e.handleInput(y)}),u()()),i&2&&(o(e.theme.components.Slider.container),l(),o(e.theme.components.Slider.label),d("htmlFor",e.inputId),l(),f(" ",e.label()," "),l(),v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Slider),o(e.theme.components.Slider.element),d("value",e.resolvedValue())("min",e.minValue())("max",e.maxValue())("id",e.inputId))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return a})();export{E as Slider}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-GLGRLUIJ.js ================================================ import"./chunk-W7GRJBO5.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=(function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=(function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l})(),F=(function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l})();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em`,G=360,P="keydown",x="mousedown",H="focusin";function _(l,i){return(i||document).querySelector(l)}function M(l){l.preventDefault(),l.stopPropagation()}function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n),t(n))})}var W=(function(){function l(i){O(this,l),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new F,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(i)}return R(l,[{key:"setOptions",value:function(e){var t=this;if(!e)return;var r=this.settings;function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}if(e instanceof HTMLElement)r.parent=e;else{r.parent&&e.parent&&r.parent!==e.parent&&(this._events.remove(r.parent),this._popupInited=!1),n(e,r),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var c=r.parent;if(c&&r.popup&&!this._popupInited){var a=function(p){return t.openHandler(p)};this._events.add(c,"click",a),D(this._events,c,[" ","Spacebar","Enter"],a),this._popupInited=!0}else e.parent&&!r.popup&&this.show()}},{key:"openHandler",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents="none";var t=e&&e.type===P?this._domEdit:this.domElement;setTimeout(function(){return t.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:"closeHandler",value:function(e){var t=e&&e.type,r=!1;if(!e)r=!0;else if(t===x||t===H){var n=(this.__containedEvent||0)+100;e.timeStamp>n&&(r=!0)}else M(e),r=!0;r&&this.hide()&&(this.settings.parent.style.pointerEvents="",t!==x&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){if(typeof e=="string"&&(e=e.trim()),!!e){t=t||{};var r=void 0;try{r=new z(e)}catch(o){if(t.failSilently)return;throw o}if(!this.settings.alpha){var n=r.hsla;n[3]=1,r.hsla=n}this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var t=this._toggleDOM(!0);return this._setPosition(),t}var r=this.settings.template||'
',n=U(r);return this.domElement=n,this._domH=_(".picker_hue",n),this._domSL=_(".picker_sl",n),this._domA=_(".picker_alpha",n),this._domEdit=_(".picker_editor input",n),this._domSample=_(".picker_sample",n),this._domOkay=_(".picker_done button",n),this._domCancel=_(".picker_cancel button",n),n.classList.add("layout_"+this.settings.layout),this.settings.alpha||n.classList.add("no_alpha"),this.settings.editor||n.classList.add("no_editor"),this.settings.cancelButton||n.classList.add("no_cancel"),this._ifPopup(function(){return n.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,t=this,r=this.domElement,n=this._events;function o(s,p,u){n.add(s,p,u)}o(r,"click",function(s){return s.preventDefault()}),T(n,this._domH,function(s,p){return t._setHSLA(s)}),T(n,this._domSL,function(s,p){return t._setHSLA(null,s,1-p)}),this.settings.alpha&&T(n,this._domA,function(s,p){return t._setHSLA(null,null,null,1-p)});var c=this._domEdit;o(c,"input",function(s){t._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(c,"focus",function(s){var p=this;p.selectionStart===p.selectionEnd&&p.select()}),this._ifPopup(function(){var s=function(f){return e.closeHandler(f)};o(window,x,s),o(window,H,s),D(n,r,["Esc","Escape"],s);var p=function(f){e.__containedEvent=f.timeStamp};o(r,x,p),o(r,H,p),o(e._domCancel,"click",s)});var a=function(p){e._ifPopup(function(){return e.closeHandler(p)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,"click",a),D(n,r,["Enter"],a)}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(r){getComputedStyle(e).position==="static"&&(e.style.position="relative");var n=r===!0?"popup_right":"popup_"+r;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(o){o===n?t.classList.add(o):t.classList.remove(o)}),t.classList.add(n)})}},{key:"_setHSLA",value:function(e,t,r,n,o){o=o||{};var c=this.colour,a=c.hsla;[e,t,r,n].forEach(function(s,p){(s||s===0)&&(a[p]=s)}),c.hsla=a,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(c)}},{key:"_updateUI",value:function(e){if(!this.domElement)return;e=e||{};var t=this.colour,r=t.hsla,n="hsl("+r[0]*G+", 100%, 50%)",o=t.hslString,c=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,u=_(".picker_selector",a),f=_(".picker_selector",s),d=_(".picker_selector",p);function b(I,C,L){C.style.left=L*100+"%"}function m(I,C,L){C.style.top=L*100+"%"}b(a,u,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,b(s,f,r[1]),m(s,f,1-r[2]),s.style.color=o,m(p,d,1-r[3]);var h=o,v=h.replace("hsl","hsla").replace(")",", 0)"),g="linear-gradient("+[h,v]+")";if(this._domA.style.background=g+", "+B,!e.fromEditor){var S=this.settings.editorFormat,k=this.settings.alpha,w=void 0;switch(S){case"rgb":w=t.printRGB(k);break;case"hsl":w=t.printHSL(k);break;default:w=t.printHex(k)}this._domEdit.value=w}this._domSample.style.color=c}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?"":"none",n=t.style.display!==r;return n&&(t.style.display=r),n}}]),l})();E=document.createElement("style"),E.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(E),W.StyleElement=E;var E;export{W as default}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-JFJZPIJV.js ================================================ import{$a as f,Ab as s,Ac as l,Bb as m,Ca as g,Hb as d,Jb as y,Pa as u,Xb as T,Yb as r,Zb as I,_b as M,db as D,ld as N,nb as v,uc as o}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var S=(()=>{class i extends N{value=l.required();enableDate=l.required();enableTime=l.required();inputId=super.getUniqueId("a2ui-datetime-input");inputType=o(()=>{let t=this.enableDate(),n=this.enableTime();return t&&n?"datetime-local":t?"date":n?"time":"datetime-local"});label=o(()=>{let t=this.inputType();return t==="date"?"Date":t==="time"?"Time":"Date & Time"});inputValue=o(()=>{let t=this.inputType(),n=super.resolvePrimitive(this.value())||"",e=n?new Date(n):null;if(!e||isNaN(e.getTime()))return"";let p=this.padNumber(e.getFullYear()),a=this.padNumber(e.getMonth()),c=this.padNumber(e.getDate()),b=this.padNumber(e.getHours()),h=this.padNumber(e.getMinutes());return t==="date"?`${p}-${a}-${c}`:t==="time"?`${b}:${h}`:`${p}-${a}-${c}T${b}:${h}`});handleInput(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.value,this.surfaceId())}padNumber(t){return t.toString().padStart(2,"0")}static \u0275fac=(()=>{let t;return function(e){return(t||(t=g(i)))(e||i)}})();static \u0275cmp=f({type:i,selectors:[["a2ui-datetime-input"]],inputs:{value:[1,"value"],enableDate:[1,"enableDate"],enableTime:[1,"enableTime"]},features:[D],decls:4,vars:13,consts:[[3,"for"],["autocomplete","off",3,"input","id","value"]],template:function(n,e){n&1&&(s(0,"section")(1,"label",0),I(2),m(),s(3,"input",1),y("input",function(a){return e.handleInput(a)}),m()()),n&2&&(r(e.theme.components.DateTimeInput.container),u(),r(e.theme.components.DateTimeInput.label),d("htmlFor",e.inputId),u(),M(e.label()),u(),T(e.theme.additionalStyles==null?null:e.theme.additionalStyles.DateTimeInput),r(e.theme.components.DateTimeInput.element),d("id",e.inputId)("value",e.inputValue()),v("type",e.inputType()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return i})();export{S as DatetimeInput}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-JOTH6MSK.js ================================================ import{$a as s,Ac as _,Ca as o,Fb as u,Kb as g,Pa as r,Xb as y,Yb as C,db as c,ld as M,md as v,nb as a,tb as d,ub as l,vb as p,wb as m,xb as f,yb as h}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function O(e,x){if(e&1&&u(0,0),e&2){let n=x.$implicit,i=g();m("surfaceId",i.surfaceId())("component",n)}}var D=(()=>{class e extends M{direction=_("vertical");static \u0275fac=(()=>{let n;return function(t){return(n||(n=o(e)))(t||e)}})();static \u0275cmp=s({type:e,selectors:[["a2ui-list"]],hostVars:1,hostBindings:function(i,t){i&2&&a("direction",t.direction())},inputs:{direction:[1,"direction"]},features:[c],decls:3,vars:4,consts:[["a2ui-renderer","",3,"surfaceId","component"]],template:function(i,t){i&1&&(f(0,"section"),l(1,O,1,2,"ng-container",0,d),h()),i&2&&(y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.List),C(t.theme.components.List),r(),p(t.component().properties.children))},dependencies:[v],styles:['[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}[direction="vertical"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:grid}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%]{display:flex;max-width:100%;overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}[direction="horizontal"][_nghost-%COMP%] section[_ngcontent-%COMP%] > [_ngcontent-%COMP%]::slotted(*){flex:1 0 fit-content;max-width:min(80%,400px)}']})}return e})();export{D as List}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-KPALJACC.js ================================================ import{$a as c,Ab as l,Ac as r,Bb as d,Ca as m,Hb as p,Jb as g,Kb as h,Pa as o,Xb as x,Yb as a,Zb as y,_b as M,db as b,fc as T,gc as _,hc as C,ld as F,pb as v,rb as f,uc as s}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function P(n,D){if(n&1&&(l(0,"label",2),y(1),d()),n&2){let t=h(),i=C(0);a(t.theme.components.TextField.label),p("htmlFor",t.inputId),o(),M(i)}}var S=(()=>{class n extends F{text=r.required();label=r.required();inputType=r.required();inputValue=s(()=>super.resolvePrimitive(this.text())||"");resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-input");handleInput(t){let i=this.text()?.path;!(t.target instanceof HTMLInputElement)||!i||this.processor.setData(this.component(),i,t.target.value,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(n)))(e||n)}})();static \u0275cmp=c({type:n,selectors:[["a2ui-text-field"]],inputs:{text:[1,"text"],label:[1,"label"],inputType:[1,"inputType"]},features:[b],decls:4,vars:11,consts:[[3,"for","class"],["autocomplete","off","placeholder","Please enter a value",3,"input","id","value","type"],[3,"for"]],template:function(i,e){if(i&1&&(T(0),l(1,"section"),v(2,P,2,4,"label",0),l(3,"input",1),g("input",function(I){return e.handleInput(I)}),d()()),i&2){let u=_(e.resolvedLabel());o(),a(e.theme.components.TextField.container),o(),f(u?2:-1),o(),x(e.theme.additionalStyles==null?null:e.theme.additionalStyles.TextField),a(e.theme.components.TextField.element),p("id",e.inputId)("value",e.inputValue())("type",e.inputType()==="number"?"number":"text")}},styles:["[_nghost-%COMP%]{display:flex;flex:var(--weight)}section[_ngcontent-%COMP%], input[_ngcontent-%COMP%], label[_ngcontent-%COMP%]{box-sizing:border-box}input[_ngcontent-%COMP%]{display:block;width:100%}label[_ngcontent-%COMP%]{display:block;margin-bottom:4px}"]})}return n})();export{S as TextField}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-P66EZ4FO.js ================================================ import{$a as C,Aa as f,Bc as k,Fb as m,Gb as p,Ib as d,Kb as o,Pa as r,Sb as w,Tb as v,Xb as y,Yb as u,Zb as D,db as M,ld as b,md as P,na as a,oa as c,pb as x,rb as h,wb as g,xb as l,yb as s,za as _}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var V=["dialog"];function S(t,E){if(t&1){let e=p();l(0,"dialog",2,0),d("click",function(i){a(e);let O=o();return c(O.handleDialogClick(i))}),l(2,"section")(3,"div",3)(4,"button",2),d("click",function(){a(e);let i=o();return c(i.closeDialog())}),l(5,"span",4),D(6,"close"),s()()(),m(7,5),s()()}if(t&2){let e=o();u(e.theme.components.Modal.backdrop),r(2),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Modal),u(e.theme.components.Modal.element),r(5),g("surfaceId",e.surfaceId())("component",e.component().properties.contentChild)}}function T(t,E){if(t&1){let e=p();l(0,"section",2),d("click",function(){a(e);let i=o();return c(i.showDialog.set(!0))}),m(1,5),s()}if(t&2){let e=o();r(),g("surfaceId",e.surfaceId())("component",e.component().properties.entryPointChild)}}var j=(()=>{class t extends b{showDialog=_(!1);dialog=k("dialog");constructor(){super(),f(()=>{let e=this.dialog();e&&!e.nativeElement.open&&e.nativeElement.showModal()})}handleDialogClick(e){e.target instanceof HTMLDialogElement&&this.closeDialog()}closeDialog(){let e=this.dialog();e&&(e.nativeElement.open||e.nativeElement.close(),this.showDialog.set(!1))}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=C({type:t,selectors:[["a2ui-modal"]],viewQuery:function(n,i){n&1&&w(i.dialog,V,5),n&2&&v()},features:[M],decls:2,vars:1,consts:[["dialog",""],[3,"class"],[3,"click"],[1,"controls"],[1,"g-icon"],["a2ui-renderer","",3,"surfaceId","component"]],template:function(n,i){n&1&&x(0,S,8,8,"dialog",1)(1,T,2,2,"section"),n&2&&h(i.showDialog()?0:1)},dependencies:[P],styles:["dialog[_ngcontent-%COMP%]{padding:0;border:none;background:none}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%]{display:flex;justify-content:end;margin-bottom:4px}dialog[_ngcontent-%COMP%] section[_ngcontent-%COMP%] .controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:0;background:none;width:20px;height:20px;pointer:cursor;border:none;cursor:pointer}"]})}return t})();export{j as Modal}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-POBF2O3Z.js ================================================ import{$a as d,Ab as m,Ac as _,Bb as u,Ca as r,Cb as p,Hb as v,Kb as f,Ma as l,Pa as n,Xb as y,Yb as g,db as s,fc as h,gc as x,hc as C,ld as b,pb as a,rb as c,uc as M}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function U(e,V){if(e&1&&(m(0,"section"),p(1,"video",1),u()),e&2){let t=f(),i=C(0);y(t.theme.additionalStyles==null?null:t.theme.additionalStyles.Video),g(t.theme.components.Video),n(),v("src",i,l)}}var L=(()=>{class e extends b{url=_.required();resolvedUrl=M(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(o){return(t||(t=r(e)))(o||e)}})();static \u0275cmp=d({type:e,selectors:[["a2ui-video"]],inputs:{url:[1,"url"]},features:[s],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(i,o){if(i&1&&(h(0),a(1,U,2,5,"section",0)),i&2){let D=x(o.resolvedUrl());n(),c(D?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}video[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{L as Video}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-QWN7CXIU.js ================================================ import{$a as p,Ab as l,Ac as c,Bb as r,Ca as m,Hb as d,Jb as h,Pa as o,Xb as v,Yb as a,Zb as g,_b as b,db as u,ld as f,uc as s}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var E=(()=>{class i extends f{value=c.required();label=c.required();inputChecked=s(()=>super.resolvePrimitive(this.value())??!1);resolvedLabel=s(()=>super.resolvePrimitive(this.label()));inputId=super.getUniqueId("a2ui-checkbox");handleChange(t){let n=this.value()?.path;!(t.target instanceof HTMLInputElement)||!n||this.processor.setData(this.component(),n,t.target.checked,this.surfaceId())}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=p({type:i,selectors:[["a2ui-checkbox"]],inputs:{value:[1,"value"],label:[1,"label"]},features:[u],decls:4,vars:12,consts:[["autocomplete","off","type","checkbox",3,"change","id","checked"],[3,"htmlFor"]],template:function(n,e){n&1&&(l(0,"section")(1,"input",0),h("change",function(k){return e.handleChange(k)}),r(),l(2,"label",1),g(3),r()()),n&2&&(v(e.theme.additionalStyles==null?null:e.theme.additionalStyles.CheckBox),a(e.theme.components.CheckBox.container),o(),a(e.theme.components.CheckBox.element),d("id",e.inputId)("checked",e.inputChecked()),o(),a(e.theme.components.CheckBox.label),d("htmlFor",e.inputId),o(),b(e.resolvedLabel()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}input[_ngcontent-%COMP%]{display:block;width:100%}"]})}return i})();export{E as Checkbox}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-QZL3KUOO.js ================================================ import{$a as l,Ab as c,Ac as M,Bb as u,Ca as r,Cb as m,Hb as p,Kb as v,Pa as n,Xb as f,Yb as y,db as d,fc as g,gc as h,hc as x,ld as _,pb as a,rb as s,uc as C}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function D(e,P){if(e&1&&(c(0,"section"),m(1,"audio",1),u()),e&2){let t=v(),o=x(0);f(t.theme.additionalStyles==null?null:t.theme.additionalStyles.AudioPlayer),y(t.theme.components.AudioPlayer),n(),p("src",o)}}var w=(()=>{class e extends _{url=M.required();resolvedUrl=C(()=>this.resolvePrimitive(this.url()));static \u0275fac=(()=>{let t;return function(i){return(t||(t=r(e)))(i||e)}})();static \u0275cmp=l({type:e,selectors:[["a2ui-audio"]],inputs:{url:[1,"url"]},features:[d],decls:2,vars:2,consts:[[3,"class","style"],["controls","",3,"src"]],template:function(o,i){if(o&1&&(g(0),a(1,D,2,5,"section",0)),o&2){let b=h(i.resolvedUrl());n(),s(b?1:-1)}},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}audio[_ngcontent-%COMP%]{display:block;width:100%;box-sizing:border-box}"]})}return e})();export{w as Audio}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-R2V2IE5A.js ================================================ import{$a as f,$b as D,Ac as w,Ca as _,Fb as I,Gb as g,Ib as T,Kb as c,Lc as E,Pa as a,Xb as C,Yb as r,Zb as M,db as h,fc as F,gc as k,hc as S,ld as L,md as N,na as p,oa as u,tb as x,ub as v,uc as $,vb as y,wb as d,xb as l,yb as o,za as b}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";function B(n,m){if(n&1){let t=g();l(0,"button",2),T("click",function(){let e=p(t).$index,i=c();return u(i.selectedIndex.set(e))}),M(1),o()}if(n&2){let t=m.$implicit,s=m.$index,e=c(),i=S(0);r(e.buttonClasses()[i]),d("disabled",i===s),a(),D(" ",e.resolvePrimitive(t.title)," ")}}var z=(()=>{class n extends L{selectedIndex=b(0);tabs=w.required();buttonClasses=$(()=>{let t=this.selectedIndex();return this.tabs().map((s,e)=>e===t?E.merge(this.theme.components.Tabs.controls.all,this.theme.components.Tabs.controls.selected):this.theme.components.Tabs.controls.all)});static \u0275fac=(()=>{let t;return function(e){return(t||(t=_(n)))(e||n)}})();static \u0275cmp=f({type:n,selectors:[["a2ui-tabs"]],inputs:{tabs:[1,"tabs"]},features:[h],decls:6,vars:9,consts:[[3,"disabled","class"],["a2ui-renderer","",3,"surfaceId","component"],[3,"click","disabled"]],template:function(s,e){if(s&1&&(F(0),l(1,"section")(2,"div"),v(3,B,2,4,"button",0,x),o(),I(5,1),o()),s&2){let i=e.tabs(),V=k(e.selectedIndex());a(),C(e.theme.additionalStyles==null?null:e.theme.additionalStyles.Tabs),r(e.theme.components.Tabs.container),a(),r(e.theme.components.Tabs.element),a(),y(i),a(2),d("surfaceId",e.surfaceId())("component",i[V].child)}},dependencies:[N],styles:["[_nghost-%COMP%]{display:block;flex:var(--weight)}"]})}return n})();export{z as Tabs}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-W7GRJBO5.js ================================================ var q=Object.create;var k=Object.defineProperty,r=Object.defineProperties,s=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyDescriptors,u=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,n=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var m=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),w=b=>{throw TypeError(b)};var o=(b,a,c)=>a in b?k(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})n.call(a,c)&&o(b,c,a[c]);if(j)for(var c of j(a))p.call(a,c)&&o(b,c,a[c]);return b},A=(b,a)=>r(b,t(a));var B=(b,a)=>{var c={};for(var d in b)n.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&j)for(var d of j(b))a.indexOf(d)<0&&p.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports),D=(b,a)=>{for(var c in a)k(b,c,{get:a[c],enumerable:!0})},x=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of u(a))!n.call(b,e)&&e!==c&&k(b,e,{get:()=>a[e],enumerable:!(d=s(a,e))||d.enumerable});return b};var E=(b,a,c)=>(c=b!=null?q(v(b)):{},x(a||!b||!b.__esModule?k(c,"default",{value:b,enumerable:!0}):c,b));var F=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(l){e(l)}},h=g=>{try{i(c.throw(g))}catch(l){e(l)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var G=b=>{var a=b[m("asyncIterator")],c=!1,d,e={};return a==null?(a=b[m("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||w("Object expected"),i(g)}),1)}}),e[m("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g,G as h}; ================================================ FILE: cmd/launcher/web/webui/distr/chunk-YQ6GIDJJ.js ================================================ import{$a as h,Ab as l,Ac as c,Bb as a,Ca as m,Hb as r,Jb as M,Kb as C,Pa as n,Xb as y,Yb as s,Zb as d,_b as u,db as v,ld as b,ub as g,uc as _,vb as f}from"./chunk-7TJPJFPQ.js";import"./chunk-W7GRJBO5.js";var D=(i,p)=>p.value;function P(i,p){if(i&1&&(l(0,"option",2),d(1),a()),i&2){let t=p.$implicit,o=C();r("value",t.value),n(),u(o.resolvePrimitive(t.label))}}var x=(()=>{class i extends b{options=c.required();value=c.required();description=c.required();selectId=super.getUniqueId("a2ui-multiple-choice");selectValue=_(()=>super.resolvePrimitive(this.value()));handleChange(t){let o=this.value()?.path;!(t.target instanceof HTMLSelectElement)||!t.target.value||!o||this.processor.setData(this.component(),this.processor.resolvePath(o,this.component().dataContextPath),t.target.value)}static \u0275fac=(()=>{let t;return function(e){return(t||(t=m(i)))(e||i)}})();static \u0275cmp=h({type:i,selectors:[["a2ui-multiple-choice"]],inputs:{options:[1,"options"],value:[1,"value"],description:[1,"description"]},features:[v],decls:6,vars:12,consts:[[3,"for"],[3,"change","id","value"],[3,"value"]],template:function(o,e){o&1&&(l(0,"section")(1,"label",0),d(2),a(),l(3,"select",1),M("change",function(E){return e.handleChange(E)}),g(4,P,2,2,"option",2,D),a()()),o&2&&(s(e.theme.components.MultipleChoice.container),n(),s(e.theme.components.MultipleChoice.label),r("htmlFor",e.selectId),n(),u(e.description()),n(),y(e.theme.additionalStyles==null?null:e.theme.additionalStyles.MultipleChoice),s(e.theme.components.MultipleChoice.element),r("id",e.selectId)("value",e.selectValue()),n(),f(e.options()))},styles:["[_nghost-%COMP%]{display:block;flex:var(--weight);min-height:0;overflow:auto}select[_ngcontent-%COMP%]{width:100%;box-sizing:border-box}"]})}return i})();export{x as MultipleChoice}; ================================================ FILE: cmd/launcher/web/webui/distr/index.html ================================================ Agent Development Kit Dev UI ================================================ FILE: cmd/launcher/web/webui/distr/main-ORIYWHAC.js ================================================ import{$ as xC,$a as kA,$b as Fe,$c as y0,A as fc,Aa as pa,Ab as ti,Ac as nt,B as cf,Ba as ei,Bb as Ii,Bc as Xo,C as mc,Ca as hi,Cb as Ni,Cc as wL,D as Cf,Da as ge,Db as ws,Dc as w0,E as Qi,Ea as Sg,Eb as ys,Ec as ft,F as iL,Fa as Bf,Fb as $i,Fc as kI,G as We,Ga as Qf,Gb as zA,Gc as he,H as nL,Ha as vI,Hb as Bo,Hc as Zi,I as yI,Ia as cL,Ib as $,Ic as yL,J as Ho,Ja as CL,Jb as pc,Jc as yf,K as qE,Ka as ul,Kb as y,Kc as vL,L as ps,La as xg,Lb as Yt,Lc as Ms,M as qn,Ma as Da,Mb as He,Mc as uv,N as VE,Na as RC,Nb as na,Nc as bL,O as hl,Oa as m0,Ob as ni,Oc as fv,P as If,Pa as p,Pb as Ce,Pc as ML,Q as po,Qa as Ef,Qb as Ie,Qc as wc,R as Bv,Ra as Nn,Rb as wf,Rc as kL,S as kC,Sa as Fn,Sb as Or,Sc as Rg,T as SC,Ta as Dr,Tb as rr,Tc as FC,U as Ds,Ua as ui,Ub as Wi,Uc as md,V as rg,Va as lt,Vb as En,Vc as yc,W as nn,Wa as hf,Wb as ae,Wc as vf,X as Ei,Xa as Ro,Xb as QL,Xc as Ng,Y as Bt,Ya as Ev,Yb as Qo,Yc as Pr,Z as oL,Za as IL,Zb as K,Zc as bf,_ as Wt,_a as uf,_b as qA,_c as oa,a as Rn,aa as wt,ab as Xe,ac as Dc,ad as mv,b as ZF,ba as aL,bb as OA,bc as EL,bd as SL,c as XF,ca as ar,cb as ff,cc as oo,cd as xL,d as Ti,da as TA,db as Ct,dc as Vn,dd as RL,e as $F,ea as Ze,eb as yt,ec as ao,ed as ks,f as $A,fa as rL,fb as mf,fc as wr,fd as NL,g as AL,ga as wA,gb as dL,gc as sg,gd as FL,h as Jt,ha as Do,hb as bI,hc as vs,hd as LC,i as El,ia as h,ib as pf,ic as MI,id as LL,j as Iv,ja as sL,jb as hv,jc as It,jd as _L,k as sf,ka as pr,kb as BL,kc as WE,kd as GL,l as Qd,la as Ya,lb as p0,lc as zr,m as xa,ma as gL,mb as Df,mc as fl,n as jE,na as rA,nb as ie,nc as oi,nd as KL,o as Ed,oa as sA,ob as ud,oc as li,od as UL,p as mr,pa as Qt,pb as V,pc as hL,q as oe,qa as Tr,qb as D0,qc as NC,r as gf,ra as ut,rb as W,rc as uL,s as hd,sa as Zt,sb as fd,sc as fL,t as eL,ta as Wa,tb as Ri,tc as Zo,u as tL,ua as lL,ub as Gt,uc as _e,v as fe,va as WA,vb as Kt,vc as mL,w as Va,wa as Oe,wb as X,wc as pL,x as uc,xa as df,xb as m,xc as bs,y as dv,ya as Qv,yb as D,yc as DL,z as lf,za as jA,zb as GA,zc as No}from"./chunk-7TJPJFPQ.js";import{a as BA,b as Ve,c as WF,d as Ql,f as rf,g as ct,h as le}from"./chunk-W7GRJBO5.js";var KY=Ql(F9=>{"use strict";var GY={b:"\b",f:"\f",n:` `,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},vCA=97;F9.parse=function(t,e,A){var i={},n=0,o=0,a=0,r=A&&A.bigint&&typeof BigInt<"u";return{data:s("",!0),pointers:i};function s(Y,j){g();var AA;R(Y,"value");var z=Q();switch(z){case"t":B("rue"),AA=!0;break;case"f":B("alse"),AA=!1;break;case"n":B("ull"),AA=null;break;case'"':AA=l();break;case"[":AA=I(Y);break;case"{":AA=d(Y);break;default:E(),"-0123456789".indexOf(z)>=0?AA=C():F()}return R(Y,"valueEnd"),g(),j&&aNumber.MAX_SAFE_INTEGER||AA="a"&&AA<="f"?j+=AA.charCodeAt()-vCA+10:AA>="0"&&AA<="9"?j+=+AA:G()}return String.fromCharCode(j)}function b(){for(var Y="";t[a]>="0"&&t[a]<="9";)Y+=Q();if(Y.length)return Y;U(),F()}function R(Y,j){M(Y,j,v())}function M(Y,j,AA){i[Y]=i[Y]||{},i[Y][j]=AA}function v(){return{line:n,column:o,pos:a}}function F(){throw new SyntaxError("Unexpected token "+t[a]+" in JSON at position "+a)}function G(){E(),F()}function U(){if(a>=t.length)throw new SyntaxError("Unexpected end of JSON input")}};F9.stringify=function(t,e,A){if(!w6(t))return;var i=0,n,o,a=typeof A=="object"?A.space:A;switch(typeof a){case"number":var r=a>10?10:a<0?0:Math.floor(a);a=r&&M(r," "),n=r,o=r;break;case"string":a=a.slice(0,10),n=0,o=0;for(var s=0;s=0}var MCA=/"|\\/g,kCA=/[\b]/g,SCA=/\f/g,xCA=/\n/g,RCA=/\r/g,NCA=/\t/g;function y6(t){return t=t.replace(MCA,"\\$&").replace(SCA,"\\f").replace(kCA,"\\b").replace(xCA,"\\n").replace(RCA,"\\r").replace(NCA,"\\t"),'"'+t+'"'}var FCA=/~/g,LCA=/\//g;function N9(t){return t.replace(FCA,"~0").replace(LCA,"~1")}});var az=Ql((c1e,oz)=>{"use strict";var nz=function(t,e){var A,i,n=1,o=0,a=0,r=String.alphabet;function s(g,l,C){if(C){for(A=l;C=s(g,A),C<76&&C>65;)++A;return+g.slice(l-1,A)}return C=r&&r.indexOf(g.charAt(l)),C>-1?C+76:(C=g.charCodeAt(l)||0,C<45||C>127?C:C<46?65:C<48?C-1:C<58?C+18:C<65?C-11:C<91?C+11:C<97?C-37:C<123?C+5:C-63)}if((t+="")!=(e+="")){for(;n;)if(i=s(t,o++),n=s(e,a++),i<76&&n<76&&i>66&&n>66&&(i=s(t,o,o),n=s(e,a,o=A),a=A),i!=n)return i{"use strict";(function(t){"use strict";function e(J){return J!==null?Object.prototype.toString.call(J)==="[object Array]":!1}function A(J){return J!==null?Object.prototype.toString.call(J)==="[object Object]":!1}function i(J,O){if(J===O)return!0;var tA=Object.prototype.toString.call(J);if(tA!==Object.prototype.toString.call(O))return!1;if(e(J)===!0){if(J.length!==O.length)return!1;for(var oA=0;oA",9:"Array"},R="EOF",M="UnquotedIdentifier",v="QuotedIdentifier",F="Rbracket",G="Rparen",U="Comma",Y="Colon",j="Rbrace",AA="Number",z="Current",yA="Expref",P="Pipe",nA="Or",eA="And",dA="EQ",iA="GT",aA="LT",hA="GTE",JA="LTE",ee="NE",UA="Flatten",mA="Star",KA="Filter",ze="Dot",Ke="Not",HA="Lbrace",uA="Lbracket",XA="Lparen",EA="Literal",ZA={".":ze,"*":mA,",":U,":":Y,"{":HA,"}":j,"]":F,"(":XA,")":G,"@":z},MA={"<":!0,">":!0,"=":!0,"!":!0},be={" ":!0," ":!0,"\n":!0};function _A(J){return J>="a"&&J<="z"||J>="A"&&J<="Z"||J==="_"}function pA(J){return J>="0"&&J<="9"||J==="-"}function Rt(J){return J>="a"&&J<="z"||J>="A"&&J<="Z"||J>="0"&&J<="9"||J==="_"}function Et(){}Et.prototype={tokenize:function(J){var O=[];this._current=0;for(var tA,oA,NA;this._current")return J[this._current]==="="?(this._current++,{type:hA,value:">=",start:O}):{type:iA,value:">",start:O};if(tA==="="&&J[this._current]==="=")return this._current++,{type:dA,value:"==",start:O}},_consumeLiteral:function(J){this._current++;for(var O=this._current,tA=J.length,oA;J[this._current]!=="`"&&this._current=0)return!0;if(tA.indexOf(J)>=0)return!0;if(oA.indexOf(J[0])>=0)try{return JSON.parse(J),!0}catch(NA){return!1}else return!1}};var Qe={};Qe[R]=0,Qe[M]=0,Qe[v]=0,Qe[F]=0,Qe[G]=0,Qe[U]=0,Qe[j]=0,Qe[AA]=0,Qe[z]=0,Qe[yA]=0,Qe[P]=1,Qe[nA]=2,Qe[eA]=3,Qe[dA]=5,Qe[iA]=5,Qe[aA]=5,Qe[hA]=5,Qe[JA]=5,Qe[ee]=5,Qe[UA]=9,Qe[mA]=20,Qe[KA]=21,Qe[ze]=40,Qe[Ke]=45,Qe[HA]=50,Qe[uA]=55,Qe[XA]=60;function _t(){}_t.prototype={parse:function(J){this._loadTokens(J),this.index=0;var O=this.expression(0);if(this._lookahead(0)!==R){var tA=this._lookaheadToken(0),oA=new Error("Unexpected token type: "+tA.type+", value: "+tA.value);throw oA.name="ParserError",oA}return O},_loadTokens:function(J){var O=new Et,tA=O.tokenize(J);tA.push({type:R,value:"",start:J.length}),this.tokens=tA},expression:function(J){var O=this._lookaheadToken(0);this._advance();for(var tA=this.nud(O),oA=this._lookahead(0);J=0)return this.expression(J);if(O===uA)return this._match(uA),this._parseMultiselectList();if(O===HA)return this._match(HA),this._parseMultiselectHash()},_parseProjectionRHS:function(J){var O;if(Qe[this._lookahead(0)]<10)O={type:"Identity"};else if(this._lookahead(0)===uA)O=this.expression(J);else if(this._lookahead(0)===KA)O=this.expression(J);else if(this._lookahead(0)===ze)this._match(ze),O=this._parseDotRHS(J);else{var tA=this._lookaheadToken(0),oA=new Error("Sytanx error, unexpected token: "+tA.value+"("+tA.type+")");throw oA.name="ParserError",oA}return O},_parseMultiselectList:function(){for(var J=[];this._lookahead(0)!==F;){var O=this.expression(0);if(J.push(O),this._lookahead(0)===U&&(this._match(U),this._lookahead(0)===F))throw new Error("Unexpected token Rbracket")}return this._match(F),{type:"MultiSelectList",children:J}},_parseMultiselectHash:function(){for(var J=[],O=[M,v],tA,oA,NA,de;;){if(tA=this._lookaheadToken(0),O.indexOf(tA.type)<0)throw new Error("Expecting an identifier token, got: "+tA.type);if(oA=tA.value,this._advance(),this._match(Y),NA=this.expression(0),de={type:"KeyValuePair",name:oA,value:NA},J.push(de),this._lookahead(0)===U)this._match(U);else if(this._lookahead(0)===j){this._match(j);break}}return{type:"MultiSelectHash",children:J}}};function Ue(J){this.runtime=J}Ue.prototype={search:function(J,O){return this.visit(J,O)},visit:function(J,O){var tA,oA,NA,de,Ee,xA,LA,dt,At,Je;switch(J.type){case"Field":return O!==null&&A(O)?(xA=O[J.name],xA===void 0?null:xA):null;case"Subexpression":for(NA=this.visit(J.children[0],O),Je=1;Je0)for(Je=rn;JeLe;Je+=ji)NA.push(O[Je]);return NA;case"Projection":var Bi=this.visit(J.children[0],O);if(!e(Bi))return null;for(At=[],Je=0;JeEe;break;case hA:NA=de>=Ee;break;case aA:NA=de=J&&(O=tA<0?J-1:J),O}};function Te(J){this._interpreter=J,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[s]}]},avg:{_func:this._functionAvg,_signature:[{types:[E]}]},ceil:{_func:this._functionCeil,_signature:[{types:[s]}]},contains:{_func:this._functionContains,_signature:[{types:[l,C]},{types:[g]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[l]},{types:[l]}]},floor:{_func:this._functionFloor,_signature:[{types:[s]}]},length:{_func:this._functionLength,_signature:[{types:[l,C,I]}]},map:{_func:this._functionMap,_signature:[{types:[B]},{types:[C]}]},max:{_func:this._functionMax,_signature:[{types:[E,f]}]},merge:{_func:this._functionMerge,_signature:[{types:[I],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[C]},{types:[B]}]},sum:{_func:this._functionSum,_signature:[{types:[E]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[l]},{types:[l]}]},min:{_func:this._functionMin,_signature:[{types:[E,f]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[C]},{types:[B]}]},type:{_func:this._functionType,_signature:[{types:[g]}]},keys:{_func:this._functionKeys,_signature:[{types:[I]}]},values:{_func:this._functionValues,_signature:[{types:[I]}]},sort:{_func:this._functionSort,_signature:[{types:[f,E]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[C]},{types:[B]}]},join:{_func:this._functionJoin,_signature:[{types:[l]},{types:[f]}]},reverse:{_func:this._functionReverse,_signature:[{types:[l,C]}]},to_array:{_func:this._functionToArray,_signature:[{types:[g]}]},to_string:{_func:this._functionToString,_signature:[{types:[g]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[g]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[g],variadic:!0}]}}}Te.prototype={callFunction:function(J,O){var tA=this.functionTable[J];if(tA===void 0)throw new Error("Unknown function: "+J+"()");return this._validateArgs(J,O,tA._signature),tA._func.call(this,O)},_validateArgs:function(J,O,tA){var oA;if(tA[tA.length-1].variadic){if(O.length=0;NA--)oA+=tA[NA];return oA}else{var de=J[0].slice(0);return de.reverse(),de}},_functionAbs:function(J){return Math.abs(J[0])},_functionCeil:function(J){return Math.ceil(J[0])},_functionAvg:function(J){for(var O=0,tA=J[0],oA=0;oA=0},_functionFloor:function(J){return Math.floor(J[0])},_functionLength:function(J){return A(J[0])?Object.keys(J[0]).length:J[0].length},_functionMap:function(J){for(var O=[],tA=this._interpreter,oA=J[0],NA=J[1],de=0;de0){var O=this._getTypeName(J[0][0]);if(O===s)return Math.max.apply(Math,J[0]);for(var tA=J[0],oA=tA[0],NA=1;NA0){var O=this._getTypeName(J[0][0]);if(O===s)return Math.min.apply(Math,J[0]);for(var tA=J[0],oA=tA[0],NA=1;NAGe?1:JeNA&&(NA=Ee,de=tA[xA]);return de},_functionMinBy:function(J){for(var O=J[1],tA=J[0],oA=this.createKeyFunction(O,[s,l]),NA=1/0,de,Ee,xA=0;xA"u"?C8.jmespath={}:C8)});var liA=Ql((QMe,giA)=>{"use strict";giA.exports=[{value:"#B0171F",name:"indian red"},{value:"#DC143C",css:!0,name:"crimson"},{value:"#FFB6C1",css:!0,name:"lightpink"},{value:"#FFAEB9",name:"lightpink 1"},{value:"#EEA2AD",name:"lightpink 2"},{value:"#CD8C95",name:"lightpink 3"},{value:"#8B5F65",name:"lightpink 4"},{value:"#FFC0CB",css:!0,name:"pink"},{value:"#FFB5C5",name:"pink 1"},{value:"#EEA9B8",name:"pink 2"},{value:"#CD919E",name:"pink 3"},{value:"#8B636C",name:"pink 4"},{value:"#DB7093",css:!0,name:"palevioletred"},{value:"#FF82AB",name:"palevioletred 1"},{value:"#EE799F",name:"palevioletred 2"},{value:"#CD6889",name:"palevioletred 3"},{value:"#8B475D",name:"palevioletred 4"},{value:"#FFF0F5",name:"lavenderblush 1"},{value:"#FFF0F5",css:!0,name:"lavenderblush"},{value:"#EEE0E5",name:"lavenderblush 2"},{value:"#CDC1C5",name:"lavenderblush 3"},{value:"#8B8386",name:"lavenderblush 4"},{value:"#FF3E96",name:"violetred 1"},{value:"#EE3A8C",name:"violetred 2"},{value:"#CD3278",name:"violetred 3"},{value:"#8B2252",name:"violetred 4"},{value:"#FF69B4",css:!0,name:"hotpink"},{value:"#FF6EB4",name:"hotpink 1"},{value:"#EE6AA7",name:"hotpink 2"},{value:"#CD6090",name:"hotpink 3"},{value:"#8B3A62",name:"hotpink 4"},{value:"#872657",name:"raspberry"},{value:"#FF1493",name:"deeppink 1"},{value:"#FF1493",css:!0,name:"deeppink"},{value:"#EE1289",name:"deeppink 2"},{value:"#CD1076",name:"deeppink 3"},{value:"#8B0A50",name:"deeppink 4"},{value:"#FF34B3",name:"maroon 1"},{value:"#EE30A7",name:"maroon 2"},{value:"#CD2990",name:"maroon 3"},{value:"#8B1C62",name:"maroon 4"},{value:"#C71585",css:!0,name:"mediumvioletred"},{value:"#D02090",name:"violetred"},{value:"#DA70D6",css:!0,name:"orchid"},{value:"#FF83FA",name:"orchid 1"},{value:"#EE7AE9",name:"orchid 2"},{value:"#CD69C9",name:"orchid 3"},{value:"#8B4789",name:"orchid 4"},{value:"#D8BFD8",css:!0,name:"thistle"},{value:"#FFE1FF",name:"thistle 1"},{value:"#EED2EE",name:"thistle 2"},{value:"#CDB5CD",name:"thistle 3"},{value:"#8B7B8B",name:"thistle 4"},{value:"#FFBBFF",name:"plum 1"},{value:"#EEAEEE",name:"plum 2"},{value:"#CD96CD",name:"plum 3"},{value:"#8B668B",name:"plum 4"},{value:"#DDA0DD",css:!0,name:"plum"},{value:"#EE82EE",css:!0,name:"violet"},{value:"#FF00FF",vga:!0,name:"magenta"},{value:"#FF00FF",vga:!0,css:!0,name:"fuchsia"},{value:"#EE00EE",name:"magenta 2"},{value:"#CD00CD",name:"magenta 3"},{value:"#8B008B",name:"magenta 4"},{value:"#8B008B",css:!0,name:"darkmagenta"},{value:"#800080",vga:!0,css:!0,name:"purple"},{value:"#BA55D3",css:!0,name:"mediumorchid"},{value:"#E066FF",name:"mediumorchid 1"},{value:"#D15FEE",name:"mediumorchid 2"},{value:"#B452CD",name:"mediumorchid 3"},{value:"#7A378B",name:"mediumorchid 4"},{value:"#9400D3",css:!0,name:"darkviolet"},{value:"#9932CC",css:!0,name:"darkorchid"},{value:"#BF3EFF",name:"darkorchid 1"},{value:"#B23AEE",name:"darkorchid 2"},{value:"#9A32CD",name:"darkorchid 3"},{value:"#68228B",name:"darkorchid 4"},{value:"#4B0082",css:!0,name:"indigo"},{value:"#8A2BE2",css:!0,name:"blueviolet"},{value:"#9B30FF",name:"purple 1"},{value:"#912CEE",name:"purple 2"},{value:"#7D26CD",name:"purple 3"},{value:"#551A8B",name:"purple 4"},{value:"#9370DB",css:!0,name:"mediumpurple"},{value:"#AB82FF",name:"mediumpurple 1"},{value:"#9F79EE",name:"mediumpurple 2"},{value:"#8968CD",name:"mediumpurple 3"},{value:"#5D478B",name:"mediumpurple 4"},{value:"#483D8B",css:!0,name:"darkslateblue"},{value:"#8470FF",name:"lightslateblue"},{value:"#7B68EE",css:!0,name:"mediumslateblue"},{value:"#6A5ACD",css:!0,name:"slateblue"},{value:"#836FFF",name:"slateblue 1"},{value:"#7A67EE",name:"slateblue 2"},{value:"#6959CD",name:"slateblue 3"},{value:"#473C8B",name:"slateblue 4"},{value:"#F8F8FF",css:!0,name:"ghostwhite"},{value:"#E6E6FA",css:!0,name:"lavender"},{value:"#0000FF",vga:!0,css:!0,name:"blue"},{value:"#0000EE",name:"blue 2"},{value:"#0000CD",name:"blue 3"},{value:"#0000CD",css:!0,name:"mediumblue"},{value:"#00008B",name:"blue 4"},{value:"#00008B",css:!0,name:"darkblue"},{value:"#000080",vga:!0,css:!0,name:"navy"},{value:"#191970",css:!0,name:"midnightblue"},{value:"#3D59AB",name:"cobalt"},{value:"#4169E1",css:!0,name:"royalblue"},{value:"#4876FF",name:"royalblue 1"},{value:"#436EEE",name:"royalblue 2"},{value:"#3A5FCD",name:"royalblue 3"},{value:"#27408B",name:"royalblue 4"},{value:"#6495ED",css:!0,name:"cornflowerblue"},{value:"#B0C4DE",css:!0,name:"lightsteelblue"},{value:"#CAE1FF",name:"lightsteelblue 1"},{value:"#BCD2EE",name:"lightsteelblue 2"},{value:"#A2B5CD",name:"lightsteelblue 3"},{value:"#6E7B8B",name:"lightsteelblue 4"},{value:"#778899",css:!0,name:"lightslategray"},{value:"#708090",css:!0,name:"slategray"},{value:"#C6E2FF",name:"slategray 1"},{value:"#B9D3EE",name:"slategray 2"},{value:"#9FB6CD",name:"slategray 3"},{value:"#6C7B8B",name:"slategray 4"},{value:"#1E90FF",name:"dodgerblue 1"},{value:"#1E90FF",css:!0,name:"dodgerblue"},{value:"#1C86EE",name:"dodgerblue 2"},{value:"#1874CD",name:"dodgerblue 3"},{value:"#104E8B",name:"dodgerblue 4"},{value:"#F0F8FF",css:!0,name:"aliceblue"},{value:"#4682B4",css:!0,name:"steelblue"},{value:"#63B8FF",name:"steelblue 1"},{value:"#5CACEE",name:"steelblue 2"},{value:"#4F94CD",name:"steelblue 3"},{value:"#36648B",name:"steelblue 4"},{value:"#87CEFA",css:!0,name:"lightskyblue"},{value:"#B0E2FF",name:"lightskyblue 1"},{value:"#A4D3EE",name:"lightskyblue 2"},{value:"#8DB6CD",name:"lightskyblue 3"},{value:"#607B8B",name:"lightskyblue 4"},{value:"#87CEFF",name:"skyblue 1"},{value:"#7EC0EE",name:"skyblue 2"},{value:"#6CA6CD",name:"skyblue 3"},{value:"#4A708B",name:"skyblue 4"},{value:"#87CEEB",css:!0,name:"skyblue"},{value:"#00BFFF",name:"deepskyblue 1"},{value:"#00BFFF",css:!0,name:"deepskyblue"},{value:"#00B2EE",name:"deepskyblue 2"},{value:"#009ACD",name:"deepskyblue 3"},{value:"#00688B",name:"deepskyblue 4"},{value:"#33A1C9",name:"peacock"},{value:"#ADD8E6",css:!0,name:"lightblue"},{value:"#BFEFFF",name:"lightblue 1"},{value:"#B2DFEE",name:"lightblue 2"},{value:"#9AC0CD",name:"lightblue 3"},{value:"#68838B",name:"lightblue 4"},{value:"#B0E0E6",css:!0,name:"powderblue"},{value:"#98F5FF",name:"cadetblue 1"},{value:"#8EE5EE",name:"cadetblue 2"},{value:"#7AC5CD",name:"cadetblue 3"},{value:"#53868B",name:"cadetblue 4"},{value:"#00F5FF",name:"turquoise 1"},{value:"#00E5EE",name:"turquoise 2"},{value:"#00C5CD",name:"turquoise 3"},{value:"#00868B",name:"turquoise 4"},{value:"#5F9EA0",css:!0,name:"cadetblue"},{value:"#00CED1",css:!0,name:"darkturquoise"},{value:"#F0FFFF",name:"azure 1"},{value:"#F0FFFF",css:!0,name:"azure"},{value:"#E0EEEE",name:"azure 2"},{value:"#C1CDCD",name:"azure 3"},{value:"#838B8B",name:"azure 4"},{value:"#E0FFFF",name:"lightcyan 1"},{value:"#E0FFFF",css:!0,name:"lightcyan"},{value:"#D1EEEE",name:"lightcyan 2"},{value:"#B4CDCD",name:"lightcyan 3"},{value:"#7A8B8B",name:"lightcyan 4"},{value:"#BBFFFF",name:"paleturquoise 1"},{value:"#AEEEEE",name:"paleturquoise 2"},{value:"#AEEEEE",css:!0,name:"paleturquoise"},{value:"#96CDCD",name:"paleturquoise 3"},{value:"#668B8B",name:"paleturquoise 4"},{value:"#2F4F4F",css:!0,name:"darkslategray"},{value:"#97FFFF",name:"darkslategray 1"},{value:"#8DEEEE",name:"darkslategray 2"},{value:"#79CDCD",name:"darkslategray 3"},{value:"#528B8B",name:"darkslategray 4"},{value:"#00FFFF",name:"cyan"},{value:"#00FFFF",css:!0,name:"aqua"},{value:"#00EEEE",name:"cyan 2"},{value:"#00CDCD",name:"cyan 3"},{value:"#008B8B",name:"cyan 4"},{value:"#008B8B",css:!0,name:"darkcyan"},{value:"#008080",vga:!0,css:!0,name:"teal"},{value:"#48D1CC",css:!0,name:"mediumturquoise"},{value:"#20B2AA",css:!0,name:"lightseagreen"},{value:"#03A89E",name:"manganeseblue"},{value:"#40E0D0",css:!0,name:"turquoise"},{value:"#808A87",name:"coldgrey"},{value:"#00C78C",name:"turquoiseblue"},{value:"#7FFFD4",name:"aquamarine 1"},{value:"#7FFFD4",css:!0,name:"aquamarine"},{value:"#76EEC6",name:"aquamarine 2"},{value:"#66CDAA",name:"aquamarine 3"},{value:"#66CDAA",css:!0,name:"mediumaquamarine"},{value:"#458B74",name:"aquamarine 4"},{value:"#00FA9A",css:!0,name:"mediumspringgreen"},{value:"#F5FFFA",css:!0,name:"mintcream"},{value:"#00FF7F",css:!0,name:"springgreen"},{value:"#00EE76",name:"springgreen 1"},{value:"#00CD66",name:"springgreen 2"},{value:"#008B45",name:"springgreen 3"},{value:"#3CB371",css:!0,name:"mediumseagreen"},{value:"#54FF9F",name:"seagreen 1"},{value:"#4EEE94",name:"seagreen 2"},{value:"#43CD80",name:"seagreen 3"},{value:"#2E8B57",name:"seagreen 4"},{value:"#2E8B57",css:!0,name:"seagreen"},{value:"#00C957",name:"emeraldgreen"},{value:"#BDFCC9",name:"mint"},{value:"#3D9140",name:"cobaltgreen"},{value:"#F0FFF0",name:"honeydew 1"},{value:"#F0FFF0",css:!0,name:"honeydew"},{value:"#E0EEE0",name:"honeydew 2"},{value:"#C1CDC1",name:"honeydew 3"},{value:"#838B83",name:"honeydew 4"},{value:"#8FBC8F",css:!0,name:"darkseagreen"},{value:"#C1FFC1",name:"darkseagreen 1"},{value:"#B4EEB4",name:"darkseagreen 2"},{value:"#9BCD9B",name:"darkseagreen 3"},{value:"#698B69",name:"darkseagreen 4"},{value:"#98FB98",css:!0,name:"palegreen"},{value:"#9AFF9A",name:"palegreen 1"},{value:"#90EE90",name:"palegreen 2"},{value:"#90EE90",css:!0,name:"lightgreen"},{value:"#7CCD7C",name:"palegreen 3"},{value:"#548B54",name:"palegreen 4"},{value:"#32CD32",css:!0,name:"limegreen"},{value:"#228B22",css:!0,name:"forestgreen"},{value:"#00FF00",vga:!0,name:"green 1"},{value:"#00FF00",vga:!0,css:!0,name:"lime"},{value:"#00EE00",name:"green 2"},{value:"#00CD00",name:"green 3"},{value:"#008B00",name:"green 4"},{value:"#008000",vga:!0,css:!0,name:"green"},{value:"#006400",css:!0,name:"darkgreen"},{value:"#308014",name:"sapgreen"},{value:"#7CFC00",css:!0,name:"lawngreen"},{value:"#7FFF00",name:"chartreuse 1"},{value:"#7FFF00",css:!0,name:"chartreuse"},{value:"#76EE00",name:"chartreuse 2"},{value:"#66CD00",name:"chartreuse 3"},{value:"#458B00",name:"chartreuse 4"},{value:"#ADFF2F",css:!0,name:"greenyellow"},{value:"#CAFF70",name:"darkolivegreen 1"},{value:"#BCEE68",name:"darkolivegreen 2"},{value:"#A2CD5A",name:"darkolivegreen 3"},{value:"#6E8B3D",name:"darkolivegreen 4"},{value:"#556B2F",css:!0,name:"darkolivegreen"},{value:"#6B8E23",css:!0,name:"olivedrab"},{value:"#C0FF3E",name:"olivedrab 1"},{value:"#B3EE3A",name:"olivedrab 2"},{value:"#9ACD32",name:"olivedrab 3"},{value:"#9ACD32",css:!0,name:"yellowgreen"},{value:"#698B22",name:"olivedrab 4"},{value:"#FFFFF0",name:"ivory 1"},{value:"#FFFFF0",css:!0,name:"ivory"},{value:"#EEEEE0",name:"ivory 2"},{value:"#CDCDC1",name:"ivory 3"},{value:"#8B8B83",name:"ivory 4"},{value:"#F5F5DC",css:!0,name:"beige"},{value:"#FFFFE0",name:"lightyellow 1"},{value:"#FFFFE0",css:!0,name:"lightyellow"},{value:"#EEEED1",name:"lightyellow 2"},{value:"#CDCDB4",name:"lightyellow 3"},{value:"#8B8B7A",name:"lightyellow 4"},{value:"#FAFAD2",css:!0,name:"lightgoldenrodyellow"},{value:"#FFFF00",vga:!0,name:"yellow 1"},{value:"#FFFF00",vga:!0,css:!0,name:"yellow"},{value:"#EEEE00",name:"yellow 2"},{value:"#CDCD00",name:"yellow 3"},{value:"#8B8B00",name:"yellow 4"},{value:"#808069",name:"warmgrey"},{value:"#808000",vga:!0,css:!0,name:"olive"},{value:"#BDB76B",css:!0,name:"darkkhaki"},{value:"#FFF68F",name:"khaki 1"},{value:"#EEE685",name:"khaki 2"},{value:"#CDC673",name:"khaki 3"},{value:"#8B864E",name:"khaki 4"},{value:"#F0E68C",css:!0,name:"khaki"},{value:"#EEE8AA",css:!0,name:"palegoldenrod"},{value:"#FFFACD",name:"lemonchiffon 1"},{value:"#FFFACD",css:!0,name:"lemonchiffon"},{value:"#EEE9BF",name:"lemonchiffon 2"},{value:"#CDC9A5",name:"lemonchiffon 3"},{value:"#8B8970",name:"lemonchiffon 4"},{value:"#FFEC8B",name:"lightgoldenrod 1"},{value:"#EEDC82",name:"lightgoldenrod 2"},{value:"#CDBE70",name:"lightgoldenrod 3"},{value:"#8B814C",name:"lightgoldenrod 4"},{value:"#E3CF57",name:"banana"},{value:"#FFD700",name:"gold 1"},{value:"#FFD700",css:!0,name:"gold"},{value:"#EEC900",name:"gold 2"},{value:"#CDAD00",name:"gold 3"},{value:"#8B7500",name:"gold 4"},{value:"#FFF8DC",name:"cornsilk 1"},{value:"#FFF8DC",css:!0,name:"cornsilk"},{value:"#EEE8CD",name:"cornsilk 2"},{value:"#CDC8B1",name:"cornsilk 3"},{value:"#8B8878",name:"cornsilk 4"},{value:"#DAA520",css:!0,name:"goldenrod"},{value:"#FFC125",name:"goldenrod 1"},{value:"#EEB422",name:"goldenrod 2"},{value:"#CD9B1D",name:"goldenrod 3"},{value:"#8B6914",name:"goldenrod 4"},{value:"#B8860B",css:!0,name:"darkgoldenrod"},{value:"#FFB90F",name:"darkgoldenrod 1"},{value:"#EEAD0E",name:"darkgoldenrod 2"},{value:"#CD950C",name:"darkgoldenrod 3"},{value:"#8B6508",name:"darkgoldenrod 4"},{value:"#FFA500",name:"orange 1"},{value:"#FF8000",css:!0,name:"orange"},{value:"#EE9A00",name:"orange 2"},{value:"#CD8500",name:"orange 3"},{value:"#8B5A00",name:"orange 4"},{value:"#FFFAF0",css:!0,name:"floralwhite"},{value:"#FDF5E6",css:!0,name:"oldlace"},{value:"#F5DEB3",css:!0,name:"wheat"},{value:"#FFE7BA",name:"wheat 1"},{value:"#EED8AE",name:"wheat 2"},{value:"#CDBA96",name:"wheat 3"},{value:"#8B7E66",name:"wheat 4"},{value:"#FFE4B5",css:!0,name:"moccasin"},{value:"#FFEFD5",css:!0,name:"papayawhip"},{value:"#FFEBCD",css:!0,name:"blanchedalmond"},{value:"#FFDEAD",name:"navajowhite 1"},{value:"#FFDEAD",css:!0,name:"navajowhite"},{value:"#EECFA1",name:"navajowhite 2"},{value:"#CDB38B",name:"navajowhite 3"},{value:"#8B795E",name:"navajowhite 4"},{value:"#FCE6C9",name:"eggshell"},{value:"#D2B48C",css:!0,name:"tan"},{value:"#9C661F",name:"brick"},{value:"#FF9912",name:"cadmiumyellow"},{value:"#FAEBD7",css:!0,name:"antiquewhite"},{value:"#FFEFDB",name:"antiquewhite 1"},{value:"#EEDFCC",name:"antiquewhite 2"},{value:"#CDC0B0",name:"antiquewhite 3"},{value:"#8B8378",name:"antiquewhite 4"},{value:"#DEB887",css:!0,name:"burlywood"},{value:"#FFD39B",name:"burlywood 1"},{value:"#EEC591",name:"burlywood 2"},{value:"#CDAA7D",name:"burlywood 3"},{value:"#8B7355",name:"burlywood 4"},{value:"#FFE4C4",name:"bisque 1"},{value:"#FFE4C4",css:!0,name:"bisque"},{value:"#EED5B7",name:"bisque 2"},{value:"#CDB79E",name:"bisque 3"},{value:"#8B7D6B",name:"bisque 4"},{value:"#E3A869",name:"melon"},{value:"#ED9121",name:"carrot"},{value:"#FF8C00",css:!0,name:"darkorange"},{value:"#FF7F00",name:"darkorange 1"},{value:"#EE7600",name:"darkorange 2"},{value:"#CD6600",name:"darkorange 3"},{value:"#8B4500",name:"darkorange 4"},{value:"#FFA54F",name:"tan 1"},{value:"#EE9A49",name:"tan 2"},{value:"#CD853F",name:"tan 3"},{value:"#CD853F",css:!0,name:"peru"},{value:"#8B5A2B",name:"tan 4"},{value:"#FAF0E6",css:!0,name:"linen"},{value:"#FFDAB9",name:"peachpuff 1"},{value:"#FFDAB9",css:!0,name:"peachpuff"},{value:"#EECBAD",name:"peachpuff 2"},{value:"#CDAF95",name:"peachpuff 3"},{value:"#8B7765",name:"peachpuff 4"},{value:"#FFF5EE",name:"seashell 1"},{value:"#FFF5EE",css:!0,name:"seashell"},{value:"#EEE5DE",name:"seashell 2"},{value:"#CDC5BF",name:"seashell 3"},{value:"#8B8682",name:"seashell 4"},{value:"#F4A460",css:!0,name:"sandybrown"},{value:"#C76114",name:"rawsienna"},{value:"#D2691E",css:!0,name:"chocolate"},{value:"#FF7F24",name:"chocolate 1"},{value:"#EE7621",name:"chocolate 2"},{value:"#CD661D",name:"chocolate 3"},{value:"#8B4513",name:"chocolate 4"},{value:"#8B4513",css:!0,name:"saddlebrown"},{value:"#292421",name:"ivoryblack"},{value:"#FF7D40",name:"flesh"},{value:"#FF6103",name:"cadmiumorange"},{value:"#8A360F",name:"burntsienna"},{value:"#A0522D",css:!0,name:"sienna"},{value:"#FF8247",name:"sienna 1"},{value:"#EE7942",name:"sienna 2"},{value:"#CD6839",name:"sienna 3"},{value:"#8B4726",name:"sienna 4"},{value:"#FFA07A",name:"lightsalmon 1"},{value:"#FFA07A",css:!0,name:"lightsalmon"},{value:"#EE9572",name:"lightsalmon 2"},{value:"#CD8162",name:"lightsalmon 3"},{value:"#8B5742",name:"lightsalmon 4"},{value:"#FF7F50",css:!0,name:"coral"},{value:"#FF4500",name:"orangered 1"},{value:"#FF4500",css:!0,name:"orangered"},{value:"#EE4000",name:"orangered 2"},{value:"#CD3700",name:"orangered 3"},{value:"#8B2500",name:"orangered 4"},{value:"#5E2612",name:"sepia"},{value:"#E9967A",css:!0,name:"darksalmon"},{value:"#FF8C69",name:"salmon 1"},{value:"#EE8262",name:"salmon 2"},{value:"#CD7054",name:"salmon 3"},{value:"#8B4C39",name:"salmon 4"},{value:"#FF7256",name:"coral 1"},{value:"#EE6A50",name:"coral 2"},{value:"#CD5B45",name:"coral 3"},{value:"#8B3E2F",name:"coral 4"},{value:"#8A3324",name:"burntumber"},{value:"#FF6347",name:"tomato 1"},{value:"#FF6347",css:!0,name:"tomato"},{value:"#EE5C42",name:"tomato 2"},{value:"#CD4F39",name:"tomato 3"},{value:"#8B3626",name:"tomato 4"},{value:"#FA8072",css:!0,name:"salmon"},{value:"#FFE4E1",name:"mistyrose 1"},{value:"#FFE4E1",css:!0,name:"mistyrose"},{value:"#EED5D2",name:"mistyrose 2"},{value:"#CDB7B5",name:"mistyrose 3"},{value:"#8B7D7B",name:"mistyrose 4"},{value:"#FFFAFA",name:"snow 1"},{value:"#FFFAFA",css:!0,name:"snow"},{value:"#EEE9E9",name:"snow 2"},{value:"#CDC9C9",name:"snow 3"},{value:"#8B8989",name:"snow 4"},{value:"#BC8F8F",css:!0,name:"rosybrown"},{value:"#FFC1C1",name:"rosybrown 1"},{value:"#EEB4B4",name:"rosybrown 2"},{value:"#CD9B9B",name:"rosybrown 3"},{value:"#8B6969",name:"rosybrown 4"},{value:"#F08080",css:!0,name:"lightcoral"},{value:"#CD5C5C",css:!0,name:"indianred"},{value:"#FF6A6A",name:"indianred 1"},{value:"#EE6363",name:"indianred 2"},{value:"#8B3A3A",name:"indianred 4"},{value:"#CD5555",name:"indianred 3"},{value:"#A52A2A",css:!0,name:"brown"},{value:"#FF4040",name:"brown 1"},{value:"#EE3B3B",name:"brown 2"},{value:"#CD3333",name:"brown 3"},{value:"#8B2323",name:"brown 4"},{value:"#B22222",css:!0,name:"firebrick"},{value:"#FF3030",name:"firebrick 1"},{value:"#EE2C2C",name:"firebrick 2"},{value:"#CD2626",name:"firebrick 3"},{value:"#8B1A1A",name:"firebrick 4"},{value:"#FF0000",vga:!0,name:"red 1"},{value:"#FF0000",vga:!0,css:!0,name:"red"},{value:"#EE0000",name:"red 2"},{value:"#CD0000",name:"red 3"},{value:"#8B0000",name:"red 4"},{value:"#8B0000",css:!0,name:"darkred"},{value:"#800000",vga:!0,css:!0,name:"maroon"},{value:"#8E388E",name:"sgi beet"},{value:"#7171C6",name:"sgi slateblue"},{value:"#7D9EC0",name:"sgi lightblue"},{value:"#388E8E",name:"sgi teal"},{value:"#71C671",name:"sgi chartreuse"},{value:"#8E8E38",name:"sgi olivedrab"},{value:"#C5C1AA",name:"sgi brightgray"},{value:"#C67171",name:"sgi salmon"},{value:"#555555",name:"sgi darkgray"},{value:"#1E1E1E",name:"sgi gray 12"},{value:"#282828",name:"sgi gray 16"},{value:"#515151",name:"sgi gray 32"},{value:"#5B5B5B",name:"sgi gray 36"},{value:"#848484",name:"sgi gray 52"},{value:"#8E8E8E",name:"sgi gray 56"},{value:"#AAAAAA",name:"sgi lightgray"},{value:"#B7B7B7",name:"sgi gray 72"},{value:"#C1C1C1",name:"sgi gray 76"},{value:"#EAEAEA",name:"sgi gray 92"},{value:"#F4F4F4",name:"sgi gray 96"},{value:"#FFFFFF",vga:!0,css:!0,name:"white"},{value:"#F5F5F5",name:"white smoke"},{value:"#F5F5F5",name:"gray 96"},{value:"#DCDCDC",css:!0,name:"gainsboro"},{value:"#D3D3D3",css:!0,name:"lightgrey"},{value:"#C0C0C0",vga:!0,css:!0,name:"silver"},{value:"#A9A9A9",css:!0,name:"darkgray"},{value:"#808080",vga:!0,css:!0,name:"gray"},{value:"#696969",css:!0,name:"dimgray"},{value:"#696969",name:"gray 42"},{value:"#000000",vga:!0,css:!0,name:"black"},{value:"#FCFCFC",name:"gray 99"},{value:"#FAFAFA",name:"gray 98"},{value:"#F7F7F7",name:"gray 97"},{value:"#F2F2F2",name:"gray 95"},{value:"#F0F0F0",name:"gray 94"},{value:"#EDEDED",name:"gray 93"},{value:"#EBEBEB",name:"gray 92"},{value:"#E8E8E8",name:"gray 91"},{value:"#E5E5E5",name:"gray 90"},{value:"#E3E3E3",name:"gray 89"},{value:"#E0E0E0",name:"gray 88"},{value:"#DEDEDE",name:"gray 87"},{value:"#DBDBDB",name:"gray 86"},{value:"#D9D9D9",name:"gray 85"},{value:"#D6D6D6",name:"gray 84"},{value:"#D4D4D4",name:"gray 83"},{value:"#D1D1D1",name:"gray 82"},{value:"#CFCFCF",name:"gray 81"},{value:"#CCCCCC",name:"gray 80"},{value:"#C9C9C9",name:"gray 79"},{value:"#C7C7C7",name:"gray 78"},{value:"#C4C4C4",name:"gray 77"},{value:"#C2C2C2",name:"gray 76"},{value:"#BFBFBF",name:"gray 75"},{value:"#BDBDBD",name:"gray 74"},{value:"#BABABA",name:"gray 73"},{value:"#B8B8B8",name:"gray 72"},{value:"#B5B5B5",name:"gray 71"},{value:"#B3B3B3",name:"gray 70"},{value:"#B0B0B0",name:"gray 69"},{value:"#ADADAD",name:"gray 68"},{value:"#ABABAB",name:"gray 67"},{value:"#A8A8A8",name:"gray 66"},{value:"#A6A6A6",name:"gray 65"},{value:"#A3A3A3",name:"gray 64"},{value:"#A1A1A1",name:"gray 63"},{value:"#9E9E9E",name:"gray 62"},{value:"#9C9C9C",name:"gray 61"},{value:"#999999",name:"gray 60"},{value:"#969696",name:"gray 59"},{value:"#949494",name:"gray 58"},{value:"#919191",name:"gray 57"},{value:"#8F8F8F",name:"gray 56"},{value:"#8C8C8C",name:"gray 55"},{value:"#8A8A8A",name:"gray 54"},{value:"#878787",name:"gray 53"},{value:"#858585",name:"gray 52"},{value:"#828282",name:"gray 51"},{value:"#7F7F7F",name:"gray 50"},{value:"#7D7D7D",name:"gray 49"},{value:"#7A7A7A",name:"gray 48"},{value:"#787878",name:"gray 47"},{value:"#757575",name:"gray 46"},{value:"#737373",name:"gray 45"},{value:"#707070",name:"gray 44"},{value:"#6E6E6E",name:"gray 43"},{value:"#666666",name:"gray 40"},{value:"#636363",name:"gray 39"},{value:"#616161",name:"gray 38"},{value:"#5E5E5E",name:"gray 37"},{value:"#5C5C5C",name:"gray 36"},{value:"#595959",name:"gray 35"},{value:"#575757",name:"gray 34"},{value:"#545454",name:"gray 33"},{value:"#525252",name:"gray 32"},{value:"#4F4F4F",name:"gray 31"},{value:"#4D4D4D",name:"gray 30"},{value:"#4A4A4A",name:"gray 29"},{value:"#474747",name:"gray 28"},{value:"#454545",name:"gray 27"},{value:"#424242",name:"gray 26"},{value:"#404040",name:"gray 25"},{value:"#3D3D3D",name:"gray 24"},{value:"#3B3B3B",name:"gray 23"},{value:"#383838",name:"gray 22"},{value:"#363636",name:"gray 21"},{value:"#333333",name:"gray 20"},{value:"#303030",name:"gray 19"},{value:"#2E2E2E",name:"gray 18"},{value:"#2B2B2B",name:"gray 17"},{value:"#292929",name:"gray 16"},{value:"#262626",name:"gray 15"},{value:"#242424",name:"gray 14"},{value:"#212121",name:"gray 13"},{value:"#1F1F1F",name:"gray 12"},{value:"#1C1C1C",name:"gray 11"},{value:"#1A1A1A",name:"gray 10"},{value:"#171717",name:"gray 9"},{value:"#141414",name:"gray 8"},{value:"#121212",name:"gray 7"},{value:"#0F0F0F",name:"gray 6"},{value:"#0D0D0D",name:"gray 5"},{value:"#0A0A0A",name:"gray 4"},{value:"#080808",name:"gray 3"},{value:"#050505",name:"gray 2"},{value:"#030303",name:"gray 1"},{value:"#F5F5F5",css:!0,name:"whitesmoke"}]});var IiA=Ql((EMe,fI)=>{"use strict";var iv=liA(),ciA=iv.filter(function(t){return!!t.css}),CiA=iv.filter(function(t){return!!t.vga});fI.exports=function(t){var e=fI.exports.get(t);return e&&e.value};fI.exports.get=function(t){return t=t||"",t=t.trim().toLowerCase(),iv.filter(function(e){return e.name.toLowerCase()===t}).pop()};fI.exports.all=fI.exports.get.all=function(){return iv};fI.exports.get.css=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),ciA.filter(function(e){return e.name.toLowerCase()===t}).pop()):ciA};fI.exports.get.vga=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),CiA.filter(function(e){return e.name.toLowerCase()===t}).pop()):CiA}});var LiA=Ql((hMe,FiA)=>{"use strict";var mLA=1/0,pLA="[object Symbol]",DLA=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,miA="\\ud800-\\udfff",wLA="\\u0300-\\u036f\\ufe20-\\ufe23",yLA="\\u20d0-\\u20f0",piA="\\u2700-\\u27bf",DiA="a-z\\xdf-\\xf6\\xf8-\\xff",vLA="\\xac\\xb1\\xd7\\xf7",bLA="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",MLA="\\u2000-\\u206f",kLA=" \\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",wiA="A-Z\\xc0-\\xd6\\xd8-\\xde",SLA="\\ufe0e\\ufe0f",yiA=vLA+bLA+MLA+kLA,viA="['\u2019]",diA="["+yiA+"]",xLA="["+wLA+yLA+"]",biA="\\d+",RLA="["+piA+"]",MiA="["+DiA+"]",kiA="[^"+miA+yiA+biA+piA+DiA+wiA+"]",NLA="\\ud83c[\\udffb-\\udfff]",FLA="(?:"+xLA+"|"+NLA+")",LLA="[^"+miA+"]",SiA="(?:\\ud83c[\\udde6-\\uddff]){2}",xiA="[\\ud800-\\udbff][\\udc00-\\udfff]",JE="["+wiA+"]",_LA="\\u200d",BiA="(?:"+MiA+"|"+kiA+")",GLA="(?:"+JE+"|"+kiA+")",QiA="(?:"+viA+"(?:d|ll|m|re|s|t|ve))?",EiA="(?:"+viA+"(?:D|LL|M|RE|S|T|VE))?",RiA=FLA+"?",NiA="["+SLA+"]?",KLA="(?:"+_LA+"(?:"+[LLA,SiA,xiA].join("|")+")"+NiA+RiA+")*",ULA=NiA+RiA+KLA,JLA="(?:"+[RLA,SiA,xiA].join("|")+")"+ULA,YLA=RegExp([JE+"?"+MiA+"+"+QiA+"(?="+[diA,JE,"$"].join("|")+")",GLA+"+"+EiA+"(?="+[diA,JE+BiA,"$"].join("|")+")",JE+"?"+BiA+"+"+QiA,JE+"+"+EiA,biA,JLA].join("|"),"g"),HLA=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,TLA=typeof global=="object"&&global&&global.Object===Object&&global,OLA=typeof self=="object"&&self&&self.Object===Object&&self,zLA=TLA||OLA||Function("return this")();function PLA(t){return t.match(DLA)||[]}function jLA(t){return HLA.test(t)}function qLA(t){return t.match(YLA)||[]}var VLA=Object.prototype,WLA=VLA.toString,hiA=zLA.Symbol,uiA=hiA?hiA.prototype:void 0,fiA=uiA?uiA.toString:void 0;function ZLA(t){if(typeof t=="string")return t;if($LA(t))return fiA?fiA.call(t):"";var e=t+"";return e=="0"&&1/t==-mLA?"-0":e}function XLA(t){return!!t&&typeof t=="object"}function $LA(t){return typeof t=="symbol"||XLA(t)&&WLA.call(t)==pLA}function A_A(t){return t==null?"":ZLA(t)}function e_A(t,e,A){return t=A_A(t),e=A?void 0:e,e===void 0?jLA(t)?qLA(t):PLA(t):t.match(e)||[]}FiA.exports=e_A});var ZiA=Ql((uMe,WiA)=>{"use strict";var t_A=1/0,i_A="[object Symbol]",n_A=/^\s+/,GF="\\ud800-\\udfff",JiA="\\u0300-\\u036f\\ufe20-\\ufe23",YiA="\\u20d0-\\u20f0",HiA="\\ufe0e\\ufe0f",o_A="["+GF+"]",LF="["+JiA+YiA+"]",_F="\\ud83c[\\udffb-\\udfff]",a_A="(?:"+LF+"|"+_F+")",TiA="[^"+GF+"]",OiA="(?:\\ud83c[\\udde6-\\uddff]){2}",ziA="[\\ud800-\\udbff][\\udc00-\\udfff]",PiA="\\u200d",jiA=a_A+"?",qiA="["+HiA+"]?",r_A="(?:"+PiA+"(?:"+[TiA,OiA,ziA].join("|")+")"+qiA+jiA+")*",s_A=qiA+jiA+r_A,g_A="(?:"+[TiA+LF+"?",LF,OiA,ziA,o_A].join("|")+")",l_A=RegExp(_F+"(?="+_F+")|"+g_A+s_A,"g"),c_A=RegExp("["+PiA+GF+JiA+YiA+HiA+"]"),C_A=typeof global=="object"&&global&&global.Object===Object&&global,I_A=typeof self=="object"&&self&&self.Object===Object&&self,d_A=C_A||I_A||Function("return this")();function B_A(t){return t.split("")}function Q_A(t,e,A,i){for(var n=t.length,o=A+(i?1:-1);i?o--:++o-1;);return A}function f_A(t){return c_A.test(t)}function _iA(t){return f_A(t)?m_A(t):B_A(t)}function m_A(t){return t.match(l_A)||[]}var p_A=Object.prototype,D_A=p_A.toString,GiA=d_A.Symbol,KiA=GiA?GiA.prototype:void 0,UiA=KiA?KiA.toString:void 0;function w_A(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i=i?t:w_A(t,e,A)}function v_A(t){return!!t&&typeof t=="object"}function b_A(t){return typeof t=="symbol"||v_A(t)&&D_A.call(t)==i_A}function M_A(t){return t==null?"":ViA(t)}function k_A(t,e,A){if(t=M_A(t),t&&(A||e===void 0))return t.replace(n_A,"");if(!t||!(e=ViA(e)))return t;var i=_iA(t),n=u_A(i,_iA(e));return y_A(i,n).join("")}WiA.exports=k_A});var EnA=Ql((fMe,QnA)=>{"use strict";var KF=1/0,S_A=9007199254740991,x_A=17976931348623157e292,XiA=NaN,R_A="[object Symbol]",N_A=/^\s+|\s+$/g,F_A=/^[-+]0x[0-9a-f]+$/i,L_A=/^0b[01]+$/i,__A=/^0o[0-7]+$/i,HF="\\ud800-\\udfff",nnA="\\u0300-\\u036f\\ufe20-\\ufe23",onA="\\u20d0-\\u20f0",anA="\\ufe0e\\ufe0f",G_A="["+HF+"]",UF="["+nnA+onA+"]",JF="\\ud83c[\\udffb-\\udfff]",K_A="(?:"+UF+"|"+JF+")",rnA="[^"+HF+"]",snA="(?:\\ud83c[\\udde6-\\uddff]){2}",gnA="[\\ud800-\\udbff][\\udc00-\\udfff]",lnA="\\u200d",cnA=K_A+"?",CnA="["+anA+"]?",U_A="(?:"+lnA+"(?:"+[rnA,snA,gnA].join("|")+")"+CnA+cnA+")*",J_A=CnA+cnA+U_A,Y_A="(?:"+[rnA+UF+"?",UF,snA,gnA,G_A].join("|")+")",YF=RegExp(JF+"(?="+JF+")|"+Y_A+J_A,"g"),H_A=RegExp("["+lnA+HF+nnA+onA+anA+"]"),T_A=parseInt,O_A=typeof global=="object"&&global&&global.Object===Object&&global,z_A=typeof self=="object"&&self&&self.Object===Object&&self,P_A=O_A||z_A||Function("return this")(),j_A=V_A("length");function q_A(t){return t.split("")}function V_A(t){return function(e){return e?.[t]}}function TF(t){return H_A.test(t)}function InA(t){return TF(t)?Z_A(t):j_A(t)}function W_A(t){return TF(t)?X_A(t):q_A(t)}function Z_A(t){for(var e=YF.lastIndex=0;YF.test(t);)e++;return e}function X_A(t){return t.match(YF)||[]}var $_A=Object.prototype,AGA=$_A.toString,$iA=P_A.Symbol,eGA=Math.ceil,tGA=Math.floor,AnA=$iA?$iA.prototype:void 0,enA=AnA?AnA.toString:void 0;function tnA(t,e){var A="";if(!t||e<1||e>S_A)return A;do e%2&&(A+=t),e=tGA(e/2),e&&(t+=t);while(e);return A}function iGA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i=i?t:iGA(t,e,A)}function oGA(t,e){e=e===void 0?" ":dnA(e);var A=e.length;if(A<2)return A?tnA(e,t):e;var i=tnA(e,eGA(t/InA(e)));return TF(e)?nGA(W_A(i),0,t).join(""):i.slice(0,t)}function inA(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function aGA(t){return!!t&&typeof t=="object"}function BnA(t){return typeof t=="symbol"||aGA(t)&&AGA.call(t)==R_A}function rGA(t){if(!t)return t===0?t:0;if(t=gGA(t),t===KF||t===-KF){var e=t<0?-1:1;return e*x_A}return t===t?t:0}function sGA(t){var e=rGA(t),A=e%1;return e===e?A?e-A:e:0}function gGA(t){if(typeof t=="number")return t;if(BnA(t))return XiA;if(inA(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=inA(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(N_A,"");var A=L_A.test(t);return A||__A.test(t)?T_A(t.slice(2),A?2:8):F_A.test(t)?XiA:+t}function lGA(t){return t==null?"":dnA(t)}function cGA(t,e,A){t=lGA(t),e=sGA(e);var i=e?InA(t):0;return e&&i{"use strict";hnA.exports=(t,e,A,i)=>{let n=(t+(i||"")).toString().includes("%");if(typeof t=="string"?[t,e,A,i]=t.match(/(0?\.?\d{1,3})%?\b/g).map(Number):i!==void 0&&(i=parseFloat(i)),typeof t!="number"||typeof e!="number"||typeof A!="number"||t>255||e>255||A>255)throw new TypeError("Expected three numbers below 256");if(typeof i=="number"){if(!n&&i>=0&&i<=1)i=Math.round(255*i);else if(n&&i>=0&&i<=100)i=Math.round(255*i/100);else throw new TypeError(`Expected alpha value (${i}) as a fraction or percentage`);i=(i|256).toString(16).slice(1)}else i="";return(A|e<<8|t<<16|1<<24).toString(16).slice(1)+i}});var mnA=Ql((pMe,fnA)=>{"use strict";var nf="a-f\\d",CGA=`#?[${nf}]{3}[${nf}]?`,IGA=`#?[${nf}]{6}([${nf}]{2})?`,dGA=new RegExp(`[^#${nf}]`,"gi"),BGA=new RegExp(`^${CGA}$|^${IGA}$`,"i");fnA.exports=(t,e={})=>{if(typeof t!="string"||dGA.test(t)||!BGA.test(t))throw new TypeError("Expected a valid hex string");t=t.replace(/^#/,"");let A=1;t.length===8&&(A=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(A=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);let i=Number.parseInt(t,16),n=i>>16,o=i>>8&255,a=i&255,r=typeof e.alpha=="number"?e.alpha:A;if(e.format==="array")return[n,o,a,r];if(e.format==="css"){let s=r===1?"":` / ${Number((r*100).toFixed(2))}%`;return`rgb(${n} ${o} ${a}${s})`}return{red:n,green:o,blue:a,alpha:r}}});var wnA=Ql((DMe,DnA)=>{"use strict";var QGA=IiA(),EGA=LiA(),hGA=ZiA(),uGA=EnA(),fGA=unA(),pnA=mnA(),OF=.75,zF=.25,PF=16777215,mGA=49979693;DnA.exports=function(t){return"#"+wGA(String(JSON.stringify(t)))};function pGA(t){var e=EGA(t),A=[];return e.forEach(function(i){var n=QGA(i);n&&A.push(pnA(hGA(n,"#"),{format:"array"}))}),A}function DGA(t){var e=[0,0,0];return t.forEach(function(A){for(var i=0;i<3;i++)e[i]+=A[i]}),[e[0]/t.length,e[1]/t.length,e[2]/t.length]}function wGA(t){var e,A=pGA(t);A.length>0&&(e=DGA(A));var i=1,n=0,o=1;if(t.length>0)for(var a=0;an&&(n=t[a].charCodeAt(0)),o=parseInt(PF/n),i=(i+t[a].charCodeAt(0)*o*mGA)%PF;var r=(i*t.length%PF).toString(16);r=uGA(r,6,r);var s=pnA(r,{format:"array"});return e?fGA(zF*s[0]+OF*e[0],zF*s[1]+OF*e[1],zF*s[2]+OF*e[2]):r}});var jL=(()=>{class t{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,i){this._renderer=A,this._elementRef=i}setProperty(A,i){this._renderer.setProperty(this._elementRef.nativeElement,A,i)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(i){return new(i||t)(lt(ui),lt(ge))};static \u0275dir=OA({type:t})}return t})(),qL=(()=>{class t extends jL{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,features:[Ct]})}return t})(),gg=new wA("");var xnA={provide:gg,useExisting:ar(()=>ro),multi:!0};function RnA(){let t=uv()?uv().getUserAgent():"";return/android (\d+)/.test(t.toLowerCase())}var NnA=new wA(""),ro=(()=>{class t extends jL{_compositionMode;_composing=!1;constructor(A,i,n){super(A,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!RnA())}writeValue(A){let i=A??"";this.setProperty("value",i)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(i){return new(i||t)(lt(ui),lt(ge),lt(NnA,8))};static \u0275dir=OA({type:t,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,n){i&1&&$("input",function(a){return n._handleInput(a.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(a){return n._compositionEnd(a.target.value)})},standalone:!1,features:[It([xnA]),Ct]})}return t})();function yv(t){return t==null||vv(t)===0}function vv(t){return t==null?null:Array.isArray(t)||typeof t=="string"?t.length:t instanceof Set?t.size:null}var vc=new wA(""),nh=new wA(""),FnA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[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])?)*$/,Ss=class{static min(e){return VL(e)}static max(e){return LnA(e)}static required(e){return _nA(e)}static requiredTrue(e){return GnA(e)}static email(e){return KnA(e)}static minLength(e){return UnA(e)}static maxLength(e){return JnA(e)}static pattern(e){return YnA(e)}static nullValidator(e){return kf()}static compose(e){return e_(e)}static composeAsync(e){return t_(e)}};function VL(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>t?{max:{max:t,actual:e.value}}:null}}function _nA(t){return yv(t.value)?{required:!0}:null}function GnA(t){return t.value===!0?null:{required:!0}}function KnA(t){return yv(t.value)||FnA.test(t.value)?null:{email:!0}}function UnA(t){return e=>{let A=e.value?.length??vv(e.value);return A===null||A===0?null:A{let A=e.value?.length??vv(e.value);return A!==null&&A>t?{maxlength:{requiredLength:t,actualLength:A}}:null}}function YnA(t){if(!t)return kf;let e,A;return typeof t=="string"?(A="",t.charAt(0)!=="^"&&(A+="^"),A+=t,t.charAt(t.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=t.toString(),e=t),i=>{if(yv(i.value))return null;let n=i.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function kf(t){return null}function WL(t){return t!=null}function ZL(t){return pf(t)?mr(t):t}function XL(t){let e={};return t.forEach(A=>{e=A!=null?BA(BA({},e),A):e}),Object.keys(e).length===0?null:e}function $L(t,e){return e.map(A=>A(t))}function HnA(t){return!t.validate}function A_(t){return t.map(e=>HnA(e)?e:A=>e.validate(A))}function e_(t){if(!t)return null;let e=t.filter(WL);return e.length==0?null:function(A){return XL($L(A,e))}}function bv(t){return t!=null?e_(A_(t)):null}function t_(t){if(!t)return null;let e=t.filter(WL);return e.length==0?null:function(A){let i=$L(A,e).map(ZL);return cf(i).pipe(fe(XL))}}function Mv(t){return t!=null?t_(A_(t)):null}function JL(t,e){return t===null?[e]:Array.isArray(t)?[...t,e]:[t,e]}function i_(t){return t._rawValidators}function n_(t){return t._rawAsyncValidators}function pv(t){return t?Array.isArray(t)?t:[t]:[]}function Sf(t,e){return Array.isArray(t)?t.includes(e):t===e}function YL(t,e){let A=pv(e);return pv(t).forEach(n=>{Sf(A,n)||A.push(n)}),A}function HL(t,e){return pv(e).filter(A=>!Sf(t,A))}var xf=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=bv(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=Mv(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control?.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},v0=class extends xf{name;get formDirective(){return null}get path(){return null}},xs=class extends xf{_parent=null;name=null;valueAccessor=null},Rf=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}};var so=(()=>{class t extends Rf{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(lt(xs,2))};static \u0275dir=OA({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,n){i&2&&ae("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[Ct]})}return t})(),o_=(()=>{class t extends Rf{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(lt(v0,10))};static \u0275dir=OA({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["","formArray",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,n){i&2&&ae("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[Ct]})}return t})();var ZE="VALID",Mf="INVALID",pd="PENDING",XE="DISABLED",_C=class{},Nf=class extends _C{value;source;constructor(e,A){super(),this.value=e,this.source=A}},Ah=class extends _C{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},eh=class extends _C{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},Dd=class extends _C{status;source;constructor(e,A){super(),this.status=e,this.source=A}},Ff=class extends _C{source;constructor(e){super(),this.source=e}},th=class extends _C{source;constructor(e){super(),this.source=e}};function kv(t){return(Kf(t)?t.validators:t)||null}function TnA(t){return Array.isArray(t)?bv(t):t||null}function Sv(t,e){return(Kf(e)?e.asyncValidators:t)||null}function OnA(t){return Array.isArray(t)?Mv(t):t||null}function Kf(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function a_(t,e,A){let i=t.controls;if(!(e?Object.keys(i):i).length)throw new wt(1e3,"");if(!i[A])throw new wt(1001,"")}function r_(t,e,A){t._forEachChild((i,n)=>{if(A[n]===void 0)throw new wt(1002,"")})}var wd=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return Zo(this.statusReactive)}set status(e){Zo(()=>this.statusReactive.set(e))}_status=_e(()=>this.statusReactive());statusReactive=jA(void 0);get valid(){return this.status===ZE}get invalid(){return this.status===Mf}get pending(){return this.status==pd}get disabled(){return this.status===XE}get enabled(){return this.status!==XE}errors;get pristine(){return Zo(this.pristineReactive)}set pristine(e){Zo(()=>this.pristineReactive.set(e))}_pristine=_e(()=>this.pristineReactive());pristineReactive=jA(!0);get dirty(){return!this.pristine}get touched(){return Zo(this.touchedReactive)}set touched(e){Zo(()=>this.touchedReactive.set(e))}_touched=_e(()=>this.touchedReactive());touchedReactive=jA(!1);get untouched(){return!this.touched}_events=new $A;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(YL(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(YL(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(HL(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(HL(e,this._rawAsyncValidators))}hasValidator(e){return Sf(this._rawValidators,e)}hasAsyncValidator(e){return Sf(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsTouched(Ve(BA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new eh(!0,i))}markAllAsDirty(e={}){this.markAsDirty({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsDirty(e))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),e.onlySelf||this._parent?._updateTouched(e,i),A&&e.emitEvent!==!1&&this._events.next(new eh(!1,i))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;e.onlySelf||this._parent?.markAsDirty(Ve(BA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new Ah(!1,i))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),e.onlySelf||this._parent?._updatePristine(e,i),A&&e.emitEvent!==!1&&this._events.next(new Ah(!0,i))}markAsPending(e={}){this.status=pd;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Dd(this.status,A)),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.markAsPending(Ve(BA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=XE,this.errors=null,this._forEachChild(n=>{n.disable(Ve(BA({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Nf(this.value,i)),this._events.next(new Dd(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Ve(BA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=ZE,this._forEachChild(i=>{i.enable(Ve(BA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Ve(BA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,A){e.onlySelf||(this._parent?.updateValueAndValidity(e),e.skipPristineCheck||this._parent?._updatePristine({},A),this._parent?._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===ZE||this.status===pd)&&this._runAsyncValidator(i,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new Nf(this.value,A)),this._events.next(new Dd(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),e.onlySelf||this._parent?.updateValueAndValidity(Ve(BA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?XE:ZE}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=pd,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1,shouldHaveEmitted:e!==!1};let i=ZL(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=(this._hasOwnPendingAsyncValidator?.emitEvent||this._hasOwnPendingAsyncValidator?.shouldHaveEmitted)??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((i,n)=>i&&i._find(n),this)}getError(e,A){let i=A?this.get(A):this;return i?.errors?i.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new Dd(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,i)}_initObservables(){this.valueChanges=new WA,this.statusChanges=new WA}_calculateStatus(){return this._allControlsDisabled()?XE:this.errors?Mf:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(pd)?pd:this._anyControlsHaveStatus(Mf)?Mf:ZE}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,e.onlySelf||this._parent?._updatePristine(e,A),n&&this._events.next(new Ah(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new eh(this.touched,A)),e.onlySelf||this._parent?._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){Kf(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){return!e&&!!this._parent?.dirty&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=TnA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=OnA(this._rawAsyncValidators)}},yd=class extends wd{constructor(e,A,i){super(kv(A),Sv(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,i={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,i={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){r_(this,!0,e),Object.keys(e).forEach(i=>{a_(this,!0,i),this.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(i=>{let n=this.controls[i];n&&n.patchValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((i,n)=>{i.reset(e?e[n]:null,Ve(BA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new th(this))}getRawValue(){return this._reduceChildren({},(e,A,i)=>(e[i]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,i)=>i._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let i=this.controls[A];i&&e(i,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,i]of Object.entries(this.controls))if(this.contains(A)&&e(i))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,i,n)=>((i.enabled||this.disabled)&&(A[n]=i.value),A))}_reduceChildren(e,A){let i=e;return this._forEachChild((n,o)=>{i=A(i,n,o)}),i}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var Dv=class extends yd{};var vd=new wA("",{factory:()=>Uf}),Uf="always";function s_(t,e){return[...e.path,t]}function ih(t,e,A=Uf){xv(t,e),e.valueAccessor.writeValue(t.value),(t.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(t.disabled),PnA(t,e),qnA(t,e),jnA(t,e),znA(t,e)}function Lf(t,e,A=!0){let i=()=>{};e?.valueAccessor?.registerOnChange(i),e?.valueAccessor?.registerOnTouched(i),Gf(t,e),t&&(e._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function _f(t,e){t.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function znA(t,e){if(e.valueAccessor.setDisabledState){let A=i=>{e.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(A),e._registerOnDestroy(()=>{t._unregisterOnDisabledChange(A)})}}function xv(t,e){let A=i_(t);e.validator!==null?t.setValidators(JL(A,e.validator)):typeof A=="function"&&t.setValidators([A]);let i=n_(t);e.asyncValidator!==null?t.setAsyncValidators(JL(i,e.asyncValidator)):typeof i=="function"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();_f(e._rawValidators,n),_f(e._rawAsyncValidators,n)}function Gf(t,e){let A=!1;if(t!==null){if(e.validator!==null){let n=i_(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.validator);o.length!==n.length&&(A=!0,t.setValidators(o))}}if(e.asyncValidator!==null){let n=n_(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(a=>a!==e.asyncValidator);o.length!==n.length&&(A=!0,t.setAsyncValidators(o))}}}let i=()=>{};return _f(e._rawValidators,i),_f(e._rawAsyncValidators,i),A}function PnA(t,e){e.valueAccessor.registerOnChange(A=>{t._pendingValue=A,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn==="change"&&g_(t,e)})}function jnA(t,e){e.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn==="blur"&&t._pendingChange&&g_(t,e),t.updateOn!=="submit"&&t.markAsTouched()})}function g_(t,e){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function qnA(t,e){let A=(i,n)=>{e.valueAccessor.writeValue(i),n&&e.viewToModelUpdate(i)};t.registerOnChange(A),e._registerOnDestroy(()=>{t._unregisterOnChange(A)})}function l_(t,e){t==null,xv(t,e)}function VnA(t,e){return Gf(t,e)}function Rv(t,e){if(!t.hasOwnProperty("model"))return!1;let A=t.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function WnA(t){return Object.getPrototypeOf(t.constructor)===qL}function c_(t,e){t._syncPendingControls(),e.forEach(A=>{let i=A.control;i.updateOn==="submit"&&i._pendingChange&&(A.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function Nv(t,e){if(!e)return null;Array.isArray(e);let A,i,n;return e.forEach(o=>{o.constructor===ro?A=o:WnA(o)?i=o:n=o}),n||i||A||null}function ZnA(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}var XnA={provide:v0,useExisting:ar(()=>bd)},$E=Promise.resolve(),bd=(()=>{class t extends v0{callSetDisabledState;get submitted(){return Zo(this.submittedReactive)}_submitted=_e(()=>this.submittedReactive());submittedReactive=jA(!1);_directives=new Set;form;ngSubmit=new WA;options;constructor(A,i,n){super(),this.callSetDisabledState=n,this.form=new yd({},bv(A),Mv(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){$E.then(()=>{let i=this._findContainer(A.path);A.control=i.registerControl(A.name,A.control),ih(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){$E.then(()=>{this._findContainer(A.path)?.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){$E.then(()=>{let i=this._findContainer(A.path),n=new yd({});l_(n,A),i.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){$E.then(()=>{this._findContainer(A.path)?.removeControl?.(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,i){$E.then(()=>{this.form.get(A.path).setValue(i)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),c_(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new Ff(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1)}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(vd,8))};static \u0275dir=OA({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup","",3,"formArray",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,n){i&1&&$("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[It([XnA]),Ct]})}return t})();function TL(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function OL(t){return typeof t=="object"&&t!==null&&Object.keys(t).length===2&&"value"in t&&"disabled"in t}var ss=class extends wd{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,i){super(kv(A),Sv(i,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),Kf(A)&&(A.nonNullable||A.initialValueIsDefault)&&(OL(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),A.overwriteDefaultValue&&(this.defaultValue=this.value),this._pendingChange=!1,A?.emitEvent!==!1&&this._events.next(new th(this))}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){TL(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){TL(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){OL(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var $nA=t=>t instanceof ss;var AoA={provide:xs,useExisting:ar(()=>Ca)},zL=Promise.resolve(),Ca=(()=>{class t extends xs{_changeDetectorRef;callSetDisabledState;control=new ss;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new WA;constructor(A,i,n,o,a,r){super(),this._changeDetectorRef=a,this.callSetDisabledState=r,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Nv(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let i=A.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),Rv(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective?.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){ih(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){zL.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let i=A.isDisabled.currentValue,n=i!==0&&he(i);zL.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?s_(A,this._parent):[A]}static \u0275fac=function(i){return new(i||t)(lt(v0,9),lt(vc,10),lt(nh,10),lt(gg,10),lt(ft,8),lt(vd,8))};static \u0275dir=OA({type:t,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[It([AoA]),Ct,ei]})}return t})();var C_=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return t})(),eoA={provide:gg,useExisting:ar(()=>Fv),multi:!0},Fv=(()=>{class t extends qL{writeValue(A){let i=A??"";this.setProperty("value",i)}registerOnChange(A){this.onChange=i=>{A(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(i,n){i&1&&$("input",function(a){return n.onChange(a.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[It([eoA]),Ct]})}return t})();var wv=class extends wd{constructor(e,A,i){super(kv(A),Sv(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){Array.isArray(e)?e.forEach(i=>{this.controls.push(i),this._registerControl(i)}):(this.controls.push(e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,i={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(e,A={}){let i=this._adjustIndex(e);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,i={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){r_(this,!1,e),e.forEach((i,n)=>{a_(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((i,n)=>{i.reset(e[n],Ve(BA({},A),{onlySelf:!0}))}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A),A?.emitEvent!==!1&&this._events.next(new th(this))}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,i)=>i._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,i)=>{e(A,i)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};var toA=(()=>{class t extends v0{callSetDisabledState;get submitted(){return Zo(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=_e(()=>this._submittedReactive());_submittedReactive=jA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];constructor(A,i,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(i)}ngOnChanges(A){this.onChanges(A)}ngOnDestroy(){this.onDestroy()}onChanges(A){this._checkFormPresent(),A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}onDestroy(){this.form&&(Gf(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get path(){return[]}addControl(A){let i=this.form.get(A.path);return ih(i,A,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),i}getControl(A){return this.form.get(A.path)}removeControl(A){Lf(A.control||null,A,!1),ZnA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}getFormArray(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}updateModel(A,i){this.form.get(A.path).setValue(i)}onReset(){this.resetForm()}resetForm(A=void 0,i={}){this.form.reset(A,i),this._submittedReactive.set(!1)}onSubmit(A){return this.submitted=!0,c_(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new Ff(this.control)),A?.target?.method==="dialog"}_updateDomValue(){this.directives.forEach(A=>{let i=A.control,n=this.form.get(A.path);i!==n&&(Lf(i||null,A),$nA(n)&&(ih(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let i=this.form.get(A.path);l_(i,A),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){let i=this.form?.get(A.path);i&&VnA(i,A)&&i.updateValueAndValidity({emitEvent:!1})}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm?._registerOnCollectionChange(()=>{})}_updateValidators(){xv(this.form,this),this._oldForm&&Gf(this._oldForm,this)}_checkFormPresent(){this.form}static \u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(vd,8))};static \u0275dir=OA({type:t,features:[Ct,ei]})}return t})();var Lv=new wA(""),ioA={provide:xs,useExisting:ar(()=>SI)},SI=(()=>{class t extends xs{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=a,this._setValidators(A),this._setAsyncValidators(i),this.valueAccessor=Nv(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let i=A.form.previousValue;i&&Lf(i,this,!1),ih(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}Rv(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&Lf(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(i){return new(i||t)(lt(vc,10),lt(nh,10),lt(gg,10),lt(Lv,8),lt(vd,8))};static \u0275dir=OA({type:t,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[It([ioA]),Ct,ei]})}return t})();var noA={provide:xs,useExisting:ar(()=>_v)},_v=(()=>{class t extends xs{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,a){super(),this._ngModelWarningConfig=a,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=Nv(this,o)}ngOnChanges(A){this._added||this._setUpControl(),Rv(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective?.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return s_(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(i){return new(i||t)(lt(v0,13),lt(vc,10),lt(nh,10),lt(gg,10),lt(Lv,8))};static \u0275dir=OA({type:t,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[It([noA]),Ct,ei]})}return t})();var ooA={provide:v0,useExisting:ar(()=>GC)},GC=(()=>{class t extends toA{form=null;ngSubmit=new WA;get control(){return this.form}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","formGroup",""]],hostBindings:function(i,n){i&1&&$("submit",function(a){return n.onSubmit(a)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[It([ooA]),Ct]})}return t})();function aoA(t){return typeof t=="number"?t:parseFloat(t)}var roA=(()=>{class t{_validator=kf;_onChange;_enabled;ngOnChanges(A){if(this.inputName in A){let i=this.normalizeInput(A[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):kf,this._onChange?.()}}validate(A){return this._validator(A)}registerOnValidatorChange(A){this._onChange=A}enabled(A){return A!=null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,features:[ei]})}return t})();var soA={provide:vc,useExisting:ar(()=>Gv),multi:!0},Gv=(()=>{class t extends roA{min;inputName="min";normalizeInput=A=>aoA(A);createValidator=A=>VL(A);static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(i,n){i&2&&ie("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[It([soA]),Ct]})}return t})();var I_=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();function PL(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var d_=(()=>{class t{useNonNullable=!1;get nonNullable(){let A=new t;return A.useNonNullable=!0,A}group(A,i=null){let n=this._reduceControls(A),o={};return PL(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new yd(n,o)}record(A,i=null){let n=this._reduceControls(A);return new Dv(n,i)}control(A,i,n){let o={};return this.useNonNullable?(PL(i)?o=i:(o.validators=i,o.asyncValidators=n),new ss(A,Ve(BA({},o),{nonNullable:!0}))):new ss(A,i,n)}array(A,i,n){let o=A.map(a=>this._createControl(a));return new wv(o,i,n)}_reduceControls(A){let i={};return Object.keys(A).forEach(n=>{i[n]=this._createControl(A[n])}),i}_createControl(A){if(A instanceof ss)return A;if(A instanceof wd)return A;if(Array.isArray(A)){let i=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(i,n,o)}else return this.control(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var yn=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:vd,useValue:A.callSetDisabledState??Uf}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[I_]})}return t})(),bc=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:Lv,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:vd,useValue:A.callSetDisabledState??Uf}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[I_]})}return t})();function xI(t){return t.buttons===0||t.detail===0}function RI(t){let e=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var Kv;function B_(){if(Kv==null){let t=typeof document<"u"?document.head:null;Kv=!!(t&&(t.createShadowRoot||t.attachShadow))}return Kv}function Uv(t){if(B_()){let e=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function oh(){let t=typeof document<"u"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}function yr(t){return t.composedPath?t.composedPath()[0]:t.target}var Jv;try{Jv=typeof Intl<"u"&&Intl.v8BreakIterator}catch(t){Jv=!1}var ci=(()=>{class t{_platformId=h(Qf);isBrowser=this._platformId?y0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||Jv)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var ah;function Q_(){if(ah==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>ah=!0}))}finally{ah=ah||!1}return ah}function Md(t){return Q_()?t:!!t.capture}function Rs(t,e=0){return Jf(t)?Number(t):arguments.length===2?e:0}function Jf(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function ls(t){return t instanceof ge?t.nativeElement:t}var E_=new wA("cdk-input-modality-detector-options"),h_={ignoreKeys:[18,17,224,91,16]},u_=650,Yv={passive:!0,capture:!0},f_=(()=>{class t{_platform=h(ci);_listenerCleanups;modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new Jt(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(i=>i===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=yr(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(RI(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=yr(A)};constructor(){let A=h(Oe),i=h(Zt),n=h(E_,{optional:!0});if(this._options=BA(BA({},h_),n),this.modalityDetected=this._modality.pipe(rg(1)),this.modalityChanged=this.modalityDetected.pipe(hl()),this._platform.isBrowser){let o=h(Dr).createRenderer(null,null);this._listenerCleanups=A.runOutsideAngular(()=>[o.listen(i,"keydown",this._onKeydown,Yv),o.listen(i,"mousedown",this._onMousedown,Yv),o.listen(i,"touchstart",this._onTouchstart,Yv)])}}ngOnDestroy(){this._modality.complete(),this._listenerCleanups?.forEach(A=>A())}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),rh=(function(t){return t[t.IMMEDIATE=0]="IMMEDIATE",t[t.EVENTUAL=1]="EVENTUAL",t})(rh||{}),m_=new wA("cdk-focus-monitor-default-options"),Yf=Md({passive:!0,capture:!0}),Ha=(()=>{class t{_ngZone=h(Oe);_platform=h(ci);_inputModalityDetector=h(f_);_origin=null;_lastFocusOrigin=null;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=h(Zt);_stopInputModalityDetector=new $A;constructor(){let A=h(m_,{optional:!0});this._detectionMode=A?.detectionMode||rh.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let i=yr(A);for(let n=i;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,i=!1){let n=ls(A);if(!this._platform.isBrowser||n.nodeType!==1)return oe();let o=Uv(n)||this._document,a=this._elementInfo.get(n);if(a)return i&&(a.checkChildren=!0),a.subject;let r={checkChildren:i,subject:new $A,rootNode:o};return this._elementInfo.set(n,r),this._registerGlobalListeners(r),r.subject}stopMonitoring(A){let i=ls(A),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(A,i,n){let o=ls(A),a=this._document.activeElement;o===a?this._getClosestElementsInfo(o).forEach(([r,s])=>this._originChanged(r,i,s)):(this._setOrigin(i),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,i)=>this.stopMonitoring(i))}_getWindow(){return this._document.defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===rh.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,i){A.classList.toggle("cdk-focused",!!i),A.classList.toggle("cdk-touch-focused",i==="touch"),A.classList.toggle("cdk-keyboard-focused",i==="keyboard"),A.classList.toggle("cdk-mouse-focused",i==="mouse"),A.classList.toggle("cdk-program-focused",i==="program")}_setOrigin(A,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&i,this._detectionMode===rh.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?u_:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,i){let n=this._elementInfo.get(i),o=yr(A);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(A,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&A.relatedTarget instanceof Node&&i.contains(A.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(A,i){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(i))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let i=A.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener("focus",this._rootNodeFocusAndBlurListener,Yf),i.addEventListener("blur",this._rootNodeFocusAndBlurListener,Yf)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(Bt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let i=A.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener("focus",this._rootNodeFocusAndBlurListener,Yf),i.removeEventListener("blur",this._rootNodeFocusAndBlurListener,Yf),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,i,n){this._setClasses(A,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(A){let i=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!i||i===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let a=0;a{class t{_elementRef=h(ge);_focusMonitor=h(Ha);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new WA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return t})();var Hf=new WeakMap,Hn=(()=>{class t{_appRef;_injector=h(ut);_environmentInjector=h(pr);load(A){let i=this._appRef=this._appRef||this._injector.get(p0),n=Hf.get(i);n||(n={loaders:new Set,refs:[]},Hf.set(i,n),i.onDestroy(()=>{Hf.get(i)?.refs.forEach(o=>o.destroy()),Hf.delete(i)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(yf(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var KC=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0} `],encapsulation:2,changeDetection:0})}return t})(),Tf;function goA(){if(Tf===void 0&&(Tf=null,typeof window<"u")){let t=window;t.trustedTypes!==void 0&&(Tf=t.trustedTypes.createPolicy("angular#components",{createHTML:e=>e}))}return Tf}function NI(t){return goA()?.createHTML(t)||t}function p_(t,e,A){let i=A.sanitize(ul.HTML,e);t.innerHTML=NI(i||"")}function kd(t){return Array.isArray(t)?t:[t]}var D_=new Set,FI,Sd=(()=>{class t{_platform=h(ci);_nonce=h(cL,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):coA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&loA(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function loA(t,e){if(!D_.has(t))try{FI||(FI=document.createElement("style"),e&&FI.setAttribute("nonce",e),FI.setAttribute("type","text/css"),document.head.appendChild(FI)),FI.sheet&&(FI.sheet.insertRule(`@media ${t} {body{ }}`,0),D_.add(t))}catch(A){console.error(A)}}function coA(t){return{matches:t==="all"||t==="",media:t,addListener:()=>{},removeListener:()=>{}}}var sh=(()=>{class t{_mediaMatcher=h(Sd);_zone=h(Oe);_queries=new Map;_destroySubject=new $A;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return w_(kd(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=w_(kd(A)).map(a=>this._registerQuery(a).observable),o=Va(n);return o=lf(o.pipe(qn(1)),o.pipe(rg(1),ps(0))),o.pipe(fe(a=>{let r={matches:!1,breakpoints:{}};return a.forEach(({matches:s,query:g})=>{r.matches=r.matches||s,r.breakpoints[g]=s}),r}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let i=this._mediaMatcher.matchMedia(A),o={observable:new Ti(a=>{let r=s=>this._zone.run(()=>a.next(s));return i.addListener(r),()=>{i.removeListener(r)}}).pipe(nn(i),fe(({matches:a})=>({query:A,matches:a})),Bt(this._destroySubject)),mql:i};return this._queries.set(A,o),o}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function w_(t){return t.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}function CoA(t){if(t.type==="characterData"&&t.target instanceof Comment)return!0;if(t.type==="childList"){for(let e=0;e{class t{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),v_=(()=>{class t{_mutationObserverFactory=h(y_);_observedElements=new Map;_ngZone=h(Oe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,i)=>this._cleanupObserver(i))}observe(A){let i=ls(A);return new Ti(n=>{let a=this._observeElement(i).pipe(fe(r=>r.filter(s=>!CoA(s))),We(r=>!!r.length)).subscribe(r=>{this._ngZone.run(()=>{n.next(r)})});return()=>{a.unsubscribe(),this._unobserveElement(i)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let i=new $A,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:i,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:i,stream:n}=this._observedElements.get(A);i&&i.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),b_=(()=>{class t{_contentObserver=h(v_);_elementRef=h(ge);event=new WA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=Rs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(ps(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",he],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return t})(),Of=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({providers:[y_]})}return t})();var xd=(()=>{class t{_platform=h(ci);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return doA(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let i=IoA(poA(A));if(i&&(M_(i)===-1||!this.isVisible(i)))return!1;let n=A.nodeName.toLowerCase(),o=M_(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!foA(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,i){return moA(A)&&!this.isDisabled(A)&&(i?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function IoA(t){try{return t.frameElement}catch(e){return null}}function doA(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects=="function"&&t.getClientRects().length)}function BoA(t){let e=t.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function QoA(t){return hoA(t)&&t.type=="hidden"}function EoA(t){return uoA(t)&&t.hasAttribute("href")}function hoA(t){return t.nodeName.toLowerCase()=="input"}function uoA(t){return t.nodeName.toLowerCase()=="a"}function x_(t){if(!t.hasAttribute("tabindex")||t.tabIndex===void 0)return!1;let e=t.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function M_(t){if(!x_(t))return null;let e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function foA(t){let e=t.nodeName.toLowerCase(),A=e==="input"&&t.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function moA(t){return QoA(t)?!1:BoA(t)||EoA(t)||t.hasAttribute("contenteditable")||x_(t)}function poA(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var zf=class{_element;_checker;_ngZone;_document;_injector;_startAnchor=null;_endAnchor=null;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,i,n,o=!1,a){this._element=e,this._checker=A,this._ngZone=i,this._document=n,this._injector=a,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let i=this._getFirstTabbableElement(A);return i?.focus(e),!!i}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=0;i=0;i--){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[i]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?Nn(e,{injector:this._injector}):setTimeout(e)}},gh=(()=>{class t{_checker=h(xd);_ngZone=h(Oe);_document=h(Zt);_injector=h(ut);constructor(){h(Hn).load(KC)}create(A,i=!1){return new zf(A,this._checker,this._ngZone,this._document,i,this._injector)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var R_=new wA("liveAnnouncerElement",{providedIn:"root",factory:()=>null}),N_=new wA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),DoA=0,lh=(()=>{class t{_ngZone=h(Oe);_defaultOptions=h(N_,{optional:!0});_liveElement;_document=h(Zt);_sanitizer=h(LC);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=h(R_,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...i){let n=this._defaultOptions,o,a;return i.length===1&&typeof i[0]=="number"?a=i[0]:[o,a]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),a==null&&n&&(a=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(r=>this._currentResolve=r)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{!A||typeof A=="string"?this._liveElement.textContent=A:p_(this._liveElement,A,this._sanitizer),typeof a=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),a)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",i=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class t{_platform=h(ci);_hasCheckedHighContrastMode=!1;_document=h(Zt);_breakpointSubscription;constructor(){this._breakpointSubscription=h(sh).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return UC.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return UC.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return UC.BLACK_ON_WHITE}return UC.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(Tv,k_,S_),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===UC.BLACK_ON_WHITE?A.add(Tv,k_):i===UC.WHITE_ON_BLACK&&A.add(Tv,S_)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),ch=(()=>{class t{constructor(){h(F_)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Of]})}return t})();var Ov={},An=class t{_appId=h(Bf);static _infix=`a${Math.floor(Math.random()*1e5).toString()}`;getId(e,A=!1){return this._appId!=="ng"&&(e+=this._appId),Ov.hasOwnProperty(e)||(Ov[e]=0),`${e}${A?t._infix+"-":""}${Ov[e]++}`}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var woA=200,Pf=class{_letterKeyStream=new $A;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new $A;selectedItem=this._selectedItem;constructor(e,A){let i=typeof A?.debounceInterval=="number"?A.debounceInterval:woA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(Wt(A=>this._pressedLetters.push(A)),ps(e),We(()=>this._pressedLetters.length>0),fe(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let i=1;it[A]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}var Rd=class{_items;_activeItemIndex=jA(-1);_activeItem=jA(null);_wrap=!1;_typeaheadSubscription=Rn.EMPTY;_itemChangesSubscription;_vertical=!0;_horizontal=null;_allowedModifierKeys=[];_homeAndEnd=!1;_pageUpAndDown={enabled:!1,delta:10};_effectRef;_typeahead;_skipPredicateFn=e=>e.disabled;constructor(e,A){this._items=e,e instanceof Sg?this._itemChangesSubscription=e.changes.subscribe(i=>this._itemsChanged(i.toArray())):bI(e)&&(this._effectRef=pa(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new $A;change=new $A;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new Pf(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex())}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex()+this._pageUpAndDown.delta,a=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&i!==this._activeItemIndex()&&(this._activeItemIndex.set(i),this._typeahead?.setCurrentSelectedItemIndex(i))}}};var Qh=class extends Rd{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}};var Mc=class extends Rd{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var G_=" ";function jv(t,e,A){let i=qf(t,e);A=A.trim(),!i.some(n=>n.trim()===A)&&(i.push(A),t.setAttribute(e,i.join(G_)))}function Vf(t,e,A){let i=qf(t,e);A=A.trim();let n=i.filter(o=>o!==A);n.length?t.setAttribute(e,n.join(G_)):t.removeAttribute(e)}function qf(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}var K_="cdk-describedby-message",jf="cdk-describedby-host",Pv=0,U_=(()=>{class t{_platform=h(ci);_document=h(Zt);_messageRegistry=new Map;_messagesContainer=null;_id=`${Pv++}`;constructor(){h(Hn).load(KC),this._id=h(Bf)+"-"+Pv++}describe(A,i,n){if(!this._canBeDescribed(A,i))return;let o=zv(i,n);typeof i!="string"?(__(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,i,n){if(!i||!this._isElementNode(A))return;let o=zv(i,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof i=="string"){let a=this._messageRegistry.get(o);a&&a.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${jf}="${this._id}"]`);for(let i=0;in.indexOf(K_)!=0);A.setAttribute("aria-describedby",i.join(" "))}_addMessageReference(A,i){let n=this._messageRegistry.get(i);jv(A,"aria-describedby",n.messageElement.id),A.setAttribute(jf,this._id),n.referenceCount++}_removeMessageReference(A,i){let n=this._messageRegistry.get(i);n.referenceCount--,Vf(A,"aria-describedby",n.messageElement.id),A.removeAttribute(jf)}_isElementDescribedByMessage(A,i){let n=qf(A,"aria-describedby"),o=this._messageRegistry.get(i),a=o&&o.messageElement.id;return!!a&&n.indexOf(a)!=-1}_canBeDescribed(A,i){if(!this._isElementNode(A))return!1;if(i&&typeof i=="object")return!0;let n=i==null?"":`${i}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function zv(t,e){return typeof t=="string"?`${e||""}/${t}`:t}function __(t,e){t.id||(t.id=`${K_}-${e}-${Pv++}`)}var ml=(function(t){return t[t.NORMAL=0]="NORMAL",t[t.NEGATED=1]="NEGATED",t[t.INVERTED=2]="INVERTED",t})(ml||{}),Wf,LI;function Zf(){if(LI==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return LI=!1,LI;if(document.documentElement?.style&&"scrollBehavior"in document.documentElement.style)LI=!0;else{let t=Element.prototype.scrollTo;t?LI=!/\{\s*\[native code\]\s*\}/.test(t.toString()):LI=!1}}return LI}function Nd(){if(typeof document!="object"||!document)return ml.NORMAL;if(Wf==null){let t=document.createElement("div"),e=t.style;t.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),i=A.style;i.width="2px",i.height="1px",t.appendChild(A),document.body.appendChild(t),Wf=ml.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,Wf=t.scrollLeft===0?ml.NEGATED:ml.INVERTED),t.remove()}return Wf}function qv(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}var Fd,J_=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Vv(){if(Fd)return Fd;if(typeof document!="object"||!document)return Fd=new Set(J_),Fd;let t=document.createElement("input");return Fd=new Set(J_.filter(e=>(t.setAttribute("type",e),t.type===e))),Fd}var Y_={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var voA=new wA("MATERIAL_ANIMATIONS"),H_=null;function Eh(){return h(voA,{optional:!0})?.animationsDisabled||h(vI,{optional:!0})==="NoopAnimations"?"di-disabled":(H_??=h(Sd).matchMedia("(prefers-reduced-motion)").matches,H_?"reduced-motion":"enabled")}function Oi(){return Eh()!=="enabled"}function Ra(t){return t==null?"":typeof t=="string"?t:`${t}px`}function sr(t){return t!=null&&`${t}`!="false"}var cs=(function(t){return t[t.FADING_IN=0]="FADING_IN",t[t.VISIBLE=1]="VISIBLE",t[t.FADING_OUT=2]="FADING_OUT",t[t.HIDDEN=3]="HIDDEN",t})(cs||{}),Wv=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=cs.HIDDEN;constructor(e,A,i,n=!1){this._renderer=e,this.element=A,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},T_=Md({passive:!0,capture:!0}),Zv=class{_events=new Map;addHandler(e,A,i,n){let o=this._events.get(A);if(o){let a=o.get(i);a?a.add(n):o.set(i,new Set([n]))}else this._events.set(A,new Map([[i,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,T_)})}removeHandler(e,A,i){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(i),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,T_)))}_delegateEventHandler=e=>{let A=yr(e);A&&this._events.get(e.type)?.forEach((i,n)=>{(n===A||n.contains(A))&&i.forEach(o=>o.handleEvent(e))})}},hh={enterDuration:225,exitDuration:150},boA=800,O_=Md({passive:!0,capture:!0}),z_=["mousedown","touchstart"],P_=["mouseup","mouseleave","touchend","touchcancel"],MoA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none} `],encapsulation:2,changeDetection:0})}return t})(),uh=class t{_target;_ngZone;_platform;_containerElement;_triggerElement=null;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple=null;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect=null;static _eventManager=new Zv;constructor(e,A,i,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=ls(i)),o&&o.get(Hn).load(MoA)}fadeInRipple(e,A,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=BA(BA({},hh),i.animation);i.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let a=i.radius||koA(e,A,n),r=e-n.left,s=A-n.top,g=o.enterDuration,l=document.createElement("div");l.classList.add("mat-ripple-element"),l.style.left=`${r-a}px`,l.style.top=`${s-a}px`,l.style.height=`${a*2}px`,l.style.width=`${a*2}px`,i.color!=null&&(l.style.backgroundColor=i.color),l.style.transitionDuration=`${g}ms`,this._containerElement.appendChild(l);let C=window.getComputedStyle(l),I=C.transitionProperty,d=C.transitionDuration,B=I==="none"||d==="0s"||d==="0s, 0s"||n.width===0&&n.height===0,Q=new Wv(this,l,i,B);l.style.transform="scale3d(1, 1, 1)",Q.state=cs.FADING_IN,i.persistent||(this._mostRecentTransientRipple=Q);let E=null;return!B&&(g||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let f=()=>{E&&(E.fallbackTimer=null),clearTimeout(R),this._finishRippleTransition(Q)},b=()=>this._destroyRipple(Q),R=setTimeout(b,g+100);l.addEventListener("transitionend",f),l.addEventListener("transitioncancel",b),E={onTransitionEnd:f,onTransitionCancel:b,fallbackTimer:R}}),this._activeRipples.set(Q,E),(B||!g)&&this._finishRippleTransition(Q),Q}fadeOutRipple(e){if(e.state===cs.FADING_OUT||e.state===cs.HIDDEN)return;let A=e.element,i=BA(BA({},hh),e.config.animation);A.style.transitionDuration=`${i.exitDuration}ms`,A.style.opacity="0",e.state=cs.FADING_OUT,(e._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=ls(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,z_.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{P_.forEach(A=>{this._triggerElement.addEventListener(A,this,O_)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===cs.FADING_IN?this._startFadeOutTransition(e):e.state===cs.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:i}=e.config;e.state=cs.VISIBLE,!i&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=cs.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=xI(e),i=this._lastTouchStartEvent&&Date.now(){let A=e.state===cs.VISIBLE||e.config.terminateOnPointerUp&&e.state===cs.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(z_.forEach(A=>t._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(P_.forEach(A=>e.removeEventListener(A,this,O_)),this._pointerUpEventsRegistered=!1))}};function koA(t,e,A){let i=Math.max(Math.abs(t-A.left),Math.abs(t-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(i*i+n*n)}var JC=new wA("mat-ripple-global-options"),Ns=(()=>{class t{_elementRef=h(ge);_animationsDisabled=Oi();color;unbounded=!1;centered=!1;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=h(Oe),i=h(ci),n=h(JC,{optional:!0}),o=h(ut);this._globalOptions=n||{},this._rippleRenderer=new uh(this,A,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:BA(BA(BA({},this._globalOptions.animation),this._animationsDisabled?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,i=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,i,BA(BA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,BA(BA({},this.rippleConfig),A))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return t})();var SoA={capture:!0},xoA=["focus","mousedown","mouseenter","touchstart"],Xv="mat-ripple-loader-uninitialized",$v="mat-ripple-loader-class-name",j_="mat-ripple-loader-centered",Xf="mat-ripple-loader-disabled",$f=(()=>{class t{_document=h(Zt);_animationsDisabled=Oi();_globalRippleOptions=h(JC,{optional:!0});_platform=h(ci);_ngZone=h(Oe);_injector=h(ut);_eventCleanups;_hosts=new Map;constructor(){let A=h(Dr).createRenderer(null,null);this._eventCleanups=this._ngZone.runOutsideAngular(()=>xoA.map(i=>A.listen(this._document,i,this._onInteraction,SoA)))}ngOnDestroy(){let A=this._hosts.keys();for(let i of A)this.destroyRipple(i);this._eventCleanups.forEach(i=>i())}configureRipple(A,i){A.setAttribute(Xv,this._globalRippleOptions?.namespace??""),(i.className||!A.hasAttribute($v))&&A.setAttribute($v,i.className||""),i.centered&&A.setAttribute(j_,""),i.disabled&&A.setAttribute(Xf,"")}setDisabled(A,i){let n=this._hosts.get(A);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):i?A.setAttribute(Xf,""):A.removeAttribute(Xf)}_onInteraction=A=>{let i=yr(A);if(i instanceof HTMLElement){let n=i.closest(`[${Xv}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let i=this._document.createElement("span");i.classList.add("mat-ripple",A.getAttribute($v)),A.append(i);let n=this._globalRippleOptions,o=this._animationsDisabled?0:n?.animation?.enterDuration??hh.enterDuration,a=this._animationsDisabled?0:n?.animation?.exitDuration??hh.exitDuration,r={rippleDisabled:this._animationsDisabled||n?.disabled||A.hasAttribute(Xf),rippleConfig:{centered:A.hasAttribute(j_),terminateOnPointerUp:n?.terminateOnPointerUp,animation:{enterDuration:o,exitDuration:a}}},s=new uh(r,this._ngZone,i,this._platform,this._injector),g=!r.rippleDisabled;g&&s.setupTriggerEvents(A),this._hosts.set(A,{target:r,renderer:s,hasSetUpEvents:g}),A.removeAttribute(Xv)}destroyRipple(A){let i=this._hosts.get(A);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Za=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["structural-styles"]],decls:0,vars:0,template:function(i,n){},styles:[`.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus-visible::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}} `],encapsulation:2,changeDetection:0})}return t})();var RoA=["mat-icon-button",""],NoA=["*"],FoA=new wA("MAT_BUTTON_CONFIG");function q_(t){return t==null?void 0:Zi(t)}var Am=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_animationsDisabled=Oi();_config=h(FoA,{optional:!0});_focusMonitor=h(Ha);_cleanupClick;_renderer=h(ui);_rippleLoader=h($f);_isAnchor;_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;tabIndex;set _tabindex(A){this.tabIndex=A}constructor(){h(Hn).load(Za);let A=this._elementRef.nativeElement;this._isAnchor=A.tagName==="A",this.disabledInteractive=this._config?.disabledInteractive??!1,this.color=this._config?.color??null,this._rippleLoader?.configureRipple(A,{className:"mat-mdc-button-ripple"})}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0),this._isAnchor&&this._setupAsAnchor()}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",i){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this._isAnchor?this.disabled||null:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}_getTabIndex(){return this._isAnchor?this.disabled&&!this.disabledInteractive?-1:this.tabIndex:this.tabIndex}_setupAsAnchor(){this._cleanupClick=this._ngZone.runOutsideAngular(()=>this._renderer.listen(this._elementRef.nativeElement,"click",A=>{this.disabled&&(A.preventDefault(),A.stopImmediatePropagation())}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,hostAttrs:[1,"mat-mdc-button-base"],hostVars:13,hostBindings:function(i,n){i&2&&(ie("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled())("tabindex",n._getTabIndex()),Qo(n.color?"mat-"+n.color:""),ae("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("mat-unthemed",!n.color)("_mat-animation-noopable",n._animationsDisabled))},inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",he],disabled:[2,"disabled","disabled",he],ariaDisabled:[2,"aria-disabled","ariaDisabled",he],disabledInteractive:[2,"disabledInteractive","disabledInteractive",he],tabIndex:[2,"tabIndex","tabIndex",q_],_tabindex:[2,"tabindex","_tabindex",q_]}})}return t})(),Ia=(()=>{class t extends Am{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["button","mat-icon-button",""],["a","mat-icon-button",""],["button","matIconButton",""],["a","matIconButton",""]],hostAttrs:[1,"mdc-icon-button","mat-mdc-icon-button"],exportAs:["matButton","matAnchor"],features:[Ct],attrs:RoA,ngContentSelectors:NoA,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Yt(),Ni(0,"span",0),He(1),Ni(2,"span",1)(3,"span",2))},styles:[`.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%));flex-shrink:0;text-align:center;width:var(--mat-icon-button-state-layer-size, 40px);height:var(--mat-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2);font-size:var(--mat-icon-button-icon-size, 24px);color:var(--mat-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-icon-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-icon-button-touch-target-size, 48px);display:var(--mat-icon-button-touch-target-display, block);left:50%;width:var(--mat-icon-button-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mat-icon-button-icon-size, 24px);height:var(--mat-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:var(--mat-icon-button-container-shape, var(--mat-sys-corner-full, 50%))}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1} `,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} `],encapsulation:2,changeDetection:0})}return t})();var LoA=new wA("cdk-dir-doc",{providedIn:"root",factory:()=>h(Zt)}),_oA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function V_(t){let e=t?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?_oA.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var wo=(()=>{class t{get value(){return this.valueSignal()}valueSignal=jA("ltr");change=new WA;constructor(){let A=h(LoA,{optional:!0});if(A){let i=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.valueSignal.set(V_(i||n||"ltr"))}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Fi=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();var YC=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();var GoA=["matButton",""],Z_=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],X_=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var KoA=["mat-mini-fab",""],UoA=`.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus-visible>.mat-focus-indicator::before{content:""}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mat-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mat-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mat-fab-container-elevation-shadow, var(--mat-sys-level3))}@media(hover: hover){.mat-mdc-fab:hover{box-shadow:var(--mat-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-fab:focus{box-shadow:var(--mat-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mat-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-fab-touch-target-size, 48px);display:var(--mat-fab-touch-target-display, block);left:50%;width:var(--mat-fab-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mat-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mat-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mat-fab-small-container-elevation-shadow, var(--mat-sys-level3))}@media(hover: hover){.mat-mdc-mini-fab:hover{box-shadow:var(--mat-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-mini-fab:focus{box-shadow:var(--mat-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mat-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-fab-small-touch-target-size, 48px);display:var(--mat-fab-small-touch-target-display);left:50%;width:var(--mat-fab-small-touch-target-size, 48px);transform:translate(-50%, -50%)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;box-shadow:var(--mat-fab-extended-container-elevation-shadow, var(--mat-sys-level3));height:var(--mat-fab-extended-container-height, 56px);border-radius:var(--mat-fab-extended-container-shape, var(--mat-sys-corner-large));font-family:var(--mat-fab-extended-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-fab-extended-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-fab-extended-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-fab-extended-label-text-tracking, var(--mat-sys-label-large-tracking))}@media(hover: hover){.mat-mdc-extended-fab:hover{box-shadow:var(--mat-fab-extended-hover-container-elevation-shadow, var(--mat-sys-level4))}}.mat-mdc-extended-fab:focus{box-shadow:var(--mat-fab-extended-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mat-fab-extended-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%} `,W_=new Map([["text",["mat-mdc-button"]],["filled",["mdc-button--unelevated","mat-mdc-unelevated-button"]],["elevated",["mdc-button--raised","mat-mdc-raised-button"]],["outlined",["mdc-button--outlined","mat-mdc-outlined-button"]],["tonal",["mat-tonal-button"]]]),vn=(()=>{class t extends Am{get appearance(){return this._appearance}set appearance(A){this.setAppearance(A||this._config?.defaultAppearance||"text")}_appearance=null;constructor(){super();let A=JoA(this._elementRef.nativeElement);A&&this.setAppearance(A)}setAppearance(A){if(A===this._appearance)return;let i=this._elementRef.nativeElement.classList,n=this._appearance?W_.get(this._appearance):null,o=W_.get(A);n&&i.remove(...n),i.add(...o),this._appearance=A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["button","matButton",""],["a","matButton",""],["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""],["a","mat-button",""],["a","mat-raised-button",""],["a","mat-flat-button",""],["a","mat-stroked-button",""]],hostAttrs:[1,"mdc-button"],inputs:{appearance:[0,"matButton","appearance"]},exportAs:["matButton","matAnchor"],features:[Ct],attrs:GoA,ngContentSelectors:X_,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Yt(Z_),Ni(0,"span",0),He(1),ti(2,"span",1),He(3,1),Ii(),He(4,2),Ni(5,"span",2)(6,"span",3)),i&2&&ae("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[`.mat-mdc-button-base{text-decoration:none}.mat-mdc-button-base .mat-icon{min-height:fit-content;flex-shrink:0}@media(hover: none){.mat-mdc-button-base:hover>span.mat-mdc-button-persistent-ripple::before{opacity:0}}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-button-text-horizontal-padding, 12px);height:var(--mat-button-text-container-height, 40px);font-family:var(--mat-button-text-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-text-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-text-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-text-label-text-transform);font-weight:var(--mat-button-text-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mat-button-text-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mat-button-text-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-text-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-button-text-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-offset, -4px);margin-left:var(--mat-button-text-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-text-icon-spacing, 8px);margin-left:var(--mat-button-text-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-button-text-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-text-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-text-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-text-touch-target-size, 48px);display:var(--mat-button-text-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-filled-container-height, 40px);font-family:var(--mat-button-filled-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-filled-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-filled-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-filled-label-text-transform);font-weight:var(--mat-button-filled-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-filled-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-offset, -8px);margin-left:var(--mat-button-filled-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-filled-icon-spacing, 8px);margin-left:var(--mat-button-filled-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-button-filled-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-filled-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-filled-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-filled-touch-target-size, 48px);display:var(--mat-button-filled-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mat-button-filled-label-text-color, var(--mat-sys-on-primary));background-color:var(--mat-button-filled-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mat-button-filled-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mat-button-protected-container-elevation-shadow, var(--mat-sys-level1));height:var(--mat-button-protected-container-height, 40px);font-family:var(--mat-button-protected-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-protected-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-protected-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-protected-label-text-transform);font-weight:var(--mat-button-protected-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-protected-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-offset, -8px);margin-left:var(--mat-button-protected-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-protected-icon-spacing, 8px);margin-left:var(--mat-button-protected-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-button-protected-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-protected-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-protected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-protected-touch-target-size, 48px);display:var(--mat-button-protected-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-raised-button:not(:disabled){color:var(--mat-button-protected-label-text-color, var(--mat-sys-primary));background-color:var(--mat-button-protected-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mat-button-protected-container-shape, var(--mat-sys-corner-full))}@media(hover: hover){.mat-mdc-raised-button:hover{box-shadow:var(--mat-button-protected-hover-container-elevation-shadow, var(--mat-sys-level2))}}.mat-mdc-raised-button:focus{box-shadow:var(--mat-button-protected-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mat-button-protected-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-protected-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-protected-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mat-button-protected-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-outlined-container-height, 40px);font-family:var(--mat-button-outlined-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-outlined-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-outlined-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-outlined-label-text-transform);font-weight:var(--mat-button-outlined-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mat-button-outlined-container-shape, var(--mat-sys-corner-full));border-width:var(--mat-button-outlined-outline-width, 1px);padding:0 var(--mat-button-outlined-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-offset, -8px);margin-left:var(--mat-button-outlined-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-outlined-icon-spacing, 8px);margin-left:var(--mat-button-outlined-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-button-outlined-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-outlined-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-outlined-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-outlined-touch-target-size, 48px);display:var(--mat-button-outlined-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-outlined-button:not(:disabled){color:var(--mat-button-outlined-label-text-color, var(--mat-sys-primary));border-color:var(--mat-button-outlined-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mat-button-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mat-button-tonal-container-height, 40px);font-family:var(--mat-button-tonal-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-button-tonal-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-button-tonal-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mat-button-tonal-label-text-transform);font-weight:var(--mat-button-tonal-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-button-tonal-horizontal-padding, 24px)}.mat-tonal-button:not(:disabled){color:var(--mat-button-tonal-label-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-button-tonal-container-color, var(--mat-sys-secondary-container))}.mat-tonal-button,.mat-tonal-button .mdc-button__ripple{border-radius:var(--mat-button-tonal-container-shape, var(--mat-sys-corner-full))}.mat-tonal-button[disabled],.mat-tonal-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-button-tonal-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-button-tonal-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-tonal-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}[dir=rtl] .mat-tonal-button>.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}.mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-offset, -8px);margin-left:var(--mat-button-tonal-icon-spacing, 8px)}[dir=rtl] .mat-tonal-button .mdc-button__label+.mat-icon{margin-right:var(--mat-button-tonal-icon-spacing, 8px);margin-left:var(--mat-button-tonal-icon-offset, -8px)}.mat-tonal-button .mat-ripple-element{background-color:var(--mat-button-tonal-ripple-color, color-mix(in srgb, var(--mat-sys-on-secondary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-tonal-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-tonal-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-button-tonal-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-tonal-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-tonal-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-tonal-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-tonal-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-button-tonal-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-tonal-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:var(--mat-button-tonal-touch-target-size, 48px);display:var(--mat-button-tonal-touch-target-display, block);left:0;right:0;transform:translateY(-50%)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button,.mat-tonal-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-tonal-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before,.mat-tonal-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon,.mat-tonal-button .mdc-button__label,.mat-tonal-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator,.mat-tonal-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit}.mat-mdc-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-raised-button:focus-visible>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus-visible>.mat-focus-indicator::before,.mat-tonal-button:focus-visible>.mat-focus-indicator::before{content:"";border-radius:inherit}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable,.mat-tonal-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon,.mat-tonal-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-tonal-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)} `,`@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-button-base.mat-tonal-button,.mat-mdc-icon-button.mat-mdc-icon-button,.mat-mdc-outlined-button .mdc-button__ripple{outline:solid 1px}} `],encapsulation:2,changeDetection:0})}return t})();function JoA(t){return t.hasAttribute("mat-raised-button")?"elevated":t.hasAttribute("mat-stroked-button")?"outlined":t.hasAttribute("mat-flat-button")?"filled":t.hasAttribute("mat-button")?"text":null}var YoA=new wA("mat-mdc-fab-default-options",{providedIn:"root",factory:()=>A7}),A7={color:"accent"};var em=(()=>{class t extends Am{_options=h(YoA,{optional:!0});_isFab=!0;constructor(){super(),this._options=this._options||A7,this.color=this._options.color||A7.color}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["button","mat-mini-fab",""],["a","mat-mini-fab",""],["button","matMiniFab",""],["a","matMiniFab",""]],hostAttrs:[1,"mdc-fab","mat-mdc-fab-base","mdc-fab--mini","mat-mdc-mini-fab"],exportAs:["matButton","matAnchor"],features:[Ct],attrs:KoA,ngContentSelectors:X_,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Yt(Z_),Ni(0,"span",0),He(1),ti(2,"span",1),He(3,1),Ii(),He(4,2),Ni(5,"span",2)(6,"span",3)),i&2&&ae("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[UoA],encapsulation:2,changeDetection:0})}return t})();var Cs=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[YC,Fi]})}return t})();var e7=class{_box;_destroyed=new $A;_resizeSubject=new $A;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new Ti(A=>{let i=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),i.unsubscribe(),this._elementObservables.delete(e)}}).pipe(We(A=>A.some(i=>i.target===e)),Ds({bufferSize:1,refCount:!0}),Bt(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},tm=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=h(Oe);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,i){let n=i?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new e7(n)),this._observers.get(n).observe(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var HoA=["notch"],ToA=["matFormFieldNotchedOutline",""],OoA=["*"],$_=["iconPrefixContainer"],AG=["textPrefixContainer"],eG=["iconSuffixContainer"],tG=["textSuffixContainer"],zoA=["textField"],PoA=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],joA=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function qoA(t,e){t&1&&GA(0,"span",21)}function VoA(t,e){if(t&1&&(m(0,"label",20),He(1,1),V(2,qoA,1,0,"span",21),D()),t&2){let A=y(2);X("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),ie("for",A._control.disableAutomaticLabeling?null:A._control.id),p(2),W(!A.hideRequiredMarker&&A._control.required?2:-1)}}function WoA(t,e){if(t&1&&V(0,VoA,3,5,"label",20),t&2){let A=y();W(A._hasFloatingLabel()?0:-1)}}function ZoA(t,e){t&1&&GA(0,"div",7)}function XoA(t,e){}function $oA(t,e){if(t&1&&yt(0,XoA,0,0,"ng-template",13),t&2){y(2);let A=Wi(1);X("ngTemplateOutlet",A)}}function AaA(t,e){if(t&1&&(m(0,"div",9),V(1,$oA,1,1,null,13),D()),t&2){let A=y();X("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),p(),W(A._forceDisplayInfixLabel()?-1:1)}}function eaA(t,e){t&1&&(m(0,"div",10,2),He(2,2),D())}function taA(t,e){t&1&&(m(0,"div",11,3),He(2,3),D())}function iaA(t,e){}function naA(t,e){if(t&1&&yt(0,iaA,0,0,"ng-template",13),t&2){y();let A=Wi(1);X("ngTemplateOutlet",A)}}function oaA(t,e){t&1&&(m(0,"div",14,4),He(2,4),D())}function aaA(t,e){t&1&&(m(0,"div",15,5),He(2,5),D())}function raA(t,e){t&1&&GA(0,"div",16)}function saA(t,e){t&1&&(m(0,"div",18),He(1,6),D())}function gaA(t,e){if(t&1&&(m(0,"mat-hint",22),K(1),D()),t&2){let A=y(2);X("id",A._hintLabelId),p(),qA(A.hintLabel)}}function laA(t,e){if(t&1&&(m(0,"div",19),V(1,gaA,2,2,"mat-hint",22),He(2,7),GA(3,"div",23),He(4,8),D()),t&2){let A=y();p(),W(A.hintLabel?1:-1)}}var pl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["mat-label"]]})}return t})(),gG=new wA("MatError"),t7=(()=>{class t{id=h(An).getId("mat-mdc-error-");constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["mat-error"],["","matError",""]],hostAttrs:[1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(i,n){i&2&&Bo("id",n.id)},inputs:{id:"id"},features:[It([{provide:gG,useExisting:t}])]})}return t})(),_I=(()=>{class t{align="start";id=h(An).getId("mat-mdc-hint-");static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(i,n){i&2&&(Bo("id",n.id),ie("align",null),ae("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return t})(),lG=new wA("MatPrefix"),i7=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matPrefix",""],["","matIconPrefix",""],["","matTextPrefix",""]],inputs:{_isTextSelector:[0,"matTextPrefix","_isTextSelector"]},features:[It([{provide:lG,useExisting:t}])]})}return t})(),cG=new wA("MatSuffix"),n7=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[It([{provide:cG,useExisting:t}])]})}return t})(),CG=new wA("FloatingLabelParent"),iG=(()=>{class t{_elementRef=h(ge);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=h(tm);_ngZone=h(Oe);_parent=h(CG);_resizeSubscription=new Rn;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return caA(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return t})();function caA(t){let e=t;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let i=A.scrollWidth;return A.remove(),i}var nG="mdc-line-ripple--active",im="mdc-line-ripple--deactivating",oG=(()=>{class t{_elementRef=h(ge);_cleanupTransitionEnd;constructor(){let A=h(Oe),i=h(ui);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(im),A.add(nG)}deactivate(){this._elementRef.nativeElement.classList.add(im)}_handleTransitionEnd=A=>{let i=this._elementRef.nativeElement.classList,n=i.contains(im);A.propertyName==="opacity"&&n&&i.remove(nG,im)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return t})(),aG=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);open=!1;_notch;ngAfterViewInit(){let A=this._elementRef.nativeElement,i=A.querySelector(".mdc-floating-label");i?(A.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(i.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>i.style.transitionDuration="")}))):A.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){let i=this._notch.nativeElement;!this.open||!A?i.style.width="":i.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}_setMaxWidth(A){this._notch.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${A}px)`)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(i,n){if(i&1&&ni(HoA,5),i&2){let o;Ce(o=Ie())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:ToA,ngContentSelectors:OoA,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(i,n){i&1&&(Yt(),Ni(0,"div",1),ti(1,"div",2,0),He(3),Ii(),Ni(4,"div",3))},encapsulation:2,changeDetection:0})}return t})(),fh=(()=>{class t{value=null;stateChanges;id;placeholder;ngControl=null;focused=!1;empty=!1;shouldLabelFloat=!1;required=!1;disabled=!1;errorState=!1;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;describedByIds;static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t})}return t})();var mh=new wA("MatFormField"),CaA=new wA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),rG="fill",IaA="auto",sG="fixed",daA="translateY(-50%)",To=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_platform=h(ci);_idGenerator=h(An);_ngZone=h(Oe);_defaults=h(CaA,{optional:!0});_currentDirection;_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_iconPrefixContainerSignal=Xo("iconPrefixContainer");_textPrefixContainerSignal=Xo("textPrefixContainer");_iconSuffixContainerSignal=Xo("iconSuffixContainer");_textSuffixContainerSignal=Xo("textSuffixContainer");_prefixSuffixContainers=_e(()=>[this._iconPrefixContainerSignal(),this._textPrefixContainerSignal(),this._iconSuffixContainerSignal(),this._textSuffixContainerSignal()].map(A=>A?.nativeElement).filter(A=>A!==void 0));_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=w0(pl);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=sr(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||IaA}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearanceSignal()}set appearance(A){let i=A||this._defaults?.appearance||rG;this._appearanceSignal.set(i)}_appearanceSignal=jA(rG);get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||sG}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||sG}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_describedByIds;get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new $A;_isFocused=null;_explicitFormFieldControl;_previousControl=null;_previousControlValidatorFn=null;_stateChanges;_valueChanges;_describedByChanges;_outlineLabelOffsetResizeObserver=null;_animationsDisabled=Oi();constructor(){let A=this._defaults,i=h(wo);A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color)),pa(()=>this._currentDirection=i.valueSignal()),this._syncOutlineLabelOffset()}ngAfterViewInit(){this._updateFocusState(),this._animationsDisabled||this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-form-field-animations-enabled")},300)}),this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._control.ngControl&&this._control.ngControl.control&&(this._previousControlValidatorFn=this._control.ngControl.control.validator),this._previousControl=this._control),this._control.ngControl&&this._control.ngControl.control&&this._control.ngControl.control.validator!==this._previousControlValidatorFn&&this._changeDetectorRef.markForCheck()}ngOnDestroy(){this._outlineLabelOffsetResizeObserver?.disconnect(),this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=_e(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let i=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(nn([void 0,void 0]),fe(()=>[i.errorState,i.userAriaDescribedBy]),kC(),We(([[o,a],[r,s]])=>o!==r||a!==s)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(Bt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Qi(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){let A=this._control.focused;A&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!A&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._elementRef.nativeElement.classList.toggle("mat-focused",A),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",A)}_syncOutlineLabelOffset(){yL({earlyRead:()=>{if(this._appearanceSignal()!=="outline")return this._outlineLabelOffsetResizeObserver?.disconnect(),null;if(globalThis.ResizeObserver){this._outlineLabelOffsetResizeObserver||=new globalThis.ResizeObserver(()=>{this._writeOutlinedLabelStyles(this._getOutlinedLabelOffset())});for(let A of this._prefixSuffixContainers())this._outlineLabelOffsetResizeObserver.observe(A,{box:"border-box"})}return this._getOutlinedLabelOffset()},write:A=>this._writeOutlinedLabelStyles(A())})}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=_e(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let i=this._control?this._control.ngControl:null;return i&&i[A]}_getSubscriptMessageType(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getSubscriptMessageType()==="hint"){let o=this._hintChildren?this._hintChildren.find(r=>r.align==="start"):null,a=this._hintChildren?this._hintChildren.find(r=>r.align==="end"):null;o?A.push(o.id):this._hintLabel&&A.push(this._hintLabelId),a&&A.push(a.id)}else this._errorChildren&&A.push(...this._errorChildren.map(o=>o.id));let i=this._control.describedByIds,n;if(i){let o=this._describedByIds||A;n=A.concat(i.filter(a=>a&&!o.includes(a)))}else n=A;this._control.setDescribedByIds(n),this._describedByIds=A}}_getOutlinedLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return null;if(!this._iconPrefixContainer&&!this._textPrefixContainer)return["",null];if(!this._isAttachedToDom())return null;let A=this._iconPrefixContainer?.nativeElement,i=this._textPrefixContainer?.nativeElement,n=this._iconSuffixContainer?.nativeElement,o=this._textSuffixContainer?.nativeElement,a=A?.getBoundingClientRect().width??0,r=i?.getBoundingClientRect().width??0,s=n?.getBoundingClientRect().width??0,g=o?.getBoundingClientRect().width??0,l=this._currentDirection==="rtl"?"-1":"1",C=`${a+r}px`,d=`calc(${l} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`,B=`var(--mat-mdc-form-field-label-transform, ${daA} translateX(${d}))`,Q=a+r+s+g;return[B,Q]}_writeOutlinedLabelStyles(A){if(A!==null){let[i,n]=A;this._floatingLabel&&(this._floatingLabel.element.style.transform=i),n!==null&&this._notchedOutline?._setMaxWidth(n)}}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let i=A.getRootNode();return i&&i!==A}return document.documentElement.contains(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-form-field"]],contentQueries:function(i,n,o){if(i&1&&(wf(o,n._labelChild,pl,5),na(o,fh,5)(o,lG,5)(o,cG,5)(o,gG,5)(o,_I,5)),i&2){rr();let a;Ce(a=Ie())&&(n._formFieldControl=a.first),Ce(a=Ie())&&(n._prefixChildren=a),Ce(a=Ie())&&(n._suffixChildren=a),Ce(a=Ie())&&(n._errorChildren=a),Ce(a=Ie())&&(n._hintChildren=a)}},viewQuery:function(i,n){if(i&1&&(Or(n._iconPrefixContainerSignal,$_,5)(n._textPrefixContainerSignal,AG,5)(n._iconSuffixContainerSignal,eG,5)(n._textSuffixContainerSignal,tG,5),ni(zoA,5)($_,5)(AG,5)(eG,5)(tG,5)(iG,5)(aG,5)(oG,5)),i&2){rr(4);let o;Ce(o=Ie())&&(n._textField=o.first),Ce(o=Ie())&&(n._iconPrefixContainer=o.first),Ce(o=Ie())&&(n._textPrefixContainer=o.first),Ce(o=Ie())&&(n._iconSuffixContainer=o.first),Ce(o=Ie())&&(n._textSuffixContainer=o.first),Ce(o=Ie())&&(n._floatingLabel=o.first),Ce(o=Ie())&&(n._notchedOutline=o.first),Ce(o=Ie())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:38,hostBindings:function(i,n){i&2&&ae("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[It([{provide:mh,useExisting:t},{provide:CG,useExisting:t}])],ngContentSelectors:joA,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],["aria-atomic","true","aria-live","polite",1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(i,n){if(i&1&&(Yt(PoA),yt(0,WoA,1,1,"ng-template",null,0,NC),m(2,"div",6,1),$("click",function(a){return n._control.onContainerClick(a)}),V(4,ZoA,1,0,"div",7),m(5,"div",8),V(6,AaA,2,2,"div",9),V(7,eaA,3,0,"div",10),V(8,taA,3,0,"div",11),m(9,"div",12),V(10,naA,1,1,null,13),He(11),D(),V(12,oaA,3,0,"div",14),V(13,aaA,3,0,"div",15),D(),V(14,raA,1,0,"div",16),D(),m(15,"div",17),V(16,saA,2,0,"div",18)(17,laA,5,1,"div",19),D()),i&2){let o;p(2),ae("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),p(2),W(!n._hasOutline()&&!n._control.disabled?4:-1),p(2),W(n._hasOutline()?6:-1),p(),W(n._hasIconPrefix?7:-1),p(),W(n._hasTextPrefix?8:-1),p(2),W(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),p(2),W(n._hasTextSuffix?12:-1),p(),W(n._hasIconSuffix?13:-1),p(),W(n._hasOutline()?-1:14),p(),ae("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic");let a=n._getSubscriptMessageType();p(),W((o=a)==="error"?16:o==="hint"?17:-1)}},dependencies:[iG,aG,Ng,oG,_I],styles:[`.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator,.mdc-text-field__input::-webkit-search-cancel-button{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-filled-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-filled-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-filled-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mat-form-field-outlined-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mat-form-field-outlined-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-outlined-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-filled-error-caret-color, var(--mat-sys-error))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mat-form-field-outlined-error-caret-color, var(--mat-sys-error))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-filled-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mat-form-field-outlined-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mat-form-field-filled-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mat-form-field-filled-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mat-form-field-filled-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-filled-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-filled-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-filled-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-filled-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-filled-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-filled-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mat-form-field-filled-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-filled-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-filled-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-filled-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mat-form-field-outlined-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mat-form-field-outlined-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mat-form-field-outlined-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mat-form-field-outlined-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mat-form-field-outlined-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mat-form-field-outlined-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mat-form-field-outlined-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-form-field-outlined-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-form-field-outlined-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-form-field-outlined-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-outline-color, var(--mat-sys-outline));border-width:var(--mat-form-field-outlined-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mat-form-field-outlined-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mat-form-field-outlined-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{max-width:min(100%,calc(100% - max(12px, var(--mat-form-field-outlined-container-shape, var(--mat-sys-corner-extra-small))) * 2))}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mat-form-field-filled-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mat-form-field-filled-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mat-form-field-filled-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mat-form-field-filled-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}@keyframes _mat-form-field-subscript-animation{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px;opacity:1;transform:translateY(0);animation:_mat-form-field-subscript-animation 0ms cubic-bezier(0.55, 0, 0.55, 0.2)}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field.mat-form-field-animations-enabled.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field.mat-form-field-animations-enabled .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field.mat-form-field-animations-enabled .mat-mdc-form-field-error-wrapper{animation-duration:300ms}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)} `],encapsulation:2,changeDetection:0})}return t})();var vr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Of,To,Fi]})}return t})();var IG=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms} `],encapsulation:2,changeDetection:0})}return t})(),BaA={passive:!0},dG=(()=>{class t{_platform=h(ci);_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_styleLoader=h(Hn);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return xa;this._styleLoader.load(IG);let i=ls(A),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new $A,a="cdk-text-field-autofilled",r=g=>{g.animationName==="cdk-text-field-autofill-start"&&!i.classList.contains(a)?(i.classList.add(a),this._ngZone.run(()=>o.next({target:g.target,isAutofilled:!0}))):g.animationName==="cdk-text-field-autofill-end"&&i.classList.contains(a)&&(i.classList.remove(a),this._ngZone.run(()=>o.next({target:g.target,isAutofilled:!1})))},s=this._ngZone.runOutsideAngular(()=>(i.classList.add("cdk-text-field-autofill-monitored"),this._renderer.listen(i,"animationstart",r,BaA)));return this._monitoredElements.set(i,{subject:o,unlisten:s}),o}stopMonitoring(A){let i=ls(A),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove("cdk-text-field-autofill-monitored"),i.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((A,i)=>this.stopMonitoring(i))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var nm=(()=>{class t{_elementRef=h(ge);_platform=h(ci);_ngZone=h(Oe);_renderer=h(ui);_resizeEvents=new $A;_previousValue;_initialHeight;_destroyed=new $A;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=Rs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=Rs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=h(Zt);_hasFocus=!1;_isViewInited=!1;constructor(){h(Hn).load(IG),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(yI(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),i=A.style;A.rows=1,i.position="absolute",i.visibility="hidden",i.border="none",i.padding="0",i.height="",i.minHeight="",i.maxHeight="",i.top=i.bottom=i.left=i.right="auto",i.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,i=A.style.marginBottom||"",n=this._platform.FIREFOX,o=this._hasFocus,a=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(a);let r=A.scrollHeight-4;return A.classList.remove(a),o&&(A.style.marginBottom=i),r}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),a=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${a}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:i,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(i,n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(i,n){i&1&&$("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",he],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return t})(),_d=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();var QG=new wA("MAT_INPUT_VALUE_ACCESSOR");var Gd=(()=>{class t{isErrorState(A,i){return!!(A&&A.invalid&&(A.touched||i&&i.submitted))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Kd=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,i,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var QaA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],EaA=new wA("MAT_INPUT_CONFIG"),wa=(()=>{class t{_elementRef=h(ge);_platform=h(ci);ngControl=h(xs,{optional:!0,self:!0});_autofillMonitor=h(dG);_ngZone=h(Oe);_formField=h(mh,{optional:!0});_renderer=h(ui);_uid=h(An).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder=null;_errorStateTracker;_config=h(EaA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_isServer=!1;_isNativeSelect=!1;_isTextarea=!1;_isInFormField=!1;focused=!1;stateChanges=new $A;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=sr(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(Ss.required)??!1}set required(A){this._required=sr(A)}_required;get type(){return this._type}set type(A){this._type=A||"text",this._validateType(),!this._isTextarea&&Vv().has(this._type)&&(this._elementRef.nativeElement.type=this._type)}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=sr(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>Vv().has(A));constructor(){let A=h(bd,{optional:!0}),i=h(GC,{optional:!0}),n=h(Gd),o=h(QG,{optional:!0,self:!0}),a=this._elementRef.nativeElement,r=a.nodeName.toLowerCase();o?bI(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=a,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(a,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new Kd(n,this.ngControl,i,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=r==="select",this._isTextarea=r==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=a.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&pa(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type==="number"?(i.type="text",i.setSelectionRange(0,0),i.type="number"):i.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=A,A?i.setAttribute("placeholder",A):i.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){QaA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,i=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let i=A.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(i,n){i&1&&$("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),i&2&&(Bo("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),ie("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),ae("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",he]},exportAs:["matInput"],features:[It([{provide:fh,useExisting:t}]),ei]})}return t})(),Fg=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[vr,vr,_d,Fi]})}return t})();var Xi=(function(t){return t[t.State=0]="State",t[t.Transition=1]="Transition",t[t.Sequence=2]="Sequence",t[t.Group=3]="Group",t[t.Animate=4]="Animate",t[t.Keyframes=5]="Keyframes",t[t.Style=6]="Style",t[t.Trigger=7]="Trigger",t[t.Reference=8]="Reference",t[t.AnimateChild=9]="AnimateChild",t[t.AnimateRef=10]="AnimateRef",t[t.Query=11]="Query",t[t.Stagger=12]="Stagger",t})(Xi||{}),Dl="*";function EG(t,e=null){return{type:Xi.Sequence,steps:t,options:e}}function o7(t){return{type:Xi.Style,styles:t,offset:null}}var b0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},Ud=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(a=>{a.onDone(()=>{++A==o&&this._onFinish()}),a.onDestroy(()=>{++i==o&&this._onDestroy()}),a.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((a,r)=>Math.max(a,r.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,A/i.totalTime):1;i.setPosition(n)})}getPosition(){let e=this.players.reduce((A,i)=>A===null||i.totalTime>A.totalTime?i:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},wh="!";function hG(t){return new wt(3e3,!1)}function haA(){return new wt(3100,!1)}function uaA(){return new wt(3101,!1)}function faA(t){return new wt(3001,!1)}function maA(t){return new wt(3003,!1)}function paA(t){return new wt(3004,!1)}function fG(t,e){return new wt(3005,!1)}function mG(){return new wt(3006,!1)}function pG(){return new wt(3007,!1)}function DG(t,e){return new wt(3008,!1)}function wG(t){return new wt(3002,!1)}function yG(t,e,A,i,n){return new wt(3010,!1)}function vG(){return new wt(3011,!1)}function bG(){return new wt(3012,!1)}function MG(){return new wt(3200,!1)}function kG(){return new wt(3202,!1)}function SG(){return new wt(3013,!1)}function xG(t){return new wt(3014,!1)}function RG(t){return new wt(3015,!1)}function NG(t){return new wt(3016,!1)}function FG(t,e){return new wt(3404,!1)}function DaA(t){return new wt(3502,!1)}function LG(t){return new wt(3503,!1)}function _G(){return new wt(3300,!1)}function GG(t){return new wt(3504,!1)}function KG(t){return new wt(3301,!1)}function UG(t,e){return new wt(3302,!1)}function JG(t){return new wt(3303,!1)}function YG(t,e){return new wt(3400,!1)}function HG(t){return new wt(3401,!1)}function TG(t){return new wt(3402,!1)}function OG(t,e){return new wt(3505,!1)}function M0(t){switch(t.length){case 0:return new b0;case 1:return t[0];default:return new Ud(t)}}function g7(t,e,A=new Map,i=new Map){let n=[],o=[],a=-1,r=null;if(e.forEach(s=>{let g=s.get("offset"),l=g==a,C=l&&r||new Map;s.forEach((I,d)=>{let B=d,Q=I;if(d!=="offset")switch(B=t.normalizePropertyName(B,n),Q){case wh:Q=A.get(d);break;case Dl:Q=i.get(d);break;default:Q=t.normalizeStyleValue(d,B,Q,n);break}C.set(B,Q)}),l||o.push(C),r=C,a=g}),n.length)throw DaA(n);return o}function om(t,e,A,i){switch(e){case"start":t.onStart(()=>i(A&&a7(A,"start",t)));break;case"done":t.onDone(()=>i(A&&a7(A,"done",t)));break;case"destroy":t.onDestroy(()=>i(A&&a7(A,"destroy",t)));break}}function a7(t,e,A){let i=A.totalTime,n=!!A.disabled,o=am(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,i??t.totalTime,n),a=t._data;return a!=null&&(o._data=a),o}function am(t,e,A,i,n="",o=0,a){return{element:t,triggerName:e,fromState:A,toState:i,phaseName:n,totalTime:o,disabled:!!a}}function Fs(t,e,A){let i=t.get(e);return i||t.set(e,i=A),i}function l7(t){let e=t.indexOf(":"),A=t.substring(1,e),i=t.slice(e+1);return[A,i]}var waA=typeof document>"u"?null:document.documentElement;function rm(t){let e=t.parentNode||t.host||null;return e===waA?null:e}function yaA(t){return t.substring(1,6)=="ebkit"}var GI=null,uG=!1;function zG(t){GI||(GI=vaA()||{},uG=GI.style?"WebkitAppearance"in GI.style:!1);let e=!0;return GI.style&&!yaA(t)&&(e=t in GI.style,!e&&uG&&(e="Webkit"+t.charAt(0).toUpperCase()+t.slice(1)in GI.style)),e}function vaA(){return typeof document<"u"?document.body:null}function c7(t,e){for(;e;){if(e===t)return!0;e=rm(e)}return!1}function C7(t,e,A){if(A)return Array.from(t.querySelectorAll(e));let i=t.querySelector(e);return i?[i]:[]}var baA=1e3,I7="{{",MaA="}}",d7="ng-enter",sm="ng-leave",yh="ng-trigger",vh=".ng-trigger",B7="ng-animating",gm=".ng-animating";function kc(t){if(typeof t=="number")return t;let e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:r7(parseFloat(e[1]),e[2])}function r7(t,e){return e==="s"?t*baA:t}function bh(t,e,A){return t.hasOwnProperty("duration")?t:SaA(t,e,A)}var kaA=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;function SaA(t,e,A){let i,n=0,o="";if(typeof t=="string"){let a=t.match(kaA);if(a===null)return e.push(hG(t)),{duration:0,delay:0,easing:""};i=r7(parseFloat(a[1]),a[2]);let r=a[3];r!=null&&(n=r7(parseFloat(r),a[4]));let s=a[5];s&&(o=s)}else i=t;if(!A){let a=!1,r=e.length;i<0&&(e.push(haA()),a=!0),n<0&&(e.push(uaA()),a=!0),a&&e.splice(r,0,hG(t))}return{duration:i,delay:n,easing:o}}function PG(t){return t.length?t[0]instanceof Map?t:t.map(e=>new Map(Object.entries(e))):[]}function wl(t,e,A){e.forEach((i,n)=>{let o=lm(n);A&&!A.has(n)&&A.set(n,t.style[o]),t.style[o]=i})}function HC(t,e){e.forEach((A,i)=>{let n=lm(i);t.style[n]=""})}function Jd(t){return Array.isArray(t)?t.length==1?t[0]:EG(t):t}function jG(t,e,A){let i=e.params||{},n=Q7(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||A.push(faA(o))})}var s7=new RegExp(`${I7}\\s*(.+?)\\s*${MaA}`,"g");function Q7(t){let e=[];if(typeof t=="string"){let A;for(;A=s7.exec(t);)e.push(A[1]);s7.lastIndex=0}return e}function Yd(t,e,A){let i=`${t}`,n=i.replace(s7,(o,a)=>{let r=e[a];return r==null&&(A.push(maA(a)),r=""),r.toString()});return n==i?t:n}var xaA=/-+([a-z0-9])/g;function lm(t){return t.replace(xaA,(...e)=>e[1].toUpperCase())}function qG(t,e){return t===0||e===0}function VG(t,e,A){if(A.size&&e.length){let i=e[0],n=[];if(A.forEach((o,a)=>{i.has(a)||n.push(a),i.set(a,o)}),n.length)for(let o=1;oa.set(r,cm(t,r)))}}return e}function Ls(t,e,A){switch(e.type){case Xi.Trigger:return t.visitTrigger(e,A);case Xi.State:return t.visitState(e,A);case Xi.Transition:return t.visitTransition(e,A);case Xi.Sequence:return t.visitSequence(e,A);case Xi.Group:return t.visitGroup(e,A);case Xi.Animate:return t.visitAnimate(e,A);case Xi.Keyframes:return t.visitKeyframes(e,A);case Xi.Style:return t.visitStyle(e,A);case Xi.Reference:return t.visitReference(e,A);case Xi.AnimateChild:return t.visitAnimateChild(e,A);case Xi.AnimateRef:return t.visitAnimateRef(e,A);case Xi.Query:return t.visitQuery(e,A);case Xi.Stagger:return t.visitStagger(e,A);default:throw paA(e.type)}}function cm(t,e){return window.getComputedStyle(t)[e]}var N7=(()=>{class t{validateStyleProperty(A){return zG(A)}containsElement(A,i){return c7(A,i)}getParentElement(A){return rm(A)}query(A,i,n){return C7(A,i,n)}computeStyle(A,i,n){return n||""}animate(A,i,n,o,a,r=[],s){return new b0(n,o)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac})}return t})(),UI=class{static NOOP=new N7},JI=class{};var RaA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),Qm=class extends JI{normalizePropertyName(e,A){return lm(e)}normalizeStyleValue(e,A,i,n){let o="",a=i.toString().trim();if(RaA.has(A)&&i!==0&&i!=="0")if(typeof i=="number")o="px";else{let r=i.match(/^[+-]?[\d\.]+([a-z]*)$/);r&&r[1].length==0&&n.push(fG(e,i))}return a+o}};var Em="*";function NaA(t,e){let A=[];return typeof t=="string"?t.split(/\s*,\s*/).forEach(i=>FaA(i,A,e)):A.push(t),A}function FaA(t,e,A){if(t[0]==":"){let s=LaA(t,A);if(typeof s=="function"){e.push(s);return}t=s}let i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(i==null||i.length<4)return A.push(RG(t)),e;let n=i[1],o=i[2],a=i[3];e.push(WG(n,a));let r=n==Em&&a==Em;o[0]=="<"&&!r&&e.push(WG(a,n))}function LaA(t,e){switch(t){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,i)=>parseFloat(i)>parseFloat(A);case":decrement":return(A,i)=>parseFloat(i) *"}}var Cm=new Set(["true","1"]),Im=new Set(["false","0"]);function WG(t,e){let A=Cm.has(t)||Im.has(t),i=Cm.has(e)||Im.has(e);return(n,o)=>{let a=t==Em||t==n,r=e==Em||e==o;return!a&&A&&typeof n=="boolean"&&(a=n?Cm.has(t):Im.has(t)),!r&&i&&typeof o=="boolean"&&(r=o?Cm.has(e):Im.has(e)),a&&r}}var aK=":self",_aA=new RegExp(`s*${aK}s*,?`,"g");function rK(t,e,A,i){return new p7(t).build(e,A,i)}var ZG="",p7=class{_driver;constructor(e){this._driver=e}build(e,A,i){let n=new D7(A);return this._resetContextStyleTimingState(n),Ls(this,Jd(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=ZG,e.collectedStyles=new Map,e.collectedStyles.set(ZG,new Map),e.currentTime=0}visitTrigger(e,A){let i=A.queryCount=0,n=A.depCount=0,o=[],a=[];return e.name.charAt(0)=="@"&&A.errors.push(mG()),e.definitions.forEach(r=>{if(this._resetContextStyleTimingState(A),r.type==Xi.State){let s=r,g=s.name;g.toString().split(/\s*,\s*/).forEach(l=>{s.name=l,o.push(this.visitState(s,A))}),s.name=g}else if(r.type==Xi.Transition){let s=this.visitTransition(r,A);i+=s.queryCount,n+=s.depCount,a.push(s)}else A.errors.push(pG())}),{type:Xi.Trigger,name:e.name,states:o,transitions:a,queryCount:i,depCount:n,options:null}}visitState(e,A){let i=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(i.containsDynamicStyles){let o=new Set,a=n||{};i.styles.forEach(r=>{r instanceof Map&&r.forEach(s=>{Q7(s).forEach(g=>{a.hasOwnProperty(g)||o.add(g)})})}),o.size&&A.errors.push(DG(e.name,[...o.values()]))}return{type:Xi.State,name:e.name,style:i,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let i=Ls(this,Jd(e.animation),A),n=NaA(e.expr,A.errors);return{type:Xi.Transition,matchers:n,animation:i,queryCount:A.queryCount,depCount:A.depCount,options:KI(e.options)}}visitSequence(e,A){return{type:Xi.Sequence,steps:e.steps.map(i=>Ls(this,i,A)),options:KI(e.options)}}visitGroup(e,A){let i=A.currentTime,n=0,o=e.steps.map(a=>{A.currentTime=i;let r=Ls(this,a,A);return n=Math.max(n,A.currentTime),r});return A.currentTime=n,{type:Xi.Group,steps:o,options:KI(e.options)}}visitAnimate(e,A){let i=JaA(e.timings,A.errors);A.currentAnimateTimings=i;let n,o=e.styles?e.styles:o7({});if(o.type==Xi.Keyframes)n=this.visitKeyframes(o,A);else{let a=e.styles,r=!1;if(!a){r=!0;let g={};i.easing&&(g.easing=i.easing),a=o7(g)}A.currentTime+=i.duration+i.delay;let s=this.visitStyle(a,A);s.isEmptyStep=r,n=s}return A.currentAnimateTimings=null,{type:Xi.Animate,timings:i,style:n,options:null}}visitStyle(e,A){let i=this._makeStyleAst(e,A);return this._validateStyleAst(i,A),i}_makeStyleAst(e,A){let i=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let r of n)typeof r=="string"?r===Dl?i.push(r):A.errors.push(wG(r)):i.push(new Map(Object.entries(r)));let o=!1,a=null;return i.forEach(r=>{if(r instanceof Map&&(r.has("easing")&&(a=r.get("easing"),r.delete("easing")),!o)){for(let s of r.values())if(s.toString().indexOf(I7)>=0){o=!0;break}}}),{type:Xi.Style,styles:i,easing:a,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let i=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;i&&o>0&&(o-=i.duration+i.delay),e.styles.forEach(a=>{typeof a!="string"&&a.forEach((r,s)=>{let g=A.collectedStyles.get(A.currentQuerySelector),l=g.get(s),C=!0;l&&(o!=n&&o>=l.startTime&&n<=l.endTime&&(A.errors.push(yG(s,l.startTime,l.endTime,o,n)),C=!1),o=l.startTime),C&&g.set(s,{startTime:o,endTime:n}),A.options&&jG(r,A.options,A.errors)})})}visitKeyframes(e,A){let i={type:Xi.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push(vG()),i;let n=1,o=0,a=[],r=!1,s=!1,g=0,l=e.steps.map(f=>{let b=this._makeStyleAst(f,A),R=b.offset!=null?b.offset:UaA(b.styles),M=0;return R!=null&&(o++,M=b.offset=R),s=s||M<0||M>1,r=r||M0&&o{let R=I>0?b==d?1:I*b:a[b],M=R*E;A.currentTime=B+Q.delay+M,Q.duration=M,this._validateStyleAst(f,A),f.offset=R,i.styles.push(f)}),i}visitReference(e,A){return{type:Xi.Reference,animation:Ls(this,Jd(e.animation),A),options:KI(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:Xi.AnimateChild,options:KI(e.options)}}visitAnimateRef(e,A){return{type:Xi.AnimateRef,animation:this.visitReference(e.animation,A),options:KI(e.options)}}visitQuery(e,A){let i=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,a]=GaA(e.selector);A.currentQuerySelector=i.length?i+" "+o:o,Fs(A.collectedStyles,A.currentQuerySelector,new Map);let r=Ls(this,Jd(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=i,{type:Xi.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:a,animation:r,originalSelector:e.selector,options:KI(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(SG());let i=e.timings==="full"?{duration:0,delay:0,easing:"full"}:bh(e.timings,A.errors,!0);return{type:Xi.Stagger,animation:Ls(this,Jd(e.animation),A),timings:i,options:null}}};function GaA(t){let e=!!t.split(/\s*,\s*/).find(A=>A==aK);return e&&(t=t.replace(_aA,"")),t=t.replace(/@\*/g,vh).replace(/@\w+/g,A=>vh+"-"+A.slice(1)).replace(/:animating/g,gm),[t,e]}function KaA(t){return t?BA({},t):null}var D7=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function UaA(t){if(typeof t=="string")return null;let e=null;if(Array.isArray(t))t.forEach(A=>{if(A instanceof Map&&A.has("offset")){let i=A;e=parseFloat(i.get("offset")),i.delete("offset")}});else if(t instanceof Map&&t.has("offset")){let A=t;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function JaA(t,e){if(t.hasOwnProperty("duration"))return t;if(typeof t=="number"){let o=bh(t,e).duration;return E7(o,0,"")}let A=t;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=E7(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=bh(A,e);return E7(n.duration,n.delay,n.easing)}function KI(t){return t?(t=BA({},t),t.params&&(t.params=KaA(t.params))):t={},t}function E7(t,e,A){return{duration:t,delay:e,easing:A}}function F7(t,e,A,i,n,o,a=null,r=!1){return{type:1,element:t,keyframes:e,preStyleProps:A,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:a,subTimeline:r}}var kh=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let i=this._map.get(e);i||this._map.set(e,i=[]),i.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},YaA=1,HaA=":enter",TaA=new RegExp(HaA,"g"),OaA=":leave",zaA=new RegExp(OaA,"g");function sK(t,e,A,i,n,o=new Map,a=new Map,r,s,g=[]){return new w7().buildKeyframes(t,e,A,i,n,o,a,r,s,g)}var w7=class{buildKeyframes(e,A,i,n,o,a,r,s,g,l=[]){g=g||new kh;let C=new y7(e,A,g,n,o,l,[]);C.options=s;let I=s.delay?kc(s.delay):0;C.currentTimeline.delayNextStep(I),C.currentTimeline.setStyles([a],null,C.errors,s),Ls(this,i,C);let d=C.timelines.filter(B=>B.containsAnimation());if(d.length&&r.size){let B;for(let Q=d.length-1;Q>=0;Q--){let E=d[Q];if(E.element===A){B=E;break}}B&&!B.allowOnlyTimelineStyles()&&B.setStyles([r],null,C.errors,s)}return d.length?d.map(B=>B.buildKeyframes()):[F7(A,[],[],[],0,I,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let i=A.subInstructions.get(A.element);if(i){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,a=this._visitSubInstructions(i,n,n.options);o!=a&&A.transformIntoNewTimeline(a)}A.previousNode=e}visitAnimateRef(e,A){let i=A.createSubContext(e.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,i),this.visitReference(e.animation,i),A.transformIntoNewTimeline(i.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,i){for(let n of e){let o=n?.delay;if(o){let a=typeof o=="number"?o:kc(Yd(o,n?.params??{},A.errors));i.delayNextStep(a)}}}_visitSubInstructions(e,A,i){let o=A.currentTimeline.currentTime,a=i.duration!=null?kc(i.duration):null,r=i.delay!=null?kc(i.delay):null;return a!==0&&e.forEach(s=>{let g=A.appendInstructionToTimeline(s,a,r);o=Math.max(o,g.duration+g.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),Ls(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let i=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==Xi.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=hm);let a=kc(o.delay);n.delayNextStep(a)}e.steps.length&&(e.steps.forEach(a=>Ls(this,a,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let i=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?kc(e.options.delay):0;e.steps.forEach(a=>{let r=A.createSubContext(e.options);o&&r.delayNextStep(o),Ls(this,a,r),n=Math.max(n,r.currentTimeline.currentTime),i.push(r.currentTimeline)}),i.forEach(a=>A.currentTimeline.mergeTimelineCollectedStyles(a)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let i=e.strValue,n=A.params?Yd(i,A.params,A.errors):i;return bh(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let i=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;i.delay&&(A.incrementTime(i.delay),n.snapshotCurrentStyles());let o=e.style;o.type==Xi.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(i.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let i=A.currentTimeline,n=A.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?i.applyEmptyStep(o):i.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let i=A.currentAnimateTimings,n=A.currentTimeline.duration,o=i.duration,r=A.createSubContext().currentTimeline;r.easing=i.easing,e.styles.forEach(s=>{let g=s.offset||0;r.forwardTime(g*o),r.setStyles(s.styles,s.easing,A.errors,A.options),r.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(r),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let i=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?kc(n.delay):0;o&&(A.previousNode.type===Xi.Style||i==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=hm);let a=i,r=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=r.length;let s=null;r.forEach((g,l)=>{A.currentQueryIndex=l;let C=A.createSubContext(e.options,g);o&&C.delayNextStep(o),g===A.element&&(s=C.currentTimeline),Ls(this,e.animation,C),C.currentTimeline.applyStylesToKeyframe();let I=C.currentTimeline.currentTime;a=Math.max(a,I)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(a),s&&(A.currentTimeline.mergeTimelineCollectedStyles(s),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let i=A.parentContext,n=A.currentTimeline,o=e.timings,a=Math.abs(o.duration),r=a*(A.currentQueryTotal-1),s=a*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":s=r-s;break;case"full":s=i.currentStaggerTime;break}let l=A.currentTimeline;s&&l.delayNextStep(s);let C=l.currentTime;Ls(this,e.animation,A),A.previousNode=e,i.currentStaggerTime=n.currentTime-C+(n.startTime-i.currentTimeline.startTime)}},hm={},y7=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=hm;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,i,n,o,a,r,s){this._driver=e,this.element=A,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=a,this.timelines=r,this.currentTimeline=s||new um(this._driver,A,0),r.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let i=e,n=this.options;i.duration!=null&&(n.duration=kc(i.duration)),i.delay!=null&&(n.delay=kc(i.delay));let o=i.params;if(o){let a=n.params;a||(a=this.options.params={}),Object.keys(o).forEach(r=>{(!A||!a.hasOwnProperty(r))&&(a[r]=Yd(o[r],a,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let i=e.params={};Object.keys(A).forEach(n=>{i[n]=A[n]})}}return e}createSubContext(e=null,A,i){let n=A||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=hm,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,i){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(i??0)+e.delay,easing:""},o=new v7(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,i,n,o,a){let r=[];if(n&&r.push(this.element),e.length>0){e=e.replace(TaA,"."+this._enterClassName),e=e.replace(zaA,"."+this._leaveClassName);let s=i!=1,g=this._driver.query(this.element,e,s);i!==0&&(g=i<0?g.slice(g.length+i,g.length):g.slice(0,i)),r.push(...g)}return!o&&r.length==0&&a.push(xG(A)),r}},um=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,i,n){this._driver=e,this.element=A,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new t(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=YaA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,i]of this._globalTimelineStyles)this._backFill.set(A,i||Dl),this._currentKeyframe.set(A,Dl);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,i,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},a=PaA(e,this._globalTimelineStyles);for(let[r,s]of a){let g=Yd(s,o,i);this._pendingStyles.set(r,g),this._localTimelineStyles.has(r)||this._backFill.set(r,this._globalTimelineStyles.get(r)??Dl),this._updateStyle(r,g)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,i)=>{let n=this._styleSummary.get(i);(!n||A.time>n.time)&&this._updateStyle(i,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((r,s)=>{let g=new Map([...this._backFill,...r]);g.forEach((l,C)=>{l===wh?e.add(C):l===Dl&&A.add(C)}),i||g.set("offset",s/this.duration),n.push(g)});let o=[...e.values()],a=[...A.values()];if(i){let r=n[0],s=new Map(r);r.set("offset",0),s.set("offset",1),n=[r,s]}return F7(this.element,n,o,a,this.duration,this.startTime,this.easing,!1)}},v7=class extends um{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,i,n,o,a,r=!1){super(e,A,a.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=r,this.timings={duration:a.duration,delay:a.delay,easing:a.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],a=i+A,r=A/a,s=new Map(e[0]);s.set("offset",0),o.push(s);let g=new Map(e[0]);g.set("offset",XG(r)),o.push(g);let l=e.length-1;for(let C=1;C<=l;C++){let I=new Map(e[C]),d=I.get("offset"),B=A+d*i;I.set("offset",XG(B/a)),o.push(I)}i=a,A=0,n="",e=o}return F7(this.element,e,this.preStyleProps,this.postStyleProps,i,A,n,!0)}};function XG(t,e=3){let A=Math.pow(10,e-1);return Math.round(t*A)/A}function PaA(t,e){let A=new Map,i;return t.forEach(n=>{if(n==="*"){i??=e.keys();for(let o of i)A.set(o,Dl)}else for(let[o,a]of n)A.set(o,a)}),A}function $G(t,e,A,i,n,o,a,r,s,g,l,C,I){return{type:0,element:t,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:i,toStyles:a,timelines:r,queriedElements:s,preStyleProps:g,postStyleProps:l,totalTime:C,errors:I}}var h7={},fm=class{_triggerName;ast;_stateStyles;constructor(e,A,i){this._triggerName=e,this.ast=A,this._stateStyles=i}match(e,A,i,n){return jaA(this.ast.matchers,e,A,i,n)}buildStyles(e,A,i){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,i):new Map}build(e,A,i,n,o,a,r,s,g,l){let C=[],I=this.ast.options&&this.ast.options.params||h7,d=r&&r.params||h7,B=this.buildStyles(i,d,C),Q=s&&s.params||h7,E=this.buildStyles(n,Q,C),f=new Set,b=new Map,R=new Map,M=n==="void",v={params:gK(Q,I),delay:this.ast.options?.delay},F=l?[]:sK(e,A,this.ast.animation,o,a,B,E,v,g,C),G=0;return F.forEach(U=>{G=Math.max(U.duration+U.delay,G)}),C.length?$G(A,this._triggerName,i,n,M,B,E,[],[],b,R,G,C):(F.forEach(U=>{let Y=U.element,j=Fs(b,Y,new Set);U.preStyleProps.forEach(z=>j.add(z));let AA=Fs(R,Y,new Set);U.postStyleProps.forEach(z=>AA.add(z)),Y!==A&&f.add(Y)}),$G(A,this._triggerName,i,n,M,B,E,F,[...f.values()],b,R,G))}};function jaA(t,e,A,i,n){return t.some(o=>o(e,A,i,n))}function gK(t,e){let A=BA({},e);return Object.entries(t).forEach(([i,n])=>{n!=null&&(A[i]=n)}),A}var b7=class{styles;defaultParams;normalizer;constructor(e,A,i){this.styles=e,this.defaultParams=A,this.normalizer=i}buildStyles(e,A){let i=new Map,n=gK(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((a,r)=>{a&&(a=Yd(a,n,A));let s=this.normalizer.normalizePropertyName(r,A);a=this.normalizer.normalizeStyleValue(r,s,a,A),i.set(r,a)})}),i}};function qaA(t,e,A){return new M7(t,e,A)}var M7=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,i){this.name=e,this.ast=A,this._normalizer=i,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new b7(n.style,o,i))}),AK(this.states,"true","1"),AK(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new fm(e,n,this.states))}),this.fallbackTransition=VaA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,i,n){return this.transitionFactories.find(a=>a.match(e,A,i,n))||null}matchStyles(e,A,i){return this.fallbackTransition.buildStyles(e,A,i)}};function VaA(t,e,A){let i=[(a,r)=>!0],n={type:Xi.Sequence,steps:[],options:null},o={type:Xi.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new fm(t,o,e)}function AK(t,e,A){t.has(e)?t.has(A)||t.set(A,t.get(e)):t.has(A)&&t.set(e,t.get(A))}var WaA=new kh,k7=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,i){this.bodyNode=e,this._driver=A,this._normalizer=i}register(e,A){let i=[],n=[],o=rK(this._driver,A,i,n);if(i.length)throw LG(i);this._animations.set(e,o)}_buildPlayer(e,A,i){let n=e.element,o=g7(this._normalizer,e.keyframes,A,i);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,i={}){let n=[],o=this._animations.get(e),a,r=new Map;if(o?(a=sK(this._driver,A,o,d7,sm,new Map,new Map,i,WaA,n),a.forEach(l=>{let C=Fs(r,l.element,new Map);l.postStyleProps.forEach(I=>C.set(I,null))})):(n.push(_G()),a=[]),n.length)throw GG(n);r.forEach((l,C)=>{l.forEach((I,d)=>{l.set(d,this._driver.computeStyle(C,d,Dl))})});let s=a.map(l=>{let C=r.get(l.element);return this._buildPlayer(l,new Map,C)}),g=M0(s);return this._playersById.set(e,g),g.onDestroy(()=>this.destroy(e)),this.players.push(g),g}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let i=this.players.indexOf(A);i>=0&&this.players.splice(i,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw KG(e);return A}listen(e,A,i,n){let o=am(A,"","","");return om(this._getPlayer(e),i,o,n),()=>{}}command(e,A,i,n){if(i=="register"){this.register(e,n[0]);return}if(i=="create"){let a=n[0]||{};this.create(e,A,a);return}let o=this._getPlayer(e);switch(i){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},eK="ng-animate-queued",ZaA=".ng-animate-queued",u7="ng-animate-disabled",XaA=".ng-animate-disabled",$aA="ng-star-inserted",ArA=".ng-star-inserted",erA=[],lK={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},trA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},yl="__ng_removed",Sh=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let i=e&&e.hasOwnProperty("value"),n=i?e.value:e;if(this.value=nrA(n),i){let o=e,{value:a}=o,r=WF(o,["value"]);this.options=r}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let i=this.options.params;Object.keys(A).forEach(n=>{i[n]==null&&(i[n]=A[n])})}}},Mh="void",f7=new Sh(Mh),S7=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,i){this.id=e,this.hostElement=A,this._engine=i,this._hostClassName="ng-tns-"+e,Lg(A,this._hostClassName)}listen(e,A,i,n){if(!this._triggers.has(A))throw UG(i,A);if(i==null||i.length==0)throw JG(A);if(!orA(i))throw YG(i,A);let o=Fs(this._elementListeners,e,[]),a={name:A,phase:i,callback:n};o.push(a);let r=Fs(this._engine.statesByElement,e,new Map);return r.has(A)||(Lg(e,yh),Lg(e,yh+"-"+A),r.set(A,f7)),()=>{this._engine.afterFlush(()=>{let s=o.indexOf(a);s>=0&&o.splice(s,1),this._triggers.has(A)||r.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw HG(e);return A}trigger(e,A,i,n=!0){let o=this._getTrigger(A),a=new xh(this.id,A,e),r=this._engine.statesByElement.get(e);r||(Lg(e,yh),Lg(e,yh+"-"+A),this._engine.statesByElement.set(e,r=new Map));let s=r.get(A),g=new Sh(i,this.id);if(!(i&&i.hasOwnProperty("value"))&&s&&g.absorbOptions(s.options),r.set(A,g),s||(s=f7),!(g.value===Mh)&&s.value===g.value){if(!srA(s.params,g.params)){let Q=[],E=o.matchStyles(s.value,s.params,Q),f=o.matchStyles(g.value,g.params,Q);Q.length?this._engine.reportError(Q):this._engine.afterFlush(()=>{HC(e,E),wl(e,f)})}return}let I=Fs(this._engine.playersByElement,e,[]);I.forEach(Q=>{Q.namespaceId==this.id&&Q.triggerName==A&&Q.queued&&Q.destroy()});let d=o.matchTransition(s.value,g.value,e,g.params),B=!1;if(!d){if(!n)return;d=o.fallbackTransition,B=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:d,fromState:s,toState:g,player:a,isFallbackTransition:B}),B||(Lg(e,eK),a.onStart(()=>{Hd(e,eK)})),a.onDone(()=>{let Q=this.players.indexOf(a);Q>=0&&this.players.splice(Q,1);let E=this._engine.playersByElement.get(e);if(E){let f=E.indexOf(a);f>=0&&E.splice(f,1)}}),this.players.push(a),I.push(a),a}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,i)=>{this._elementListeners.set(i,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(i=>i.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let i=this._engine.driver.query(e,vh,!0);i.forEach(n=>{if(n[yl])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(a=>a.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,i,n){let o=this._engine.statesByElement.get(e),a=new Map;if(o){let r=[];if(o.forEach((s,g)=>{if(a.set(g,s.value),this._triggers.has(g)){let l=this.trigger(e,g,Mh,n);l&&r.push(l)}}),r.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,a),i&&M0(r).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(A&&i){let n=new Set;A.forEach(o=>{let a=o.name;if(n.has(a))return;n.add(a);let s=this._triggers.get(a).fallbackTransition,g=i.get(a)||f7,l=new Sh(Mh),C=new xh(this.id,a,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:a,transition:s,fromState:g,toState:l,player:C,isFallbackTransition:!0})})}}removeNode(e,A){let i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let a=e;for(;a=a.parentNode;)if(i.statesByElement.get(a)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)i.markElementAsRemoved(this.id,e,!1,A);else{let o=e[yl];(!o||o===lK)&&(i.afterFlush(()=>this.clearElementCache(e)),i.destroyInnerAnimations(e),i._onRemovalComplete(e,A))}}insertNode(e,A){Lg(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,a=this._elementListeners.get(o);a&&a.forEach(r=>{if(r.name==i.triggerName){let s=am(o,i.triggerName,i.fromState.value,i.toState.value);s._data=e,om(i.player,r.phase,s,r.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(i)}),this._queue=[],A.sort((i,n)=>{let o=i.transition.ast.depCount,a=n.transition.ast.depCount;return o==0||a==0?o-a:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},x7=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,i){this.bodyNode=e,this.driver=A,this._normalizer=i}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(i=>{i.queued&&e.push(i)})}),e}createNamespace(e,A){let i=new S7(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(i,A):(this.newHostElements.set(A,i),this.collectEnterElement(A)),this._namespaceLookup[e]=i}_balanceNamespaceList(e,A){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let a=!1,r=this.driver.getParentElement(A);for(;r;){let s=n.get(r);if(s){let g=i.indexOf(s);i.splice(g+1,0,e),a=!0;break}r=this.driver.getParentElement(r)}a||i.unshift(e)}else i.push(e);return n.set(A,e),e}register(e,A){let i=this._namespaceLookup[e];return i||(i=this.createNamespace(e,A)),i}registerTrigger(e,A,i){let n=this._namespaceLookup[e];n&&n.register(A,i)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(e);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,i=this.statesByElement.get(e);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,i,n){if(dm(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,i,n),!0}return!1}insertNode(e,A,i,n){if(!dm(A))return;let o=A[yl];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let a=this.collectedLeaveElements.indexOf(A);a>=0&&this.collectedLeaveElements.splice(a,1)}if(e){let a=this._fetchNamespace(e);a&&a.insertNode(A,i)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Lg(e,u7)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Hd(e,u7))}removeNode(e,A,i){if(dm(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,i):this.markElementAsRemoved(e,A,!1,i);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,i)}else this._onRemovalComplete(A,i)}markElementAsRemoved(e,A,i,n,o){this.collectedLeaveElements.push(A),A[yl]={namespaceId:e,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,i,n,o){return dm(A)?this._fetchNamespace(e).listen(A,i,n,o):()=>{}}_buildInstruction(e,A,i,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,i,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,vh,!0);A.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,gm,!0),A.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return M0(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[yl];if(A&&A.setForRemoval){if(e[yl]=lK,A.namespaceId){this.destroyInnerAnimations(e);let i=this._fetchNamespace(A.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(u7)&&this.markElementAsDisabled(e,!1),this.driver.query(e,XaA,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;ii()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],A.length?M0(A).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(e){throw TG(e)}_flushAnimations(e,A){let i=new kh,n=[],o=new Map,a=[],r=new Map,s=new Map,g=new Map,l=new Set;this.disabledNodes.forEach(eA=>{l.add(eA);let dA=this.driver.query(eA,ZaA,!0);for(let iA=0;iA{let iA=d7+Q++;B.set(dA,iA),eA.forEach(aA=>Lg(aA,iA))});let E=[],f=new Set,b=new Set;for(let eA=0;eAf.add(aA)):b.add(dA))}let R=new Map,M=nK(I,Array.from(f));M.forEach((eA,dA)=>{let iA=sm+Q++;R.set(dA,iA),eA.forEach(aA=>Lg(aA,iA))}),e.push(()=>{d.forEach((eA,dA)=>{let iA=B.get(dA);eA.forEach(aA=>Hd(aA,iA))}),M.forEach((eA,dA)=>{let iA=R.get(dA);eA.forEach(aA=>Hd(aA,iA))}),E.forEach(eA=>{this.processLeaveNode(eA)})});let v=[],F=[];for(let eA=this._namespaceList.length-1;eA>=0;eA--)this._namespaceList[eA].drainQueuedTransitions(A).forEach(iA=>{let aA=iA.player,hA=iA.element;if(v.push(aA),this.collectedEnterElements.length){let Ke=hA[yl];if(Ke&&Ke.setForMove){if(Ke.previousTriggersValues&&Ke.previousTriggersValues.has(iA.triggerName)){let HA=Ke.previousTriggersValues.get(iA.triggerName),uA=this.statesByElement.get(iA.element);if(uA&&uA.has(iA.triggerName)){let XA=uA.get(iA.triggerName);XA.value=HA,uA.set(iA.triggerName,XA)}}aA.destroy();return}}let JA=!C||!this.driver.containsElement(C,hA),ee=R.get(hA),UA=B.get(hA),mA=this._buildInstruction(iA,i,UA,ee,JA);if(mA.errors&&mA.errors.length){F.push(mA);return}if(JA){aA.onStart(()=>HC(hA,mA.fromStyles)),aA.onDestroy(()=>wl(hA,mA.toStyles)),n.push(aA);return}if(iA.isFallbackTransition){aA.onStart(()=>HC(hA,mA.fromStyles)),aA.onDestroy(()=>wl(hA,mA.toStyles)),n.push(aA);return}let KA=[];mA.timelines.forEach(Ke=>{Ke.stretchStartingKeyframe=!0,this.disabledNodes.has(Ke.element)||KA.push(Ke)}),mA.timelines=KA,i.append(hA,mA.timelines);let ze={instruction:mA,player:aA,element:hA};a.push(ze),mA.queriedElements.forEach(Ke=>Fs(r,Ke,[]).push(aA)),mA.preStyleProps.forEach((Ke,HA)=>{if(Ke.size){let uA=s.get(HA);uA||s.set(HA,uA=new Set),Ke.forEach((XA,EA)=>uA.add(EA))}}),mA.postStyleProps.forEach((Ke,HA)=>{let uA=g.get(HA);uA||g.set(HA,uA=new Set),Ke.forEach((XA,EA)=>uA.add(EA))})});if(F.length){let eA=[];F.forEach(dA=>{eA.push(OG(dA.triggerName,dA.errors))}),v.forEach(dA=>dA.destroy()),this.reportError(eA)}let G=new Map,U=new Map;a.forEach(eA=>{let dA=eA.element;i.has(dA)&&(U.set(dA,dA),this._beforeAnimationBuild(eA.player.namespaceId,eA.instruction,G))}),n.forEach(eA=>{let dA=eA.element;this._getPreviousPlayers(dA,!1,eA.namespaceId,eA.triggerName,null).forEach(aA=>{Fs(G,dA,[]).push(aA),aA.destroy()})});let Y=E.filter(eA=>oK(eA,s,g)),j=new Map;iK(j,this.driver,b,g,Dl).forEach(eA=>{oK(eA,s,g)&&Y.push(eA)});let z=new Map;d.forEach((eA,dA)=>{iK(z,this.driver,new Set(eA),s,wh)}),Y.forEach(eA=>{let dA=j.get(eA),iA=z.get(eA);j.set(eA,new Map([...dA?.entries()??[],...iA?.entries()??[]]))});let yA=[],P=[],nA={};a.forEach(eA=>{let{element:dA,player:iA,instruction:aA}=eA;if(i.has(dA)){if(l.has(dA)){iA.onDestroy(()=>wl(dA,aA.toStyles)),iA.disabled=!0,iA.overrideTotalTime(aA.totalTime),n.push(iA);return}let hA=nA;if(U.size>1){let ee=dA,UA=[];for(;ee=ee.parentNode;){let mA=U.get(ee);if(mA){hA=mA;break}UA.push(ee)}UA.forEach(mA=>U.set(mA,hA))}let JA=this._buildAnimation(iA.namespaceId,aA,G,o,z,j);if(iA.setRealPlayer(JA),hA===nA)yA.push(iA);else{let ee=this.playersByElement.get(hA);ee&&ee.length&&(iA.parentPlayer=M0(ee)),n.push(iA)}}else HC(dA,aA.fromStyles),iA.onDestroy(()=>wl(dA,aA.toStyles)),P.push(iA),l.has(dA)&&n.push(iA)}),P.forEach(eA=>{let dA=o.get(eA.element);if(dA&&dA.length){let iA=M0(dA);eA.setRealPlayer(iA)}}),n.forEach(eA=>{eA.parentPlayer?eA.syncPlayerEvents(eA.parentPlayer):eA.destroy()});for(let eA=0;eA!JA.destroyed);hA.length?arA(this,dA,hA):this.processLeaveNode(dA)}return E.length=0,yA.forEach(eA=>{this.players.push(eA),eA.onDone(()=>{eA.destroy();let dA=this.players.indexOf(eA);this.players.splice(dA,1)}),eA.play()}),yA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,i,n,o){let a=[];if(A){let r=this.playersByQueriedElement.get(e);r&&(a=r)}else{let r=this.playersByElement.get(e);if(r){let s=!o||o==Mh;r.forEach(g=>{g.queued||!s&&g.triggerName!=n||a.push(g)})}}return(i||n)&&(a=a.filter(r=>!(i&&i!=r.namespaceId||n&&n!=r.triggerName))),a}_beforeAnimationBuild(e,A,i){let n=A.triggerName,o=A.element,a=A.isRemovalTransition?void 0:e,r=A.isRemovalTransition?void 0:n;for(let s of A.timelines){let g=s.element,l=g!==o,C=Fs(i,g,[]);this._getPreviousPlayers(g,l,a,r,A.toState).forEach(d=>{let B=d.getRealPlayer();B.beforeDestroy&&B.beforeDestroy(),d.destroy(),C.push(d)})}HC(o,A.fromStyles)}_buildAnimation(e,A,i,n,o,a){let r=A.triggerName,s=A.element,g=[],l=new Set,C=new Set,I=A.timelines.map(B=>{let Q=B.element;l.add(Q);let E=Q[yl];if(E&&E.removedBeforeQueried)return new b0(B.duration,B.delay);let f=Q!==s,b=rrA((i.get(Q)||erA).map(G=>G.getRealPlayer())).filter(G=>{let U=G;return U.element?U.element===Q:!1}),R=o.get(Q),M=a.get(Q),v=g7(this._normalizer,B.keyframes,R,M),F=this._buildPlayer(B,v,b);if(B.subTimeline&&n&&C.add(Q),f){let G=new xh(e,r,Q);G.setRealPlayer(F),g.push(G)}return F});g.forEach(B=>{Fs(this.playersByQueriedElement,B.element,[]).push(B),B.onDone(()=>irA(this.playersByQueriedElement,B.element,B))}),l.forEach(B=>Lg(B,B7));let d=M0(I);return d.onDestroy(()=>{l.forEach(B=>Hd(B,B7)),wl(s,A.toStyles)}),C.forEach(B=>{Fs(n,B,[]).push(d)}),d}_buildPlayer(e,A,i){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,i):new b0(e.duration,e.delay)}},xh=class{namespaceId;triggerName;element;_player=new b0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,i){this.namespaceId=e,this.triggerName=A,this.element=i}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,i)=>{A.forEach(n=>om(e,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){Fs(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function irA(t,e,A){let i=t.get(e);if(i){if(i.length){let n=i.indexOf(A);i.splice(n,1)}i.length==0&&t.delete(e)}return i}function nrA(t){return t??null}function dm(t){return t&&t.nodeType===1}function orA(t){return t=="start"||t=="done"}function tK(t,e){let A=t.style.display;return t.style.display=e??"none",A}function iK(t,e,A,i,n){let o=[];A.forEach(s=>o.push(tK(s)));let a=[];i.forEach((s,g)=>{let l=new Map;s.forEach(C=>{let I=e.computeStyle(g,C,n);l.set(C,I),(!I||I.length==0)&&(g[yl]=trA,a.push(g))}),t.set(g,l)});let r=0;return A.forEach(s=>tK(s,o[r++])),a}function nK(t,e){let A=new Map;if(t.forEach(r=>A.set(r,[])),e.length==0)return A;let i=1,n=new Set(e),o=new Map;function a(r){if(!r)return i;let s=o.get(r);if(s)return s;let g=r.parentNode;return A.has(g)?s=g:n.has(g)?s=i:s=a(g),o.set(r,s),s}return e.forEach(r=>{let s=a(r);s!==i&&A.get(s).push(r)}),A}function Lg(t,e){t.classList?.add(e)}function Hd(t,e){t.classList?.remove(e)}function arA(t,e,A){M0(A).onDone(()=>t.processLeaveNode(e))}function rrA(t){let e=[];return cK(t,e),e}function cK(t,e){for(let A=0;An.add(o)):e.set(t,i),A.delete(t),!0}var Td=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,i){this._driver=A,this._normalizer=i,this._transitionEngine=new x7(e.body,A,i),this._timelineEngine=new k7(e.body,A,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,i,n,o){let a=e+"-"+n,r=this._triggerCache[a];if(!r){let s=[],g=[],l=rK(this._driver,o,s,g);if(s.length)throw FG(n,s);r=qaA(n,l,this._normalizer),this._triggerCache[a]=r}this._transitionEngine.registerTrigger(A,n,r)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,i,n){this._transitionEngine.insertNode(e,A,i,n)}onRemove(e,A,i){this._transitionEngine.removeNode(e,A,i)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,i,n){if(i.charAt(0)=="@"){let[o,a]=l7(i),r=n;this._timelineEngine.command(o,A,a,r)}else this._transitionEngine.trigger(e,A,i,n)}listen(e,A,i,n,o){if(i.charAt(0)=="@"){let[a,r]=l7(i);return this._timelineEngine.listen(a,A,r,o)}return this._transitionEngine.listen(e,A,i,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function grA(t,e){let A=null,i=null;return Array.isArray(e)&&e.length?(A=m7(e[0]),e.length>1&&(i=m7(e[e.length-1]))):e instanceof Map&&(A=m7(e)),A||i?new lrA(t,A,i):null}var lrA=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,i,n){this._element=A,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(A);o||t.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&wl(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(wl(this._element,this._initialStyles),this._endStyles&&(wl(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(HC(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(HC(this._element,this._endStyles),this._endStyles=null),wl(this._element,this._initialStyles),this._state=3)}}return t})();function m7(t){let e=null;return t.forEach((A,i)=>{crA(i)&&(e=e||new Map,e.set(i,A))}),e}function crA(t){return t==="display"||t==="position"}var mm=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer=null;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,i,n){this.element=e,this.keyframes=A,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer()&&this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return this.domPlayer;this._initialized=!0;let e=this.keyframes,A=this._triggerWebAnimation(this.element,e,this.options);if(!A)return this._onFinish(),null;this.domPlayer=A,this._finalKeyframe=e.length?e[e.length-1]:new Map;let i=()=>this._onFinish();return A.addEventListener("finish",i),this.onDestroy(()=>{A.removeEventListener("finish",i)}),A}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer?.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(i=>{A.push(Object.fromEntries(i))}),A}_triggerWebAnimation(e,A,i){let n=this._convertKeyframesToObject(A);try{return e.animate(n,i)}catch(o){return null}}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){let e=this._buildPlayer();e&&(this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),e.play())}pause(){this.init(),this.domPlayer?.pause()}finish(){this.init(),this.domPlayer&&(this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish())}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer?.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer||this.init(),this.domPlayer&&(this.domPlayer.currentTime=e*this.time)}getPosition(){return this.domPlayer?+(this.domPlayer.currentTime??0)/this.time:this._initialized?1:0}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!=="offset"&&e.set(n,this._finished?i:cm(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},pm=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return c7(e,A)}getParentElement(e){return rm(e)}query(e,A,i){return C7(e,A,i)}computeStyle(e,A,i){return cm(e,A)}animate(e,A,i,n,o,a=[]){let r=n==0?"both":"forwards",s={duration:i,delay:n,fill:r};o&&(s.easing=o);let g=new Map,l=a.filter(d=>d instanceof mm);qG(i,n)&&l.forEach(d=>{d.currentSnapshot.forEach((B,Q)=>g.set(Q,B))});let C=PG(A).map(d=>new Map(d));C=VG(e,C,g);let I=grA(e,C);return new mm(e,C,s,I)}};var Bm="@",CK="@.disabled",Dm=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,i,n){this.namespaceId=e,this.delegate=A,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,i,n=!0){this.delegate.insertBefore(e,A,i),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,i,n){if(n){this.delegate.removeChild(e,A,i,n);return}this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,i,n){this.delegate.setAttribute(e,A,i,n)}removeAttribute(e,A,i){this.delegate.removeAttribute(e,A,i)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,i,n){this.delegate.setStyle(e,A,i,n)}removeStyle(e,A,i){this.delegate.removeStyle(e,A,i)}setProperty(e,A,i){A.charAt(0)==Bm&&A==CK?this.disableAnimations(e,!!i):this.delegate.setProperty(e,A,i)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,i,n){return this.delegate.listen(e,A,i,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},R7=class extends Dm{factory;constructor(e,A,i,n,o){super(A,i,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,i){A.charAt(0)==Bm?A.charAt(1)=="."&&A==CK?(i=i===void 0?!0:!!i,this.disableAnimations(e,i)):this.engine.process(this.namespaceId,e,A.slice(1),i):this.delegate.setProperty(e,A,i)}listen(e,A,i,n){if(A.charAt(0)==Bm){let o=CrA(e),a=A.slice(1),r="";return a.charAt(0)!=Bm&&([a,r]=IrA(a)),this.engine.listen(this.namespaceId,o,a,r,s=>{let g=s._data||-1;this.factory.scheduleListenerCallback(g,i,s)})}return this.delegate.listen(e,A,i,n)}};function CrA(t){switch(t){case"body":return document.body;case"document":return document;case"window":return window;default:return t}}function IrA(t){let e=t.indexOf("."),A=t.substring(0,e),i=t.slice(e+1);return[A,i]}var wm=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,i){this.delegate=e,this.engine=A,this._zone=i,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let g=this._rendererCache,l=g.get(n);if(!l){let C=()=>g.delete(n);l=new Dm("",n,this.engine,C),g.set(n,l)}return l}let o=A.id,a=A.id+"-"+this._currentId;this._currentId++,this.engine.register(a,e);let r=g=>{Array.isArray(g)?g.forEach(r):this.engine.registerTrigger(o,a,e,g.name,g)};return A.data.animation.forEach(r),new R7(this,a,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,i){if(e>=0&&eA(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[a,r]=o;a(r)}),this._animationCallbacksBuffer=[]})}),n.push([A,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var BrA=(()=>{class t extends Td{constructor(A,i,n){super(A,i,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(i){return new(i||t)(Do(Zt),Do(UI),Do(JI))};static \u0275prov=TA({token:t,factory:t.\u0275fac})}return t})();function QrA(){return new Qm}function ErA(){return new wm(h(SL),h(Td),h(Oe))}var IK=[{provide:JI,useFactory:QrA},{provide:Td,useClass:BrA},{provide:Dr,useFactory:ErA}],DHA=[{provide:UI,useClass:N7},{provide:vI,useValue:"NoopAnimations"},...IK],hrA=[{provide:UI,useFactory:()=>new pm},{provide:vI,useFactory:()=>"BrowserAnimations"},...IK];function dK(){return Ef("NgEagerAnimations"),[...hrA]}function br(t){t||(t=h(Wa));let e=new Ti(A=>{if(t.destroyed){A.next();return}return t.onDestroy(A.next.bind(A))});return A=>A.pipe(Bt(e))}var L7=class{source;destroyed=!1;destroyRef=h(Wa);constructor(e){this.source=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(e){if(this.destroyed)throw new wt(953,!1);let A=this.source.pipe(br(this.destroyRef)).subscribe({next:i=>e(i)});return{unsubscribe:()=>A.unsubscribe()}}};function hn(t,e){return new L7(t)}function Tn(t,e){let A=e?.injector??h(ut),i=new El(1),n=pa(()=>{let o;try{o=t()}catch(a){Zo(()=>i.error(a));return}Zo(()=>i.next(o))},{injector:A,manualCleanup:!0});return A.get(Wa).onDestroy(()=>{n.destroy(),i.complete()}),i.asObservable()}function Is(t,e){let i=!e?.manualCleanup?e?.injector?.get(Wa)??h(Wa):null,n=urA(e?.equal),o;e?.requireSync?o=jA({kind:0},{equal:n}):o=jA({kind:1,value:e?.initialValue},{equal:n});let a,r=t.subscribe({next:s=>o.set({kind:1,value:s}),error:s=>{o.set({kind:2,error:s}),a?.()},complete:()=>{a?.()}});if(e?.requireSync&&o().kind===0)throw new wt(601,!1);return a=i?.onDestroy(r.unsubscribe.bind(r)),_e(()=>{let s=o();switch(s.kind){case 1:return s.value;case 2:throw s.error;case 0:throw new wt(601,!1)}},{equal:e?.equal})}function urA(t=Object.is){return(e,A)=>e.kind===1&&A.kind===1&&t(e.value,A.value)}function ym(t){return mL(Ve(BA({},t),{loader:void 0,stream:e=>{let A,i=()=>A?.unsubscribe();e.abortSignal.addEventListener("abort",i);let n=jA({value:void 0}),o,a=new Promise(g=>o=g);function r(g){n.set(g),o?.(n),o=void 0}let s=t.stream;if(s===void 0)throw new wt(990,!1);return A=s(e).subscribe({next:g=>r({value:g}),error:g=>{r({error:pL(g)}),e.abortSignal.removeEventListener("abort",i)},complete:()=>{o&&r({error:new wt(991,!1)}),e.abortSignal.removeEventListener("abort",i)}}),a}}))}function U7(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var TI=U7();function mK(t){TI=t}var YI={exec:()=>null};function bn(t,e=""){let A=typeof t=="string"?t:t.source,i={replace:(n,o)=>{let a=typeof o=="string"?o:o.source;return a=a.replace(ds.caret,"$1"),A=A.replace(n,a),i},getRegex:()=>new RegExp(A,e)};return i}var frA=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}>`)},mrA=/^(?:[ \t]*(?:\n|$))+/,prA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,DrA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Lh=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,wrA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,J7=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,pK=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,DK=bn(pK).replace(/bull/g,J7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),yrA=bn(pK).replace(/bull/g,J7).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Y7=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,vrA=/^[^\n]+/,H7=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,brA=bn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",H7).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),MrA=bn(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,J7).getRegex(),km="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",T7=/|$))/,krA=bn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",T7).replace("tag",km).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),wK=bn(Y7).replace("hr",Lh).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",km).getRegex(),SrA=bn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",wK).getRegex(),O7={blockquote:SrA,code:prA,def:brA,fences:DrA,heading:wrA,hr:Lh,html:krA,lheading:DK,list:MrA,newline:mrA,paragraph:wK,table:YI,text:vrA},BK=bn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Lh).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",km).getRegex(),xrA=Ve(BA({},O7),{lheading:yrA,table:BK,paragraph:bn(Y7).replace("hr",Lh).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",BK).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",km).getRegex()}),RrA=Ve(BA({},O7),{html:bn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",T7).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:YI,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:bn(Y7).replace("hr",Lh).replace("heading",` *#{1,6} *[^ ]`).replace("lheading",DK).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),NrA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,FrA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,yK=/^( {2,}|\\)\n(?!\s*$)/,LrA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",frA?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),kK=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,HrA=bn(kK,"u").replace(/punct/g,Sm).getRegex(),TrA=bn(kK,"u").replace(/punct/g,bK).getRegex(),SK="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",OrA=bn(SK,"gu").replace(/notPunctSpace/g,vK).replace(/punctSpace/g,z7).replace(/punct/g,Sm).getRegex(),zrA=bn(SK,"gu").replace(/notPunctSpace/g,KrA).replace(/punctSpace/g,GrA).replace(/punct/g,bK).getRegex(),PrA=bn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,vK).replace(/punctSpace/g,z7).replace(/punct/g,Sm).getRegex(),jrA=bn(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,MK).getRegex(),qrA="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",VrA=bn(qrA,"gu").replace(/notPunctSpace/g,JrA).replace(/punctSpace/g,UrA).replace(/punct/g,MK).getRegex(),WrA=bn(/\\(punct)/,"gu").replace(/punct/g,Sm).getRegex(),ZrA=bn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[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])?)+(?![-_])/).getRegex(),XrA=bn(T7).replace("(?:-->|$)","-->").getRegex(),$rA=bn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",XrA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),bm=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,AsA=bn(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",bm).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),xK=bn(/^!?\[(label)\]\[(ref)\]/).replace("label",bm).replace("ref",H7).getRegex(),RK=bn(/^!?\[(ref)\](?:\[\])?/).replace("ref",H7).getRegex(),esA=bn("reflink|nolink(?!\\()","g").replace("reflink",xK).replace("nolink",RK).getRegex(),QK=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,P7={_backpedal:YI,anyPunctuation:WrA,autolink:ZrA,blockSkip:YrA,br:yK,code:FrA,del:YI,delLDelim:YI,delRDelim:YI,emStrongLDelim:HrA,emStrongRDelimAst:OrA,emStrongRDelimUnd:PrA,escape:NrA,link:AsA,nolink:RK,punctuation:_rA,reflink:xK,reflinkSearch:esA,tag:$rA,text:LrA,url:YI},tsA=Ve(BA({},P7),{link:bn(/^!?\[(label)\]\((.*?)\)/).replace("label",bm).getRegex(),reflink:bn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",bm).getRegex()}),_7=Ve(BA({},P7),{emStrongRDelimAst:zrA,emStrongLDelim:TrA,delLDelim:jrA,delRDelim:VrA,url:bn(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",QK).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:bn(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},EK=t=>nsA[t];function Sc(t,e){if(e){if(ds.escapeTest.test(t))return t.replace(ds.escapeReplace,EK)}else if(ds.escapeTestNoEncode.test(t))return t.replace(ds.escapeReplaceNoEncode,EK);return t}function hK(t){try{t=encodeURI(t).replace(ds.percentDecode,"%")}catch(e){return null}return t}function uK(t,e){let A=t.replace(ds.findPipe,(o,a,r)=>{let s=!1,g=a;for(;--g>=0&&r[g]==="\\";)s=!s;return s?"|":" |"}),i=A.split(ds.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length0?-2:-1}function asA(t,e=0){let A=e,i="";for(let n of t)if(n===" "){let o=4-A%4;i+=" ".repeat(o),A+=o}else i+=n,A++;return i}function fK(t,e,A,i,n){let o=e.href,a=e.title||null,r=t[1].replace(n.other.outputLinkReplace,"$1");i.state.inLink=!0;let s={type:t[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:a,text:r,tokens:i.inlineTokens(r)};return i.state.inLink=!1,s}function rsA(t,e,A){let i=t.match(A.other.indentCodeCompensation);if(i===null)return e;let n=i[1];return e.split(` `).map(o=>{let a=o.match(A.other.beginningSpace);if(a===null)return o;let[r]=a;return r.length>=n.length?o.slice(n.length):o}).join(` `)}var Mm=class{options;rules;lexer;constructor(t){this.options=t||TI}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:Nh(A,` `)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let A=e[0],i=rsA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let i=Nh(A,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(A=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Nh(e[0],` `)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let A=Nh(e[0],` `).split(` `),i="",n="",o=[];for(;A.length>0;){let a=!1,r=[],s;for(s=0;s1,n={type:"list",raw:"",ordered:i,start:i?+A.slice(0,-1):"",loose:!1,items:[]};A=i?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=i?A:"[*+-]");let o=this.rules.other.listItemRegex(A),a=!1;for(;t;){let s=!1,g="",l="";if(!(e=o.exec(t))||this.rules.block.hr.test(t))break;g=e[0],t=t.substring(g.length);let C=asA(e[2].split(` `,1)[0],e[1].length),I=t.split(` `,1)[0],d=!C.trim(),B=0;if(this.options.pedantic?(B=2,l=C.trimStart()):d?B=e[1].length+1:(B=C.search(this.rules.other.nonSpaceChar),B=B>4?1:B,l=C.slice(B),B+=e[1].length),d&&this.rules.other.blankLine.test(I)&&(g+=I+` `,t=t.substring(I.length+1),s=!0),!s){let Q=this.rules.other.nextBulletRegex(B),E=this.rules.other.hrRegex(B),f=this.rules.other.fencesBeginRegex(B),b=this.rules.other.headingBeginRegex(B),R=this.rules.other.htmlBeginRegex(B),M=this.rules.other.blockquoteBeginRegex(B);for(;t;){let v=t.split(` `,1)[0],F;if(I=v,this.options.pedantic?(I=I.replace(this.rules.other.listReplaceNesting," "),F=I):F=I.replace(this.rules.other.tabCharGlobal," "),f.test(I)||b.test(I)||R.test(I)||M.test(I)||Q.test(I)||E.test(I))break;if(F.search(this.rules.other.nonSpaceChar)>=B||!I.trim())l+=` `+F.slice(B);else{if(d||C.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||f.test(C)||b.test(C)||E.test(C))break;l+=` `+I}d=!I.trim(),g+=v+` `,t=t.substring(v.length+1),C=F.slice(B)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(g)&&(a=!0)),n.items.push({type:"list_item",raw:g,task:!!this.options.gfm&&this.rules.other.listIsTask.test(l),loose:!1,text:l,tokens:[]}),n.raw+=g}let r=n.items.at(-1);if(r)r.raw=r.raw.trimEnd(),r.text=r.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let s of n.items){if(this.lexer.state.top=!1,s.tokens=this.lexer.blockTokens(s.text,[]),s.task){if(s.text=s.text.replace(this.rules.other.listReplaceTask,""),s.tokens[0]?.type==="text"||s.tokens[0]?.type==="paragraph"){s.tokens[0].raw=s.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),s.tokens[0].text=s.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let l=this.lexer.inlineQueue.length-1;l>=0;l--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[l].src)){this.lexer.inlineQueue[l].src=this.lexer.inlineQueue[l].src.replace(this.rules.other.listReplaceTask,"");break}}let g=this.rules.other.listTaskCheckbox.exec(s.raw);if(g){let l={type:"checkbox",raw:g[0]+" ",checked:g[0]!=="[ ]"};s.checked=l.checked,n.loose?s.tokens[0]&&["paragraph","text"].includes(s.tokens[0].type)&&"tokens"in s.tokens[0]&&s.tokens[0].tokens?(s.tokens[0].raw=l.raw+s.tokens[0].raw,s.tokens[0].text=l.raw+s.tokens[0].text,s.tokens[0].tokens.unshift(l)):s.tokens.unshift({type:"paragraph",raw:l.raw,text:l.raw,tokens:[l]}):s.tokens.unshift(l)}}if(!n.loose){let g=s.tokens.filter(C=>C.type==="space"),l=g.length>0&&g.some(C=>this.rules.other.anyLine.test(C.raw));n.loose=l}}if(n.loose)for(let s of n.items){s.loose=!0;for(let g of s.tokens)g.type==="text"&&(g.type="paragraph")}return n}}html(t){let e=this.rules.block.html.exec(t);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(t){let e=this.rules.block.def.exec(t);if(e){let A=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),i=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:A,raw:e[0],href:i,title:n}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let A=uK(e[1]),i=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` `):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(A.length===i.length){for(let a of i)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a({text:r,tokens:this.lexer.inline(r),header:!1,align:o.align[s]})));return o}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let A=e[1].charAt(e[1].length-1)===` `?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=Nh(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=osA(e[2],"()");if(o===-2)return;if(o>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let i=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?i=i.slice(1):i=i.slice(1,-1)),fK(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let A;if((A=this.rules.inline.reflink.exec(t))||(A=this.rules.inline.nolink.exec(t))){let i=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[i.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return fK(A,n,A[0],this.lexer,this.rules)}}emStrong(t,e,A=""){let i=this.rules.inline.emStrongLDelim.exec(t);if(!(!i||i[3]&&A.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[2])||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=0,g=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(g.lastIndex=0,e=e.slice(-1*t.length+n);(i=g.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(a=[...o].length,i[3]||i[4]){r+=a;continue}else if((i[5]||i[6])&&n%3&&!((n+a)%3)){s+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r+s);let l=[...i[0]][0].length,C=t.slice(0,n+i.index+l+a);if(Math.min(n,a)%2){let d=C.slice(1,-1);return{type:"em",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}let I=C.slice(2,-2);return{type:"strong",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return i&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,A=""){let i=this.rules.inline.delLDelim.exec(t);if(i&&(!i[1]||!A||this.rules.inline.punctuation.exec(A))){let n=[...i[0]].length-1,o,a,r=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,e=e.slice(-1*t.length+n);(i=s.exec(e))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o||(a=[...o].length,a!==n))continue;if(i[3]||i[4]){r+=a;continue}if(r-=a,r>0)continue;a=Math.min(a,a+r);let g=[...i[0]][0].length,l=t.slice(0,n+i.index+g+a),C=l.slice(n,-n);return{type:"del",raw:l,text:C,tokens:this.lexer.inlineTokens(C)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let A,i;return e[2]==="@"?(A=e[1],i="mailto:"+A):(A=e[1],i=A),{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let A,i;if(e[2]==="@")A=e[0],i="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?i="http://"+e[0]:i=e[0]}return{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},vl=class G7{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||TI,this.options.tokenizer=this.options.tokenizer||new Mm,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:ds,block:vm.normal,inline:Rh.normal};this.options.pedantic?(A.block=vm.pedantic,A.inline=Rh.pedantic):this.options.gfm&&(A.block=vm.gfm,this.options.breaks?A.inline=Rh.breaks:A.inline=Rh.gfm),this.tokenizer.rules=A}static get rules(){return{block:vm,inline:Rh}}static lex(e,A){return new G7(A).lex(e)}static lexInline(e,A){return new G7(A).inlineTokens(e)}lex(e){e=e.replace(ds.carriageReturn,` `),this.blockTokens(e,this.tokens);for(let A=0;A(n=a.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let a=A.at(-1);n.raw.length===1&&a!==void 0?a.raw+=` `:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` `)?"":` `)+n.raw,a.text+=` `+n.text,this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="paragraph"||a?.type==="text"?(a.raw+=(a.raw.endsWith(` `)?"":` `)+n.raw,a.text+=` `+n.raw,this.inlineQueue.at(-1).src=a.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title},A.push(n));continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let a=1/0,r=e.slice(1),s;this.options.extensions.startBlock.forEach(g=>{s=g.call({lexer:this},r),typeof s=="number"&&s>=0&&(a=Math.min(a,s))}),a<1/0&&a>=0&&(o=e.substring(0,a+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let a=A.at(-1);i&&a?.type==="paragraph"?(a.raw+=(a.raw.endsWith(` `)?"":` `)+n.raw,a.text+=` `+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n),i=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let a=A.at(-1);a?.type==="text"?(a.raw+=(a.raw.endsWith(` `)?"":` `)+n.raw,a.text+=` `+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):A.push(n);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let i=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)o=n[2]?n[2].length:0,i=i.slice(0,n.index+o)+"["+"a".repeat(n[0].length-o-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);i=this.options.hooks?.emStrongMask?.call({lexer:this},i)??i;let a=!1,r="";for(;e;){a||(r=""),a=!1;let s;if(this.options.extensions?.inline?.some(l=>(s=l.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let l=A.at(-1);s.type==="text"&&l?.type==="text"?(l.raw+=s.raw,l.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let g=e;if(this.options.extensions?.startInline){let l=1/0,C=e.slice(1),I;this.options.extensions.startInline.forEach(d=>{I=d.call({lexer:this},C),typeof I=="number"&&I>=0&&(l=Math.min(l,I))}),l<1/0&&l>=0&&(g=e.substring(0,l+1))}if(s=this.tokenizer.inlineText(g)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),a=!0;let l=A.at(-1);l?.type==="text"?(l.raw+=s.raw,l.text+=s.text):A.push(s);continue}if(e){let l="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return A}},TC=class{options;parser;constructor(t){this.options=t||TI}space(t){return""}code({text:t,lang:e,escaped:A}){let i=(e||"").match(ds.notSpaceStart)?.[0],n=t.replace(ds.endingNewline,"")+` `;return i?'
'+(A?n:Sc(n,!0))+`
`:"
"+(A?n:Sc(n,!0))+`
`}blockquote({tokens:t}){return`
${this.parser.parse(t)}
`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} `}hr(t){return`
`}list(t){let e=t.ordered,A=t.start,i="";for(let a=0;a `+i+" `}listitem(t){return`
  • ${this.parser.parse(t.tokens)}
  • `}checkbox({checked:t}){return" '}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    `}table(t){let e="",A="";for(let n=0;n${i}`),` `+e+` `+i+`
    `}tablerow({text:t}){return` ${t} `}tablecell(t){let e=this.parser.parseInline(t.tokens),A=t.header?"th":"td";return(t.align?`<${A} align="${t.align}">`:`<${A}>`)+e+` `}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${Sc(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:A}){let i=this.parser.parseInline(A),n=hK(t);if(n===null)return i;t=n;let o='
    ",o}image({href:t,title:e,text:A,tokens:i}){i&&(A=this.parser.parseInline(i,this.parser.textRenderer));let n=hK(t);if(n===null)return Sc(A);t=n;let o=`${Sc(A)}{let a=n[o].flat(1/0);A=A.concat(this.walkTokens(a,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(A=>{let i=BA({},A);if(i.async=this.defaults.async||i.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...a){let r=n.renderer.apply(this,a);return r===!1&&(r=o.apply(this,a)),r}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),i.extensions=e),A.renderer){let n=this.defaults.renderer||new TC(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let a=o,r=A.renderer[a],s=n[a];n[a]=(...g)=>{let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l||""}}i.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new Mm(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let a=o,r=A.tokenizer[a],s=n[a];n[a]=(...g)=>{let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l}}i.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new Fh;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let a=o,r=A.hooks[a],s=n[a];Fh.passThroughHooks.has(o)?n[a]=g=>{if(this.defaults.async&&Fh.passThroughHooksRespectAsync.has(o))return ct(this,null,function*(){let C=yield r.call(n,g);return s.call(n,C)});let l=r.call(n,g);return s.call(n,l)}:n[a]=(...g)=>{if(this.defaults.async)return ct(this,null,function*(){let C=yield r.apply(n,g);return C===!1&&(C=yield s.apply(n,g)),C});let l=r.apply(n,g);return l===!1&&(l=s.apply(n,g)),l}}i.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;i.walkTokens=function(a){let r=[];return r.push(o.call(this,a)),n&&(r=r.concat(n.call(this,a))),r}}this.defaults=BA(BA({},this.defaults),i)}),this}setOptions(t){return this.defaults=BA(BA({},this.defaults),t),this}lexer(t,e){return vl.lex(t,e??this.defaults)}parser(t,e){return bl.parse(t,e??this.defaults)}parseMarkdown(t){return(e,A)=>{let i=BA({},A),n=BA(BA({},this.defaults),i),o=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&i.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=t),n.async)return ct(this,null,function*(){let a=n.hooks?yield n.hooks.preprocess(e):e,r=yield(n.hooks?yield n.hooks.provideLexer():t?vl.lex:vl.lexInline)(a,n),s=n.hooks?yield n.hooks.processAllTokens(r):r;n.walkTokens&&(yield Promise.all(this.walkTokens(s,n.walkTokens)));let g=yield(n.hooks?yield n.hooks.provideParser():t?bl.parse:bl.parseInline)(s,n);return n.hooks?yield n.hooks.postprocess(g):g}).catch(o);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer():t?vl.lex:vl.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let r=(n.hooks?n.hooks.provideParser():t?bl.parse:bl.parseInline)(a,n);return n.hooks&&(r=n.hooks.postprocess(r)),r}catch(a){return o(a)}}}onError(t,e){return A=>{if(A.message+=` Please report this to https://github.com/markedjs/marked.`,t){let i="

    An error occurred:

    "+Sc(A.message+"",!0)+"
    ";return e?Promise.resolve(i):i}if(e)return Promise.reject(A);throw A}}},HI=new ssA;function Ln(t,e){return HI.parse(t,e)}Ln.options=Ln.setOptions=function(t){return HI.setOptions(t),Ln.defaults=HI.defaults,mK(Ln.defaults),Ln};Ln.getDefaults=U7;Ln.defaults=TI;Ln.use=function(...t){return HI.use(...t),Ln.defaults=HI.defaults,mK(Ln.defaults),Ln};Ln.walkTokens=function(t,e){return HI.walkTokens(t,e)};Ln.parseInline=HI.parseInline;Ln.Parser=bl;Ln.parser=bl.parse;Ln.Renderer=TC;Ln.TextRenderer=j7;Ln.Lexer=vl;Ln.lexer=vl.lex;Ln.Tokenizer=Mm;Ln.Hooks=Fh;Ln.parse=Ln;var LHA=Ln.options,_HA=Ln.setOptions,GHA=Ln.use,KHA=Ln.walkTokens,UHA=Ln.parseInline;var JHA=bl.parse,YHA=vl.lex;var gsA=["*"],lsA="Copy",csA="Copied",CsA=(()=>{class t{constructor(){this._buttonClick$=new $A,this.copied=Is(this._buttonClick$.pipe(Ei(()=>Qi(oe(!0),Cf(3e3).pipe(VE(!1)))),hl(),Ds(1))),this.copiedText=_e(()=>this.copied()?csA:lsA)}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["markdown-clipboard"]],decls:2,vars:3,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(i,n){i&1&&(ti(0,"button",0),pc("click",function(){return n.onCopyToClipboardClick()}),K(1),Ii()),i&2&&(ae("copied",n.copied()),p(),qA(n.copiedText()))},encapsulation:2,changeDetection:0})}}return t})(),IsA=new wA("CLIPBOARD_OPTIONS");var dsA=new wA("MARKED_EXTENSIONS"),BsA=new wA("MARKED_OPTIONS"),QsA=new wA("MERMAID_OPTIONS"),EsA=new wA("SANITIZE");function hsA(t){return typeof t=="function"}var usA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",fsA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",msA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",psA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",DsA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",wsA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information";var NK=(()=>{class t{get options(){return this._options}set options(A){this._options=BA(BA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(){this.clipboardOptions=h(IsA,{optional:!0}),this.extensions=h(dsA,{optional:!0}),this.http=h(ks,{optional:!0}),this.mermaidOptions=h(QsA,{optional:!0}),this.platform=h(Qf),this.sanitize=h(EsA,{optional:!0}),this.sanitizer=h(LC),this.DEFAULT_MARKED_OPTIONS={renderer:new TC},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this.DEFAULT_SECURITY_CONTEXT=ul.HTML,this._options=null,this._reload$=new $A,this.reload$=this._reload$.asObservable(),this.options=h(BsA,{optional:!0})}parse(A,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:a,mermaid:r,disableSanitizer:s}=i,g=BA(BA({},this.options),i.markedOptions),l=g.renderer||this.renderer||new TC;this.extensions&&(this.renderer=this.extendsRendererForExtensions(l)),r&&(this.renderer=this.extendsRendererForMermaid(l));let C=this.trimIndentation(A),I=n?this.decodeHtml(C):C,d=a?this.parseEmoji(I):I,B=this.parseMarked(d,g,o);return s?B:this.sanitizeHtml(B)}render(A,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:a,katex:r,katexOptions:s,mermaid:g,mermaidOptions:l}=i;r&&this.renderKatex(A,BA(BA({},this.DEFAULT_KATEX_OPTIONS),s)),g&&this.renderMermaid(A,BA(BA(BA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),l)),o&&this.renderClipboard(A,n,BA(BA(BA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),a)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(wsA);return this.http.get(A,{responseType:"text"}).pipe(fe(i=>this.handleExtension(A,i)))}highlight(A){if(!y0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let i=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(i,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!y0(this.platform))return A;let i=document.createElement("textarea");return i.innerHTML=A,i.value}extendsRendererForExtensions(A){let i=A;return i.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions&&this.extensions.length>0&&Ln.use(...this.extensions),i.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let i=A;if(i.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
    ${o.text}
    `:n(o),i.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,i){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,a=o.lastIndexOf("/"),r=a>-1?o.substring(a+1).split("?")[0]:"",s=r.lastIndexOf("."),g=s>-1?r.substring(s+1):"";return g&&g!=="md"?"```"+g+` `+i+"\n```":i}parseMarked(A,i,n=!1){if(i.renderer){let o=BA({},i.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Ln.use({renderer:o})}return n?Ln.parseInline(A,i):Ln.parse(A,i)}parseEmoji(A){if(!y0(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(usA);return joypixels.shortnameToUnicode(A)}renderKatex(A,i){if(y0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(fsA);renderMathInElement(A,i)}}renderClipboard(A,i,n){if(!y0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(psA);if(!i)throw new Error(DsA);let{buttonComponent:o,buttonTemplate:a}=n,r=A.querySelectorAll("pre");for(let s=0;sC.classList.add("hover"),l.onmouseleave=()=>C.classList.remove("hover");let I;if(o){let B=i.createComponent(o);I=B.hostView,B.changeDetectorRef.markForCheck()}else if(a)I=i.createEmbeddedView(a);else{let B=i.createComponent(CsA);I=B.hostView,B.changeDetectorRef.markForCheck()}let d;I.rootNodes.forEach(B=>{C.appendChild(B),d=new ClipboardJS(B,{text:()=>g.innerText})}),I.onDestroy(()=>d.destroy())}}renderMermaid(A,i=this.DEFAULT_MERMAID_OPTIONS){if(!y0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(msA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let i;return A.split(` `).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(` `)}sanitizeHtml(A){return ct(this,null,function*(){return hsA(this.sanitize)?this.sanitize(yield A):this.sanitize!==ul.NONE?this.sanitizer.sanitize(this.sanitize??this.DEFAULT_SECURITY_CONTEXT,A)??"":A})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),q7=(function(t){return t.CommandLine="command-line",t.LineHighlight="line-highlight",t.LineNumbers="line-numbers",t})(q7||{}),FK=(()=>{class t{constructor(){this.element=h(ge),this.markdownService=h(NK),this.viewContainerRef=h(Ro),this.error=new WA,this.load=new WA,this.ready=new WA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new $A}get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(Bt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,i=!1){return ct(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},a=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=a,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,q7.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,q7.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,i){let n=A.querySelectorAll("pre");for(let o=0;o{let r=i[a];if(r){let s=this.toLispCase(a);n.item(o).setAttribute(s,r.toString())}})}toLispCase(A){let i=A.match(/([A-Z])/g);if(!i)return A;let n=A.toString();for(let o=0,a=i.length;o{class t{static forRoot(A){return{ngModule:t,providers:[_h(A)]}}static forChild(){return{ngModule:t}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275mod=Xe({type:t})}static{this.\u0275inj=Ze({})}}return t})();var Di="primary",qh=Symbol("RouteTitle"),$7=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function zI(t){return new $7(t)}function V7(t,e,A){for(let i=0;it.length||A.pathMatch==="full"&&(e.hasChildren()||i.lengtht.length||A.pathMatch==="full"&&e.hasChildren()&&A.path!=="**")return null;let r={};return!V7(o,t.slice(0,o.length),r)||!V7(a,t.slice(t.length-a.length),r)?null:{consumed:t,posParams:r}}function _m(t){return new Promise((e,A)=>{t.pipe(po()).subscribe({next:i=>e(i),error:i=>A(i)})})}function bsA(t,e){if(t.length!==e.length)return!1;for(let A=0;Ai[o]===n)}else return t===e}function MsA(t){return t.length>0?t[t.length-1]:null}function jI(t){return hd(t)?t:pf(t)?mr(Promise.resolve(t)):oe(t)}function zK(t){return hd(t)?_m(t):Promise.resolve(t)}var ksA={exact:qK,subset:VK},PK={exact:SsA,subset:xsA,ignored:()=>!0},jK={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},eb={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};function _K(t,e,A){return ksA[A.paths](t.root,e.root,A.matrixParams)&&PK[A.queryParams](t.queryParams,e.queryParams)&&!(A.fragment==="exact"&&t.fragment!==e.fragment)}function SsA(t,e){return xc(t,e)}function qK(t,e,A){if(!OI(t.segments,e.segments)||!Nm(t.segments,e.segments,A)||t.numberOfChildren!==e.numberOfChildren)return!1;for(let i in e.children)if(!t.children[i]||!qK(t.children[i],e.children[i],A))return!1;return!0}function xsA(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(A=>OK(t[A],e[A]))}function VK(t,e,A){return WK(t,e,e.segments,A)}function WK(t,e,A,i){if(t.segments.length>A.length){let n=t.segments.slice(0,A.length);return!(!OI(n,A)||e.hasChildren()||!Nm(n,A,i))}else if(t.segments.length===A.length){if(!OI(t.segments,A)||!Nm(t.segments,A,i))return!1;for(let n in e.children)if(!t.children[n]||!VK(t.children[n],e.children[n],i))return!1;return!0}else{let n=A.slice(0,t.segments.length),o=A.slice(t.segments.length);return!OI(t.segments,n)||!Nm(t.segments,n,i)||!t.children[Di]?!1:WK(t.children[Di],e,o,i)}}function Nm(t,e,A){return e.every((i,n)=>PK[A](t[n].parameters,i.parameters))}var Gg=class{root;queryParams;fragment;_queryParamMap;constructor(e=new Wn([],{}),A={},i=null){this.root=e,this.queryParams=A,this.fragment=i}get queryParamMap(){return this._queryParamMap??=zI(this.queryParams),this._queryParamMap}toString(){return FsA.serialize(this)}},Wn=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Fm(this)}},OC=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=zI(this.parameters),this._parameterMap}toString(){return XK(this)}};function RsA(t,e){return OI(t,e)&&t.every((A,i)=>xc(A.parameters,e[i].parameters))}function OI(t,e){return t.length!==e.length?!1:t.every((A,i)=>A.path===e[i].path)}function NsA(t,e){let A=[];return Object.entries(t.children).forEach(([i,n])=>{i===Di&&(A=A.concat(e(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Di&&(A=A.concat(e(n,i)))}),A}var qI=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:()=>new S0,providedIn:"root"})}return t})(),S0=class{parse(e){let A=new ib(e);return new Gg(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${Gh(e.root,!0)}`,i=GsA(e.queryParams),n=typeof e.fragment=="string"?`#${LsA(e.fragment)}`:"";return`${A}${i}${n}`}},FsA=new S0;function Fm(t){return t.segments.map(e=>XK(e)).join("/")}function Gh(t,e){if(!t.hasChildren())return Fm(t);if(e){let A=t.children[Di]?Gh(t.children[Di],!1):"",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Di&&i.push(`${n}:${Gh(o,!1)}`)}),i.length>0?`${A}(${i.join("//")})`:A}else{let A=NsA(t,(i,n)=>n===Di?[Gh(t.children[Di],!1)]:[`${n}:${Gh(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Di]!=null?`${Fm(t)}/${A[0]}`:`${Fm(t)}/(${A.join("//")})`}}function ZK(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function xm(t){return ZK(t).replace(/%3B/gi,";")}function LsA(t){return encodeURI(t)}function tb(t){return ZK(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Lm(t){return decodeURIComponent(t)}function GK(t){return Lm(t.replace(/\+/g,"%20"))}function XK(t){return`${tb(t.path)}${_sA(t.parameters)}`}function _sA(t){return Object.entries(t).map(([e,A])=>`;${tb(e)}=${tb(A)}`).join("")}function GsA(t){let e=Object.entries(t).map(([A,i])=>Array.isArray(i)?i.map(n=>`${xm(A)}=${xm(n)}`).join("&"):`${xm(A)}=${xm(i)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var KsA=/^[^\/()?;#]+/;function W7(t){let e=t.match(KsA);return e?e[0]:""}var UsA=/^[^\/()?;=#]+/;function JsA(t){let e=t.match(UsA);return e?e[0]:""}var YsA=/^[^=?&#]+/;function HsA(t){let e=t.match(YsA);return e?e[0]:""}var TsA=/^[^&#]+/;function OsA(t){let e=t.match(TsA);return e?e[0]:""}var ib=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new Wn([],{}):new Wn([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(e=0){if(e>50)throw new wt(4010,!1);if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let i={};this.peekStartsWith("/(")&&(this.capture("/"),i=this.parseParens(!0,e));let n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1,e)),(A.length>0||Object.keys(i).length>0)&&(n[Di]=new Wn(A,i)),n}parseSegment(){let e=W7(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new wt(4009,!1);return this.capture(e),new OC(Lm(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=JsA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let n=W7(this.remaining);n&&(i=n,this.capture(i))}e[Lm(A)]=Lm(i)}parseQueryParam(e){let A=HsA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let a=OsA(this.remaining);a&&(i=a,this.capture(i))}let n=GK(A),o=GK(i);if(e.hasOwnProperty(n)){let a=e[n];Array.isArray(a)||(a=[a],e[n]=a),a.push(o)}else e[n]=o}parseParens(e,A){let i={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let n=W7(this.remaining),o=this.remaining[n.length];if(o!=="/"&&o!==")"&&o!==";")throw new wt(4010,!1);let a;n.indexOf(":")>-1?(a=n.slice(0,n.indexOf(":")),this.capture(a),this.capture(":")):e&&(a=Di);let r=this.parseChildren(A+1);i[a??Di]=Object.keys(r).length===1&&r[Di]?r[Di]:new Wn([],r),this.consumeOptional("//")}return i}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new wt(4011,!1)}};function $K(t){return t.segments.length>0?new Wn([],{[Di]:t}):t}function AU(t){let e={};for(let[i,n]of Object.entries(t.children)){let o=AU(n);if(i===Di&&o.segments.length===0&&o.hasChildren())for(let[a,r]of Object.entries(o.children))e[a]=r;else(o.segments.length>0||o.hasChildren())&&(e[i]=o)}let A=new Wn(t.segments,e);return zsA(A)}function zsA(t){if(t.numberOfChildren===1&&t.children[Di]){let e=t.children[Di];return new Wn(t.segments.concat(e.segments),e.children)}return t}function qd(t){return t instanceof Gg}function eU(t,e,A=null,i=null,n=new S0){let o=tU(t);return iU(o,e,A,i,n)}function tU(t){let e;function A(o){let a={};for(let s of o.children){let g=A(s);a[s.outlet]=g}let r=new Wn(o.url,a);return o===t&&(e=r),r}let i=A(t.root),n=$K(i);return e??n}function iU(t,e,A,i,n){let o=t;for(;o.parent;)o=o.parent;if(e.length===0)return Z7(o,o,o,A,i,n);let a=PsA(e);if(a.toRoot())return Z7(o,o,new Wn([],{}),A,i,n);let r=jsA(a,o,t),s=r.processChildren?Uh(r.segmentGroup,r.index,a.commands):oU(r.segmentGroup,r.index,a.commands);return Z7(o,r.segmentGroup,s,A,i,n)}function Gm(t){return typeof t=="object"&&t!=null&&!t.outlets&&!t.segmentPath}function Yh(t){return typeof t=="object"&&t!=null&&t.outlets}function KK(t,e,A){t||="\u0275";let i=new Gg;return i.queryParams={[t]:e},A.parse(A.serialize(i)).queryParams[t]}function Z7(t,e,A,i,n,o){let a={};for(let[g,l]of Object.entries(i??{}))a[g]=Array.isArray(l)?l.map(C=>KK(g,C,o)):KK(g,l,o);let r;t===e?r=A:r=nU(t,e,A);let s=$K(AU(r));return new Gg(s,a,n)}function nU(t,e,A){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===e?i[n]=A:i[n]=nU(o,e,A)}),new Wn(t.segments,i)}var Km=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,i){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=i,e&&i.length>0&&Gm(i[0]))throw new wt(4003,!1);let n=i.find(Yh);if(n&&n!==MsA(i))throw new wt(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function PsA(t){if(typeof t[0]=="string"&&t.length===1&&t[0]==="/")return new Km(!0,0,t);let e=0,A=!1,i=t.reduce((n,o,a)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let r={};return Object.entries(o.outlets).forEach(([s,g])=>{r[s]=typeof g=="string"?g.split("/"):g}),[...n,{outlets:r}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:a===0?(o.split("/").forEach((r,s)=>{s==0&&r==="."||(s==0&&r===""?A=!0:r===".."?e++:r!=""&&n.push(r))}),n):[...n,o]},[]);return new Km(A,e,i)}var zd=class{segmentGroup;processChildren;index;constructor(e,A,i){this.segmentGroup=e,this.processChildren=A,this.index=i}};function jsA(t,e,A){if(t.isAbsolute)return new zd(e,!0,0);if(!A)return new zd(e,!1,NaN);if(A.parent===null)return new zd(A,!0,0);let i=Gm(t.commands[0])?0:1,n=A.segments.length-1+i;return qsA(A,n,t.numberOfDoubleDots)}function qsA(t,e,A){let i=t,n=e,o=A;for(;o>n;){if(o-=n,i=i.parent,!i)throw new wt(4005,!1);n=i.segments.length}return new zd(i,!1,n-o)}function VsA(t){return Yh(t[0])?t[0].outlets:{[Di]:t}}function oU(t,e,A){if(t??=new Wn([],{}),t.segments.length===0&&t.hasChildren())return Uh(t,e,A);let i=WsA(t,e,A),n=A.slice(i.commandIndex);if(i.match&&i.pathIndexo!==Di)&&t.children[Di]&&t.numberOfChildren===1&&t.children[Di].segments.length===0){let o=Uh(t.children[Di],e,A);return new Wn(t.segments,o.children)}return Object.entries(i).forEach(([o,a])=>{typeof a=="string"&&(a=[a]),a!==null&&(n[o]=oU(t.children[o],e,a))}),Object.entries(t.children).forEach(([o,a])=>{i[o]===void 0&&(n[o]=a)}),new Wn(t.segments,n)}}function WsA(t,e,A){let i=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let a=t.segments[n],r=A[i];if(Yh(r))break;let s=`${r}`,g=i0&&s===void 0)break;if(s&&g&&typeof g=="object"&&g.outlets===void 0){if(!JK(s,g,a))return o;i+=2}else{if(!JK(s,{},a))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function nb(t,e,A){let i=t.segments.slice(0,e),n=0;for(;n{typeof i=="string"&&(i=[i]),i!==null&&(e[A]=nb(new Wn([],{}),0,i))}),e}function UK(t){let e={};return Object.entries(t).forEach(([A,i])=>e[A]=`${i}`),e}function JK(t,e,A){return t==A.path&&xc(e,A.parameters)}var Pd="imperative",Xa=(function(t){return t[t.NavigationStart=0]="NavigationStart",t[t.NavigationEnd=1]="NavigationEnd",t[t.NavigationCancel=2]="NavigationCancel",t[t.NavigationError=3]="NavigationError",t[t.RoutesRecognized=4]="RoutesRecognized",t[t.ResolveStart=5]="ResolveStart",t[t.ResolveEnd=6]="ResolveEnd",t[t.GuardsCheckStart=7]="GuardsCheckStart",t[t.GuardsCheckEnd=8]="GuardsCheckEnd",t[t.RouteConfigLoadStart=9]="RouteConfigLoadStart",t[t.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",t[t.ChildActivationStart=11]="ChildActivationStart",t[t.ChildActivationEnd=12]="ChildActivationEnd",t[t.ActivationStart=13]="ActivationStart",t[t.ActivationEnd=14]="ActivationEnd",t[t.Scroll=15]="Scroll",t[t.NavigationSkipped=16]="NavigationSkipped",t})(Xa||{}),cg=class{id;url;constructor(e,A){this.id=e,this.url=A}},zC=class extends cg{type=Xa.NavigationStart;navigationTrigger;restoredState;constructor(e,A,i="imperative",n=null){super(e,A),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},Ml=class extends cg{urlAfterRedirects;type=Xa.NavigationEnd;constructor(e,A,i){super(e,A),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},jr=(function(t){return t[t.Redirect=0]="Redirect",t[t.SupersededByNewNavigation=1]="SupersededByNewNavigation",t[t.NoDataFromResolver=2]="NoDataFromResolver",t[t.GuardRejected=3]="GuardRejected",t[t.Aborted=4]="Aborted",t})(jr||{}),Vd=(function(t){return t[t.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",t[t.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",t})(Vd||{}),_g=class extends cg{reason;code;type=Xa.NavigationCancel;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}};function aU(t){return t instanceof _g&&(t.code===jr.Redirect||t.code===jr.SupersededByNewNavigation)}var Nc=class extends cg{reason;code;type=Xa.NavigationSkipped;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}},PI=class extends cg{error;target;type=Xa.NavigationError;constructor(e,A,i,n){super(e,A),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},Hh=class extends cg{urlAfterRedirects;state;type=Xa.RoutesRecognized;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Um=class extends cg{urlAfterRedirects;state;type=Xa.GuardsCheckStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Jm=class extends cg{urlAfterRedirects;state;shouldActivate;type=Xa.GuardsCheckEnd;constructor(e,A,i,n,o){super(e,A),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Ym=class extends cg{urlAfterRedirects;state;type=Xa.ResolveStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Hm=class extends cg{urlAfterRedirects;state;type=Xa.ResolveEnd;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Tm=class{route;type=Xa.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Om=class{route;type=Xa.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},zm=class{snapshot;type=Xa.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Pm=class{snapshot;type=Xa.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},jm=class{snapshot;type=Xa.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},qm=class{snapshot;type=Xa.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Wd=class{routerEvent;position;anchor;scrollBehavior;type=Xa.Scroll;constructor(e,A,i,n){this.routerEvent=e,this.position=A,this.anchor=i,this.scrollBehavior=n}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},Zd=class{},Th=class{},Xd=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function XsA(t){return!(t instanceof Zd)&&!(t instanceof Xd)&&!(t instanceof Th)}var Vm=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return this.route?.snapshot._environmentInjector??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new VI(this.rootInjector)}},VI=(()=>{class t{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,i){let n=this.getOrCreateContext(A);n.outlet=i,this.contexts.set(A,n)}onChildOutletDestroyed(A){let i=this.getContext(A);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let i=this.getContext(A);return i||(i=new Vm(this.rootInjector),this.contexts.set(A,i)),i}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(i){return new(i||t)(Do(pr))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Wm=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=ob(e,this._root);return A?A.children.map(i=>i.value):[]}firstChild(e){let A=ob(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=ab(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return ab(e,this._root).map(A=>A.value)}};function ob(t,e){if(t===e.value)return e;for(let A of e.children){let i=ob(t,A);if(i)return i}return null}function ab(t,e){if(t===e.value)return[e];for(let A of e.children){let i=ab(t,A);if(i.length)return i.unshift(e),i}return[]}var lg=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function Od(t){let e={};return t&&t.children.forEach(A=>e[A.value.outlet]=A),e}var Oh=class extends Wm{snapshot;constructor(e,A){super(e),this.snapshot=A,Bb(this,e)}toString(){return this.snapshot.toString()}};function rU(t,e){let A=$sA(t,e),i=new Jt([new OC("",{})]),n=new Jt({}),o=new Jt({}),a=new Jt({}),r=new Jt(""),s=new _s(i,n,a,r,o,Di,t,A.root);return s.snapshot=A.root,new Oh(new lg(s,[]),A)}function $sA(t,e){let A={},i={},n={},a=new $d([],A,n,"",i,Di,t,null,{},e);return new zh("",new lg(a,[]))}var _s=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,i,n,o,a,r,s){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=a,this.component=r,this._futureSnapshot=s,this.title=this.dataSubject?.pipe(fe(g=>g[qh]))??oe(void 0),this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(fe(e=>zI(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(fe(e=>zI(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function db(t,e,A="emptyOnly"){let i,{routeConfig:n}=t;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?i={params:BA(BA({},e.params),t.params),data:BA(BA({},e.data),t.data),resolve:BA(BA(BA(BA({},t.data),e.data),n?.data),t._resolvedData)}:i={params:BA({},t.params),data:BA({},t.data),resolve:BA(BA({},t.data),t._resolvedData??{})},n&&gU(n)&&(i.resolve[qh]=n.title),i}var $d=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;_environmentInjector;get title(){return this.data?.[qh]}constructor(e,A,i,n,o,a,r,s,g,l){this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=a,this.component=r,this.routeConfig=s,this._resolve=g,this._environmentInjector=l}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=zI(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=zI(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(i=>i.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},zh=class extends Wm{url;constructor(e,A){super(A),this.url=e,Bb(this,A)}toString(){return sU(this._root)}};function Bb(t,e){e.value._routerState=t,e.children.forEach(A=>Bb(t,A))}function sU(t){let e=t.children.length>0?` { ${t.children.map(sU).join(", ")} } `:"";return`${t.value}${e}`}function X7(t){if(t.snapshot){let e=t.snapshot,A=t._futureSnapshot;t.snapshot=A,xc(e.queryParams,A.queryParams)||t.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&t.fragmentSubject.next(A.fragment),xc(e.params,A.params)||t.paramsSubject.next(A.params),bsA(e.url,A.url)||t.urlSubject.next(A.url),xc(e.data,A.data)||t.dataSubject.next(A.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function rb(t,e){let A=xc(t.params,e.params)&&RsA(t.url,e.url),i=!t.parent!=!e.parent;return A&&!i&&(!t.parent||rb(t.parent,e.parent))}function gU(t){return typeof t.title=="string"||t.title===null}var lU=new wA(""),Qb=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Di;activateEvents=new WA;deactivateEvents=new WA;attachEvents=new WA;detachEvents=new WA;routerOutletData=nt();parentContexts=h(VI);location=h(Ro);changeDetector=h(ft);inputBinder=h(Vh,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:i,previousValue:n}=A.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new wt(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new wt(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new wt(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,i){this.activated=A,this._activatedRoute=i,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,i){if(this.isActivated)throw new wt(4013,!1);this._activatedRoute=A;let n=this.location,a=A.snapshot.component,r=this.parentContexts.getOrCreateContext(this.name).children,s=new sb(A,r,n.injector,this.routerOutletData);this.activated=n.createComponent(a,{index:n.length,injector:s,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[ei]})}return t})(),sb=class{route;childContexts;parent;outletData;constructor(e,A,i,n){this.route=e,this.childContexts=A,this.parent=i,this.outletData=n}get(e,A){return e===_s?this.route:e===VI?this.childContexts:e===lU?this.outletData:this.parent.get(e,A)}},Vh=new wA(""),Eb=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:i}=A,n=Va([i.queryParams,i.params,i.data]).pipe(Ei(([o,a,r],s)=>(r=BA(BA(BA({},o),a),r),s===0?oe(r):Promise.resolve(r)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(A);return}let a=vL(i.component);if(!a){this.unsubscribeFromRouteData(A);return}for(let{templateName:r}of a.inputs)A.activatedComponentRef.setInput(r,o[r])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac})}return t})(),hb=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(i,n){i&1&&GA(0,"router-outlet")},dependencies:[Qb],encapsulation:2})}return t})();function ub(t){let e=t.children&&t.children.map(ub),A=e?Ve(BA({},t),{children:e}):BA({},t);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Di&&(A.component=hb),A}function AgA(t,e,A){let i=Ph(t,e._root,A?A._root:void 0);return new Oh(i,e)}function Ph(t,e,A){if(A&&t.shouldReuseRoute(e.value,A.value.snapshot)){let i=A.value;i._futureSnapshot=e.value;let n=egA(t,e,A);return new lg(i,n)}else{if(t.shouldAttach(e.value)){let o=t.retrieve(e.value);if(o!==null){let a=o.route;return a.value._futureSnapshot=e.value,a.children=e.children.map(r=>Ph(t,r)),a}}let i=tgA(e.value),n=e.children.map(o=>Ph(t,o));return new lg(i,n)}}function egA(t,e,A){return e.children.map(i=>{for(let n of A.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return Ph(t,i,n);return Ph(t,i)})}function tgA(t){return new _s(new Jt(t.url),new Jt(t.params),new Jt(t.queryParams),new Jt(t.fragment),new Jt(t.data),t.outlet,t.component,t)}var AB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},cU="ngNavigationCancelingError";function Zm(t,e){let{redirectTo:A,navigationBehaviorOptions:i}=qd(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=CU(!1,jr.Redirect);return n.url=A,n.navigationBehaviorOptions=i,n}function CU(t,e){let A=new Error(`NavigationCancelingError: ${t||""}`);return A[cU]=!0,A.cancellationCode=e,A}function igA(t){return IU(t)&&qd(t.url)}function IU(t){return!!t&&t[cU]}var gb=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,i,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,i,e),X7(this.futureState.root),this.activateChildRoutes(A,i,e)}deactivateChildRoutes(e,A,i){let n=Od(A);e.children.forEach(o=>{let a=o.value.outlet;this.deactivateRoutes(o,n[a],i),delete n[a]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let a=i.getContext(n.outlet);a&&this.deactivateChildRoutes(e,A,a.children)}else this.deactivateChildRoutes(e,A,i);else o&&this.deactivateRouteAndItsChildren(A,i)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=Od(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);if(i&&i.outlet){let a=i.outlet.detach(),r=i.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:a,route:e,contexts:r})}}deactivateRouteAndOutlet(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=Od(e);for(let a of Object.values(o))this.deactivateRouteAndItsChildren(a,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(e,A,i){let n=Od(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new qm(o.value.snapshot))}),e.children.length&&this.forwardEvent(new Pm(e.value.snapshot))}activateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(X7(n),n===o)if(n.component){let a=i.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,a.children)}else this.activateChildRoutes(e,A,i);else if(n.component){let a=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let r=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),a.children.onOutletReAttached(r.contexts),a.attachRef=r.componentRef,a.route=r.route.value,a.outlet&&a.outlet.attach(r.componentRef,r.route.value),X7(r.route.value),this.activateChildRoutes(e,null,a.children)}else a.attachRef=null,a.route=n,a.outlet&&a.outlet.activateWith(n,a.injector),this.activateChildRoutes(e,null,a.children)}else this.activateChildRoutes(e,null,i)}},Xm=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},jd=class{component;route;constructor(e,A){this.component=e,this.route=A}};function ngA(t,e,A){let i=t._root,n=e?e._root:null;return Kh(i,n,A,[i.value])}function ogA(t){let e=t.routeConfig?t.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:t,guards:e}}function tB(t,e){let A=Symbol(),i=e.get(t,A);return i===A?typeof t=="function"&&!rL(t)?t:e.get(t):i}function Kh(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=Od(e);return t.children.forEach(a=>{agA(a,o[a.value.outlet],A,i.concat([a.value]),n),delete o[a.value.outlet]}),Object.entries(o).forEach(([a,r])=>Jh(r,A.getContext(a),n)),n}function agA(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,a=e?e.value:null,r=A?A.getContext(t.value.outlet):null;if(a&&o.routeConfig===a.routeConfig){let s=rgA(a,o,o.routeConfig.runGuardsAndResolvers);s?n.canActivateChecks.push(new Xm(i)):(o.data=a.data,o._resolvedData=a._resolvedData),o.component?Kh(t,e,r?r.children:null,i,n):Kh(t,e,A,i,n),s&&r&&r.outlet&&r.outlet.isActivated&&n.canDeactivateChecks.push(new jd(r.outlet.component,a))}else a&&Jh(e,r,n),n.canActivateChecks.push(new Xm(i)),o.component?Kh(t,null,r?r.children:null,i,n):Kh(t,null,A,i,n);return n}function rgA(t,e,A){if(typeof A=="function")return Ya(e._environmentInjector,()=>A(t,e));switch(A){case"pathParamsChange":return!OI(t.url,e.url);case"pathParamsOrQueryParamsChange":return!OI(t.url,e.url)||!xc(t.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!rb(t,e)||!xc(t.queryParams,e.queryParams);default:return!rb(t,e)}}function Jh(t,e,A){let i=Od(t),n=t.value;Object.entries(i).forEach(([o,a])=>{n.component?e?Jh(a,e.children.getContext(o),A):Jh(a,null,A):Jh(a,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new jd(e.outlet.component,n)):A.canDeactivateChecks.push(new jd(null,n)):A.canDeactivateChecks.push(new jd(null,n))}function Wh(t){return typeof t=="function"}function sgA(t){return typeof t=="boolean"}function ggA(t){return t&&Wh(t.canLoad)}function lgA(t){return t&&Wh(t.canActivate)}function cgA(t){return t&&Wh(t.canActivateChild)}function CgA(t){return t&&Wh(t.canDeactivate)}function IgA(t){return t&&Wh(t.canMatch)}function dU(t){return t instanceof eL||t?.name==="EmptyError"}var Rm=Symbol("INITIAL_VALUE");function eB(){return Ei(t=>Va(t.map(e=>e.pipe(qn(1),nn(Rm)))).pipe(fe(e=>{for(let A of e)if(A!==!0){if(A===Rm)return Rm;if(A===!1||dgA(A))return A}return!0}),We(e=>e!==Rm),qn(1)))}function dgA(t){return qd(t)||t instanceof AB}function BU(t){return t.aborted?oe(void 0).pipe(qn(1)):new Ti(e=>{let A=()=>{e.next(),e.complete()};return t.addEventListener("abort",A),()=>t.removeEventListener("abort",A)})}function QU(t){return Bt(BU(t))}function BgA(t){return uc(e=>{let{targetSnapshot:A,currentSnapshot:i,guards:{canActivateChecks:n,canDeactivateChecks:o}}=e;return o.length===0&&n.length===0?oe(Ve(BA({},e),{guardsResult:!0})):QgA(o,A,i).pipe(uc(a=>a&&sgA(a)?EgA(A,n,t):oe(a)),fe(a=>Ve(BA({},e),{guardsResult:a})))})}function QgA(t,e,A){return mr(t).pipe(uc(i=>pgA(i.component,i.route,A,e)),po(i=>i!==!0,!0))}function EgA(t,e,A){return mr(e).pipe(qE(i=>lf(ugA(i.route.parent,A),hgA(i.route,A),mgA(t,i.path),fgA(t,i.route))),po(i=>i!==!0,!0))}function hgA(t,e){return t!==null&&e&&e(new jm(t)),oe(!0)}function ugA(t,e){return t!==null&&e&&e(new zm(t)),oe(!0)}function fgA(t,e){let A=e.routeConfig?e.routeConfig.canActivate:null;if(!A||A.length===0)return oe(!0);let i=A.map(n=>fc(()=>{let o=e._environmentInjector,a=tB(n,o),r=lgA(a)?a.canActivate(e,t):Ya(o,()=>a(e,t));return jI(r).pipe(po())}));return oe(i).pipe(eB())}function mgA(t,e){let A=e[e.length-1],n=e.slice(0,e.length-1).reverse().map(o=>ogA(o)).filter(o=>o!==null).map(o=>fc(()=>{let a=o.guards.map(r=>{let s=o.node._environmentInjector,g=tB(r,s),l=cgA(g)?g.canActivateChild(A,t):Ya(s,()=>g(A,t));return jI(l).pipe(po())});return oe(a).pipe(eB())}));return oe(n).pipe(eB())}function pgA(t,e,A,i){let n=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!n||n.length===0)return oe(!0);let o=n.map(a=>{let r=e._environmentInjector,s=tB(a,r),g=CgA(s)?s.canDeactivate(t,e,A,i):Ya(r,()=>s(t,e,A,i));return jI(g).pipe(po())});return oe(o).pipe(eB())}function DgA(t,e,A,i,n){let o=e.canLoad;if(o===void 0||o.length===0)return oe(!0);let a=o.map(r=>{let s=tB(r,t),g=ggA(s)?s.canLoad(e,A):Ya(t,()=>s(e,A)),l=jI(g);return n?l.pipe(QU(n)):l});return oe(a).pipe(eB(),EU(i))}function EU(t){return XF(Wt(e=>{if(typeof e!="boolean")throw Zm(t,e)}),fe(e=>e===!0))}function wgA(t,e,A,i,n,o){let a=e.canMatch;if(!a||a.length===0)return oe(!0);let r=a.map(s=>{let g=tB(s,t),l=IgA(g)?g.canMatch(e,A,n):Ya(t,()=>g(e,A,n));return jI(l).pipe(QU(o))});return oe(r).pipe(eB(),EU(i))}var k0=class t extends Error{segmentGroup;constructor(e){super(),this.segmentGroup=e||null,Object.setPrototypeOf(this,t.prototype)}},jh=class t extends Error{urlTree;constructor(e){super(),this.urlTree=e,Object.setPrototypeOf(this,t.prototype)}};function ygA(t){throw new wt(4e3,!1)}function vgA(t){throw CU(!1,jr.GuardRejected)}var lb=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){return ct(this,null,function*(){let i=[],n=A.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return i;if(n.numberOfChildren>1||!n.children[Di])throw ygA(`${e.redirectTo}`);n=n.children[Di]}})}applyRedirectCommands(e,A,i,n,o){return ct(this,null,function*(){let a=yield bgA(A,n,o);if(a instanceof Gg)throw new jh(a);let r=this.applyRedirectCreateUrlTree(a,this.urlSerializer.parse(a),e,i);if(a[0]==="/")throw new jh(r);return r})}applyRedirectCreateUrlTree(e,A,i,n){let o=this.createSegmentGroup(e,A.root,i,n);return new Gg(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let i={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let r=o.substring(1);i[n]=A[r]}else i[n]=o}),i}createSegmentGroup(e,A,i,n){let o=this.createSegments(e,A.segments,i,n),a={};return Object.entries(A.children).forEach(([r,s])=>{a[r]=this.createSegmentGroup(e,s,i,n)}),new Wn(o,a)}createSegments(e,A,i,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,i))}findPosParam(e,A,i){let n=i[A.path.substring(1)];if(!n)throw new wt(4001,!1);return n}findOrReturn(e,A){let i=0;for(let n of A){if(n.path===e.path)return A.splice(i),n;i++}return e}};function bgA(t,e,A){if(typeof t=="string")return Promise.resolve(t);let i=t;return _m(jI(Ya(A,()=>i(e))))}function MgA(t,e){return t.providers&&!t._injector&&(t._injector=uf(t.providers,e,`Route: ${t.path}`)),t._injector??e}function Rc(t){return t.outlet||Di}function kgA(t,e){let A=t.filter(i=>Rc(i)===e);return A.push(...t.filter(i=>Rc(i)!==e)),A}var cb={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function hU(t){return{routeConfig:t.routeConfig,url:t.url,params:t.params,queryParams:t.queryParams,fragment:t.fragment,data:t.data,outlet:t.outlet,title:t.title,paramMap:t.paramMap,queryParamMap:t.queryParamMap}}function SgA(t,e,A,i,n,o,a){let r=uU(t,e,A);if(!r.matched)return oe(r);let s=hU(o(r));return i=MgA(e,i),wgA(i,e,A,n,s,a).pipe(fe(g=>g===!0?r:BA({},cb)))}function uU(t,e,A){if(e.path==="")return e.pathMatch==="full"&&(t.hasChildren()||A.length>0)?BA({},cb):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||TK)(A,t,e);if(!n)return BA({},cb);let o={};Object.entries(n.posParams??{}).forEach(([r,s])=>{o[r]=s.path});let a=n.consumed.length>0?BA(BA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:a,positionalParamSegments:n.posParams??{}}}function YK(t,e,A,i){return A.length>0&&NgA(t,A,i)?{segmentGroup:new Wn(e,RgA(i,new Wn(A,t.children))),slicedSegments:[]}:A.length===0&&FgA(t,A,i)?{segmentGroup:new Wn(t.segments,xgA(t,A,i,t.children)),slicedSegments:A}:{segmentGroup:new Wn(t.segments,t.children),slicedSegments:A}}function xgA(t,e,A,i){let n={};for(let o of A)if(Ap(t,e,o)&&!i[Rc(o)]){let a=new Wn([],{});n[Rc(o)]=a}return BA(BA({},i),n)}function RgA(t,e){let A={};A[Di]=e;for(let i of t)if(i.path===""&&Rc(i)!==Di){let n=new Wn([],{});A[Rc(i)]=n}return A}function NgA(t,e,A){return A.some(i=>Ap(t,e,i)&&Rc(i)!==Di)}function FgA(t,e,A){return A.some(i=>Ap(t,e,i))}function Ap(t,e,A){return(t.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function LgA(t,e,A){return e.length===0&&!t.children[A]}var Cb=class{};function _gA(t,e,A,i,n,o,a="emptyOnly",r){return ct(this,null,function*(){return new Ib(t,e,A,i,n,a,o,r).recognize()})}var GgA=31,Ib=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;abortSignal;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,i,n,o,a,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=a,this.urlSerializer=r,this.abortSignal=s,this.applyRedirects=new lb(this.urlSerializer,this.urlTree)}noMatchError(e){return new wt(4002,`'${e.segmentGroup}'`)}recognize(){return ct(this,null,function*(){let e=YK(this.urlTree.root,[],[],this.config).segmentGroup,{children:A,rootSnapshot:i}=yield this.match(e),n=new lg(i,A),o=new zh("",n),a=eU(i,[],this.urlTree.queryParams,this.urlTree.fragment);return a.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(a),{state:o,tree:a}})}match(e){return ct(this,null,function*(){let A=new $d([],Object.freeze({}),Object.freeze(BA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Di,this.rootComponentType,null,{},this.injector);try{return{children:yield this.processSegmentGroup(this.injector,this.config,e,Di,A),rootSnapshot:A}}catch(i){if(i instanceof jh)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof k0?this.noMatchError(i):i}})}processSegmentGroup(e,A,i,n,o){return ct(this,null,function*(){if(i.segments.length===0&&i.hasChildren())return this.processChildren(e,A,i,o);let a=yield this.processSegment(e,A,i,i.segments,n,!0,o);return a instanceof lg?[a]:[]})}processChildren(e,A,i,n){return ct(this,null,function*(){let o=[];for(let s of Object.keys(i.children))s==="primary"?o.unshift(s):o.push(s);let a=[];for(let s of o){let g=i.children[s],l=kgA(A,s),C=yield this.processSegmentGroup(e,l,g,s,n);a.push(...C)}let r=fU(a);return KgA(r),r})}processSegment(e,A,i,n,o,a,r){return ct(this,null,function*(){for(let s of A)try{return yield this.processSegmentAgainstRoute(s._injector??e,A,s,i,n,o,a,r)}catch(g){if(g instanceof k0||dU(g))continue;throw g}if(LgA(i,n,o))return new Cb;throw new k0(i)})}processSegmentAgainstRoute(e,A,i,n,o,a,r,s){return ct(this,null,function*(){if(Rc(i)!==a&&(a===Di||!Ap(n,o,i)))throw new k0(n);if(i.redirectTo===void 0)return this.matchSegmentAgainstRoute(e,n,i,o,a,s);if(this.allowRedirects&&r)return this.expandSegmentAgainstRouteUsingRedirect(e,n,A,i,o,a,s);throw new k0(n)})}expandSegmentAgainstRouteUsingRedirect(e,A,i,n,o,a,r){return ct(this,null,function*(){let{matched:s,parameters:g,consumedSegments:l,positionalParamSegments:C,remainingSegments:I}=uU(A,n,o);if(!s)throw new k0(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>GgA&&(this.allowRedirects=!1));let d=this.createSnapshot(e,n,o,g,r);if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let B=yield this.applyRedirects.applyRedirectCommands(l,n.redirectTo,C,hU(d),e),Q=yield this.applyRedirects.lineralizeSegments(n,B);return this.processSegment(e,i,A,Q.concat(I),a,!1,r)})}createSnapshot(e,A,i,n,o){let a=new $d(i,n,Object.freeze(BA({},this.urlTree.queryParams)),this.urlTree.fragment,JgA(A),Rc(A),A.component??A._loadedComponent??null,A,YgA(A),e),r=db(a,o,this.paramsInheritanceStrategy);return a.params=Object.freeze(r.params),a.data=Object.freeze(r.data),a}matchSegmentAgainstRoute(e,A,i,n,o,a){return ct(this,null,function*(){if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);let r=R=>this.createSnapshot(e,i,R.consumedSegments,R.parameters,a),s=yield _m(SgA(A,i,n,e,this.urlSerializer,r,this.abortSignal));if(i.path==="**"&&(A.children={}),!s?.matched)throw new k0(A);e=i._injector??e;let{routes:g}=yield this.getChildConfig(e,i,n),l=i._loadedInjector??e,{parameters:C,consumedSegments:I,remainingSegments:d}=s,B=this.createSnapshot(e,i,I,C,a),{segmentGroup:Q,slicedSegments:E}=YK(A,I,d,g);if(E.length===0&&Q.hasChildren()){let R=yield this.processChildren(l,g,Q,B);return new lg(B,R)}if(g.length===0&&E.length===0)return new lg(B,[]);let f=Rc(i)===o,b=yield this.processSegment(l,g,Q,E,f?Di:o,!0,B);return new lg(B,b instanceof lg?[b]:[])})}getChildConfig(e,A,i){return ct(this,null,function*(){if(A.children)return{routes:A.children,injector:e};if(A.loadChildren){if(A._loadedRoutes!==void 0){let o=A._loadedNgModuleFactory;return o&&!A._loadedInjector&&(A._loadedInjector=o.create(e).injector),{routes:A._loadedRoutes,injector:A._loadedInjector}}if(this.abortSignal.aborted)throw new Error(this.abortSignal.reason);if(yield _m(DgA(e,A,i,this.urlSerializer,this.abortSignal))){let o=yield this.configLoader.loadChildren(e,A);return A._loadedRoutes=o.routes,A._loadedInjector=o.injector,A._loadedNgModuleFactory=o.factory,o}throw vgA(A)}return{routes:[],injector:e}})}};function KgA(t){t.sort((e,A)=>e.value.outlet===Di?-1:A.value.outlet===Di?1:e.value.outlet.localeCompare(A.value.outlet))}function UgA(t){let e=t.value.routeConfig;return e&&e.path===""}function fU(t){let e=[],A=new Set;for(let i of t){if(!UgA(i)){e.push(i);continue}let n=e.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),A.add(n)):e.push(i)}for(let i of A){let n=fU(i.children);e.push(new lg(i.value,n))}return e.filter(i=>!A.has(i))}function JgA(t){return t.data||{}}function YgA(t){return t.resolve||{}}function HgA(t,e,A,i,n,o,a){return uc(r=>ct(null,null,function*(){let{state:s,tree:g}=yield _gA(t,e,A,i,r.extractedUrl,n,o,a);return Ve(BA({},r),{targetSnapshot:s,urlAfterRedirects:g})}))}function TgA(t){return uc(e=>{let{targetSnapshot:A,guards:{canActivateChecks:i}}=e;if(!i.length)return oe(e);let n=new Set(i.map(r=>r.route)),o=new Set;for(let r of n)if(!o.has(r))for(let s of mU(r))o.add(s);let a=0;return mr(o).pipe(qE(r=>n.has(r)?OgA(r,A,t):(r.data=db(r,r.parent,t).resolve,oe(void 0))),Wt(()=>a++),Bv(1),uc(r=>a===o.size?oe(e):xa))})}function mU(t){let e=t.children.map(A=>mU(A)).flat();return[t,...e]}function OgA(t,e,A){let i=t.routeConfig,n=t._resolve;return i?.title!==void 0&&!gU(i)&&(n[qh]=i.title),fc(()=>(t.data=db(t,t.parent,A).resolve,zgA(n,t,e).pipe(fe(o=>(t._resolvedData=o,t.data=BA(BA({},t.data),o),null)))))}function zgA(t,e,A){let i=Ab(t);if(i.length===0)return oe({});let n={};return mr(i).pipe(uc(o=>PgA(t[o],e,A).pipe(po(),Wt(a=>{if(a instanceof AB)throw Zm(new S0,a);n[o]=a}))),Bv(1),fe(()=>n),Ho(o=>dU(o)?xa:gf(o)))}function PgA(t,e,A){let i=e._environmentInjector,n=tB(t,i),o=n.resolve?n.resolve(e,A):Ya(i,()=>n(e,A));return jI(o)}function HK(t){return Ei(e=>{let A=t(e);return A?mr(A).pipe(fe(()=>e)):oe(e)})}var fb=(()=>{class t{buildTitle(A){let i,n=A.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Di);return i}getResolvedTitleForRoute(A){return A.data[qh]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:()=>h(pU),providedIn:"root"})}return t})(),pU=(()=>{class t extends fb{title;constructor(A){super(),this.title=A}updateTitle(A){let i=this.buildTitle(A);i!==void 0&&this.title.setTitle(i)}static \u0275fac=function(i){return new(i||t)(Do(FL))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),WI=new wA("",{factory:()=>({})}),iB=new wA(""),ep=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=h(uL);loadComponent(A,i){return ct(this,null,function*(){if(this.componentLoaders.get(i))return this.componentLoaders.get(i);if(i._loadedComponent)return Promise.resolve(i._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(i);let n=ct(this,null,function*(){try{let o=yield zK(Ya(A,()=>i.loadComponent())),a=yield yU(wU(o));return this.onLoadEndListener&&this.onLoadEndListener(i),i._loadedComponent=a,a}finally{this.componentLoaders.delete(i)}});return this.componentLoaders.set(i,n),n})}loadChildren(A,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return Promise.resolve({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let n=ct(this,null,function*(){try{let o=yield DU(i,this.compiler,A,this.onLoadEndListener);return i._loadedRoutes=o.routes,i._loadedInjector=o.injector,i._loadedNgModuleFactory=o.factory,o}finally{this.childrenLoaders.delete(i)}});return this.childrenLoaders.set(i,n),n}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function DU(t,e,A,i){return ct(this,null,function*(){let n=yield zK(Ya(A,()=>t.loadChildren())),o=yield yU(wU(n)),a;o instanceof IL||Array.isArray(o)?a=o:a=yield e.compileModuleAsync(o),i&&i(t);let r,s,g=!1,l;return Array.isArray(a)?(s=a,g=!0):(r=a.create(A).injector,l=a,s=r.get(iB,[],{optional:!0,self:!0}).flat()),{routes:s.map(ub),injector:r,factory:l}})}function jgA(t){return t&&typeof t=="object"&&"default"in t}function wU(t){return jgA(t)?t.default:t}function yU(t){return ct(this,null,function*(){return t})}var tp=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:()=>h(qgA),providedIn:"root"})}return t})(),qgA=(()=>{class t{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,i){return A}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),mb=new wA(""),pb=new wA("");function vU(t,e,A){let i=t.get(pb),n=t.get(Zt);if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(g=>setTimeout(g));let o,a=new Promise(g=>{o=g}),r=n.startViewTransition(()=>(o(),VgA(t)));r.updateCallbackDone.catch(g=>{}),r.ready.catch(g=>{}),r.finished.catch(g=>{});let{onViewTransitionCreated:s}=i;return s&&Ya(t,()=>s({transition:r,from:e,to:A})),a}function VgA(t){return new Promise(e=>{Nn({read:()=>setTimeout(e)},{injector:t})})}var WgA=()=>{},Db=new wA(""),ip=(()=>{class t{currentNavigation=jA(null,{equal:()=>!1});currentTransition=null;lastSuccessfulNavigation=jA(null);events=new $A;transitionAbortWithErrorSubject=new $A;configLoader=h(ep);environmentInjector=h(pr);destroyRef=h(Wa);urlSerializer=h(qI);rootContexts=h(VI);location=h(wc);inputBindingEnabled=h(Vh,{optional:!0})!==null;titleStrategy=h(fb);options=h(WI,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=h(tp);createViewTransition=h(mb,{optional:!0});navigationErrorHandler=h(Db,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>oe(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new Tm(n)),i=n=>this.events.next(new Om(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let i=++this.navigationId;Zo(()=>{this.transitions?.next(Ve(BA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i,routesRecognizeHandler:{},beforeActivateHandler:{}}))})}setupNavigations(A){return this.transitions=new Jt(null),this.transitions.pipe(We(i=>i!==null),Ei(i=>{let n=!1,o=new AbortController,a=()=>!n&&this.currentTransition?.id===i.id;return oe(i).pipe(Ei(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,"",jr.SupersededByNewNavigation),xa;this.currentTransition=i;let s=this.lastSuccessfulNavigation();this.currentNavigation.set({id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:s?Ve(BA({},s),{previousNavigation:null}):null,abort:()=>o.abort(),routesRecognizeHandler:r.routesRecognizeHandler,beforeActivateHandler:r.beforeActivateHandler});let g=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),l=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!g&&l!=="reload")return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.rawUrl),"",Vd.IgnoredSameUrlNavigation)),r.resolve(!1),xa;if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return oe(r).pipe(Ei(C=>(this.events.next(new zC(C.id,this.urlSerializer.serialize(C.extractedUrl),C.source,C.restoredState)),C.id!==this.navigationId?xa:Promise.resolve(C))),HgA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy,o.signal),Wt(C=>{i.targetSnapshot=C.targetSnapshot,i.urlAfterRedirects=C.urlAfterRedirects,this.currentNavigation.update(I=>(I.finalUrl=C.urlAfterRedirects,I)),this.events.next(new Th)}),Ei(C=>mr(i.routesRecognizeHandler.deferredHandle??oe(void 0)).pipe(fe(()=>C))),Wt(()=>{let C=new Hh(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)}));if(g&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:C,extractedUrl:I,source:d,restoredState:B,extras:Q}=r,E=new zC(C,this.urlSerializer.serialize(I),d,B);this.events.next(E);let f=rU(this.rootComponentType,this.environmentInjector).snapshot;return this.currentTransition=i=Ve(BA({},r),{targetSnapshot:f,urlAfterRedirects:I,extras:Ve(BA({},Q),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.update(b=>(b.finalUrl=I,b)),oe(i)}else return this.events.next(new Nc(r.id,this.urlSerializer.serialize(r.extractedUrl),"",Vd.IgnoredByUrlHandlingStrategy)),r.resolve(!1),xa}),fe(r=>{let s=new Um(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);return this.events.next(s),this.currentTransition=i=Ve(BA({},r),{guards:ngA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i}),BgA(r=>this.events.next(r)),Ei(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw Zm(this.urlSerializer,r.guardsResult);let s=new Jm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);if(this.events.next(s),!a())return xa;if(!r.guardsResult)return this.cancelNavigationTransition(r,"",jr.GuardRejected),xa;if(r.guards.canActivateChecks.length===0)return oe(r);let g=new Ym(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);if(this.events.next(g),!a())return xa;let l=!1;return oe(r).pipe(TgA(this.paramsInheritanceStrategy),Wt({next:()=>{l=!0;let C=new Hm(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(C)},complete:()=>{l||this.cancelNavigationTransition(r,"",jr.NoDataFromResolver)}}))}),HK(r=>{let s=l=>{let C=[];if(l.routeConfig?._loadedComponent)l.component=l.routeConfig?._loadedComponent;else if(l.routeConfig?.loadComponent){let I=l._environmentInjector;C.push(this.configLoader.loadComponent(I,l.routeConfig).then(d=>{l.component=d}))}for(let I of l.children)C.push(...s(I));return C},g=s(r.targetSnapshot.root);return g.length===0?oe(r):mr(Promise.all(g).then(()=>r))}),HK(()=>this.afterPreactivation()),Ei(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,g=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return g?mr(g).pipe(fe(()=>i)):oe(i)}),qn(1),Ei(r=>{let s=AgA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);this.currentTransition=i=r=Ve(BA({},r),{targetRouterState:s}),this.currentNavigation.update(l=>(l.targetRouterState=s,l)),this.events.next(new Zd);let g=i.beforeActivateHandler.deferredHandle;return g?mr(g.then(()=>r)):oe(r)}),Wt(r=>{new gb(A.routeReuseStrategy,i.targetRouterState,i.currentRouterState,s=>this.events.next(s),this.inputBindingEnabled).activate(this.rootContexts),a()&&(n=!0,this.currentNavigation.update(s=>(s.abort=WgA,s)),this.lastSuccessfulNavigation.set(Zo(this.currentNavigation)),this.events.next(new Ml(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0))}),Bt(BU(o.signal).pipe(We(()=>!n&&!i.targetRouterState),Wt(()=>{this.cancelNavigationTransition(i,o.signal.reason+"",jr.Aborted)}))),Wt({complete:()=>{n=!0}}),Bt(this.transitionAbortWithErrorSubject.pipe(Wt(r=>{throw r}))),If(()=>{o.abort(),n||this.cancelNavigationTransition(i,"",jr.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation.set(null),this.currentTransition=null)}),Ho(r=>{if(n=!0,this.destroyed)return i.resolve(!1),xa;if(IU(r))this.events.next(new _g(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),igA(r)?this.events.next(new Xd(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new PI(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let g=Ya(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(g instanceof AB){let{message:l,cancellationCode:C}=Zm(this.urlSerializer,g);this.events.next(new _g(i.id,this.urlSerializer.serialize(i.extractedUrl),l,C)),this.events.next(new Xd(g.redirectTo,g.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(g){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(g)}}return xa}))}))}cancelNavigationTransition(A,i,n){let o=new _g(A.id,this.urlSerializer.serialize(A.extractedUrl),i,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=Zo(this.currentNavigation),n=i?.targetBrowserUrl??i?.extractedUrl;return A.toString()!==n?.toString()&&!i?.extras.skipLocationChange}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function ZgA(t){return t!==Pd}var bU=new wA("");var MU=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:()=>h(XgA),providedIn:"root"})}return t})(),$m=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}shouldDestroyInjector(e){return!0}},XgA=(()=>{class t extends $m{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),wb=(()=>{class t{urlSerializer=h(qI);options=h(WI,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=h(wc);urlHandlingStrategy=h(tp);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new Gg;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:i,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,i):i,a=n??o;return a instanceof Gg?this.urlSerializer.serialize(a):a}commitTransition({targetRouterState:A,finalUrl:i,initialUrl:n}){i&&A?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=A):this.rawUrlTree=n}routerState=rU(null,h(pr));getRouterState(){return this.routerState}_stateMemento=this.createStateMemento();get stateMemento(){return this._stateMemento}updateStateMemento(){this._stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}restoredState(){return this.location.getState()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:()=>h($gA),providedIn:"root"})}return t})(),$gA=(()=>{class t extends wb{currentPageId=0;lastSuccessfulId=-1;get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(i=>{i.type==="popstate"&&setTimeout(()=>{A(i.url,i.state,"popstate",{replaceUrl:!0})})})}handleRouterEvent(A,i){A instanceof zC?this.updateStateMemento():A instanceof Nc?this.commitTransition(i):A instanceof Hh?this.urlUpdateStrategy==="eager"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof Zd?(this.commitTransition(i),this.urlUpdateStrategy==="deferred"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof _g&&!aU(A)?this.restoreHistory(i):A instanceof PI?this.restoreHistory(i,!0):A instanceof Ml&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:i,id:n}){let{replaceUrl:o,state:a}=i;if(this.location.isCurrentPathEqualTo(A)||o){let r=this.browserPageId,s=BA(BA({},a),this.generateNgRouterState(n,r));this.location.replaceState(A,"",s)}else{let r=BA(BA({},a),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",r)}}restoreHistory(A,i=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(i&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,i){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:i}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function np(t,e){t.events.pipe(We(A=>A instanceof Ml||A instanceof _g||A instanceof PI||A instanceof Nc),fe(A=>A instanceof Ml||A instanceof Nc?0:(A instanceof _g?A.code===jr.Redirect||A.code===jr.SupersededByNewNavigation:!1)?2:1),We(A=>A!==2),qn(1)).subscribe(()=>{e()})}var qr=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=h(dL);stateManager=h(wb);options=h(WI,{optional:!0})||{};pendingTasks=h(lL);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=h(ip);urlSerializer=h(qI);location=h(wc);urlHandlingStrategy=h(tp);injector=h(pr);_events=new $A;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=h(MU);injectorCleanup=h(bU,{optional:!0});onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=h(iB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!h(Vh,{optional:!0});currentNavigation=this.navigationTransitions.currentNavigation.asReadonly();constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{}}),this.subscribeToNavigationEvents()}eventsSubscription=new Rn;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=Zo(this.navigationTransitions.currentNavigation);if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof _g&&i.code!==jr.Redirect&&i.code!==jr.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof Ml)this.navigated=!0,this.injectorCleanup?.(this.routeReuseStrategy,this.routerState,this.config);else if(i instanceof Xd){let a=i.navigationBehaviorOptions,r=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),s=BA({scroll:n.extras.scroll,browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||ZgA(n.source)},a);this.scheduleNavigation(r,Pd,null,s,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}XsA(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortWithErrorSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),Pd,this.stateManager.restoredState(),{replaceUrl:!0})}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,i,n,o)=>{this.navigateToSyncWithBrowser(A,n,i,o)})}navigateToSyncWithBrowser(A,i,n,o){let a=n?.navigationId?n:null;if(n){let s=BA({},n);delete s.navigationId,delete s.\u0275routerPageId,Object.keys(s).length!==0&&(o.state=s)}let r=this.parseUrl(A);this.scheduleNavigation(r,i,a,o).catch(s=>{this.disposed||this.injector.get(Qv)(s)})}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return Zo(this.navigationTransitions.currentNavigation)}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(ub),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription?.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0,this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,i={}){let{relativeTo:n,queryParams:o,fragment:a,queryParamsHandling:r,preserveFragment:s}=i,g=s?this.currentUrlTree.fragment:a,l=null;switch(r??this.options.defaultQueryParamsHandling){case"merge":l=BA(BA({},this.currentUrlTree.queryParams),o);break;case"preserve":l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let C;try{let I=n?n.snapshot:this.routerState.snapshot.root;C=tU(I)}catch(I){(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),C=this.currentUrlTree.root}return iU(C,A,l,g??null,this.urlSerializer)}navigateByUrl(A,i={skipLocationChange:!1}){let n=qd(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,Pd,null,i)}navigate(A,i={skipLocationChange:!1}){return AlA(A),this.navigateByUrl(this.createUrlTree(A,i),i)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch(i){return this.console.warn(aL(4018,!1)),this.urlSerializer.parse("/")}}isActive(A,i){let n;if(i===!0?n=BA({},jK):i===!1?n=BA({},eb):n=BA(BA({},eb),i),qd(A))return _K(this.currentUrlTree,A,n);let o=this.parseUrl(A);return _K(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(A,i,n,o,a){if(this.disposed)return Promise.resolve(!1);let r,s,g;a?(r=a.resolve,s=a.reject,g=a.promise):g=new Promise((C,I)=>{r=C,s=I});let l=this.pendingTasks.add();return np(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(l))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:r,reject:s,promise:g,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),g.catch(Promise.reject.bind(Promise))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function AlA(t){for(let e=0;e{class t{router;injector;preloadingStrategy;loader;subscription;constructor(A,i,n,o){this.router=A,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(We(A=>A instanceof Ml),qE(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription?.unsubscribe()}processRoutes(A,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=uf(o.providers,A,""));let a=o._injector??A;o._loadedNgModuleFactory&&!o._loadedInjector&&(o._loadedInjector=o._loadedNgModuleFactory.create(a).injector);let r=o._loadedInjector??a;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(a,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(r,o.children??o._loadedRoutes))}return mr(n).pipe(dv())}preloadConfig(A,i){return this.preloadingStrategy.preload(i,()=>{if(A.destroyed)return oe(null);let n;i.loadChildren&&i.canLoad===void 0?n=mr(this.loader.loadChildren(A,i)):n=oe(null);let o=n.pipe(uc(a=>a===null?oe(void 0):(i._loadedRoutes=a.routes,i._loadedInjector=a.injector,i._loadedNgModuleFactory=a.factory,this.processRoutes(a.injector??A,a.routes))));if(i.loadComponent&&!i._loadedComponent){let a=this.loader.loadComponent(A,i);return mr([o,a]).pipe(dv())}else return o})}static \u0275fac=function(i){return new(i||t)(Do(qr),Do(pr),Do(Zh),Do(ep))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),SU=new wA(""),tlA=(()=>{class t{options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource=Pd;restoredId=0;store={};urlSerializer=h(qI);zone=h(Oe);viewportScroller=h(mv);transitions=h(ip);constructor(A){this.options=A,this.options.scrollPositionRestoration||="disabled",this.options.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof zC?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof Ml?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof Nc&&A.code===Vd.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{if(!(A instanceof Wd)||A.scrollBehavior==="manual")return;let i={behavior:"instant"};A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0],i):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position,i):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0])})}scheduleScrollEvent(A,i){let n=Zo(this.transitions.currentNavigation)?.extras.scroll;this.zone.runOutsideAngular(()=>ct(this,null,function*(){yield new Promise(o=>{setTimeout(o),typeof requestAnimationFrame<"u"&&requestAnimationFrame(o)}),this.zone.run(()=>{this.transitions.events.next(new Wd(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,i,n))})}))}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(i){hf()};static \u0275prov=TA({token:t,factory:t.\u0275fac})}return t})();function ilA(){return h(qr).routerState.root}function Xh(t,e){return{\u0275kind:t,\u0275providers:e}}function nlA(){let t=h(ut);return e=>{let A=t.get(p0);if(e!==A.components[0])return;let i=t.get(qr),n=t.get(xU);t.get(vb)===1&&i.initialNavigation(),t.get(FU,null,{optional:!0})?.setUpPreloading(),t.get(SU,null,{optional:!0})?.init(),i.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var xU=new wA("",{factory:()=>new $A}),vb=new wA("",{factory:()=>1});function RU(){let t=[{provide:CL,useValue:!0},{provide:vb,useValue:0},hv(()=>{let e=h(ut);return e.get(bL,Promise.resolve()).then(()=>new Promise(i=>{let n=e.get(qr),o=e.get(xU);np(n,()=>{i(!0)}),e.get(ip).afterPreactivation=()=>(i(!0),o.closed?oe(void 0):o),n.initialNavigation()}))})];return Xh(2,t)}function NU(){let t=[hv(()=>{h(qr).setUpLocationChangeListener()}),{provide:vb,useValue:2}];return Xh(3,t)}var FU=new wA("");function LU(t){return Xh(0,[{provide:FU,useExisting:kU},{provide:Zh,useExisting:t}])}function _U(){return Xh(8,[Eb,{provide:Vh,useExisting:Eb}])}function GU(t){Ef("NgRouterViewTransitions");let e=[{provide:mb,useValue:vU},{provide:pb,useValue:BA({skipNextTransition:!!t?.skipInitialTransition},t)}];return Xh(9,e)}var KU=[wc,{provide:qI,useClass:S0},qr,VI,{provide:_s,useFactory:ilA},ep,[]],op=(()=>{class t{constructor(){}static forRoot(A,i){return{ngModule:t,providers:[KU,[],{provide:iB,multi:!0,useValue:A},[],i?.errorHandler?{provide:Db,useValue:i.errorHandler}:[],{provide:WI,useValue:i||{}},i?.useHash?alA():rlA(),olA(),i?.preloadingStrategy?LU(i.preloadingStrategy).\u0275providers:[],i?.initialNavigation?slA(i):[],i?.bindToComponentInputs?_U().\u0275providers:[],i?.enableViewTransitions?GU().\u0275providers:[],glA()]}}static forChild(A){return{ngModule:t,providers:[{provide:iB,multi:!0,useValue:A}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();function olA(){return{provide:SU,useFactory:()=>{let t=h(mv),e=h(WI);return e.scrollOffset&&t.setOffset(e.scrollOffset),new tlA(e)}}}function alA(){return{provide:fv,useClass:kL}}function rlA(){return{provide:fv,useClass:ML}}function slA(t){return[t.initialNavigation==="disabled"?NU().\u0275providers:[],t.initialNavigation==="enabledBlocking"?RU().\u0275providers:[]]}var yb=new wA("");function glA(){return[{provide:yb,useFactory:nlA},{provide:BL,multi:!0,useExisting:yb}]}var ClA=["*"];var IlA=new wA("MAT_CARD_CONFIG"),nB=(()=>{class t{appearance;constructor(){let A=h(IlA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:8,hostBindings:function(i,n){i&2&&ae("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")("mat-mdc-card-filled",n.appearance==="filled")("mdc-card--filled",n.appearance==="filled")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:ClA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-color:var(--mat-card-elevated-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-elevated-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mat-card-outlined-container-color, var(--mat-sys-surface));border-radius:var(--mat-card-outlined-container-shape, var(--mat-sys-corner-medium));border-width:var(--mat-card-outlined-outline-width, 1px);border-color:var(--mat-card-outlined-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mat-card-outlined-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mat-mdc-card-filled{background-color:var(--mat-card-filled-container-color, var(--mat-sys-surface-container-highest));border-radius:var(--mat-card-filled-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mat-card-filled-container-elevation, var(--mat-sys-level0))}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end} `],encapsulation:2,changeDetection:0})}return t})();var UU=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();var $h=class{};function A4(t){return t&&typeof t.connect=="function"&&!(t instanceof $F)}var kl=(function(t){return t[t.REPLACED=0]="REPLACED",t[t.INSERTED=1]="INSERTED",t[t.MOVED=2]="MOVED",t[t.REMOVED=3]="REMOVED",t})(kl||{}),ap=class{viewCacheSize=20;_viewCache=[];applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let g,l;if(a.previousIndex==null){let C=()=>i(a,r,s);g=this._insertView(C,s,A,n(a)),l=g?kl.INSERTED:kl.REPLACED}else s==null?(this._detachAndCacheView(r,A),l=kl.REMOVED):(g=this._moveView(r,s,A,n(a)),l=kl.MOVED);o&&o({context:g?.context,operation:l,record:a})})}detach(){for(let e of this._viewCache)e.destroy();this._viewCache=[]}_insertView(e,A,i,n){let o=this._insertViewFromCache(A,i);if(o){o.context.$implicit=n;return}let a=e();return i.createEmbeddedView(a.templateRef,a.context,a.index)}_detachAndCacheView(e,A){let i=A.detach(e);this._maybeCacheView(i,A)}_moveView(e,A,i,n){let o=i.get(e);return i.move(o,A),o.context.$implicit=n,o}_maybeCacheView(e,A){if(this._viewCache.length{class t{_ngZone=h(Oe);_platform=h(ci);_renderer=h(Dr).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new $A;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let i=this.scrollContainers.get(A);i&&(i.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=BlA){return this._platform.isBrowser?new Ti(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(yI(A)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):oe()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(A,i){let n=this.getAncestorScrollContainers(A);return this.scrolled(i).pipe(We(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&i.push(o)}),i}_scrollableContainsElement(A,i){let n=ls(i),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),x0=(()=>{class t{elementRef=h(ge);scrollDispatcher=h(Lc);ngZone=h(Oe);dir=h(wo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new $A;_renderer=h(ui);_cleanupScroll;_elementScrolled=new $A;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=i.scrollHeight-i.clientHeight-A.bottom),n&&Nd()!=ml.NORMAL?(A.left!=null&&(A.right=i.scrollWidth-i.clientWidth-A.left),Nd()==ml.INVERTED?A.left=A.right:Nd()==ml.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=i.scrollWidth-i.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let i=this.elementRef.nativeElement;Zf()?i.scrollTo(A):(A.top!=null&&(i.scrollTop=A.top),A.left!=null&&(i.scrollLeft=A.left))}measureScrollOffset(A){let i="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let a=this.dir&&this.dir.value=="rtl";return A=="start"?A=a?n:i:A=="end"&&(A=a?i:n),a&&Nd()==ml.INVERTED?A==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:a&&Nd()==ml.NEGATED?A==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return t})(),QlA=20,Bs=(()=>{class t{_platform=h(ci);_listeners;_viewportSize=null;_change=new $A;_document=h(Zt);constructor(){let A=h(Oe),i=h(Dr).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen("window","resize",n),i.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,i=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),a=-o.top||A.body?.scrollTop||i.scrollY||n.scrollTop||0,r=-o.left||A.body?.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:a,left:r}}change(A=QlA){return A>0?this._change.pipe(yI(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var JU=new wA("CDK_VIRTUAL_SCROLL_VIEWPORT");var Fc=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})(),rp=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi,Fc,Fi,Fc]})}return t})();var e4=class{_attachedHost=null;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},Cg=class extends e4{component;viewContainerRef;injector;projectableNodes;bindings;constructor(e,A,i,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=i,this.projectableNodes=n,this.bindings=o||null}},Vr=class extends e4{templateRef;viewContainerRef;context;injector;constructor(e,A,i,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},bb=class extends e4{element;constructor(e){super(),this.element=e instanceof ge?e.nativeElement:e}},PC=class{_attachedPortal=null;_disposeFn=null;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof Cg)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof Vr)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof bb)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}},t4=class extends PC{outletElement;_appRef;_defaultInjector;constructor(e,A,i){super(),this.outletElement=e,this._appRef=A,this._defaultInjector=i}attachComponentPortal(e){let A;if(e.viewContainerRef){let i=e.injector||e.viewContainerRef.injector,n=i.get(Ev,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),this.setDisposeFn(()=>A.destroy())}else{let i=this._appRef,n=e.injector||this._defaultInjector||ut.NULL,o=n.get(pr,i.injector);A=yf(e.component,{elementInjector:n,environmentInjector:o,projectableNodes:e.projectableNodes||void 0,bindings:e.bindings||void 0}),i.attachView(A.hostView),this.setDisposeFn(()=>{i.viewCount>0&&i.detachView(A.hostView),A.destroy()})}return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,i=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(i);n!==-1&&A.remove(n)}),this._attachedPortal=e,i}attachDomPortal=e=>{let A=e.element;A.parentNode;let i=this.outletElement.ownerDocument.createComment("dom-portal");A.parentNode.insertBefore(i,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(A,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}},YU=(()=>{class t extends Vr{constructor(){let A=h(Fn),i=h(Ro);super(A,i)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[Ct]})}return t})(),Ig=(()=>{class t extends PC{_moduleRef=h(Ev,{optional:!0});_document=h(Zt);_viewContainerRef=h(Ro);_isInitialized=!1;_attachedRef=null;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new WA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let i=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=i.createComponent(A.component,{index:i.length,injector:A.injector||i.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0,bindings:A.bindings||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=A=>{let i=A.element;i.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[Ct]})}return t})(),_c=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();var HU=Zf();function rB(t){return new sp(t.get(Bs),t.get(Zt))}var sp=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Ra(-this._previousScrollPosition.left),e.style.top=Ra(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,i=e.style,n=A.style,o=i.scrollBehavior||"",a=n.scrollBehavior||"";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),HU&&(i.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),HU&&(i.scrollBehavior=o,n.scrollBehavior=a)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.documentElement,i=this._viewportRuler.getViewportSize();return A.scrollHeight>i.height||A.scrollWidth>i.width}};function VU(t,e){return new gp(t.get(Lc),t.get(Oe),t.get(Bs),e)}var gp=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,i,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(We(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}};var i4=class{enable(){}disable(){}attach(){}};function Mb(t,e){return e.some(A=>{let i=t.bottomA.bottom,o=t.rightA.right;return i||n||o||a})}function TU(t,e){return e.some(A=>{let i=t.topA.bottom,o=t.leftA.right;return i||n||o||a})}function R0(t,e){return new lp(t.get(Lc),t.get(Bs),t.get(Oe),e)}var lp=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,i,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();Mb(A,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},WU=(()=>{class t{_injector=h(ut);constructor(){}noop=()=>new i4;close=A=>VU(this._injector,A);block=()=>rB(this._injector);reposition=A=>R0(this._injector,A);static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Sl=class{positionStrategy;scrollStrategy=new i4;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";disableAnimations;width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;usePopover;eventPredicate;constructor(e){if(e){let A=Object.keys(e);for(let i of A)e[i]!==void 0&&(this[i]=e[i])}}};var cp=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var ZU=(()=>{class t{_attachedOverlays=[];_document=h(Zt);_isAttached=!1;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let i=this._attachedOverlays.indexOf(A);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}canReceiveEvent(A,i,n){return n.observers.length<1?!1:A.eventPredicate?A.eventPredicate(i):!0}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),XU=(()=>{class t extends ZU{_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--){let o=i[n];if(this.canReceiveEvent(o,A,o._keydownEvents)){this._ngZone.run(()=>o._keydownEvents.next(A));break}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),$U=(()=>{class t extends ZU{_platform=h(ci);_ngZone=h(Oe);_renderer=h(Dr).createRenderer(null,null);_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget=null;_cleanups;add(A){if(super.add(A),!this._isAttached){let i=this._document.body,n={capture:!0},o=this._renderer;this._cleanups=this._ngZone.runOutsideAngular(()=>[o.listen(i,"pointerdown",this._pointerDownListener,n),o.listen(i,"click",this._clickListener,n),o.listen(i,"auxclick",this._clickListener,n),o.listen(i,"contextmenu",this._clickListener,n)]),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){this._isAttached&&(this._cleanups?.forEach(A=>A()),this._cleanups=void 0,this._platform.IOS&&this._cursorStyleIsSet&&(this._document.body.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1)}_pointerDownListener=A=>{this._pointerDownEventTarget=yr(A)};_clickListener=A=>{let i=yr(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let a=o.length-1;a>-1;a--){let r=o[a],s=r._outsidePointerEvents;if(!(!r.hasAttached()||!this.canReceiveEvent(r,A,s))){if(OU(r.overlayElement,i)||OU(r.overlayElement,n))break;this._ngZone?this._ngZone.run(()=>s.next(A)):s.next(A)}}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function OU(t,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,i=e;for(;i;){if(i===t)return!0;i=A&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var AJ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[`.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0;touch-action:manipulation}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}@media(prefers-reduced-motion){.cdk-overlay-backdrop{transition-duration:1ms}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.cdk-overlay-popover{background:none;border:none;padding:0;outline:0;overflow:visible;position:fixed;pointer-events:none;white-space:normal;color:inherit;text-decoration:none;width:100%;height:100%;inset:auto;top:0;left:0}.cdk-overlay-popover::backdrop{display:none}.cdk-overlay-popover .cdk-overlay-backdrop{position:fixed;z-index:auto} `],encapsulation:2,changeDetection:0})}return t})(),dp=(()=>{class t{_platform=h(ci);_containerElement;_document=h(Zt);_styleLoader=h(Hn);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||qv()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}};function Sb(t){return t&&t.nodeType===1}var oB=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new $A;_attachments=new $A;_detachments=new $A;_positionStrategy;_scrollStrategy;_locationChanges=Rn.EMPTY;_backdropRef=null;_detachContentMutationObserver;_detachContentAfterRenderRef;_disposed=!1;_previousHostParent;_keydownEvents=new $A;_outsidePointerEvents=new $A;_afterNextRenderRef;constructor(e,A,i,n,o,a,r,s,g,l=!1,C,I){this._portalOutlet=e,this._host=A,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=a,this._document=r,this._location=s,this._outsideClickDispatcher=g,this._animationsDisabled=l,this._injector=C,this._renderer=I,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}get eventPredicate(){return this._config?.eventPredicate||null}attach(e){if(this._disposed)return null;this._attachHost();let A=this._portalOutlet.attach(e);return this._positionStrategy?.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=Nn(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._completeDetachContent(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._completeDetachContent(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){if(this._disposed)return;let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._completeDetachContent(),this._disposed=!0}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=BA(BA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Ve(BA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Ra(this._config.width),e.height=Ra(this._config.height),e.minWidth=Ra(this._config.minWidth),e.minHeight=Ra(this._config.minHeight),e.maxWidth=Ra(this._config.maxWidth),e.maxHeight=Ra(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachHost(){if(!this._host.parentElement){let e=this._config.usePopover?this._positionStrategy?.getPopoverInsertionPoint?.():null;Sb(e)?e.after(this._host):e?.type==="parent"?e.element.appendChild(this._host):this._previousHostParent?.appendChild(this._host)}if(this._config.usePopover)try{this._host.showPopover()}catch(e){}}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new kb(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._config.usePopover?this._host.prepend(this._backdropRef.element):this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){!this._config.usePopover&&this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,i){let n=kd(A||[]).filter(o=>!!o);n.length&&(i?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){let e=!1;try{this._detachContentAfterRenderRef=Nn(()=>{e=!0,this._detachContent()},{injector:this._injector})}catch(A){if(e)throw A;this._detachContent()}globalThis.MutationObserver&&this._pane&&(this._detachContentMutationObserver||=new globalThis.MutationObserver(()=>{this._detachContent()}),this._detachContentMutationObserver.observe(this._pane,{childList:!0}))}_detachContent(){(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),this._completeDetachContent())}_completeDetachContent(){this._detachContentAfterRenderRef?.destroy(),this._detachContentAfterRenderRef=void 0,this._detachContentMutationObserver?.disconnect()}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},zU="cdk-overlay-connected-position-bounding-box",hlA=/([A-Za-z%]+)$/;function XI(t,e){return new Cp(e,t.get(Bs),t.get(Zt),t.get(ci),t.get(dp))}var Cp=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender=!1;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed=!1;_boundingBox=null;_lastPosition=null;_lastScrollVisibility=null;_positionChanges=new $A;_resizeSubscription=Rn.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount=null;_popoverLocation="global";positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,i,n,o){this._viewportRuler=A,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(zU),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._getContainerRect();let e=this._originRect,A=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],a;for(let r of this._preferredPositions){let s=this._getOriginPoint(e,n,r),g=this._getOverlayPoint(s,A,r),l=this._getOverlayFit(g,A,i,r);if(l.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(r,s);return}if(this._canFitWithFlexibleDimensions(l,g,i)){o.push({position:r,origin:s,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(s,r)});continue}(!a||a.overlayFit.visibleAreas&&(s=l,r=g)}this._isPushed=!1,this._applyPosition(r.position,r.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(a.position,a.originPoint);return}this._applyPosition(a.position,a.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&ZI(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(zU),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;e?(this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._getContainerRect(),this._applyPosition(e,this._getOriginPoint(this._originRect,this._containerRect,e))):this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}withPopoverLocation(e){return this._popoverLocation=e,this}getPopoverInsertionPoint(){return this._popoverLocation==="global"?null:this._popoverLocation!=="inline"?this._popoverLocation:this._origin instanceof ge?this._origin.nativeElement:Sb(this._origin)?this._origin:null}_getOriginPoint(e,A,i){let n;if(i.originX=="center")n=e.left+e.width/2;else{let a=this._isRtl()?e.right:e.left,r=this._isRtl()?e.left:e.right;n=i.originX=="start"?a:r}A.left<0&&(n-=A.left);let o;return i.originY=="center"?o=e.top+e.height/2:o=i.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,i){let n;i.overlayX=="center"?n=-A.width/2:i.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return i.overlayY=="center"?o=-A.height/2:o=i.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,i,n){let o=jU(A),{x:a,y:r}=e,s=this._getOffset(n,"x"),g=this._getOffset(n,"y");s&&(a+=s),g&&(r+=g);let l=0-a,C=a+o.width-i.width,I=0-r,d=r+o.height-i.height,B=this._subtractOverflows(o.width,l,C),Q=this._subtractOverflows(o.height,I,d),E=B*Q;return{visibleArea:E,isCompletelyWithinViewport:o.width*o.height===E,fitsInViewportVertically:Q===o.height,fitsInViewportHorizontally:B==o.width}}_canFitWithFlexibleDimensions(e,A,i){if(this._hasFlexibleDimensions){let n=i.bottom-A.y,o=i.right-A.x,a=PU(this._overlayRef.getConfig().minHeight),r=PU(this._overlayRef.getConfig().minWidth),s=e.fitsInViewportVertically||a!=null&&a<=n,g=e.fitsInViewportHorizontally||r!=null&&r<=o;return s&&g}return!1}_pushOverlayOnScreen(e,A,i){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=jU(A),o=this._viewportRect,a=Math.max(e.x+n.width-o.width,0),r=Math.max(e.y+n.height-o.height,0),s=Math.max(o.top-i.top-e.y,0),g=Math.max(o.left-i.left-e.x,0),l=0,C=0;return n.width<=o.width?l=g||-a:l=e.xB&&!this._isInitialRender&&!this._growAfterOpen&&(a=e.y-B/2)}let s=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,g=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,l,C,I;if(g)I=i.width-e.x+this._getViewportMarginStart()+this._getViewportMarginEnd(),l=e.x-this._getViewportMarginStart();else if(s)C=e.x,l=i.right-e.x-this._getViewportMarginEnd();else{let d=Math.min(i.right-e.x+i.left,e.x),B=this._lastBoundingBoxSize.width;l=d*2,C=e.x-d,l>B&&!this._isInitialRender&&!this._growAfterOpen&&(C=e.x-B/2)}return{top:a,left:C,bottom:r,right:I,width:l,height:o}}_setBoundingBoxStyles(e,A){let i=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right="auto",n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,a=this._overlayRef.getConfig().maxWidth;n.width=Ra(i.width),n.height=Ra(i.height),n.top=Ra(i.top)||"auto",n.bottom=Ra(i.bottom)||"auto",n.left=Ra(i.left)||"auto",n.right=Ra(i.right)||"auto",A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Ra(o)),a&&(n.maxWidth=Ra(a))}this._lastBoundingBoxSize=i,ZI(this._boundingBox.style,n)}_resetBoundingBoxStyles(){ZI(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){ZI(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,a=this._overlayRef.getConfig();if(n){let l=this._viewportRuler.getViewportScrollPosition();ZI(i,this._getExactOverlayY(A,e,l)),ZI(i,this._getExactOverlayX(A,e,l))}else i.position="static";let r="",s=this._getOffset(A,"x"),g=this._getOffset(A,"y");s&&(r+=`translateX(${s}px) `),g&&(r+=`translateY(${g}px)`),i.transform=r.trim(),a.maxHeight&&(n?i.maxHeight=Ra(a.maxHeight):o&&(i.maxHeight="")),a.maxWidth&&(n?i.maxWidth=Ra(a.maxWidth):o&&(i.maxWidth="")),ZI(this._pane.style,i)}_getExactOverlayY(e,A,i){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),e.overlayY==="bottom"){let a=this._document.documentElement.clientHeight;n.bottom=`${a-(o.y+this._overlayRect.height)}px`}else n.top=Ra(o.y);return n}_getExactOverlayX(e,A,i){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let a;if(this._isRtl()?a=e.overlayX==="end"?"left":"right":a=e.overlayX==="end"?"right":"left",a==="right"){let r=this._document.documentElement.clientWidth;n.right=`${r-(o.x+this._overlayRect.width)}px`}else n.left=Ra(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:TU(e,i),isOriginOutsideView:Mb(e,i),isOverlayClipped:TU(A,i),isOverlayOutsideView:Mb(A,i)}}_subtractOverflows(e,...A){return A.reduce((i,n)=>i-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._getViewportMarginTop(),left:i.left+this._getViewportMarginStart(),right:i.left+e-this._getViewportMarginEnd(),bottom:i.top+A-this._getViewportMarginBottom(),width:e-this._getViewportMarginStart()-this._getViewportMarginEnd(),height:A-this._getViewportMarginTop()-this._getViewportMarginBottom()}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&kd(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getViewportMarginStart(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.start??0}_getViewportMarginEnd(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.end??0}_getViewportMarginTop(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.top??0}_getViewportMarginBottom(){return typeof this._viewportMargin=="number"?this._viewportMargin:this._viewportMargin?.bottom??0}_getOriginRect(){let e=this._origin;if(e instanceof ge)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,i=e.height||0;return{top:e.y,bottom:e.y+i,left:e.x,right:e.x+A,height:i,width:A}}_getContainerRect(){let e=this._overlayRef.getConfig().usePopover&&this._popoverLocation!=="global",A=this._overlayContainer.getContainerElement();e&&(A.style.display="block");let i=A.getBoundingClientRect();return e&&(A.style.display=""),i}};function ZI(t,e){for(let A in e)e.hasOwnProperty(A)&&(t[A]=e[A]);return t}function PU(t){if(typeof t!="number"&&t!=null){let[e,A]=t.split(hlA);return!A||A==="px"?parseFloat(e):null}return t||null}function jU(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function ulA(t,e){return t===e?!0:t.isOriginClipped===e.isOriginClipped&&t.isOriginOutsideView===e.isOriginOutsideView&&t.isOverlayClipped===e.isOverlayClipped&&t.isOverlayOutsideView===e.isOverlayOutsideView}var qU="cdk-global-overlay-wrapper";function jC(t){return new Ip}var Ip=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(qU),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:a,maxHeight:r}=i,s=(n==="100%"||n==="100vw")&&(!a||a==="100%"||a==="100vw"),g=(o==="100%"||o==="100vh")&&(!r||r==="100%"||r==="100vh"),l=this._xPosition,C=this._xOffset,I=this._overlayRef.getConfig().direction==="rtl",d="",B="",Q="";s?Q="flex-start":l==="center"?(Q="center",I?B=C:d=C):I?l==="left"||l==="end"?(Q="flex-end",d=C):(l==="right"||l==="start")&&(Q="flex-start",B=C):l==="left"||l==="start"?(Q="flex-start",d=C):(l==="right"||l==="end")&&(Q="flex-end",B=C),e.position=this._cssPosition,e.marginLeft=s?"0":d,e.marginTop=g?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=s?"0":B,A.justifyContent=Q,A.alignItems=g?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,i=A.style;A.classList.remove(qU),i.justifyContent=i.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},eJ=(()=>{class t{_injector=h(ut);constructor(){}global(){return jC()}flexibleConnectedTo(A){return XI(this._injector,A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),n4=new wA("OVERLAY_DEFAULT_CONFIG");function Rl(t,e){t.get(Hn).load(AJ);let A=t.get(dp),i=t.get(Zt),n=t.get(An),o=t.get(p0),a=t.get(wo),r=t.get(ui,null,{optional:!0})||t.get(Dr).createRenderer(null,null),s=new Sl(e),g=t.get(n4,null,{optional:!0})?.usePopover??!0;s.direction=s.direction||a.value,"showPopover"in i.body?s.usePopover=e?.usePopover??g:s.usePopover=!1;let l=i.createElement("div"),C=i.createElement("div");l.id=n.getId("cdk-overlay-"),l.classList.add("cdk-overlay-pane"),C.appendChild(l),s.usePopover&&(C.setAttribute("popover","manual"),C.classList.add("cdk-overlay-popover"));let I=s.usePopover?s.positionStrategy?.getPopoverInsertionPoint?.():null;return Sb(I)?I.after(C):I?.type==="parent"?I.element.appendChild(C):A.getContainerElement().appendChild(C),new oB(new t4(l,o,t),C,l,s,t.get(Oe),t.get(XU),i,t.get(wc),t.get($U),e?.disableAnimations??t.get(vI,null,{optional:!0})==="NoopAnimations",t.get(pr),r)}var Bp=(()=>{class t{scrollStrategies=h(WU);_positionBuilder=h(eJ);_injector=h(ut);constructor(){}create(A){return Rl(this._injector,A)}position(){return this._positionBuilder}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),flA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],mlA=new wA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>R0(t)}}),aB=(()=>{class t{elementRef=h(ge);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return t})(),tJ=new wA("cdk-connected-overlay-default-config"),Qp=(()=>{class t{_dir=h(wo,{optional:!0});_injector=h(ut);_overlayRef;_templatePortal;_backdropSubscription=Rn.EMPTY;_attachSubscription=Rn.EMPTY;_detachSubscription=Rn.EMPTY;_positionSubscription=Rn.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=h(mlA);_ngZone=h(Oe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;disposeOnNavigation=!1;usePopover;matchWidth=!1;set _config(A){typeof A!="string"&&this._assignConfig(A)}backdropClick=new WA;positionChange=new WA;attach=new WA;detach=new WA;overlayKeydown=new WA;overlayOutsideClick=new WA;constructor(){let A=h(Fn),i=h(Ro),n=h(tJ,{optional:!0}),o=h(n4,{optional:!0});this.usePopover=o?.usePopover===!1?null:"global",this._templatePortal=new Vr(A,i),this.scrollStrategy=this._scrollStrategyFactory(),n&&this._assignConfig(n)}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef?.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef?.updateSize({width:this._getWidth(),minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this.attachOverlay():this.detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=flA);let A=this._overlayRef=Rl(this._injector,this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!aa(i)&&(i.preventDefault(),this.detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=yr(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),i=new Sl({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation,usePopover:!!this.usePopover});return(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(A){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector).withPopoverLocation(this.usePopover===null?"global":this.usePopover)}_createPositionStrategy(){let A=XI(this._injector,this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof aB?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof aB?this.origin.elementRef.nativeElement:this.origin instanceof ge?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_getWidth(){return this.width?this.width:this.matchWidth?this._getOriginElement()?.getBoundingClientRect?.().width:void 0}attachOverlay(){this._overlayRef||this._createOverlay();let A=this._overlayRef;A.getConfig().hasBackdrop=this.hasBackdrop,A.updateSize({width:this._getWidth()}),A.hasAttached()||A.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=A.backdropClick().subscribe(i=>this.backdropClick.emit(i)):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(oL(()=>this.positionChange.observers.length>0)).subscribe(i=>{this._ngZone.run(()=>this.positionChange.emit(i)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()})),this.open=!0}detachOverlay(){this._overlayRef?.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.open=!1}_assignConfig(A){this.origin=A.origin??this.origin,this.positions=A.positions??this.positions,this.positionStrategy=A.positionStrategy??this.positionStrategy,this.offsetX=A.offsetX??this.offsetX,this.offsetY=A.offsetY??this.offsetY,this.width=A.width??this.width,this.height=A.height??this.height,this.minWidth=A.minWidth??this.minWidth,this.minHeight=A.minHeight??this.minHeight,this.backdropClass=A.backdropClass??this.backdropClass,this.panelClass=A.panelClass??this.panelClass,this.viewportMargin=A.viewportMargin??this.viewportMargin,this.scrollStrategy=A.scrollStrategy??this.scrollStrategy,this.disableClose=A.disableClose??this.disableClose,this.transformOriginSelector=A.transformOriginSelector??this.transformOriginSelector,this.hasBackdrop=A.hasBackdrop??this.hasBackdrop,this.lockPosition=A.lockPosition??this.lockPosition,this.flexibleDimensions=A.flexibleDimensions??this.flexibleDimensions,this.growAfterOpen=A.growAfterOpen??this.growAfterOpen,this.push=A.push??this.push,this.disposeOnNavigation=A.disposeOnNavigation??this.disposeOnNavigation,this.usePopover=A.usePopover??this.usePopover,this.matchWidth=A.matchWidth??this.matchWidth}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",he],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",he],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",he],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",he],push:[2,"cdkConnectedOverlayPush","push",he],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",he],usePopover:[0,"cdkConnectedOverlayUsePopover","usePopover"],matchWidth:[2,"cdkConnectedOverlayMatchWidth","matchWidth",he],_config:[0,"cdkConnectedOverlay","_config"]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[ei]})}return t})(),Kg=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({providers:[Bp],imports:[Fi,_c,rp,rp]})}return t})();function plA(t,e){}var qC=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;disableAnimations=!1;providers;container;templateContext};var Rb=(()=>{class t extends PC{_elementRef=h(ge);_focusTrapFactory=h(gh);_config;_interactivityChecker=h(xd);_ngZone=h(Oe);_focusMonitor=h(Ha);_renderer=h(ui);_changeDetectorRef=h(ft);_injector=h(ut);_platform=h(ci);_document=h(Zt);_portalOutlet;_focusTrapped=new $A;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_isDestroyed=!1;constructor(){super(),this._config=h(qC,{optional:!0})||new qC,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let i=this._ariaLabelledByQueue.indexOf(A);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._focusTrapped.complete(),this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),i}attachTemplatePortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),i}attachDomPortal=A=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_trapFocus(A){this._isDestroyed||Nn(()=>{let i=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||i.focus(A);break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement(A)||this._focusDialogContainer(A);break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]',A);break;default:this._focusByCssSelector(this._config.autoFocus,A);break}this._focusTrapped.next()},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,i=null;if(typeof A=="string"?i=this._document.querySelector(A):typeof A=="boolean"?i=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(i=A),this._config.restoreFocus&&i&&typeof i.focus=="function"){let n=oh(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(A){this._elementRef.nativeElement.focus?.(A)}_containsFocus(){let A=this._elementRef.nativeElement,i=oh();return A===i||A.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=oh()))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["cdk-dialog-container"]],viewQuery:function(i,n){if(i&1&&ni(Ig,7),i&2){let o;Ce(o=Ie())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(i,n){i&2&&ie("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[Ct],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(i,n){i&1&&yt(0,plA,0,0,"ng-template",0)},dependencies:[Ig],styles:[`.cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit} `],encapsulation:2})}return t})(),o4=class{overlayRef;config;componentInstance=null;componentRef=null;containerInstance;disableClose;closed=new $A;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!aa(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{!this.disableClose&&this._canClose()?this.close(void 0,{focusOrigin:"mouse"}):this.containerInstance._recaptureFocus?.()}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this._canClose(e)){let i=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(e),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}_canClose(e){let A=this.config;return!!this.containerInstance&&(!A.closePredicate||A.closePredicate(e,A,this.componentInstance))}},DlA=new wA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>rB(t)}}),wlA=new wA("DialogData"),ylA=new wA("DefaultDialogConfig");function vlA(t){let e=jA(t),A=new WA;return{valueSignal:e,get value(){return e()},change:A,ngOnDestroy(){A.complete()}}}var Nb=(()=>{class t{_injector=h(ut);_defaultOptions=h(ylA,{optional:!0});_parentDialog=h(t,{optional:!0,skipSelf:!0});_overlayContainer=h(dp);_idGenerator=h(An);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new $A;_afterOpenedAtThisLevel=new $A;_ariaHiddenElements=new Map;_scrollStrategy=h(DlA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(nn(void 0)));constructor(){}open(A,i){let n=this._defaultOptions||new qC;i=BA(BA({},n),i),i.id=i.id||this._idGenerator.getId("cdk-dialog-"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),a=Rl(this._injector,o),r=new o4(a,i),s=this._attachContainer(a,r,i);if(r.containerInstance=s,!this.openDialogs.length){let g=this._overlayContainer.getContainerElement();s._focusTrapped?s._focusTrapped.pipe(qn(1)).subscribe(()=>{this._hideNonDialogContentFromAssistiveTechnology(g)}):this._hideNonDialogContentFromAssistiveTechnology(g)}return this._attachDialogContent(A,r,s,i),this.openDialogs.push(r),r.closed.subscribe(()=>this._removeOpenDialog(r,!0)),this.afterOpened.next(r),r}closeAll(){xb(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){xb(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),xb(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let i=new Sl({positionStrategy:A.positionStrategy||jC().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation,disableAnimations:A.disableAnimations});return A.backdropClass&&(i.backdropClass=A.backdropClass),i}_attachContainer(A,i,n){let o=n.injector||n.viewContainerRef?.injector,a=[{provide:qC,useValue:n},{provide:o4,useValue:i},{provide:oB,useValue:A}],r;n.container?typeof n.container=="function"?r=n.container:(r=n.container.type,a.push(...n.container.providers(n))):r=Rb;let s=new Cg(r,n.viewContainerRef,ut.create({parent:o||this._injector,providers:a}));return A.attach(s).instance}_attachDialogContent(A,i,n,o){if(A instanceof Fn){let a=this._createInjector(o,i,n,void 0),r={$implicit:o.data,dialogRef:i};o.templateContext&&(r=BA(BA({},r),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new Vr(A,null,r,a))}else{let a=this._createInjector(o,i,n,this._injector),r=n.attachComponentPortal(new Cg(A,o.viewContainerRef,a));i.componentRef=r,i.componentInstance=r.instance}}_createInjector(A,i,n,o){let a=A.injector||A.viewContainerRef?.injector,r=[{provide:wlA,useValue:A.data},{provide:o4,useValue:i}];return A.providers&&(typeof A.providers=="function"?r.push(...A.providers(i,A,n)):r.push(...A.providers)),A.direction&&(!a||!a.get(wo,null,{optional:!0}))&&r.push({provide:wo,useValue:vlA(A.direction)}),ut.create({parent:a||o,providers:r})}_removeOpenDialog(A,i){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,a)=>{o?a.setAttribute("aria-hidden",o):a.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(A){if(A.parentElement){let i=A.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&!o.hasAttribute("popover")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function xb(t,e){let A=t.length;for(;A--;)e(t[A])}var iJ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({providers:[Nb],imports:[Kg,_c,ch,_c]})}return t})();function blA(t,e){}var hp=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;closePredicate;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;enterAnimationDuration;exitAnimationDuration},Fb="mdc-dialog--open",nJ="mdc-dialog--opening",oJ="mdc-dialog--closing",MlA=150,klA=75,SlA=(()=>{class t extends Rb{_animationStateChanged=new WA;_animationsEnabled=!Oi();_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?rJ(this._config.enterAnimationDuration)??MlA:0;_exitAnimationDuration=this._animationsEnabled?rJ(this._config.exitAnimationDuration)??klA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(aJ,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(nJ,Fb)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(Fb),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(Fb),this._animationsEnabled?(this._hostElement.style.setProperty(aJ,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(oJ)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(nJ,oJ)}_waitForAnimationToComplete(A,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let i=super.attachComponentPortal(A);return i.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),i}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(i,n){i&2&&(Bo("id",n._config.id),ie("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),ae("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[Ct],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(m(0,"div",0)(1,"div",1),yt(2,blA,0,0,"ng-template",2),D()())},dependencies:[Ig],styles:[`.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mat-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mat-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mat-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mat-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mat-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mat-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mat-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mat-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mat-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mat-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mat-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mat-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mat-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;box-sizing:border-box;min-height:52px;margin:0;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents} `],encapsulation:2})}return t})(),aJ="--mat-dialog-transition-duration";function rJ(t){return t==null?null:typeof t=="number"?t:t.endsWith("ms")?Rs(t.substring(0,t.length-2)):t.endsWith("s")?Rs(t.substring(0,t.length-1))*1e3:t==="0"?0:null}var Ep=(function(t){return t[t.OPEN=0]="OPEN",t[t.CLOSING=1]="CLOSING",t[t.CLOSED=2]="CLOSED",t})(Ep||{}),Fo=class{_ref;_config;_containerInstance;componentInstance;componentRef=null;disableClose;id;_afterOpened=new El(1);_beforeClosed=new El(1);_result;_closeFallbackTimeout;_state=Ep.OPEN;_closeInteractionType;constructor(e,A,i){this._ref=e,this._config=A,this._containerInstance=i,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),i._animationStateChanged.pipe(We(n=>n.state==="opened"),qn(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe(We(n=>n.state==="closed"),qn(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Qi(this.backdropClick(),this.keydownEvents().pipe(We(n=>n.keyCode===27&&!this.disableClose&&!aa(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),sJ(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){let A=this._config.closePredicate;A&&!A(e,this._config,this.componentInstance)||(this._result=e,this._containerInstance._animationStateChanged.pipe(We(i=>i.state==="closing"),qn(1)).subscribe(i=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),i.totalTime+100)}),this._state=Ep.CLOSING,this._containerInstance._startExitAnimation())}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=Ep.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function sJ(t,e,A){return t._closeInteractionType=e,t.close(A)}var da=new wA("MatMdcDialogData"),xlA=new wA("mat-mdc-dialog-default-options"),RlA=new wA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>rB(t)}}),Qs=(()=>{class t{_defaultOptions=h(xlA,{optional:!0});_scrollStrategy=h(RlA);_parentDialog=h(t,{optional:!0,skipSelf:!0});_idGenerator=h(An);_injector=h(ut);_dialog=h(Nb);_animationsDisabled=Oi();_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new $A;_afterOpenedAtThisLevel=new $A;dialogConfigClass=hp;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=fc(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(nn(void 0)));constructor(){this._dialogRefConstructor=Fo,this._dialogContainerType=SlA,this._dialogDataToken=da}open(A,i){let n;i=BA(BA({},this._defaultOptions||new hp),i),i.id=i.id||this._idGenerator.getId("mat-mdc-dialog-"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Ve(BA({},i),{positionStrategy:jC(this._injector).centerHorizontally().centerVertically(),disableClose:!0,closePredicate:void 0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,disableAnimations:this._animationsDisabled||i.enterAnimationDuration?.toLocaleString()==="0"||i.exitAnimationDuration?.toString()==="0",container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:qC,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(a,r,s)=>(n=new this._dialogRefConstructor(a,i,s),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:s},{provide:this._dialogDataToken,useValue:r.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let a=this.openDialogs.indexOf(n);a>-1&&(this.openDialogs.splice(a,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let i=A.length;for(;i--;)A[i].close()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),VC=(()=>{class t{dialogRef=h(Fo,{optional:!0});_elementRef=h(ge);_dialog=h(Qs);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=lJ(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let i=A._matDialogClose||A._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(A){sJ(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(i,n){i&1&&$("click",function(a){return n._onButtonClick(a)}),i&2&&ie("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[ei]})}return t})(),gJ=(()=>{class t{_dialogRef=h(Fo,{optional:!0});_elementRef=h(ge);_dialog=h(Qs);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=lJ(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t})}return t})(),ya=(()=>{class t extends gJ{id=h(An).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(i,n){i&2&&Bo("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[Ct]})}return t})(),gr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[ff([x0])]})}return t})(),Ta=(()=>{class t extends gJ{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(i,n){i&2&&ae("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[Ct]})}return t})();function lJ(t,e){let A=t.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(i=>i.id===A.id):null}var cJ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({providers:[Qs],imports:[iJ,Kg,_c,Fi]})}return t})();var up=(()=>{class t{get vertical(){return this._vertical}set vertical(A){this._vertical=sr(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=sr(A)}_inset=!1;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(i,n){i&2&&(ie("aria-orientation",n.vertical?"vertical":"horizontal"),ae("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline-variant));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px} `],encapsulation:2,changeDetection:0})}return t})(),CJ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();function IJ(t){return Error(`Unable to find icon with the name "${t}"`)}function FlA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function dJ(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function BJ(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}var F0=class{url;svgText;options;svgElement=null;constructor(e,A,i){this.url=e,this.svgText=A,this.options=i}},EJ=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,i,n,o){this._httpClient=A,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(A,i,n){return this.addSvgIconInNamespace("",A,i,n)}addSvgIconLiteral(A,i,n){return this.addSvgIconLiteralInNamespace("",A,i,n)}addSvgIconInNamespace(A,i,n,o){return this._addSvgIconConfig(A,i,new F0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,i,n,o){let a=this._sanitizer.sanitize(ul.HTML,n);if(!a)throw BJ(n);let r=NI(a);return this._addSvgIconConfig(A,i,new F0("",r,o))}addSvgIconSet(A,i){return this.addSvgIconSetInNamespace("",A,i)}addSvgIconSetLiteral(A,i){return this.addSvgIconSetLiteralInNamespace("",A,i)}addSvgIconSetInNamespace(A,i,n){return this._addSvgIconSetConfig(A,new F0(i,null,n))}addSvgIconSetLiteralInNamespace(A,i,n){let o=this._sanitizer.sanitize(ul.HTML,i);if(!o)throw BJ(i);let a=NI(o);return this._addSvgIconSetConfig(A,new F0("",a,n))}registerFontClassAlias(A,i=A){return this._fontCssClassesByAlias.set(A,i),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let i=this._sanitizer.sanitize(ul.RESOURCE_URL,A);if(!i)throw dJ(A);let n=this._cachedIconsByUrl.get(i);return n?oe(fp(n)):this._loadSvgIconFromConfig(new F0(A,null)).pipe(Wt(o=>this._cachedIconsByUrl.set(i,o)),fe(o=>fp(o)))}getNamedSvgIcon(A,i=""){let n=QJ(i,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let a=this._iconSetConfigs.get(i);return a?this._getSvgFromIconSetConfigs(A,a):gf(IJ(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?oe(fp(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(fe(i=>fp(i)))}_getSvgFromIconSetConfigs(A,i){let n=this._extractIconWithNameFromAnySet(A,i);if(n)return oe(n);let o=i.filter(a=>!a.svgText).map(a=>this._loadSvgIconSetFromConfig(a).pipe(Ho(r=>{let g=`Loading icon set URL: ${this._sanitizer.sanitize(ul.RESOURCE_URL,a.url)} failed: ${r.message}`;return this._errorHandler.handleError(new Error(g)),oe(null)})));return cf(o).pipe(fe(()=>{let a=this._extractIconWithNameFromAnySet(A,i);if(!a)throw IJ(A);return a}))}_extractIconWithNameFromAnySet(A,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let a=this._svgElementFromConfig(o),r=this._extractSvgIconFromSet(a,A,o.options);if(r)return r}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(Wt(i=>A.svgText=i),fe(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?oe(null):this._fetchIcon(A).pipe(Wt(i=>A.svgText=i))}_extractSvgIconFromSet(A,i,n){let o=A.querySelector(`[id="${i}"]`);if(!o)return null;let a=o.cloneNode(!0);if(a.removeAttribute("id"),a.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(a,n);if(a.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(a),n);let r=this._svgElementFromString(NI(""));return r.appendChild(a),this._setSvgAttributes(r,n)}_svgElementFromString(A){let i=this._document.createElement("DIV");i.innerHTML=A;let n=i.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let i=this._svgElementFromString(NI("")),n=A.attributes;for(let o=0;oNI(g)),If(()=>this._inProgressUrlFetches.delete(a)),SC());return this._inProgressUrlFetches.set(a,s),s}_addSvgIconConfig(A,i,n){return this._svgIconConfigs.set(QJ(A,i),n),this}_addSvgIconSetConfig(A,i){let n=this._iconSetConfigs.get(A);return n?n.push(i):this._iconSetConfigs.set(A,[i]),this}_svgElementFromConfig(A){if(!A.svgElement){let i=this._svgElementFromString(A.svgText);this._setSvgAttributes(i,A.options),A.svgElement=i}return A.svgElement}_getIconConfigFromResolvers(A,i){for(let n=0;n{let t=h(Zt),e=t?t.location:null;return{getPathname:()=>e?e.pathname+e.search:""}}}),hJ=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],UlA=hJ.map(t=>`[${t}]`).join(", "),JlA=/^url\(['"]?#(.*?)['"]?\)$/,In=(()=>{class t{_elementRef=h(ge);_iconRegistry=h(EJ);_location=h(KlA);_errorHandler=h(df);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let i=this._cleanupFontValue(A);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let i=this._cleanupFontValue(A);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName=null;_svgNamespace=null;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Rn.EMPTY;constructor(){let A=h(new bs("aria-hidden"),{optional:!0}),i=h(GlA,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let i=A.split(":");switch(i.length){case 1:return["",i[0]];case 2:return i;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,i=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=A.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),i.forEach(n=>A.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(a=>{o.setAttribute(a.name,`url('${A}#${a.value}')`)})})}_cacheChildrenWithExternalReferences(A){let i=A.querySelectorAll(UlA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let r=i[o],s=r.getAttribute(a),g=s?s.match(JlA):null;if(g){let l=n.get(r);l||(l=[],n.set(r,l)),l.push({name:a,value:g[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[i,n]=this._splitIconName(A);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(qn(1)).subscribe(o=>this._setSvgElement(o),o=>{let a=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(a))})}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(i,n){i&2&&(ie("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),Qo(n.color?"mat-"+n.color:""),ae("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",he],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:_lA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto} `],encapsulation:2,changeDetection:0})}return t})(),Ug=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();var uJ=(()=>{class t{_animationsDisabled=Oi();state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,n){i&2&&ae("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationsDisabled)},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,n){},styles:[`.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-minimal-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-minimal-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-pseudo-checkbox-full-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-pseudo-checkbox-full-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-pseudo-checkbox-full-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-pseudo-checkbox-full-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-pseudo-checkbox-full-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-pseudo-checkbox-full-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px} `],encapsulation:2,changeDetection:0})}return t})();var YlA=["text"],HlA=[[["mat-icon"]],"*"],TlA=["mat-icon","*"];function OlA(t,e){if(t&1&&GA(0,"mat-pseudo-checkbox",1),t&2){let A=y();X("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function zlA(t,e){if(t&1&&GA(0,"mat-pseudo-checkbox",3),t&2){let A=y();X("disabled",A.disabled)}}function PlA(t,e){if(t&1&&(m(0,"span",4),K(1),D()),t&2){let A=y();p(),Fe("(",A.group.label,")")}}var Dp=new wA("MAT_OPTION_PARENT_COMPONENT"),wp=new wA("MatOptgroup");var pp=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},Mr=(()=>{class t{_element=h(ge);_changeDetectorRef=h(ft);_parent=h(Dp,{optional:!0});group=h(wp,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=h(An).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=jA(!1);get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new WA;_text;_stateChanges=new $A;constructor(){let A=h(Hn);A.load(Za),A.load(KC),this._signalDisableRipple=!!this._parent&&bI(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,i){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!aa(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new pp(this,A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-option"]],viewQuery:function(i,n){if(i&1&&ni(YlA,7),i&2){let o;Ce(o=Ie())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(i,n){i&1&&$("click",function(){return n._selectViaInteraction()})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(Bo("id",n.id),ie("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),ae("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",he]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:TlA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(i,n){i&1&&(Yt(HlA),V(0,OlA,1,2,"mat-pseudo-checkbox",1),He(1),m(2,"span",2,0),He(4,1),D(),V(5,zlA,1,1,"mat-pseudo-checkbox",3),V(6,PlA,2,1,"span",4),GA(7,"div",5)),i&2&&(W(n.multiple?0:-1),p(5),W(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),p(),W(n.group&&n.group._inert?6:-1),p(),X("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[uJ,Ns],styles:[`.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-active,.mat-mdc-option-multiple,:focus,:hover) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-pseudo-checkbox-minimal-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mat-list-list-item-selected-container-color: var(--mat-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""} `],encapsulation:2,changeDetection:0})}return t})();function Lb(t,e,A){if(A.length){let i=e.toArray(),n=A.toArray(),o=0;for(let a=0;aA+i?Math.max(0,t-i+e):A}var r4=(()=>{class t{_listeners=[];notify(A,i){for(let n of this._listeners)n(A,i)}listen(A){return this._listeners.push(A),()=>{this._listeners=this._listeners.filter(i=>A!==i)}}ngOnDestroy(){this._listeners=[]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var yp=class{applyChanges(e,A,i,n,o){e.forEachOperation((a,r,s)=>{let g,l;if(a.previousIndex==null){let C=i(a,r,s);g=A.createEmbeddedView(C.templateRef,C.context,C.index),l=kl.INSERTED}else s==null?(A.remove(r),l=kl.REMOVED):(g=A.get(r),A.move(g,s),l=kl.MOVED);o&&o({context:g?.context,operation:l,record:a})})}detach(){}};var $I=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected=null;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new $A;constructor(e=!1,A,i=!0,n){this._multiple=e,this._emitChanges=i,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(i=>this._markSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(i=>this._unmarkSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,i=new Set(e.map(o=>this._getConcreteValue(o)));e.forEach(o=>this._markSelected(o)),A.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let i of A)if(this.compareWith(e,i))return i;return e}else return e}};var fJ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();var Gb=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[YC,fJ,Mr,Fi]})}return t})();var jlA=["trigger"],qlA=["panel"],VlA=[[["mat-select-trigger"]],"*"],WlA=["mat-select-trigger","*"];function ZlA(t,e){if(t&1&&(m(0,"span",4),K(1),D()),t&2){let A=y();p(),qA(A.placeholder)}}function XlA(t,e){t&1&&He(0)}function $lA(t,e){if(t&1&&(m(0,"span",11),K(1),D()),t&2){let A=y(2);p(),qA(A.triggerValue)}}function AcA(t,e){if(t&1&&(m(0,"span",5),V(1,XlA,1,0)(2,$lA,2,1,"span",11),D()),t&2){let A=y();p(),W(A.customTrigger?1:2)}}function ecA(t,e){if(t&1){let A=zA();m(0,"div",12,1),$("keydown",function(n){rA(A);let o=y();return sA(o._handleKeydown(n))}),He(2,1),D()}if(t&2){let A=y();Qo(A.panelClass),ae("mat-select-panel-animations-enabled",!A._animationsDisabled)("mat-primary",(A._parentFormField==null?null:A._parentFormField.color)==="primary")("mat-accent",(A._parentFormField==null?null:A._parentFormField.color)==="accent")("mat-warn",(A._parentFormField==null?null:A._parentFormField.color)==="warn")("mat-undefined",!(A._parentFormField!=null&&A._parentFormField.color)),ie("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var tcA=new wA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>R0(t)}}),icA=new wA("MAT_SELECT_CONFIG"),ncA=new wA("MatSelectTrigger"),Kb=class{source;value;constructor(e,A){this.source=e,this.value=A}},Yg=(()=>{class t{_viewportRuler=h(Bs);_changeDetectorRef=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_idGenerator=h(An);_renderer=h(ui);_parentFormField=h(mh,{optional:!0});ngControl=h(xs,{self:!0,optional:!0});_liveAnnouncer=h(lh);_defaultOptions=h(icA,{optional:!0});_animationsDisabled=Oi();_popoverLocation;_initialized=new $A;_cleanupDetach;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let i=this.options.toArray()[A];if(i){let n=this.panel.nativeElement,o=Lb(A,this.options,this.optionGroups),a=i._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=_b(a.offsetTop,a.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new Kb(this,A)}_scrollStrategyFactory=h(tcA);_panelOpen=!1;_compareWith=(A,i)=>A===i;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new $A;_errorStateTracker;stateChanges=new $A;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;get disableRipple(){return this._disableRipple()}set disableRipple(A){this._disableRipple.set(A)}_disableRipple=jA(!1);tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(Ss.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=fc(()=>{let A=this.options;return A?A.changes.pipe(nn(A),Ei(()=>Qi(...A.map(i=>i.onSelectionChange)))):this._initialized.pipe(Ei(()=>this.optionSelectionChanges))});openedChange=new WA;_openedStream=this.openedChange.pipe(We(A=>A),fe(()=>{}));_closedStream=this.openedChange.pipe(We(A=>!A),fe(()=>{}));selectionChange=new WA;valueChange=new WA;constructor(){let A=h(Gd),i=h(bd,{optional:!0}),n=h(GC,{optional:!0}),o=h(new bs("tabindex"),{optional:!0}),a=h(n4,{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new Kd(A,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this._popoverLocation=a?.usePopover===!1?null:"inline",this.id=this.id}ngOnInit(){this._selectionModel=new $I(this.multiple),this.stateChanges.next(),this._viewportRuler.change().pipe(Bt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(Bt(this._destroy)).subscribe(A=>{A.added.forEach(i=>i.select()),A.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(nn(null),Bt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),i=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval),A.panelClass&&this.panelClass instanceof Set&&(this.panelClass=Array.from(this.panelClass))}ngOnDestroy(){this._cleanupDetach?.(),this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._cleanupDetach?.(),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._overlayDir.positionChange.pipe(qn(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()}),this._overlayDir.attachOverlay(),this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!0)))}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let i=`${this.id}-panel`;this._trackedModal&&Vf(this._trackedModal,"aria-owns",i),jv(A,"aria-owns",i),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;Vf(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._exitAndDetach(),this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next(),Promise.resolve().then(()=>this.openedChange.emit(!1)))}_exitAndDetach(){if(this._animationsDisabled||!this.panel){this._detachOverlay();return}this._cleanupDetach?.(),this._cleanupDetach=()=>{i(),clearTimeout(n),this._cleanupDetach=void 0};let A=this.panel.nativeElement,i=this._renderer.listen(A,"animationend",o=>{o.animationName==="_mat-select-exit"&&(this._cleanupDetach?.(),this._detachOverlay())}),n=setTimeout(()=>{this._cleanupDetach?.(),this._detachOverlay()},200);A.classList.add("mat-select-panel-exit")}_detachOverlay(){this._overlayDir.detachOverlay(),this._changeDetectorRef.markForCheck()}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let i=A.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,a=this._keyManager;if(!a.isTyping()&&o&&!aa(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let r=this.selected;a.onKeydown(A);let s=this.selected;s&&r!==s&&this._liveAnnouncer.announce(s.viewValue,1e4)}}_handleOpenKeydown(A){let i=this._keyManager,n=A.keyCode,o=n===40||n===38,a=i.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!a&&(n===13||n===32)&&i.activeItem&&!aa(A))A.preventDefault(),i.activeItem._selectViaInteraction();else if(!a&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let r=this.options.some(s=>!s.disabled&&!s.selected);this.options.forEach(s=>{s.disabled||(r?s.select():s.deselect())})}else{let r=i.activeItemIndex;i.onKeydown(A),this._multiple&&o&&A.shiftKey&&i.activeItem&&i.activeItemIndex!==r&&i.activeItem._selectViaInteraction()}}_handleOverlayKeydown(A){A.keyCode===27&&!aa(A)&&(A.preventDefault(),this.close())}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(A);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch(o){return!1}});return i&&this._selectionModel.select(i),i}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof aB?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new Qh(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=Qi(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Bt(A)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Qi(...this.options.map(i=>i._stateChanges)).pipe(Bt(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,i){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),i&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,A):A.indexOf(i)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:A,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let i=0;i0&&!!this._overlayDir}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,i=A?A+" ":"";return this.ariaLabelledby?i+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||"";return this.ariaLabelledby&&(A+=" "+this.ariaLabelledby),A||(A=this._valueId),A}get describedByIds(){return this._elementRef.nativeElement.getAttribute("aria-describedby")?.split(" ")||[]}setDescribedByIds(A){let i=this._elementRef.nativeElement;A.length?i.setAttribute("aria-describedby",A.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(A){let i=yr(A);i&&(i.tagName==="MAT-OPTION"||i.classList.contains("cdk-overlay-backdrop")||i.closest(".mat-mdc-select-panel"))||(this.focus(),this.open())}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-select"]],contentQueries:function(i,n,o){if(i&1&&na(o,ncA,5)(o,Mr,5)(o,wp,5),i&2){let a;Ce(a=Ie())&&(n.customTrigger=a.first),Ce(a=Ie())&&(n.options=a),Ce(a=Ie())&&(n.optionGroups=a)}},viewQuery:function(i,n){if(i&1&&ni(jlA,5)(qlA,5)(Qp,5),i&2){let o;Ce(o=Ie())&&(n.trigger=o.first),Ce(o=Ie())&&(n.panel=o.first),Ce(o=Ie())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:21,hostBindings:function(i,n){i&1&&$("keydown",function(a){return n._handleKeydown(a)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),i&2&&(ie("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),ae("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple)("mat-select-open",n.panelOpen))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",he],disableRipple:[2,"disableRipple","disableRipple",he],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Zi(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",he],placeholder:"placeholder",required:[2,"required","required",he],multiple:[2,"multiple","multiple",he],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",he],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",Zi],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",he]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[It([{provide:fh,useExisting:t},{provide:Dp,useExisting:t}]),ei],ngContentSelectors:WlA,decls:11,vars:10,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"detach","backdropClick","overlayKeydown","cdkConnectedOverlayDisableClose","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth","cdkConnectedOverlayFlexibleDimensions","cdkConnectedOverlayUsePopover"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",1,"mat-mdc-select-panel","mdc-menu-surface","mdc-menu-surface--open",3,"keydown"]],template:function(i,n){if(i&1&&(Yt(VlA),m(0,"div",2,0),$("click",function(){return n.open()}),m(3,"div",3),V(4,ZlA,2,1,"span",4)(5,AcA,3,1,"span",5),D(),m(6,"div",6)(7,"div",7),Qt(),m(8,"svg",8),GA(9,"path",9),D()()()(),yt(10,ecA,3,16,"ng-template",10),$("detach",function(){return n.close()})("backdropClick",function(){return n.close()})("overlayKeydown",function(a){return n._handleOverlayKeydown(a)})),i&2){let o=Wi(1);p(3),ie("id",n._valueId),p(),W(n.empty?4:5),p(6),X("cdkConnectedOverlayDisableClose",!0)("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)("cdkConnectedOverlayFlexibleDimensions",!0)("cdkConnectedOverlayUsePopover",n._popoverLocation)}},dependencies:[aB,Qp],styles:[`@keyframes _mat-select-enter{from{opacity:0;transform:scaleY(0.8)}to{opacity:1;transform:none}}@keyframes _mat-select-exit{from{opacity:1}to{opacity:0}}.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-select-open .mat-mdc-select-arrow{transform:rotate(180deg)}.mat-form-field-animations-enabled .mat-mdc-select-arrow{transition:transform 80ms linear}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:relative;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}.mat-select-panel-animations-enabled{animation:_mat-select-enter 120ms cubic-bezier(0, 0, 0.2, 1)}.mat-select-panel-animations-enabled.mat-select-panel-exit{animation:_mat-select-exit 100ms linear}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field:not(.mat-form-field-animations-enabled) .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))} `],encapsulation:2,changeDetection:0})}return t})();var Ub=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Kg,Gb,Fi,Fc,vr,Gb]})}return t})();var acA=["tooltip"],rcA=20;var scA=new wA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>R0(t,{scrollThrottle:rcA})}}),gcA=new wA("mat-tooltip-default-options",{providedIn:"root",factory:()=>({showDelay:0,hideDelay:0,touchendHideDelay:1500})});var mJ="tooltip-panel",lcA={passive:!0},ccA=8,CcA=8,IcA=24,dcA=200,Ba=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_platform=h(ci);_ariaDescriber=h(U_);_focusMonitor=h(Ha);_dir=h(wo);_injector=h(ut);_viewContainerRef=h(Ro);_mediaMatcher=h(Sd);_document=h(Zt);_renderer=h(ui);_animationsDisabled=Oi();_defaultOptions=h(gcA,{optional:!0});_overlayRef=null;_tooltipInstance=null;_overlayPanelClass;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=pJ;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending=!1;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=sr(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let i=sr(A);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=Rs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=Rs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let i=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_eventCleanups=[];_touchstartTimeout=null;_destroyed=new $A;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=ccA}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(Bt(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._eventCleanups.forEach(i=>i()),this._eventCleanups.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new Cg(this._tooltipComponent,this._viewContainerRef);let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(Bt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(A):(i._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let a=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&a._origin instanceof ge)return this._overlayRef;this._detach()}let i=this._injector.get(Lc).getAncestorScrollContainers(this._elementRef),n=`${this._cssClassPrefix}-${mJ}`,o=XI(this._injector,this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i).withPopoverLocation("global");return o.positionChanges.pipe(Bt(this._destroyed)).subscribe(a=>{this._updateCurrentPositionClass(a.connectionPair),this._tooltipInstance&&a.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=Rl(this._injector,{direction:this._dir,positionStrategy:o,panelClass:this._overlayPanelClass?[...this._overlayPanelClass,n]:n,scrollStrategy:this._injector.get(scA)(),disableAnimations:this._animationsDisabled,eventPredicate:this._overlayEventPredicate}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(Bt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(Bt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(Bt(this._destroyed)).subscribe(a=>{a.preventDefault(),a.stopPropagation(),this._ngZone.run(()=>this.hide(0))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(Bt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let i=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(BA(BA({},n.main),o.main)),this._addOffset(BA(BA({},n.fallback),o.fallback))])}_addOffset(A){let i=CcA,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-i:A.originY==="bottom"?A.offsetY=i:A.originX==="start"?A.offsetX=n?-i:i:A.originX==="end"&&(A.offsetX=n?i:-i),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"||i=="below"?n={originX:"center",originY:i=="above"?"top":"bottom"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={originX:"start",originY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:a}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:a}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"?n={overlayX:"center",overlayY:"bottom"}:i=="below"?n={overlayX:"center",overlayY:"top"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:a}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:a}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),Nn(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A instanceof Set?Array.from(A):A,this._tooltipInstance._markForCheck())}_invertPosition(A,i){return this.position==="above"||this.position==="below"?i==="top"?i="bottom":i==="bottom"&&(i="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:i}}_updateCurrentPositionClass(A){let{overlayY:i,originX:n,originY:o}=A,a;if(i==="center"?this._dir&&this._dir.value==="rtl"?a=n==="end"?"left":"right":a=n==="start"?"left":"right":a=i==="bottom"&&o==="top"?"above":"below",a!==this._currentPosition){let r=this._overlayRef;if(r){let s=`${this._cssClassPrefix}-${mJ}-`;r.removePanelClass(s+this._currentPosition),r.addPanelClass(s+a)}this._currentPosition=a}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._eventCleanups.length||(this._isTouchPlatform()?this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._addListener("touchstart",A=>{let i=A.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)})):this._addListener("mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let i;A.x!==void 0&&A.y!==void 0&&(i=A),this.show(void 0,i)}))}_setupPointerExitEventsIfNeeded(){if(!this._pointerExitEventsInitialized){if(this._pointerExitEventsInitialized=!0,!this._isTouchPlatform())this._addListener("mouseleave",A=>{let i=A.relatedTarget;(!i||!this._overlayRef?.overlayElement.contains(i))&&this.hide()}),this._addListener("wheel",A=>{if(this._isTooltipVisible()){let i=this._document.elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}});else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let A=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};this._addListener("touchend",A),this._addListener("touchcancel",A)}}}_addListener(A,i){this._eventCleanups.push(this._renderer.listen(this._elementRef.nativeElement,A,i,lcA))}_isTouchPlatform(){return this._platform.IOS||this._platform.ANDROID?!0:this._platform.isBrowser?!!this._defaultOptions?.detectHoverCapability&&this._mediaMatcher.matchMedia("(any-hover: none)").matches:!1}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let i=this._elementRef.nativeElement,n=i.style;(A==="on"||i.nodeName!=="INPUT"&&i.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!i.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||Nn({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}_overlayEventPredicate=A=>A.type==="keydown"?this._isTooltipVisible()&&A.keyCode===27&&!aa(A):!0;static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return t})(),pJ=(()=>{class t{_changeDetectorRef=h(ft);_elementRef=h(ge);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled=Oi();_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new $A;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>IcA&&A.width>=dcA}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(A?o:n),i.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let a=getComputedStyle(i);(a.getPropertyValue("animation-duration")==="0s"||a.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(i.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-tooltip-component"]],viewQuery:function(i,n){if(i&1&&ni(acA,7),i&2){let o;Ce(o=Ie())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(i,n){i&1&&$("mouseleave",function(a){return n._handleMouseLeave(a)})},decls:4,vars:5,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(i,n){i&1&&(ti(0,"div",1,0),pc("animationend",function(a){return n._handleAnimationEnd(a)}),ti(2,"div",2),K(3),Ii()()),i&2&&(Qo(n.tooltipClass),ae("mdc-tooltip--multiline",n._isMultiline),p(3),qA(n.message))},styles:[`.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mat-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mat-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mat-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mat-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mat-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mat-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards} `],encapsulation:2,changeDetection:0})}return t})();var WC=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[ch,Kg,Fi,Fc]})}return t})();function BcA(t,e){if(t&1&&(m(0,"mat-option",17),K(1),D()),t&2){let A=e.$implicit;X("value",A),p(),Fe(" ",A," ")}}function QcA(t,e){if(t&1){let A=zA();m(0,"mat-form-field",14)(1,"mat-select",16,0),$("selectionChange",function(n){rA(A);let o=y(2);return sA(o._changePageSize(n.value))}),Gt(3,BcA,2,2,"mat-option",17,Ri),D(),m(5,"div",18),$("click",function(){rA(A);let n=Wi(2);return sA(n.open())}),D()()}if(t&2){let A=y(2);X("appearance",A._formFieldAppearance)("color",A.color),p(),X("value",A.pageSize)("disabled",A.disabled),Df("aria-labelledby",A._pageSizeLabelId),X("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),p(2),Kt(A._displayedPageSizeOptions)}}function EcA(t,e){if(t&1&&(m(0,"div",15),K(1),D()),t&2){let A=y(2);p(),qA(A.pageSize)}}function hcA(t,e){if(t&1&&(m(0,"div",3)(1,"div",13),K(2),D(),V(3,QcA,6,7,"mat-form-field",14),V(4,EcA,2,1,"div",15),D()),t&2){let A=y();p(),ie("id",A._pageSizeLabelId),p(),Fe(" ",A._intl.itemsPerPageLabel," "),p(),W(A._displayedPageSizeOptions.length>1?3:-1),p(),W(A._displayedPageSizeOptions.length<=1?4:-1)}}function ucA(t,e){if(t&1){let A=zA();m(0,"button",19),$("click",function(){rA(A);let n=y();return sA(n._buttonClicked(0,n._previousButtonsDisabled()))}),Qt(),m(1,"svg",8),GA(2,"path",20),D()()}if(t&2){let A=y();X("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled())("tabindex",A._previousButtonsDisabled()?-1:null),ie("aria-label",A._intl.firstPageLabel)}}function fcA(t,e){if(t&1){let A=zA();m(0,"button",21),$("click",function(){rA(A);let n=y();return sA(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),Qt(),m(1,"svg",8),GA(2,"path",22),D()()}if(t&2){let A=y();X("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled())("tabindex",A._nextButtonsDisabled()?-1:null),ie("aria-label",A._intl.lastPageLabel)}}var bp=(()=>{class t{changes=new $A;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*i,a=o{class t{_intl=h(bp);_changeDetectorRef=h(ft);_formFieldAppearance;_pageSizeLabelId=h(An).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new El(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(i=>Zi(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new WA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,i=h(pcA,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:a,showFirstLastButtons:r}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),a!=null&&(this.hidePageSize=a),r!=null&&(this.showFirstLastButtons=r)}this._formFieldAppearance=i?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let i=this.pageIndex;A!==i&&(this.pageIndex=A,this._emitPageEvent(i))}_buttonClicked(A,i){i||this._navigate(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",Zi],length:[2,"length","length",Zi],pageSize:[2,"pageSize","pageSize",Zi],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",he],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",he],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",he]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:14,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-atomic","true","aria-live","polite","role","status",1,"mat-mdc-paginator-range-label"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled","tabindex"],["aria-hidden","true",1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["matIconButton","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled","tabindex"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(i,n){i&1&&(m(0,"div",1)(1,"div",2),V(2,hcA,5,4,"div",3),m(3,"div",4)(4,"div",5),K(5),D(),V(6,ucA,3,5,"button",6),m(7,"button",7),$("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),Qt(),m(8,"svg",8),GA(9,"path",9),D()(),Tr(),m(10,"button",10),$("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),Qt(),m(11,"svg",8),GA(12,"path",11),D()(),V(13,fcA,3,5,"button",12),D()()()),i&2&&(p(2),W(n.hidePageSize?-1:2),p(3),Fe(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),p(),W(n.showFirstLastButtons?6:-1),p(),X("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled())("tabindex",n._previousButtonsDisabled()?-1:null),ie("aria-label",n._intl.previousPageLabel),p(3),X("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled())("tabindex",n._nextButtonsDisabled()?-1:null),ie("aria-label",n._intl.nextPageLabel),p(3),W(n.showFirstLastButtons?13:-1))},dependencies:[To,Yg,Mr,Ia,Ba],styles:[`.mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height: var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding: var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:var(--mat-paginator-page-size-select-width, 84px)}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}.mat-mdc-paginator-range-actions .mat-mdc-icon-button[aria-disabled]{color:GrayText}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:var(--mat-paginator-page-size-select-width, 84px);height:var(--mat-paginator-page-size-select-touch-target-height, 48px);background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer} `],encapsulation:2,changeDetection:0})}return t})();var wJ=["*"],DcA=["content"],wcA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],ycA=["mat-drawer","mat-drawer-content","*"];function vcA(t,e){if(t&1){let A=zA();m(0,"div",1),$("click",function(){rA(A);let n=y();return sA(n._onBackdropClicked())}),D()}if(t&2){let A=y();ae("mat-drawer-shown",A._isShowingBackdrop())}}function bcA(t,e){t&1&&(m(0,"mat-drawer-content"),He(1,2),D())}var McA=new wA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:()=>!1}),yJ=new wA("MAT_DRAWER_CONTAINER"),Jb=(()=>{class t extends x0{_platform=h(ci);_changeDetectorRef=h(ft);_container=h(Hb);constructor(){let A=h(ge),i=h(Lc),n=h(Oe);super(A,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:i}=this._container;return A!=null&&A.mode!=="over"&&A.opened||i!=null&&i.mode!=="over"&&i.opened}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(i,n){i&2&&(En("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),ae("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[It([{provide:x0,useExisting:t}]),Ct],ngContentSelectors:wJ,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},encapsulation:2,changeDetection:0})}return t})(),Yb=(()=>{class t{_elementRef=h(ge);_focusTrapFactory=h(gh);_focusMonitor=h(Ha);_platform=h(ci);_ngZone=h(Oe);_renderer=h(ui);_interactivityChecker=h(xd);_doc=h(Zt);_container=h(yJ,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached=!1;_anchor=null;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=sr(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=sr(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened()}set opened(A){this.toggle(sr(A))}_opened=jA(!1);_openedVia=null;_animationStarted=new $A;_animationEnd=new $A;openedChange=new WA(!0);_openedStream=this.openedChange.pipe(We(A=>A),fe(()=>{}));openedStart=this._animationStarted.pipe(We(()=>this.opened),VE(void 0));_closedStream=this.openedChange.pipe(We(A=>!A),fe(()=>{}));closedStart=this._animationStarted.pipe(We(()=>!this.opened),VE(void 0));_destroyed=new $A;onPositionChanged=new WA;_content;_modeChanged=new $A;_injector=h(ut);_changeDetectorRef=h(ft);constructor(){this.openedChange.pipe(Bt(this._destroyed)).subscribe(A=>{A?(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement,this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._eventCleanups=this._ngZone.runOutsideAngular(()=>{let A=this._renderer,i=this._elementRef.nativeElement;return[A.listen(i,"keydown",n=>{n.keyCode===27&&!this.disableClose&&!aa(n)&&this._ngZone.run(()=>{this.close(),n.stopPropagation(),n.preventDefault()})}),A.listen(i,"transitionrun",this._handleTransitionEvent),A.listen(i,"transitionend",this._handleTransitionEvent),A.listen(i,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this.opened)})}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),a(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),a=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":Nn(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,i){A&&i&&(this._openedVia=i);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,i,n){return A===this.opened?Promise.resolve(A?"open":"close"):(this._opened.set(A),this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(qn(1)).subscribe(a=>o(a?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=this.opened&&!!this._container?._isShowingBackdrop())}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=A=>{let i=this._elementRef.nativeElement;A.target===i&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-drawer"]],viewQuery:function(i,n){if(i&1&&ni(DcA,5),i&2){let o;Ce(o=Ie())&&(n._content=o.first)}},hostAttrs:[1,"mat-drawer"],hostVars:12,hostBindings:function(i,n){i&2&&(ie("align",null)("tabIndex",n.mode!=="side"?"-1":null),En("visibility",!n._container&&!n.opened?"hidden":null),ae("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:wJ,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(i,n){i&1&&(Yt(),m(0,"div",1,0),He(2),D())},dependencies:[x0],encapsulation:2,changeDetection:0})}return t})(),Hb=(()=>{class t{_dir=h(wo,{optional:!0});_element=h(ge);_ngZone=h(Oe);_changeDetectorRef=h(ft);_animationDisabled=Oi();_transitionsEnabled=!1;_allDrawers;_drawers=new Sg;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=sr(A)}_autosize=h(McA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:sr(A)}_backdropOverride=null;backdropClick=new WA;_start=null;_end=null;_left=null;_right=null;_destroyed=new $A;_doCheckSubject=new $A;_contentMargins={left:null,right:null};_contentMarginChanges=new $A;get scrollable(){return this._userContent||this._content}_injector=h(ut);constructor(){let A=h(ci),i=h(Bs);this._dir?.change.pipe(Bt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(Bt(this._destroyed)).subscribe(()=>this.updateContentMargins()),!this._animationDisabled&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(nn(this._allDrawers),Bt(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(nn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(ps(10),Bt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,i=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")i+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();i+=n,A-=n}}A=A||null,i=i||null,(A!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:A,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(Bt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(Bt(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(Bt(this._drawers.changes)).subscribe(()=>{Nn({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(Bt(Qi(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let i=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-drawer-container"]],contentQueries:function(i,n,o){if(i&1&&na(o,Jb,5)(o,Yb,5),i&2){let a;Ce(a=Ie())&&(n._content=a.first),Ce(a=Ie())&&(n._allDrawers=a)}},viewQuery:function(i,n){if(i&1&&ni(Jb,5),i&2){let o;Ce(o=Ie())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[It([{provide:yJ,useExisting:t}])],ngContentSelectors:ycA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(i,n){i&1&&(Yt(wcA),V(0,vcA,1,2,"div",0),He(1),He(2,1),V(3,bcA,2,0,"mat-drawer-content")),i&2&&(W(n.hasBackdrop?0:-1),p(3),W(n._content?-1:3))},dependencies:[Jb],styles:[`.mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed} `],encapsulation:2,changeDetection:0})}return t})();var kcA=["mat-internal-form-field",""],ScA=["*"],Mp=(()=>{class t{labelPosition="after";static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:kcA,ngContentSelectors:ScA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:[`.mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0} `],encapsulation:2,changeDetection:0})}return t})();var xcA=["switch"],RcA=["*"];function NcA(t,e){t&1&&(m(0,"span",11),Qt(),m(1,"svg",13),GA(2,"path",14),D(),m(3,"svg",15),GA(4,"path",16),D()())}var FcA=new wA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),kp=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},vJ=(()=>{class t{_elementRef=h(ge);_focusMonitor=h(Ha);_changeDetectorRef=h(ft);defaults=h(FcA);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new kp(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations=Oi();_focused=!1;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required=!1;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new WA;toggleChange=new WA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){h(Hn).load(Za);let A=h(new bs("tabindex"),{optional:!0}),i=this.defaults;this.tabIndex=A==null?0:parseInt(A)||0,this.color=i.color||"accent",this.id=this._uniqueId=h(An).getId("mat-mdc-slide-toggle-"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new kp(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-slide-toggle"]],viewQuery:function(i,n){if(i&1&&ni(xcA,5),i&2){let o;Ce(o=Ie())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(i,n){i&2&&(Bo("id",n.id),ie("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),Qo(n.color?"mat-"+n.color:""),ae("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",he],color:"color",disabled:[2,"disabled","disabled",he],disableRipple:[2,"disableRipple","disableRipple",he],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Zi(A)],checked:[2,"checked","checked",he],hideIcon:[2,"hideIcon","hideIcon",he],disabledInteractive:[2,"disabledInteractive","disabledInteractive",he]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[It([{provide:gg,useExisting:ar(()=>t),multi:!0},{provide:vc,useExisting:t,multi:!0}]),ei],ngContentSelectors:RcA,decls:14,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mat-mdc-slide-toggle-touch-target"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(i,n){if(i&1&&(Yt(),m(0,"div",1)(1,"button",2,0),$("click",function(){return n._handleClick()}),GA(3,"div",3)(4,"span",4),m(5,"span",5)(6,"span",6)(7,"span",7),GA(8,"span",8),D(),m(9,"span",9),GA(10,"span",10),D(),V(11,NcA,5,0,"span",11),D()()(),m(12,"label",12),$("click",function(a){return a.stopPropagation()}),He(13),D()()),i&2){let o=Wi(2);X("labelPosition",n.labelPosition),p(),ae("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),X("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),ie("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),p(9),X("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),p(),W(n.hideIcon?-1:11),p(),X("for",n.buttonId),ie("id",n._labelId)}},dependencies:[Ns,Mp],styles:[`.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mat-slide-toggle-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mat-slide-toggle-track-height, 32px);border-radius:var(--mat-slide-toggle-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mat-slide-toggle-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-slide-toggle-track-outline-width, 2px);border-color:var(--mat-slide-toggle-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-slide-toggle-selected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-slide-toggle-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-slide-toggle-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mat-slide-toggle-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mat-slide-toggle-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mat-slide-toggle-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mat-slide-toggle-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-visible-track-opacity, 1);transition:var(--mat-slide-toggle-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-slide-toggle-hidden-track-opacity, 0);transition:var(--mat-slide-toggle-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mat-slide-toggle-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mat-slide-toggle-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mat-slide-toggle-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mat-slide-toggle-handle-width);height:var(--mat-slide-toggle-handle-height);border-radius:var(--mat-slide-toggle-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-slide-toggle-unselected-handle-size, 16px);height:var(--mat-slide-toggle-unselected-handle-size, 16px);margin:var(--mat-slide-toggle-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-slide-toggle-selected-handle-size, 24px);height:var(--mat-slide-toggle-selected-handle-size, 24px);margin:var(--mat-slide-toggle-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-slide-toggle-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-slide-toggle-with-icon-handle-size, 24px);height:var(--mat-slide-toggle-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-slide-toggle-pressed-handle-size, 28px);height:var(--mat-slide-toggle-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-slide-toggle-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-slide-toggle-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mat-slide-toggle-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mat-slide-toggle-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mat-slide-toggle-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mat-slide-toggle-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mat-slide-toggle-state-layer-size, 40px);height:var(--mat-slide-toggle-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mat-slide-toggle-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-hover-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-focus-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mat-slide-toggle-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mat-slide-toggle-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1;transform:translateZ(0)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mat-slide-toggle-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mat-slide-toggle-unselected-icon-size, 16px);height:var(--mat-slide-toggle-unselected-icon-size, 16px);fill:var(--mat-slide-toggle-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mat-slide-toggle-selected-icon-size, 16px);height:var(--mat-slide-toggle-selected-icon-size, 16px);fill:var(--mat-slide-toggle-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mat-slide-toggle-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-slide-toggle-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-slide-toggle-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-slide-toggle-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-slide-toggle-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-slide-toggle-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-slide-toggle-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mat-slide-toggle-disabled-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-slide-toggle label:empty{display:none}.mat-mdc-slide-toggle-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-slide-toggle-touch-target-size, 48px);width:100%;transform:translate(-50%, -50%);display:var(--mat-slide-toggle-touch-target-display, block)}[dir=rtl] .mat-mdc-slide-toggle-touch-target{left:auto;right:50%;transform:translate(50%, -50%)} `],encapsulation:2,changeDetection:0})}return t})();function LcA(t,e){if(t&1){let A=zA();m(0,"div",1)(1,"button",2),$("click",function(){rA(A);let n=y();return sA(n.action())}),K(2),D()()}if(t&2){let A=y();p(2),Fe(" ",A.data.action," ")}}var _cA=["label"];function GcA(t,e){}var KcA=Math.pow(2,31)-1,s4=class{_overlayRef;instance;containerInstance;_afterDismissed=new $A;_afterOpened=new $A;_onAction=new $A;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,KcA))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},bJ=new wA("MatSnackBarData"),sB=class{politeness="polite";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},UcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return t})(),JcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return t})(),YcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return t})(),HcA=(()=>{class t{snackBarRef=h(s4);data=h(bJ);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["matButton","","matSnackBarAction","",3,"click"]],template:function(i,n){i&1&&(m(0,"div",0),K(1),D(),V(2,LcA,3,1,"div",1)),i&2&&(p(),Fe(" ",n.data.message,` `),p(),W(n.hasAction?2:-1))},dependencies:[vn,UcA,JcA,YcA],styles:[`.mat-mdc-simple-snack-bar{display:flex}.mat-mdc-simple-snack-bar .mat-mdc-snack-bar-label{max-height:50vh;overflow:auto} `],encapsulation:2,changeDetection:0})}return t})(),Tb="_mat-snack-bar-enter",Ob="_mat-snack-bar-exit",TcA=(()=>{class t extends PC{_ngZone=h(Oe);_elementRef=h(ge);_changeDetectorRef=h(ft);_platform=h(ci);_animationsDisabled=Oi();snackBarConfig=h(sB);_document=h(Zt);_trackedModals=new Set;_enterFallback;_exitFallback;_injector=h(ut);_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new $A;_onExit=new $A;_onEnter=new $A;_animationState="void";_live;_label;_role;_liveElementId=h(An).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),i}attachTemplatePortal(A){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),i}attachDomPortal=A=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),i};onAnimationEnd(A){A===Ob?this._completeExit():A===Tb&&(clearTimeout(this._enterFallback),this._ngZone.run(()=>{this._onEnter.next(),this._onEnter.complete()}))}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce(),this._animationsDisabled?Nn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Tb)))},{injector:this._injector}):(clearTimeout(this._enterFallback),this._enterFallback=setTimeout(()=>{this._elementRef.nativeElement.classList.add("mat-snack-bar-fallback-visible"),this.onAnimationEnd(Tb)},200)))}exit(){return this._destroyed?oe(void 0):(this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId),this._animationsDisabled?Nn(()=>{this._ngZone.run(()=>queueMicrotask(()=>this.onAnimationEnd(Ob)))},{injector:this._injector}):(clearTimeout(this._exitFallback),this._exitFallback=setTimeout(()=>this.onAnimationEnd(Ob),200))}),this._onExit)}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){clearTimeout(this._exitFallback),queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(a=>A.classList.add(a)):A.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let i=A.getAttribute("aria-owns");if(i){let n=i.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{if(this._destroyed)return;let A=this._elementRef.nativeElement,i=A.querySelector("[aria-hidden]"),n=A.querySelector("[aria-live]");if(i&&n){let o=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&i.contains(document.activeElement)&&(o=document.activeElement),i.removeAttribute("aria-hidden"),n.appendChild(i),o?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-snack-bar-container"]],viewQuery:function(i,n){if(i&1&&ni(Ig,7)(_cA,7),i&2){let o;Ce(o=Ie())&&(n._portalOutlet=o.first),Ce(o=Ie())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:6,hostBindings:function(i,n){i&1&&$("animationend",function(a){return n.onAnimationEnd(a.animationName)})("animationcancel",function(a){return n.onAnimationEnd(a.animationName)}),i&2&&ae("mat-snack-bar-container-enter",n._animationState==="visible")("mat-snack-bar-container-exit",n._animationState==="hidden")("mat-snack-bar-container-animations-enabled",!n._animationsDisabled)},features:[Ct],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(m(0,"div",1)(1,"div",2,0)(3,"div",3),yt(4,GcA,0,0,"ng-template",4),D(),GA(5,"div"),D()()),i&2&&(p(5),ie("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[Ig],styles:[`@keyframes _mat-snack-bar-enter{from{transform:scale(0.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes _mat-snack-bar-exit{from{opacity:1}to{opacity:0}}.mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-snack-bar-container-animations-enabled{opacity:0}.mat-snack-bar-container-animations-enabled.mat-snack-bar-fallback-visible{opacity:1}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-enter{animation:_mat-snack-bar-enter 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-snack-bar-container-animations-enabled.mat-snack-bar-container-exit{animation:_mat-snack-bar-exit 75ms cubic-bezier(0.4, 0, 1, 1) forwards}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mat-snack-bar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mat-snack-bar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-snack-bar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mat-snack-bar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mat-snack-bar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mat-snack-bar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mat-snack-bar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-button-text-state-layer-color: currentColor;--mat-button-text-ripple-color: currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1} `],encapsulation:2})}return t})(),OcA=new wA("mat-snack-bar-default-options",{providedIn:"root",factory:()=>new sB}),ZC=(()=>{class t{_live=h(lh);_injector=h(ut);_breakpointObserver=h(sh);_parentSnackBar=h(t,{optional:!0,skipSelf:!0});_defaultConfig=h(OcA);_animationsDisabled=Oi();_snackBarRefAtThisLevel=null;simpleSnackBarComponent=HcA;snackBarContainerComponent=TcA;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,i){return this._attach(A,i)}openFromTemplate(A,i){return this._attach(A,i)}open(A,i="",n){let o=BA(BA({},this._defaultConfig),n);return o.data={message:A,action:i},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=ut.create({parent:n||this._injector,providers:[{provide:sB,useValue:i}]}),a=new Cg(this.snackBarContainerComponent,i.viewContainerRef,o),r=A.attach(a);return r.instance.snackBarConfig=i,r.instance}_attach(A,i){let n=BA(BA(BA({},new sB),this._defaultConfig),i),o=this._createOverlay(n),a=this._attachSnackBarContainer(o,n),r=new s4(a,o);if(A instanceof Fn){let s=new Vr(A,null,{$implicit:n.data,snackBarRef:r});r.instance=a.attachTemplatePortal(s)}else{let s=this._createInjector(n,r),g=new Cg(A,void 0,s),l=a.attachComponentPortal(g);r.instance=l.instance}return this._breakpointObserver.observe(Y_.HandsetPortrait).pipe(Bt(o.detachments())).subscribe(s=>{o.overlayElement.classList.toggle(this.handsetCssClass,s.matches)}),n.announcementMessage&&a._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(r,n),this._openedSnackBarRef=r,this._openedSnackBarRef}_animateSnackBar(A,i){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),i.duration&&i.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(i.duration)),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter()}_createOverlay(A){let i=new Sl;i.direction=A.direction;let n=jC(this._injector),o=A.direction==="rtl",a=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,r=!a&&A.horizontalPosition!=="center";return a?n.left("0"):r?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),i.positionStrategy=n,i.disableAnimations=this._animationsDisabled,Rl(this._injector,i)}_createInjector(A,i){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return ut.create({parent:n||this._injector,providers:[{provide:s4,useValue:i},{provide:bJ,useValue:A.data}]})}static \u0275fac=function(i){return new(i||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var zcA=t=>["segment",t],PcA=(t,e)=>({"segment-main":!0,expandable:t,expanded:e});function jcA(t,e){t&1&&GA(0,"div",9)}function qcA(t,e){if(t&1&&(m(0,"span",10),K(1),D()),t&2){let A=y().$implicit;p(),qA(A.description)}}function VcA(t,e){if(t&1&&(m(0,"section",11),GA(1,"ngx-json-viewer",12),D()),t&2){let A=y().$implicit,i=y();p(),X("json",A.value)("expanded",i.expanded)("depth",i.depth)("_currentDepth",i._currentDepth+1)}}function WcA(t,e){if(t&1){let A=zA();m(0,"section",2)(1,"section",3),$("click",function(){let n=rA(A).$implicit,o=y();return sA(o.toggle(n))}),yt(2,jcA,1,0,"div",4),m(3,"span",5),K(4),D(),m(5,"span",6),K(6,": "),D(),yt(7,qcA,2,1,"span",7),D(),yt(8,VcA,2,4,"section",8),D()}if(t&2){let A=e.$implicit,i=y();X("ngClass",zr(6,zcA,"segment-type-"+A.type)),p(),X("ngClass",fl(8,PcA,i.isExpandable(A),A.expanded)),p(),X("ngIf",i.isExpandable(A)),p(2),qA(A.key),p(3),X("ngIf",!A.expanded||!i.isExpandable(A)),p(),X("ngIf",A.expanded&&i.isExpandable(A))}}var XC=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json=="object"?Object.keys(this.json).forEach(A=>{this.segments.push(this.parseKeyValue(A,this.json[A]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(A){return A.type==="object"||A.type==="array"}toggle(A){this.isExpandable(A)&&(A.expanded=!A.expanded)}parseKeyValue(A,i){let n={key:A,value:i,type:void 0,description:""+i,expanded:this.isExpanded()};switch(typeof n.value){case"number":{n.type="number";break}case"boolean":{n.type="boolean";break}case"function":{n.type="function";break}case"string":{n.type="string",n.description='"'+n.value+'"';break}case"undefined":{n.type="undefined",n.description="undefined";break}case"object":{n.value===null?(n.type="null",n.description="null"):Array.isArray(n.value)?(n.type="array",n.description="Array["+n.value.length+"] "+JSON.stringify(n.value)):n.value instanceof Date?n.type="date":(n.type="object",n.description="Object "+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(A){let i=new WeakMap;return(function n(o,a){let r,s;return typeof o=="object"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(r=i.get(o),r!==void 0?{$ref:r}:(i.set(o,a),Array.isArray(o)?(s=[],o.forEach(function(g,l){s[l]=n(g,a+"["+l+"]")})):(s={},Object.keys(o).forEach(function(g){s[g]=n(o[g],a+"["+JSON.stringify(g)+"]")})),s)):o})(A,"$")}}return t.\u0275fac=function(A){return new(A||t)},t.\u0275cmp=kA({type:t,selectors:[["ngx-json-viewer"]],inputs:{json:"json",expanded:"expanded",depth:"depth",_currentDepth:"_currentDepth"},standalone:!1,features:[ei],decls:2,vars:1,consts:[[1,"ngx-json-viewer"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],[3,"click","ngClass"],["class","toggler",4,"ngIf"],[1,"segment-key"],[1,"segment-separator"],["class","segment-value",4,"ngIf"],["class","children",4,"ngIf"],[1,"toggler"],[1,"segment-value"],[1,"children"],[3,"json","expanded","depth","_currentDepth"]],template:function(A,i){A&1&&(m(0,"section",0),yt(1,WcA,9,11,"section",1),D()),A&2&&(p(),X("ngForOf",i.segments))},dependencies:[Rg,md,yc,t],styles:['@charset "UTF-8";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:"\\25ba";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%] .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),Gc=(()=>{class t{}return t.\u0275fac=function(A){return new(A||t)},t.\u0275mod=Xe({type:t}),t.\u0275inj=Ze({imports:[oa]}),t})();var kr=class t{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let e=t.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var Ks=new wA("AgentService");var Kc=new wA("AgentBuilderService");var xp=new wA("ArtifactService");var gB=new wA("DownloadService");var Uc=new wA("EvalService");var lB=new wA("EventService");var MJ="import_session",kJ="edit_function_args";var SJ="a2a_card",lr=new wA("FeatureFlagService");var cB=new wA("GraphService");var Rp=new wA("LocalFileService");var Wr=new wA("SafeValuesService"),Np=class{openBase64InNewTab(e,A){try{if(!e)return;let i=e;if(e.startsWith("data:")&&e.includes(";base64,")&&(i=i.substring(i.indexOf(";base64,")+8)),!A||!i)return;let n=atob(i),o=new Array(n.length);for(let g=0;gthis.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--bottom-panel-height","310px"),this.renderer.setStyle(this.el.nativeElement,"height","var(--bottom-panel-height)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorY:e.clientY,startingHeight:this.bottomPanelHeight},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=this.resizingEvent.startingCursorY-e.clientY,i=this.resizingEvent.startingHeight+A;this.bottomPanelHeight=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.bottomMaxHeight=window.innerHeight/2,this.bottomPanelHeight=this.bottomPanelHeight}set bottomPanelHeight(e){let A=Math.min(Math.max(e,this.bottomMinHeight),this.bottomMaxHeight);document.body.style.setProperty("--bottom-panel-height",`${A}px`)}get bottomPanelHeight(){let e=getComputedStyle(document.body).getPropertyValue("--bottom-panel-height"),A=parseInt(e,10);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(lt(ge),lt(ui))};static \u0275dir=OA({type:t,selectors:[["","appResizableBottomPanel",""]],hostBindings:function(A,i){A&1&&$("mousemove",function(o){return i.onMouseMove(o)},m0)("mouseup",function(){return i.onMouseUp()},m0)("resize",function(){return i.onResize()},RC)}})};var Gp=class t{constructor(e,A){this.el=e;this.renderer=A}sideDrawerMinWidth=310;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","570px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),A=parseFloat(e);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(lt(ge),lt(ui))};static \u0275dir=OA({type:t,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,i){A&1&&$("mousemove",function(o){return i.onMouseMove(o)},m0)("mouseup",function(){return i.onMouseUp()},m0)("resize",function(){return i.onResize()},RC)}})};var Kp=Symbol.for("yaml.alias"),Up=Symbol.for("yaml.document"),Nl=Symbol.for("yaml.map"),zb=Symbol.for("yaml.pair"),dg=Symbol.for("yaml.scalar"),_0=Symbol.for("yaml.seq"),Es=Symbol.for("yaml.node.type"),Og=t=>!!t&&typeof t=="object"&&t[Es]===Kp,Fl=t=>!!t&&typeof t=="object"&&t[Es]===Up,Ll=t=>!!t&&typeof t=="object"&&t[Es]===Nl,dn=t=>!!t&&typeof t=="object"&&t[Es]===zb,Ki=t=>!!t&&typeof t=="object"&&t[Es]===dg,_l=t=>!!t&&typeof t=="object"&&t[Es]===_0;function Zn(t){if(t&&typeof t=="object")switch(t[Es]){case Nl:case _0:return!0}return!1}function un(t){if(t&&typeof t=="object")switch(t[Es]){case Kp:case Nl:case dg:case _0:return!0}return!1}var Jp=t=>(Ki(t)||Zn(t))&&!!t.anchor;var Us=Symbol("break visit"),xJ=Symbol("skip children"),Jc=Symbol("remove node");function Yc(t,e){let A=RJ(e);Fl(t)?IB(null,t.contents,A,Object.freeze([t]))===Jc&&(t.contents=null):IB(null,t,A,Object.freeze([]))}Yc.BREAK=Us;Yc.SKIP=xJ;Yc.REMOVE=Jc;function IB(t,e,A,i){let n=NJ(t,e,A,i);if(un(n)||dn(n))return FJ(t,i,n),IB(t,n,A,i);if(typeof n!="symbol"){if(Zn(e)){i=Object.freeze(i.concat(e));for(let o=0;ot.replace(/[!,[\]{}]/g,e=>ZcA[e]),BB=(()=>{class t{constructor(A,i){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,A),this.tags=Object.assign({},t.defaultTags,i)}clone(){let A=new t(this.yaml,this.tags);return A.docStart=this.docStart,A}atDocument(){let A=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return A}add(A,i){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let n=A.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(i(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[a,r]=n;return this.tags[a]=r,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return i(0,"%YAML directive should contain exactly one part"),!1;let[a]=n;if(a==="1.1"||a==="1.2")return this.yaml.version=a,!0;{let r=/^\d+\.\d+$/.test(a);return i(6,`Unsupported YAML version ${a}`,r),!1}}default:return i(0,`Unknown directive ${o}`,!0),!1}}tagName(A,i){if(A==="!")return"!";if(A[0]!=="!")return i(`Not a valid tag: ${A}`),null;if(A[1]==="<"){let r=A.slice(2,-1);return r==="!"||r==="!!"?(i(`Verbatim tags aren't resolved, so ${A} is invalid.`),null):(A[A.length-1]!==">"&&i("Verbatim tags must end with a >"),r)}let[,n,o]=A.match(/^(.*!)([^!]*)$/s);o||i(`The ${A} tag has no suffix`);let a=this.tags[n];if(a)try{return a+decodeURIComponent(o)}catch(r){return i(String(r)),null}return n==="!"?A:(i(`Could not resolve tag: ${A}`),null)}tagString(A){for(let[i,n]of Object.entries(this.tags))if(A.startsWith(n))return i+XcA(A.substring(n.length));return A[0]==="!"?A:`!<${A}>`}toString(A){let i=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(A&&n.length>0&&un(A.contents)){let a={};Yc(A.contents,(r,s)=>{un(s)&&s.tag&&(a[s.tag]=!0)}),o=Object.keys(a)}else o=[];for(let[a,r]of n)a==="!!"&&r==="tag:yaml.org,2002:"||(!A||o.some(s=>s.startsWith(r)))&&i.push(`%TAG ${a} ${r}`);return i.join(` `)}}return t.defaultYaml={explicit:!1,version:"1.2"},t.defaultTags={"!!":"tag:yaml.org,2002:"},t})();function Hp(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let A=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(A)}return!0}function Pb(t){let e=new Set;return Yc(t,{Value(A,i){i.anchor&&e.add(i.anchor)}}),e}function jb(t,e){for(let A=1;;++A){let i=`${t}${A}`;if(!e.has(i))return i}}function LJ(t,e){let A=[],i=new Map,n=null;return{onAnchor:o=>{A.push(o),n??(n=Pb(t));let a=jb(e,n);return n.add(a),a},setAnchors:()=>{for(let o of A){let a=i.get(o);if(typeof a=="object"&&a.anchor&&(Ki(a.node)||Zn(a.node)))a.node.anchor=a.anchor;else{let r=new Error("Failed to resolve repeated object (this should not happen)");throw r.source=o,r}}},sourceObjects:i}}function A2(t,e,A,i){if(i&&typeof i=="object")if(Array.isArray(i))for(let n=0,o=i.length;n$a(i,String(n),A));if(t&&typeof t.toJSON=="function"){if(!A||!Jp(t))return t.toJSON(e,A);let i={aliasCount:0,count:1,res:void 0};A.anchors.set(t,i),A.onCreate=o=>{i.res=o,delete A.onCreate};let n=t.toJSON(e,A);return A.onCreate&&A.onCreate(n),n}return typeof t=="bigint"&&!A?.keep?Number(t):t}var e2=class{constructor(e){Object.defineProperty(this,Es,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:A,maxAliasCount:i,onAnchor:n,reviver:o}={}){if(!Fl(e))throw new TypeError("A document argument is required");let a={anchors:new Map,doc:e,keep:!0,mapAsMap:A===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},r=$a(this,"",a);if(typeof n=="function")for(let{count:s,res:g}of a.anchors.values())n(g,s);return typeof o=="function"?A2(o,{"":r},"",r):r}};var G0=class extends e2{constructor(e){super(Kp),this.source=e,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(e,A){let i;A?.aliasResolveCache?i=A.aliasResolveCache:(i=[],Yc(e,{Node:(o,a)=>{(Og(a)||Jp(a))&&i.push(a)}}),A&&(A.aliasResolveCache=i));let n;for(let o of i){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(e,A){if(!A)return{source:this.source};let{anchors:i,doc:n,maxAliasCount:o}=A,a=this.resolve(n,A);if(!a){let s=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(s)}let r=i.get(a);if(r||($a(a,null,A),r=i.get(a)),r?.res===void 0){let s="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(s)}if(o>=0&&(r.count+=1,r.aliasCount===0&&(r.aliasCount=Tp(n,a,i)),r.count*r.aliasCount>o)){let s="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(s)}return r.res}toString(e,A,i){let n=`*${this.source}`;if(e){if(Hp(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(e.implicitKey)return`${n} `}return n}};function Tp(t,e,A){if(Og(e)){let i=e.resolve(t),n=A&&i&&A.get(i);return n?n.count*n.aliasCount:0}else if(Zn(e)){let i=0;for(let n of e.items){let o=Tp(t,n,A);o>i&&(i=o)}return i}else if(dn(e)){let i=Tp(t,e.key,A),n=Tp(t,e.value,A);return Math.max(i,n)}return 1}var Op=t=>!t||typeof t!="function"&&typeof t!="object",Ht=(()=>{class t extends e2{constructor(A){super(dg),this.value=A}toJSON(A,i){return i?.keep?this.value:$a(this.value,A,i)}toString(){return String(this.value)}}return t.BLOCK_FOLDED="BLOCK_FOLDED",t.BLOCK_LITERAL="BLOCK_LITERAL",t.PLAIN="PLAIN",t.QUOTE_DOUBLE="QUOTE_DOUBLE",t.QUOTE_SINGLE="QUOTE_SINGLE",t})();var $cA="tag:yaml.org,2002:";function A0A(t,e,A){if(e){let i=A.filter(o=>o.tag===e),n=i.find(o=>!o.format)??i[0];if(!n)throw new Error(`Tag ${e} not found`);return n}return A.find(i=>i.identify?.(t)&&!i.format)}function K0(t,e,A){if(Fl(t)&&(t=t.contents),un(t))return t;if(dn(t)){let C=A.schema[Nl].createNode?.(A.schema,null,A);return C.items.push(t),C}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:i,onAnchor:n,onTagObj:o,schema:a,sourceObjects:r}=A,s;if(i&&t&&typeof t=="object"){if(s=r.get(t),s)return s.anchor??(s.anchor=n(t)),new G0(s.anchor);s={anchor:null,node:null},r.set(t,s)}e?.startsWith("!!")&&(e=$cA+e.slice(2));let g=A0A(t,e,a.tags);if(!g){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let C=new Ht(t);return s&&(s.node=C),C}g=t instanceof Map?a[Nl]:Symbol.iterator in Object(t)?a[_0]:a[Nl]}o&&(o(g),delete A.onTagObj);let l=g?.createNode?g.createNode(A.schema,t,A):typeof g?.nodeClass?.from=="function"?g.nodeClass.from(A.schema,t,A):new Ht(t);return e?l.tag=e:g.default||(l.tag=g.tag),s&&(s.node=l),l}function g4(t,e,A){let i=A;for(let n=e.length-1;n>=0;--n){let o=e[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let a=[];a[o]=i,i=a}else i=new Map([[o,i]])}return K0(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var EB=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,QB=class extends e2{constructor(e,A){super(e),Object.defineProperty(this,"schema",{value:A,configurable:!0,enumerable:!1,writable:!0})}clone(e){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(A.schema=e),A.items=A.items.map(i=>un(i)||dn(i)?i.clone(e):i),this.range&&(A.range=this.range.slice()),A}addIn(e,A){if(EB(e))this.add(A);else{let[i,...n]=e,o=this.get(i,!0);if(Zn(o))o.addIn(n,A);else if(o===void 0&&this.schema)this.set(i,g4(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}deleteIn(e){let[A,...i]=e;if(i.length===0)return this.delete(A);let n=this.get(A,!0);if(Zn(n))return n.deleteIn(i);throw new Error(`Expected YAML collection at ${A}. Remaining path: ${i}`)}getIn(e,A){let[i,...n]=e,o=this.get(i,!0);return n.length===0?!A&&Ki(o)?o.value:o:Zn(o)?o.getIn(n,A):void 0}hasAllNullValues(e){return this.items.every(A=>{if(!dn(A))return!1;let i=A.value;return i==null||e&&Ki(i)&&i.value==null&&!i.commentBefore&&!i.comment&&!i.tag})}hasIn(e){let[A,...i]=e;if(i.length===0)return this.has(A);let n=this.get(A,!0);return Zn(n)?n.hasIn(i):!1}setIn(e,A){let[i,...n]=e;if(n.length===0)this.set(i,A);else{let o=this.get(i,!0);if(Zn(o))o.setIn(n,A);else if(o===void 0&&this.schema)this.set(i,g4(this.schema,n,A));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}};var _J=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function zg(t,e){return/^\n+$/.test(t)?t.substring(1):e?t.replace(/^(?! *$)/gm,e):t}var Hc=(t,e,A)=>t.endsWith(` `)?zg(A,e):A.includes(` `)?` `+zg(A,e):(t.endsWith(" ")?"":" ")+A;var qb="flow",zp="block",l4="quoted";function c4(t,e,A="flow",{indentAtStart:i,lineWidth:n=80,minContentWidth:o=20,onFold:a,onOverflow:r}={}){if(!n||n<0)return t;nn-Math.max(2,o)?g.push(0):C=n-i);let I,d,B=!1,Q=-1,E=-1,f=-1;A===zp&&(Q=GJ(t,Q,e.length),Q!==-1&&(C=Q+s));for(let R;R=t[Q+=1];){if(A===l4&&R==="\\"){switch(E=Q,t[Q+1]){case"x":Q+=3;break;case"u":Q+=5;break;case"U":Q+=9;break;default:Q+=1}f=Q}if(R===` `)A===zp&&(Q=GJ(t,Q,e.length)),C=Q+e.length+s,I=void 0;else{if(R===" "&&d&&d!==" "&&d!==` `&&d!==" "){let M=t[Q+1];M&&M!==" "&&M!==` `&&M!==" "&&(I=Q)}if(Q>=C)if(I)g.push(I),C=I+s,I=void 0;else if(A===l4){for(;d===" "||d===" ";)d=R,R=t[Q+=1],B=!0;let M=Q>f+1?Q-2:E-1;if(l[M])return t;g.push(M),l[M]=!0,C=M+s,I=void 0}else B=!0}d=R}if(B&&r&&r(),g.length===0)return t;a&&a();let b=t.slice(0,g[0]);for(let R=0;R({indentAtStart:e?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),qp=t=>/^(%|---|\.\.\.)/m.test(t);function e0A(t,e,A){if(!e||e<0)return!1;let i=e-A,n=t.length;if(n<=i)return!1;for(let o=0,a=0;oi)return!0;if(a=o+1,n-a<=i)return!1}return!0}function C4(t,e){let A=JSON.stringify(t);if(e.options.doubleQuotedAsJSON)return A;let{implicitKey:i}=e,n=e.options.doubleQuotedMinMultiLineLength,o=e.indent||(qp(t)?" ":""),a="",r=0;for(let s=0,g=A[s];g;g=A[++s])if(g===" "&&A[s+1]==="\\"&&A[s+2]==="n"&&(a+=A.slice(r,s)+"\\ ",s+=1,r=s,g="\\"),g==="\\")switch(A[s+1]){case"u":{a+=A.slice(r,s);let l=A.substr(s+2,4);switch(l){case"0000":a+="\\0";break;case"0007":a+="\\a";break;case"000b":a+="\\v";break;case"001b":a+="\\e";break;case"0085":a+="\\N";break;case"00a0":a+="\\_";break;case"2028":a+="\\L";break;case"2029":a+="\\P";break;default:l.substr(0,2)==="00"?a+="\\x"+l.substr(2):a+=A.substr(s,6)}s+=5,r=s+1}break;case"n":if(i||A[s+2]==='"'||A.length `;let C,I;for(I=A.length;I>0;--I){let v=A[I-1];if(v!==` `&&v!==" "&&v!==" ")break}let d=A.substring(I),B=d.indexOf(` `);B===-1?C="-":A===d||B!==d.length-1?(C="+",o&&o()):C="",d&&(A=A.slice(0,-d.length),d[d.length-1]===` `&&(d=d.slice(0,-1)),d=d.replace(Wb,`$&${g}`));let Q=!1,E,f=-1;for(E=0;E{F=!0});let U=c4(`${b}${v}${d}`,g,zp,G);if(!F)return`>${M} ${g}${U}`}return A=A.replace(/\n+/g,`$&${g}`),`|${M} ${g}${b}${A}${d}`}function t0A(t,e,A,i){let{type:n,value:o}=t,{actualString:a,implicitKey:r,indent:s,indentStep:g,inFlow:l}=e;if(r&&o.includes(` `)||l&&/[[\]{},]/.test(o))return hB(o,e);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return r||l||!o.includes(` `)?hB(o,e):Pp(t,e,A,i);if(!r&&!l&&n!==Ht.PLAIN&&o.includes(` `))return Pp(t,e,A,i);if(qp(o)){if(s==="")return e.forceBlockIndent=!0,Pp(t,e,A,i);if(r&&s===g)return hB(o,e)}let C=o.replace(/\n+/g,`$& ${s}`);if(a){let I=Q=>Q.default&&Q.tag!=="tag:yaml.org,2002:str"&&Q.test?.test(C),{compat:d,tags:B}=e.doc.schema;if(B.some(I)||d?.some(I))return hB(o,e)}return r?C:c4(C,s,qb,jp(e,!1))}function A1(t,e,A,i){let{implicitKey:n,inFlow:o}=e,a=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:r}=t;r!==Ht.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(a.value)&&(r=Ht.QUOTE_DOUBLE);let s=l=>{switch(l){case Ht.BLOCK_FOLDED:case Ht.BLOCK_LITERAL:return n||o?hB(a.value,e):Pp(a,e,A,i);case Ht.QUOTE_DOUBLE:return C4(a.value,e);case Ht.QUOTE_SINGLE:return Vb(a.value,e);case Ht.PLAIN:return t0A(a,e,A,i);default:return null}},g=s(r);if(g===null){let{defaultKeyType:l,defaultStringType:C}=e.options,I=n&&l||C;if(g=s(I),g===null)throw new Error(`Unsupported default string type ${I}`)}return g}function Vp(t,e){let A=Object.assign({blockQuote:!0,commentString:_J,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,e),i;switch(A.collectionStyle){case"block":i=!1;break;case"flow":i=!0;break;default:i=null}return{anchors:new Set,doc:t,flowCollectionPadding:A.flowCollectionPadding?" ":"",indent:"",indentStep:typeof A.indent=="number"?" ".repeat(A.indent):" ",inFlow:i,options:A}}function i0A(t,e){if(e.tag){let n=t.filter(o=>o.tag===e.tag);if(n.length>0)return n.find(o=>o.format===e.format)??n[0]}let A,i;if(Ki(e)){i=e.value;let n=t.filter(o=>o.identify?.(i));if(n.length>1){let o=n.filter(a=>a.test);o.length>0&&(n=o)}A=n.find(o=>o.format===e.format)??n.find(o=>!o.format)}else i=e,A=t.find(n=>n.nodeClass&&i instanceof n.nodeClass);if(!A){let n=i?.constructor?.name??(i===null?"null":typeof i);throw new Error(`Tag not resolved for ${n} value`)}return A}function n0A(t,e,{anchors:A,doc:i}){if(!i.directives)return"";let n=[],o=(Ki(t)||Zn(t))&&t.anchor;o&&Hp(o)&&(A.add(o),n.push(`&${o}`));let a=t.tag??(e.default?null:e.tag);return a&&n.push(i.directives.tagString(a)),n.join(" ")}function U0(t,e,A,i){if(dn(t))return t.toString(e,A,i);if(Og(t)){if(e.doc.directives)return t.toString(e);if(e.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");e.resolvedAliases?e.resolvedAliases.add(t):e.resolvedAliases=new Set([t]),t=t.resolve(e.doc)}let n,o=un(t)?t:e.doc.createNode(t,{onTagObj:s=>n=s});n??(n=i0A(e.doc.schema.tags,o));let a=n0A(o,n,e);a.length>0&&(e.indentAtStart=(e.indentAtStart??0)+a.length+1);let r=typeof n.stringify=="function"?n.stringify(o,e,A,i):Ki(o)?A1(o,e,A,i):o.toString(e,A,i);return a?Ki(o)||r[0]==="{"||r[0]==="["?`${a} ${r}`:`${a} ${e.indent}${r}`:r}function KJ({key:t,value:e},A,i,n){let{allNullValues:o,doc:a,indent:r,indentStep:s,options:{commentString:g,indentSeq:l,simpleKeys:C}}=A,I=un(t)&&t.comment||null;if(C){if(I)throw new Error("With simple keys, key nodes cannot have comments");if(Zn(t)||!un(t)&&typeof t=="object"){let G="With simple keys, collection cannot be used as a key value";throw new Error(G)}}let d=!C&&(!t||I&&e==null&&!A.inFlow||Zn(t)||(Ki(t)?t.type===Ht.BLOCK_FOLDED||t.type===Ht.BLOCK_LITERAL:typeof t=="object"));A=Object.assign({},A,{allNullValues:!1,implicitKey:!d&&(C||!o),indent:r+s});let B=!1,Q=!1,E=U0(t,A,()=>B=!0,()=>Q=!0);if(!d&&!A.inFlow&&E.length>1024){if(C)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");d=!0}if(A.inFlow){if(o||e==null)return B&&i&&i(),E===""?"?":d?`? ${E}`:E}else if(o&&!C||e==null&&d)return E=`? ${E}`,I&&!B?E+=Hc(E,A.indent,g(I)):Q&&n&&n(),E;B&&(I=null),d?(I&&(E+=Hc(E,A.indent,g(I))),E=`? ${E} ${r}:`):(E=`${E}:`,I&&(E+=Hc(E,A.indent,g(I))));let f,b,R;un(e)?(f=!!e.spaceBefore,b=e.commentBefore,R=e.comment):(f=!1,b=null,R=null,e&&typeof e=="object"&&(e=a.createNode(e))),A.implicitKey=!1,!d&&!I&&Ki(e)&&(A.indentAtStart=E.length+1),Q=!1,!l&&s.length>=2&&!A.inFlow&&!d&&_l(e)&&!e.flow&&!e.tag&&!e.anchor&&(A.indent=A.indent.substring(2));let M=!1,v=U0(e,A,()=>M=!0,()=>Q=!0),F=" ";if(I||f||b){if(F=f?` `:"",b){let G=g(b);F+=` ${zg(G,A.indent)}`}v===""&&!A.inFlow?F===` `&&R&&(F=` `):F+=` ${A.indent}`}else if(!d&&Zn(e)){let G=v[0],U=v.indexOf(` `),Y=U!==-1,j=A.inFlow??e.flow??e.items.length===0;if(Y||!j){let AA=!1;if(Y&&(G==="&"||G==="!")){let z=v.indexOf(" ");G==="&"&&z!==-1&&zt===Zp||typeof t=="symbol"&&t.description===Zp,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new Ht(Symbol(Zp)),{addToJSMap:Xb}),stringify:()=>Zp},UJ=(t,e)=>(Gl.identify(e)||Ki(e)&&(!e.type||e.type===Ht.PLAIN)&&Gl.identify(e.value))&&t?.doc.schema.tags.some(A=>A.tag===Gl.tag&&A.default);function Xb(t,e,A){if(A=t&&Og(A)?A.resolve(t.doc):A,_l(A))for(let i of A.items)Zb(t,e,i);else if(Array.isArray(A))for(let i of A)Zb(t,e,i);else Zb(t,e,A)}function Zb(t,e,A){let i=t&&Og(A)?A.resolve(t.doc):A;if(!Ll(i))throw new Error("Merge sources must be maps or map aliases");let n=i.toJSON(null,t,Map);for(let[o,a]of n)e instanceof Map?e.has(o)||e.set(o,a):e instanceof Set?e.add(o):Object.prototype.hasOwnProperty.call(e,o)||Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0});return e}function Xp(t,e,{key:A,value:i}){if(un(A)&&A.addToJSMap)A.addToJSMap(t,e,i);else if(UJ(t,A))Xb(t,e,i);else{let n=$a(A,"",t);if(e instanceof Map)e.set(n,$a(i,n,t));else if(e instanceof Set)e.add(n);else{let o=o0A(A,n,t),a=$a(i,o,t);o in e?Object.defineProperty(e,o,{value:a,writable:!0,enumerable:!0,configurable:!0}):e[o]=a}}return e}function o0A(t,e,A){if(e===null)return"";if(typeof e!="object")return String(e);if(un(t)&&A?.doc){let i=Vp(A.doc,{});i.anchors=new Set;for(let o of A.anchors.keys())i.anchors.add(o.anchor);i.inFlow=!0,i.inStringifyKey=!0;let n=t.toString(i);if(!A.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),Wp(A.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),A.mapKeyWarned=!0}return n}return JSON.stringify(e)}function uB(t,e,A){let i=K0(t,void 0,A),n=K0(e,void 0,A);return new va(i,n)}var va=class t{constructor(e,A=null){Object.defineProperty(this,Es,{value:zb}),this.key=e,this.value=A}clone(e){let{key:A,value:i}=this;return un(A)&&(A=A.clone(e)),un(i)&&(i=i.clone(e)),new t(A,i)}toJSON(e,A){let i=A?.mapAsMap?new Map:{};return Xp(A,i,this)}toString(e,A,i){return e?.doc?KJ(this,e,A,i):JSON.stringify(this)}};function A6(t,e,A){return(e.inFlow??t.flow?r0A:a0A)(t,e,A)}function a0A({comment:t,items:e},A,{blockItemPrefix:i,flowChars:n,itemIndent:o,onChompKeep:a,onComment:r}){let{indent:s,options:{commentString:g}}=A,l=Object.assign({},A,{indent:o,type:null}),C=!1,I=[];for(let B=0;BE=null,()=>C=!0);E&&(f+=Hc(f,o,g(E))),C&&E&&(C=!1),I.push(i+f)}let d;if(I.length===0)d=n.start+n.end;else{d=I[0];for(let B=1;BE=null);Bl||f.includes(` `))&&(g=!0),C.push(f),l=C.length}let{start:I,end:d}=A;if(C.length===0)return I+d;if(!g){let B=C.reduce((Q,E)=>Q+E.length+2,2);g=e.options.lineWidth>0&&B>e.options.lineWidth}if(g){let B=I;for(let Q of C)B+=Q?` ${o}${n}${Q}`:` `;return`${B} ${n}${d}`}else return`${I}${a}${C.join(" ")}${a}${d}`}function $p({indent:t,options:{commentString:e}},A,i,n){if(i&&n&&(i=i.replace(/^\n+/,"")),i){let o=zg(e(i),t);A.push(o.trimStart())}}function t2(t,e){let A=Ki(e)?e.value:e;for(let i of t)if(dn(i)&&(i.key===e||i.key===A||Ki(i.key)&&i.key.value===A))return i}var Na=class extends QB{static get tagName(){return"tag:yaml.org,2002:map"}constructor(e){super(Nl,e),this.items=[]}static from(e,A,i){let{keepUndefined:n,replacer:o}=i,a=new this(e),r=(s,g)=>{if(typeof o=="function")g=o.call(A,s,g);else if(Array.isArray(o)&&!o.includes(s))return;(g!==void 0||n)&&a.items.push(uB(s,g,i))};if(A instanceof Map)for(let[s,g]of A)r(s,g);else if(A&&typeof A=="object")for(let s of Object.keys(A))r(s,A[s]);return typeof e.sortMapEntries=="function"&&a.items.sort(e.sortMapEntries),a}add(e,A){let i;dn(e)?i=e:!e||typeof e!="object"||!("key"in e)?i=new va(e,e?.value):i=new va(e.key,e.value);let n=t2(this.items,i.key),o=this.schema?.sortMapEntries;if(n){if(!A)throw new Error(`Key ${i.key} already set`);Ki(n.value)&&Op(i.value)?n.value.value=i.value:n.value=i.value}else if(o){let a=this.items.findIndex(r=>o(i,r)<0);a===-1?this.items.push(i):this.items.splice(a,0,i)}else this.items.push(i)}delete(e){let A=t2(this.items,e);return A?this.items.splice(this.items.indexOf(A),1).length>0:!1}get(e,A){let n=t2(this.items,e)?.value;return(!A&&Ki(n)?n.value:n)??void 0}has(e){return!!t2(this.items,e)}set(e,A){this.add(new va(e,A),!0)}toJSON(e,A,i){let n=i?new i:A?.mapAsMap?new Map:{};A?.onCreate&&A.onCreate(n);for(let o of this.items)Xp(A,n,o);return n}toString(e,A,i){if(!e)return JSON.stringify(this);for(let n of this.items)if(!dn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),A6(this,e,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:e.indent||"",onChompKeep:i,onComment:A})}};var Kl={collection:"map",default:!0,nodeClass:Na,tag:"tag:yaml.org,2002:map",resolve(t,e){return Ll(t)||e("Expected a mapping for this tag"),t},createNode:(t,e,A)=>Na.from(t,e,A)};var Zr=class extends QB{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(e){super(_0,e),this.items=[]}add(e){this.items.push(e)}delete(e){let A=e6(e);return typeof A!="number"?!1:this.items.splice(A,1).length>0}get(e,A){let i=e6(e);if(typeof i!="number")return;let n=this.items[i];return!A&&Ki(n)?n.value:n}has(e){let A=e6(e);return typeof A=="number"&&A=0?e:null}var Ul={collection:"seq",default:!0,nodeClass:Zr,tag:"tag:yaml.org,2002:seq",resolve(t,e){return _l(t)||e("Expected a sequence for this tag"),t},createNode:(t,e,A)=>Zr.from(t,e,A)};var i2={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,e,A,i){return e=Object.assign({actualString:!0},e),A1(t,e,A,i)}};var e1={identify:t=>t==null,createNode:()=>new Ht(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new Ht(null),stringify:({source:t},e)=>typeof t=="string"&&e1.test.test(t)?t:e.options.nullStr};var I4={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new Ht(t[0]==="t"||t[0]==="T"),stringify({source:t,value:e},A){if(t&&I4.test.test(t)){let i=t[0]==="t"||t[0]==="T";if(e===i)return t}return e?A.options.trueStr:A.options.falseStr}};function Xr({format:t,minFractionDigits:e,tag:A,value:i}){if(typeof i=="bigint")return String(i);let n=typeof i=="number"?i:Number(i);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=Object.is(i,-0)?"-0":JSON.stringify(i);if(!t&&e&&(!A||A==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let a=o.indexOf(".");a<0&&(a=o.length,o+=".");let r=e-(o.length-a-1);for(;r-- >0;)o+="0"}return o}var t6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Xr},i6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Xr(t)}},n6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let e=new Ht(parseFloat(t)),A=t.indexOf(".");return A!==-1&&t[t.length-1]==="0"&&(e.minFractionDigits=t.length-A-1),e},stringify:Xr};var o6=t=>typeof t=="bigint"||Number.isInteger(t),$b=(t,e,A,{intAsBigInt:i})=>i?BigInt(t):parseInt(t.substring(e),A);function JJ(t,e,A){let{value:i}=t;return o6(i)&&i>=0?A+i.toString(e):Xr(t)}var a6={identify:t=>o6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,e,A)=>$b(t,2,8,A),stringify:t=>JJ(t,8,"0o")},r6={identify:o6,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,e,A)=>$b(t,0,10,A),stringify:Xr},s6={identify:t=>o6(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,e,A)=>$b(t,2,16,A),stringify:t=>JJ(t,16,"0x")};var YJ=[Kl,Ul,i2,e1,I4,a6,r6,s6,t6,i6,n6];function HJ(t){return typeof t=="bigint"||Number.isInteger(t)}var g6=({value:t})=>JSON.stringify(t),s0A=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:g6},{identify:t=>t==null,createNode:()=>new Ht(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:g6},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:g6},{identify:HJ,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,e,{intAsBigInt:A})=>A?BigInt(t):parseInt(t,10),stringify:({value:t})=>HJ(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:g6}],g0A={default:!0,tag:"",test:/^/,resolve(t,e){return e(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},TJ=[Kl,Ul].concat(s0A,g0A);var d4={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,e){if(typeof atob=="function"){let A=atob(t.replace(/[\n\r]/g,"")),i=new Uint8Array(A.length);for(let n=0;n1&&e("Each pair must have its own sequence indicator");let n=i.items[0]||new va(new Ht(null));if(i.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${i.commentBefore} ${n.key.commentBefore}`:i.commentBefore),i.comment){let o=n.value??n.key;o.comment=o.comment?`${i.comment} ${o.comment}`:i.comment}i=n}t.items[A]=dn(i)?i:new va(i)}}else e("Expected a sequence for this tag");return t}function e9(t,e,A){let{replacer:i}=A,n=new Zr(t);n.tag="tag:yaml.org,2002:pairs";let o=0;if(e&&Symbol.iterator in Object(e))for(let a of e){typeof i=="function"&&(a=i.call(e,String(o++),a));let r,s;if(Array.isArray(a))if(a.length===2)r=a[0],s=a[1];else throw new TypeError(`Expected [key, value] tuple: ${a}`);else if(a&&a instanceof Object){let g=Object.keys(a);if(g.length===1)r=g[0],s=a[r];else throw new TypeError(`Expected tuple with one key, not ${g.length} keys`)}else r=a;n.items.push(uB(r,s,A))}return n}var B4={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:A9,createNode:e9};var t9=(()=>{class t extends Zr{constructor(){super(),this.add=Na.prototype.add.bind(this),this.delete=Na.prototype.delete.bind(this),this.get=Na.prototype.get.bind(this),this.has=Na.prototype.has.bind(this),this.set=Na.prototype.set.bind(this),this.tag=t.tag}toJSON(A,i){if(!i)return super.toJSON(A);let n=new Map;i?.onCreate&&i.onCreate(n);for(let o of this.items){let a,r;if(dn(o)?(a=$a(o.key,"",i),r=$a(o.value,a,i)):a=$a(o,"",i),n.has(a))throw new Error("Ordered maps must not include duplicate keys");n.set(a,r)}return n}static from(A,i,n){let o=e9(A,i,n),a=new this;return a.items=o.items,a}}return t.tag="tag:yaml.org,2002:omap",t})(),Q4={collection:"seq",identify:t=>t instanceof Map,nodeClass:t9,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,e){let A=A9(t,e),i=[];for(let{key:n}of A.items)Ki(n)&&(i.includes(n.value)?e(`Ordered maps must not include duplicate keys: ${n.value}`):i.push(n.value));return Object.assign(new t9,A)},createNode:(t,e,A)=>t9.from(t,e,A)};function OJ({value:t,source:e},A){return e&&(t?i9:n9).test.test(e)?e:t?A.options.trueStr:A.options.falseStr}var i9={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new Ht(!0),stringify:OJ},n9={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new Ht(!1),stringify:OJ};var zJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Xr},PJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let e=Number(t.value);return isFinite(e)?e.toExponential():Xr(t)}},jJ={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let e=new Ht(parseFloat(t.replace(/_/g,""))),A=t.indexOf(".");if(A!==-1){let i=t.substring(A+1).replace(/_/g,"");i[i.length-1]==="0"&&(e.minFractionDigits=i.length)}return e},stringify:Xr};var E4=t=>typeof t=="bigint"||Number.isInteger(t);function l6(t,e,A,{intAsBigInt:i}){let n=t[0];if((n==="-"||n==="+")&&(e+=1),t=t.substring(e).replace(/_/g,""),i){switch(A){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let a=BigInt(t);return n==="-"?BigInt(-1)*a:a}let o=parseInt(t,A);return n==="-"?-1*o:o}function o9(t,e,A){let{value:i}=t;if(E4(i)){let n=i.toString(e);return i<0?"-"+A+n.substr(1):A+n}return Xr(t)}var qJ={identify:E4,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,e,A)=>l6(t,2,2,A),stringify:t=>o9(t,2,"0b")},VJ={identify:E4,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,e,A)=>l6(t,1,8,A),stringify:t=>o9(t,8,"0")},WJ={identify:E4,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,e,A)=>l6(t,0,10,A),stringify:Xr},ZJ={identify:E4,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,e,A)=>l6(t,2,16,A),stringify:t=>o9(t,16,"0x")};var a9=(()=>{class t extends Na{constructor(A){super(A),this.tag=t.tag}add(A){let i;dn(A)?i=A:A&&typeof A=="object"&&"key"in A&&"value"in A&&A.value===null?i=new va(A.key,null):i=new va(A,null),t2(this.items,i.key)||this.items.push(i)}get(A,i){let n=t2(this.items,A);return!i&&dn(n)?Ki(n.key)?n.key.value:n.key:n}set(A,i){if(typeof i!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof i}`);let n=t2(this.items,A);n&&!i?this.items.splice(this.items.indexOf(n),1):!n&&i&&this.items.push(new va(A))}toJSON(A,i){return super.toJSON(A,i,Set)}toString(A,i,n){if(!A)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},A,{allNullValues:!0}),i,n);throw new Error("Set items must all have null values")}static from(A,i,n){let{replacer:o}=n,a=new this(A);if(i&&Symbol.iterator in Object(i))for(let r of i)typeof o=="function"&&(r=o.call(i,r,r)),a.items.push(uB(r,null,n));return a}}return t.tag="tag:yaml.org,2002:set",t})(),h4={collection:"map",identify:t=>t instanceof Set,nodeClass:a9,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,e,A)=>a9.from(t,e,A),resolve(t,e){if(Ll(t)){if(t.hasAllNullValues(!0))return Object.assign(new a9,t);e("Set items must all have null values")}else e("Expected a mapping for this tag");return t}};function r9(t,e){let A=t[0],i=A==="-"||A==="+"?t.substring(1):t,n=a=>e?BigInt(a):Number(a),o=i.replace(/_/g,"").split(":").reduce((a,r)=>a*n(60)+n(r),n(0));return A==="-"?n(-1)*o:o}function XJ(t){let{value:e}=t,A=a=>a;if(typeof e=="bigint")A=a=>BigInt(a);else if(isNaN(e)||!isFinite(e))return Xr(t);let i="";e<0&&(i="-",e*=A(-1));let n=A(60),o=[e%n];return e<60?o.unshift(0):(e=(e-o[0])/n,o.unshift(e%n),e>=60&&(e=(e-o[0])/n,o.unshift(e))),i+o.map(a=>String(a).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var c6={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,e,{intAsBigInt:A})=>r9(t,A),stringify:XJ},C6={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>r9(t,!1),stringify:XJ},fB={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let e=t.match(fB.test);if(!e)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,A,i,n,o,a,r]=e.map(Number),s=e[7]?Number((e[7]+"00").substr(1,3)):0,g=Date.UTC(A,i-1,n,o||0,a||0,r||0,s),l=e[8];if(l&&l!=="Z"){let C=r9(l,!1);Math.abs(C)<30&&(C*=60),g-=6e4*C}return new Date(g)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var s9=[Kl,Ul,i2,e1,i9,n9,qJ,VJ,WJ,ZJ,zJ,PJ,jJ,d4,Gl,Q4,B4,h4,c6,C6,fB];var $J=new Map([["core",YJ],["failsafe",[Kl,Ul,i2]],["json",TJ],["yaml11",s9],["yaml-1.1",s9]]),AY={binary:d4,bool:I4,float:n6,floatExp:i6,floatNaN:t6,floatTime:C6,int:r6,intHex:s6,intOct:a6,intTime:c6,map:Kl,merge:Gl,null:e1,omap:Q4,pairs:B4,seq:Ul,set:h4,timestamp:fB},eY={"tag:yaml.org,2002:binary":d4,"tag:yaml.org,2002:merge":Gl,"tag:yaml.org,2002:omap":Q4,"tag:yaml.org,2002:pairs":B4,"tag:yaml.org,2002:set":h4,"tag:yaml.org,2002:timestamp":fB};function I6(t,e,A){let i=$J.get(e);if(i&&!t)return A&&!i.includes(Gl)?i.concat(Gl):i.slice();let n=i;if(!n)if(Array.isArray(t))n=[];else{let o=Array.from($J.keys()).filter(a=>a!=="yaml11").map(a=>JSON.stringify(a)).join(", ");throw new Error(`Unknown schema "${e}"; use one of ${o} or define customTags array`)}if(Array.isArray(t))for(let o of t)n=n.concat(o);else typeof t=="function"&&(n=t(n.slice()));return A&&(n=n.concat(Gl)),n.reduce((o,a)=>{let r=typeof a=="string"?AY[a]:a;if(!r){let s=JSON.stringify(a),g=Object.keys(AY).map(l=>JSON.stringify(l)).join(", ");throw new Error(`Unknown custom tag ${s}; use one of ${g}`)}return o.includes(r)||o.push(r),o},[])}var l0A=(t,e)=>t.keye.key?1:0,u4=class t{constructor({compat:e,customTags:A,merge:i,resolveKnownTags:n,schema:o,sortMapEntries:a,toStringDefaults:r}){this.compat=Array.isArray(e)?I6(e,"compat"):e?I6(null,e):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?eY:{},this.tags=I6(A,this.name,i),this.toStringOptions=r??null,Object.defineProperty(this,Nl,{value:Kl}),Object.defineProperty(this,dg,{value:i2}),Object.defineProperty(this,_0,{value:Ul}),this.sortMapEntries=typeof a=="function"?a:a===!0?l0A:null}clone(){let e=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return e.tags=this.tags.slice(),e}};function tY(t,e){let A=[],i=e.directives===!0;if(e.directives!==!1&&t.directives){let s=t.directives.toString(t);s?(A.push(s),i=!0):t.directives.docStart&&(i=!0)}i&&A.push("---");let n=Vp(t,e),{commentString:o}=n.options;if(t.commentBefore){A.length!==1&&A.unshift("");let s=o(t.commentBefore);A.unshift(zg(s,""))}let a=!1,r=null;if(t.contents){if(un(t.contents)){if(t.contents.spaceBefore&&i&&A.push(""),t.contents.commentBefore){let l=o(t.contents.commentBefore);A.push(zg(l,""))}n.forceBlockIndent=!!t.comment,r=t.contents.comment}let s=r?void 0:()=>a=!0,g=U0(t.contents,n,()=>r=null,s);r&&(g+=Hc(g,"",o(r))),(g[0]==="|"||g[0]===">")&&A[A.length-1]==="---"?A[A.length-1]=`--- ${g}`:A.push(g)}else A.push(U0(t.contents,n));if(t.directives?.docEnd)if(t.comment){let s=o(t.comment);s.includes(` `)?(A.push("..."),A.push(zg(s,""))):A.push(`... ${s}`)}else A.push("...");else{let s=t.comment;s&&a&&(s=s.replace(/^\n+/,"")),s&&((!a||r)&&A[A.length-1]!==""&&A.push(""),A.push(zg(o(s),"")))}return A.join(` `)+` `}var J0=class t{constructor(e,A,i){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,Es,{value:Up});let n=null;typeof A=="function"||Array.isArray(A)?n=A:i===void 0&&A&&(i=A,A=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},i);this.options=o;let{version:a}=o;i?._directives?(this.directives=i._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new BB({version:a}),this.setSchema(a,i),this.contents=e===void 0?null:this.createNode(e,n,i)}clone(){let e=Object.create(t.prototype,{[Es]:{value:Up}});return e.commentBefore=this.commentBefore,e.comment=this.comment,e.errors=this.errors.slice(),e.warnings=this.warnings.slice(),e.options=Object.assign({},this.options),this.directives&&(e.directives=this.directives.clone()),e.schema=this.schema.clone(),e.contents=un(this.contents)?this.contents.clone(e.schema):this.contents,this.range&&(e.range=this.range.slice()),e}add(e){mB(this.contents)&&this.contents.add(e)}addIn(e,A){mB(this.contents)&&this.contents.addIn(e,A)}createAlias(e,A){if(!e.anchor){let i=Pb(this);e.anchor=!A||i.has(A)?jb(A||"a",i):A}return new G0(e.anchor)}createNode(e,A,i){let n;if(typeof A=="function")e=A.call({"":e},"",e),n=A;else if(Array.isArray(A)){let E=b=>typeof b=="number"||b instanceof String||b instanceof Number,f=A.filter(E).map(String);f.length>0&&(A=A.concat(f)),n=A}else i===void 0&&A&&(i=A,A=void 0);let{aliasDuplicateObjects:o,anchorPrefix:a,flow:r,keepUndefined:s,onTagObj:g,tag:l}=i??{},{onAnchor:C,setAnchors:I,sourceObjects:d}=LJ(this,a||"a"),B={aliasDuplicateObjects:o??!0,keepUndefined:s??!1,onAnchor:C,onTagObj:g,replacer:n,schema:this.schema,sourceObjects:d},Q=K0(e,l,B);return r&&Zn(Q)&&(Q.flow=!0),I(),Q}createPair(e,A,i={}){let n=this.createNode(e,null,i),o=this.createNode(A,null,i);return new va(n,o)}delete(e){return mB(this.contents)?this.contents.delete(e):!1}deleteIn(e){return EB(e)?this.contents==null?!1:(this.contents=null,!0):mB(this.contents)?this.contents.deleteIn(e):!1}get(e,A){return Zn(this.contents)?this.contents.get(e,A):void 0}getIn(e,A){return EB(e)?!A&&Ki(this.contents)?this.contents.value:this.contents:Zn(this.contents)?this.contents.getIn(e,A):void 0}has(e){return Zn(this.contents)?this.contents.has(e):!1}hasIn(e){return EB(e)?this.contents!==void 0:Zn(this.contents)?this.contents.hasIn(e):!1}set(e,A){this.contents==null?this.contents=g4(this.schema,[e],A):mB(this.contents)&&this.contents.set(e,A)}setIn(e,A){EB(e)?this.contents=A:this.contents==null?this.contents=g4(this.schema,Array.from(e),A):mB(this.contents)&&this.contents.setIn(e,A)}setSchema(e,A={}){typeof e=="number"&&(e=String(e));let i;switch(e){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new BB({version:"1.1"}),i={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=e:this.directives=new BB({version:e}),i={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,i=null;break;default:{let n=JSON.stringify(e);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(A.schema instanceof Object)this.schema=A.schema;else if(i)this.schema=new u4(Object.assign(i,A));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:e,jsonArg:A,mapAsMap:i,maxAliasCount:n,onAnchor:o,reviver:a}={}){let r={anchors:new Map,doc:this,keep:!e,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},s=$a(this.contents,A??"",r);if(typeof o=="function")for(let{count:g,res:l}of r.anchors.values())o(l,g);return typeof a=="function"?A2(a,{"":s},"",s):s}toJSON(e,A){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:A})}toString(e={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let A=JSON.stringify(e.indent);throw new Error(`"indent" option must be a positive integer, not ${A}`)}return tY(this,e)}};function mB(t){if(Zn(t))return!0;throw new Error("Expected a YAML collection as document contents")}var f4=class extends Error{constructor(e,A,i,n){super(),this.name=e,this.code=i,this.message=n,this.pos=A}},Jl=class extends f4{constructor(e,A,i){super("YAMLParseError",e,A,i)}},m4=class extends f4{constructor(e,A,i){super("YAMLWarning",e,A,i)}},g9=(t,e)=>A=>{if(A.pos[0]===-1)return;A.linePos=A.pos.map(r=>e.linePos(r));let{line:i,col:n}=A.linePos[0];A.message+=` at line ${i}, column ${n}`;let o=n-1,a=t.substring(e.lineStarts[i-1],e.lineStarts[i]).replace(/[\n\r]+$/,"");if(o>=60&&a.length>80){let r=Math.min(o-39,a.length-79);a="\u2026"+a.substring(r),o-=r-1}if(a.length>80&&(a=a.substring(0,79)+"\u2026"),i>1&&/^ *$/.test(a.substring(0,o))){let r=t.substring(e.lineStarts[i-2],e.lineStarts[i-1]);r.length>80&&(r=r.substring(0,79)+`\u2026 `),a=r+a}if(/[^ ]/.test(a)){let r=1,s=A.linePos[1];s?.line===i&&s.col>n&&(r=Math.max(1,Math.min(s.col-n,80-o)));let g=" ".repeat(o)+"^".repeat(r);A.message+=`: ${a} ${g} `}};function Tc(t,{flow:e,indicator:A,next:i,offset:n,onError:o,parentIndent:a,startOnNewline:r}){let s=!1,g=r,l=r,C="",I="",d=!1,B=!1,Q=null,E=null,f=null,b=null,R=null,M=null,v=null;for(let U of t)switch(B&&(U.type!=="space"&&U.type!=="newline"&&U.type!=="comma"&&o(U.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),B=!1),Q&&(g&&U.type!=="comment"&&U.type!=="newline"&&o(Q,"TAB_AS_INDENT","Tabs are not allowed as indentation"),Q=null),U.type){case"space":!e&&(A!=="doc-start"||i?.type!=="flow-collection")&&U.source.includes(" ")&&(Q=U),l=!0;break;case"comment":{l||o(U,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let Y=U.source.substring(1)||" ";C?C+=I+Y:C=Y,I="",g=!1;break}case"newline":g?C?C+=U.source:(!M||A!=="seq-item-ind")&&(s=!0):I+=U.source,g=!0,d=!0,(E||f)&&(b=U),l=!0;break;case"anchor":E&&o(U,"MULTIPLE_ANCHORS","A node can have at most one anchor"),U.source.endsWith(":")&&o(U.offset+U.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),E=U,v??(v=U.offset),g=!1,l=!1,B=!0;break;case"tag":{f&&o(U,"MULTIPLE_TAGS","A node can have at most one tag"),f=U,v??(v=U.offset),g=!1,l=!1,B=!0;break}case A:(E||f)&&o(U,"BAD_PROP_ORDER",`Anchors and tags must be after the ${U.source} indicator`),M&&o(U,"UNEXPECTED_TOKEN",`Unexpected ${U.source} in ${e??"collection"}`),M=U,g=A==="seq-item-ind"||A==="explicit-key-ind",l=!1;break;case"comma":if(e){R&&o(U,"UNEXPECTED_TOKEN",`Unexpected , in ${e}`),R=U,g=!1,l=!1;break}default:o(U,"UNEXPECTED_TOKEN",`Unexpected ${U.type} token`),g=!1,l=!1}let F=t[t.length-1],G=F?F.offset+F.source.length:n;return B&&i&&i.type!=="space"&&i.type!=="newline"&&i.type!=="comma"&&(i.type!=="scalar"||i.source!=="")&&o(i.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),Q&&(g&&Q.indent<=a||i?.type==="block-map"||i?.type==="block-seq")&&o(Q,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:R,found:M,spaceBefore:s,comment:C,hasNewline:d,anchor:E,tag:f,newlineAfterProp:b,end:G,start:v??G}}function n2(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` `))return!0;if(t.end){for(let e of t.end)if(e.type==="newline")return!0}return!1;case"flow-collection":for(let e of t.items){for(let A of e.start)if(A.type==="newline")return!0;if(e.sep){for(let A of e.sep)if(A.type==="newline")return!0}if(n2(e.key)||n2(e.value))return!0}return!1;default:return!0}}function p4(t,e,A){if(e?.type==="flow-collection"){let i=e.end[0];i.indent===t&&(i.source==="]"||i.source==="}")&&n2(e)&&A(i,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function d6(t,e,A){let{uniqueKeys:i}=t.options;if(i===!1)return!1;let n=typeof i=="function"?i:(o,a)=>o===a||Ki(o)&&Ki(a)&&o.value===a.value;return e.some(o=>n(o.key,A))}var iY="All mapping items must start at the same column";function nY({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=o?.nodeClass??Na,r=new a(A.schema);A.atRoot&&(A.atRoot=!1);let s=i.offset,g=null;for(let l of i.items){let{start:C,key:I,sep:d,value:B}=l,Q=Tc(C,{indicator:"explicit-key-ind",next:I??d?.[0],offset:s,onError:n,parentIndent:i.indent,startOnNewline:!0}),E=!Q.found;if(E){if(I&&(I.type==="block-seq"?n(s,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in I&&I.indent!==i.indent&&n(s,"BAD_INDENT",iY)),!Q.anchor&&!Q.tag&&!d){g=Q.end,Q.comment&&(r.comment?r.comment+=` `+Q.comment:r.comment=Q.comment);continue}(Q.newlineAfterProp||n2(I))&&n(I??C[C.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else Q.found?.indent!==i.indent&&n(s,"BAD_INDENT",iY);A.atKey=!0;let f=Q.end,b=I?t(A,I,Q,n):e(A,f,C,null,Q,n);A.schema.compat&&p4(i.indent,I,n),A.atKey=!1,d6(A,r.items,b)&&n(f,"DUPLICATE_KEY","Map keys must be unique");let R=Tc(d??[],{indicator:"map-value-ind",next:B,offset:b.range[2],onError:n,parentIndent:i.indent,startOnNewline:!I||I.type==="block-scalar"});if(s=R.end,R.found){E&&(B?.type==="block-map"&&!R.hasNewline&&n(s,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),A.options.strict&&Q.startt&&(t.type==="block-map"||t.type==="block-seq");function aY({composeNode:t,composeEmptyNode:e},A,i,n,o){let a=i.start.source==="{",r=a?"flow map":"flow sequence",s=o?.nodeClass??(a?Na:Zr),g=new s(A.schema);g.flow=!0;let l=A.atRoot;l&&(A.atRoot=!1),A.atKey&&(A.atKey=!1);let C=i.offset+i.start.source.length;for(let E=0;E0){let E=Oc(B,Q,A.options.strict,n);E.comment&&(g.comment?g.comment+=` `+E.comment:g.comment=E.comment),g.range=[i.offset,Q,E.offset]}else g.range=[i.offset,Q,Q];return g}function C9(t,e,A,i,n,o){let a=A.type==="block-map"?nY(t,e,A,i,o):A.type==="block-seq"?oY(t,e,A,i,o):aY(t,e,A,i,o),r=a.constructor;return n==="!"||n===r.tagName?(a.tag=r.tagName,a):(n&&(a.tag=n),a)}function rY(t,e,A,i,n){let o=i.tag,a=o?e.directives.tagName(o.source,I=>n(o,"TAG_RESOLVE_FAILED",I)):null;if(A.type==="block-seq"){let{anchor:I,newlineAfterProp:d}=i,B=I&&o?I.offset>o.offset?I:o:I??o;B&&(!d||d.offsetI.tag===a&&I.collection===r);if(!s){let I=e.schema.knownTags[a];if(I?.collection===r)e.schema.tags.push(Object.assign({},I,{default:!1})),s=I;else return I?n(o,"BAD_COLLECTION_TYPE",`${I.tag} used for ${r} collection, but expects ${I.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${a}`,!0),C9(t,e,A,n,a)}let g=C9(t,e,A,n,a,s),l=s.resolve?.(g,I=>n(o,"TAG_RESOLVE_FAILED",I),e.options)??g,C=un(l)?l:new Ht(l);return C.range=g.range,C.tag=a,s?.format&&(C.format=s.format),C}function I9(t,e,A){let i=e.offset,n=c0A(e,t.options.strict,A);if(!n)return{value:"",type:null,comment:"",range:[i,i,i]};let o=n.mode===">"?Ht.BLOCK_FOLDED:Ht.BLOCK_LITERAL,a=e.source?C0A(e.source):[],r=a.length;for(let Q=a.length-1;Q>=0;--Q){let E=a[Q][1];if(E===""||E==="\r")r=Q;else break}if(r===0){let Q=n.chomp==="+"&&a.length>0?` `.repeat(Math.max(1,a.length-1)):"",E=i+n.length;return e.source&&(E+=e.source.length),{value:Q,type:o,comment:n.comment,range:[i,E,E]}}let s=e.indent+n.indent,g=e.offset+n.length,l=0;for(let Q=0;Qs&&(s=E.length);else{E.length=r;--Q)a[Q][0].length>s&&(r=Q+1);let C="",I="",d=!1;for(let Q=0;Qs||f[0]===" "?(I===" "?I=` `:!d&&I===` `&&(I=` `),C+=I+E.slice(s)+f,I=` `,d=!0):f===""?I===` `?C+=` `:I=` `:(C+=I+f,I=" ",d=!1)}switch(n.chomp){case"-":break;case"+":for(let Q=r;QA(i+I,d,B);switch(n){case"scalar":r=Ht.PLAIN,s=I0A(o,g);break;case"single-quoted-scalar":r=Ht.QUOTE_SINGLE,s=d0A(o,g);break;case"double-quoted-scalar":r=Ht.QUOTE_DOUBLE,s=B0A(o,g);break;default:return A(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[i,i+o.length,i+o.length]}}let l=i+o.length,C=Oc(a,l,e,A);return{value:s,type:r,comment:C.comment,range:[i,l,C.offset]}}function I0A(t,e){let A="";switch(t[0]){case" ":A="a tab character";break;case",":A="flow indicator character ,";break;case"%":A="directive indicator character %";break;case"|":case">":{A=`block scalar indicator ${t[0]}`;break}case"@":case"`":{A=`reserved character ${t[0]}`;break}}return A&&e(0,"BAD_SCALAR_START",`Plain value cannot start with ${A}`),sY(t)}function d0A(t,e){return(t[t.length-1]!=="'"||t.length===1)&&e(t.length,"MISSING_CHAR","Missing closing 'quote"),sY(t.slice(1,-1)).replace(/''/g,"'")}function sY(t){let e,A;try{e=new RegExp(`(.*?)(?o?t.slice(o,i+1):n)}else A+=n}return(t[t.length-1]!=='"'||t.length===1)&&e(t.length,"MISSING_CHAR",'Missing closing "quote'),A}function Q0A(t,e){let A="",i=t[e+1];for(;(i===" "||i===" "||i===` `||i==="\r")&&!(i==="\r"&&t[e+2]!==` `);)i===` `&&(A+=` `),e+=1,i=t[e+1];return A||(A=" "),{fold:A,offset:e}}var E0A={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` `,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function h0A(t,e,A,i){let n=t.substr(e,A),a=n.length===A&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(a)){let r=t.substr(e-2,A+2);return i(e-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${r}`),r}return String.fromCodePoint(a)}function B9(t,e,A,i){let{value:n,type:o,comment:a,range:r}=e.type==="block-scalar"?I9(t,e,i):d9(e,t.options.strict,i),s=A?t.directives.tagName(A.source,C=>i(A,"TAG_RESOLVE_FAILED",C)):null,g;t.options.stringKeys&&t.atKey?g=t.schema[dg]:s?g=u0A(t.schema,n,s,A,i):e.type==="scalar"?g=f0A(t,n,e,i):g=t.schema[dg];let l;try{let C=g.resolve(n,I=>i(A??e,"TAG_RESOLVE_FAILED",I),t.options);l=Ki(C)?C:new Ht(C)}catch(C){let I=C instanceof Error?C.message:String(C);i(A??e,"TAG_RESOLVE_FAILED",I),l=new Ht(n)}return l.range=r,l.source=n,o&&(l.type=o),s&&(l.tag=s),g.format&&(l.format=g.format),a&&(l.comment=a),l}function u0A(t,e,A,i,n){if(A==="!")return t[dg];let o=[];for(let r of t.tags)if(!r.collection&&r.tag===A)if(r.default&&r.test)o.push(r);else return r;for(let r of o)if(r.test?.test(e))return r;let a=t.knownTags[A];return a&&!a.collection?(t.tags.push(Object.assign({},a,{default:!1,test:void 0})),a):(n(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${A}`,A!=="tag:yaml.org,2002:str"),t[dg])}function f0A({atKey:t,directives:e,schema:A},i,n,o){let a=A.tags.find(r=>(r.default===!0||t&&r.default==="key")&&r.test?.test(i))||A[dg];if(A.compat){let r=A.compat.find(s=>s.default&&s.test?.test(i))??A[dg];if(a.tag!==r.tag){let s=e.tagString(a.tag),g=e.tagString(r.tag),l=`Value may be parsed as either ${s} or ${g}`;o(n,"TAG_RESOLVE_FAILED",l,!0)}}return a}function gY(t,e,A){if(e){A??(A=e.length);for(let i=A-1;i>=0;--i){let n=e[i];switch(n.type){case"space":case"comment":case"newline":t-=n.source.length;continue}for(n=e[++i];n?.type==="space";)t+=n.source.length,n=e[++i];break}}return t}var m0A={composeNode:Q9,composeEmptyNode:B6};function Q9(t,e,A,i){let n=t.atKey,{spaceBefore:o,comment:a,anchor:r,tag:s}=A,g,l=!0;switch(e.type){case"alias":g=p0A(t,e,i),(r||s)&&i(e,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":g=B9(t,e,s,i),r&&(g.anchor=r.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":g=rY(m0A,t,e,A,i),r&&(g.anchor=r.source.substring(1));break;default:{let C=e.type==="error"?e.message:`Unsupported token (type: ${e.type})`;i(e,"UNEXPECTED_TOKEN",C),g=B6(t,e.offset,void 0,null,A,i),l=!1}}return r&&g.anchor===""&&i(r,"BAD_ALIAS","Anchor cannot be an empty string"),n&&t.options.stringKeys&&(!Ki(g)||typeof g.value!="string"||g.tag&&g.tag!=="tag:yaml.org,2002:str")&&i(s??e,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(g.spaceBefore=!0),a&&(e.type==="scalar"&&e.source===""?g.comment=a:g.commentBefore=a),t.options.keepSourceTokens&&l&&(g.srcToken=e),g}function B6(t,e,A,i,{spaceBefore:n,comment:o,anchor:a,tag:r,end:s},g){let l={type:"scalar",offset:gY(e,A,i),indent:-1,source:""},C=B9(t,l,r,g);return a&&(C.anchor=a.source.substring(1),C.anchor===""&&g(a,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(C.spaceBefore=!0),o&&(C.comment=o,C.range[2]=s),C}function p0A({options:t},{offset:e,source:A,end:i},n){let o=new G0(A.substring(1));o.source===""&&n(e,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(e+A.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let a=e+A.length,r=Oc(i,a,t.strict,n);return o.range=[e,a,r.offset],r.comment&&(o.comment=r.comment),o}function lY(t,e,{offset:A,start:i,value:n,end:o},a){let r=Object.assign({_directives:e},t),s=new J0(void 0,r),g={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},l=Tc(i,{indicator:"doc-start",next:n??o?.[0],offset:A,onError:a,parentIndent:0,startOnNewline:!0});l.found&&(s.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!l.hasNewline&&a(l.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),s.contents=n?Q9(g,n,l,a):B6(g,l.end,i,null,l,a);let C=s.contents.range[2],I=Oc(o,C,!1,a);return I.comment&&(s.comment=I.comment),s.range=[A,C,I.offset],s}function D4(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:e,source:A}=t;return[e,e+(typeof A=="string"?A.length:1)]}function cY(t){let e="",A=!1,i=!1;for(let n=0;n{let a=D4(A);o?this.warnings.push(new m4(a,i,n)):this.errors.push(new Jl(a,i,n))},this.directives=new BB({version:e.version||"1.2"}),this.options=e}decorate(e,A){let{comment:i,afterEmptyLine:n}=cY(this.prelude);if(i){let o=e.contents;if(A)e.comment=e.comment?`${e.comment} ${i}`:i;else if(n||e.directives.docStart||!o)e.commentBefore=i;else if(Zn(o)&&!o.flow&&o.items.length>0){let a=o.items[0];dn(a)&&(a=a.key);let r=a.commentBefore;a.commentBefore=r?`${i} ${r}`:i}else{let a=o.commentBefore;o.commentBefore=a?`${i} ${a}`:i}}A?(Array.prototype.push.apply(e.errors,this.errors),Array.prototype.push.apply(e.warnings,this.warnings)):(e.errors=this.errors,e.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:cY(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,A=!1,i=-1){for(let n of e)yield*le(this.next(n));yield*le(this.end(A,i))}*next(e){switch(e.type){case"directive":this.directives.add(e.source,(A,i,n)=>{let o=D4(e);o[0]+=A,this.onError(o,"BAD_DIRECTIVE",i,n)}),this.prelude.push(e.source),this.atDirectives=!0;break;case"document":{let A=lY(this.options,this.directives,e,this.onError);this.atDirectives&&!A.directives.docStart&&this.onError(e,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(A,!1),this.doc&&(yield this.doc),this.doc=A,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(e.source);break;case"error":{let A=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,i=new Jl(D4(e),"UNEXPECTED_TOKEN",A);this.atDirectives||!this.doc?this.errors.push(i):this.doc.errors.push(i);break}case"doc-end":{if(!this.doc){let i="Unexpected doc-end without preceding document";this.errors.push(new Jl(D4(e),"UNEXPECTED_TOKEN",i));break}this.doc.directives.docEnd=!0;let A=Oc(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),A.comment){let i=this.doc.comment;this.doc.comment=i?`${i} ${A.comment}`:A.comment}this.doc.range[2]=A.offset;break}default:this.errors.push(new Jl(D4(e),"UNEXPECTED_TOKEN",`Unsupported token ${e.type}`))}}*end(e=!1,A=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let i=Object.assign({_directives:this.directives},this.options),n=new J0(void 0,i);this.atDirectives&&this.onError(A,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,A,A],this.decorate(n,!1),yield n}}};var E9=Symbol("break visit"),D0A=Symbol("skip children"),CY=Symbol("remove item");function t1(t,e){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),IY(Object.freeze([]),t,e)}t1.BREAK=E9;t1.SKIP=D0A;t1.REMOVE=CY;t1.itemAtPath=(t,e)=>{let A=t;for(let[i,n]of e){let o=A?.[i];if(o&&"items"in o)A=o.items[n];else return}return A};t1.parentCollection=(t,e)=>{let A=t1.itemAtPath(t,e.slice(0,-1)),i=e[e.length-1][0],n=A?.[i];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function IY(t,e,A){let i=A(e,t);if(typeof i=="symbol")return i;for(let n of["key","value"]){let o=e[n];if(o&&"items"in o){for(let a=0;a":return"block-scalar-header"}return null}function Yl(t){switch(t){case void 0:case" ":case` `:case"\r":case" ":return!0;default:return!1}}var BY=new Set("0123456789ABCDEFabcdef"),y0A=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),E6=new Set(",[]{}"),v0A=new Set(` ,[]{} \r `),m9=t=>!t||v0A.has(t),y4=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,A=!1){if(e){if(typeof e!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!A;let i=this.next??"stream";for(;i&&(A||this.hasChars(1));)i=yield*le(this.parseNext(i))}atLineEnd(){let e=this.pos,A=this.buffer[e];for(;A===" "||A===" ";)A=this.buffer[++e];return!A||A==="#"||A===` `?!0:A==="\r"?this.buffer[e+1]===` `:!1}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let A=this.buffer[e];if(this.indentNext>0){let i=0;for(;A===" ";)A=this.buffer[++i+e];if(A==="\r"){let n=this.buffer[i+e+1];if(n===` `||!n&&!this.atEnd)return e+i+1}return A===` `||i>=this.indentNext||!A&&!this.atEnd?e+i:-1}if(A==="-"||A==="."){let i=this.buffer.substr(e,3);if((i==="---"||i==="...")&&Yl(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!="number"||e!==-1&&ethis.indentValue&&!Yl(this.charAt(1))&&(this.indentNext=this.indentValue),yield*le(this.parseBlockStart())}*parseBlockStart(){let[e,A]=this.peek(2);if(!A&&!this.atEnd)return this.setNext("block-start");if((e==="-"||e==="?"||e===":")&&Yl(A)){let i=(yield*le(this.pushCount(1)))+(yield*le(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=i,yield*le(this.parseBlockStart())}return"doc"}*parseDocument(){yield*le(this.pushSpaces(!0));let e=this.getLine();if(e===null)return this.setNext("doc");let A=yield*le(this.pushIndicators());switch(e[A]){case"#":yield*le(this.pushCount(e.length-A));case void 0:return yield*le(this.pushNewline()),yield*le(this.parseLineStart());case"{":case"[":return yield*le(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*le(this.pushCount(1)),"doc";case"*":return yield*le(this.pushUntil(m9)),"doc";case'"':case"'":return yield*le(this.parseQuotedScalar());case"|":case">":return A+=yield*le(this.parseBlockScalarHeader()),A+=yield*le(this.pushSpaces(!0)),yield*le(this.pushCount(e.length-A)),yield*le(this.pushNewline()),yield*le(this.parseBlockScalar());default:return yield*le(this.parsePlainScalar())}}*parseFlowCollection(){let e,A,i=-1;do e=yield*le(this.pushNewline()),e>0?(A=yield*le(this.pushSpaces(!1)),this.indentValue=i=A):A=0,A+=yield*le(this.pushSpaces(!0));while(e+A>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((i!==-1&&i"0"&&A<="9")this.blockScalarIndent=Number(A)-1;else if(A!=="-")break}return yield*le(this.pushUntil(A=>Yl(A)||A==="#"))}*parseBlockScalar(){let e=this.pos-1,A=0,i;A:for(let o=this.pos;i=this.buffer[o];++o)switch(i){case" ":A+=1;break;case` `:e=o,A=0;break;case"\r":{let a=this.buffer[o+1];if(!a&&!this.atEnd)return this.setNext("block-scalar");if(a===` `)break}default:break A}if(!i&&!this.atEnd)return this.setNext("block-scalar");if(A>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=A:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(e+1);if(o===-1)break;e=this.buffer.indexOf(` `,o)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext("block-scalar");e=this.buffer.length}}let n=e+1;for(i=this.buffer[n];i===" ";)i=this.buffer[++n];if(i===" "){for(;i===" "||i===" "||i==="\r"||i===` `;)i=this.buffer[++n];e=n-1}else if(!this.blockScalarKeep)do{let o=e-1,a=this.buffer[o];a==="\r"&&(a=this.buffer[--o]);let r=o;for(;a===" ";)a=this.buffer[--o];if(a===` `&&o>=this.pos&&o+1+A>r)e=o;else break}while(!0);return yield Q6,yield*le(this.pushToIndex(e+1,!0)),yield*le(this.parseLineStart())}*parsePlainScalar(){let e=this.flowLevel>0,A=this.pos-1,i=this.pos-1,n;for(;n=this.buffer[++i];)if(n===":"){let o=this.buffer[i+1];if(Yl(o)||e&&E6.has(o))break;A=i}else if(Yl(n)){let o=this.buffer[i+1];if(n==="\r"&&(o===` `?(i+=1,n=` `,o=this.buffer[i+1]):A=i),o==="#"||e&&E6.has(o))break;if(n===` `){let a=this.continueScalar(i+1);if(a===-1)break;i=Math.max(i,a-2)}}else{if(e&&E6.has(n))break;A=i}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield Q6,yield*le(this.pushToIndex(A+1,!0)),e?"flow":"doc")}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,A){let i=this.buffer.slice(this.pos,e);return i?(yield i,this.pos+=i.length,i.length):(A&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*le(this.pushTag()))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()));case"&":return(yield*le(this.pushUntil(m9)))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()));case"-":case"?":case":":{let e=this.flowLevel>0,A=this.charAt(1);if(Yl(A)||e&&E6.has(A))return e?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*le(this.pushCount(1)))+(yield*le(this.pushSpaces(!0)))+(yield*le(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let e=this.pos+2,A=this.buffer[e];for(;!Yl(A)&&A!==">";)A=this.buffer[++e];return yield*le(this.pushToIndex(A===">"?e+1:e,!1))}else{let e=this.pos+1,A=this.buffer[e];for(;A;)if(y0A.has(A))A=this.buffer[++e];else if(A==="%"&&BY.has(this.buffer[e+1])&&BY.has(this.buffer[e+2]))A=this.buffer[e+=3];else break;return yield*le(this.pushToIndex(e,!1))}}*pushNewline(){let e=this.buffer[this.pos];return e===` `?yield*le(this.pushCount(1)):e==="\r"&&this.charAt(1)===` `?yield*le(this.pushCount(2)):0}*pushSpaces(e){let A=this.pos-1,i;do i=this.buffer[++A];while(i===" "||e&&i===" ");let n=A-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=A),n}*pushUntil(e){let A=this.pos,i=this.buffer[A];for(;!e(i);)i=this.buffer[++A];return yield*le(this.pushToIndex(A,!1))}};var v4=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let A=0,i=this.lineStarts.length;for(;A>1;this.lineStarts[o]=0;)switch(t[e].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break A}for(;t[++e]?.type==="space";);return t.splice(e,t.length)}function EY(t){if(t.start.type==="flow-seq-start")for(let e of t.items)e.sep&&!e.value&&!o2(e.start,"explicit-key-ind")&&!o2(e.sep,"map-value-ind")&&(e.key&&(e.value=e.key),delete e.key,hY(e.value)?e.value.end?Array.prototype.push.apply(e.value.end,e.sep):e.value.end=e.sep:Array.prototype.push.apply(e.start,e.sep),delete e.sep)}var b4=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new y4,this.onNewLine=e}*parse(e,A=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let i of this.lexer.lex(e,A))yield*le(this.next(i));A||(yield*le(this.end()))}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*le(this.step()),this.offset+=e.length;return}let A=dY(e);if(A)if(A==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=A,yield*le(this.step()),A){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case"space":this.atNewLine&&e[0]===" "&&(this.indent+=e.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=e.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=e.length}else{let i=`Not a YAML token: ${e}`;yield*le(this.pop({type:"error",offset:this.offset,message:i,source:e})),this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*le(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type==="doc-end"&&e?.type!=="doc-end"){for(;this.stack.length>0;)yield*le(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!e)return yield*le(this.stream());switch(e.type){case"document":return yield*le(this.document(e));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*le(this.scalar(e));case"block-scalar":return yield*le(this.blockScalar(e));case"block-map":return yield*le(this.blockMap(e));case"block-seq":return yield*le(this.blockSequence(e));case"flow-collection":return yield*le(this.flowCollection(e));case"doc-end":return yield*le(this.documentEnd(e))}yield*le(this.pop())}peek(e){return this.stack[this.stack.length-e]}*pop(e){let A=e??this.stack.pop();if(!A)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield A;else{let i=this.peek(1);switch(A.type==="block-scalar"?A.indent="indent"in i?i.indent:0:A.type==="flow-collection"&&i.type==="document"&&(A.indent=0),A.type==="flow-collection"&&EY(A),i.type){case"document":i.value=A;break;case"block-scalar":i.props.push(A);break;case"block-map":{let n=i.items[i.items.length-1];if(n.value){i.items.push({start:[],key:A,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=A;else{Object.assign(n,{key:A,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=i.items[i.items.length-1];n.value?i.items.push({start:[],value:A}):n.value=A;break}case"flow-collection":{let n=i.items[i.items.length-1];!n||n.value?i.items.push({start:[],key:A,sep:[]}):n.sep?n.value=A:Object.assign(n,{key:A,sep:[]});return}default:yield*le(this.pop()),yield*le(this.pop(A))}if((i.type==="document"||i.type==="block-map"||i.type==="block-seq")&&(A.type==="block-map"||A.type==="block-seq")){let n=A.items[A.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&QY(n.start)===-1&&(A.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=e.indent){let i=!this.onKeyLine&&this.indent===e.indent,n=i&&(A.sep||A.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&A.sep&&!A.value){let a=[];for(let r=0;re.indent&&(a.length=0);break;default:a.length=0}}a.length>=2&&(o=A.sep.splice(a[1]))}switch(this.type){case"anchor":case"tag":n||A.value?(o.push(this.sourceToken),e.items.push({start:o}),this.onKeyLine=!0):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"explicit-key-ind":!A.sep&&!A.explicitKey?(A.start.push(this.sourceToken),A.explicitKey=!0):n||A.value?(o.push(this.sourceToken),e.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(A.explicitKey)if(A.sep)if(A.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(o2(A.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(hY(A.key)&&!o2(A.sep,"newline")){let a=pB(A.start),r=A.key,s=A.sep;s.push(this.sourceToken),delete A.key,delete A.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:r,sep:s}]})}else o.length>0?A.sep=A.sep.concat(o,this.sourceToken):A.sep.push(this.sourceToken);else if(o2(A.start,"newline"))Object.assign(A,{key:null,sep:[this.sourceToken]});else{let a=pB(A.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:a,key:null,sep:[this.sourceToken]}]})}else A.sep?A.value||n?e.items.push({start:o,key:null,sep:[this.sourceToken]}):o2(A.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let a=this.flowScalar(this.type);n||A.value?(e.items.push({start:o,key:a,sep:[]}),this.onKeyLine=!0):A.sep?this.stack.push(a):(Object.assign(A,{key:a,sep:[]}),this.onKeyLine=!0);return}default:{let a=this.startBlockValue(e);if(a){if(a.type==="block-seq"){if(!A.explicitKey&&A.sep&&!o2(A.sep,"newline")){yield*le(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else i&&e.items.push({start:o});this.stack.push(a);return}}}}yield*le(this.pop()),yield*le(this.step())}*blockSequence(e){let A=e.items[e.items.length-1];switch(this.type){case"newline":if(A.value){let i="end"in A.value?A.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type==="comment"?i?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else A.start.push(this.sourceToken);return;case"space":case"comment":if(A.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(A.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,A.start),n.push(this.sourceToken),e.items.pop();return}}A.start.push(this.sourceToken)}return;case"anchor":case"tag":if(A.value||this.indent<=e.indent)break;A.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==e.indent)break;A.value||o2(A.start,"seq-item-ind")?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return}if(this.indent>e.indent){let i=this.startBlockValue(e);if(i){this.stack.push(i);return}}yield*le(this.pop()),yield*le(this.step())}*flowCollection(e){let A=e.items[e.items.length-1];if(this.type==="flow-error-end"){let i;do yield*le(this.pop()),i=this.peek(1);while(i?.type==="flow-collection")}else if(e.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!A||A.sep?e.items.push({start:[this.sourceToken]}):A.start.push(this.sourceToken);return;case"map-value-ind":!A||A.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):Object.assign(A,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!A||A.value?e.items.push({start:[this.sourceToken]}):A.sep?A.sep.push(this.sourceToken):A.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!A||A.value?e.items.push({start:[],key:n,sep:[]}):A.sep?this.stack.push(n):Object.assign(A,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":e.end.push(this.sourceToken);return}let i=this.startBlockValue(e);i?this.stack.push(i):(yield*le(this.pop()),yield*le(this.step()))}else{let i=this.peek(2);if(i.type==="block-map"&&(this.type==="map-value-ind"&&i.indent===e.indent||this.type==="newline"&&!i.items[i.items.length-1].sep))yield*le(this.pop()),yield*le(this.step());else if(this.type==="map-value-ind"&&i.type!=="flow-collection"){let n=h6(i),o=pB(n);EY(e);let a=e.end.splice(1,e.end.length);a.push(this.sourceToken);let r={type:"block-map",offset:e.offset,indent:e.indent,items:[{start:o,key:e,sep:a}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*le(this.lineEnd(e))}}flowScalar(e){if(this.onNewLine){let A=this.source.indexOf(` `)+1;for(;A!==0;)this.onNewLine(this.offset+A),A=this.source.indexOf(` `,A)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let A=h6(e),i=pB(A);return i.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let A=h6(e),i=pB(A);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,A){return this.type!=="comment"||this.indent<=A?!1:e.every(i=>i.type==="newline"||i.type==="space")}*documentEnd(e){this.type!=="doc-mode"&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*le(this.pop())))}*lineEnd(e){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*le(this.pop()),yield*le(this.step());break;case"newline":this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type==="newline"&&(yield*le(this.pop()))}}};function b0A(t){let e=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||e&&new v4||null,prettyErrors:e}}function uY(t,e={}){let{lineCounter:A,prettyErrors:i}=b0A(e),n=new b4(A?.addNewLine),o=new w4(e),a=null;for(let r of o.compose(n.parse(t),!0,t.length))if(!a)a=r;else if(a.options.logLevel!=="silent"){a.errors.push(new Jl(r.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return i&&A&&(a.errors.forEach(g9(t,A)),a.warnings.forEach(g9(t,A))),a}function DB(t,e,A){let i;typeof e=="function"?i=e:A===void 0&&e&&typeof e=="object"&&(A=e);let n=uY(t,A);if(!n)return null;if(n.warnings.forEach(o=>Wp(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:i},A))}function p9(t,e,A){let i=null;if(typeof e=="function"||Array.isArray(e)?i=e:A===void 0&&e&&(A=e),typeof A=="string"&&(A=A.length),typeof A=="number"){let n=Math.round(A);A=n<1?void 0:n>8?{indent:8}:{indent:n}}if(t===void 0){let{keepUndefined:n}=A??e??{};if(!n)return}return Fl(t)&&!i?t.toString(A):new J0(t,i,A).toString(A)}var zc=class t{static generateYamlFile(e,A,i,n,o=new Set){if(o.has(e.name))return;o.add(e.name);let a=e.isRoot?"root_agent.yaml":`${e.name}.yaml`,r=`${i}/${a}`,s=e.sub_agents?e.sub_agents.map(B=>({config_path:`./${B.name}.yaml`})):[],g={name:e.name,model:e.model,agent_class:e.agent_class,description:e.description||"",instruction:e.instruction,sub_agents:s,tools:t.buildToolsConfig(e.tools,n)};(!e.description||e.description.trim()==="")&&delete g.description,e.agent_class!="LlmAgent"&&(delete g.model,delete g.instruction,delete g.tools),e.agent_class==="LoopAgent"&&e.max_iterations&&(g.max_iterations=e.max_iterations);let l=t.buildCallbacksConfig(e.callbacks);Object.keys(l).length>0&&Object.assign(g,l);let C=p9(g),I=new Blob([C],{type:"application/x-yaml"}),d=new File([I],r,{type:"application/x-yaml"});A.append("files",d);for(let B of e.sub_agents??[])t.generateYamlFile(B,A,i,n,o);if(e.tools){for(let B of e.tools)if(B.toolType==="Agent Tool"){let Q=B.toolAgentName||B.name;if(!Q||Q==="undefined"||Q.trim()==="")continue;let E=n.get(Q);E&&t.generateYamlFile(E,A,i,n,o)}}}static buildToolsConfig(e,A){return!e||e.length===0?[]:e.map(i=>{let n={name:i.name};if(i.toolType==="Agent Tool"){n.name="AgentTool";let o=i.toolAgentName||i.name;if(!o||o==="undefined"||o.trim()==="")return null;let a=A.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:a?.skip_summarization||!1},n}return i.args&&Object.keys(i.args).some(a=>{let r=i.args[a];return r!=null&&r!==""})&&(n.args=i.args),n}).filter(i=>i!==null)}static buildCallbacksConfig(e){if(!e||e.length===0)return{};let A={};return e.forEach(i=>{let n=`${i.type}_callbacks`;A[n]||(A[n]=[]),A[n].push({name:i.name})}),A}};function k0A(t,e){t&1&&(m(0,"mat-hint",3),K(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),D())}var u6=class t{constructor(e,A){this.data=e;this.dialogRef=A}newAppName="";agentService=h(Ks);_snackBar=h(ZC);router=h(qr);isNameValid(){let e=this.newAppName.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}createNewApp(){let e=this.newAppName.trim();if(!this.isNameValid()){this._snackBar.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(e)){this._snackBar.open("App name already exists. Please choose a different name.","OK");return}let A={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:e,sub_agents:[],tools:[]},i=new FormData,n=new Map;zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:e,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackBar.open("Something went wrong, please try again","OK")})}static \u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \u0275cmp=kA({type:t,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[1,"validation-hint"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(A,i){A&1&&(m(0,"h2",0),K(1,"Create a new app"),D(),m(2,"mat-form-field",1)(3,"input",2),ao("ngModelChange",function(o){return Vn(i.newAppName,o)||(i.newAppName=o),o}),$("keydown.enter",function(){return i.createNewApp()}),D(),V(4,k0A,2,0,"mat-hint",3),D(),m(5,"mat-dialog-actions",4)(6,"button",5),K(7,"Cancel"),D(),m(8,"button",6),$("click",function(){return i.createNewApp()}),K(9," Create "),D()()),A&2&&(p(3),oo("ngModel",i.newAppName),p(),W(i.isNameValid()?-1:4),p(4),X("disabled",!i.isNameValid()))},dependencies:[ya,To,wa,yn,ro,so,Ca,Ta,vn,VC,_I],styles:[".new-app-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.validation-hint[_ngcontent-%COMP%]{font-size:12px;color:var(--mdc-dialog-supporting-text-color)}"]})};var S0A=["audioPlayer"],wB=class t{base64data=nt("");audioPlayerRef=Xo("audioPlayer");audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(e){e.startsWith("data:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-audio-player"]],viewQuery:function(A,i){A&1&&Or(i.audioPlayerRef,S0A,5),A&2&&rr()},inputs:{base64data:[1,"base64data"]},features:[ei],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,i){A&1&&(ti(0,"div"),Ni(1,"audio",1,0),Ii()),A&2&&(p(),Bo("src",i.audioSrc))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;background-color:var(--audio-player-container-background-color);border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;background-color:var(--audio-player-custom-controls-button-background-color);color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background-color:var(--audio-player-custom-controls-button-hover-background-color)}"]})};function x0A(t,e){if(t&1&&Ni(0,"img",5),t&2){let A=y(2);Bo("src",A.displayContent,Da)}}function R0A(t,e){t&1&&(ti(0,"div",6),K(1," No image data provided. "),Ii())}function N0A(t,e){if(t&1&&(ti(0,"div",3),V(1,x0A,1,1,"img",5),V(2,R0A,2,0,"div",6),Ii()),t&2){let A=y();p(),W(A.displayContent?1:-1),p(),W(A.displayContent?-1:2)}}function F0A(t,e){if(t&1&&Ni(0,"div",4),t&2){let A=y();Bo("innerHTML",A.displayContent,xg)}}var a2=class t{displayContent=null;isSvgContent=!1;dialogRef=h(Fo);data=h(da);safeValuesService=h(Wr);ngOnInit(){this.processImageData()}processImageData(){let e=this.data.imageData;if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("0?1:-1),p(3),Fe(" ",o.getArtifactName(i)," "),p(5),oo("ngModel",o.selectedArtifacts[n]),p(),Kt(o.getSortedArtifactsFromId(i)),p(7),W((A=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:A===o.MediaType.AUDIO?18:-1)}}var J0A="default_artifact_name",i1=(n=>(n.IMAGE="image",n.AUDIO="audio",n.TEXT="text",n.UNSPECIFIED="unspecified",n))(i1||{});function M4(t){let e=t.toLowerCase();for(let A of Object.values(i1))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function Y0A(t){return t?t.startsWith("image/"):!1}function H0A(t){return t?t.startsWith("audio/"):!1}var f6=class t{artifacts=nt([]);selectedArtifacts=[];isArtifactAudio=H0A;isArtifactImage=Y0A;MediaType=i1;downloadService=h(gB);dialog=h(Qs);safeValuesService=h(Wr);ngOnChanges(e){if(e.artifacts){this.selectedArtifacts=[];for(let A of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(A)[0])}}downloadArtifact(e){this.downloadService.downloadBase64Data(e.data,e.mimeType,e.id)}getArtifactName(e){return e??J0A}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(e=>e.id))]}getSortedArtifactsFromId(e){return this.artifacts().filter(A=>A.id===e).sort((A,i)=>i.versionId-A.versionId)}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(a2,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){if(this.isArtifactImage(A)){this.openViewImageDialog(e);return}this.openBase64InNewTab(e,A)}openBase64InNewTab(e,A){}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[ei],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-box"],[1,"white-separator"],[1,"artifact-metadata"],[1,"link-style-button",3,"click"],[1,"version-select-container"],[3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-flat-button","",1,"download-button",3,"click"],["alt","artifact.id",1,"generated-image",3,"click","src"],[3,"base64data"]],template:function(A,i){A&1&&(m(0,"div",0),Gt(1,U0A,19,4,"div",1,Ri),D()),A&2&&(p(),Kt(i.getDistinctArtifactIds()))},dependencies:[Yg,yn,so,Ca,Mr,vn,In,wB],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{background-color:var(--artifact-tab-download-button-background-color)!important;margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--artifact-tab-white-separator-border-top-color);margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{background-color:var(--artifact-tab-version-select-container-background-color);width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--artifact-tab-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:var(--artifact-tab-link-style-button-hover-color);text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted var(--artifact-tab-link-style-button-focus-outline-color)}.link-style-button[_ngcontent-%COMP%]:active{color:var(--artifact-tab-link-style-button-active-color)}.link-style-button[_ngcontent-%COMP%]:disabled{color:var(--artifact-tab-link-style-button-disabled-color);text-decoration:none;cursor:not-allowed}"]})};var T0A=["input"],O0A=["label"],z0A=["*"],D9={color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1},P0A=new wA("mat-checkbox-default-options",{providedIn:"root",factory:()=>D9}),$r=(function(t){return t[t.Init=0]="Init",t[t.Checked=1]="Checked",t[t.Unchecked=2]="Unchecked",t[t.Indeterminate=3]="Indeterminate",t})($r||{}),w9=class{source;checked},yB=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_ngZone=h(Oe);_animationsDisabled=Oi();_options=h(P0A,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let i=new w9;return i.source=this,i.checked=A,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required=!1;labelPosition="after";name=null;change=new WA;indeterminateChange=new WA;value;disableRipple=!1;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=$r.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){h(Hn).load(Za);let A=h(new bs("tabindex"),{optional:!0});this._options=this._options||D9,this.color=this._options.color||D9.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=h(An).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this.indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate()}set indeterminate(A){let i=A!=this._indeterminate();this._indeterminate.set(A),i&&(A?this._transitionCheckState($r.Indeterminate):this._transitionCheckState(this.checked?$r.Checked:$r.Unchecked),this.indeterminateChange.emit(A)),this._syncIndeterminate(A)}_indeterminate=jA(!1);_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate.set(!1),this.indeterminateChange.emit(!1)}),this._checked=!this._checked,this._transitionCheckState(this._checked?$r.Checked:$r.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,i){if(this._animationsDisabled)return"";switch(A){case $r.Init:if(i===$r.Checked)return this._animationClasses.uncheckedToChecked;if(i==$r.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case $r.Unchecked:return i===$r.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case $r.Checked:return i===$r.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case $r.Indeterminate:return i===$r.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let i=this._inputElement;i&&(i.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-checkbox"]],viewQuery:function(i,n){if(i&1&&ni(T0A,5)(O0A,5),i&2){let o;Ce(o=Ie())&&(n._inputElement=o.first),Ce(o=Ie())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,n){i&2&&(Bo("id",n.id),ie("tabindex",null)("aria-label",null)("aria-labelledby",null),Qo(n.color?"mat-"+n.color:"mat-accent"),ae("_mat-animation-noopable",n._animationsDisabled)("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",he],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",he],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",he],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:Zi(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",he],checked:[2,"checked","checked",he],disabled:[2,"disabled","disabled",he],indeterminate:[2,"indeterminate","indeterminate",he]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[It([{provide:gg,useExisting:ar(()=>t),multi:!0},{provide:vc,useExisting:t,multi:!0}]),ei],ngContentSelectors:z0A,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],["aria-hidden","true",1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],["aria-hidden","true",1,"mdc-checkbox__ripple"],["aria-hidden","true",1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","","aria-hidden","true",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1&&(Yt(),m(0,"div",3),$("click",function(a){return n._preventBubblingFromLabel(a)}),m(1,"div",4,0)(3,"div",5),$("click",function(){return n._onTouchTargetClick()}),D(),m(4,"input",6,1),$("blur",function(){return n._onBlur()})("click",function(){return n._onInputClick()})("change",function(a){return n._onInteractionEvent(a)}),D(),GA(6,"div",7),m(7,"div",8),Qt(),m(8,"svg",9),GA(9,"path",10),D(),Tr(),GA(10,"div",11),D(),GA(11,"div",12),D(),m(12,"label",13,2),He(14),D()()),i&2){let o=Wi(2);X("labelPosition",n.labelPosition),p(4),ae("mdc-checkbox--selected",n.checked),X("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),ie("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),p(7),X("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),p(),X("for",n.inputId)}},dependencies:[Ns,Mp],styles:[`.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mat-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mat-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mat-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;z-index:1;width:var(--mat-checkbox-state-layer-size, 40px);height:var(--mat-checkbox-state-layer-size, 40px);top:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);right:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - var(--mat-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mat-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mat-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}@media(forced-colors: active){.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mat-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mat-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mat-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:GrayText}}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mat-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:GrayText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mat-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mat-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:GrayText}}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{color:GrayText}}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:var(--mat-checkbox-touch-target-size, 48px);width:var(--mat-checkbox-touch-target-size, 48px);transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus-visible~.mat-focus-indicator::before{content:""} `],encapsulation:2,changeDetection:0})}return t})();var mY=new wA("CdkAccordion");var pY=(()=>{class t{accordion=h(mY,{optional:!0,skipSelf:!0});_changeDetectorRef=h(ft);_expansionDispatcher=h(r4);_openCloseAllSubscription=Rn.EMPTY;closed=new WA;opened=new WA;destroyed=new WA;expandedChange=new WA;id=h(An).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(A){if(this._expanded!==A){if(this._expanded=A,this.expandedChange.emit(A),A){this.opened.emit();let i=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,i)}else this.closed.emit();this._changeDetectorRef.markForCheck()}}_expanded=!1;get disabled(){return this._disabled()}set disabled(A){this._disabled.set(A)}_disabled=jA(!1);_removeUniqueSelectionListener=()=>{};constructor(){}ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((A,i)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===i&&this.id!==A&&(this.expanded=!1)}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}toggle(){this.disabled||(this.expanded=!this.expanded)}close(){this.disabled||(this.expanded=!1)}open(){this.disabled||(this.expanded=!0)}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(A=>{this.disabled||(this.expanded=A)})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",he],disabled:[2,"disabled","disabled",he]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[It([{provide:mY,useValue:void 0}])]})}return t})(),DY=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({})}return t})();var j0A=["body"],q0A=["bodyWrapper"],V0A=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],W0A=["mat-expansion-panel-header","*","mat-action-row"];function Z0A(t,e){}var X0A=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],$0A=["mat-panel-title","mat-panel-description","*"];function ACA(t,e){t&1&&(ti(0,"span",1),Qt(),ti(1,"svg",2),Ni(2,"path",3),Ii()())}var wY=new wA("MAT_ACCORDION"),yY=new wA("MAT_EXPANSION_PANEL"),eCA=(()=>{class t{_template=h(Fn);_expansionPanel=h(yY,{optional:!0});constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["ng-template","matExpansionPanelContent",""]]})}return t})(),vY=new wA("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),y9=(()=>{class t extends pY{_viewContainerRef=h(Ro);_animationsDisabled=Oi();_document=h(Zt);_ngZone=h(Oe);_elementRef=h(ge);_renderer=h(ui);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(A){this._hideToggle=A}_hideToggle=!1;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(A){this._togglePosition=A}_togglePosition;afterExpand=new WA;afterCollapse=new WA;_inputChanges=new $A;accordion=h(wY,{optional:!0,skipSelf:!0});_lazyContent;_body;_bodyWrapper;_portal;_headerId=h(An).getId("mat-expansion-panel-header-");constructor(){super();let A=h(vY,{optional:!0});this._expansionDispatcher=h(r4),A&&(this.hideToggle=A.hideToggle)}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode==="default":!1}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded}close(){this.expanded=!1}open(){this.expanded=!0}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(nn(null),We(()=>this.expanded&&!this._portal),qn(1)).subscribe(()=>{this._portal=new Vr(this._lazyContent._template,this._viewContainerRef)}),this._setupAnimationEvents()}ngOnChanges(A){this._inputChanges.next(A)}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete()}_containsFocus(){if(this._body){let A=this._document.activeElement,i=this._body.nativeElement;return A===i||i.contains(A)}return!1}_transitionEndListener=({target:A,propertyName:i})=>{A===this._bodyWrapper?.nativeElement&&i==="grid-template-rows"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit()})};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let A=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(A,"transitionend",this._transitionEndListener),A.classList.add("mat-expansion-panel-animations-enabled")},200)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-expansion-panel"]],contentQueries:function(i,n,o){if(i&1&&na(o,eCA,5),i&2){let a;Ce(a=Ie())&&(n._lazyContent=a.first)}},viewQuery:function(i,n){if(i&1&&ni(j0A,5)(q0A,5),i&2){let o;Ce(o=Ie())&&(n._body=o.first),Ce(o=Ie())&&(n._bodyWrapper=o.first)}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(i,n){i&2&&ae("mat-expanded",n.expanded)("mat-expansion-panel-spacing",n._hasSpacing())},inputs:{hideToggle:[2,"hideToggle","hideToggle",he],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[It([{provide:wY,useValue:void 0},{provide:yY,useExisting:t}]),Ct,ei],ngContentSelectors:W0A,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(i,n){i&1&&(Yt(V0A),He(0),m(1,"div",2,0)(3,"div",3,1)(5,"div",4),He(6,1),yt(7,Z0A,0,0,"ng-template",5),D(),He(8,2),D()()),i&2&&(p(),ie("inert",n.expanded?null:""),p(2),X("id",n.id),ie("aria-labelledby",n._headerId),p(4),X("cdkPortalOutlet",n._portal))},dependencies:[Ig],styles:[`.mat-expansion-panel{box-sizing:content-box;display:block;margin:0;overflow:hidden}.mat-expansion-panel.mat-expansion-panel-animations-enabled{transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel{position:relative;background:var(--mat-expansion-container-background-color, var(--mat-sys-surface));color:var(--mat-expansion-container-text-color, var(--mat-sys-on-surface));border-radius:var(--mat-expansion-container-shape, 12px)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:var(--mat-expansion-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:var(--mat-expansion-container-shape, 12px);border-top-left-radius:var(--mat-expansion-container-shape, 12px)}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:var(--mat-expansion-container-shape, 12px);border-bottom-left-radius:var(--mat-expansion-container-shape, 12px)}@media(forced-colors: active){.mat-expansion-panel{outline:solid 1px}}.mat-expansion-panel-content-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content-wrapper{transition:grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{grid-template-rows:1fr}@supports not (grid-template-rows: 0fr){.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}@media print{.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible;min-height:0;visibility:hidden}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content{transition:visibility 190ms linear}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper>.mat-expansion-panel-content{visibility:visible}.mat-expansion-panel-content{font-family:var(--mat-expansion-container-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-expansion-container-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-expansion-container-text-weight, var(--mat-sys-body-large-weight));line-height:var(--mat-expansion-container-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--mat-expansion-container-text-tracking, var(--mat-sys-body-large-tracking))}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px;border-top-color:var(--mat-expansion-actions-divider-color, var(--mat-sys-outline))}.mat-action-row .mat-button-base,.mat-action-row .mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row .mat-button-base,[dir=rtl] .mat-action-row .mat-mdc-button-base{margin-left:0;margin-right:8px} `],encapsulation:2,changeDetection:0})}return t})();var bY=(()=>{class t{panel=h(y9,{host:!0});_element=h(ge);_focusMonitor=h(Ha);_changeDetectorRef=h(ft);_parentChangeSubscription=Rn.EMPTY;constructor(){h(Hn).load(Za);let A=this.panel,i=h(vY,{optional:!0}),n=h(new bs("tabindex"),{optional:!0}),o=A.accordion?A.accordion._stateChanges.pipe(We(a=>!!(a.hideToggle||a.togglePosition))):xa;this.tabIndex=parseInt(n||"")||0,this._parentChangeSubscription=Qi(A.opened,A.closed,o,A._inputChanges.pipe(We(a=>!!(a.hideToggle||a.disabled||a.togglePosition)))).subscribe(()=>this._changeDetectorRef.markForCheck()),A.closed.pipe(We(()=>A._containsFocus())).subscribe(()=>this._focusMonitor.focusVia(this._element,"program")),i&&(this.expandedHeight=i.expandedHeight,this.collapsedHeight=i.collapsedHeight)}expandedHeight;collapsedHeight;tabIndex=0;get disabled(){return this.panel.disabled}_toggle(){this.disabled||this.panel.toggle()}_isExpanded(){return this.panel.expanded}_getExpandedState(){return this.panel._getExpandedState()}_getPanelId(){return this.panel.id}_getTogglePosition(){return this.panel.togglePosition}_showToggle(){return!this.panel.hideToggle&&!this.panel.disabled}_getHeaderHeight(){let A=this._isExpanded();return A&&this.expandedHeight?this.expandedHeight:!A&&this.collapsedHeight?this.collapsedHeight:null}_keydown(A){switch(A.keyCode){case 32:case 13:aa(A)||(A.preventDefault(),this._toggle());break;default:this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(A);return}}focus(A,i){A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}ngAfterViewInit(){this._focusMonitor.monitor(this._element).subscribe(A=>{A&&this.panel.accordion&&this.panel.accordion._handleHeaderFocus(this)})}ngOnDestroy(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-expansion-panel-header"]],hostAttrs:["role","button",1,"mat-expansion-panel-header","mat-focus-indicator"],hostVars:13,hostBindings:function(i,n){i&1&&$("click",function(){return n._toggle()})("keydown",function(a){return n._keydown(a)}),i&2&&(ie("id",n.panel._headerId)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n._getPanelId())("aria-expanded",n._isExpanded())("aria-disabled",n.panel.disabled),En("height",n._getHeaderHeight()),ae("mat-expanded",n._isExpanded())("mat-expansion-toggle-indicator-after",n._getTogglePosition()==="after")("mat-expansion-toggle-indicator-before",n._getTogglePosition()==="before"))},inputs:{expandedHeight:"expandedHeight",collapsedHeight:"collapsedHeight",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Zi(A)]},ngContentSelectors:$0A,decls:5,vars:3,consts:[[1,"mat-content"],[1,"mat-expansion-indicator"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 -960 960 960","aria-hidden","true","focusable","false"],["d","M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z"]],template:function(i,n){i&1&&(Yt(X0A),ti(0,"span",0),He(1),He(2,1),He(3,2),Ii(),V(4,ACA,3,0,"span",1)),i&2&&(ae("mat-content-hide-toggle",!n._showToggle()),p(4),W(n._showToggle()?4:-1))},styles:[`.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit}.mat-expansion-panel-animations-enabled .mat-expansion-panel-header{transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header::before{border-radius:inherit}.mat-expansion-panel-header{height:var(--mat-expansion-header-collapsed-state-height, 48px);font-family:var(--mat-expansion-header-text-font, var(--mat-sys-title-medium-font));font-size:var(--mat-expansion-header-text-size, var(--mat-sys-title-medium-size));font-weight:var(--mat-expansion-header-text-weight, var(--mat-sys-title-medium-weight));line-height:var(--mat-expansion-header-text-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--mat-expansion-header-text-tracking, var(--mat-sys-title-medium-tracking))}.mat-expansion-panel-header.mat-expanded{height:var(--mat-expansion-header-expanded-state-height, 64px)}.mat-expansion-panel-header[aria-disabled=true]{color:var(--mat-expansion-header-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-header-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}@media(hover: none){.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-container-background-color, var(--mat-sys-surface))}}.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused{background:var(--mat-expansion-header-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-content.mat-content-hide-toggle{margin-right:8px}[dir=rtl] .mat-content.mat-content-hide-toggle{margin-right:0;margin-left:8px}.mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-left:24px;margin-right:0}[dir=rtl] .mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-right:24px;margin-left:0}.mat-expansion-panel-header-title{color:var(--mat-expansion-header-text-color, var(--mat-sys-on-surface))}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;flex-basis:0;margin-right:16px;align-items:center}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header-description{flex-grow:2;color:var(--mat-expansion-header-description-color, var(--mat-sys-on-surface-variant))}.mat-expansion-panel-animations-enabled .mat-expansion-indicator{transition:transform 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header.mat-expanded .mat-expansion-indicator{transform:rotate(180deg)}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:"";padding:3px;transform:rotate(45deg);vertical-align:middle;color:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-legacy-header-indicator-display, none)}.mat-expansion-indicator svg{width:24px;height:24px;margin:0 -8px;vertical-align:middle;fill:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-header-indicator-display, inline-block)}@media(forced-colors: active){.mat-expansion-panel-content{border-top:1px solid;border-top-left-radius:0;border-top-right-radius:0}} `],encapsulation:2,changeDetection:0})}return t})();var MY=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["mat-panel-title"]],hostAttrs:[1,"mat-expansion-panel-header-title"]})}return t})();var kY=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[DY,_c,Fi]})}return t})();var tCA={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function vB(t,e){return e==="Agent Tool"?"smart_toy":e==="Built-in tool"?tCA[t]||"build":e==="Function tool"?"data_object":"build"}var Hl=class t{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(e){return t.toolMenuTooltips.get(e)}static getToolDetailedInfo(e){return t.toolDetailedInfo.get(e)}static getCallbackMenuTooltips(e){return t.callbackMenuTooltips.get(e)}static getCallbackDialogTooltips(e){return t.callbackDialogTooltips.get(e)}static getCallbackDetailedInfo(e){return t.callbackDetailedInfo.get(e)}};var iCA=["callbackNameInput"];function nCA(t,e){if(t&1){let A=zA();ws(0),m(1,"div",8)(2,"div",9),$("click",function(){rA(A);let n=y();return sA(n.toggleCallbackInfo())}),m(3,"mat-icon",10),K(4,"info"),D(),m(5,"div",11)(6,"span"),K(7,"Callback Information"),D()(),m(8,"button",12)(9,"mat-icon"),K(10),D()()(),m(11,"div",13)(12,"div",14)(13,"div",15),K(14),D(),m(15,"div",16),K(16),D()(),m(17,"div",17)(18,"a",18)(19,"mat-icon"),K(20,"open_in_new"),D(),m(21,"span"),K(22,"View Official Documentation"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isCallbackInfoExpanded?"expand_less":"expand_more"),p(),ae("expanded",o.isCallbackInfoExpanded),p(3),qA((A=o.getCallbackInfo())==null?null:A.shortDescription),p(2),qA((i=o.getCallbackInfo())==null?null:i.detailedDescription),p(2),X("href",(n=o.getCallbackInfo())==null?null:n.docLink,Da)}}function oCA(t,e){if(t&1&&(m(0,"mat-option",21),K(1),D()),t&2){let A=e.$implicit;X("value",A),p(),qA(A)}}function aCA(t,e){if(t&1){let A=zA();ws(0),m(1,"mat-form-field",3)(2,"mat-label"),K(3,"Callback Type"),D(),m(4,"mat-select",19),ao("ngModelChange",function(n){rA(A);let o=y();return Vn(o.callbackType,n)||(o.callbackType=n),sA(n)}),yt(5,oCA,2,2,"mat-option",20),D()(),ys()}if(t&2){let A=y();p(4),oo("ngModel",A.callbackType),p(),X("ngForOf",A.availableCallbackTypes)}}function rCA(t,e){t&1&&(m(0,"mat-error"),K(1,"Same callback name has been used"),D())}function sCA(t,e){t&1&&(m(0,"mat-error"),K(1,"Cannot have callback consist of two words"),D())}function gCA(t,e){t&1&&(m(0,"mat-error"),K(1,"Callback function names cannot have spaces"),D())}var v9=class{isErrorState(e){return!!(e&&e.invalid)}},k4=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.callbackType=A?.callbackType??"",this.existingCallbackNames=A?.existingCallbackNames??[],this.isEditMode=!!A?.isEditMode,this.availableCallbackTypes=A?.availableCallbackTypes??[],this.isEditMode&&A?.callback&&(this.callbackName=A.callback.name,this.callbackType=A.callback.type,this.originalCallbackName=A.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(i=>i!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new v9;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let e={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(e)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let e=(this.callbackName||"").trim();return this.existingCallbackNames.includes(e)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return Hl.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \u0275cmp=kA({type:t,selectors:[["app-add-callback-dialog"]],viewQuery:function(A,i){if(A&1&&ni(iCA,5),A&2){let n;Ce(n=Ie())&&(i.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){if(A&1){let n=zA();m(0,"h2",1),K(1),D(),m(2,"mat-dialog-content"),yt(3,nCA,23,6,"ng-container",2)(4,aCA,6,2,"ng-container",2),m(5,"mat-form-field",3)(6,"mat-label"),K(7,"Callback Name"),D(),m(8,"input",4,0),ao("ngModelChange",function(a){return rA(n),Vn(i.callbackName,a)||(i.callbackName=a),sA(a)}),$("ngModelChange",function(){return i.validate()})("keydown.enter",function(){return i.addCallback()}),D(),yt(10,rCA,2,0,"mat-error",2)(11,sCA,2,0,"mat-error",2)(12,gCA,2,0,"mat-error",2),D()(),m(13,"mat-dialog-actions",5)(14,"button",6),$("click",function(){return i.cancel()}),K(15,"Cancel"),D(),m(16,"button",7),$("click",function(){return i.addCallback()}),K(17),D()()}if(A&2){let n=Wi(9);p(),qA(i.isEditMode?"Edit Callback":"Add "+i.callbackType+" Callback"),p(2),X("ngIf",i.getCallbackInfo()),p(),X("ngIf",i.isEditMode),p(4),oo("ngModel",i.callbackName),X("errorStateMatcher",i.matcher),p(2),X("ngIf",n.hasError("duplicateName")),p(),X("ngIf",n.hasError("hasSpaces")),p(),X("ngIf",n.hasError("hasSpaces")),p(4),X("disabled",i.createDisabled()),p(),Fe(" ",i.isEditMode?"Save":"Add"," ")}},dependencies:[oa,md,yc,yn,ro,so,Ca,cJ,ya,Ta,gr,Cs,vn,Ia,vr,To,pl,t7,Fg,wa,Ub,Yg,Mr,Ug,In],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.mat-mdc-raised-button.mat-secondary[_ngcontent-%COMP%]:not([disabled]){background-color:#8ab4f8}.callback-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mat-dialog-content-text-color);margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:var(--mat-dialog-content-text-color);font-size:14px;line-height:1.5;opacity:.8}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function lCA(t,e){if(t&1){let A=zA();ws(0),m(1,"div",6)(2,"div",7),$("click",function(){rA(A);let n=y();return sA(n.toggleToolInfo())}),m(3,"mat-icon",8),K(4,"info"),D(),m(5,"div",9)(6,"span"),K(7,"Tool Information"),D()(),m(8,"button",10)(9,"mat-icon"),K(10),D()()(),m(11,"div",11)(12,"div",12)(13,"div",13),K(14),D(),m(15,"div",14),K(16),D()(),m(17,"div",15)(18,"a",16)(19,"mat-icon"),K(20,"open_in_new"),D(),m(21,"span"),K(22,"View Official Documentation"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isToolInfoExpanded?"expand_less":"expand_more"),p(),ae("expanded",o.isToolInfoExpanded),p(3),qA((A=o.getToolInfo())==null?null:A.shortDescription),p(2),qA((i=o.getToolInfo())==null?null:i.detailedDescription),p(2),X("href",(n=o.getToolInfo())==null?null:n.docLink,Da)}}function cCA(t,e){if(t&1){let A=zA();m(0,"mat-form-field",2)(1,"input",17),ao("ngModelChange",function(n){rA(A);let o=y();return Vn(o.toolName,n)||(o.toolName=n),sA(n)}),$("keydown.enter",function(){rA(A);let n=y();return sA(n.addTool())}),D()()}if(t&2){let A=y();p(),oo("ngModel",A.toolName)}}function CCA(t,e){if(t&1&&(m(0,"mat-option",20),K(1),D()),t&2){let A=e.$implicit;X("value",A),p(),Fe(" ",A," ")}}function ICA(t,e){if(t&1){let A=zA();m(0,"mat-form-field",2)(1,"mat-select",18),ao("ngModelChange",function(n){rA(A);let o=y();return Vn(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),sA(n)}),yt(2,CCA,2,2,"mat-option",19),D()()}if(t&2){let A=y();p(),oo("ngModel",A.selectedBuiltInTool),p(),X("ngForOf",A.builtInTools)}}var r2=class t{constructor(e,A){this.data=e;this.dialogRef=A}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let e={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?e.name=this.toolName.trim():this.toolType==="Built-in tool"&&(e.name=this.selectedBuiltInTool),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return Hl.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \u0275cmp=kA({type:t,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(A,i){A&1&&(m(0,"h2",0),K(1),D(),m(2,"mat-dialog-content"),yt(3,lCA,23,6,"ng-container",1),V(4,cCA,2,1,"mat-form-field",2),V(5,ICA,3,2,"mat-form-field",2),D(),m(6,"mat-dialog-actions",3)(7,"button",4),$("click",function(){return i.cancel()}),K(8,"Cancel"),D(),m(9,"button",5),$("click",function(){return i.addTool()}),K(10),D()()),A&2&&(p(),qA(i.isEditMode?"Editing Tool":"Add New Tool"),p(2),X("ngIf",i.getToolInfo()),p(),W(i.toolType==="Function tool"?4:-1),p(),W(i.toolType==="Built-in tool"?5:-1),p(4),X("disabled",i.createDisabled()),p(),Fe(" ",i.isEditMode?"Save":"Create"," "))},dependencies:[oa,md,yc,yn,ro,so,Ca,ya,gr,To,wa,Yg,Mr,Ta,vn,Ia,In],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function Lo(t){return Array.isArray(t)}function Oo(t){return t!==null&&typeof t=="object"&&(t.constructor===void 0||t.constructor.name==="Object")}function b9(t){return t&&typeof t=="object"?t.op==="add":!1}function M9(t){return t&&typeof t=="object"?t.op==="remove":!1}function m6(t){return t&&typeof t=="object"?t.op==="replace":!1}function p6(t){return t&&typeof t=="object"?t.op==="copy":!1}function s2(t){return t&&typeof t=="object"?t.op==="move":!1}function SY(t,e){return JSON.stringify(t)===JSON.stringify(e)}function dCA(t,e){return t===e}function k9(t){return t.slice(0,t.length-1)}function xY(t){return t[t.length-1]}function RY(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:dCA;if(t.length{e[A]=t[A]}),e}if(Oo(t)){let e=BA({},t);return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}return t}function R9(t,e,A){if(t[e]===A)return t;let i=x9(t);return i[e]=A,i}function Pe(t,e){let A=t,i=0;for(;i3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=Sr(t?t[n]:void 0,e.slice(1),A,i);if(Oo(t)||Lo(t))return R9(t,n,o);if(i){let a=BCA.test(n)?[]:{};return a[n]=o,a}throw new Error("Path does not exist")}var BCA=/^\d+$/;function S4(t,e,A){if(e.length===0)return A(t);if(!S9(t))throw new Error("Path doesn't exist");let i=e[0],n=S4(t[i],e.slice(1),A);return R9(t,i,n)}function n1(t,e){if(e.length===0)return t;if(!S9(t))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(!(n in t))return t;let o=x9(t);return Lo(o)&&o.splice(Number.parseInt(n),1),Oo(o)&&delete o[n],o}let A=e[0],i=n1(t[A],e.slice(1));return R9(t,A,i)}function x4(t,e,A){let i=e.slice(0,e.length-1),n=e[e.length-1];return S4(t,i,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(i)}`);let a=x9(o);return a.splice(Number.parseInt(n),0,A),a})}function cr(t,e){return t===void 0?!1:e.length===0?!0:t===null?!1:cr(t[e[0]],e.slice(1))}function As(t){let e=t.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function pt(t){return t.map(NY).join("")}function NY(t){return`/${String(t).replace(/~/g,"~0").replace(/\//g,"~1")}`}function R4(t,e){return t+NY(e)}function Js(t,e,A){let i=t;for(let n=0;n{let r,s=Ys(o,a.path);if(a.op==="add")r=_Y(o,s);else if(a.op==="remove")r=LY(o,s);else if(a.op==="replace")r=FY(o,s);else if(a.op==="copy")r=wCA(o,s);else if(a.op==="move")r=yCA(o,s,N4(a.from));else if(a.op==="test")r=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(a)}`);let g;if(A?.before){let l=A.before(o,a,r);if(l?.revertOperations&&(r=l.revertOperations),l?.document&&(g=l.document),l?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(i=r.concat(i),g!==void 0)return{document:g}}}),i}function FY(t,e){return cr(t,e)?[{op:"replace",path:pt(e),value:Pe(t,e)}]:[]}function LY(t,e){return[{op:"add",path:pt(e),value:Pe(t,e)}]}function _Y(t,e){return bB(t,e)||!cr(t,e)?[{op:"remove",path:pt(e)}]:FY(t,e)}function wCA(t,e){return _Y(t,e)}function yCA(t,e,A){if(e.length="0"&&t<="9"}function JY(t){return t>=" "}function F4(t){return`,:[]/{}() +`.includes(t)}function L9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"}function _9(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"||t>="0"&&t<="9"}var G9=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,K9=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function U9(t){return`,[]/{} +`.includes(t)}function J9(t){return L4(t)||_CA.test(t)}var _CA=/^[[{\w-]$/;function YY(t){return t===` `||t==="\r"||t===" "||t==="\b"||t==="\f"}function g2(t,e){let A=t.charCodeAt(e);return A===32||A===10||A===9||A===13}function HY(t,e){let A=t.charCodeAt(e);return A===32||A===9||A===13}function TY(t,e){let A=t.charCodeAt(e);return A===160||A===6158||A>=8192&&A<=8203||A===8239||A===8287||A===12288||A===65279}function L4(t){return Y9(t)||v6(t)}function Y9(t){return t==='"'||t==="\u201C"||t==="\u201D"}function H9(t){return t==='"'}function v6(t){return t==="'"||t==="\u2018"||t==="\u2019"||t==="`"||t==="\xB4"}function T9(t){return t==="'"}function MB(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(e);return i!==-1?t.substring(0,i)+(A?"":t.substring(i+1)):t}function Pg(t,e){let A=t.length;if(!g2(t,A-1))return t+e;for(;g2(t,A-1);)A--;return t.substring(0,A)+e+t.substring(A)}function OY(t,e,A){return t.substring(0,e)+t.substring(e+A)}function zY(t){return/[,\n][ \t\r]*$/.test(t)}var GCA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},KCA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` `,r:"\r",t:" "};function jg(t){let e=0,A="";g(["```","[```","{```"]),o()||P(),g(["```","```]","```}"]);let n=C(",");for(n&&a(),J9(t[e])&&zY(A)?(n||(A=Pg(A,",")),f()):n&&(A=MB(A,","));t[e]==="}"||t[e]==="]";)e++,a();if(e>=t.length)return A;yA();function o(){a();let iA=Q()||E()||b()||M()||v()||G(!1)||U();return a(),iA}function a(){let iA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,aA=e,hA=r(iA);do hA=s(),hA&&(hA=r(iA));while(hA);return e>aA}function r(iA){let aA=iA?g2:HY,hA="";for(;;)if(aA(t,e))hA+=t[e],e++;else if(TY(t,e))hA+=" ",e++;else break;return hA.length>0?(A+=hA,!0):!1}function s(){if(t[e]==="/"&&t[e+1]==="*"){for(;e=t.length;JA||(J9(t[e])||ee?A=Pg(A,":"):eA()),o()||(JA||ee?A+="null":eA())}return t[e]==="}"?(A+="}",e++):A=Pg(A,"}"),!0}return!1}function E(){if(t[e]==="["){A+="[",e++,a(),I(",")&&a();let iA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,aA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,hA=t[e]==="\\";if(hA&&(e++,hA=!0),L4(t[e])){let JA=H9(t[e])?H9:T9(t[e])?T9:v6(t[e])?v6:Y9,ee=e,UA=A.length,mA='"';for(e++;;){if(e>=t.length){let KA=Y(e-1);return!iA&&F4(t.charAt(KA))?(e=ee,A=A.substring(0,UA),b(!0)):(mA=Pg(mA,'"'),A+=mA,!0)}if(e===aA)return mA=Pg(mA,'"'),A+=mA,!0;if(JA(t[e])){let KA=e,ze=mA.length;if(mA+='"',e++,A+=mA,a(!1),iA||e>=t.length||F4(t[e])||L4(t[e])||l2(t[e]))return R(),!0;let Ke=Y(KA-1),HA=t.charAt(Ke);if(HA===",")return e=ee,A=A.substring(0,UA),b(!1,Ke);if(F4(HA))return e=ee,A=A.substring(0,UA),b(!0);A=A.substring(0,UA),e=KA+1,mA=`${mA.substring(0,ze)}\\${mA.substring(ze)}`}else if(iA&&U9(t[e])){if(t[e-1]===":"&&G9.test(t.substring(ee+1,e+2)))for(;e=t.length?e=t.length:dA()}else mA+=KA,e+=2}else{let KA=t.charAt(e);KA==='"'&&t[e-1]!=="\\"?(mA+=`\\${KA}`,e++):YY(KA)?(mA+=GCA[KA],e++):(JY(KA)||z(KA),mA+=KA,e++)}hA&&d()}}return!1}function R(){let iA=!1;for(a();t[e]==="+";){iA=!0,e++,a(),A=MB(A,'"',!0);let aA=A.length;b()?A=OY(A,aA,1):A=Pg(A,'"')}return iA}function M(){let iA=e;if(t[e]==="-"){if(e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1}for(;l2(t[e]);)e++;if(t[e]==="."){if(e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1;for(;l2(t[e]);)e++}if(t[e]==="e"||t[e]==="E"){if(e++,(t[e]==="-"||t[e]==="+")&&e++,j())return AA(iA),!0;if(!l2(t[e]))return e=iA,!1;for(;l2(t[e]);)e++}if(!j())return e=iA,!1;if(e>iA){let aA=t.slice(iA,e),hA=/^0\d/.test(aA);return A+=hA?`"${aA}"`:aA,!0}return!1}function v(){return F("true","true")||F("false","false")||F("null","null")||F("True","true")||F("False","false")||F("None","null")}function F(iA,aA){return t.slice(e,e+iA.length)===iA?(A+=aA,e+=iA.length,!0):!1}function G(iA){let aA=e;if(L9(t[e])){for(;eaA){for(;g2(t,e-1)&&e>0;)e--;let hA=t.slice(aA,e);return A+=hA==="undefined"?"null":JSON.stringify(hA),t[e]==='"'&&e++,!0}}function U(){if(t[e]==="/"){let iA=e;for(e++;e0&&g2(t,aA);)aA--;return aA}function j(){return e>=t.length||F4(t[e])||g2(t,e)}function AA(iA){A+=`${t.slice(iA,e)}0`}function z(iA){throw new Y0(`Invalid character ${JSON.stringify(iA)}`,e)}function yA(){throw new Y0(`Unexpected character ${JSON.stringify(t[e])}`,e)}function P(){throw new Y0("Unexpected end of json string",t.length)}function nA(){throw new Y0("Object key expected",e)}function eA(){throw new Y0("Colon expected",e)}function dA(){let iA=t.slice(e,e+6);throw new Y0(`Invalid unicode character "${iA}"`,e)}}function UCA(t,e){return t[e]==="*"&&t[e+1]==="/"}var JCA=typeof global=="object"&&global&&global.Object===Object&&global,b6=JCA;var YCA=typeof self=="object"&&self&&self.Object===Object&&self,HCA=b6||YCA||Function("return this")(),ba=HCA;var TCA=ba.Symbol,Cr=TCA;var PY=Object.prototype,OCA=PY.hasOwnProperty,zCA=PY.toString,_4=Cr?Cr.toStringTag:void 0;function PCA(t){var e=OCA.call(t,_4),A=t[_4];try{t[_4]=void 0;var i=!0}catch(o){}var n=zCA.call(t);return i&&(e?t[_4]=A:delete t[_4]),n}var jY=PCA;var jCA=Object.prototype,qCA=jCA.toString;function VCA(t){return qCA.call(t)}var qY=VCA;var WCA="[object Null]",ZCA="[object Undefined]",VY=Cr?Cr.toStringTag:void 0;function XCA(t){return t==null?t===void 0?ZCA:WCA:VY&&VY in Object(t)?jY(t):qY(t)}var Tl=XCA;function $CA(t){return t!=null&&typeof t=="object"}var hs=$CA;var A2A="[object Symbol]";function e2A(t){return typeof t=="symbol"||hs(t)&&Tl(t)==A2A}var Bg=e2A;function t2A(t,e){for(var A=-1,i=t==null?0:t.length,n=Array(i);++A0){if(++e>=O2A)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var IH=j2A;function q2A(t){return function(){return t}}var dH=q2A;var V2A=(function(){try{var t=Hs(Object,"defineProperty");return t({},"",{}),t}catch(e){}})(),SB=V2A;var W2A=SB?function(t,e){return SB(t,"toString",{configurable:!0,enumerable:!1,value:dH(e),writable:!0})}:Pc,BH=W2A;var Z2A=IH(BH),QH=Z2A;function X2A(t,e){for(var A=-1,i=t==null?0:t.length;++A-1&&t%1==0&&t-1&&t%1==0&&t<=lIA}var RB=cIA;function CIA(t){return t!=null&&RB(t.length)&&!M6(t)}var qg=CIA;function IIA(t,e,A){if(!Ar(A))return!1;var i=typeof e;return(i=="number"?qg(A)&&xB(e,A.length):i=="string"&&e in A)?I2(A[e],t):!1}var K4=IIA;var dIA=Object.prototype;function BIA(t){var e=t&&t.constructor,A=typeof e=="function"&&e.prototype||dIA;return t===A}var B2=BIA;function QIA(t,e){for(var A=-1,i=Array(t);++A-1}var JH=_1A;function G1A(t,e){var A=this.__data__,i=h2(A,t);return i<0?(++this.size,A.push([t,e])):A[i][1]=e,this}var YH=G1A;function GB(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e0&&A(r)?e>1?AT(r,e-1,A,i,n):JB(n,r):i||(n[n.length]=r)}return n}var eT=AT;var adA=F6(Object.getPrototypeOf,Object),K6=adA;function rdA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++ir))return!1;var g=o.get(t),l=o.get(e);if(g&&l)return g==e&&l==t;var C=-1,I=!0,d=A&aQA?new zT:void 0;for(o.set(t,e),o.set(e,t);++C=e||G<0||C&&U>=o}function f(){var F=i8();if(E(F))return b(F);r=setTimeout(f,Q(F))}function b(F){return r=void 0,I&&i?d(F):(i=n=void 0,a)}function R(){r!==void 0&&clearTimeout(r),g=0,i=s=n=r=void 0}function M(){return r===void 0?a:b(i8())}function v(){var F=i8(),G=E(F);if(i=arguments,n=this,s=F,G){if(r===void 0)return B(s);if(C)return clearTimeout(r),r=setTimeout(f,e),d(s)}return r===void 0&&(r=setTimeout(f,e)),a}return v.cancel=R,v.flush=M,v}var PB=aEA;function rEA(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var fi=rEA;function sEA(t){return typeof t=="function"?t:Pc}var n8=sEA;function gEA(t,e){for(var A=t==null?0:t.length;A--&&e(t[A],A,t)!==!1;);return t}var EO=gEA;var lEA=X6(!0),hO=lEA;function cEA(t,e){return t&&hO(t,e,Vg)}var uO=cEA;var CEA=A8(uO,!0),fO=CEA;function IEA(t,e){var A=Xn(t)?EO:fO;return A(t,n8(e))}var W9=IEA;function dEA(t){return t&&t.length?t[0]:void 0}var Wg=dEA;function BEA(t,e){var A=-1,i=qg(t)?Array(t.length):[];return e8(t,function(n,o,a){i[++A]=e(n,o,a)}),i}var o8=BEA;function QEA(t,e){var A=Xn(t)?c2:o8;return A(t,jc(e,3))}var Z9=QEA;var EEA=Object.prototype,hEA=EEA.hasOwnProperty,uEA=t8(function(t,e,A){hEA.call(t,A)?t[A].push(e):C2(t,A,[e])}),X9=uEA;function fEA(t){var e=t==null?0:t.length;return e?tT(t,0,-1):[]}var Li=fEA;var mEA="[object Map]",pEA="[object Set]",DEA=Object.prototype,wEA=DEA.hasOwnProperty;function yEA(t){if(t==null)return!0;if(qg(t)&&(Xn(t)||typeof t=="string"||typeof t.splice=="function"||T0(t)||NB(t)||Q2(t)))return!t.length;var e=Ol(t);if(e==mEA||e==pEA)return!t.size;if(B2(t))return!L6(t).length;for(var A in t)if(wEA.call(t,A))return!1;return!0}var zi=yEA;function vEA(t,e){return zB(t,e)}var di=vEA;function bEA(t,e){return te||o&&a&&s&&!r&&!g||i&&a&&s||!A&&s||!n)return 1;if(!i&&!o&&!g&&t=r)return s;var g=A[i];return s*(g=="desc"?-1:1)}}return t.index-e.index}var yO=NEA;function FEA(t,e,A){e.length?e=c2(e,function(o){return Xn(o)?function(a){return UB(a,o.length===1?o[0]:o)}:o}):e=[Pc];var i=-1;e=c2(e,E2(jc));var n=o8(t,function(o,a,r){var s=c2(e,function(g){return g(o)});return{criteria:s,index:++i,value:o}});return DO(n,function(o,a){return yO(o,a,A)})}var vO=FEA;var LEA=t8(function(t,e,A){t[A?0:1].push(e)},function(){return[[],[]]}),AM=LEA;var _EA=Math.ceil,GEA=Math.max;function KEA(t,e,A,i){for(var n=-1,o=GEA(_EA((e-t)/(A||1)),0),a=Array(o);o--;)a[i?o:++n]=t,t+=A;return a}var bO=KEA;function UEA(t){return function(e,A,i){return i&&typeof i!="number"&&K4(e,A,i)&&(A=i=void 0),e=kB(e),A===void 0?(A=e,e=0):A=kB(A),i=i===void 0?e1&&K4(t,e[0],e[1])?e=[]:A>2&&K4(e[0],e[1],e[2])&&(e=[e[0]]),vO(t,eT(e,1),[])}),eM=YEA;var HEA=9007199254740991,tM=4294967295,TEA=Math.min;function OEA(t,e){if(t=nH(t),t<1||t>HEA)return[];var A=tM,i=TEA(t,tM);e=n8(e),t-=tM;for(var n=R6(i,e);++AArray.isArray(t),jEA=t=>t!==null&&typeof t=="object"&&!y2(t),qEA=t=>typeof t=="string",r1=(t,e)=>t===e?!0:t!==null&&e!==null&&typeof t=="object"&&typeof e=="object"&&Object.keys(t).length===Object.keys(e).length&&Object.entries(t).every(([A,i])=>r1(i,e[A])),kO=(t,e)=>{let A=t?.[e];if(A!==void 0){if(!Object.hasOwn(t,e)||Array.isArray(t)&&!/^\d+$/.test(e)||typeof t!="object")throw new TypeError(`Unsupported property "${e}"`);return A}};function Fa(t){return(...e)=>{let A=e.map(o=>La(o)),i=A[0],n=A[1];return A.length===1?o=>t(i(o)):A.length===2?o=>t(i(o),n(o)):o=>t(...A.map(a=>a(o)))}}var O4={boolean:0,number:1,string:2},SO=3,NO=(t,e)=>typeof t==typeof e&&typeof t in O4?t>e:!1,VEA=(t,e)=>r1(t,e)||NO(t,e),FO=(t,e)=>typeof t==typeof e&&typeof t in O4?tr1(t,e)||FO(t,e),T4={pipe:(...t)=>{let e=t.map(A=>La(A));return A=>e.reduce((i,n)=>n(i),A)},object:t=>{let e=Object.keys(t).map(A=>[A,La(t[A])]);return A=>{let i={};for(let[n,o]of e)i[n]=o(A);return i}},array:(...t)=>{let e=t.map(A=>La(A));return A=>e.map(i=>i(A))},get:(...t)=>{if(t.length===0)return e=>e??null;if(t.length===1){let e=t[0];return A=>kO(A,e)??null}return e=>{let A=e;for(let i of t)A=kO(A,i);return A??null}},map:t=>{let e=La(t);return A=>A.map(e)},mapObject:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e(n);i[o]=A[n]}return i}},mapValues:t=>{let e=La(t);return A=>{let i={};for(let n of Object.keys(A))i[n]=e(A[n]);return i}},filter:t=>{let e=La(t);return A=>A.filter(i=>xO(e(i)))},sort:(t=["get"],e)=>{let A=La(t),i=e==="desc"?-1:1;function n(o,a){let r=A(o),s=A(a);if(typeof r!=typeof s){let g=O4[typeof r]??SO,l=O4[typeof s]??SO;return g>l?i:gs?i:ro.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let e=t.map(([i,...n])=>[n[n.length-1],T4.get(...n)]),A=(i,n)=>{let o={};for(let[a,r]of n)o[a]=r(i);return o};return i=>y2(i)?i.map(n=>A(n,e)):A(i,e)},groupBy:t=>{let e=La(t);return A=>{let i={};for(let n of A){let o=e(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let e=La(t);return A=>{let i={};for(let n of A){let o=e(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t="")=>e=>e.join(t),split:Fa((t,e)=>e!==void 0?t.split(e):t.trim().split(/\s+/)),substring:Fa((t,e,A)=>t.slice(Math.max(e,0),A)),uniq:()=>t=>{let e=[];for(let A of t)e.findIndex(i=>r1(i,A))===-1&&e.push(A);return e},uniqBy:t=>e=>Object.values(T4.keyBy(t)(e)),limit:t=>e=>e.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>H4(t,(e,A)=>e*A),sum:()=>t=>y2(t)?t.reduce((e,A)=>e+A,0):nM(),average:()=>t=>y2(t)?t.length>0?t.reduce((e,A)=>e+A)/t.length:null:nM(),min:()=>t=>H4(t,(e,A)=>Math.min(e,A)),max:()=>t=>H4(t,(e,A)=>Math.max(e,A)),and:Fa((...t)=>H4(t,(e,A)=>!!(e&&A))),or:Fa((...t)=>H4(t,(e,A)=>!!(e||A))),not:Fa(t=>!t),exists:t=>{let e=t.slice(1),A=e.pop(),i=T4.get(...e);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(t,e,A)=>{let i=La(t),n=La(e),o=La(A);return a=>xO(i(a))?n(a):o(a)},in:(t,e)=>{let A=La(t),i=La(e);return n=>{let o=A(n);return i(n).findIndex(a=>r1(a,o))!==-1}},"not in":(t,e)=>{let A=T4.in(t,e);return i=>!A(i)},regex:(t,e,A)=>{let i=new RegExp(e,A),n=La(t);return o=>i.test(n(o))},match:(t,e,A)=>{let i=new RegExp(e,A),n=La(t);return o=>{let a=n(o).match(i);return a?RO(a):null}},matchAll:(t,e,A)=>{let i=new RegExp(e,`${A??""}g`),n=La(t);return o=>Array.from(n(o).matchAll(i)).map(RO)},eq:Fa(r1),gt:Fa(NO),gte:Fa(VEA),lt:Fa(FO),lte:Fa(WEA),ne:Fa((t,e)=>!r1(t,e)),add:Fa((t,e)=>t+e),subtract:Fa((t,e)=>t-e),multiply:Fa((t,e)=>t*e),divide:Fa((t,e)=>t/e),mod:Fa((t,e)=>t%e),pow:Fa((t,e)=>t**e),abs:Fa(Math.abs),round:Fa((t,e=0)=>+`${Math.round(+`${t}e${e}`)}e${-e}`),number:Fa(t=>{let e=Number(t);return Number.isNaN(Number(t))?null:e}),string:Fa(String)},xO=t=>t!==null&&t!==0&&t!==!1,H4=(t,e)=>(y2(t)||nM(),t.length===0?null:t.reduce(e)),RO=t=>{let[e,...A]=t,i=t.groups;return A.length?i?{value:e,groups:A,namedGroups:i}:{value:e,groups:A}:{value:e}},nM=()=>{oM("Array expected")},oM=t=>{throw new TypeError(t)},r8=[];function La(t,e){r8.unshift(BA(BA(BA({},T4),r8[0]),e?.functions));try{let A=y2(t)?ZEA(t,r8[0]):jEA(t)?oM(`Function notation ["object", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return A(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{r8.shift()}}function ZEA(t,e){let[A,...i]=t,n=e[A];return n||oM(`Unknown function '${A}'`),n(...i)}var LO=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],XEA=["|","and","or"],_O=["|","and","or","*","/","%","+","-"];function GO(t,e){if(!y2(e))throw new Error("Invalid custom operators");return e.reduce($EA,t)}function $EA(t,{name:e,op:A,at:i,after:n,before:o}){if(i)return t.map(s=>Object.values(s).includes(i)?Ve(BA({},s),{[e]:A}):s);let a=n??o,r=t.findIndex(s=>Object.values(s).includes(a));if(r!==-1)return t.toSpliced(r+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var AhA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,ehA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,thA=/^"(?:[^"\\]|\\.)*"/,ihA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,nhA=/^(0|[1-9][0-9]*)/,ohA=/^(true|false|null)/,ahA=/^[ \n\t\r]+/;function aM(t,e){let A=e?.operators??[],i=GO(LO,A),n=Object.assign({},...i),o=XEA.concat(A.filter(j=>j.vararg).map(j=>j.op)),a=_O.concat(A.filter(j=>j.leftAssociative).map(j=>j.op)),r=(j=i.length-1)=>{let AA=i[j];if(!AA)return g();let z=t[U]==="(",yA=r(j-1);for(;;){if(v(),t[U]==="."&&"pipe"in AA){let aA=l();yA=yA[0]==="pipe"?[...yA,aA]:["pipe",yA,aA];continue}let P=U,nA=s(AA);if(!nA)break;let eA=r(j-1),dA=yA[0],iA=nA===dA&&!z;if(iA&&!a.includes(n[nA])){U=P;break}yA=iA&&o.includes(n[nA])?[...yA,eA]:[nA,yA,eA]}return yA},s=j=>{let AA=Object.keys(j).sort((z,yA)=>yA.length-z.length);for(let z of AA){let yA=j[z];if(t.substring(U,U+yA.length)===yA)return U+=yA.length,v(),z}},g=()=>{if(v(),t[U]==="("){U++;let j=r();return F(")"),j}return l()},l=()=>{if(t[U]==="."){let j=[];for(;t[U]===".";)U++,j.push(B()??Q()??f()??G("Property expected")),v();return["get",...j]}return C()},C=()=>{let j=U,AA=Q();if(v(),!AA||t[U]!=="(")return U=j,I();U++,v();let z=t[U]!==")"?[r()]:[];for(;U{if(t[U]==="{"){U++,v();let j={},AA=!0;for(;U{if(t[U]==="["){U++,v();let j=[],AA=!0;for(;UM(thA,JSON.parse),Q=()=>M(ehA,j=>j),E=()=>M(ihA,JSON.parse),f=()=>M(nhA,JSON.parse),b=()=>{let j=M(ohA,JSON.parse);if(j!==void 0)return j;G("Value expected")},R=()=>{v(),U{let z=t.substring(U).match(j);if(z)return U+=z[0].length,AA(z[0])},v=()=>M(ahA,j=>j),F=j=>{t[U]!==j&&G(`Character '${j}' expected`),U++},G=(j,AA=U)=>{throw new SyntaxError(`${j} (pos: ${AA})`)},U=0,Y=r();return R(),Y}var rhA=40,shA=" ",KO=(t,e)=>{let A=e?.indentation??shA,i=e?.operators??[],n=GO(LO,i),o=Object.assign({},...n),a=_O.concat(i.filter(d=>d.leftAssociative).map(d=>d.op)),r=(d,B,Q=!1)=>y2(d)?s(d,B,Q):JSON.stringify(d),s=(d,B,Q)=>{let[E,...f]=d;if(E==="get"&&f.length>0)return l(f);if(E==="object")return g(f[0],B);if(E==="array"){let v=f.map(F=>r(F,B));return I(v,["[",", ","]"],[`[ ${B+A}`,`, ${B+A}`,` ${B}]`])}let b=o[E];if(b){let v=Q?"(":"",F=Q?")":"",G=f.map((U,Y)=>{let j=U?.[0],AA=n.findIndex(P=>E in P),z=n.findIndex(P=>j in P),yA=AA0||E===j&&!a.includes(b);return r(U,B+A,yA)});return I(G,[v,` ${b} `,F],[v,` ${B+A}${b} `,F])}let R=f.length===1?B:B+A,M=f.map(v=>r(v,R));return I(M,[`${E}(`,", ",")"],f.length===1?[`${E}(`,`, ${B}`,")"]:[`${E}( ${R}`,`, ${R}`,` ${B})`])},g=(d,B)=>{let Q=B+A,E=Object.entries(d).map(([f,b])=>`${C(f)}: ${r(b,Q)}`);return I(E,["{ ",", "," }"],[`{ ${Q}`,`, ${Q}`,` ${B}}`])},l=d=>d.map(B=>`.${C(B)}`).join(""),C=d=>AhA.test(d)?d:JSON.stringify(d),I=(d,[B,Q,E],[f,b,R])=>B.length+d.reduce((M,v)=>M+v.length+Q.length,0)-Q.length+E.length<=(e?.maxLineLength??rhA)?B+d.join(Q)+E:f+d.join(b)+R;return r(t,"")};function UO(t,e,A){return La(qEA(e)?aM(e,A):e,A)(t)}var JO={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256a208 208 0 1 1 -416 0 208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0 256 256 0 1 0 -512 0zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var ghA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zm230.7 89.9c7.8-10.7 22.8-13.1 33.5-5.3 10.7 7.8 13.1 22.8 5.3 33.5L211.4 366.1c-4.1 5.7-10.5 9.3-17.5 9.8-7 .5-13.9-2-18.8-6.9l-55.9-55.9c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l36 36 105.6-145.2z"]},rM=ghA;var YO={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M296.5 291.1C321 265.2 336 230.4 336 192 336 112.5 271.5 48 192 48S48 112.5 48 192c0 38.4 15 73.2 39.5 99.1 21.3 22.4 44.9 54 53.3 92.9l102.4 0c8.4-39 32-70.5 53.3-92.9zm34.8 33C307.7 349 288 379.4 288 413.7l0 18.3c0 44.2-35.8 80-80 80l-32 0c-44.2 0-80-35.8-80-80l0-18.3C96 379.4 76.3 349 52.7 324.1 20 289.7 0 243.2 0 192 0 86 86 0 192 0S384 86 384 192c0 51.2-20 97.7-52.7 132.1zM144 184c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6 39.4-88 88-88 13.3 0 24 10.7 24 24s-10.7 24-24 24c-22.1 0-40 17.9-40 40z"]};var sM={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var HO={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M480.1 192l7.9 0c13.3 0 24-10.7 24-24l0-144c0-9.7-5.8-18.5-14.8-22.2S477.9 .2 471 7L419.3 58.8C375 22.1 318 0 256 0 127 0 20.3 95.4 2.6 219.5 .1 237 12.2 253.2 29.7 255.7s33.7-9.7 36.2-27.1C79.2 135.5 159.3 64 256 64 300.4 64 341.2 79 373.7 104.3L327 151c-6.9 6.9-8.9 17.2-5.2 26.2S334.3 192 344 192l136.1 0zm29.4 100.5c2.5-17.5-9.7-33.7-27.1-36.2s-33.7 9.7-36.2 27.1c-13.3 93-93.4 164.5-190.1 164.5-44.4 0-85.2-15-117.7-40.3L185 361c6.9-6.9 8.9-17.2 5.2-26.2S177.7 320 168 320L24 320c-13.3 0-24 10.7-24 24L0 488c0 9.7 5.8 18.5 14.8 22.2S34.1 511.8 41 505l51.8-51.8C137 489.9 194 512 256 512 385 512 491.7 416.6 509.4 292.5z"]};var gM={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M64 0C28.7 0 0 28.7 0 64L0 384c0 35.3 28.7 64 64 64l112 0 0-224c0-61.9 50.1-112 112-112l64 0 0-48c0-35.3-28.7-64-64-64L64 0zM248 112l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24zm40 48c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64l160 0c35.3 0 64-28.7 64-64l0-165.5c0-17-6.7-33.3-18.7-45.3l-58.5-58.5c-12-12-28.3-18.7-45.3-18.7L288 160z"]};var lhA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32-32 0C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l208 0 0-64-208 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64l-208 0 0 64 208 0 0 352z"]},TO=lhA;var z4={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M32 64C19.1 64 7.4 71.8 2.4 83.8S.2 109.5 9.4 118.6L192 301.3 192 416c0 8.5 3.4 16.6 9.4 22.6l64 64c9.2 9.2 22.9 11.9 34.9 6.9S320 492.9 320 480l0-178.7 182.6-182.6c9.2-9.2 11.9-22.9 6.9-34.9S492.9 64 480 64L32 64z"]};var chA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9S110.5 192 120 192l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},OO=chA;var qB={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M249.3 235.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9S64.5 396.9 64.5 384l0-256c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z"]};var ChA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376C296.3 401.1 253.9 416 208 416 93.1 416 0 322.9 0 208S93.1 0 208 0 416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},P4=ChA;var zO={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6-46.8 43.5-78.1 95.4-93 131.1-3.3 7.9-3.3 16.7 0 24.6 14.9 35.7 46.2 87.7 93 131.1 47.1 43.7 111.8 80.6 192.6 80.6s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1 3.3-7.9 3.3-16.7 0-24.6-14.9-35.7-46.2-87.7-93-131.1-47.1-43.7-111.8-80.6-192.6-80.6zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64-11.5 0-22.3-3-31.7-8.4-1 10.9-.1 22.1 2.9 33.2 13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-12.2-45.7-55.5-74.8-101.1-70.8 5.3 9.3 8.4 20.1 8.4 31.7z"]},PO={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M7.7 235.8c-10.3 12.6-9.5 31.1 2.2 42.8l128 128c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-256c0-12.9-7.8-24.6-19.8-29.6s-25.7-2.2-34.9 6.9l-128 128-2.2 2.4z"]};var jO={prefix:"fas",iconName:"chevron-up",icon:[448,512,[],"f077","M201.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 173.3 54.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var qO={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8-79.3 23.6-137.1 97.1-137.1 184.1 0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256 512 397.4 397.4 512 256 512S0 397.4 0 256c0-116 77.1-213.9 182.9-245.4 16.9-5 34.8 4.6 39.8 21.5z"]};var IhA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 144a56 56 0 1 1 0-112 56 56 0 1 1 0 112zm0 224c30.9 0 56 25.1 56 56s-25.1 56-56 56-56-25.1-56-56 25.1-56 56-56zm56-112c0 30.9-25.1 56-56 56s-56-25.1-56-56 25.1-56 56-56 56 25.1 56 56z"]},lM=IhA;var dhA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L368 46.1 465.9 144 490.3 119.6c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L432 177.9 334.1 80 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},VO=dhA;var cM={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448l-224 0 0-224 48 0 0-64-48 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-48-64 0 0 48zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var BhA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M384 32c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0zM342 145.7c-10.7-7.8-25.7-5.4-33.5 5.3L189.1 315.2 137 263.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8L347.3 179.2c7.8-10.7 5.4-25.7-5.3-33.5z"]},CM=BhA;var QhA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9S337.5 320 328 320l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},WO=QhA;var j4={prefix:"fas",iconName:"code",icon:[576,512,[],"f121","M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 150.6 182.6c12.5-12.5 12.5-32.8 0-45.3z"]};var IM={prefix:"fas",iconName:"angle-right",icon:[256,512,[8250],"f105","M247.1 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L179.2 256 41.9 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var EhA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M195.1 9.5C198.1-5.3 211.2-16 226.4-16l59.8 0c15.2 0 28.3 10.7 31.3 25.5L332 79.5c14.1 6 27.3 13.7 39.3 22.8l67.8-22.5c14.4-4.8 30.2 1.2 37.8 14.4l29.9 51.8c7.6 13.2 4.9 29.8-6.5 39.9L447 233.3c.9 7.4 1.3 15 1.3 22.7s-.5 15.3-1.3 22.7l53.4 47.5c11.4 10.1 14 26.8 6.5 39.9l-29.9 51.8c-7.6 13.1-23.4 19.2-37.8 14.4l-67.8-22.5c-12.1 9.1-25.3 16.7-39.3 22.8l-14.4 69.9c-3.1 14.9-16.2 25.5-31.3 25.5l-59.8 0c-15.2 0-28.3-10.7-31.3-25.5l-14.4-69.9c-14.1-6-27.2-13.7-39.3-22.8L73.5 432.3c-14.4 4.8-30.2-1.2-37.8-14.4L5.8 366.1c-7.6-13.2-4.9-29.8 6.5-39.9l53.4-47.5c-.9-7.4-1.3-15-1.3-22.7s.5-15.3 1.3-22.7L12.3 185.8c-11.4-10.1-14-26.8-6.5-39.9L35.7 94.1c7.6-13.2 23.4-19.2 37.8-14.4l67.8 22.5c12.1-9.1 25.3-16.7 39.3-22.8L195.1 9.5zM256.3 336a80 80 0 1 0 -.6-160 80 80 0 1 0 .6 160z"]},ZO=EhA;var XO={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2S34.1 320.2 41 327l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S177.7 512 168 512z"]};var P0={prefix:"fas",iconName:"wrench",icon:[576,512,[128295],"f0ad","M509.4 98.6c7.6-7.6 20.3-5.7 24.1 4.3 6.8 17.7 10.5 37 10.5 57.1 0 88.4-71.6 160-160 160-17.5 0-34.4-2.8-50.2-8L146.9 498.9c-28.1 28.1-73.7 28.1-101.8 0s-28.1-73.7 0-101.8L232 210.2c-5.2-15.8-8-32.6-8-50.2 0-88.4 71.6-160 160-160 20.1 0 39.4 3.7 57.1 10.5 10 3.8 11.8 16.5 4.3 24.1l-88.7 88.7c-3 3-4.7 7.1-4.7 11.3l0 41.4c0 8.8 7.2 16 16 16l41.4 0c4.2 0 8.3-1.7 11.3-4.7l88.7-88.7z"]},s8={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z"]};var g8={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M434.8 70.1c14.3 10.4 17.5 30.4 7.1 44.7l-256 352c-5.5 7.6-14 12.3-23.4 13.1s-18.5-2.7-25.1-9.3l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l101.5 101.5 234-321.7c10.4-14.3 30.4-17.5 44.7-7.1z"]};var $O={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M55.1 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L147.2 256 9.9 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192.5 301.3 329.9 438.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.8 256 375.1 118.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192.5 210.7 55.1 73.4z"]},Az=$O;var q4=$O;var s1={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M352.9 21.2L308 66.1 445.9 204 490.8 159.1C504.4 145.6 512 127.2 512 108s-7.6-37.6-21.2-51.1L455.1 21.2C441.6 7.6 423.2 0 404 0s-37.6 7.6-51.1 21.2zM274.1 100L58.9 315.1c-10.7 10.7-18.5 24.1-22.6 38.7L.9 481.6c-2.3 8.3 0 17.3 6.2 23.4s15.1 8.5 23.4 6.2l127.8-35.5c14.6-4.1 27.9-11.8 38.7-22.6L412 237.9 274.1 100z"]};var ez={prefix:"fas",iconName:"chevron-down",icon:[448,512,[],"f078","M201.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 338.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var tz={prefix:"fas",iconName:"angle-down",icon:[384,512,[8964],"f107","M169.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 306.7 54.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var hhA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M246.6 374.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L96 370.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 306.7 41.4-41.4c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var V4=hhA;var uhA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 0c14.7 0 28.2 8.1 35.2 21l216 400c6.7 12.4 6.4 27.4-.8 39.5S486.1 480 472 480L40 480c-14.1 0-27.2-7.4-34.4-19.5s-7.5-27.1-.8-39.5l216-400c7-12.9 20.5-21 35.2-21zm0 352a32 32 0 1 0 0 64 32 32 0 1 0 0-64zm0-192c-18.2 0-32.7 15.5-31.4 33.7l7.4 104c.9 12.5 11.4 22.3 23.9 22.3 12.6 0 23-9.7 23.9-22.3l7.4-104c1.3-18.2-13.1-33.7-31.4-33.7z"]},v2=uhA;var fhA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5-61.9 0-112 50.1-112 112s50.1 112 112 112 112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6-28.3-28.3-74.1-28.3-102.4 0L256 192 216.5 152.5c4.9-12.6 7.5-26.2 7.5-40.5 0-61.9-50.1-112-112-112S0 50.1 0 112 50.1 224 112 224c14.3 0 27.9-2.7 40.5-7.5L192 256zm97.9 97.9L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0 7.1-7.1 7.1-18.5 0-25.6l-145.3-145.3-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},g1=fhA;var W4={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[512,512,[8644,"exchange"],"f0ec","M502.6 150.6l-96 96c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L402.7 160 32 160c-17.7 0-32-14.3-32-32S14.3 96 32 96l370.7 0-41.4-41.4c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l96 96c12.5 12.5 12.5 32.8 0 45.3zm-397.3 352l-96-96c-12.5-12.5-12.5-32.8 0-45.3l96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L109.3 352 480 352c17.7 0 32 14.3 32 32s-14.3 32-32 32l-370.7 0 41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0z"]};var dM={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M140.3 135.2c12.6-10.3 31.1-9.5 42.8 2.2l128 128c9.2 9.2 11.9 22.9 6.9 34.9S301.4 320 288.5 320l-256 0c-12.9 0-24.6-7.8-29.6-19.8S.7 274.5 9.9 265.4l128-128 2.4-2.2z"]};var iz={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439.5 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2S450.2 240 440.5 240l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87zM72.5 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87-39-39c-6.9-6.9-8.9-17.2-5.2-26.2S62.8 272 72.5 272z"]};var l1={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160-160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l160 0 0 160c0 17.7 14.3 32 32 32s32-14.3 32-32l0-160 160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-160 0 0-160z"]};var j0={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M192 0c-35.3 0-64 28.7-64 64l0 256c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-200.6c0-17.4-7.1-34.1-19.7-46.2L370.6 17.8C358.7 6.4 342.8 0 326.3 0L192 0zM64 128c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l192 0c35.3 0 64-28.7 64-64l0-16-64 0 0 16-192 0 0-256 16 0 0-64-16 0z"]};var mhA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M436.7 74.7L448 85.4 448 32c0-17.7 14.3-32 32-32s32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l47.9 0-7.6-7.2c-.2-.2-.4-.4-.6-.6-75-75-196.5-75-271.5 0s-75 196.5 0 271.5 196.5 75 271.5 0c8.2-8.2 15.5-16.9 21.9-26.1 10.1-14.5 30.1-18 44.6-7.9s18 30.1 7.9 44.6c-8.5 12.2-18.2 23.8-29.1 34.7-100 100-262.1 100-362 0S-25 175 75 75c99.9-99.9 261.7-100 361.7-.3z"]};var l8=mhA;var qc={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M140.3 376.8c12.6 10.2 31.1 9.5 42.8-2.2l128-128c9.2-9.2 11.9-22.9 6.9-34.9S301.4 192 288.5 192l-256 0c-12.9 0-24.6 7.8-29.6 19.8S.7 237.5 9.9 246.6l128 128 2.4 2.2z"]};var phA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M256 64c-56.8 0-107.9 24.7-143.1 64l47.1 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 192c-17.7 0-32-14.3-32-32L0 32C0 14.3 14.3 0 32 0S64 14.3 64 32l0 54.7C110.9 33.6 179.5 0 256 0 397.4 0 512 114.6 512 256S397.4 512 256 512c-87 0-163.9-43.4-210.1-109.7-10.1-14.5-6.6-34.4 7.9-44.6s34.4-6.6 44.6 7.9c34.8 49.8 92.4 82.3 157.6 82.3 106 0 192-86 192-192S362 64 256 64z"]};var c8=phA;var BM={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32z"]};var QM={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 502.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 402.7 224 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 370.7-105.4-105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var QZ=rf(az(),1);var rz=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function DhA(t,e){return!!(t===e||rz(t)&&rz(e))}function whA(t,e){if(t.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},Ts=class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,A,i){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=A,i?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,A){return t.literals[e]=A,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(t.hooks[e]){let i={context:this,node:A};return t.hooks.run(e,i),i.node}return A}searchHook(e){if(t.hooks[e]){let A={context:this};return t.hooks[e].find(function(i){return i.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],i,n;for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&C.right_a?i>C.prec:i<=C.prec;for(;n.length>2&&l(n[n.length-2]);)r=n.pop(),A=n.pop().value,a=n.pop(),e={type:t.BINARY_EXP,operator:A,left:a,right:r},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+g),n.push(o,e)}for(s=n.length-1,e=n[s];s>1;)e={type:t.BINARY_EXP,operator:n[s-1].value,left:n[s-2],right:e},s-=2;return e}gobbleToken(){let e,A,i,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,t.max_unop_len),i=A.length;i>0;){if(t.unary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let a=A.length;a":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});Ts.max_unop_len=Ts.getMaxKeyLen(Ts.unary_ops);Ts.max_binop_len=Ts.getMaxKeyLen(Ts.binary_ops);var Vc=t=>new Ts(t).parse(),vhA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(Ts).filter(t=>!vhA.includes(t)&&Vc[t]===void 0).forEach(t=>{Vc[t]=Ts[t]});Vc.Jsep=Ts;var bhA="ConditionalExpression",MhA={name:"ternary",init(t){t.hooks.add("after-expression",function(A){if(A.node&&this.code===t.QUMARK_CODE){this.index++;let i=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:bhA,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let a=i;for(;a.right.operator&&t.binary_ops[a.right.operator]<=.9;)a=a.right;A.node.test=a.right,a.right=A.node,A.node=i}}else this.throwError("Expected :")}})}};Vc.plugins.register(MhA);var gz=47,khA=92,ShA={name:"regex",init(t){t.hooks.add("gobble-token",function(A){if(this.code===gz){let i=++this.index,n=!1;for(;this.index=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57)a+=this.char;else break}let r;try{r=new RegExp(o,a)}catch(s){this.throwError(s.message)}return A.node={type:t.LITERAL,value:r,raw:this.expr.slice(i-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===khA?2:1}this.throwError("Unclosed Regex")}})}},EM=43,xhA=45,WB={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[EM,xhA],assignmentPrecedence:.9,init(t){let e=[t.IDENTIFIER,t.MEMBER_EXP];WB.assignmentOperators.forEach(i=>t.addBinaryOp(i,WB.assignmentPrecedence,!0)),t.hooks.add("gobble-token",function(n){let o=this.code;WB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===EM?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add("after-token",function(n){if(n.node){let o=this.code;WB.updateOperators.some(a=>a===o&&a===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===EM?"++":"--",argument:n.node,prefix:!1})}}),t.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(i){WB.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",A(i.left),A(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};Vc.plugins.register(ShA,WB);Vc.addUnaryOp("typeof");Vc.addUnaryOp("void");Vc.addLiteral("null",null);Vc.addLiteral("undefined",void 0);var RhA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),Eo={evalAst(t,e){switch(t.type){case"BinaryExpression":case"LogicalExpression":return Eo.evalBinaryExpression(t,e);case"Compound":return Eo.evalCompound(t,e);case"ConditionalExpression":return Eo.evalConditionalExpression(t,e);case"Identifier":return Eo.evalIdentifier(t,e);case"Literal":return Eo.evalLiteral(t,e);case"MemberExpression":return Eo.evalMemberExpression(t,e);case"UnaryExpression":return Eo.evalUnaryExpression(t,e);case"ArrayExpression":return Eo.evalArrayExpression(t,e);case"CallExpression":return Eo.evalCallExpression(t,e);case"AssignmentExpression":return Eo.evalAssignmentExpression(t,e);default:throw SyntaxError("Unexpected expression",t)}},evalBinaryExpression(t,e){return{"||":(i,n)=>i||n(),"&&":(i,n)=>i&&n(),"|":(i,n)=>i|n(),"^":(i,n)=>i^n(),"&":(i,n)=>i&n(),"==":(i,n)=>i==n(),"!=":(i,n)=>i!=n(),"===":(i,n)=>i===n(),"!==":(i,n)=>i!==n(),"<":(i,n)=>i":(i,n)=>i>n(),"<=":(i,n)=>i<=n(),">=":(i,n)=>i>=n(),"<<":(i,n)=>i<>":(i,n)=>i>>n(),">>>":(i,n)=>i>>>n(),"+":(i,n)=>i+n(),"-":(i,n)=>i-n(),"*":(i,n)=>i*n(),"/":(i,n)=>i/n(),"%":(i,n)=>i%n()}[t.operator](Eo.evalAst(t.left,e),()=>Eo.evalAst(t.right,e))},evalCompound(t,e){let A;for(let i=0;i-Eo.evalAst(i,e),"!":i=>!Eo.evalAst(i,e),"~":i=>~Eo.evalAst(i,e),"+":i=>+Eo.evalAst(i,e),typeof:i=>typeof Eo.evalAst(i,e),void:i=>{Eo.evalAst(i,e)}}[t.operator](t.argument)},evalArrayExpression(t,e){return t.elements.map(A=>Eo.evalAst(A,e))},evalCallExpression(t,e){let A=t.arguments.map(n=>Eo.evalAst(n,e)),i=Eo.evalAst(t.callee,e);if(i===Function)throw new Error("Function constructor is disabled");return i(...A)},evalAssignmentExpression(t,e){if(t.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=t.left.name,i=Eo.evalAst(t.right,e);return e[A]=i,e[A]}},fM=class{constructor(e){this.code=e,this.ast=Vc(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return Eo.evalAst(this.ast,A)}};function b2(t,e){return t=t.slice(),t.push(e),t}function mM(t,e){return e=e.slice(),e.unshift(t),e}var pM=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function On(t,e,A,i,n){if(!(this instanceof On))try{return new On(t,e,A,i,n)}catch(a){if(!a.avoidNew)throw a;return a.value}typeof t=="string"&&(n=i,i=A,A=e,e=t,t=null);let o=t&&typeof t=="object";if(t=t||{},this.json=t.json||A,this.path=t.path||e,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?"safe":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>"u"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){let a={path:o?t.path:e};o?"json"in t&&(a.json=t.json):a.json=A;let r=this.evaluate(a);if(!r||typeof r!="object")throw new pM(r);return r}}On.prototype.evaluate=function(t,e,A,i){let n=this.parent,o=this.parentProperty,{flatten:a,wrap:r}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,e=e||this.json,t=t||this.path,t&&typeof t=="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=t),a=Object.hasOwn(t,"flatten")?t.flatten:a,this.currResultType=Object.hasOwn(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,"sandbox")?t.sandbox:this.currSandbox,r=Object.hasOwn(t,"wrap")?t.wrap:r,this.currEval=Object.hasOwn(t,"eval")?t.eval:this.currEval,A=Object.hasOwn(t,"callback")?t.callback:A,this.currOtherTypeCallback=Object.hasOwn(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,"parent")?t.parent:n,o=Object.hasOwn(t,"parentProperty")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=On.toPathString(t)),!t&&t!==""||!e)return;let s=On.toPathArray(t);s[0]==="$"&&s.length>1&&s.shift(),this._hasParentSelector=null;let g=this._trace(s,e,["$"],n,o,A).filter(function(l){return l&&!l.isParentSelector});return g.length?!r&&g.length===1&&!g[0].hasArrExpr?this._getPreferredOutput(g[0]):g.reduce((l,C)=>{let I=this._getPreferredOutput(C);return a&&Array.isArray(I)?l=l.concat(I):l.push(I),l},[]):r?[]:void 0};On.prototype._getPreferredOutput=function(t){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(t.path)?t.path:On.toPathArray(t.path);return t.pointer=On.toPointer(A),t.path=typeof t.path=="string"?t.path:On.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[e];case"path":return On.toPathString(t[e]);case"pointer":return On.toPointer(t.path);default:throw new TypeError("Unknown result type")}};On.prototype._handleCallback=function(t,e,A){if(e){let i=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:On.toPathString(t.path),e(i,A,t)}};On.prototype._trace=function(t,e,A,i,n,o,a,r){let s;if(!t.length)return s={path:A,value:e,parent:i,parentProperty:n,hasArrExpr:a},this._handleCallback(s,o,"value"),s;let g=t[0],l=t.slice(1),C=[];function I(d){Array.isArray(d)?d.forEach(B=>{C.push(B)}):C.push(d)}if((typeof g!="string"||r)&&e&&Object.hasOwn(e,g))I(this._trace(l,e[g],b2(A,g),e,g,o,a));else if(g==="*")this._walk(e,d=>{I(this._trace(l,e[d],b2(A,d),e,d,o,!0,!0))});else if(g==="..")I(this._trace(l,e,A,i,n,o,a)),this._walk(e,d=>{typeof e[d]=="object"&&I(this._trace(t.slice(),e[d],b2(A,d),e,d,o,!0))});else{if(g==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:l,isParentSelector:!0};if(g==="~")return s={path:b2(A,g),value:n,parent:i,parentProperty:null},this._handleCallback(s,o,"property"),s;if(g==="$")I(this._trace(l,e,A,null,null,o,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(g))I(this._slice(g,l,e,A,i,n,o));else if(g.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let d=g.replace(/^\?\((.*?)\)$/u,"$1"),B=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(d);B?this._walk(e,Q=>{let E=[B[2]],f=B[1]?e[Q][B[1]]:e[Q];this._trace(E,f,A,i,n,o,!0).length>0&&I(this._trace(l,e[Q],b2(A,Q),e,Q,o,!0))}):this._walk(e,Q=>{this._eval(d,e[Q],Q,A,i,n)&&I(this._trace(l,e[Q],b2(A,Q),e,Q,o,!0))})}else if(g[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");I(this._trace(mM(this._eval(g,e,A.at(-1),A.slice(0,-1),i,n),l),e,A,i,n,o,a))}else if(g[0]==="@"){let d=!1,B=g.slice(1,-2);switch(B){case"scalar":(!e||!["object","function"].includes(typeof e))&&(d=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===B&&(d=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(d=!0);break;case"number":Number.isFinite(e)&&(d=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(d=!0);break;case"object":e&&typeof e===B&&(d=!0);break;case"array":Array.isArray(e)&&(d=!0);break;case"other":d=this.currOtherTypeCallback(e,A,i,n);break;case"null":e===null&&(d=!0);break;default:throw new TypeError("Unknown value type "+B)}if(d)return s={path:A,value:e,parent:i,parentProperty:n},this._handleCallback(s,o,"value"),s}else if(g[0]==="`"&&e&&Object.hasOwn(e,g.slice(1))){let d=g.slice(1);I(this._trace(l,e[d],b2(A,d),e,d,o,a,!0))}else if(g.includes(",")){let d=g.split(",");for(let B of d)I(this._trace(mM(B,l),e,A,i,n,o,!0))}else!r&&e&&Object.hasOwn(e,g)&&I(this._trace(l,e[g],b2(A,g),e,g,o,a,!0))}if(this._hasParentSelector)for(let d=0;d{e(A)})};On.prototype._slice=function(t,e,A,i,n,o,a){if(!Array.isArray(A))return;let r=A.length,s=t.split(":"),g=s[2]&&Number.parseInt(s[2])||1,l=s[0]&&Number.parseInt(s[0])||0,C=s[1]&&Number.parseInt(s[1])||r;l=l<0?Math.max(0,l+r):Math.min(r,l),C=C<0?Math.max(0,C+r):Math.min(r,C);let I=[];for(let d=l;d{I.push(Q)});return I};On.prototype._eval=function(t,e,A,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let a=t.includes("@path");a&&(this.currSandbox._$_path=On.toPathString(i.concat([A])));let r=this.currEval+"Script:"+t;if(!On.cache[r]){let s=t.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(a&&(s=s.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)On.cache[r]=new this.safeVm.Script(s);else if(this.currEval==="native")On.cache[r]=new this.vm.Script(s);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let g=this.currEval;On.cache[r]=new g(s)}else if(typeof this.currEval=="function")On.cache[r]={runInNewContext:g=>this.currEval(s,g)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return On.cache[r].runInNewContext(this.currSandbox)}catch(s){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+s.message+": "+t)}};On.cache={};On.toPathString=function(t){let e=t,A=e.length,i="$";for(let n=1;ntypeof e[g]=="function");let o=i.map(g=>e[g]);A=n.reduce((g,l)=>{let C=e[l].toString();return/function/u.test(C)||(C="function "+C),"var "+l+"="+C+";"+g},"")+A,!/(['"])use strict\1/u.test(A)&&!i.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let r=A.lastIndexOf(";"),s=r!==-1?A.slice(0,r+1)+" return "+A.slice(r+1):" return "+A;return new Function(...i,s)(...o)}};On.prototype.vm={Script:DM};var yM=[],Iz=[];(()=>{let t="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(t=Iz[i])e=i+1;else return!0;if(e==A)return!1}}function lz(t){return t>=127462&&t<=127487}var cz=8205;function dz(t,e,A=!0,i=!0){return(A?Bz:LhA)(t,e,i)}function Bz(t,e,A){if(e==t.length)return e;e&&Qz(t.charCodeAt(e))&&Ez(t.charCodeAt(e-1))&&e--;let i=wM(t,e);for(e+=Cz(i);e=0&&lz(wM(t,a));)o++,a-=2;if(o%2==0)break;e+=2}else break}return e}function LhA(t,e,A){for(;e>0;){let i=Bz(t,e-2,A);if(i=56320&&t<57344}function Ez(t){return t>=55296&&t<56320}function Cz(t){return t<65536?1:2}var Bn=class t{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,i){[e,A]=eQ(this,e,A);let n=[];return this.decompose(0,e,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(A,this.length,n,1),XB.from(n,this.length-(A-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=eQ(this,e,A);let i=[];return this.decompose(e,A,i,0),XB.from(i,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new I1(this),o=new I1(e);for(let a=A,r=A;;){if(n.next(a),o.next(a),a=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new I1(this,e)}iterRange(e,A=this.length){return new E8(this,e,A)}iterLines(e,A){let i;if(e==null)i=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new h8(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?t.empty:e.length<=32?new Qg(e):XB.from(Qg.split(e,[]))}},Qg=class t extends Bn{constructor(e,A=_hA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.text[o],r=n+a.length;if((A?i:r)>=e)return new MM(n,r,i,a);n=r+1,i++}}decompose(e,A,i,n){let o=e<=0&&A>=this.length?this:new t(hz(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let a=i.pop(),r=Q8(o.text,a.text.slice(),0,o.length);if(r.length<=32)i.push(new t(r,a.length+o.length));else{let s=r.length>>1;i.push(new t(r.slice(0,s)),new t(r.slice(s)))}}else i.push(o)}replace(e,A,i){if(!(i instanceof t))return super.replace(e,A,i);[e,A]=eQ(this,e,A);let n=Q8(this.text,Q8(i.text,hz(this.text,0,e)),A),o=this.length+i.length-(A-e);return n.length<=32?new t(n,o):XB.from(t.split(n,[]),o)}sliceString(e,A=this.length,i=` `){[e,A]=eQ(this,e,A);let n="";for(let o=0,a=0;o<=A&&ae&&a&&(n+=i),eo&&(n+=r.slice(Math.max(0,e-o),A-o)),o=s+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let i=[],n=-1;for(let o of e)i.push(o),n+=o.length+1,i.length==32&&(A.push(new t(i,n)),i=[],n=-1);return n>-1&&A.push(new t(i,n)),A}},XB=class t extends Bn{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,A,i,n){for(let o=0;;o++){let a=this.children[o],r=n+a.length,s=i+a.lines-1;if((A?s:r)>=e)return a.lineInner(e,A,i,n);n=r+1,i=s+1}}decompose(e,A,i,n){for(let o=0,a=0;a<=A&&o=a){let g=n&((a<=e?1:0)|(s>=A?2:0));a>=e&&s<=A&&!g?i.push(r):r.decompose(e-a,A-a,i,g)}a=s+1}}replace(e,A,i){if([e,A]=eQ(this,e,A),i.lines=o&&A<=r){let s=a.replace(e-o,A-o,i),g=this.lines-a.lines+s.lines;if(s.lines>4&&s.lines>g>>6){let l=this.children.slice();return l[n]=s,new t(l,this.length-(A-e)+i.length)}return super.replace(o,r,s)}o=r+1}return super.replace(e,A,i)}sliceString(e,A=this.length,i=` `){[e,A]=eQ(this,e,A);let n="";for(let o=0,a=0;oe&&o&&(n+=i),ea&&(n+=r.sliceString(e-a,A-a,i)),a=s+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof t))return 0;let i=0,[n,o,a,r]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==a||o==r)return i;let s=this.children[n],g=e.children[o];if(s!=g)return i+s.scanIdentical(g,A);i+=s.length+1}}static from(e,A=e.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let B of e)B.flatten(d);return new Qg(d,A)}let n=Math.max(32,i>>5),o=n<<1,a=n>>1,r=[],s=0,g=-1,l=[];function C(d){let B;if(d.lines>o&&d instanceof t)for(let Q of d.children)C(Q);else d.lines>a&&(s>a||!s)?(I(),r.push(d)):d instanceof Qg&&s&&(B=l[l.length-1])instanceof Qg&&d.lines+B.lines<=32?(s+=d.lines,g+=d.length+1,l[l.length-1]=new Qg(B.text.concat(d.text),B.length+1+d.length)):(s+d.lines>n&&I(),s+=d.lines,g+=d.length+1,l.push(d))}function I(){s!=0&&(r.push(l.length==1?l[0]:t.from(l,g)),g=-1,s=l.length=0)}for(let d of e)C(d);return I(),r.length==1?r[0]:new t(r,A)}};Bn.empty=new Qg([""],0);function _hA(t){let e=-1;for(let A of t)e+=A.length+1;return e}function Q8(t,e,A=0,i=1e9){for(let n=0,o=0,a=!0;o=A&&(s>i&&(r=r.slice(0,i-n)),n0?1:(e instanceof Qg?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],a=o>>1,r=n instanceof Qg?n.text.length:n.children.length;if(a==(A>0?r:0)){if(i==0)return this.done=!0,this.value="",this;A>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[i]+=A,e==0)return this.lineBreak=!0,this.value=` `,this;e--}else if(n instanceof Qg){let s=n.text[a+(A<0?-1:0)];if(this.offsets[i]+=A,s.length>Math.max(0,e))return this.value=e==0?s:A>0?s.slice(e):s.slice(0,s.length-e),this;e-=s.length}else{let s=n.children[a+(A<0?-1:0)];e>s.length?(e-=s.length,this.offsets[i]+=A):(A<0&&this.offsets[i]--,this.nodes.push(s),this.offsets.push(A>0?1:(s instanceof Qg?s.text.length:s.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},E8=class{constructor(e,A,i){this.value="",this.done=!1,this.cursor=new I1(e,A>i?-1:1),this.pos=A>i?e.length:0,this.from=Math.min(A,i),this.to=Math.max(A,i)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let i=A<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=i?n:A<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},h8=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:i,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(Bn.prototype[Symbol.iterator]=function(){return this.iter()},I1.prototype[Symbol.iterator]=E8.prototype[Symbol.iterator]=h8.prototype[Symbol.iterator]=function(){return this});var MM=class{constructor(e,A,i,n){this.from=e,this.to=A,this.number=i,this.text=n}get length(){return this.to-this.from}};function eQ(t,e,A){return e=Math.max(0,Math.min(t.length,e)),[e,Math.max(e,Math.min(t.length,A))]}function _a(t,e,A=!0,i=!0){return dz(t,e,A,i)}function GhA(t){return t>=56320&&t<57344}function KhA(t){return t>=55296&&t<56320}function Fr(t,e){let A=t.charCodeAt(e);if(!KhA(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return GhA(i)?(A-55296<<10)+(i-56320)+65536:A}function t3(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function Eg(t){return t<65536?1:2}var kM=/\r\n?|\n/,xr=(function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t})(xr||(xr={})),k2=class t{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=r}else{if(i!=xr.Simple&&g>=e&&(i==xr.TrackDel&&ne||i==xr.TrackBefore&&ne))return null;if(g>e||g==e&&A<0&&!r)return e==n||A<0?o:o+s;o+=s}n=g}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let i=0,n=0;i=0&&n<=A&&r>=e)return nA?"cover":!0;n=r}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new t(e)}static create(e){return new t(e)}},Rr=class t extends k2{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return SM(this,(A,i,n,o,a)=>e=e.replace(n,n+(i-A),a),!1),e}mapDesc(e,A=!1){return xM(this,e,A,!0)}invert(e){let A=this.sections.slice(),i=[];for(let n=0,o=0;n=0){A[n]=r,A[n+1]=a;let s=n>>1;for(;i.length0&&M2(i,A,o.text),o.forward(l),r+=l}let g=e[a++];for(;r>1].toJSON()))}return e}static of(e,A,i){let n=[],o=[],a=0,r=null;function s(l=!1){if(!l&&!n.length)return;aI||C<0||I>A)throw new RangeError(`Invalid change range ${C} to ${I} (in doc of length ${A})`);let B=d?typeof d=="string"?Bn.of(d.split(i||kM)):d:Bn.empty,Q=B.length;if(C==I&&Q==0)return;Ca&&es(n,C-a,-1),es(n,I-C,Q),M2(o,n,B),a=I}}return g(e),s(!r),r}static empty(e){return new t(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],i=[];for(let n=0;nr&&typeof a!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;i.length=0&&A<=0&&A==t[n+1]?t[n]+=e:n>=0&&e==0&&t[n]==0?t[n+1]+=A:i?(t[n]+=e,t[n+1]+=A):t.push(e,A)}function M2(t,e,A){if(A.length==0)return;let i=e.length-2>>1;if(i>1])),!(A||a==t.sections.length||t.sections[a+1]<0);)r=t.sections[a++],s=t.sections[a++];e(n,g,o,l,C),n=g,o=l}}}function xM(t,e,A,i=!1){let n=[],o=i?[]:null,a=new d1(t),r=new d1(e);for(let s=-1;;){if(a.done&&r.len||r.done&&a.len)throw new Error("Mismatched change set lengths");if(a.ins==-1&&r.ins==-1){let g=Math.min(a.len,r.len);es(n,g,-1),a.forward(g),r.forward(g)}else if(r.ins>=0&&(a.ins<0||s==a.i||a.off==0&&(r.len=0&&s=0){let g=0,l=a.len;for(;l;)if(r.ins==-1){let C=Math.min(l,r.len);g+=C,l-=C,r.forward(C)}else if(r.ins==0&&r.lens||a.ins>=0&&a.len>s)&&(r||i.length>g),o.forward2(s),a.forward(s)}}}}var d1=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?Bn.empty:e[A]}textBit(e){let{inserted:A}=this.set,i=this.i-2>>1;return i>=A.length&&!e?Bn.empty:A[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},ZB=class t{constructor(e,A,i){this.from=e,this.to=A,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,A):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(e,A=e,i=0){if(e<=this.anchor&&A>=this.anchor)return ce.range(e,A,void 0,void 0,i);let n=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return ce.range(this.anchor,n,void 0,void 0,i)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return ce.range(e.anchor,e.head)}static create(e,A,i){return new t(e,A,i)}},ce=class t{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:t.create(this.ranges.map(i=>i.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new t(e.ranges.map(A=>ZB.fromJSON(A)),e.main)}static single(e,A=e){return new t([t.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nn.from-o.from),A=e.indexOf(i);for(let n=1;no.head?t.range(s,r):t.range(r,s))}}return new t(e,A)}};function vz(t,e){for(let A of t.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var JM=0,qe=class t{constructor(e,A,i,n,o){this.combine=e,this.compareInput=A,this.compare=i,this.isStatic=n,this.id=JM++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new t(e.combine||(A=>A),e.compareInput||((A,i)=>A===i),e.compare||(e.combine?(A,i)=>A===i:YM),!!e.static,e.enables)}of(e){return new $B([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new $B(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new $B(e,this,2,A)}from(e,A){return A||(A=i=>i),this.compute([e],i=>A(i.field(e)))}};function YM(t,e){return t==e||t.length==e.length&&t.every((A,i)=>A===e[i])}var $B=class{constructor(e,A,i,n){this.dependencies=e,this.facet=A,this.type=i,this.value=n,this.id=JM++}dynamicSlot(e){var A;let i=this.value,n=this.facet.compareInput,o=this.id,a=e[o]>>1,r=this.type==2,s=!1,g=!1,l=[];for(let C of this.dependencies)C=="doc"?s=!0:C=="selection"?g=!0:(((A=e[C.id])!==null&&A!==void 0?A:1)&1)==0&&l.push(e[C.id]);return{create(C){return C.values[a]=i(C),1},update(C,I){if(s&&I.docChanged||g&&(I.docChanged||I.selection)||RM(C,l)){let d=i(C);if(r?!uz(d,C.values[a],n):!n(d,C.values[a]))return C.values[a]=d,1}return 0},reconfigure:(C,I)=>{let d,B=I.config.address[o];if(B!=null){let Q=m8(I,B);if(this.dependencies.every(E=>E instanceof qe?I.facet(E)===C.facet(E):E instanceof Qa?I.field(E,!1)==C.field(E,!1):!0)||(r?uz(d=i(C),Q,n):n(d=i(C),Q)))return C.values[a]=Q,0}else d=i(C);return C.values[a]=d,1}}}};function uz(t,e,A){if(t.length!=e.length)return!1;for(let i=0;it[s.id]),n=A.map(s=>s.type),o=i.filter(s=>!(s&1)),a=t[e.id]>>1;function r(s){let g=[];for(let l=0;li===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(I8).find(i=>i.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:i=>(i.values[A]=this.create(i),1),update:(i,n)=>{let o=i.values[A],a=this.updateF(o,n);return this.compareF(o,a)?0:(i.values[A]=a,1)},reconfigure:(i,n)=>{let o=i.facet(I8),a=n.facet(I8),r;return(r=o.find(s=>s.field==this))&&r!=a.find(s=>s.field==this)?(i.values[A]=r.create(i),1):n.config.address[this.id]!=null?(i.values[A]=n.field(this),0):(i.values[A]=this.create(i),1)}}}init(e){return[this,I8.of({field:this,create:e})]}get extension(){return this}},c1={lowest:4,low:3,default:2,high:1,highest:0};function Z4(t){return e=>new u8(e,t)}var zl={highest:Z4(c1.highest),high:Z4(c1.high),default:Z4(c1.default),low:Z4(c1.low),lowest:Z4(c1.lowest)},u8=class{constructor(e,A){this.inner=e,this.prec=A}},Zc=class t{of(e){return new $4(this,e)}reconfigure(e){return t.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},$4=class{constructor(e,A){this.compartment=e,this.inner=A}},f8=class t{constructor(e,A,i,n,o,a){for(this.base=e,this.compartments=A,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=a,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,i){let n=[],o=Object.create(null),a=new Map;for(let I of JhA(e,A,a))I instanceof Qa?n.push(I):(o[I.facet.id]||(o[I.facet.id]=[])).push(I);let r=Object.create(null),s=[],g=[];for(let I of n)r[I.id]=g.length<<1,g.push(d=>I.slot(d));let l=i?.config.facets;for(let I in o){let d=o[I],B=d[0].facet,Q=l&&l[I]||[];if(d.every(E=>E.type==0))if(r[B.id]=s.length<<1|1,YM(Q,d))s.push(i.facet(B));else{let E=B.combine(d.map(f=>f.value));s.push(i&&B.compare(E,i.facet(B))?i.facet(B):E)}else{for(let E of d)E.type==0?(r[E.id]=s.length<<1|1,s.push(E.value)):(r[E.id]=g.length<<1,g.push(f=>E.dynamicSlot(f)));r[B.id]=g.length<<1,g.push(E=>UhA(E,B,d))}}let C=g.map(I=>I(r));return new t(e,a,C,r,s,o)}};function JhA(t,e,A){let i=[[],[],[],[],[]],n=new Map;function o(a,r){let s=n.get(a);if(s!=null){if(s<=r)return;let g=i[s].indexOf(a);g>-1&&i[s].splice(g,1),a instanceof $4&&A.delete(a.compartment)}if(n.set(a,r),Array.isArray(a))for(let g of a)o(g,r);else if(a instanceof $4){if(A.has(a.compartment))throw new RangeError("Duplicate use of compartment in extensions");let g=e.get(a.compartment)||a.inner;A.set(a.compartment,g),o(g,r)}else if(a instanceof u8)o(a.inner,a.prec);else if(a instanceof Qa)i[r].push(a),a.provides&&o(a.provides,r);else if(a instanceof $B)i[r].push(a),a.facet.extensions&&o(a.facet.extensions,c1.default);else{let g=a.extension;if(!g)throw new Error(`Unrecognized extension value in extension set (${a}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(g,r)}}return o(t,c1.default),i.reduce((a,r)=>a.concat(r))}function X4(t,e){if(e&1)return 2;let A=e>>1,i=t.status[A];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;t.status[A]=4;let n=t.computeSlot(t,t.config.dynamicSlots[A]);return t.status[A]=2|n}function m8(t,e){return e&1?t.config.staticValues[e>>1]:t.values[e>>1]}var fz=qe.define(),vM=qe.define({combine:t=>t.some(e=>e),static:!0}),bz=qe.define({combine:t=>t.length?t[0]:void 0,static:!0}),Mz=qe.define(),kz=qe.define(),Sz=qe.define(),mz=qe.define({combine:t=>t.length?t[0]:!1}),Os=class{constructor(e,A){this.type=e,this.value=A}static define(){return new NM}},NM=class{of(e){return new Os(this,e)}},FM=class{constructor(e){this.map=e}of(e){return new Ui(this,e)}},Ui=(()=>{class t{constructor(A,i){this.type=A,this.value=i}map(A){let i=this.type.map(this.value,A);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(A){return this.type==A}static define(A={}){return new FM(A.map||(i=>i))}static mapEffects(A,i){if(!A.length)return A;let n=[];for(let o of A){let a=o.map(i);a&&n.push(a)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),Wc=(()=>{class t{constructor(A,i,n,o,a,r){this.startState=A,this.changes=i,this.selection=n,this.effects=o,this.annotations=a,this.scrollIntoView=r,this._doc=null,this._state=null,n&&vz(n,i.newLength),a.some(s=>s.type==t.time)||(this.annotations=a.concat(t.time.of(Date.now())))}static create(A,i,n,o,a,r){return new t(A,i,n,o,a,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let i of this.annotations)if(i.type==A)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let i=this.annotation(t.userEvent);return!!(i&&(i==A||i.length>A.length&&i.slice(0,A.length)==A&&i[A.length]=="."))}}return t.time=Os.define(),t.userEvent=Os.define(),t.addToHistory=Os.define(),t.remote=Os.define(),t})();function YhA(t,e){let A=[];for(let i=0,n=0;;){let o,a;if(i=t[i]))o=t[i++],a=t[i++];else if(n=0;n--){let o=i[n](t);o instanceof Wc?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof Wc?t=o[0]:t=Rz(e,AQ(o),!1)}return t}function ThA(t){let e=t.startState,A=e.facet(Sz),i=t;for(let n=A.length-1;n>=0;n--){let o=A[n](t);o&&Object.keys(o).length&&(i=xz(i,LM(e,o,t.changes.newLength),!0))}return i==t?t:Wc.create(e,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var OhA=[];function AQ(t){return t==null?OhA:Array.isArray(t)?t:[t]}var yo=(function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t})(yo||(yo={})),zhA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,_M;try{_M=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function PhA(t){if(_M)return _M.test(t);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||zhA.test(A)))return!0}return!1}function jhA(t){return e=>{if(!/\S/.test(e))return yo.Space;if(PhA(e))return yo.Word;for(let A=0;A-1)return yo.Word;return yo.Other}}var Ga=(()=>{class t{constructor(A,i,n,o,a,r){this.config=A,this.doc=i,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=a,r&&(r._state=this);for(let s=0;so.set(l,g)),i=null),o.set(s.value.compartment,s.value.extension)):s.is(Ui.reconfigure)?(i=null,n=s.value):s.is(Ui.appendConfig)&&(i=null,n=AQ(n).concat(s.value));let a;i?a=A.startState.values.slice():(i=f8.resolve(n,o,this),a=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(g,l)=>l.reconfigure(g,this),null).values);let r=A.startState.facet(vM)?A.newSelection:A.newSelection.asSingle();new t(i,A.newDoc,r,a,(s,g)=>g.update(s,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:A},range:ce.cursor(i.from+A.length)}))}changeByRange(A){let i=this.selection,n=A(i.ranges[0]),o=this.changes(n.changes),a=[n.range],r=AQ(n.effects);for(let s=1;sr.spec.fromJSON(s,g)))}}return t.create({doc:A.doc,selection:ce.fromJSON(A.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(A={}){let i=f8.resolve(A.extensions||[],new Map),n=A.doc instanceof Bn?A.doc:Bn.of((A.doc||"").split(i.staticFacet(t.lineSeparator)||kM)),o=A.selection?A.selection instanceof ce?A.selection:ce.single(A.selection.anchor,A.selection.head):ce.single(0);return vz(o,n.length),i.staticFacet(vM)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(a,r)=>r.create(a),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||` `}get readOnly(){return this.facet(mz)}phrase(A,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return i.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let a=+(o||1);return!a||a>i.length?n:i[a-1]})),A}languageDataAt(A,i,n=-1){let o=[];for(let a of this.facet(fz))for(let r of a(this,i,n))Object.prototype.hasOwnProperty.call(r,A)&&o.push(r[A]);return o}charCategorizer(A){let i=this.languageDataAt("wordChars",A);return jhA(i.length?i[0]:"")}wordAt(A){let{text:i,from:n,length:o}=this.doc.lineAt(A),a=this.charCategorizer(A),r=A-n,s=A-n;for(;r>0;){let g=_a(i,r,!1);if(a(i.slice(g,r))!=yo.Word)break;r=g}for(;se.length?e[0]:4}),t.lineSeparator=bz,t.readOnly=mz,t.phrases=qe.define({compare(e,A){let i=Object.keys(e),n=Object.keys(A);return i.length==n.length&&i.every(o=>e[o]==A[o])}}),t.languageData=fz,t.changeFilter=Mz,t.transactionFilter=kz,t.transactionExtender=Sz,t})();Zc.reconfigure=Ui.define();function Ir(t,e,A={}){let i={};for(let n of t)for(let o of Object.keys(n)){let a=n[o],r=i[o];if(r===void 0)i[o]=a;else if(!(r===a||a===void 0))if(Object.hasOwnProperty.call(A,o))i[o]=A[o](r,a);else throw new Error("Config merge conflict for field "+o)}for(let n in e)i[n]===void 0&&(i[n]=e[n]);return i}var Zg=class{eq(e){return this==e}range(e,A=e){return A3.create(e,A,this)}};Zg.prototype.startSide=Zg.prototype.endSide=0;Zg.prototype.point=!1;Zg.prototype.mapMode=xr.TrackDel;function HM(t,e){return t==e||t.constructor==e.constructor&&t.eq(e)}var A3=class t{constructor(e,A,i){this.from=e,this.to=A,this.value=i}static create(e,A,i){return new t(e,A,i)}};function GM(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}var KM=class t{constructor(e,A,i,n){this.from=e,this.to=A,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,i,n=0){let o=i?this.to:this.from;for(let a=n,r=o.length;;){if(a==r)return a;let s=a+r>>1,g=o[s]-e||(i?this.value[s].endSide:this.value[s].startSide)-A;if(s==a)return g>=0?a:r;g>=0?r=s:a=s+1}}between(e,A,i,n){for(let o=this.findIndex(A,-1e9,!0),a=this.findIndex(i,1e9,!1,o);od||I==d&&g.startSide>0&&g.endSide<=0)continue;(d-I||g.endSide-g.startSide)<0||(a<0&&(a=I),g.point&&(r=Math.max(r,d-I)),i.push(g),n.push(I-a),o.push(d-a))}return{mapped:i.length?new t(n,o,i,r):null,pos:a}}},zn=(()=>{class t{constructor(A,i,n,o){this.chunkPos=A,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(A,i,n,o){return new t(A,i,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let i of this.chunk)A+=i.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:a=this.length}=A,r=A.filter;if(i.length==0&&!r)return this;if(n&&(i=i.slice().sort(GM)),this.isEmpty)return i.length?t.of(i):this;let s=new p8(this,null,-1).goto(0),g=0,l=[],C=new Nr;for(;s.value||g=0){let I=i[g++];C.addInner(I.from,I.to,I.value)||l.push(I)}else s.rangeIndex==1&&s.chunkIndexthis.chunkEnd(s.chunkIndex)||as.to||a=a&&A<=a+r.length&&r.between(a,A-a,i-a,n)===!1)return}this.nextLayer.between(A,i,n)}}iter(A=0){return e3.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,i=0){return e3.from(A).goto(i)}static compare(A,i,n,o,a=-1){let r=A.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),s=i.filter(I=>I.maxPoint>0||!I.isEmpty&&I.maxPoint>=a),g=pz(r,s,n),l=new C1(r,g,a),C=new C1(s,g,a);n.iterGaps((I,d,B)=>Dz(l,I,C,d,B,o)),n.empty&&n.length==0&&Dz(l,0,C,0,0,o)}static eq(A,i,n=0,o){o==null&&(o=999999999);let a=A.filter(C=>!C.isEmpty&&i.indexOf(C)<0),r=i.filter(C=>!C.isEmpty&&A.indexOf(C)<0);if(a.length!=r.length)return!1;if(!a.length)return!0;let s=pz(a,r),g=new C1(a,s,0).goto(n),l=new C1(r,s,0).goto(n);for(;;){if(g.to!=l.to||!UM(g.active,l.active)||g.point&&(!l.point||!HM(g.point,l.point)))return!1;if(g.to>o)return!0;g.next(),l.next()}}static spans(A,i,n,o,a=-1){let r=new C1(A,null,a).goto(i),s=i,g=r.openStart;for(;;){let l=Math.min(r.to,n);if(r.point){let C=r.activeForPoint(r.to),I=r.pointFroms&&(o.span(s,l,r.active,g),g=r.openEnd(l));if(r.to>n)return g+(r.point&&r.to>n?1:0);s=r.to,r.next()}}static of(A,i=!1){let n=new Nr;for(let o of A instanceof A3?[A]:i?qhA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return t.empty;let i=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function qhA(t){if(t.length>1)for(let e=t[0],A=1;A0)return t.slice().sort(GM);e=i}return t}zn.empty.nextLayer=zn.empty;var Nr=class t{finishChunk(e){this.chunks.push(new KM(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,i){this.addInner(e,A,i)||(this.nextLayer||(this.nextLayer=new t)).add(e,A,i)}addInner(e,A,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=A,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let i=A.value.length-1;return this.last=A.value[i],this.lastFrom=A.from[i]+e,this.lastTo=A.to[i]+e,!0}finish(){return this.finishInner(zn.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=zn.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function pz(t,e,A){let i=new Map;for(let o of t)for(let a=0;a=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new p8(a,A,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let i of this.heap)i.goto(e,A);for(let i=this.heap.length>>1;i>=0;i--)bM(this.heap,i);return this.next(),this}forward(e,A){for(let i of this.heap)i.forward(e,A);for(let i=this.heap.length>>1;i>=0;i--)bM(this.heap,i);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),bM(this.heap,0)}}};function bM(t,e){for(let A=t[e];;){let i=(e<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1=0&&(n=t[i+1],i++),A.compare(n)<0)break;t[i]=A,t[e]=n,e=i}}var C1=class{constructor(e,A,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=e3.from(e,A,i)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){d8(this.active,e),d8(this.activeTo,e),d8(this.activeRank,e),this.minActive=wz(this.active,this.activeTo)}addActive(e){let A=0,{value:i,to:n,rank:o}=this.cursor;for(;A0;)A++;B8(this.active,A,i),B8(this.activeTo,A,n),B8(this.activeRank,A,o),e&&B8(e,A,this.cursor.from),this.minActive=wz(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&d8(i,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&A.push(this.active[i]);return A.reverse()}openEnd(e){let A=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)A++;return A}};function Dz(t,e,A,i,n,o){t.goto(e),A.goto(i);let a=i+n,r=i,s=i-e,g=!!o.boundChange;for(let l=!1;;){let C=t.to+s-A.to,I=C||t.endSide-A.endSide,d=I<0?t.to+s:A.to,B=Math.min(d,a);if(t.point||A.point?(t.point&&A.point&&HM(t.point,A.point)&&UM(t.activeForPoint(t.to),A.activeForPoint(A.to))||o.comparePoint(r,B,t.point,A.point),l=!1):(l&&o.boundChange(r),B>r&&!UM(t.active,A.active)&&o.compareRange(r,B,t.active,A.active),g&&Ba)break;r=d,I<=0&&t.next(),I>=0&&A.next()}}function UM(t,e){if(t.length!=e.length)return!1;for(let A=0;A=e;i--)t[i+1]=t[i];t[e]=A}function wz(t,e){let A=-1,i=1e9;for(let n=0;n=e)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?A-o%A:1,n=_a(t,n)}return i===!0?-1:t.length}var Nz=typeof Symbol>"u"?"__\u037C":Symbol.for("\u037C"),TM=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Fz=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Xg=class{constructor(e,A){this.rules=[];let{finish:i}=A||{};function n(a){return/^@/.test(a)?[a]:a.split(/,\s*/)}function o(a,r,s,g){let l=[],C=/^@(\w+)\b/.exec(a[0]),I=C&&C[1]=="keyframes";if(C&&r==null)return s.push(a[0]+";");for(let d in r){let B=r[d];if(/&/.test(d))o(d.split(/,\s*/).map(Q=>a.map(E=>Q.replace(/&/,E))).reduce((Q,E)=>Q.concat(E)),B,s);else if(B&&typeof B=="object"){if(!C)throw new RangeError("The value of a property ("+d+") should be a primitive value.");o(n(d),B,l,I)}else B!=null&&l.push(d.replace(/_.*/,"").replace(/[A-Z]/g,Q=>"-"+Q.toLowerCase())+": "+B+";")}(l.length||I)&&s.push((i&&!C&&!g?a.map(i):a).join(", ")+" {"+l.join(" ")+"}")}for(let a in e)o(n(a),e[a],this.rules)}getRules(){return this.rules.join(` `)}static newName(){let e=Fz[Nz]||1;return Fz[Nz]=e+1,"\u037C"+e.toString(36)}static mount(e,A,i){let n=e[TM],o=i&&i.nonce;n?o&&n.setNonce(o):n=new OM(e,o),n.mount(Array.isArray(A)?A:[A],e)}},Lz=new Map,OM=class{constructor(e,A){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=Lz.get(i);if(o)return e[TM]=o;this.sheet=new n.CSSStyleSheet,Lz.set(i,this)}else this.styleTag=i.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[TM]=this}mount(e,A){let i=this.sheet,n=0,o=0;for(let a=0;a-1&&(this.modules.splice(s,1),o--,s=-1),s==-1){if(this.modules.splice(o++,0,r),i)for(let g=0;g",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},VhA=typeof navigator<"u"&&/Mac/.test(navigator.platform),WhA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(Oa=0;Oa<10;Oa++)V0[48+Oa]=V0[96+Oa]=String(Oa);var Oa;for(Oa=1;Oa<=24;Oa++)V0[Oa+111]="F"+Oa;var Oa;for(Oa=65;Oa<=90;Oa++)V0[Oa]=String.fromCharCode(Oa+32),tQ[Oa]=String.fromCharCode(Oa);var Oa;for(w8 in V0)tQ.hasOwnProperty(w8)||(tQ[w8]=V0[w8]);var w8;function _z(t){var e=VhA&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||WhA&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",A=!e&&t.key||(t.shiftKey?tQ:V0)[t.keyCode]||t.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function Pn(){var t=arguments[0];typeof t=="string"&&(t=document.createElement(t));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var i in A)if(Object.prototype.hasOwnProperty.call(A,i)){var n=A[i];typeof n=="string"?t.setAttribute(i,n):n!=null&&(t[i]=n)}e++}for(;e2),ot={mac:Jz||/Mac/.test(us.platform),windows:/Win/.test(us.platform),linux:/Linux|X11/.test(us.platform),ie:i5,ie_version:yP?tk.documentMode||6:nk?+nk[1]:ik?+ik[1]:0,gecko:Kz,gecko_version:Kz?+(/Firefox\/(\d+)/.exec(us.userAgent)||[0,0])[1]:0,chrome:!!zM,chrome_version:zM?+zM[1]:0,ios:Jz,android:/Android\b/.test(us.userAgent),webkit:Uz,webkit_version:Uz?+(/\bAppleWebKit\/(\d+)/.exec(us.userAgent)||[0,0])[1]:0,safari:ok,safari_version:ok?+(/\bVersion\/(\d+(\.\d+)?)/.exec(us.userAgent)||[0,0])[1]:0,tabSize:tk.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function Wk(t,e){for(let A in t)A=="class"&&e.class?e.class+=" "+t.class:A=="style"&&e.style?e.style+=";"+t.style:e[A]=t[A];return e}var U8=Object.create(null);function Zk(t,e,A){if(t==e)return!0;t||(t=U8),e||(e=U8);let i=Object.keys(t),n=Object.keys(e);if(i.length-(A&&i.indexOf(A)>-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of i)if(o!=A&&(n.indexOf(o)==-1||t[o]!==e[o]))return!1;return!0}function ZhA(t,e){for(let A=t.attributes.length-1;A>=0;A--){let i=t.attributes[A].name;e[i]==null&&t.removeAttribute(i)}for(let A in e){let i=e[A];A=="style"?t.style.cssText=i:t.getAttribute(A)!=i&&t.setAttribute(A,i)}}function Yz(t,e,A){let i=!1;if(e)for(let n in e)A&&n in A||(i=!0,n=="style"?t.style.cssText="":t.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(i=!0,n=="style"?t.style.cssText=A[n]:t.setAttribute(n,A[n]));return i}function XhA(t){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new h1(e,A,A,i,e.widget||null,!1)}static replace(e){let A=!!e.block,i,n;if(e.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:a}=vP(e,A);i=(o?A?-3e8:-1:5e8)-1,n=(a?A?2e8:1:-6e8)+1}return new h1(e,i,n,A,e.widget||null,!0)}static line(e){return new Q3(e)}static set(e,A=!1){return zn.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};vt.none=zn.empty;var B3=class t extends vt{constructor(e){let{start:A,end:i}=vP(e);super(A?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?Wk(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||U8}eq(e){return this==e||e instanceof t&&this.tagName==e.tagName&&Zk(this.attrs,e.attrs)}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};B3.prototype.point=!1;var Q3=class t extends vt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof t&&this.spec.class==e.spec.class&&Zk(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};Q3.prototype.mapMode=xr.TrackBefore;Q3.prototype.point=!0;var h1=class t extends vt{constructor(e,A,i,n,o,a){super(A,i,o,e),this.block=n,this.isReplace=a,this.mapMode=n?A<=0?xr.TrackBefore:xr.TrackAfter:xr.TrackDel}get type(){return this.startSide!=this.endSide?Lr.WidgetRange:this.startSide<=0?Lr.WidgetBefore:Lr.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof t&&$hA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};h1.prototype.point=!0;function vP(t,e=!1){let{inclusiveStart:A,inclusiveEnd:i}=t;return A==null&&(A=t.inclusive),i==null&&(i=t.inclusive),{start:A??e,end:i??e}}function $hA(t,e){return t==e||!!(t&&e&&t.compare(e))}function sQ(t,e,A,i=0){let n=A.length-1;n>=0&&A[n]+i>=t?A[n]=Math.max(A[n],e):A.push(t,e)}var J8=class t extends Zg{constructor(e,A){super(),this.tagName=e,this.attributes=A}eq(e){return e==this||e instanceof t&&this.tagName==e.tagName&&Zk(this.attributes,e.attributes)}static create(e){return new t(e.tagName,e.attributes||U8)}static set(e,A=!1){return zn.of(e,A)}};J8.prototype.startSide=J8.prototype.endSide=-1;function E3(t){let e;return t.nodeType==11?e=t.getSelection?t:t.ownerDocument:e=t,e.getSelection()}function ak(t,e){return e?t==e||t.contains(e.nodeType!=1?e.parentNode:e):!1}function a3(t,e){if(!e.anchorNode)return!1;try{return ak(t,e.anchorNode)}catch(A){return!1}}function F8(t){return t.nodeType==3?h3(t,0,t.nodeValue.length).getClientRects():t.nodeType==1?t.getClientRects():[]}function r3(t,e,A,i){return A?Hz(t,e,A,i,-1)||Hz(t,e,A,i,1):!1}function R2(t){for(var e=0;;e++)if(t=t.previousSibling,!t)return e}function Y8(t){return t.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}function Hz(t,e,A,i,n){for(;;){if(t==A&&e==i)return!0;if(e==(n<0?0:X0(t))){if(t.nodeName=="DIV")return!1;let o=t.parentNode;if(!o||o.nodeType!=1)return!1;e=R2(t)+(n<0?0:1),t=o}else if(t.nodeType==1){if(t=t.childNodes[e+(n<0?-1:0)],t.nodeType==1&&t.contentEditable=="false")return!1;e=n<0?X0(t):0}else return!1}}function X0(t){return t.nodeType==3?t.nodeValue.length:t.childNodes.length}function H8(t,e){let A=e?t.left:t.right;return{left:A,right:A,top:t.top,bottom:t.bottom}}function A4A(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function bP(t,e){let A=e.width/t.offsetWidth,i=e.height/t.offsetHeight;return(A>.995&&A<1.005||!isFinite(A)||Math.abs(e.width-t.offsetWidth)<1)&&(A=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-t.offsetHeight)<1)&&(i=1),{scaleX:A,scaleY:i}}function e4A(t,e,A,i,n,o,a,r){let s=t.ownerDocument,g=s.defaultView||window;for(let l=t,C=!1;l&&!C;)if(l.nodeType==1){let I,d=l==s.body,B=1,Q=1;if(d)I=A4A(g);else{if(/^(fixed|sticky)$/.test(getComputedStyle(l).position)&&(C=!0),l.scrollHeight<=l.clientHeight&&l.scrollWidth<=l.clientWidth){l=l.assignedSlot||l.parentNode;continue}let b=l.getBoundingClientRect();({scaleX:B,scaleY:Q}=bP(l,b)),I={left:b.left,right:b.left+l.clientWidth*B,top:b.top,bottom:b.top+l.clientHeight*Q}}let E=0,f=0;if(n=="nearest")e.top0&&e.bottom>I.bottom+f&&(f=e.bottom-I.bottom+a)):e.bottom>I.bottom&&(f=e.bottom-I.bottom+a,A<0&&e.top-f0&&e.right>I.right+E&&(E=e.right-I.right+o)):e.right>I.right&&(E=e.right-I.right+o,A<0&&e.leftI.bottom||e.leftI.right)&&(e={left:Math.max(e.left,I.left),right:Math.min(e.right,I.right),top:Math.max(e.top,I.top),bottom:Math.min(e.bottom,I.bottom)}),l=l.assignedSlot||l.parentNode}else if(l.nodeType==11)l=l.host;else break}function MP(t,e=!0){let A=t.ownerDocument,i=null,n=null;for(let o=t.parentNode;o&&!(o==A.body||(!e||i)&&n);)if(o.nodeType==1)!n&&o.scrollHeight>o.clientHeight&&(n=o),e&&!i&&o.scrollWidth>o.clientWidth&&(i=o),o=o.assignedSlot||o.parentNode;else if(o.nodeType==11)o=o.host;else break;return{x:i,y:n}}var rk=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:i}=e;this.set(A,Math.min(e.anchorOffset,A?X0(A):0),i,Math.min(e.focusOffset,i?X0(i):0))}set(e,A,i,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=i,this.focusOffset=n}},B1=null;ot.safari&&ot.safari_version>=26&&(B1=!1);function kP(t){if(t.setActive)return t.setActive();if(B1)return t.focus(B1);let e=[];for(let A=t;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(t.focus(B1==null?{get preventScroll(){return B1={preventScroll:!0},!0}}:void 0),!B1){B1=!1;for(let A=0;AMath.max(0,t.document.documentElement.scrollHeight-t.innerHeight-4):t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}function xP(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i>0)return{node:A,offset:i};if(A.nodeType==1&&i>0){if(A.contentEditable=="false")return null;A=A.childNodes[i-1],i=X0(A)}else if(A.parentNode&&!Y8(A))i=R2(A),A=A.parentNode;else return null}}function RP(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i=A){if(r.level==i)return a;(o<0||(n!=0?n<0?r.fromA:e[o].level>r.level))&&(o=a)}}if(o<0)throw new RangeError("Index out of range");return o}};function LP(t,e){if(t.length!=e.length)return!1;for(let A=0;A=0;Q-=3)if(Xc[Q+1]==-d){let E=Xc[Q+2],f=E&2?n:E&4?E&1?o:n:0;f&&(_o[C]=_o[Xc[Q]]=f),r=Q;break}}else{if(Xc.length==189)break;Xc[r++]=C,Xc[r++]=I,Xc[r++]=s}else if((B=_o[C])==2||B==1){let Q=B==n;s=Q?0:1;for(let E=r-3;E>=0;E-=3){let f=Xc[E+2];if(f&2)break;if(Q)Xc[E+2]|=2;else{if(f&4)break;Xc[E+2]|=4}}}}}function g4A(t,e,A,i){for(let n=0,o=i;n<=A.length;n++){let a=n?A[n-1].to:t,r=ns;)B==E&&(B=A[--Q].from,E=Q?A[Q-1].to:t),_o[--B]=d;s=l}else o=g,s++}}}function gk(t,e,A,i,n,o,a){let r=i%2?2:1;if(i%2==n%2)for(let s=e,g=0;ss&&a.push(new el(s,Q.from,d));let E=Q.direction==u1!=!(d%2);lk(t,E?i+1:i,n,Q.inner,Q.from,Q.to,a),s=Q.to}B=Q.to}else{if(B==A||(l?_o[B]!=r:_o[B]==r))break;B++}I?gk(t,s,B,i+1,n,I,a):se;){let l=!0,C=!1;if(!g||s>o[g-1].to){let Q=_o[s-1];Q!=r&&(l=!1,C=Q==16)}let I=!l&&r==1?[]:null,d=l?i:i+1,B=s;A:for(;;)if(g&&B==o[g-1].to){if(C)break A;let Q=o[--g];if(!l)for(let E=Q.from,f=g;;){if(E==e)break A;if(f&&o[f-1].to==E)E=o[--f].from;else{if(_o[E-1]==r)break A;break}}if(I)I.push(Q);else{Q.to_o.length;)_o[_o.length]=256;let i=[],n=e==u1?0:1;return lk(t,n,n,A,0,t.length,i),i}function _P(t){return[new el(0,t,0)]}var GP="";function c4A(t,e,A,i,n){var o;let a=i.head-t.from,r=el.find(e,a,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),s=e[r],g=s.side(n,A);if(a==g){let I=r+=n?1:-1;if(I<0||I>=e.length)return null;s=e[r=I],a=s.side(!n,A),g=s.side(n,A)}let l=_a(t.text,a,s.forward(n,A));(ls.to)&&(l=g),GP=t.text.slice(Math.min(a,l),Math.max(a,l));let C=r==(n?e.length-1:0)?null:e[r+(n?1:-1)];return C&&l==g&&C.level+(n?0:1)t.some(e=>e)}),OP=qe.define({combine:t=>t.some(e=>e)}),zP=qe.define(),s3=class t{constructor(e,A="nearest",i="nearest",n=5,o=5,a=!1){this.range=e,this.y=A,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=a}map(e){return e.empty?this:new t(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new t(ce.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},y8=Ui.define({map:(t,e)=>t.map(e)}),PP=Ui.define();function dr(t,e,A){let i=t.facet(YP);i.length?i[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var W0=qe.define({combine:t=>t.length?t[0]:!0}),I4A=0,nQ=qe.define({combine(t){return t.filter((e,A)=>{for(let i=0;i{let s=[];return a&&s.push(n5.of(g=>{let l=g.plugin(r);return l?a(l):vt.none})),o&&s.push(o(r)),s})}static fromClass(e,A){return t.define((i,n)=>new e(i,n),A)}},g3=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(i){if(dr(A.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(n){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){dr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(i){dr(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},zz=qe.define(),ck=qe.define(),n5=qe.define(),jP=qe.define(),eS=qe.define(),u3=qe.define(),qP=qe.define();function Pz(t,e){let A=t.state.facet(qP);if(!A.length)return A;let i=A.map(o=>o instanceof Function?o(t):o),n=[];return zn.spans(i,e.from,e.to,{point(){},span(o,a,r,s){let g=o-e.from,l=a-e.from,C=n;for(let I=r.length-1;I>=0;I--,s--){let d=r[I].spec.bidiIsolate,B;if(d==null&&(d=C4A(e.text,g,l)),s>0&&C.length&&(B=C[C.length-1]).to==g&&B.direction==d)B.to=l,C=B.inner;else{let Q={from:g,to:l,direction:d,inner:[]};C.push(Q),C=Q.inner}}}}),n}var VP=qe.define();function tS(t){let e=0,A=0,i=0,n=0;for(let o of t.state.facet(VP)){let a=o(t);a&&(a.left!=null&&(e=Math.max(e,a.left)),a.right!=null&&(A=Math.max(A,a.right)),a.top!=null&&(i=Math.max(i,a.top)),a.bottom!=null&&(n=Math.max(n,a.bottom)))}return{left:e,right:A,top:i,bottom:n}}var i3=qe.define(),jl=class t{constructor(e,A,i,n){this.fromA=e,this.toA=A,this.fromB=i,this.toB=n}join(e){return new t(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,i=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>i.toA)){if(n.toAn.push(new jl(o,a,r,s))),this.changedRanges=n}static create(e,A,i){return new t(e,A,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},d4A=[],sa=class{constructor(e,A,i=0){this.dom=e,this.length=A,this.flags=i,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return d4A}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let A=this.domAttrs;A&&ZhA(this.dom,A)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,A=this.posAtStart){let i=A;for(let n of this.children){if(n==e)return i;i+=n.length+n.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,A){return null}domPosFor(e,A){let i=R2(this.dom),n=this.length?e>0:A>0;return new $c(this.parent.dom,i+(n?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof cQ)return e;return null}static get(e){return e.cmTile}},lQ=class extends sa{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let A=this.dom,i=null,n,o=e?.node==A?e:null,a=0;for(let r of this.children){if(r.sync(e),a+=r.length+r.breakAfter,n=i?i.nextSibling:A.firstChild,o&&n!=r.dom&&(o.written=!0),r.dom.parentNode==A)for(;n&&n!=r.dom;)n=jz(n);else A.insertBefore(r.dom,n);i=r.dom}for(n=i?i.nextSibling:A.firstChild,o&&n&&(o.written=!0);n;)n=jz(n);this.length=a}};function jz(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}var cQ=class extends lQ{constructor(e,A){super(A),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let A=sa.get(e);if(A&&this.owns(A))return A;e=e.parentNode}}blockTiles(e){for(let A=[],i=this,n=0,o=0;;)if(n==i.children.length){if(!A.length)return;i=i.parent,i.breakAfter&&o++,n=A.pop()}else{let a=i.children[n++];if(a instanceof Z0)A.push(n),i=a,n=0;else{let r=o+a.length,s=e(a,o);if(s!==void 0)return s;o=r+a.breakAfter}}}resolveBlock(e,A){let i,n=-1,o,a=-1;if(this.blockTiles((r,s)=>{let g=s+r.length;if(e>=s&&e<=g){if(r.isWidget()&&A>=-1&&A<=1){if(r.flags&32)return!0;r.flags&16&&(i=void 0)}(se||e==s&&(A>1?r.length:r.covers(-1)))&&(!o||!r.isWidget()&&o.isWidget())&&(o=r,a=e-s)}}),!i&&!o)throw new Error("No tile at position "+e);return i&&A<0||!o?{tile:i,offset:n}:{tile:o,offset:a}}},Z0=class t extends lQ{constructor(e,A){super(e),this.wrapper=A}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,A){let i=new t(A||document.createElement(e.tagName),e);return A||(i.flags|=4),i}},CQ=class t extends lQ{constructor(e,A){super(e),this.attrs=A}isLine(){return!0}static start(e,A,i){let n=new t(A||document.createElement("div"),e);return(!A||!i)&&(n.flags|=4),n}get domAttrs(){return this.attrs}resolveInline(e,A,i){let n=null,o=-1,a=null,r=-1;function s(l,C){for(let I=0,d=0;I=C&&(B.isComposite()?s(B,C-d):(!a||a.isHidden&&(A>0||i&&Q4A(a,B)))&&(Q>C||B.flags&32)?(a=B,r=C-d):(di&&(e=i);let n=e,o=e,a=0;e==0&&A<0||e==i&&A>=0?ot.chrome||ot.gecko||(e?(n--,a=1):o=0)?0:r.length-1];return ot.safari&&!a&&s.width==0&&(s=Array.prototype.find.call(r,g=>g.width)||s),a?H8(s,a<0):s||null}static of(e,A){let i=new t(A||document.createTextNode(e),e);return A||(i.flags|=2),i}},f1=class t extends sa{constructor(e,A,i,n){super(e,A,n),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,A){return this.coordsInWidget(e,A,!1)}coordsInWidget(e,A,i){let n=this.widget.coordsAt(this.dom,e,A);if(n)return n;if(i)return H8(this.dom.getBoundingClientRect(),this.length?e==0:A<=0);{let o=this.dom.getClientRects(),a=null;if(!o.length)return null;let r=this.flags&16?!0:this.flags&32?!1:e>0;for(let s=r?o.length-1:0;a=o[s],!(e>0?s==0:s==o.length-1||a.top0;)if(n.isComposite())if(a){if(!e)break;i&&i.break(),e--,a=!1}else if(o==n.children.length){if(!e&&!r.length)break;i&&i.leave(n),a=!!n.breakAfter,{tile:n,index:o}=r.pop(),o++}else{let s=n.children[o],g=s.breakAfter;(A>0?s.length<=e:s.length=0;r--){let s=A.marks[r],g=n.lastChild;if(g instanceof zs&&g.mark.eq(s.mark))g.dom!=s.dom&&g.setDOM(jM(s.dom)),n=g;else{if(this.cache.reused.get(s)){let C=sa.get(s.dom);C&&C.setDOM(jM(s.dom))}let l=zs.of(s.mark,s.dom);n.append(l),n=l}this.cache.reused.set(s,2)}let o=sa.get(e.text);o&&this.cache.reused.set(o,2);let a=new Q1(e.text,e.text.nodeValue);a.flags|=8,n.append(a)}addInlineWidget(e,A,i){let n=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);n||this.flushBuffer();let o=this.ensureMarks(A,i);!n&&!(e.flags&16)&&o.append(this.getBuffer(1)),o.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,A,i){this.flushBuffer(),this.ensureMarks(A,i).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let A=this.afterWidget||this.lastBlock;A.length+=e,this.pos+=e}addLineStart(e,A){var i;e||(e=WP);let n=CQ.start(e,A||((i=this.cache.find(CQ))===null||i===void 0?void 0:i.dom),!!A);this.getBlockPos().append(this.lastBlock=this.curLine=n)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,A){var i;let n=this.curLine;for(let o=e.length-1;o>=0;o--){let a=e[o],r;if(A>0&&(r=n.lastChild)&&r instanceof zs&&r.mark.eq(a))n=r,A--;else{let s=zs.of(a,(i=this.cache.find(zs,g=>g.mark.eq(a)))===null||i===void 0?void 0:i.dom);n.append(s),n=s,A=0}}return n}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!qz(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(ot.ios&&qz(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(qM,0,32)||new f1(qM.toDOM(),0,qM,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let A=new Ik(e.from,e.to,e.value,e.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-A.rank||this.wrappers[i-1].to-A.to)<0;)i--;this.wrappers.splice(i,0,A)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let A=this.root;for(let i of this.wrappers){let n=A.lastChild;if(i.froma.wrapper.eq(i.wrapper)))===null||e===void 0?void 0:e.dom);A.append(o),A=o}}return A}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let A=2|(e<0?16:32),i=this.cache.find(IQ,void 0,1);return i&&(i.flags=A),i||new IQ(A)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}},Bk=class{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:n,lineBreak:o,done:a}=this.cursor.next(this.skipCount);if(this.skipCount=0,a)throw new Error("Ran out of text content when drawing inline views");this.text=n;let r=this.textOff=Math.min(e,n.length);return o?null:n.slice(0,r)}let A=Math.min(this.text.length,this.textOff+e),i=this.text.slice(this.textOff,A);return this.textOff=A,i}},O8=[f1,CQ,Q1,zs,IQ,Z0,cQ];for(let t=0;t[]),this.index=O8.map(()=>0),this.reused=new Map}add(e){let A=e.constructor.bucket,i=this.buckets[A];i.length<6?i.push(e):i[this.index[A]=(this.index[A]+1)%6]=e}find(e,A,i=2){let n=e.bucket,o=this.buckets[n],a=this.index[n];for(let r=o.length-1;r>=0;r--){let s=(r+a)%o.length,g=o[s];if((!A||A(g))&&!this.reused.has(g))return o.splice(s,1),s{if(this.cache.add(a),a.isComposite())return!1},enter:a=>this.cache.add(a),leave:()=>{},break:()=>{}}}run(e,A){let i=A&&this.getCompositionContext(A.text);for(let n=0,o=0,a=0;;){let r=an){let g=s-n;this.preserve(g,!a,!r),n=s,o+=g}if(!r)break;A&&r.fromA<=A.range.fromA&&r.toA>=A.range.toA?(this.forward(r.fromA,A.range.fromA,A.range.fromA{if(a.isWidget())if(this.openWidget)this.builder.continueWidget(s-r);else{let g=s>0||r{a.isLine()?this.builder.addLineStart(a.attrs,this.cache.maybeReuse(a)):(this.cache.add(a),a instanceof zs&&n.unshift(a.mark)),this.openWidget=!1},leave:a=>{a.isLine()?n.length&&(n.length=o=0):a instanceof zs&&(n.shift(),o=Math.min(o,n.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,A){let i=null,n=this.builder,o=0,a=zn.spans(this.decorations,e,A,{point:(r,s,g,l,C,I)=>{if(g instanceof h1){if(this.disallowBlockEffectsFor[I]){if(g.block)throw new RangeError("Block decorations may not be specified via plugins");if(s>this.view.state.doc.lineAt(r).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(o=l.length,C>l.length)n.continueWidget(s-r);else{let d=g.widget||(g.block?Vz.block:Vz.inline),B=E4A(g),Q=this.cache.findWidget(d,s-r,B)||f1.of(d,this.view,s-r,B);g.block?(g.startSide>0&&n.addLineStartIfNotCovered(i),n.addBlockWidget(Q)):(n.ensureLine(i),n.addInlineWidget(Q,l,C))}i=null}else i=h4A(i,g);s>r&&this.text.skip(s-r)},span:(r,s,g,l)=>{for(let C=r;Co,this.openMarks=a}forward(e,A,i=1){A-e<=10?this.old.advance(A-e,i,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(A-e-10,-1),this.old.advance(5,i,this.reuseWalker))}getCompositionContext(e){let A=[],i=null;for(let n=e.parentNode;;n=n.parentNode){let o=sa.get(n);if(n==this.view.contentDOM)break;o instanceof zs?A.push(o):o?.isLine()?i=o:o instanceof Z0||(n.nodeName=="DIV"&&!i&&n!=this.view.contentDOM?i=new CQ(n,WP):i||A.push(zs.of(new B3({tagName:n.nodeName.toLowerCase(),attributes:XhA(n)}),n)))}return{line:i,marks:A}}};function qz(t,e){let A=i=>{for(let n of i.children)if((e?n.isText():n.length)||A(n))return!0;return!1};return A(t)}function E4A(t){let e=t.isReplace?(t.startSide<0?64:0)|(t.endSide>0?128:0):t.startSide>0?32:16;return t.block&&(e|=256),e}var WP={class:"cm-line"};function h4A(t,e){let A=e.spec.attributes,i=e.spec.class;return!A&&!i||(t||(t={class:"cm-line"}),A&&Wk(A,t),i&&(t.class+=" "+i)),t}function u4A(t){let e=[];for(let A=t.parents.length;A>1;A--){let i=A==t.parents.length?t.tile:t.parents[A].tile;i instanceof zs&&e.push(i.mark)}return e}function jM(t){let e=sa.get(t);return e&&e.setDOM(t.cloneNode()),t}var Vz=(()=>{class t extends Ps{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t("span"),t.block=new t("div"),t})(),qM=new class extends Ps{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}},z8=class{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=vt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new cQ(e,e.contentDOM),this.updateInner([new jl(0,0,0,e.state.doc.length)],null)}update(e){var A;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:l,toA:C})=>Cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!b4A(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?m4A(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){let{from:l,to:C}=this.hasComposition;i=new jl(l,C,e.changes.mapPos(l,-1),e.changes.mapPos(C,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(ot.ie||ot.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let a=this.decorations,r=this.blockWrappers;this.updateDeco();let s=w4A(a,this.decorations,e.changes);s.length&&(i=jl.extendWithRanges(i,s));let g=y4A(r,this.blockWrappers,e.changes);return g.length&&(i=jl.extendWithRanges(i,g)),o&&!i.some(l=>l.fromA<=o.range.fromA&&l.toA>=o.range.toA)&&(i=o.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(A||e.length){let a=this.tile,r=new Ek(this.view,a,this.blockWrappers,this.decorations,this.dynamicDecorationMap);A&&sa.get(A.text)&&r.cache.reused.set(sa.get(A.text),2),this.tile=r.run(e,A),hk(a,r.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let o=ot.chrome||ot.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(o),o&&(o.written||i.selectionRange.focusNode!=o.node||!this.tile.dom.contains(o.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let n=[];if(this.view.viewport.from||this.view.viewport.to-1)&&a3(i,this.view.observer.selectionRange)&&!(n&&i.contains(n));if(!(o||A||a))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,g,l;if(s.empty?l=g=this.inlineDOMNearPos(s.anchor,s.assoc||1):(l=this.inlineDOMNearPos(s.head,s.head==s.from?1:-1),g=this.inlineDOMNearPos(s.anchor,s.anchor==s.from?1:-1)),ot.gecko&&s.empty&&!this.hasComposition&&f4A(g)){let I=document.createTextNode("");this.view.observer.ignore(()=>g.node.insertBefore(I,g.node.childNodes[g.offset]||null)),g=l=new $c(I,0),r=!0}let C=this.view.observer.selectionRange;(r||!C.focusNode||(!r3(g.node,g.offset,C.anchorNode,C.anchorOffset)||!r3(l.node,l.offset,C.focusNode,C.focusOffset))&&!this.suppressWidgetCursorChange(C,s))&&(this.view.observer.ignore(()=>{ot.android&&ot.chrome&&i.contains(C.focusNode)&&v4A(C.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let I=E3(this.view.root);if(I)if(s.empty){if(ot.gecko){let d=p4A(g.node,g.offset);if(d&&d!=3){let B=(d==1?xP:RP)(g.node,g.offset);B&&(g=new $c(B.node,B.offset))}}I.collapse(g.node,g.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(g.node,g.offset);try{I.extend(l.node,l.offset)}catch(d){}}else{let d=document.createRange();s.anchor>s.head&&([g,l]=[l,g]),d.setEnd(l.node,l.offset),d.setStart(g.node,g.offset),I.removeAllRanges(),I.addRange(d)}a&&this.view.root.activeElement==i&&(i.blur(),n&&n.focus())}),this.view.observer.setSelectionRange(g,l)),this.impreciseAnchor=g.precise?null:new $c(C.anchorNode,C.anchorOffset),this.impreciseHead=l.precise?null:new $c(C.focusNode,C.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&r3(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,i=E3(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!i||!A.empty||!A.assoc||!i.modify)return;let a=this.lineAt(A.head,A.assoc);if(!a)return;let r=a.posAtStart;if(A.head==r||A.head==r+a.length)return;let s=this.coordsAt(A.head,-1),g=this.coordsAt(A.head,1);if(!s||!g||s.bottom>g.top)return;let l=this.domAtPos(A.head+A.assoc,A.assoc);i.collapse(l.node,l.offset),i.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let C=e.observer.selectionRange;e.docView.posFromDOM(C.anchorNode,C.anchorOffset)!=A.from&&i.collapse(n,o)}posFromDOM(e,A){let i=this.tile.nearest(e);if(!i)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let n=i.posAtStart;if(i.isComposite()){let o;if(e==i.dom)o=i.dom.childNodes[A];else{let a=X0(e)==0?0:A==0?-1:1;for(;;){let r=e.parentNode;if(r==i.dom)break;a==0&&r.firstChild!=r.lastChild&&(e==r.firstChild?a=-1:a=1),e=r}a<0?o=e:o=e.nextSibling}if(o==i.dom.firstChild)return n;for(;o&&!sa.get(o);)o=o.nextSibling;if(!o)return n+i.length;for(let a=0,r=n;;a++){let s=i.children[a];if(s.dom==o)return r;r+=s.length+s.breakAfter}}else return i.isText()?e==i.dom?n+A:n+(A?i.length:0):n}domAtPos(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.domPosFor(e,A):i.domIn(n,A)}inlineDOMNearPos(e,A){let i,n=-1,o=!1,a,r=-1,s=!1;return this.tile.blockTiles((g,l)=>{if(g.isWidget()){if(g.flags&32&&l>=e)return!0;g.flags&16&&(o=!0)}else{let C=l+g.length;if(l<=e&&(i=g,n=e-l,o=C=e&&!a&&(a=g,r=e-l,s=l>e),l>e&&a)return!0}}),!i&&!a?this.domAtPos(e,A):(o&&a?i=null:s&&i&&(a=null),i&&A<0||!a?i.domIn(n,A):a.domIn(r,A))}coordsAt(e,A){let{tile:i,offset:n}=this.tile.resolveBlock(e,A);return i.isWidget()?i.widget instanceof l3?null:i.coordsInWidget(n,A,!0):i.coordsIn(n,A)}lineAt(e,A){let{tile:i}=this.tile.resolveBlock(e,A);return i.isLine()?i:null}coordsForChar(e){let{tile:A,offset:i}=this.tile.resolveBlock(e,1);if(!A.isLine())return null;function n(o,a){if(o.isComposite())for(let r of o.children){if(r.length>=a){let s=n(r,a);if(s)return s}if(a-=r.length,a<0)break}else if(o.isText()&&aMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,r=-1,s=this.view.textDirection==go.LTR,g=0,l=(C,I,d)=>{for(let B=0;Bn);B++){let Q=C.children[B],E=I+Q.length,f=Q.dom.getBoundingClientRect(),{height:b}=f;if(d&&!B&&(g+=f.top-d.top),Q instanceof Z0)E>i&&l(Q,I,f);else if(I>=i&&(g>0&&A.push(-g),A.push(b+g),g=0,a)){let R=Q.dom.lastChild,M=R?F8(R):[];if(M.length){let v=M[M.length-1],F=s?v.right-f.left:f.right-v.left;F>r&&(r=F,this.minWidth=o,this.minWidthFrom=I,this.minWidthTo=E)}}d&&B==C.children.length-1&&(g+=d.bottom-f.bottom),I=E+Q.breakAfter}};return l(this.tile,0,null),A}textDirectionAt(e){let{tile:A}=this.tile.resolveBlock(e,1);return getComputedStyle(A.dom).direction=="rtl"?go.RTL:go.LTR}measureTextSize(){let e=this.tile.blockTiles(a=>{if(a.isLine()&&a.children.length&&a.length<=20){let r=0,s;for(let g of a.children){if(!g.isText()||/[^ -~]/.test(g.text))return;let l=F8(g.dom);if(l.length!=1)return;r+=l[0].width,s=l[0].height}if(r)return{lineHeight:a.dom.getBoundingClientRect().height,charWidth:r/a.length,textHeight:s}}});if(e)return e;let A=document.createElement("div"),i,n,o;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(A);let a=F8(A.firstChild)[0];i=A.getBoundingClientRect().height,n=a&&a.width?a.width/27:7,o=a&&a.height?a.height:i,A.remove()}),{lineHeight:i,charWidth:n,textHeight:o}}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let i=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],a=o?o.from-1:this.view.state.doc.length;if(a>i){let r=(A.lineBlockAt(a).bottom-A.lineBlockAt(i).top)/this.view.scaleY;e.push(vt.replace({widget:new l3(r),block:!0,inclusive:!0,isBlockGap:!0}).range(i,a))}if(!o)break;i=o.to+1}return vt.set(e)}updateDeco(){let e=1,A=this.view.state.facet(n5).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),i=!1,n=this.view.state.facet(eS).map((o,a)=>{let r=typeof o=="function";return r&&(i=!0),r?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=i,A.push(zn.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof o=="function"?o(this.view):o)}scrollIntoView(e){var A;if(e.isSnapshot){let l=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=l.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let l of this.view.state.facet(zP))try{if(l(this.view,e.range,e))return!0}catch(C){dr(this.view.state,C,"scroll handler")}let{range:i}=e,n=this.coordsAt(i.head,(A=i.assoc)!==null&&A!==void 0?A:i.empty?0:i.head>i.anchor?-1:1),o;if(!n)return;!i.empty&&(o=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,o.left),top:Math.min(n.top,o.top),right:Math.max(n.right,o.right),bottom:Math.max(n.bottom,o.bottom)});let a=tS(this.view),r={left:n.left-a.left,top:n.top-a.top,right:n.right+a.right,bottom:n.bottom+a.bottom},{offsetWidth:s,offsetHeight:g}=this.view.scrollDOM;if(e4A(this.view.scrollDOM,r,i.head1&&(n.top>window.pageYOffset+window.visualViewport.offsetTop+window.visualViewport.height||n.bottomi.isWidget()||i.children.some(A);return A(this.tile.resolveBlock(e,1).tile)}destroy(){hk(this.tile)}};function hk(t,e){let A=e?.get(t);if(A!=1){A==null&&t.destroy();for(let i of t.children)hk(i,e)}}function f4A(t){return t.node.nodeType==1&&t.node.firstChild&&(t.offset==0||t.node.childNodes[t.offset-1].contentEditable=="false")&&(t.offset==t.node.childNodes.length||t.node.childNodes[t.offset].contentEditable=="false")}function ZP(t,e){let A=t.observer.selectionRange;if(!A.focusNode)return null;let i=xP(A.focusNode,A.focusOffset),n=RP(A.focusNode,A.focusOffset),o=i||n;if(n&&i&&n.node!=i.node){let r=sa.get(n.node);if(!r||r.isText()&&r.text!=n.node.nodeValue)o=n;else if(t.docView.lastCompositionAfterCursor){let s=sa.get(i.node);!s||s.isText()&&s.text!=i.node.nodeValue||(o=n)}}if(t.docView.lastCompositionAfterCursor=o!=i,!o)return null;let a=e-o.offset;return{from:a,to:a+o.node.nodeValue.length,node:o.node}}function m4A(t,e,A){let i=ZP(t,A);if(!i)return null;let{node:n,from:o,to:a}=i,r=n.nodeValue;if(/[\n\r]/.test(r)||t.state.doc.sliceString(i.from,i.to)!=r)return null;let s=e.invertedDesc;return{range:new jl(s.mapPos(o),s.mapPos(a),o,a),text:n}}function p4A(t,e){return t.nodeType!=1?0:(e&&t.childNodes[e-1].contentEditable=="false"?1:0)|(e{ie.from&&(A=!0)}),A}var l3=class extends Ps{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}};function M4A(t,e,A=1){let i=t.charCategorizer(e),n=t.doc.lineAt(e),o=e-n.from;if(n.length==0)return ce.cursor(e);o==0?A=1:o==n.length&&(A=-1);let a=o,r=o;A<0?a=_a(n.text,o,!1):r=_a(n.text,o);let s=i(n.text.slice(a,r));for(;a>0;){let g=_a(n.text,a,!1);if(i(n.text.slice(g,a))!=s)break;a=g}for(;rt.defaultLineHeight*1.5){let r=t.viewState.heightOracle.textHeight,s=Math.floor((n-A.top-(t.defaultLineHeight-r)*.5)/r);o+=s*t.viewState.heightOracle.lineLength}let a=t.state.sliceDoc(A.from,A.to);return A.from+D8(a,o,t.state.tabSize)}function fk(t,e,A){let i=t.lineBlockAt(e);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==Lr.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||i}return i}function S4A(t,e,A,i){let n=fk(t,e.head,e.assoc||-1),o=!i||n.type!=Lr.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let a=t.dom.getBoundingClientRect(),r=t.textDirectionAt(n.from),s=t.posAtCoords({x:A==(r==go.LTR)?a.right-1:a.left+1,y:(o.top+o.bottom)/2});if(s!=null)return ce.cursor(s,A?-1:1)}return ce.cursor(A?n.to:n.from,A?-1:1)}function Wz(t,e,A,i){let n=t.state.doc.lineAt(e.head),o=t.bidiSpans(n),a=t.textDirectionAt(n.from);for(let r=e,s=null;;){let g=c4A(n,o,a,r,A),l=GP;if(!g){if(n.number==(A?t.state.doc.lines:1))return r;l=` `,n=t.state.doc.line(n.number+(A?1:-1)),o=t.bidiSpans(n),g=t.visualLineSide(n,!A)}if(s){if(!s(l))return r}else{if(!i)return g;s=i(l)}r=g}}function x4A(t,e,A){let i=t.state.charCategorizer(e),n=i(A);return o=>{let a=i(o);return n==yo.Space&&(n=a),n==a}}function R4A(t,e,A,i){let n=e.head,o=A?1:-1;if(n==(A?t.state.doc.length:0))return ce.cursor(n,e.assoc);let a=e.goalColumn,r,s=t.contentDOM.getBoundingClientRect(),g=t.coordsAtPos(n,e.assoc||((e.empty?A:e.head==e.from)?1:-1)),l=t.documentTop;if(g)a==null&&(a=g.left-s.left),r=o<0?g.top:g.bottom;else{let B=t.viewState.lineBlockAt(n);a==null&&(a=Math.min(s.right-s.left,t.defaultCharacterWidth*(n-B.from))),r=(o<0?B.top:B.bottom)+l}let C=s.left+a,I=t.viewState.heightOracle.textHeight>>1,d=i??I;for(let B=0;;B+=I){let Q=r+(d+B)*o,E=mk(t,{x:C,y:Q},!1,o);if(A?Q>s.bottom:Qr:b{if(e>o&&en(t)),A.from,e.head>A.from?-1:1);return i==A.from?A:ce.cursor(i,it.viewState.docHeight)return new Al(t.state.doc.length,-1);if(g=t.elementAtHeight(s),i==null)break;if(g.type==Lr.Text){if(i<0?g.tot.viewport.to)break;let I=t.docView.coordsAt(i<0?g.from:g.to,i>0?-1:1);if(I&&(i<0?I.top<=s+o:I.bottom>=s+o))break}let C=t.viewState.heightOracle.textHeight/2;s=i>0?g.bottom+C:g.top-C}if(t.viewport.from>=g.to||t.viewport.to<=g.from){if(A)return null;if(g.type==Lr.Text){let C=k4A(t,n,g,a,r);return new Al(C,C==g.from?1:-1)}}if(g.type!=Lr.Text)return s<(g.top+g.bottom)/2?new Al(g.from,1):new Al(g.to,-1);let l=t.docView.lineAt(g.from,2);return(!l||l.length!=g.length)&&(l=t.docView.lineAt(g.from,-2)),new pk(t,a,r,t.textDirectionAt(g.from)).scanTile(l,g.from)}var pk=class{constructor(e,A,i,n){this.view=e,this.x=A,this.y=i,this.baseDir=n,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||i.length&&(i[0].level!=this.baseDir||i[0].to+n.from>1;e:if(o.has(B)){let E=i+Math.floor(Math.random()*d);for(let f=0;f1)){if(f.bottomthis.y)(!s||s.top>f.top)&&(s=f),b=-1;else{let R=f.left>this.x?this.x-f.left:f.right(C.left+C.right)/2==I}}scanText(e,A){let i=[];for(let o=0;o{let a=i[o]-A,r=i[o+1]-A;return h3(e.dom,a,r).getClientRects()});return n.after?new Al(i[n.i+1],-1):new Al(i[n.i],1)}scanTile(e,A){if(!e.length)return new Al(A,1);if(e.children.length==1){let r=e.children[0];if(r.isText())return this.scanText(r,A);if(r.isComposite())return this.scanTile(r,A)}let i=[A];for(let r=0,s=A;r{let s=e.children[r];return s.flags&48?null:(s.dom.nodeType==1?s.dom:h3(s.dom,0,s.length)).getClientRects()}),o=e.children[n.i],a=i[n.i];return o.isText()?this.scanText(o,a):o.isComposite()?this.scanTile(o,a):n.after?new Al(i[n.i+1],-1):new Al(a,1)}},iQ="\uFFFF",Dk=class{constructor(e,A){this.points=e,this.view=A,this.text="",this.lineSeparator=A.state.facet(Ga.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=iQ}readRange(e,A){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let o=this.text.length;this.readNode(n);let a=sa.get(n),r=n.nextSibling;if(r==A){a?.breakAfter&&!r&&i!=this.view.contentDOM&&this.lineBreak();break}let s=sa.get(r);(a&&s?a.breakAfter:(a?a.breakAfter:Y8(n))||Y8(r)&&(n.nodeName!="BR"||a?.isWidget())&&this.text.length>o)&&!F4A(r,A)&&this.lineBreak(),n=r}return this.findPointBefore(i,A),this}readTextNode(e){let A=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,A.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,a=1,r;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,i),a=this.lineSeparator.length):(r=n.exec(A))&&(o=r.index,a=r[0].length),this.append(A.slice(i,o<0?A.length:o)),o<0)break;if(this.lineBreak(),a>1)for(let s of this.points)s.node==e&&s.pos>this.text.length&&(s.pos-=a-1);i=o+a}}readNode(e){let A=sa.get(e),i=A&&A.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==A&&(i.pos=this.text.length)}findPointInside(e,A){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(N4A(e,i.node,i.offset)?A:0))}};function N4A(t,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:a}=e.docView,r=e.state.selection;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=$P(e.docView.tile,A,i,0))){let s=o||a?[]:_4A(e),g=new Dk(s,e);g.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=g.text,this.newSel=G4A(s,this.bounds.from)}else{let s=e.observer.selectionRange,g=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!ak(e.contentDOM,s.focusNode)?r.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),l=a&&a.node==s.anchorNode&&a.offset==s.anchorOffset||!ak(e.contentDOM,s.anchorNode)?r.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),C=e.viewport;if((ot.ios||ot.chrome)&&r.main.empty&&g!=l&&(C.from>0||C.to-1&&r.ranges.length>1)this.newSel=r.replaceRange(ce.range(l,g));else if(e.lineWrapping&&l==g&&!(r.main.empty&&r.main.head==g)&&e.inputState.lastTouchTime>Date.now()-100){let I=e.coordsAtPos(g,-1),d=0;I&&(d=e.inputState.lastTouchY<=I.bottom?-1:1),this.newSel=ce.create([ce.cursor(g,d)])}else this.newSel=ce.single(l,g)}}};function $P(t,e,A,i){if(t.isComposite()){let n=-1,o=-1,a=-1,r=-1;for(let s=0,g=i,l=i;sA)return $P(C,e,A,g);if(I>=e&&n==-1&&(n=s,o=g),g>A&&C.dom.parentNode==t.dom){a=s,r=l;break}l=I,g=I+C.breakAfter}return{from:o,to:r<0?i+t.length:r,startDOM:(n?t.children[n-1].dom.nextSibling:null)||t.dom.firstChild,endDOM:a=0?t.children[a].dom:null}}else return t.isText()?{from:i,to:i+t.length,startDOM:t.dom,endDOM:t.dom.nextSibling}:null}function Aj(t,e){let A,{newSel:i}=e,{state:n}=t,o=n.selection.main,a=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,g=o.from,l=null;(a===8||ot.android&&e.text.length=r&&o.to<=s&&(e.typeOver||C!=e.text)&&C.slice(0,o.from-r)==e.text.slice(0,o.from-r)&&C.slice(o.to-r)==e.text.slice(I=e.text.length-(C.length-(o.to-r)))?A={from:o.from,to:o.to,insert:Bn.of(e.text.slice(o.from-r,I).split(iQ))}:(d=ej(C,e.text,g-r,l))&&(ot.chrome&&a==13&&d.toB==d.from+2&&e.text.slice(d.from,d.toB)==iQ+iQ&&d.toB--,A={from:r+d.from,to:r+d.toA,insert:Bn.of(e.text.slice(d.from,d.toB).split(iQ))})}else i&&(!t.hasFocus&&n.facet(W0)||j8(i,o))&&(i=null);if(!A&&!i)return!1;if((ot.mac||ot.android)&&A&&A.from==A.to&&A.from==o.head-1&&/^\. ?$/.test(A.insert.toString())&&t.contentDOM.getAttribute("autocorrect")=="off"?(i&&A.insert.length==2&&(i=ce.single(i.main.anchor-1,i.main.head-1)),A={from:A.from,to:A.to,insert:Bn.of([A.insert.toString().replace("."," ")])}):n.doc.lineAt(o.from).toDate.now()-50?A={from:o.from,to:o.to,insert:n.toText(t.inputState.insertingText)}:ot.chrome&&A&&A.from==A.to&&A.from==o.head&&A.insert.toString()==` `&&t.lineWrapping&&(i&&(i=ce.single(i.main.anchor-1,i.main.head-1)),A={from:o.from,to:o.to,insert:Bn.of([" "])}),A)return iS(t,A,i,a);if(i&&!j8(i,o)){let r=!1,s="select";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin=="select"&&(r=!0),s=t.inputState.lastSelectionOrigin,s=="select.pointer"&&(i=XP(n.facet(u3).map(g=>g(t)),i))),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function iS(t,e,A,i=-1){if(ot.ios&&t.inputState.flushIOSKey(e))return!0;let n=t.state.selection.main;if(ot.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&t.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&gQ(t.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||i==8&&e.insert.lengthn.head)&&gQ(t.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&gQ(t.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a,r=()=>a||(a=L4A(t,e,A));return t.state.facet(HP).some(s=>s(t,e.from,e.to,o,r))||t.dispatch(r()),!0}function L4A(t,e,A){let i,n=t.state,o=n.selection.main,a=-1;if(e.from==e.to&&e.fromo.to){let s=e.fromC(t)),g,s);e.from==l&&(a=l)}if(a>-1)i={changes:e,selection:ce.cursor(e.from+e.insert.length,-1)};else if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";i=n.replaceSelection(t.state.toText(s+e.insert.sliceString(0,void 0,t.state.lineBreak)+g))}else{let s=n.changes(e),g=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&(t.inputState.composing>=0||t.inputState.compositionPendingChange)&&e.to<=o.to+10&&e.to>=o.to-10){let l=t.state.sliceDoc(e.from,e.to),C,I=A&&ZP(t,A.main.head);if(I){let B=e.insert.length-(e.to-e.from);C={from:I.from,to:I.to-B}}else C=t.state.doc.lineAt(o.head);let d=o.to-e.to;i=n.changeByRange(B=>{if(B.from==o.from&&B.to==o.to)return{changes:s,range:g||B.map(s)};let Q=B.to-d,E=Q-l.length;if(t.state.sliceDoc(E,Q)!=l||Q>=C.from&&E<=C.to)return{range:B};let f=n.changes({from:E,to:Q,insert:e.insert}),b=B.to-o.to;return{changes:f,range:g?ce.range(Math.max(0,g.anchor+b),Math.max(0,g.head+b)):B.map(f)}})}else i={changes:s,selection:g&&n.selection.replaceRange(g)}}let r="input.type";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=".compose",t.inputState.compositionFirstChange&&(r+=".start",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function ej(t,e,A,i){let n=Math.min(t.length,e.length),o=0;for(;o0&&r>0&&t.charCodeAt(a-1)==e.charCodeAt(r-1);)a--,r--;if(i=="end"){let s=Math.max(0,o-Math.min(a,r));A-=a+s-o}if(a=a?o-A:0;o-=s,r=o+(r-a),a=o}else if(r=r?o-A:0;o-=s,a=o+(a-r),r=o}return{from:o,toA:a,toB:r}}function _4A(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return A&&(e.push(new P8(A,i)),(n!=A||o!=i)&&e.push(new P8(n,o))),e}function G4A(t,e){if(t.length==0)return null;let A=t[0].pos,i=t.length==2?t[1].pos:A;return A>-1&&i>-1?ce.single(A+e,i+e):null}function j8(t,e){return e.head==t.main.head&&e.anchor==t.main.anchor}var yk=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,ot.safari&&e.contentDOM.addEventListener("input",()=>null),ot.gecko&&Z4A(e.contentDOM.ownerDocument)}handleEvent(e){!O4A(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let i=this.handlers[e];if(i){for(let n of i.observers)n(this.view,A);for(let n of i.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=K4A(e),i=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let a=!A[o].handlers.length,r=i[o];r&&a!=!r.handlers.length&&(n.removeEventListener(o,this.handleEvent),r=null),r||n.addEventListener(o,this.handleEvent,{passive:a})}for(let o in i)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&ij.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),ot.android&&ot.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return ot.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&!e.shiftKey&&((A=tj.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||U4A.indexOf(e.key)>-1&&e.ctrlKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:ot.safari&&!ot.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function Zz(t,e){return(A,i)=>{try{return e.call(t,i,A)}catch(n){dr(A.state,n)}}}function K4A(t){let e=Object.create(null);function A(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,a=n&&n.plugin.domEventObservers;if(o)for(let r in o){let s=o[r];s&&A(r).handlers.push(Zz(i.value,s))}if(a)for(let r in a){let s=a[r];s&&A(r).observers.push(Zz(i.value,s))}}for(let i in ql)A(i).handlers.push(ql[i]);for(let i in js)A(i).observers.push(js[i]);return e}var tj=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],U4A="dthko",ij=[16,17,18,20,91,92,224,225],v8=6;function b8(t){return Math.max(0,t)*.7+8}function J4A(t,e){return Math.max(Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))}var vk=class{constructor(e,A,i,n){this.view=e,this.startEvent=A,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=MP(e.contentDOM),this.atoms=e.state.facet(u3).map(a=>a(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(Ga.allowMultipleSelections)&&Y4A(e,A),this.dragging=T4A(e,A)&&aj(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&J4A(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,i=0,n=0,o=0,a=this.view.win.innerWidth,r=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:a}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:r}=this.scrollParents.y.getBoundingClientRect());let s=tS(this.view);e.clientX-s.left<=n+v8?A=-b8(n-e.clientX):e.clientX+s.right>=a-v8&&(A=b8(e.clientX-a)),e.clientY-s.top<=o+v8?i=-b8(o-e.clientY):e.clientY+s.bottom>=r-v8&&(i=b8(e.clientY-r)),this.setScrollSpeed(A,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:A}=this,i=XP(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!i.eq(A.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(A=>A.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function Y4A(t,e){let A=t.state.facet(KP);return A.length?A[0](e):ot.mac?e.metaKey:e.ctrlKey}function H4A(t,e){let A=t.state.facet(UP);return A.length?A[0](e):ot.mac?!e.altKey:!e.ctrlKey}function T4A(t,e){let{main:A}=t.state.selection;if(A.empty)return!1;let i=E3(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&a.top<=e.clientY&&a.bottom>=e.clientY)return!0}return!1}function O4A(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,i;A!=t.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(i=sa.get(A))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(e))return!1;return!0}var ql=Object.create(null),js=Object.create(null),nj=ot.ie&&ot.ie_version<15||ot.ios&&ot.webkit_version<604;function z4A(t){let e=t.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{t.focus(),A.remove(),oj(t,A.value)},50)}function o5(t,e,A){for(let i of t.facet(e))A=i(A,t);return A}function oj(t,e){e=o5(t.state,$k,e);let{state:A}=t,i,n=1,o=A.toText(e),a=o.lines==A.selection.ranges.length;if(bk!=null&&A.selection.ranges.every(s=>s.empty)&&bk==o.toString()){let s=-1;i=A.changeByRange(g=>{let l=A.doc.lineAt(g.from);if(l.from==s)return{range:g};s=l.from;let C=A.toText((a?o.line(n++).text:e)+A.lineBreak);return{changes:{from:l.from,insert:C},range:ce.cursor(g.from+C.length)}})}else a?i=A.changeByRange(s=>{let g=o.line(n++);return{changes:{from:s.from,to:s.to,insert:g.text},range:ce.cursor(s.from+g.length)}}):i=A.replaceSelection(o);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}js.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};js.wheel=js.mousewheel=t=>{t.inputState.lastWheelEvent=Date.now()};ql.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),e.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);js.touchstart=(t,e)=>{let A=t.inputState,i=e.targetTouches[0];A.lastTouchTime=Date.now(),i&&(A.lastTouchX=i.clientX,A.lastTouchY=i.clientY),A.setSelectionOrigin("select.pointer")};js.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")};ql.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let i of t.state.facet(JP))if(A=i(t,e),A)break;if(!A&&e.button==0&&(A=j4A(t,e)),A){let i=!t.hasFocus;t.inputState.startMouseSelection(new vk(t,e,A,i)),i&&t.observer.ignore(()=>{kP(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}else t.inputState.setSelectionOrigin("select.pointer");return!1};function Xz(t,e,A,i){if(i==1)return ce.cursor(e,A);if(i==2)return M4A(t.state,e,A);{let n=t.docView.lineAt(e,A),o=t.state.doc.lineAt(n?n.posAtEnd:e),a=n?n.posAtStart:o.from,r=n?n.posAtEnd:o.to;return rDate.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(AP+1)%3:1}function j4A(t,e){let A=t.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),i=aj(e),n=t.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,a,r){let s=t.posAndSideAtCoords({x:o.clientX,y:o.clientY},!1),g,l=Xz(t,s.pos,s.assoc,i);if(A.pos!=s.pos&&!a){let C=Xz(t,A.pos,A.assoc,i),I=Math.min(C.from,l.from),d=Math.max(C.to,l.to);l=I1&&(g=q4A(n,s.pos))?g:r?n.addRange(l):ce.create([l])}}}function q4A(t,e){for(let A=0;A=e)return ce.create(t.ranges.slice(0,A).concat(t.ranges.slice(A+1)),t.mainIndex==A?0:t.mainIndex-(t.mainIndex>A?1:0))}return null}ql.dragstart=(t,e)=>{let{selection:{main:A}}=t.state;if(e.target.draggable){let n=t.docView.tile.nearest(e.target);if(n&&n.isWidget()){let o=n.posAtStart,a=o+n.length;(o>=A.to||a<=A.from)&&(A=ce.range(o,a))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",o5(t.state,AS,t.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};ql.dragend=t=>(t.inputState.draggedContent=null,!1);function tP(t,e,A,i){if(A=o5(t.state,$k,A),!A)return;let n=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=t.inputState,a=i&&o&&H4A(t,e)?{from:o.from,to:o.to}:null,r={from:n,insert:A},s=t.state.changes(a?[a,r]:r);t.focus(),t.dispatch({changes:s,selection:{anchor:s.mapPos(n,-1),head:s.mapPos(n,1)},userEvent:a?"move.drop":"input.drop"}),t.inputState.draggedContent=null}ql.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let i=Array(A.length),n=0,o=()=>{++n==A.length&&tP(t,e,i.filter(a=>a!=null).join(t.state.lineBreak),!1)};for(let a=0;a{/[\x00-\x08\x0e-\x1f]{2}/.test(r.result)||(i[a]=r.result),o()},r.readAsText(A[a])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return tP(t,e,i,!0),!0}return!1};ql.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let A=nj?null:e.clipboardData;return A?(oj(t,A.getData("text/plain")||A.getData("text/uri-list")),!0):(z4A(t),!1)};function V4A(t,e){let A=t.dom.parentNode;if(!A)return;let i=A.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function W4A(t){let e=[],A=[],i=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of t.selection.ranges){let a=t.doc.lineAt(o);a.number>n&&(e.push(a.text),A.push({from:a.from,to:Math.min(t.doc.length,a.to+1)})),n=a.number}i=!0}return{text:o5(t,AS,e.join(t.lineBreak)),ranges:A,linewise:i}}var bk=null;ql.copy=ql.cut=(t,e)=>{if(!a3(t.contentDOM,t.observer.selectionRange))return!1;let{text:A,ranges:i,linewise:n}=W4A(t.state);if(!A&&!n)return!1;bk=n?A:null,e.type=="cut"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let o=nj?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(V4A(t,A),!1)};var rj=Os.define();function sj(t,e){let A=[];for(let i of t.facet(TP)){let n=i(t,e);n&&A.push(n)}return A.length?t.update({effects:A,annotations:rj.of(!0)}):null}function gj(t){setTimeout(()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let A=sj(t.state,e);A?t.dispatch(A):t.update([])}},10)}js.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),gj(t)};js.blur=t=>{t.observer.clearSelectionRange(),gj(t)};js.compositionstart=js.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};js.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,ot.chrome&&ot.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};js.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};ql.beforeinput=(t,e)=>{var A,i;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(t.inputState.insertingText=e.data,t.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&t.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),a=e.getTargetRanges();if(o&&a.length){let r=a[0],s=t.posAtDOM(r.startContainer,r.startOffset),g=t.posAtDOM(r.endContainer,r.endOffset);return iS(t,{from:s,to:g,insert:t.state.toText(o)},null),!0}}let n;if(ot.chrome&&ot.android&&(n=tj.find(o=>o.inputType==e.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var a;(((a=window.visualViewport)===null||a===void 0?void 0:a.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return ot.ios&&e.inputType=="deleteContentForward"&&t.observer.flushSoon(),ot.safari&&e.inputType=="insertText"&&t.inputState.composing>=0&&setTimeout(()=>js.compositionend(t,e),20),!1};var iP=new Set;function Z4A(t){iP.has(t)||(iP.add(t),t.addEventListener("copy",()=>{}),t.addEventListener("cut",()=>{}))}var nP=["pre-wrap","normal","pre-line","break-spaces"],dQ=!1;function oP(){dQ=!1}var Mk=class{constructor(e){this.lineWrapping=e,this.doc=Bn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let i=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((A-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return nP.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let i=0;i-1,s=Math.abs(A-this.lineHeight)>.3||this.lineWrapping!=r||Math.abs(i-this.charWidth)>.1;if(this.lineWrapping=r,this.lineHeight=A,this.charWidth=i,this.textHeight=n,this.lineLength=o,s){this.heightSamples={};for(let g=0;g0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>L8&&(dQ=!0),this.height=e)}replace(e,A,i){return t.of(i)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,i,n){let o=this,a=i.doc;for(let r=n.length-1;r>=0;r--){let{fromA:s,toA:g,fromB:l,toB:C}=n[r],I=o.lineAt(s,Po.ByPosNoHeight,i.setDoc(A),0,0),d=I.to>=g?I:o.lineAt(g,Po.ByPosNoHeight,i,0,0);for(C+=d.to-g,g=d.to;r>0&&I.from<=n[r-1].toA;)s=n[r-1].fromA,l=n[r-1].fromB,r--,so*2){let r=e[A-1];r.break?e.splice(--A,1,r.left,null,r.right):e.splice(--A,1,r.left,r.right),i+=1+r.break,n-=r.size}else if(o>n*2){let r=e[i];r.break?e.splice(i,1,r.left,null,r.right):e.splice(i,1,r.left,r.right),i+=2+r.break,o-=r.size}else break;else if(n=o&&a(this.lineAt(0,Po.ByPos,i,n,o))}setMeasuredHeight(e){let A=e.heights[e.index++];A<0?(this.spaceAbove=-A,A=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(A)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more&&this.setMeasuredHeight(n),this.outdated=!1,this}toString(){return`block(${this.length})`}},$g=class t extends V8{constructor(e,A,i){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(e,A){return new Pl(A,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,A,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof x2&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof x2?n=new t(n.length,this.height,this.spaceAbove):n.height=this.height,this.outdated||(n.outdated=!1),n):hg.of(i)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more?this.setMeasuredHeight(n):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},x2=class t extends hg{constructor(e){super(e,0)}heightMetrics(e,A){let i=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-i+1,a,r=0;if(e.lineWrapping){let s=Math.min(this.height,e.lineHeight*o);a=s/o,this.length>o+1&&(r=(this.height-s)/(this.length-o-1))}else a=this.height/o;return{firstLine:i,lastLine:n,perLine:a,perChar:r}}blockAt(e,A,i,n){let{firstLine:o,lastLine:a,perLine:r,perChar:s}=this.heightMetrics(A,n);if(A.lineWrapping){let g=n+(e0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(e>0){let o=i[0];o instanceof t?i[0]=new t(e+o.length):i.unshift(new t(e-1),null)}return hg.of(i)}decomposeLeft(e,A){A.push(new t(e-1),null)}decomposeRight(e,A){A.push(null,new t(this.length-e-1))}updateHeight(e,A=0,i=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let a=[],r=Math.max(A,n.from),s=-1;for(n.from>A&&a.push(new t(n.from-A-1).updateHeight(e,A));r<=o&&n.more;){let l=e.doc.lineAt(r).length;a.length&&a.push(null);let C=n.heights[n.index++],I=0;C<0&&(I=-C,C=n.heights[n.index++]),s==-1?s=C:Math.abs(C-s)>=L8&&(s=-2);let d=new $g(l,C,I);d.outdated=!1,a.push(d),r+=l+1}r<=o&&a.push(null,new t(o-r).updateHeight(e,r));let g=hg.of(a);return(s<0||Math.abs(g.height-this.height)>=L8||Math.abs(s-this.heightMetrics(e,A).perLine)>=L8)&&(dQ=!0),q8(this,g)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},Sk=class extends hg{constructor(e,A,i){super(e.length+A+i.length,e.height+i.height,A|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,A,i,n){let o=i+this.left.height;return er))return g;let l=A==Po.ByPosNoHeight?Po.ByPosNoHeight:Po.ByPos;return s?g.join(this.right.lineAt(r,l,i,a,r)):this.left.lineAt(r,l,i,n,o).join(g)}forEachLine(e,A,i,n,o,a){let r=n+this.left.height,s=o+this.left.length+this.break;if(this.break)e=s&&this.right.forEachLine(e,A,i,r,s,a);else{let g=this.lineAt(s,Po.ByPos,i,n,o);e=e&&g.from<=A&&a(g),A>g.to&&this.right.forEachLine(g.to+1,A,i,r,s,a)}}replace(e,A,i){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,i));let o=[];e>0&&this.decomposeLeft(e,o);let a=o.length;for(let r of i)o.push(r);if(e>0&&aP(o,a-1),A=i&&A.push(null)),e>i&&this.right.decomposeLeft(e-i,A)}decomposeRight(e,A){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?hg.of(this.break?[e,null,A]:[e,A]):(this.left=q8(this.left,e),this.right=q8(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,i=!1,n){let{left:o,right:a}=this,r=A+o.length+this.break,s=null;return n&&n.from<=A+o.length&&n.more?s=o=o.updateHeight(e,A,i,n):o.updateHeight(e,A,i),n&&n.from<=r+a.length&&n.more?s=a=a.updateHeight(e,r,i,n):a.updateHeight(e,r,i),s?this.balanced(o,a):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function aP(t,e){let A,i;t[e]==null&&(A=t[e-1])instanceof x2&&(i=t[e+1])instanceof x2&&t.splice(e-1,3,new x2(A.length+1+i.length))}var $4A=5,xk=class t{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let i=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof $g?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new $g(i-this.pos,-1,0)),this.writtenTo=i,A>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,i){if(e=$4A)&&this.addLineDeco(n,o,a)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new $g(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,A){let i=new x2(A-e);return this.oracle.doc.lineAt(e).to==A&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof $g)return e;let A=new $g(0,-1,0);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+i}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof $g)&&!this.isCovered?this.nodes.push(new $g(0,-1,0)):(this.writtenTol.clientHeight||l.scrollWidth>l.clientWidth)&&C.overflow!="visible"){let I=l.getBoundingClientRect();o=Math.max(o,I.left),a=Math.min(a,I.right),r=Math.max(r,I.top),s=Math.min(g==t.parentNode?n.innerHeight:s,I.bottom)}g=C.position=="absolute"||C.position=="fixed"?l.offsetParent:l.parentNode}else if(g.nodeType==11)g=g.host;else break;return{left:o-A.left,right:Math.max(o,a)-A.left,top:r-(A.top+e),bottom:Math.max(r,s)-(A.top+e)}}function t3A(t){let e=t.getBoundingClientRect(),A=t.ownerDocument.defaultView||window;return e.left0&&e.top0}function i3A(t,e){let A=t.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var C3=class{constructor(e,A,i,n){this.from=e,this.to=A,this.size=i,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let i=0;itypeof n!="function"&&n.class=="cm-lineWrapping");this.heightOracle=new Mk(i),this.stateDeco=sP(A),this.heightMap=hg.empty().applyChanges(this.stateDeco,Bn.empty,this.heightOracle.setDoc(A.doc),[new jl(0,0,0,A.doc.length)]);for(let n=0;n<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());n++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=vt.set(this.lineGaps.map(n=>n.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let i=0;i<=1;i++){let n=i?A.head:A.anchor;if(!e.some(({from:o,to:a})=>n>=o&&n<=a)){let{from:o,to:a}=this.lineBlockAt(n);e.push(new oQ(o,a))}}return this.viewports=e.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?rP:new Fk(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(n3(e,this.scaler))})}update(e,A=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=sP(this.state);let n=e.changedRanges,o=jl.extendWithRanges(n,A3A(i,this.stateDeco,e?e.changes:Rr.empty(this.state.doc.length))),a=this.heightMap.height,r=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);oP(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=a||dQ)&&(e.flags|=2),r?(this.scrollAnchorPos=e.changes.mapPos(r.from,-1),this.scrollAnchorHeight=r.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=a);let s=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heads.to)||!this.viewportIsAppropriate(s))&&(s=this.getViewport(0,A));let g=s.from!=this.viewport.from||s.to!=this.viewport.to;this.viewport=s,e.flags|=this.updateForViewport(),(g||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(OP)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,A=e.contentDOM,i=window.getComputedStyle(A),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?go.RTL:go.LTR;let a=this.heightOracle.mustRefreshForWrapping(o)||this.mustMeasureContent==="refresh",r=A.getBoundingClientRect(),s=a||this.mustMeasureContent||this.contentDOMHeight!=r.height;this.contentDOMHeight=r.height,this.mustMeasureContent=!1;let g=0,l=0;if(r.width&&r.height){let{scaleX:v,scaleY:F}=bP(A,r);(v>.005&&Math.abs(this.scaleX-v)>.005||F>.005&&Math.abs(this.scaleY-F)>.005)&&(this.scaleX=v,this.scaleY=F,g|=16,a=s=!0)}let C=(parseInt(i.paddingTop)||0)*this.scaleY,I=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=C||this.paddingBottom!=I)&&(this.paddingTop=C,this.paddingBottom=I,g|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(s=!0),this.editorWidth=e.scrollDOM.clientWidth,g|=16);let d=MP(this.view.contentDOM,!1).y;d!=this.scrollParent&&(this.scrollParent=d,this.scrollAnchorHeight=-1,this.scrollOffset=0);let B=this.getScrollOffset();this.scrollOffset!=B&&(this.scrollAnchorHeight=-1,this.scrollOffset=B),this.scrolledToBottom=SP(this.scrollParent||e.win);let Q=(this.printing?i3A:e3A)(A,this.paddingTop),E=Q.top-this.pixelViewport.top,f=Q.bottom-this.pixelViewport.bottom;this.pixelViewport=Q;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(s=!0)),!this.inView&&!this.scrollTarget&&!t3A(e.dom))return 0;let R=r.width;if((this.contentDOMWidth!=R||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=r.width,this.editorHeight=e.scrollDOM.clientHeight,g|=16),s){let v=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(v)&&(a=!0),a||n.lineWrapping&&Math.abs(R-this.contentDOMWidth)>n.charWidth){let{lineHeight:F,charWidth:G,textHeight:U}=e.docView.measureTextSize();a=F>0&&n.refresh(o,F,G,U,Math.max(5,R/G),v),a&&(e.docView.minWidth=0,g|=16)}E>0&&f>0?l=Math.max(E,f):E<0&&f<0&&(l=Math.min(E,f)),oP();for(let F of this.viewports){let G=F.from==this.viewport.from?v:e.docView.measureVisibleLineHeights(F);this.heightMap=(a?hg.empty().applyChanges(this.stateDeco,Bn.empty,this.heightOracle,[new jl(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,a,new kk(F.from,G))}dQ&&(g|=2)}let M=!this.viewportIsAppropriate(this.viewport,l)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return M&&(g&2&&(g|=this.updateScaler()),this.viewport=this.getViewport(l,this.scrollTarget),g|=this.updateForViewport()),(g&2||M)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(a?[]:this.lineGaps,e)),g|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),g}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:a,visibleBottom:r}=this,s=new oQ(n.lineAt(a-i*1e3,Po.ByHeight,o,0,0).from,n.lineAt(r+(1-i)*1e3,Po.ByHeight,o,0,0).to);if(A){let{head:g}=A.range;if(gs.to){let l=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),C=n.lineAt(g,Po.ByPos,o,0,0),I;A.y=="center"?I=(C.top+C.bottom)/2-l/2:A.y=="start"||A.y=="nearest"&&g=r+Math.max(10,Math.min(i,250)))&&n>a-2*1e3&&o>1,a=n<<1;if(this.defaultTextDirection!=go.LTR&&!i)return[];let r=[],s=(l,C,I,d)=>{if(C-ll&&ff.from>=I.from&&f.to<=I.to&&Math.abs(f.from-l)f.fromb));if(!E){if(CR.from<=C&&R.to>=C)){let R=A.moveToLineBoundary(ce.cursor(C),!1,!0).head;R>l&&(C=R)}let f=this.gapSize(I,l,C,d),b=i||f<2e6?f:2e6;E=new C3(l,C,f,b)}r.push(E)},g=l=>{if(l.length2e6)for(let F of e)F.from>=l.from&&F.froml.from&&s(l.from,d,l,C),BA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let i=[];zn.spans(A,this.viewport.from,this.viewport.to,{span(o,a){i.push({from:o,to:a})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||n3(this.heightMap.lineAt(e,Po.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||n3(this.heightMap.lineAt(this.scaler.fromDOM(e),Po.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return(this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top)*this.scaleY}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return n3(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},oQ=class{constructor(e,A){this.from=e,this.to=A}};function n3A(t,e,A){let i=[],n=t,o=0;return zn.spans(A,t,e,{span(){},point(a,r){a>n&&(i.push({from:n,to:a}),o+=a-n),n=r}},20),n=1)return e[e.length-1].to;let i=Math.floor(t*A);for(let n=0;;n++){let{from:o,to:a}=e[n],r=a-o;if(i<=r)return o+i;i-=r}}function k8(t,e){let A=0;for(let{from:i,to:n}of t.ranges){if(e<=n){A+=e-i;break}A+=n-i}return A/t.total}function o3A(t,e){for(let A of t)if(e(A))return A}var rP={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}};function sP(t){let e=t.facet(n5).filter(i=>typeof i!="function"),A=t.facet(eS).filter(i=>typeof i!="function");return A.length&&e.push(zn.join(A)),e}var Fk=class t{constructor(e,A,i){let n=0,o=0,a=0;this.viewports=i.map(({from:r,to:s})=>{let g=A.lineAt(r,Po.ByPos,e,0,0).top,l=A.lineAt(s,Po.ByPos,e,0,0).bottom;return n+=l-g,{from:r,to:s,top:g,bottom:l,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let r of this.viewports)r.domTop=a+(r.top-o)*this.scale,a=r.domBottom=r.domTop+(r.bottom-r.top),o=r.bottom}toDOM(e){for(let A=0,i=0,n=0;;A++){let o=AA.from==e.viewports[i].from&&A.to==e.viewports[i].to):!1}};function n3(t,e){if(e.scale==1)return t;let A=e.toDOM(t.top),i=e.toDOM(t.bottom);return new Pl(t.from,t.length,A,i-A,Array.isArray(t._content)?t._content.map(n=>n3(n,e)):t._content)}var S8=qe.define({combine:t=>t.join(" ")}),WM=qe.define({combine:t=>t.indexOf(!0)>-1}),Lk=Xg.newName(),lj=Xg.newName(),cj=Xg.newName(),Cj={"&light":"."+lj,"&dark":"."+cj};function _k(t,e,A){return new Xg(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,n=>{if(n=="&")return t;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):t+" "+i}})}var a3A=_k("."+Lk,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Cj),r3A={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},ZM=ot.ie&&ot.ie_version<=11,Gk=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new rk,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let i of A)this.queue.push(i);(ot.ie&&ot.ie_version<=11||ot.ios&&e.composing)&&A.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&ot.android&&e.constructor.EDIT_CONTEXT!==!1&&!(ot.chrome&&ot.chrome_version<126)&&(this.editContext=new Kk(e),e.state.facet(W0)&&(e.contentDOM.editContext=this.editContext.editContext)),ZM&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,i)=>A!=e[i]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(W0)?i.root.activeElement!=this.dom:!a3(this.dom,n))return;let o=n.anchorNode&&i.docView.tile.nearest(n.anchorNode);if(o&&o.isWidget()&&o.widget.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(ot.ie&&ot.ie_version<=11||ot.android&&ot.chrome)&&!i.state.selection.main.empty&&n.focusNode&&r3(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=E3(e.root);if(!A)return!1;let i=ot.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&s3A(this.view,A)||A;if(!i||this.selectionRange.eq(i))return!1;let n=a3(this.dom,i);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&gQ(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,i=-1,n=!1;for(let o of e){let a=this.readMutation(o);a&&(a.typeOver&&(n=!0),A==-1?{from:A,to:i}=a:(A=Math.min(a.from,A),i=Math.max(a.to,i)))}return{from:A,to:i,typeOver:n}}readChange(){let{from:e,to:A,typeOver:i}=this.processRecords(),n=this.selectionChanged&&a3(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new wk(this.view,e,A,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let i=this.view.state,n=Aj(this.view,A);return this.view.state==i&&(A.domChanged||A.newSel&&!j8(this.view.state.selection,A.newSel.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.tile.nearest(e.target);if(!A||A.isWidget())return null;if(A.markDirty(e.type=="attributes"),e.type=="childList"){let i=gP(A,e.previousSibling||e.target.previousSibling,-1),n=gP(A,e.nextSibling||e.target.nextSibling,1);return{from:i?A.posAfter(i):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(W0)!=e.state.facet(W0)&&(e.view.contentDOM.editContext=e.state.facet(W0)?this.editContext.editContext:null))}destroy(){var e,A,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function gP(t,e,A){for(;e;){let i=sa.get(e);if(i&&i.parent==t)return i;let n=e.parentNode;e=n!=t.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function lP(t,e){let A=e.startContainer,i=e.startOffset,n=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor,1);return r3(a.node,a.offset,n,o)&&([A,i,n,o]=[n,o,A,i]),{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}}function s3A(t,e){if(e.getComposedRanges){let n=e.getComposedRanges(t.root)[0];if(n)return lP(t,n)}let A=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),A?lP(t,A):null}var Kk=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let n=e.state.selection.main,{anchor:o,head:a}=n,r=this.toEditorPos(i.updateRangeStart),s=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:r,drifted:!1});let g=s-r>i.text.length;r==this.from&&othis.to&&(s=o);let l=ej(e.state.sliceDoc(r,s),i.text,(g?n.from:n.to)-r,g?"end":null);if(!l){let I=ce.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));j8(I,n)||e.dispatch({selection:I,userEvent:"select"});return}let C={from:l.from+r,to:l.toA+r,insert:Bn.of(i.text.slice(l.from,l.toB).split(` `))};if((ot.mac||ot.android)&&C.from==a-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(C={from:r,to:s,insert:Bn.of([i.text.replace("."," ")])}),this.pendingContextChange=C,!e.state.readOnly){let I=this.to-this.from+(C.to-C.from+C.insert.length);iS(e,C,ce.single(this.toEditorPos(i.selectionStart,I),this.toEditorPos(i.selectionEnd,I)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),C.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(A.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(A.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let a=this.toEditorPos(i.rangeStart),r=this.toEditorPos(i.rangeEnd);a{let n=[];for(let o of i.getTextFormats()){let a=o.underlineStyle,r=o.underlineThickness;if(!/none/i.test(a)&&!/none/i.test(r)){let s=this.toEditorPos(o.rangeStart),g=this.toEditorPos(o.rangeEnd);if(s{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)A.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=E3(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,i=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,a,r,s,g)=>{if(i)return;let l=g.length-(a-o);if(n&&a>=n.to)if(n.from==o&&n.to==a&&n.insert.eq(g)){n=this.pendingContextChange=null,A+=l,this.to+=l;return}else n=null,this.revertPending(e.state);if(o+=A,a+=A,a<=this.from)this.from+=l,this.to+=l;else if(othis.to||this.to-this.from+g.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(a),g.toString()),this.to+=l}A+=l}),n&&!i&&this.revertPending(e.state),!i}update(e){let A=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},ai=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(a=>n(a,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||t4A(A.parent)||document,this.viewState=new W8(this,A.state||Ga.create(A)),A.scrollTo&&A.scrollTo.is(y8)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(nQ).map(o=>new g3(o));for(let o of this.plugins)o.update(this);this.observer=new Gk(this),this.inputState=new yk(this),this.inputState.ensureHandlers(this.plugins),this.docView=new z8(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...A){let i=A.length==1&&A[0]instanceof Wc?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(i,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let i=!1,n=!1,o,a=this.state;for(let d of A){if(d.startState!=a)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");a=d.state}if(this.destroyed){this.viewState.state=a;return}let r=this.hasFocus,s=0,g=null;A.some(d=>d.annotation(rj))?(this.inputState.notifiedFocused=r,s=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,g=sj(a,r),g||(s=1));let l=this.observer.delayedAndroidKey,C=null;if(l?(this.observer.clearDelayedAndroidKey(),C=this.observer.readChange(),(C&&!this.state.doc.eq(a.doc)||!this.state.selection.eq(a.selection))&&(C=null)):this.observer.clear(),a.facet(Ga.phrases)!=this.state.facet(Ga.phrases))return this.setState(a);o=T8.create(this,a,A),o.flags|=s;let I=this.viewState.scrollTarget;try{this.updateState=2;for(let d of A){if(I&&(I=I.map(d.changes)),d.scrollIntoView){let{main:B}=d.state.selection;I=new s3(B.empty?B:ce.cursor(B.head,B.head>B.anchor?-1:1))}for(let B of d.effects)B.is(y8)&&(I=B.value.clip(this.state))}this.viewState.update(o,I),this.bidiCache=Z8.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(i3)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(i,A.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(S8)!=o.state.facet(S8)&&(this.viewState.mustMeasureContent=!0),(i||n||I||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let d of this.state.facet(PM))try{d(o)}catch(B){dr(this.state,B,"update listener")}(g||C)&&Promise.resolve().then(()=>{g&&this.state==g.startState&&this.dispatch(g),C&&!Aj(this,C)&&l.force&&gQ(this.contentDOM,l.key,l.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new W8(this,A),this.plugins=A.facet(nQ).map(n=>new g3(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new z8(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(A){let i=A.startState.facet(nQ),n=A.state.facet(nQ);if(i!=n){let o=[];for(let a of n){let r=i.indexOf(a);if(r<0)o.push(new g3(a));else{let s=this.plugins[r];s.mustUpdate=A,o.push(s)}}for(let a of this.plugins)a.mustUpdate!=A&&a.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let i=null,n=this.viewState.scrollParent,o=this.viewState.getScrollOffset(),{scrollAnchorPos:a,scrollAnchorHeight:r}=this.viewState;Math.abs(o-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let s=0;;s++){if(r<0)if(SP(n||this.win))a=-1,r=this.viewState.heightMap.height;else{let B=this.viewState.scrollAnchorAt(o);a=B.from,r=B.top}this.updateState=1;let g=this.viewState.measure();if(!g&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(s>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];g&4||([this.measureRequests,l]=[l,this.measureRequests]);let C=l.map(B=>{try{return B.read(this)}catch(Q){return dr(this.state,Q),cP}}),I=T8.create(this,this.state,[]),d=!1;I.flags|=g,i?i.flags|=g:i=I,this.updateState=2,I.empty||(this.updatePlugins(I),this.inputState.update(I),this.updateAttrs(),d=this.docView.update(I),d&&this.docViewUpdate());for(let B=0;B1||Q<-1)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){o=o+Q,n?n.scrollTop+=Q:this.win.scrollBy(0,Q),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let s of this.state.facet(PM))s(i)}get themeClasses(){return Lk+" "+(this.state.facet(WM)?cj:lj)+" "+this.state.facet(S8)}updateAttrs(){let A=CP(this,zz,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),i={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(W0)?"true":"false",class:"cm-content",style:`${ot.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(i["aria-readonly"]="true"),CP(this,ck,i);let n=this.observer.ignore(()=>{let o=Yz(this.contentDOM,this.contentAttrs,i),a=Yz(this.dom,this.editorAttrs,A);return o||a});return this.editorAttrs=A,this.contentAttrs=i,n}showAnnouncements(A){let i=!0;for(let n of A)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=""),i=!1;let a=this.announceDOM.appendChild(document.createElement("div"));a.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(i3);let A=this.state.facet(t.cspNonce);Xg.mount(this.root,this.styleModules.concat(a3A).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let i=0;in.plugin==A)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,i,n){return VM(this,A,Wz(this,A,i,n))}moveByGroup(A,i){return VM(this,A,Wz(this,A,i,n=>x4A(this,A.head,n)))}visualLineSide(A,i){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),a=n[i?n.length-1:0];return ce.cursor(a.side(i,o)+A.from,a.forward(!i,o)?1:-1)}moveToLineBoundary(A,i,n=!0){return S4A(this,A,i,n)}moveVertically(A,i,n){return VM(this,A,R4A(this,A,i,n))}domAtPos(A,i=1){return this.docView.domAtPos(A,i)}posAtDOM(A,i=0){return this.docView.posFromDOM(A,i)}posAtCoords(A,i=!0){this.readMeasured();let n=mk(this,A,i);return n&&n.pos}posAndSideAtCoords(A,i=!0){return this.readMeasured(),mk(this,A,i)}coordsAtPos(A,i=1){this.readMeasured();let n=this.docView.coordsAt(A,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),a=this.bidiSpans(o),r=a[el.find(a,A-o.from,-1,i)];return H8(n,r.dir==go.LTR==i>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(Oz)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>g3A)return _P(A.length);let i=this.textDirectionAt(A.from),n;for(let a of this.bidiCache)if(a.from==A.from&&a.dir==i&&(a.fresh||LP(a.isolates,n=Pz(this,A))))return a.order;n||(n=Pz(this,A));let o=l4A(A.text,i,n);return this.bidiCache.push(new Z8(A.from,A.to,i,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||ot.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{kP(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,i={}){return y8.of(new s3(typeof A=="number"?ce.cursor(A):A,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return y8.of(new s3(ce.cursor(n.from),"start","start",n.top-A,i,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return ho.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return ho.define(()=>({}),{eventObservers:A})}static theme(A,i){let n=Xg.newName(),o=[S8.of(n),i3.of(_k(`.${n}`,A))];return i&&i.dark&&o.push(WM.of(!0)),o}static baseTheme(A){return zl.lowest(i3.of(_k("."+Lk,A,Cj)))}static findFromDOM(A){var i;let n=A.querySelector(".cm-content"),o=n&&sa.get(n)||sa.get(A);return((i=o?.root)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=i3,t.inputHandler=HP,t.clipboardInputFilter=$k,t.clipboardOutputFilter=AS,t.scrollHandler=zP,t.focusChangeEffect=TP,t.perLineTextDirection=Oz,t.exceptionSink=YP,t.updateListener=PM,t.editable=W0,t.mouseSelectionStyle=JP,t.dragMovesSelection=UP,t.clickAddsSelectionRange=KP,t.decorations=n5,t.blockWrappers=jP,t.outerDecorations=eS,t.atomicRanges=u3,t.bidiIsolatedRanges=qP,t.scrollMargins=VP,t.darkTheme=WM,t.cspNonce=qe.define({combine:e=>e.length?e[0]:""}),t.contentAttributes=ck,t.editorAttributes=zz,t.lineWrapping=t.contentAttributes.of({class:"cm-lineWrapping"}),t.announce=Ui.define(),t})(),g3A=4096,cP={},Z8=class t{constructor(e,A,i,n,o,a){this.from=e,this.to=A,this.dir=i,this.isolates=n,this.fresh=o,this.order=a}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let i=[],n=e.length?e[e.length-1].dir:go.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=i[n],a=typeof o=="function"?o(t):o;a&&Wk(a,A)}return A}var l3A=ot.mac?"mac":ot.windows?"win":ot.linux?"linux":"key";function c3A(t,e){let A=t.split(/-(?!$)/),i=A[A.length-1];i=="Space"&&(i=" ");let n,o,a,r;for(let s=0;si.concat(n),[]))),A}function dj(t,e,A){return Bj(Ij(t.state),e,t,A)}var S2=null,I3A=4e3;function d3A(t,e=l3A){let A=Object.create(null),i=Object.create(null),n=(a,r)=>{let s=i[a];if(s==null)i[a]=r;else if(s!=r)throw new Error("Key binding "+a+" is used both as a regular binding and as a multi-stroke prefix")},o=(a,r,s,g,l)=>{var C,I;let d=A[a]||(A[a]=Object.create(null)),B=r.split(/ (?!$)/).map(f=>c3A(f,e));for(let f=1;f{let M=S2={view:R,prefix:b,scope:a};return setTimeout(()=>{S2==M&&(S2=null)},I3A),!0}]})}let Q=B.join(" ");n(Q,!1);let E=d[Q]||(d[Q]={preventDefault:!1,stopPropagation:!1,run:((I=(C=d._any)===null||C===void 0?void 0:C.run)===null||I===void 0?void 0:I.slice())||[]});s&&E.run.push(s),g&&(E.preventDefault=!0),l&&(E.stopPropagation=!0)};for(let a of t){let r=a.scope?a.scope.split(" "):["editor"];if(a.any)for(let g of r){let l=A[g]||(A[g]=Object.create(null));l._any||(l._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:C}=a;for(let I in l)l[I].run.push(d=>C(d,Uk))}let s=a[e]||a.key;if(s)for(let g of r)o(g,s,a.run,a.preventDefault,a.stopPropagation),a.shift&&o(g,"Shift-"+s,a.shift,a.preventDefault,a.stopPropagation)}return A}var Uk=null;function Bj(t,e,A,i){Uk=e;let n=_z(e),o=Fr(n,0),a=Eg(o)==n.length&&n!=" ",r="",s=!1,g=!1,l=!1;S2&&S2.view==A&&S2.scope==i&&(r=S2.prefix+" ",ij.indexOf(e.keyCode)<0&&(g=!0,S2=null));let C=new Set,I=E=>{if(E){for(let f of E.run)if(!C.has(f)&&(C.add(f),f(A)))return E.stopPropagation&&(l=!0),!0;E.preventDefault&&(E.stopPropagation&&(l=!0),g=!0)}return!1},d=t[i],B,Q;return d&&(I(d[r+x8(n,e,!a)])?s=!0:a&&(e.altKey||e.metaKey||e.ctrlKey)&&!(ot.windows&&e.ctrlKey&&e.altKey)&&!(ot.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(B=V0[e.keyCode])&&B!=n?(I(d[r+x8(B,e,!0)])||e.shiftKey&&(Q=tQ[e.keyCode])!=n&&Q!=B&&I(d[r+x8(Q,e,!1)]))&&(s=!0):a&&e.shiftKey&&I(d[r+x8(n,e,!0)])&&(s=!0),!s&&I(d._any)&&(s=!0)),g&&(s=!0),s&&l&&e.stopPropagation(),Uk=null,s}var E1=class t{constructor(e,A,i,n,o){this.className=e,this.left=A,this.top=i,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=Qj(e);return[new t(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return B3A(e,A,i)}};function Qj(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==go.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function dP(t,e,A,i){let n=t.coordsAtPos(e,A*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),a=(n.top+n.bottom)/2,r=t.posAtCoords({x:o.left+1,y:a}),s=t.posAtCoords({x:o.right-1,y:a});return r==null||s==null?i:{from:Math.max(i.from,Math.min(r,s)),to:Math.min(i.to,Math.max(r,s))}}function B3A(t,e,A){if(A.to<=t.viewport.from||A.from>=t.viewport.to)return[];let i=Math.max(A.from,t.viewport.from),n=Math.min(A.to,t.viewport.to),o=t.textDirection==go.LTR,a=t.contentDOM,r=a.getBoundingClientRect(),s=Qj(t),g=a.querySelector(".cm-line"),l=g&&window.getComputedStyle(g),C=r.left+(l?parseInt(l.paddingLeft)+Math.min(0,parseInt(l.textIndent)):0),I=r.right-(l?parseInt(l.paddingRight):0),d=fk(t,i,1),B=fk(t,n,-1),Q=d.type==Lr.Text?d:null,E=B.type==Lr.Text?B:null;if(Q&&(t.lineWrapping||d.widgetLineBreaks)&&(Q=dP(t,i,1,Q)),E&&(t.lineWrapping||B.widgetLineBreaks)&&(E=dP(t,n,-1,E)),Q&&E&&Q.from==E.from&&Q.to==E.to)return b(R(A.from,A.to,Q));{let v=Q?R(A.from,null,Q):M(d,!1),F=E?R(null,A.to,E):M(B,!0),G=[];return(Q||d).to<(E||B).from-(Q&&E?1:0)||d.widgetLineBreaks>1&&v.bottom+t.defaultLineHeight/2z&&P.from=eA)break;hA>nA&&AA(Math.max(aA,nA),v==null&&aA<=z,Math.min(hA,eA),F==null&&hA>=yA,iA.dir)}if(nA=dA.to+1,nA>=eA)break}return j.length==0&&AA(z,v==null,yA,F==null,t.textDirection),{top:U,bottom:Y,horizontal:j}}function M(v,F){let G=r.top+(F?v.top:v.bottom);return{top:G,bottom:G,horizontal:[]}}}function Q3A(t,e){return t.constructor==e.constructor&&t.eq(e)}var Jk=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(_8)!=e.state.facet(_8)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,i=e.facet(_8);for(;A!Q3A(A,this.drawn[i]))){let A=this.dom.firstChild,i=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[i].constructor&&n.update(A,this.drawn[i])?(A=A.nextSibling,i++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e,ot.safari&&ot.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},_8=qe.define();function Ej(t){return[ho.define(e=>new Jk(e,t)),_8.of(t)]}var BQ=qe.define({combine(t){return Ir(t,{cursorBlinkRate:1200,drawRangeCursor:!0,iosSelectionHandles:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function hj(t={}){return[BQ.of(t),E3A,h3A,u3A,OP.of(!0)]}function uj(t){return t.startState.facet(BQ)!=t.state.facet(BQ)}var E3A=Ej({above:!0,markers(t){let{state:e}=t,A=e.facet(BQ),i=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor&&!(o&&ot.ios&&A.iosSelectionHandles)){let a=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",r=n.empty?n:ce.cursor(n.head,n.assoc);for(let s of E1.forRange(t,a,r))i.push(s)}}return i},update(t,e){t.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=uj(t);return A&&BP(t.state,e),t.docChanged||t.selectionSet||A},mount(t,e){BP(e.state,t)},class:"cm-cursorLayer"});function BP(t,e){e.style.animationDuration=t.facet(BQ).cursorBlinkRate+"ms"}var h3A=Ej({above:!1,markers(t){let e=[],{main:A,ranges:i}=t.state.selection;for(let n of i)if(!n.empty)for(let o of E1.forRange(t,"cm-selectionBackground",n))e.push(o);if(ot.ios&&!A.empty&&t.state.facet(BQ).iosSelectionHandles){for(let n of E1.forRange(t,"cm-selectionHandle cm-selectionHandle-start",ce.cursor(A.from,1)))e.push(n);for(let n of E1.forRange(t,"cm-selectionHandle cm-selectionHandle-end",ce.cursor(A.to,1)))e.push(n)}return e},update(t,e){return t.docChanged||t.selectionSet||t.viewportChanged||uj(t)},class:"cm-selectionLayer"}),u3A=zl.highest(ai.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),fj=Ui.define({map(t,e){return t==null?null:e.mapPos(t)}}),o3=Qa.define({create(){return null},update(t,e){return t!=null&&(t=e.changes.mapPos(t)),e.effects.reduce((A,i)=>i.is(fj)?i.value:A,t)}}),f3A=ho.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let A=t.state.field(o3);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(o3)!=A||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(o3),A=e!=null&&t.coordsAtPos(e);if(!A)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:A.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:A.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:A.bottom-A.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/A+"px",this.cursor.style.height=t.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(o3)!=t&&this.view.dispatch({effects:fj.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function mj(){return[o3,f3A]}function QP(t,e,A,i,n){e.lastIndex=0;for(let o=t.iterRange(A,i),a=A,r;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)n(a+r.index,r)}function m3A(t,e){let A=t.visibleRanges;if(A.length==1&&A[0].from==t.viewport.from&&A[0].to==t.viewport.to)return A;let i=[];for(let{from:n,to:o}of A)n=Math.max(t.state.doc.lineAt(n).from,n-e),o=Math.min(t.state.doc.lineAt(o).to,o+e),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var Yk=class{constructor(e){let{regexp:A,decoration:i,decorate:n,boundary:o,maxLength:a=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(r,s,g,l)=>n(l,g,g+r[0].length,r,s);else if(typeof i=="function")this.addMatch=(r,s,g,l)=>{let C=i(r,s,g);C&&l(g,g+r[0].length,C)};else if(i)this.addMatch=(r,s,g,l)=>l(g,g+r[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=a}createDeco(e){let A=new Nr,i=A.add.bind(A);for(let{from:n,to:o}of m3A(e,this.maxLength))QP(e.state.doc,this.regexp,n,o,(a,r)=>this.addMatch(r,e,a,i));return A.finish()}updateDeco(e,A){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,a,r,s)=>{s>=e.view.viewport.from&&r<=e.view.viewport.to&&(i=Math.min(r,i),n=Math.max(s,n))}),e.viewportMoved||n-i>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),i,n):A}updateRange(e,A,i,n){for(let o of e.visibleRanges){let a=Math.max(o.from,i),r=Math.min(o.to,n);if(r>=a){let s=e.state.doc.lineAt(a),g=s.tos.from;a--)if(this.boundary.test(s.text[a-1-s.from])){l=a;break}for(;rI.push(f.range(Q,E));if(s==g)for(this.regexp.lastIndex=l-s.from;(d=this.regexp.exec(s.text))&&d.indexthis.addMatch(E,e,Q,B));A=A.update({filterFrom:l,filterTo:C,filter:(Q,E)=>QC,add:I})}}return A}},Hk=/x/.unicode!=null?"gu":"g",p3A=new RegExp(`[\0-\b -\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,Hk),D3A={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},XM=null;function w3A(){var t;if(XM==null&&typeof document<"u"&&document.body){let e=document.body.style;XM=((t=e.tabSize)!==null&&t!==void 0?t:e.MozTabSize)!=null}return XM||!1}var G8=qe.define({combine(t){let e=Ir(t,{render:null,specialChars:p3A,addSpecialChars:null});return(e.replaceTabs=!w3A())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,Hk)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Hk)),e}});function pj(t={}){return[G8.of(t),y3A()]}var EP=null;function y3A(){return EP||(EP=ho.fromClass(class{constructor(t){this.view=t,this.decorations=vt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(G8)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new Yk({regexp:t.specialChars,decoration:(e,A,i)=>{let{doc:n}=A.state,o=Fr(e[0],0);if(o==9){let a=n.lineAt(i),r=A.state.tabSize,s=q0(a.text,r,i-a.from);return vt.replace({widget:new Ok((r-s%r)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=vt.replace({widget:new Tk(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(G8);t.startState.facet(G8)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var v3A="\u2022";function b3A(t){return t>=32?v3A:t==10?"\u2424":String.fromCharCode(9216+t)}var Tk=class extends Ps{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=b3A(this.code),i=e.state.phrase("Control character")+" "+(D3A[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=i,o.setAttribute("aria-label",i),o.className="cm-specialChar",o}ignoreEvent(){return!1}},Ok=class extends Ps{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function Dj(){return k3A}var M3A=vt.line({class:"cm-activeLine"}),k3A=ho.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,A=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>e&&(A.push(M3A.range(n.from)),e=n.from)}return vt.set(A)}},{decorations:t=>t.decorations});var zk=2e3;function S3A(t,e,A){let i=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>zk||A.off>zk||e.col<0||A.col<0){let a=Math.min(e.off,A.off),r=Math.max(e.off,A.off);for(let s=i;s<=n;s++){let g=t.doc.line(s);g.length<=r&&o.push(ce.range(g.from+a,g.to+r))}}else{let a=Math.min(e.col,A.col),r=Math.max(e.col,A.col);for(let s=i;s<=n;s++){let g=t.doc.line(s),l=D8(g.text,a,t.tabSize,!0);if(l<0)o.push(ce.cursor(g.to));else{let C=D8(g.text,r,t.tabSize);o.push(ce.range(g.from+l,g.from+C))}}}return o}function x3A(t,e){let A=t.coordsAtPos(t.viewport.from);return A?Math.round(Math.abs((A.left-e)/t.defaultCharacterWidth)):-1}function hP(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1),i=t.state.doc.lineAt(A),n=A-i.from,o=n>zk?-1:n==i.length?x3A(t,e.clientX):q0(i.text,t.state.tabSize,A-i.from);return{line:i.number,col:o,off:n}}function R3A(t,e){let A=hP(t,e),i=t.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),a=n.state.doc.lineAt(o);A={line:a.number,col:A.col,off:Math.min(A.off,a.length)},i=i.map(n.changes)}},get(n,o,a){let r=hP(t,n);if(!r)return i;let s=S3A(t.state,A,r);return s.length?a?ce.create(s.concat(i.ranges)):ce.create(s):i}}:null}function wj(t){let e=t?.eventFilter||(A=>A.altKey&&A.button==0);return ai.mouseSelectionStyle.of((A,i)=>e(i)?R3A(A,i):null)}var N3A={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},F3A={style:"cursor: crosshair"};function yj(t={}){let[e,A]=N3A[t.key||"Alt"],i=ho.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[i,ai.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?F3A:null})]}var R8="-10000px",X8=class{constructor(e,A,i,n){this.facet=A,this.createTooltipView=i,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(a=>a);let o=null;this.tooltipViews=this.tooltips.map(a=>o=i(a,o))}update(e,A){var i;let n=e.state.facet(this.facet),o=n.filter(s=>s);if(n===this.input){for(let s of this.tooltipViews)s.update&&s.update(e);return!1}let a=[],r=A?[]:null;for(let s=0;sA[g]=s),A.length=r.length),this.input=n,this.tooltips=o,this.tooltipViews=a,!0}};function L3A(t){let e=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var $M=qe.define({combine:t=>{var e,A,i;return{position:ot.ios?"absolute":((e=t.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=t.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||L3A}}}),uP=new WeakMap,nS=ho.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet($M);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new X8(t,EQ,(A,i)=>this.createTooltip(A,i),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let A=e||t.geometryChanged,i=t.state.facet($M);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(t,e){let A=t.create(this.view),i=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),t.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=R8,A.dom.style.left="0px",this.container.insertBefore(A.dom,i),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var t,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(ot.safari){let a=o.getBoundingClientRect();A=Math.abs(a.top+1e4)>1||Math.abs(a.left)>1}else A=!!o.offsetParent&&o.offsetParent!=this.container.ownerDocument.body}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=tS(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,a)=>{let r=this.manager.tooltipViews[a];return r.getCoords?r.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet($M).tooltipSpace(this.view),scaleX:t,scaleY:e,makeAbsolute:A}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let r of this.manager.tooltipViews)r.dom.style.position="absolute"}let{visible:A,space:i,scaleX:n,scaleY:o}=t,a=[];for(let r=0;r=Math.min(A.bottom,i.bottom)||C.rightMath.min(A.right,i.right)+.1)){l.style.top=R8;continue}let d=s.arrow?g.dom.querySelector(".cm-tooltip-arrow"):null,B=d?7:0,Q=I.right-I.left,E=(e=uP.get(g))!==null&&e!==void 0?e:I.bottom-I.top,f=g.offset||G3A,b=this.view.textDirection==go.LTR,R=I.width>i.right-i.left?b?i.left:i.right-I.width:b?Math.max(i.left,Math.min(C.left-(d?14:0)+f.x,i.right-Q)):Math.min(Math.max(i.left,C.left-Q+(d?14:0)-f.x),i.right-Q),M=this.above[r];!s.strictSide&&(M?C.top-E-B-f.yi.bottom)&&M==i.bottom-C.bottom>C.top-i.top&&(M=this.above[r]=!M);let v=(M?C.top-i.top:i.bottom-C.bottom)-B;if(vR&&U.topF&&(F=M?U.top-E-2-B:U.bottom+B+2);if(this.position=="absolute"?(l.style.top=(F-t.parent.top)/o+"px",fP(l,(R-t.parent.left)/n)):(l.style.top=F/o+"px",fP(l,R/n)),d){let U=C.left+(b?f.x:-f.x)-(R+14-7);d.style.left=U/n+"px"}g.overlap!==!0&&a.push({left:R,top:F,right:G,bottom:F+E}),l.classList.toggle("cm-tooltip-above",M),l.classList.toggle("cm-tooltip-below",!M),g.positioned&&g.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=R8}},{eventObservers:{scroll(){this.maybeMeasure()}}});function fP(t,e){let A=parseInt(t.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(t.style.left=e+"px")}var _3A=ai.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),G3A={x:0,y:0},EQ=qe.define({enables:[nS,_3A]}),$8=qe.define({combine:t=>t.reduce((e,A)=>e.concat(A),[])}),A5=class t{static create(e){return new t(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new X8(e,$8,(A,i)=>this.createHostedView(A,i),A=>A.dom.remove())}createHostedView(e,A){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let i of this.manager.tooltipViews){let n=i[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},K3A=EQ.compute([$8],t=>{let e=t.facet($8);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var i;return(i=A.end)!==null&&i!==void 0?i:A.pos})),create:A5.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),Pk=class{constructor(e,A,i,n,o){this.view=e,this.source=A,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;er.bottom||A.xr.right+e.defaultCharacterWidth)return;let s=e.bidiSpans(e.state.doc.lineAt(n)).find(l=>l.from<=n&&l.to>=n),g=s&&s.dir==go.RTL?-1:1;o=A.x{this.pending==r&&(this.pending=null,s&&!(Array.isArray(s)&&!s.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(s)?s:[s])}))},s=>dr(e.state,s,"hover tooltip"))}else a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])})}get tooltip(){let e=this.view.plugin(nS),A=e?e.manager.tooltips.findIndex(i=>i.create==A5.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!U3A(o.dom,e)||this.pending){let{pos:a}=n[0]||this.pending,r=(i=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&i!==void 0?i:a;(a==r?this.view.posAtCoords(this.lastMove)!=a:!J3A(this.view,a,r,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=i=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),clearTimeout(this.restartTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},N8=4;function U3A(t,e){let{left:A,right:i,top:n,bottom:o}=t.getBoundingClientRect(),a;if(a=t.querySelector(".cm-tooltip-arrow")){let r=a.getBoundingClientRect();n=Math.min(r.top,n),o=Math.max(r.bottom,o)}return e.clientX>=A-N8&&e.clientX<=i+N8&&e.clientY>=n-N8&&e.clientY<=o+N8}function J3A(t,e,A,i,n,o){let a=t.scrollDOM.getBoundingClientRect(),r=t.documentTop+t.documentPadding.top+t.contentHeight;if(a.left>i||a.rightn||Math.min(a.bottom,r)=e&&s<=A}function vj(t,e={}){let A=Ui.define(),i=Qa.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(a=>!e.hideOn(o,a))),o.docChanged)){let a=[];for(let r of n){let s=o.changes.mapPos(r.pos,-1,xr.TrackDel);if(s!=null){let g=Object.assign(Object.create(null),r);g.pos=s,g.end!=null&&(g.end=o.changes.mapPos(g.end)),a.push(g)}}n=a}for(let a of o.effects)a.is(A)&&(n=a.value),a.is(Y3A)&&(n=[]);return n},provide:n=>$8.from(n)});return{active:i,extension:[i,ho.define(n=>new Pk(n,t,i,A,e.hoverTime||300)),K3A]}}function oS(t,e){let A=t.plugin(nS);if(!A)return null;let i=A.manager.tooltips.indexOf(e);return i<0?null:A.manager.tooltipViews[i]}var Y3A=Ui.define();var mP=qe.define({combine(t){let e,A;for(let i of t)e=e||i.topContainer,A=A||i.bottomContainer;return{topContainer:e,bottomContainer:A}}});function f3(t,e){let A=t.plugin(bj),i=A?A.specs.indexOf(e):-1;return i>-1?A.panels[i]:null}var bj=ho.fromClass(class{constructor(t){this.input=t.state.facet(m1),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(t));let e=t.state.facet(mP);this.top=new aQ(t,!0,e.topContainer),this.bottom=new aQ(t,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(t){let e=t.state.facet(mP);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new aQ(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new aQ(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=t.state.facet(m1);if(A!=this.input){let i=A.filter(s=>s),n=[],o=[],a=[],r=[];for(let s of i){let g=this.specs.indexOf(s),l;g<0?(l=s(t.view),r.push(l)):(l=this.panels[g],l.update&&l.update(t)),n.push(l),(l.top?o:a).push(l)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(a);for(let s of r)s.dom.classList.add("cm-panel"),s.mount&&s.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>ai.scrollMargins.of(e=>{let A=e.plugin(t);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),aQ=class{constructor(e,A,i){this.view=e,this.top=A,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=pP(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=pP(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function pP(t){let e=t.nextSibling;return t.remove(),e}var m1=qe.define({enables:bj});function Mj(t,e){let A,i=new Promise(a=>A=a),n=a=>H3A(a,e,A);t.state.field(Ak,!1)?t.dispatch({effects:kj.of(n)}):t.dispatch({effects:Ui.appendConfig.of(Ak.init(()=>[n]))});let o=Sj.of(n);return{close:o,result:i.then(a=>((t.win.queueMicrotask||(s=>t.win.setTimeout(s,10)))(()=>{t.state.field(Ak).indexOf(n)>-1&&t.dispatch({effects:o})}),a))}}var Ak=Qa.define({create(){return[]},update(t,e){for(let A of e.effects)A.is(kj)?t=[A.value].concat(t):A.is(Sj)&&(t=t.filter(i=>i!=A.value));return t},provide:t=>m1.computeN([t],e=>e.field(t))}),kj=Ui.define(),Sj=Ui.define();function H3A(t,e,A){let i=e.content?e.content(t,()=>a(null)):null;if(!i){if(i=Pn("form"),e.input){let r=Pn("input",e.input);/^(text|password|number|email|tel|url)$/.test(r.type)&&r.classList.add("cm-textfield"),r.name||(r.name="input"),i.appendChild(Pn("label",(e.label||"")+": ",r))}else i.appendChild(document.createTextNode(e.label||""));i.appendChild(document.createTextNode(" ")),i.appendChild(Pn("button",{class:"cm-button",type:"submit"},e.submitLabel||"OK"))}let n=i.nodeName=="FORM"?[i]:i.querySelectorAll("form");for(let r=0;r{g.keyCode==27?(g.preventDefault(),a(null)):g.keyCode==13&&(g.preventDefault(),a(s))}),s.addEventListener("submit",g=>{g.preventDefault(),a(s)})}let o=Pn("div",i,Pn("button",{onclick:()=>a(null),"aria-label":t.state.phrase("close"),class:"cm-dialog-close",type:"button"},["\xD7"]));e.class&&(o.className=e.class),o.classList.add("cm-dialog");function a(r){o.contains(o.ownerDocument.activeElement)&&t.focus(),A(r)}return{dom:o,top:e.top,mount:()=>{if(e.focus){let r;typeof e.focus=="string"?r=i.querySelector(e.focus):r=i.querySelector("input")||i.querySelector("button"),r&&"select"in r?r.select():r&&"focus"in r&&r.focus()}}}}var qs=class extends Zg{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};qs.prototype.elementClass="";qs.prototype.toDOM=void 0;qs.prototype.mapMode=xr.TrackBefore;qs.prototype.startSide=qs.prototype.endSide=-1;qs.prototype.point=!0;var K8=qe.define(),T3A=qe.define(),O3A={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>zn.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},I3=qe.define();function a5(t){return[xj(),I3.of(BA(BA({},O3A),t))]}var jk=qe.define({combine:t=>t.some(e=>e)});function xj(t){let e=[z3A];return t&&t.fixed===!1&&e.push(jk.of(!0)),e}var z3A=ho.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(I3).map(e=>new e5(t,e)),this.fixed=!t.state.facet(jk);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let e=this.prevViewport,A=t.view.viewport,i=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(i<(A.to-A.from)*.8)}if(t.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(jk)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=zn.iter(this.view.state.facet(K8),this.view.viewport.from),i=[],n=this.gutters.map(o=>new Vk(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let a=!0;for(let r of o.type)if(r.type==Lr.Text&&a){qk(A,i,r.from);for(let s of n)s.line(this.view,r,i);a=!1}else if(r.widget)for(let s of n)s.widget(this.view,r)}else if(o.type==Lr.Text){qk(A,i,o.from);for(let a of n)a.line(this.view,o,i)}else if(o.widget)for(let a of n)a.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let e=t.startState.facet(I3),A=t.state.facet(I3),i=t.docChanged||t.heightChanged||t.viewportChanged||!zn.eq(t.startState.facet(K8),t.state.facet(K8),t.view.viewport.from,t.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of A){let a=e.indexOf(o);a<0?n.push(new e5(this.view,o)):(this.gutters[a].update(t),n.push(this.gutters[a]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>ai.scrollMargins.of(e=>{let A=e.plugin(t);if(!A||A.gutters.length==0||!A.fixed)return null;let i=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==go.LTR?{left:i,right:n}:{right:i,left:n}})});function DP(t){return Array.isArray(t)?t:[t]}function qk(t,e,A){for(;t.value&&t.from<=A;)t.from==A&&e.push(t.value),t.next()}var Vk=class{constructor(e,A,i){this.gutter=e,this.height=i,this.i=0,this.cursor=zn.iter(e.markers,A.from)}addElement(e,A,i){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,a=A.height/e.scaleY;if(this.i==n.elements.length){let r=new t5(e,a,o,i);n.elements.push(r),n.dom.appendChild(r.dom)}else n.elements[this.i].update(e,a,o,i);this.height=A.bottom,this.i++}line(e,A,i){let n=[];qk(this.cursor,n,A.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let a=this.gutter;n.length==0&&!a.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let i=this.gutter.config.widgetMarker(e,A.widget,A),n=i?[i]:null;for(let o of e.state.facet(T3A)){let a=o(e,A.widget,A);a&&(n||(n=[])).push(a)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},e5=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in A.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,a;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let s=o.getBoundingClientRect();a=(s.top+s.bottom)/2}else a=n.clientY;let r=e.lineBlockAtHeight(a-e.documentTop);A.domEventHandlers[i](e,r,n)&&n.preventDefault()});this.markers=DP(A.markers(e)),A.initialSpacer&&(this.spacer=new t5(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=DP(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let i=e.view.viewport;return!zn.eq(this.markers,A,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},t5=class{constructor(e,A,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,i,n)}update(e,A,i,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),P3A(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let i="cm-gutterElement",n=this.dom.firstChild;for(let o=0,a=0;;){let r=a,s=oo(r,s,g)||a(r,s,g):a}return i}})}}),d3=class extends qs{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function ek(t,e){return t.state.facet(rQ).formatNumber(e,t.state)}var V3A=I3.compute([rQ],t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(j3A)},lineMarker(e,A,i){return i.some(n=>n.toDOM)?null:new d3(ek(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,i)=>{for(let n of e.state.facet(q3A)){let o=n(e,A,i);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(rQ)!=e.state.facet(rQ),initialSpacer(e){return new d3(ek(e,wP(e.state.doc.lines)))},updateSpacer(e,A){let i=ek(A.view,wP(A.view.state.doc.lines));return i==e.number?e:new d3(i)},domEventHandlers:t.facet(rQ).domEventHandlers,side:"before"}));function Rj(t={}){return[rQ.of(t),xj(),V3A]}function wP(t){let e=9;for(;e{let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>A&&(A=n,e.push(W3A.range(n)))}return zn.of(e)});function Nj(){return Z3A}var X3A=0,m3=class{constructor(e,A){this.from=e,this.to=A}},wi=class{constructor(e={}){this.id=X3A++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=ts.match(e)),A=>{let i=e(A);return i===void 0?null:[this,i]}}};wi.closedBy=new wi({deserialize:t=>t.split(" ")});wi.openedBy=new wi({deserialize:t=>t.split(" ")});wi.group=new wi({deserialize:t=>t.split(" ")});wi.isolate=new wi({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}});wi.contextHash=new wi({perNode:!0});wi.lookAhead=new wi({perNode:!0});wi.mounted=new wi({perNode:!0});var p1=class{constructor(e,A,i,n=!1){this.tree=e,this.overlay=A,this.parser=i,this.bracketed=n}static get(e){return e&&e.props&&e.props[wi.mounted.id]}},$3A=Object.create(null),ts=class t{constructor(e,A,i,n=0){this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):$3A,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(wi.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let i in e)for(let n of i.split(" "))A[n]=e[i];return i=>{for(let n=i.prop(wi.group),o=-1;o<(n?n.length:0);o++){let a=A[o<0?i.name:n[o]];if(a)return a}}}};ts.none=new ts("",Object.create(null),0,8);var p3=class t{constructor(e){this.types=e;for(let A=0;A0;for(let s=this.cursor(a|Ea.IncludeAnonymous);;){let g=!1;if(s.from<=o&&s.to>=n&&(!r&&s.type.isAnonymous||A(s)!==!1)){if(s.firstChild())continue;g=!0}for(;g&&i&&(r||!s.type.isAnonymous)&&i(s),!s.nextSibling();){if(!s.parent())return;g=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:CS(ts.none,this.children,this.positions,0,this.children.length,0,this.length,(A,i,n)=>new t(this.type,A,i,n,this.propValues),e.makeTree||((A,i,n)=>new t(ts.none,A,i,n)))}static build(e){return euA(e)}};Ma.empty=new Ma(ts.none,[],[],0);var aS=class t{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},N2=class t{constructor(e,A,i){this.buffer=e,this.length=A,this.set=i}get type(){return ts.none}toString(){let e=[];for(let A=0;A0));s=a[s+3]);return r}slice(e,A,i){let n=this.buffer,o=new Uint16Array(A-e),a=0;for(let r=e,s=0;r=e&&Ae;case 1:return A<=e&&i>e;case 2:return i>e;case 4:return!0}}function D3(t,e,A,i){for(var n;t.from==t.to||(A<1?t.from>=e:t.from>e)||(A>-1?t.to<=e:t.to0?r.length:-1;e!=g;e+=A){let l=r[e],C=s[e]+a.from,I;if(!(!(o&Ea.EnterBracketed&&l instanceof Ma&&(I=p1.get(l))&&!I.overlay&&I.bracketed&&i>=C&&i<=C+l.length)&&!Gj(n,i,C,C+l.length))){if(l instanceof N2){if(o&Ea.ExcludeBuffers)continue;let d=l.findChild(0,l.buffer.length,A,i-C,n);if(d>-1)return new w3(new sS(a,l,e,C),null,d)}else if(o&Ea.IncludeAnonymous||!l.type.isAnonymous||cS(l)){let d;if(!(o&Ea.IgnoreMounts)&&(d=p1.get(l))&&!d.overlay)return new t(d.tree,C,e,a);let B=new t(l,C,e,a);return o&Ea.IncludeAnonymous||!B.type.isAnonymous?B:B.nextChild(A<0?l.children.length-1:0,A,i,n,o)}}}if(o&Ea.IncludeAnonymous||!a.type.isAnonymous||(a.index>=0?e=a.index+A:e=A<0?-1:a._parent._tree.children.length,a=a._parent,!a))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,A,i=0){let n;if(!(i&Ea.IgnoreOverlays)&&(n=p1.get(this._tree))&&n.overlay){let o=e-this.from,a=i&Ea.EnterBracketed&&n.bracketed;for(let{from:r,to:s}of n.overlay)if((A>0||a?r<=o:r=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Lj(t,e,A,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let a=!1;!a;)if(a=n.type.is(A),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function rS(t,e,A=e.length-1){for(let i=t;A>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[A]&&e[A]!=i.name)return!1;A--}}return!0}var sS=class{constructor(e,A,i,n){this.parent=e,this.buffer=A,this.index=i,this.start=n}},w3=class t extends g5{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,i){super(),this.context=e,this._parent=A,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,A,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,A,i=0){if(i&Ea.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new t(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new t(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let a=i.buffer[this.index+1];e.push(i.slice(n,o,a)),A.push(0)}return new Ma(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Kj(t){if(!t.length)return null;let e=0,A=t[0];for(let o=1;oA.from||a.to=e){let r=new A0(a.tree,a.overlay[0].from+o.from,-1,o);(n||(n=[i])).push(D3(r,e,A,!1))}}return n?Kj(n):i}var y3=class{get name(){return this.type.name}constructor(e,A=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=A&~Ea.EnterBracketed,e instanceof A0)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:i,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=i+n.buffer[e+1],this.to=i+n.buffer[e+2],!0}yield(e){return e?e instanceof A0?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,i=this.mode){return this.buffer?i&Ea.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ea.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ea.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,i=this.stack.length-1;if(e<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(i<0?A.buffer.length:A.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,i,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,a=e<0?-1:i._tree.children.length;o!=a;o+=e){let r=i._tree.children[o];if(this.mode&Ea.IncludeAnonymous||r instanceof N2||!r.type.isAnonymous||cS(r))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let a=e;a;a=a._parent)if(a.index==n){if(n==this.index)return a;A=a,i=o+1;break A}n=this.stack[--o]}for(let n=i;n=0;o--){if(o<0)return rS(this._tree,e,n);let a=i[A.buffer[this.stack[o]]];if(!a.isAnonymous){if(e[n]&&e[n]!=a.name)return!1;n--}}return!0}};function cS(t){return t.children.some(e=>e instanceof N2||!e.type.isAnonymous||cS(e))}function euA(t){var e;let{buffer:A,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:a=i.types.length}=t,r=Array.isArray(A)?new aS(A,A.length):A,s=i.types,g=0,l=0;function C(v,F,G,U,Y,j){let{id:AA,start:z,end:yA,size:P}=r,nA=l,eA=g;if(P<0)if(r.next(),P==-1){let JA=o[AA];G.push(JA),U.push(z-v);return}else if(P==-3){g=AA;return}else if(P==-4){l=AA;return}else throw new RangeError(`Unrecognized record size: ${P}`);let dA=s[AA],iA,aA,hA=z-v;if(yA-z<=n&&(aA=E(r.pos-F,Y))){let JA=new Uint16Array(aA.size-aA.skip),ee=r.pos-aA.size,UA=JA.length;for(;r.pos>ee;)UA=f(aA.start,JA,UA);iA=new N2(JA,yA-aA.start,i),hA=aA.start-v}else{let JA=r.pos-P;r.next();let ee=[],UA=[],mA=AA>=a?AA:-1,KA=0,ze=yA;for(;r.pos>JA;)mA>=0&&r.id==mA&&r.size>=0?(r.end<=ze-n&&(B(ee,UA,z,KA,r.end,ze,mA,nA,eA),KA=ee.length,ze=r.end),r.next()):j>2500?I(z,JA,ee,UA):C(z,JA,ee,UA,mA,j+1);if(mA>=0&&KA>0&&KA-1&&KA>0){let Ke=d(dA,eA);iA=CS(dA,ee,UA,0,ee.length,0,yA-z,Ke,Ke)}else iA=Q(dA,ee,UA,yA-z,nA-yA,eA)}G.push(iA),U.push(hA)}function I(v,F,G,U){let Y=[],j=0,AA=-1;for(;r.pos>F;){let{id:z,start:yA,end:P,size:nA}=r;if(nA>4)r.next();else{if(AA>-1&&yA=0;P-=3)z[nA++]=Y[P],z[nA++]=Y[P+1]-yA,z[nA++]=Y[P+2]-yA,z[nA++]=nA;G.push(new N2(z,Y[2]-yA,i)),U.push(yA-v)}}function d(v,F){return(G,U,Y)=>{let j=0,AA=G.length-1,z,yA;if(AA>=0&&(z=G[AA])instanceof Ma){if(!AA&&z.type==v&&z.length==Y)return z;(yA=z.prop(wi.lookAhead))&&(j=U[AA]+z.length+yA)}return Q(v,G,U,Y,j,F)}}function B(v,F,G,U,Y,j,AA,z,yA){let P=[],nA=[];for(;v.length>U;)P.push(v.pop()),nA.push(F.pop()+G-Y);v.push(Q(i.types[AA],P,nA,j-Y,z-j,yA)),F.push(Y-G)}function Q(v,F,G,U,Y,j,AA){if(j){let z=[wi.contextHash,j];AA=AA?[z].concat(AA):[z]}if(Y>25){let z=[wi.lookAhead,Y];AA=AA?[z].concat(AA):[z]}return new Ma(v,F,G,U,AA)}function E(v,F){let G=r.fork(),U=0,Y=0,j=0,AA=G.end-n,z={size:0,start:0,skip:0};A:for(let yA=G.pos-v;G.pos>yA;){let P=G.size;if(G.id==F&&P>=0){z.size=U,z.start=Y,z.skip=j,j+=4,U+=4,G.next();continue}let nA=G.pos-P;if(P<0||nA=a?4:0,dA=G.start;for(G.next();G.pos>nA;){if(G.size<0)if(G.size==-3||G.size==-4)eA+=4;else break A;else G.id>=a&&(eA+=4);G.next()}Y=dA,U+=P,j+=eA}return(F<0||U==v)&&(z.size=U,z.start=Y,z.skip=j),z.size>4?z:void 0}function f(v,F,G){let{id:U,start:Y,end:j,size:AA}=r;if(r.next(),AA>=0&&U4){let yA=r.pos-(AA-4);for(;r.pos>yA;)G=f(v,F,G)}F[--G]=z,F[--G]=j-v,F[--G]=Y-v,F[--G]=U}else AA==-3?g=U:AA==-4&&(l=U);return G}let b=[],R=[];for(;r.pos>0;)C(t.start||0,t.bufferStart||0,b,R,-1,0);let M=(e=t.length)!==null&&e!==void 0?e:b.length?R[0]+b[0].length:0;return new Ma(s[t.topID],b.reverse(),R.reverse(),M)}var _j=new WeakMap;function s5(t,e){if(!t.isAnonymous||e instanceof N2||e.type!=t)return 1;let A=_j.get(e);if(A==null){A=1;for(let i of e.children){if(i.type!=t||!(i instanceof Ma)){A=1;break}A+=s5(t,i)}_j.set(e,A)}return A}function CS(t,e,A,i,n,o,a,r,s){let g=0;for(let B=i;B=l)break;F+=G}if(R==M+1){if(F>l){let G=B[M];d(G.children,G.positions,0,G.children.length,Q[M]+b);continue}C.push(B[M])}else{let G=Q[R-1]+B[R-1].length-v;C.push(CS(t,B,Q,M,R,v,G,null,s))}I.push(v+b-o)}}return d(e,A,i,n,0),(r||s)(C,I,a)}var D1=class t{constructor(e,A,i,n,o=!1,a=!1){this.from=e,this.to=A,this.tree=i,this.offset=n,this.open=(o?1:0)|(a?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],i=!1){let n=[new t(0,e.length,e,0,!1,i)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,i=128){if(!A.length)return e;let n=[],o=1,a=e.length?e[0]:null;for(let r=0,s=0,g=0;;r++){let l=r=i)for(;a&&a.from=I.from||C<=I.to||g){let d=Math.max(I.from,s)-g,B=Math.min(I.to,C)-g;I=d>=B?null:new t(d,B,I.tree,I.offset+g,r>0,!!l)}if(I&&n.push(I),a.to>C)break;a=onew m3(n.from,n.to)):[new m3(0,0)]:[new m3(0,e.length)],this.createParse(e,A||[],i)}parse(e,A,i){let n=this.startParse(e,A,i);for(;;){let o=n.advance();if(o)return o}}},lS=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var K1e=new wi({perNode:!0});var tuA=0,Vl=class t{constructor(e,A,i,n){this.name=e,this.set=A,this.base=i,this.modified=n,this.id=tuA++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let i=typeof e=="string"?e:"?";if(e instanceof t&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new t(i,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new I5(e);return i=>i.modified.indexOf(A)>-1?i:I5.get(i.base||i,i.modified.concat(A).sort((n,o)=>n.id-o.id))}},iuA=0,I5=class t{constructor(e){this.name=e,this.instances=[],this.id=iuA++}static get(e,A){if(!A.length)return e;let i=A[0].instances.find(r=>r.base==e&&nuA(A,r.modified));if(i)return i;let n=[],o=new Vl(e.name,n,e,A);for(let r of A)r.instances.push(o);let a=ouA(A);for(let r of e.set)if(!r.modified.length)for(let s of a)n.push(t.get(r,s));return o}};function nuA(t,e){return t.length==e.length&&t.every((A,i)=>A==e[i])}function ouA(t){let e=[[]];for(let A=0;Ai.length-A.length)}function d5(t){let e=Object.create(null);for(let A in t){let i=t[A];Array.isArray(i)||(i=[i]);for(let n of A.split(" "))if(n){let o=[],a=2,r=n;for(let C=0;;){if(r=="..."&&C>0&&C+3==n.length){a=1;break}let I=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!I)throw new RangeError("Invalid path: "+n);if(o.push(I[0]=="*"?"":I[0][0]=='"'?JSON.parse(I[0]):I[0]),C+=I[0].length,C==n.length)break;let d=n[C++];if(C==n.length&&d=="!"){a=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);r=n.slice(C)}let s=o.length-1,g=o[s];if(!g)throw new RangeError("Invalid path: "+n);let l=new y1(i,a,s>0?o.slice(0,s):null);e[g]=l.sort(e[g])}}return Yj.add(e)}var Yj=new wi({combine(t,e){let A,i,n;for(;t||e;){if(!t||e&&t.depth>=e.depth?(n=e,e=e.next):(n=t,t=t.next),A&&A.mode==n.mode&&!n.context&&!A.context)continue;let o=new y1(n.tags,n.mode,n.context);A?A.next=o:i=o,A=o}return i}}),y1=class{constructor(e,A,i,n){this.tags=e,this.mode=A,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let a=n;for(let r of o)for(let s of r.set){let g=A[s.id];if(g){a=a?a+" "+g:g;break}}return a},scope:i}}function auA(t,e){let A=null;for(let i of t){let n=i.style(e);n&&(A=A?A+" "+n:n)}return A}function Hj(t,e,A,i=0,n=t.length){let o=new dS(i,Array.isArray(e)?e:[e],A);o.highlightRange(t.cursor(),i,n,"",o.highlighters),o.flush(n)}var dS=class{constructor(e,A,i){this.at=e,this.highlighters=A,this.span=i,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,i,n,o){let{type:a,from:r,to:s}=e;if(r>=i||s<=A)return;a.isTop&&(o=this.highlighters.filter(d=>!d.scope||d.scope(a)));let g=n,l=ruA(e)||y1.empty,C=auA(o,l.tags);if(C&&(g&&(g+=" "),g+=C,l.mode==1&&(n+=(n?" ":"")+C)),this.startSpan(Math.max(A,r),g),l.opaque)return;let I=e.tree&&e.tree.prop(wi.mounted);if(I&&I.overlay){let d=e.node.enter(I.overlay[0].from+r,1),B=this.highlighters.filter(E=>!E.scope||E.scope(I.tree.type)),Q=e.firstChild();for(let E=0,f=r;;E++){let b=E=R||!e.nextSibling())););if(!b||R>i)break;f=b.to+r,f>A&&(this.highlightRange(d.cursor(),Math.max(A,b.from+r),Math.min(i,f),"",B),this.startSpan(Math.min(i,f),g))}Q&&e.parent()}else if(e.firstChild()){I&&(n="");do if(!(e.to<=A)){if(e.from>=i)break;this.highlightRange(e,A,i,n,o),this.startSpan(Math.min(i,e.to),g)}while(e.nextSibling());e.parent()}}};function ruA(t){let e=t.type.prop(Yj);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}var je=Vl.define,l5=je(),F2=je(),Uj=je(F2),Jj=je(F2),L2=je(),c5=je(L2),IS=je(L2),i0=je(),w1=je(i0),e0=je(),t0=je(),BS=je(),v3=je(BS),C5=je(),xe={comment:l5,lineComment:je(l5),blockComment:je(l5),docComment:je(l5),name:F2,variableName:je(F2),typeName:Uj,tagName:je(Uj),propertyName:Jj,attributeName:je(Jj),className:je(F2),labelName:je(F2),namespace:je(F2),macroName:je(F2),literal:L2,string:c5,docString:je(c5),character:je(c5),attributeValue:je(c5),number:IS,integer:je(IS),float:je(IS),bool:je(L2),regexp:je(L2),escape:je(L2),color:je(L2),url:je(L2),keyword:e0,self:je(e0),null:je(e0),atom:je(e0),unit:je(e0),modifier:je(e0),operatorKeyword:je(e0),controlKeyword:je(e0),definitionKeyword:je(e0),moduleKeyword:je(e0),operator:t0,derefOperator:je(t0),arithmeticOperator:je(t0),logicOperator:je(t0),bitwiseOperator:je(t0),compareOperator:je(t0),updateOperator:je(t0),definitionOperator:je(t0),typeOperator:je(t0),controlOperator:je(t0),punctuation:BS,separator:je(BS),bracket:v3,angleBracket:je(v3),squareBracket:je(v3),paren:je(v3),brace:je(v3),content:i0,heading:w1,heading1:je(w1),heading2:je(w1),heading3:je(w1),heading4:je(w1),heading5:je(w1),heading6:je(w1),contentSeparator:je(i0),list:je(i0),quote:je(i0),emphasis:je(i0),strong:je(i0),link:je(i0),monospace:je(i0),strikethrough:je(i0),inserted:je(),deleted:je(),changed:je(),invalid:je(),meta:C5,documentMeta:je(C5),annotation:je(C5),processingInstruction:je(C5),definition:Vl.defineModifier("definition"),constant:Vl.defineModifier("constant"),function:Vl.defineModifier("function"),standard:Vl.defineModifier("standard"),local:Vl.defineModifier("local"),special:Vl.defineModifier("special")};for(let t in xe){let e=xe[t];e instanceof Vl&&(e.name=t)}var Y1e=QS([{tag:xe.link,class:"tok-link"},{tag:xe.heading,class:"tok-heading"},{tag:xe.emphasis,class:"tok-emphasis"},{tag:xe.strong,class:"tok-strong"},{tag:xe.keyword,class:"tok-keyword"},{tag:xe.atom,class:"tok-atom"},{tag:xe.bool,class:"tok-bool"},{tag:xe.url,class:"tok-url"},{tag:xe.labelName,class:"tok-labelName"},{tag:xe.inserted,class:"tok-inserted"},{tag:xe.deleted,class:"tok-deleted"},{tag:xe.literal,class:"tok-literal"},{tag:xe.string,class:"tok-string"},{tag:xe.number,class:"tok-number"},{tag:[xe.regexp,xe.escape,xe.special(xe.string)],class:"tok-string2"},{tag:xe.variableName,class:"tok-variableName"},{tag:xe.local(xe.variableName),class:"tok-variableName tok-local"},{tag:xe.definition(xe.variableName),class:"tok-variableName tok-definition"},{tag:xe.special(xe.variableName),class:"tok-variableName2"},{tag:xe.definition(xe.propertyName),class:"tok-propertyName tok-definition"},{tag:xe.typeName,class:"tok-typeName"},{tag:xe.namespace,class:"tok-namespace"},{tag:xe.className,class:"tok-className"},{tag:xe.macroName,class:"tok-macroName"},{tag:xe.propertyName,class:"tok-propertyName"},{tag:xe.operator,class:"tok-operator"},{tag:xe.comment,class:"tok-comment"},{tag:xe.meta,class:"tok-meta"},{tag:xe.invalid,class:"tok-invalid"},{tag:xe.punctuation,class:"tok-punctuation"}]);var ES,uQ=new wi;function suA(t){return qe.define({combine:t?e=>e.concat(t):void 0})}var guA=new wi,Wl=(()=>{class t{constructor(A,i,n=[],o=""){this.data=A,this.name=o,Ga.prototype.hasOwnProperty("tree")||Object.defineProperty(Ga.prototype,"tree",{get(){return Br(this)}}),this.parser=i,this.extension=[_2.of(this),Ga.languageData.of((a,r,s)=>{let g=Tj(a,r,s),l=g.type.prop(uQ);if(!l)return[];let C=a.facet(l),I=g.type.prop(guA);if(I){let d=g.resolve(r-g.from,s);for(let B of I)if(B.test(d,a)){let Q=a.facet(B.facet);return B.type=="replace"?Q:Q.concat(C)}}return C})].concat(n)}isActiveAt(A,i,n=-1){return Tj(A,i,n).type.prop(uQ)==this.data}findRegions(A){let i=A.facet(_2);if(i?.data==this.data)return[{from:0,to:A.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(a,r)=>{if(a.prop(uQ)==this.data){n.push({from:r,to:r+a.length});return}let s=a.prop(wi.mounted);if(s){if(s.tree.prop(uQ)==this.data){if(s.overlay)for(let g of s.overlay)n.push({from:g.from+r,to:g.to+r});else n.push({from:r,to:r+a.length});return}else if(s.overlay){let g=n.length;if(o(s.tree,s.overlay[0].from+r),n.length>g)return}}for(let g=0;gi.isTop?A:void 0)]}),e.name)}configure(e,A){return new t(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function Br(t){let e=t.field(Wl.state,!1);return e?e.tree:Ma.empty}function kS(t,e,A=50){var i;let n=(i=t.field(Wl.state,!1))===null||i===void 0?void 0:i.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:e});let a=n.isDone(e)||n.work(A,e)?n.tree:null;return n.updateViewport(o),a}var mS=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-i,A-i)}},b3=null,pS=class t{constructor(e,A,i=[],n,o,a,r,s){this.parser=e,this.state=A,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=a,this.skipped=r,this.scheduleOn=s,this.parse=null,this.tempSkipped=[]}static create(e,A,i){return new t(e,A,[],Ma.empty,0,i,[],null)}startParse(){return this.parser.startParse(new mS(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=Ma.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(D1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=b3;b3=this;try{return e()}finally{b3=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=Oj(e,A.from,A.to);return e}changes(e,A){let{fragments:i,tree:n,treeLen:o,viewport:a,skipped:r}=this;if(this.takeTree(),!e.empty){let s=[];if(e.iterChangedRanges((g,l,C,I)=>s.push({fromA:g,toA:l,fromB:C,toB:I})),i=D1.applyChanges(i,s),n=Ma.empty,o=0,a={from:e.mapPos(a.from,-1),to:e.mapPos(a.to,1)},this.skipped.length){r=[];for(let g of this.skipped){let l=e.mapPos(g.from,1),C=e.mapPos(g.to,-1);le.from&&(this.fragments=Oj(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends hQ{createParse(A,i,n){let o=n[0].from,a=n[n.length-1].to;return{parsedPos:o,advance(){let s=b3;if(s){for(let g of n)s.tempSkipped.push(g);e&&(s.scheduleOn=s.scheduleOn?Promise.all([s.scheduleOn,e]):e)}return this.parsedPos=a,new Ma(ts.none,[],[],a-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return b3}};function Oj(t,e,A){return D1.applyChanges(t,[{fromA:e,toA:A,fromB:e,toB:A}])}var k3=class t{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,i)||A.takeTree(),new t(A)}static init(e){let A=Math.min(3e3,e.doc.length),i=pS.create(e.facet(_2).parser,e,{from:0,to:A});return i.work(20,A)||i.takeTree(),new t(i)}};Wl.state=Qa.define({create:k3.init,update(t,e){for(let A of e.effects)if(A.is(Wl.setState))return A.value;return e.startState.facet(_2)!=e.state.facet(_2)?k3.init(e.state):t.apply(e)}});var Zj=t=>{let e=setTimeout(()=>t(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Zj=t=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(t,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var hS=typeof navigator<"u"&&(!((ES=navigator.scheduling)===null||ES===void 0)&&ES.isInputPending)?()=>navigator.scheduling.isInputPending():null,luA=ho.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(Wl.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(Wl.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=Zj(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,s=o.context.work(()=>hS&&hS()||Date.now()>a,n+(r?0:1e5));this.chunkBudget-=Date.now()-A,(s||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:Wl.setState.of(new k3(o.context))})),this.chunkBudget>0&&!(s&&!r)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>dr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),_2=qe.define({combine(t){return t.length?t[0]:null},enables:t=>[Wl.state,luA,ai.contentAttributes.compute([t],e=>{let A=e.facet(t);return A&&A.name?{"data-language":A.name}:{}})]}),Q5=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var cuA=qe.define(),M1=qe.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function Xl(t){let e=t.facet(M1);return e.charCodeAt(0)==9?t.tabSize*e.length:e.length}function pQ(t,e){let A="",i=t.tabSize,n=t.facet(M1)[0];if(n==" "){for(;e>=i;)A+=" ",e-=i;n=" "}for(let o=0;o=e?CuA(t,A,e):null}var v1=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Xl(e)}lineAt(e,A=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=a-this.countColumn(i,i.search(/\S|$/))),o}countColumn(e,A=e.length){return q0(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let a=o(n);if(a>-1)return a}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},SS=new wi;function CuA(t,e,A){let i=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=i.node){let o=[];for(let a=n;a&&!(a.fromi.node.to||a.from==i.node.from&&a.type==i.node.type);a=a.parent)o.push(a);for(let a=o.length-1;a>=0;a--)i={node:o[a],next:i}}return Xj(i,t,A)}function Xj(t,e,A){for(let i=t;i;i=i.next){let n=duA(i.node);if(n)return n(DS.create(e,A,i))}return 0}function IuA(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function duA(t){let e=t.type.prop(SS);if(e)return e;let A=t.firstChild,i;if(A&&(i=A.type.prop(wi.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return a=>huA(a,!0,1,void 0,o&&!IuA(a)?n.from:void 0)}return t.parent==null?BuA:null}function BuA(){return 0}var DS=class t extends v1{constructor(e,A,i){super(e.state,e.options),this.base=e,this.pos=A,this.context=i}get node(){return this.context.node}static create(e,A,i){return new t(e,A,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(A.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(QuA(i,e))break;A=this.state.doc.lineAt(i.from)}return this.lineIndent(A.from)}continue(){return Xj(this.context.next,this.base,this.pos)}};function QuA(t,e){for(let A=e;A;A=A.parent)if(t==A)return!0;return!1}function EuA(t){let e=t.node,A=e.childAfter(e.from),i=e.lastChild;if(!A)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(A.from),a=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let r=A.to;;){let s=e.childAfter(r);if(!s||s==i)return null;if(!s.type.isSkipped){if(s.from>=a)return null;let g=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+g}}r=s.to}}function huA(t,e,A,i,n){let o=t.textAfter,a=o.match(/^\s*/)[0].length,r=i&&o.slice(a,a+i.length)==i||n==t.pos+a,s=e?EuA(t):null;return s?r?t.column(s.from):t.column(s.to):t.baseIndent+(r?0:t.unit*A)}function xS({except:t,units:e=1}={}){return A=>{let i=t&&t.test(A.textAfter);return A.baseIndent+(i?0:e*A.unit)}}var uuA=200;function $j(){return Ga.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let A=t.newDoc,{head:i}=t.newSelection.main,n=A.lineAt(i);if(i>n.from+uuA)return t;let o=A.sliceString(n.from,i);if(!e.some(g=>g.test(o)))return t;let{state:a}=t,r=-1,s=[];for(let{head:g}of a.selection.ranges){let l=a.doc.lineAt(g);if(l.from==r)continue;r=l.from;let C=h5(a,l.from);if(C==null)continue;let I=/^\s*/.exec(l.text)[0],d=pQ(a,C);I!=d&&s.push({from:l.from,to:l.from+I.length,insert:d})}return s.length?[t,{changes:s,sequential:!0}]:t})}var RS=qe.define(),S3=new wi;function Aq(t){let e=t.firstChild,A=t.lastChild;return e&&e.toA)continue;if(o&&r.from=e&&g.to>A&&(o=g)}}return o}function muA(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function fQ(t,e,A){for(let i of t.facet(RS)){let n=i(t,e,A);if(n)return n}return fuA(t,e,A)}function eq(t,e){let A=e.mapPos(t.from,1),i=e.mapPos(t.to,-1);return A>=i?void 0:{from:A,to:i}}var DQ=Ui.define({map:eq}),x3=Ui.define({map:eq});function tq(t){let e=[];for(let{head:A}of t.state.selection.ranges)e.some(i=>i.from<=A&&i.to>=A)||e.push(t.lineBlockAt(A));return e}var b1=Qa.define({create(){return vt.none},update(t,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,i)=>t=zj(t,A,i)),t=t.map(e.changes);for(let A of e.effects)if(A.is(DQ)&&!puA(t,A.value.from,A.value.to)){let{preparePlaceholder:i}=e.state.facet(LS),n=i?vt.replace({widget:new wS(i(e.state,A.value))}):Pj;t=t.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(x3)&&(t=t.update({filter:(i,n)=>A.value.from!=i||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(t=zj(t,e.selection.main.head)),t},provide:t=>ai.decorations.from(t),toJSON(t,e){let A=[];return t.between(0,e.doc.length,(i,n)=>{A.push(i,n)}),A},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(i=!0)}),i?t.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):t}function E5(t,e,A){var i;let n=null;return(i=t.field(b1,!1))===null||i===void 0||i.between(e,A,(o,a)=>{(!n||n.from>o)&&(n={from:o,to:a})}),n}function puA(t,e,A){let i=!1;return t.between(e,e,(n,o)=>{n==e&&o==A&&(i=!0)}),i}function iq(t,e){return t.field(b1,!1)?e:e.concat(Ui.appendConfig.of(aq()))}var DuA=t=>{for(let e of tq(t)){let A=fQ(t.state,e.from,e.to);if(A)return t.dispatch({effects:iq(t.state,[DQ.of(A),nq(t,A)])}),!0}return!1},NS=t=>{if(!t.state.field(b1,!1))return!1;let e=[];for(let A of tq(t)){let i=E5(t.state,A.from,A.to);i&&e.push(x3.of(i),nq(t,i,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function nq(t,e,A=!0){let i=t.state.doc.lineAt(e.from).number,n=t.state.doc.lineAt(e.to).number;return ai.announce.of(`${t.state.phrase(A?"Folded lines":"Unfolded lines")} ${i} ${t.state.phrase("to")} ${n}.`)}var wuA=t=>{let{state:e}=t,A=[];for(let i=0;i{let e=t.state.field(b1,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,t.state.doc.length,(i,n)=>{A.push(x3.of({from:i,to:n}))}),t.dispatch({effects:A}),!0};var oq=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:DuA},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:NS},{key:"Ctrl-Alt-[",run:wuA},{key:"Ctrl-Alt-]",run:FS}],yuA={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},LS=qe.define({combine(t){return Ir(t,yuA)}});function aq(t){let e=[b1,buA];return t&&e.push(LS.of(t)),e}function rq(t,e){let{state:A}=t,i=A.facet(LS),n=a=>{let r=t.lineBlockAt(t.posAtDOM(a.target)),s=E5(t.state,r.from,r.to);s&&t.dispatch({effects:x3.of(s)}),a.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,e);let o=document.createElement("span");return o.textContent=i.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var Pj=vt.replace({widget:new class extends Ps{toDOM(t){return rq(t,null)}}}),wS=class extends Ps{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return rq(e,this.value)}},vuA={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},M3=class extends qs{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function sq(t={}){let e=BA(BA({},vuA),t),A=new M3(e,!0),i=new M3(e,!1),n=ho.fromClass(class{constructor(a){this.from=a.viewport.from,this.markers=this.buildMarkers(a)}update(a){(a.docChanged||a.viewportChanged||a.startState.facet(_2)!=a.state.facet(_2)||a.startState.field(b1,!1)!=a.state.field(b1,!1)||Br(a.startState)!=Br(a.state)||e.foldingChanged(a))&&(this.markers=this.buildMarkers(a.view))}buildMarkers(a){let r=new Nr;for(let s of a.viewportLineBlocks){let g=E5(a.state,s.from,s.to)?i:fQ(a.state,s.from,s.to)?A:null;g&&r.add(s.from,s.from,g)}return r.finish()}}),{domEventHandlers:o}=e;return[n,a5({class:"cm-foldGutter",markers(a){var r;return((r=a.plugin(n))===null||r===void 0?void 0:r.markers)||zn.empty},initialSpacer(){return new M3(e,!1)},domEventHandlers:Ve(BA({},o),{click:(a,r,s)=>{if(o.click&&o.click(a,r,s))return!0;let g=E5(a.state,r.from,r.to);if(g)return a.dispatch({effects:x3.of(g)}),!0;let l=fQ(a.state,r.from,r.to);return l?(a.dispatch({effects:DQ.of(l)}),!0):!1}})}),aq()]}var buA=ai.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),mQ=class t{constructor(e,A){this.specs=e;let i;function n(r){let s=Xg.newName();return(i||(i=Object.create(null)))["."+s]=r,s}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,a=A.scope;this.scope=a instanceof Wl?r=>r.prop(uQ)==a.data:a?r=>r==a:void 0,this.style=QS(e.map(r=>({tag:r.tag,class:r.class||n(Object.assign({},r,{tag:null}))})),{all:o}).style,this.module=i?new Xg(i):null,this.themeType=A.themeType}static define(e,A){return new t(e,A||{})}},yS=qe.define(),gq=qe.define({combine(t){return t.length?[t[0]]:null}});function uS(t){let e=t.facet(yS);return e.length?e:t.facet(gq)}function _S(t,e){let A=[MuA],i;return t instanceof mQ&&(t.module&&A.push(ai.styleModule.of(t.module)),i=t.themeType),e?.fallback?A.push(gq.of(t)):i?A.push(yS.computeN([ai.darkTheme],n=>n.facet(ai.darkTheme)==(i=="dark")?[t]:[])):A.push(yS.of(t)),A}var vS=class{constructor(e){this.markCache=Object.create(null),this.tree=Br(e.state),this.decorations=this.buildDeco(e,uS(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=Br(e.state),i=uS(e.state),n=i!=uS(e.startState),{viewport:o}=e.view,a=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=a):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return vt.none;let i=new Nr;for(let{from:n,to:o}of e.visibleRanges)Hj(this.tree,A,(a,r,s)=>{i.add(a,r,this.markCache[s]||(this.markCache[s]=vt.mark({class:s})))},n,o);return i.finish()}},MuA=zl.high(ho.fromClass(vS,{decorations:t=>t.decorations})),lq=mQ.define([{tag:xe.meta,color:"#404740"},{tag:xe.link,textDecoration:"underline"},{tag:xe.heading,textDecoration:"underline",fontWeight:"bold"},{tag:xe.emphasis,fontStyle:"italic"},{tag:xe.strong,fontWeight:"bold"},{tag:xe.strikethrough,textDecoration:"line-through"},{tag:xe.keyword,color:"#708"},{tag:[xe.atom,xe.bool,xe.url,xe.contentSeparator,xe.labelName],color:"#219"},{tag:[xe.literal,xe.inserted],color:"#164"},{tag:[xe.string,xe.deleted],color:"#a11"},{tag:[xe.regexp,xe.escape,xe.special(xe.string)],color:"#e40"},{tag:xe.definition(xe.variableName),color:"#00f"},{tag:xe.local(xe.variableName),color:"#30a"},{tag:[xe.typeName,xe.namespace],color:"#085"},{tag:xe.className,color:"#167"},{tag:[xe.special(xe.variableName),xe.macroName],color:"#256"},{tag:xe.definition(xe.propertyName),color:"#00c"},{tag:xe.comment,color:"#940"},{tag:xe.invalid,color:"#f00"}]),kuA=ai.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),cq=1e4,Cq="()[]{}",Iq=qe.define({combine(t){return Ir(t,{afterCursor:!0,brackets:Cq,maxScanDistance:cq,renderMatch:RuA})}}),SuA=vt.mark({class:"cm-matchingBracket"}),xuA=vt.mark({class:"cm-nonmatchingBracket"});function RuA(t){let e=[],A=t.matched?SuA:xuA;return e.push(A.range(t.start.from,t.start.to)),t.end&&e.push(A.range(t.end.from,t.end.to)),e}function jj(t){let e=[],A=t.facet(Iq);for(let i of t.selection.ranges){if(!i.empty)continue;let n=Zl(t,i.head,-1,A)||i.head>0&&Zl(t,i.head-1,1,A)||A.afterCursor&&(Zl(t,i.head,1,A)||i.headt.decorations}),FuA=[NuA,kuA];function dq(t={}){return[Iq.of(t),FuA]}var LuA=new wi;function bS(t,e,A){let i=t.prop(e<0?wi.openedBy:wi.closedBy);if(i)return i;if(t.name.length==1){let n=A.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function MS(t){let e=t.type.prop(LuA);return e?e(t.node):t}function Zl(t,e,A,i={}){let n=i.maxScanDistance||cq,o=i.brackets||Cq,a=Br(t),r=a.resolveInner(e,A);for(let s=r;s;s=s.parent){let g=bS(s.type,A,o);if(g&&s.from0?e>=l.from&&el.from&&e<=l.to))return _uA(t,e,A,s,l,g,o)}}return GuA(t,e,A,a,r.type,n,o)}function _uA(t,e,A,i,n,o,a){let r=i.parent,s={from:n.from,to:n.to},g=0,l=r?.cursor();if(l&&(A<0?l.childBefore(i.from):l.childAfter(i.to)))do if(A<0?l.to<=i.from:l.from>=i.to){if(g==0&&o.indexOf(l.type.name)>-1&&l.from0)return null;let g={from:A<0?e-1:e,to:A>0?e+1:e},l=t.doc.iterRange(e,A>0?t.doc.length:0),C=0;for(let I=0;!l.next().done&&I<=o;){let d=l.value;A<0&&(I+=d.length);let B=e+I*A;for(let Q=A>0?0:d.length-1,E=A>0?d.length:-1;Q!=E;Q+=A){let f=a.indexOf(d[Q]);if(!(f<0||i.resolveInner(B+Q,1).type!=n))if(f%2==0==A>0)C++;else{if(C==1)return{start:g,end:{from:B+Q,to:B+Q+1},matched:f>>1==s>>1};C--}}A>0&&(I+=d.length)}return l.done?{start:g,matched:!1}:null}var KuA=Object.create(null),qj=[ts.none];var Vj=[],Wj=Object.create(null),UuA=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])UuA[t]=JuA(KuA,e);function fS(t,e){Vj.indexOf(t)>-1||(Vj.push(t),console.warn(e))}function JuA(t,e){let A=[];for(let r of e.split(" ")){let s=[];for(let g of r.split(".")){let l=t[g]||xe[g];l?typeof l=="function"?s.length?s=s.map(l):fS(g,`Modifier ${g} used at start of tag`):s.length?fS(g,`Tag ${g} used as modifier`):s=Array.isArray(l)?l:[l]:fS(g,`Unknown highlighting tag ${g}`)}for(let g of s)A.push(g)}if(!A.length)return 0;let i=e.replace(/ /g,"_"),n=i+" "+A.map(r=>r.id),o=Wj[n];if(o)return o.id;let a=Wj[n]=ts.define({id:qj.length,name:i,props:[d5({[i]:A})]});return qj.push(a),a.id}var V1e={rtl:vt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:go.RTL}),ltr:vt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:go.LTR}),auto:vt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var YuA=t=>{let{state:e}=t,A=e.doc.lineAt(e.selection.main.from),i=JS(t.state,A.from);return i.line?HuA(t):i.block?OuA(t):!1};function US(t,e){return({state:A,dispatch:i})=>{if(A.readOnly)return!1;let n=t(e,A);return n?(i(A.update(n)),!0):!1}}var HuA=US(juA,0);var TuA=US(Dq,0);var OuA=US((t,e)=>Dq(t,e,PuA(e)),0);function JS(t,e){let A=t.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var R3=50;function zuA(t,{open:e,close:A},i,n){let o=t.sliceDoc(i-R3,i),a=t.sliceDoc(n,n+R3),r=/\s*$/.exec(o)[0].length,s=/^\s*/.exec(a)[0].length,g=o.length-r;if(o.slice(g-e.length,g)==e&&a.slice(s,s+A.length)==A)return{open:{pos:i-r,margin:r&&1},close:{pos:n+s,margin:s&&1}};let l,C;n-i<=2*R3?l=C=t.sliceDoc(i,n):(l=t.sliceDoc(i,i+R3),C=t.sliceDoc(n-R3,n));let I=/^\s*/.exec(l)[0].length,d=/\s*$/.exec(C)[0].length,B=C.length-d-A.length;return l.slice(I,I+e.length)==e&&C.slice(B,B+A.length)==A?{open:{pos:i+I+e.length,margin:/\s/.test(l.charAt(I+e.length))?1:0},close:{pos:n-d-A.length,margin:/\s/.test(C.charAt(B-1))?1:0}}:null}function PuA(t){let e=[];for(let A of t.selection.ranges){let i=t.doc.lineAt(A.from),n=A.to<=i.to?i:t.doc.lineAt(A.to);n.from>i.from&&n.from==A.to&&(n=A.to==i.to+1?i:t.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>i.from?e[o].to=n.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:n.to})}return e}function Dq(t,e,A=e.selection.ranges){let i=A.map(o=>JS(e,o.from).block);if(!i.every(o=>o))return null;let n=A.map((o,a)=>zuA(e,i[a],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,a)=>n[a]?[]:[{from:o.from,insert:i[a].open+" "},{from:o.to,insert:" "+i[a].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let a=0,r;an&&(o==a||a>C.from)){n=C.from;let I=/^\s*/.exec(C.text)[0].length,d=I==C.length,B=C.text.slice(I,I+g.length)==g?I:-1;Io.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:r,token:s,indent:g,empty:l,single:C}of i)(C||!l)&&o.push({from:r.from+g,insert:s+" "});let a=e.changes(o);return{changes:a,selection:e.selection.map(a,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:a,comment:r,token:s}of i)if(r>=0){let g=a.from+r,l=g+s.length;a.text[l-a.from]==" "&&l++,o.push({from:g,to:l})}return{changes:o}}return null}function wQ(t,e){return ce.create(t.ranges.map(e),t.mainIndex)}function $l(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Ac({state:t,dispatch:e},A){let i=wQ(t.selection,A);return i.eq(t.selection,!0)?!1:(e($l(t,i)),!0)}function f5(t,e){return ce.cursor(e?t.to:t.from)}function wq(t,e){return Ac(t,A=>A.empty?t.moveByChar(A,e):f5(A,e))}function is(t){return t.textDirectionAt(t.state.selection.main.head)==go.LTR}var yq=t=>wq(t,!is(t)),vq=t=>wq(t,is(t));function bq(t,e){return Ac(t,A=>A.empty?t.moveByGroup(A,e):f5(A,e))}var quA=t=>bq(t,!is(t)),VuA=t=>bq(t,is(t));var ade=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function WuA(t,e,A){if(e.type.prop(A))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function m5(t,e,A){let i=Br(t).resolveInner(e.head),n=A?wi.closedBy:wi.openedBy;for(let s=e.head;;){let g=A?i.childAfter(s):i.childBefore(s);if(!g)break;WuA(t,g,n)?i=g:s=A?g.to:g.from}let o=i.type.prop(n),a,r;return o&&(a=A?Zl(t,i.from,1):Zl(t,i.to,-1))&&a.matched?r=A?a.end.to:a.end.from:r=A?i.to:i.from,ce.cursor(r,A?-1:1)}var ZuA=t=>Ac(t,e=>m5(t.state,e,!is(t))),XuA=t=>Ac(t,e=>m5(t.state,e,is(t)));function Mq(t,e){return Ac(t,A=>{if(!A.empty)return f5(A,e);let i=t.moveVertically(A,e);return i.head!=A.head?i:t.moveToLineBoundary(A,e)})}var kq=t=>Mq(t,!1),Sq=t=>Mq(t,!0);function xq(t){let e=t.scrollDOM.clientHeighta.empty?t.moveVertically(a,e,A.height):f5(a,e));if(n.eq(i.selection))return!1;let o;if(A.selfScroll){let a=t.coordsAtPos(i.selection.main.head),r=t.scrollDOM.getBoundingClientRect(),s=r.top+A.marginTop,g=r.bottom-A.marginBottom;a&&a.top>s&&a.bottomRq(t,!1),GS=t=>Rq(t,!0);function G2(t,e,A){let i=t.lineBlockAt(e.head),n=t.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?i.to:i.from)&&(n=t.moveToLineBoundary(e,A,!1)),!A&&n.head==i.from&&i.length){let o=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&e.head!=i.from+o&&(n=ce.cursor(i.from+o))}return n}var $uA=t=>Ac(t,e=>G2(t,e,!0)),AfA=t=>Ac(t,e=>G2(t,e,!1)),efA=t=>Ac(t,e=>G2(t,e,!is(t))),tfA=t=>Ac(t,e=>G2(t,e,is(t))),ifA=t=>Ac(t,e=>ce.cursor(t.lineBlockAt(e.head).from,1)),nfA=t=>Ac(t,e=>ce.cursor(t.lineBlockAt(e.head).to,-1));function ofA(t,e,A){let i=!1,n=wQ(t.selection,o=>{let a=Zl(t,o.head,-1)||Zl(t,o.head,1)||o.head>0&&Zl(t,o.head-1,1)||o.headofA(t,e,!1);function tl(t,e){let A=wQ(t.state.selection,i=>{let n=e(i);return ce.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0,n.assoc)});return A.eq(t.state.selection)?!1:(t.dispatch($l(t.state,A)),!0)}function Nq(t,e){return tl(t,A=>t.moveByChar(A,e))}var Fq=t=>Nq(t,!is(t)),Lq=t=>Nq(t,is(t));function _q(t,e){return tl(t,A=>t.moveByGroup(A,e))}var rfA=t=>_q(t,!is(t)),sfA=t=>_q(t,is(t));var gfA=t=>tl(t,e=>m5(t.state,e,!is(t))),lfA=t=>tl(t,e=>m5(t.state,e,is(t)));function Gq(t,e){return tl(t,A=>t.moveVertically(A,e))}var Kq=t=>Gq(t,!1),Uq=t=>Gq(t,!0);function Jq(t,e){return tl(t,A=>t.moveVertically(A,e,xq(t).height))}var Qq=t=>Jq(t,!1),Eq=t=>Jq(t,!0),cfA=t=>tl(t,e=>G2(t,e,!0)),CfA=t=>tl(t,e=>G2(t,e,!1)),IfA=t=>tl(t,e=>G2(t,e,!is(t))),dfA=t=>tl(t,e=>G2(t,e,is(t))),BfA=t=>tl(t,e=>ce.cursor(t.lineBlockAt(e.head).from)),QfA=t=>tl(t,e=>ce.cursor(t.lineBlockAt(e.head).to)),hq=({state:t,dispatch:e})=>(e($l(t,{anchor:0})),!0),uq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.doc.length})),!0),fq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.selection.main.anchor,head:0})),!0),mq=({state:t,dispatch:e})=>(e($l(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),EfA=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),hfA=({state:t,dispatch:e})=>{let A=p5(t).map(({from:i,to:n})=>ce.range(i,Math.min(n+1,t.doc.length)));return e(t.update({selection:ce.create(A),userEvent:"select"})),!0},ufA=({state:t,dispatch:e})=>{let A=wQ(t.selection,i=>{let n=Br(t),o=n.resolveStack(i.from,1);if(i.empty){let a=n.resolveStack(i.from,-1);a.node.from>=o.node.from&&a.node.to<=o.node.to&&(o=a)}for(let a=o;a;a=a.next){let{node:r}=a;if((r.from=i.to||r.to>i.to&&r.from<=i.from)&&a.next)return ce.range(r.to,r.from)}return i});return A.eq(t.selection)?!1:(e($l(t,A)),!0)};function Yq(t,e){let{state:A}=t,i=A.selection,n=A.selection.ranges.slice();for(let o of A.selection.ranges){let a=A.doc.lineAt(o.head);if(e?a.to0)for(let r=o;;){let s=t.moveVertically(r,e);if(s.heada.to){n.some(g=>g.head==s.head)||n.push(s);break}else{if(s.head==r.head)break;r=s}}}return n.length==i.ranges.length?!1:(t.dispatch($l(A,ce.create(n,n.length-1))),!0)}var ffA=t=>Yq(t,!1),mfA=t=>Yq(t,!0),pfA=({state:t,dispatch:e})=>{let A=t.selection,i=null;return A.ranges.length>1?i=ce.create([A.main]):A.main.empty||(i=ce.create([ce.cursor(A.main.head)])),i?(e($l(t,i)),!0):!1};function N3(t,e){if(t.state.readOnly)return!1;let A="delete.selection",{state:i}=t,n=i.changeByRange(o=>{let{from:a,to:r}=o;if(a==r){let s=e(o);sa&&(A="delete.forward",s=u5(t,s,!0)),a=Math.min(a,s),r=Math.max(r,s)}else a=u5(t,a,!1),r=u5(t,r,!0);return a==r?{range:o}:{changes:{from:a,to:r},range:ce.cursor(a,an(t)))i.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var Hq=(t,e,A)=>N3(t,i=>{let n=i.from,{state:o}=t,a=o.doc.lineAt(n),r,s;if(A&&!e&&n>a.from&&nHq(t,!1,!0);var Tq=t=>Hq(t,!0,!1),Oq=(t,e)=>N3(t,A=>{let i=A.head,{state:n}=t,o=n.doc.lineAt(i),a=n.charCategorizer(i);for(let r=null;;){if(i==(e?o.to:o.from)){i==A.head&&o.number!=(e?n.doc.lines:1)&&(i+=e?1:-1);break}let s=_a(o.text,i-o.from,e)+o.from,g=o.text.slice(Math.min(i,s)-o.from,Math.max(i,s)-o.from),l=a(g);if(r!=null&&l!=r)break;(g!=" "||i!=A.head)&&(r=l),i=s}return i}),zq=t=>Oq(t,!1),DfA=t=>Oq(t,!0);var wfA=t=>N3(t,e=>{let A=t.lineBlockAt(e.head).to;return e.headN3(t,e=>{let A=t.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),vfA=t=>N3(t,e=>{let A=t.moveToLineBoundary(e,!0).head;return e.head{if(t.readOnly)return!1;let A=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:Bn.of(["",""])},range:ce.cursor(i.from)}));return e(t.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},MfA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),a=n==o.from?n-1:_a(o.text,n-o.from,!1)+o.from,r=n==o.to?n+1:_a(o.text,n-o.from,!0)+o.from;return{changes:{from:a,to:r,insert:t.doc.slice(n,r).append(t.doc.slice(a,n))},range:ce.cursor(r)}});return A.changes.empty?!1:(e(t.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function p5(t){let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),A>=n.number){let a=e[e.length-1];a.to=o.to,a.ranges.push(i)}else e.push({from:n.from,to:o.to,ranges:[i]});A=o.number+1}return e}function Pq(t,e,A){if(t.readOnly)return!1;let i=[],n=[];for(let o of p5(t)){if(A?o.to==t.doc.length:o.from==0)continue;let a=t.doc.lineAt(A?o.to+1:o.from-1),r=a.length+1;if(A){i.push({from:o.to,to:a.to},{from:o.from,insert:a.text+t.lineBreak});for(let s of o.ranges)n.push(ce.range(Math.min(t.doc.length,s.anchor+r),Math.min(t.doc.length,s.head+r)))}else{i.push({from:a.from,to:o.from},{from:o.to,insert:t.lineBreak+a.text});for(let s of o.ranges)n.push(ce.range(s.anchor-r,s.head-r))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:ce.create(n,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}var kfA=({state:t,dispatch:e})=>Pq(t,e,!1),SfA=({state:t,dispatch:e})=>Pq(t,e,!0);function jq(t,e,A){if(t.readOnly)return!1;let i=[];for(let o of p5(t))A?i.push({from:o.from,insert:t.doc.slice(o.from,o.to)+t.lineBreak}):i.push({from:o.to,insert:t.lineBreak+t.doc.slice(o.from,o.to)});let n=t.changes(i);return e(t.update({changes:n,selection:t.selection.map(n,A?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}var xfA=({state:t,dispatch:e})=>jq(t,e,!1),RfA=({state:t,dispatch:e})=>jq(t,e,!0),NfA=t=>{if(t.state.readOnly)return!1;let{state:e}=t,A=e.changes(p5(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(t.lineWrapping){let a=t.lineBlockAt(n.head),r=t.coordsAtPos(n.head,n.assoc||1);r&&(o=a.bottom+t.documentTop-r.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(A);return t.dispatch({changes:A,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function FfA(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=Br(t).resolveInner(e),i=A.childBefore(e),n=A.childAfter(e),o;return i&&n&&i.to<=e&&n.from>=e&&(o=i.type.prop(wi.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var pq=qq(!1),LfA=qq(!0);function qq(t){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let i=e.changeByRange(n=>{let{from:o,to:a}=n,r=e.doc.lineAt(o),s=!t&&o==a&&FfA(e,o);t&&(o=a=(a<=r.to?r:e.doc.lineAt(a)).to);let g=new v1(e,{simulateBreak:o,simulateDoubleBreak:!!s}),l=h5(g,o);for(l==null&&(l=q0(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));ar.from&&o{let n=[];for(let a=i.from;a<=i.to;){let r=t.doc.lineAt(a);r.number>A&&(i.empty||i.to>r.from)&&(e(r,n,i),A=r.number),a=r.to+1}let o=t.changes(n);return{changes:n,range:ce.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var _fA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=Object.create(null),i=new v1(t,{overrideIndentation:o=>{let a=A[o];return a??-1}}),n=YS(t,(o,a,r)=>{let s=h5(i,o.from);if(s==null)return;/\S/.test(o.text)||(s=0);let g=/^\s*/.exec(o.text)[0],l=pQ(t,s);(g!=l||r.fromt.readOnly?!1:(e(t.update(YS(t,(A,i)=>{i.push({from:A.from,insert:t.facet(M1)})}),{userEvent:"input.indent"})),!0),Wq=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(YS(t,(A,i)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=q0(n,t.tabSize),a=0,r=pQ(t,Math.max(0,o-Xl(t)));for(;a(t.setTabFocusMode(),!0);var KfA=[{key:"Ctrl-b",run:yq,shift:Fq,preventDefault:!0},{key:"Ctrl-f",run:vq,shift:Lq},{key:"Ctrl-p",run:kq,shift:Kq},{key:"Ctrl-n",run:Sq,shift:Uq},{key:"Ctrl-a",run:ifA,shift:BfA},{key:"Ctrl-e",run:nfA,shift:QfA},{key:"Ctrl-d",run:Tq},{key:"Ctrl-h",run:KS},{key:"Ctrl-k",run:wfA},{key:"Ctrl-Alt-h",run:zq},{key:"Ctrl-o",run:bfA},{key:"Ctrl-t",run:MfA},{key:"Ctrl-v",run:GS}],UfA=[{key:"ArrowLeft",run:yq,shift:Fq,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:quA,shift:rfA,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:efA,shift:IfA,preventDefault:!0},{key:"ArrowRight",run:vq,shift:Lq,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:VuA,shift:sfA,preventDefault:!0},{mac:"Cmd-ArrowRight",run:tfA,shift:dfA,preventDefault:!0},{key:"ArrowUp",run:kq,shift:Kq,preventDefault:!0},{mac:"Cmd-ArrowUp",run:hq,shift:fq},{mac:"Ctrl-ArrowUp",run:Bq,shift:Qq},{key:"ArrowDown",run:Sq,shift:Uq,preventDefault:!0},{mac:"Cmd-ArrowDown",run:uq,shift:mq},{mac:"Ctrl-ArrowDown",run:GS,shift:Eq},{key:"PageUp",run:Bq,shift:Qq},{key:"PageDown",run:GS,shift:Eq},{key:"Home",run:AfA,shift:CfA,preventDefault:!0},{key:"Mod-Home",run:hq,shift:fq},{key:"End",run:$uA,shift:cfA,preventDefault:!0},{key:"Mod-End",run:uq,shift:mq},{key:"Enter",run:pq,shift:pq},{key:"Mod-a",run:EfA},{key:"Backspace",run:KS,shift:KS,preventDefault:!0},{key:"Delete",run:Tq,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:zq,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:DfA,preventDefault:!0},{mac:"Mod-Backspace",run:yfA,preventDefault:!0},{mac:"Mod-Delete",run:vfA,preventDefault:!0}].concat(KfA.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),Zq=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:ZuA,shift:gfA},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:XuA,shift:lfA},{key:"Alt-ArrowUp",run:kfA},{key:"Shift-Alt-ArrowUp",run:xfA},{key:"Alt-ArrowDown",run:SfA},{key:"Shift-Alt-ArrowDown",run:RfA},{key:"Mod-Alt-ArrowUp",run:ffA},{key:"Mod-Alt-ArrowDown",run:mfA},{key:"Escape",run:pfA},{key:"Mod-Enter",run:LfA},{key:"Alt-l",mac:"Ctrl-l",run:hfA},{key:"Mod-i",run:ufA,preventDefault:!0},{key:"Mod-[",run:Wq},{key:"Mod-]",run:Vq},{key:"Mod-Alt-\\",run:_fA},{key:"Shift-Mod-k",run:NfA},{key:"Shift-Mod-\\",run:afA},{key:"Mod-/",run:YuA},{key:"Alt-A",run:TuA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:GfA}].concat(UfA),Xq={key:"Tab",run:Vq,shift:Wq};var y5=class{constructor(e,A,i){this.from=e,this.to=A,this.diagnostic=i}},k1=class t{constructor(e,A,i){this.diagnostics=e,this.panel=A,this.selected=i}static init(e,A,i){let n=i.facet(n0).markerFilter;n&&(e=n(e,i));let o=e.slice().sort((d,B)=>d.from-B.from||d.to-B.to),a=new Nr,r=[],s=0,g=i.doc.iter(),l=0,C=i.doc.length;for(let d=0;;){let B=d==o.length?null:o[d];if(!B&&!r.length)break;let Q,E;if(r.length)Q=s,E=r.reduce((R,M)=>Math.min(R,M.to),B&&B.from>Q?B.from:1e8);else{if(Q=B.from,Q>C)break;E=B.to,r.push(B),d++}for(;dR.from||R.to==Q))r.push(R),d++,E=Math.min(R.to,E);else{E=Math.min(R.from,E);break}}E=Math.min(E,C);let f=!1;if(r.some(R=>R.from==Q&&(R.to==E||E==C))&&(f=Q==E,!f&&E-Q<10)){let R=Q-(l+g.value.length);R>0&&(g.next(R),l=Q);for(let M=Q;;){if(M>=E){f=!0;break}if(!g.lineBreak&&l+g.value.length>M)break;M=l+g.value.length,l+=g.value.length,g.next()}}let b=gV(r);if(f)a.add(Q,Q,vt.widget({widget:new HS(b),diagnostics:r.slice()}));else{let R=r.reduce((M,v)=>v.markClass?M+" "+v.markClass:M,"");a.add(Q,E,vt.mark({class:"cm-lintRange cm-lintRange-"+b+R,diagnostics:r.slice(),inclusiveEnd:r.some(M=>M.to>E)}))}if(s=E,s==C)break;for(let R=0;R{if(!(e&&a.diagnostics.indexOf(e)<0))if(!i)i=new y5(n,o,e||a.diagnostics[0]);else{if(a.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new y5(i.from,o,i.diagnostic)}}),i}function eV(t,e){let A=e.pos,i=e.end||A,n=t.state.facet(n0).hideOn(t,A,i);if(n!=null)return n;let o=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(a=>a.is(M5))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function tV(t,e){return t.field(ug,!1)?e:e.concat(Ui.appendConfig.of(cV))}function JfA(t,e){return{effects:tV(t,[M5.of(e)])}}var M5=Ui.define(),OS=Ui.define(),iV=Ui.define(),ug=Qa.define({create(){return new k1(vt.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let A=t.diagnostics.map(e.changes),i=null,n=t.panel;if(t.selected){let o=e.changes.mapPos(t.selected.from,1);i=K2(A,t.selected.diagnostic,o)||K2(A,null,o)}!A.size&&n&&e.state.facet(n0).autoPanel&&(n=null),t=new k1(A,n,i)}for(let A of e.effects)if(A.is(M5)){let i=e.state.facet(n0).autoPanel?A.value.length?F3.open:null:t.panel;t=k1.init(A.value,i,e.state)}else A.is(OS)?t=new k1(t.diagnostics,A.value?F3.open:null,t.selected):A.is(iV)&&(t=new k1(t.diagnostics,t.panel,A.value));return t},provide:t=>[m1.from(t,e=>e.panel),ai.decorations.from(t,e=>e.diagnostics)]});var YfA=vt.mark({class:"cm-lintRange cm-lintRange-active"});function HfA(t,e,A){let{diagnostics:i}=t.state.field(ug),n,o=-1,a=-1;i.between(e-(A<0?1:0),e+(A>0?1:0),(s,g,{spec:l})=>{if(e>=s&&e<=g&&(s==g||(e>s||A>0)&&(esV(t,A,!1)))}var TfA=t=>{let e=t.state.field(ug,!1);(!e||!e.panel)&&t.dispatch({effects:tV(t.state,[OS.of(!0)])});let A=f3(t,F3.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},$q=t=>{let e=t.state.field(ug,!1);return!e||!e.panel?!1:(t.dispatch({effects:OS.of(!1)}),!0)},OfA=t=>{let e=t.state.field(ug,!1);if(!e)return!1;let A=t.state.selection.main,i=K2(e.diagnostics,null,A.to+1);return!i&&(i=K2(e.diagnostics,null,0),!i||i.from==A.from&&i.to==A.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var oV=[{key:"Mod-Shift-m",run:TfA,preventDefault:!0},{key:"F8",run:OfA}],zfA=ho.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:e}=t.state.facet(n0);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let t=Date.now();if(tPromise.resolve(i(this.view))),i=>{this.view.state.doc==e.doc&&this.view.dispatch(JfA(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{dr(this.view.state,i)})}}update(t){let e=t.state.facet(n0);(t.docChanged||e!=t.startState.facet(n0)||e.needsRefresh&&e.needsRefresh(t))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function PfA(t,e,A){let i=[],n=-1;for(let o of t)o.then(a=>{i.push(a),clearTimeout(n),i.length==t.length?e(i):n=setTimeout(()=>e(i),200)},A)}var n0=qe.define({combine(t){return BA({sources:t.map(e=>e.source).filter(e=>e!=null)},Ir(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:AV,tooltipFilter:AV,needsRefresh:(e,A)=>e?A?i=>e(i)||A(i):e:A,hideOn:(e,A)=>e?A?(i,n,o)=>e(i,n,o)||A(i,n,o):e:A,autoPanel:(e,A)=>e||A}))}});function AV(t,e){return t?e?(A,i)=>e(t(A,i),i):t:e}function aV(t,e={}){return[n0.of({source:t,config:e}),zfA,cV]}function rV(t){let e=[];if(t)A:for(let{name:A}of t){for(let i=0;io.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function sV(t,e,A){var i;let n=A?rV(e.actions):[];return Pn("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},Pn("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((o,a)=>{let r=!1,s=d=>{if(d.preventDefault(),r)return;r=!0;let B=K2(t.state.field(ug).diagnostics,e);B&&o.apply(t,B.from,B.to)},{name:g}=o,l=n[a]?g.indexOf(n[a]):-1,C=l<0?g:[g.slice(0,l),Pn("u",g.slice(l,l+1)),g.slice(l+1)],I=o.markClass?" "+o.markClass:"";return Pn("button",{type:"button",class:"cm-diagnosticAction"+I,onclick:s,onmousedown:s,"aria-label":` Action: ${g}${l<0?"":` (access key "${n[a]})"`}.`},C)}),e.source&&Pn("div",{class:"cm-diagnosticSource"},e.source))}var HS=class extends Ps{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return Pn("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},v5=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=sV(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},F3=class t{constructor(e){this.view=e,this.items=[];let A=n=>{if(!(n.ctrlKey||n.altKey||n.metaKey)){if(n.keyCode==27)$q(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],a=rV(o.actions);for(let r=0;r{for(let o=0;o$q(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(ug).selected;if(!e)return-1;for(let A=0;A{for(let l of g.diagnostics){if(a.has(l))continue;a.add(l);let C=-1,I;for(let d=i;di&&(this.items.splice(i,C-i),n=!0)),A&&I.diagnostic==A.diagnostic?I.dom.hasAttribute("aria-selected")||(I.dom.setAttribute("aria-selected","true"),o=I):I.dom.hasAttribute("aria-selected")&&I.dom.removeAttribute("aria-selected"),i++}});i({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:r,panel:s})=>{let g=s.height/this.list.offsetHeight;r.tops.bottom&&(this.list.scrollTop+=(r.bottom-s.bottom)/g)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)A();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(ug),i=K2(A.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:iV.of(i)})}static open(e){return new t(e)}};function w5(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function D5(t){return w5(``,'width="6" height="3"')}var jfA=ai.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:D5("#d11")},".cm-lintRange-warning":{backgroundImage:D5("orange")},".cm-lintRange-info":{backgroundImage:D5("#999")},".cm-lintRange-hint":{backgroundImage:D5("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}},"&dark .cm-lintRange-active":{backgroundColor:"#86714a80"},"&dark .cm-panel.cm-panel-lint ul":{"& [aria-selected]":{backgroundColor:"#2e343e"}}});function qfA(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function gV(t){let e="hint",A=1;for(let i of t){let n=qfA(i.severity);n>A&&(A=n,e=i.severity)}return e}var b5=class extends qs{constructor(e){super(),this.diagnostics=e,this.severity=gV(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let i=this.diagnostics,n=e.state.facet(k5).tooltipFilter;return n&&(i=n(i,e.state)),i.length&&(A.onmouseover=()=>WfA(e,A,i)),A}};function VfA(t,e){let A=i=>{let n=e.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientXn.top-10&&i.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,VfA(t,e)}let{hoverTime:n}=t.state.facet(k5),o=setTimeout(i,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function ZfA(t,e){let A=Object.create(null);for(let n of e){let o=t.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let i=[];for(let n in A)i.push(new b5(A[n]).range(+n));return zn.of(i,!0)}var XfA=a5({class:"cm-gutter-lint",markers:t=>t.state.field(TS),widgetMarker:(t,e,A)=>{let i=[];return t.state.field(TS).between(A.from,A.to,(n,o,a)=>{n>A.from&&ni.is(zS)?i.value:A,t)},provide:t=>EQ.from(t)}),$fA=ai.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:w5('')},".cm-lint-marker-warning":{content:w5('')},".cm-lint-marker-error":{content:w5('')}}),cV=[ug,ai.decorations.compute([ug],t=>{let{selected:e,panel:A}=t.field(ug);return!e||!A||e.from==e.to?vt.none:vt.set([YfA.range(e.from,e.to)])}),vj(HfA,{hideOn:eV}),jfA],k5=qe.define({combine(t){return Ir(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function CV(t={}){return[k5.of(t),TS,XfA,$fA,lV]}var jS=class t{constructor(e,A,i,n,o,a,r,s,g,l=0,C){this.p=e,this.stack=A,this.state=i,this.reducePos=n,this.pos=o,this.score=a,this.buffer=r,this.bufferBase=s,this.curContext=g,this.lookAhead=l,this.parent=C}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,i=0){let n=e.parser.context;return new t(e,[],A,i,i,0,[],0,n?new S5(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let i=e>>19,n=e&65535,{parser:o}=this.p,a=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(g==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizes;)this.stack.pop();this.reduceContext(n,g)}storeNode(e,A,i,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&a.buffer[r-4]==0&&a.buffer[r-1]>-1){if(A==i)return;if(a.buffer[r-2]>=A){a.buffer[r-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(e,A,i,n);else{let a=this.buffer.length;if(a>0&&(this.buffer[a-4]!=0||this.buffer[a-1]<0)){let r=!1;for(let s=a;s>0&&this.buffer[s-2]>i;s-=4)if(this.buffer[s-1]>=0){r=!0;break}if(r)for(;a>0&&this.buffer[a-2]>i;)this.buffer[a]=this.buffer[a-4],this.buffer[a+1]=this.buffer[a-3],this.buffer[a+2]=this.buffer[a-2],this.buffer[a+3]=this.buffer[a-1],a-=4,n>4&&(n-=4)}this.buffer[a]=e,this.buffer[a+1]=A,this.buffer[a+2]=i,this.buffer[a+3]=n}}shift(e,A,i,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:a}=this.p;this.pos=n;let r=a.stateFlag(o,1);!r&&(n>i||A<=a.maxNode)&&(this.reducePos=n),this.pushState(o,r?i:Math.min(i,this.reducePos)),this.shiftContext(A,i),A<=a.maxNode&&this.buffer.push(A,i,n,4)}else this.pos=n,this.shiftContext(A,i),A<=this.p.parser.maxNode&&this.buffer.push(A,i,n,4)}apply(e,A,i,n){e&65536?this.reduce(e):this.shift(e,A,i,n)}useNode(e,A){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let i=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,i?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new qS(this);;){let i=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(i==0)return!1;if((i&65536)==0)return!0;A.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,a;os&1&&r==a)||n.push(A[o],a)}A=n}let i=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-i*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let a=this.findForcedReduction();if(a==null)return!1;A=a}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],i=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,a=>{if(!(a&393216))if(a&65536){let r=(a>>19)-o;if(r>1){let s=a&65535,g=this.stack.length-r*3;if(g>=0&&e.getGoto(this.stack[g],s,!1)>=0)return r<<19|65536|s}}else{let r=i(a,o+1);if(r!=null)return r}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;A0&&this.emitLookAhead()}},S5=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},qS=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},VS=class t{constructor(e,A,i){this.stack=e,this.pos=A,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new t(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function L3(t,e=Uint16Array){if(typeof t!="string")return t;let A=null;for(let i=0,n=0;i=92&&a--,a>=34&&a--;let s=a-32;if(s>=46&&(s-=46,r=!0),o+=s,r)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var yQ=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},IV=new yQ,WS=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=IV,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let i=this.range,n=this.rangeIndex,o=this.pos+e;for(;oi.to:o>=i.to;){if(n==this.ranges.length-1)return null;let a=this.ranges[++n];o+=a.from-i.to,i=a}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,i,n;if(A>=0&&A=this.chunk2Pos&&ir.to&&(this.chunk2=this.chunk2.slice(0,r.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(e,A=0){let i=A?this.resolveOffset(A,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=IV,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let i="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return i}},U2=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:i}=A.p;hV(this.data,e,A,this.id,i.data,i.tokenPrecTable)}};U2.prototype.contextual=U2.prototype.fallback=U2.prototype.extend=!1;var ZS=class{constructor(e,A,i){this.precTable=A,this.elseToken=i,this.data=typeof e=="string"?L3(e):e}token(e,A){let i=e.pos,n=0;for(;;){let o=e.next<0,a=e.resolveOffset(1,1);if(hV(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,a==null)break;e.reset(a,e.token)}n&&(e.reset(i,e.token),e.acceptToken(this.elseToken,n))}};ZS.prototype.contextual=U2.prototype.fallback=U2.prototype.extend=!1;function hV(t,e,A,i,n,o){let a=0,r=1<0){let B=t[d];if(s.allows(B)&&(e.token.value==-1||e.token.value==B||emA(B,e.token.value,n,o))){e.acceptToken(B);break}}let l=e.next,C=0,I=t[a+2];if(e.next<0&&I>C&&t[g+I*3-3]==65535){a=t[g+I*3-1];continue A}for(;C>1,B=g+d+(d<<1),Q=t[B],E=t[B+1]||65536;if(l=E)C=d+1;else{a=t[B+2],e.advance();continue A}}break}}function dV(t,e,A){for(let i=e,n;(n=t[i])!=65535;i++)if(n==A)return i-e;return-1}function emA(t,e,A,i){let n=dV(A,i,e);return n<0||dV(A,i,t)e)&&!i.type.isError)return A<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(t.length,Math.max(i.from+1,e+25));if(A<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return A<0?0:t.length}}var XS=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?BV(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?BV(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=a,null;if(o instanceof Ma){if(a==e){if(a=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(a),this.index.push(0))}else this.index[A]++,this.nextStart=a+o.length}}},$S=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new yQ)}getActions(e){let A=0,i=null,{parser:n}=e.p,{tokenizers:o}=n,a=n.stateSlot(e.state,3),r=e.curContext?e.curContext.hash:0,s=0;for(let g=0;gC.end+25&&(s=Math.max(C.lookAhead,s)),C.value!=0)){let I=A;if(C.extended>-1&&(A=this.addActions(e,C.extended,C.end,A)),A=this.addActions(e,C.value,C.end,A),!l.extend&&(i=C,A>I))break}}for(;this.actions.length>A;)this.actions.pop();return s&&e.setLookAhead(s),!i&&e.pos==this.stream.end&&(i=new yQ,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,A=this.addActions(e,i.value,i.end,A)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new yQ,{pos:i,p:n}=e;return A.start=i,A.end=Math.min(i+1,n.stream.end),A.value=i==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,i){let n=this.stream.clipPos(i.pos);if(A.token(this.stream.reset(n,e),i),e.value>-1){let{parser:o}=i.p;for(let a=0;a=0&&i.p.parser.dialect.allows(r>>1)){(r&1)==0?e.value=r>>1:e.extended=r>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,i,n){for(let o=0;oe.bufferLength*4?new XS(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[a]=e;for(;a.forceReduce()&&a.stack.length&&a.stack[a.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let a=0;aA)i.push(r);else{if(this.advanceStack(r,i,e))continue;{n||(n=[],o=[]),n.push(r);let s=this.tokens.getMainToken(r);o.push(s.value,s.end)}}break}}if(!i.length){let a=n&&tmA(n);if(a)return fg&&console.log("Finish with "+this.stackID(a)),this.stackToTree(a);if(this.parser.strict)throw fg&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let a=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(a)return fg&&console.log("Force-finish "+this.stackID(a)),this.stackToTree(a.forceAll())}if(this.recovering){let a=this.recovering==1?1:this.recovering*3;if(i.length>a)for(i.sort((r,s)=>s.score-r.score);i.length>a;)i.pop();i.some(r=>r.reducePos>A)&&this.recovering--}else if(i.length>1){A:for(let a=0;a500&&g.buffer.length>500)if((r.score-g.score||r.buffer.length-g.buffer.length)>0)i.splice(s--,1);else{i.splice(a--,1);continue A}}}i.length>12&&(i.sort((a,r)=>r.score-a.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let a=1;a ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let g=e.curContext&&e.curContext.tracker.strict,l=g?e.curContext.hash:0;for(let C=this.fragments.nodeAt(n);C;){let I=this.parser.nodeSet.types[C.type.id]==C.type?o.getGoto(e.state,C.type.id):-1;if(I>-1&&C.length&&(!g||(C.prop(wi.contextHash)||0)==l))return e.useNode(C,I),fg&&console.log(a+this.stackID(e)+` (via reuse of ${o.getName(C.type.id)})`),!0;if(!(C instanceof Ma)||C.children.length==0||C.positions[0]>0)break;let d=C.children[0];if(d instanceof Ma&&C.positions[0]==0)C=d;else break}}let r=o.stateSlot(e.state,4);if(r>0)return e.reduce(r),fg&&console.log(a+this.stackID(e)+` (via always-reduce ${o.getName(r&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let s=this.tokens.getActions(e);for(let g=0;gn?A.push(B):i.push(B)}return!1}advanceFully(e,A){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return QV(e,A),!0}}runRecovery(e,A,i){let n=null,o=!1;for(let a=0;a ":"";if(r.deadEnd&&(o||(o=!0,r.restart(),fg&&console.log(l+this.stackID(r)+" (restarted)"),this.advanceFully(r,i))))continue;let C=r.split(),I=l;for(let d=0;d<10&&C.forceReduce()&&(fg&&console.log(I+this.stackID(C)+" (via force-reduce)"),!this.advanceFully(C,i));d++)fg&&(I=this.stackID(C)+" -> ");for(let d of r.recoverByInsert(s))fg&&console.log(l+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>r.pos?(g==r.pos&&(g++,s=0),r.recoverByDelete(s,g),fg&&console.log(l+this.stackID(r)+` (via recover-delete ${this.parser.getName(s)})`),QV(r,i)):(!n||n.scoree.topRules[r][1]),n=[];for(let r=0;r=0)o(l,s,r[g++]);else{let C=r[g+-l];for(let I=-l;I>0;I--)o(r[g++],s,C);g++}}}this.nodeSet=new p3(A.map((r,s)=>ts.define({name:s>=this.minRepeatTerm?void 0:r,id:s,props:n[s],top:i.indexOf(s)>-1,error:s==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let a=L3(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let r=0;rtypeof r=="number"?new U2(a,r):r),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,i){let n=new Ax(this,e,A,i);for(let o of this.wrappers)n=o(n,e,A,i);return n}getGoto(e,A,i=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let a=n[o++],r=a&1,s=n[o++];if(r&&i)return s;for(let g=o+(a>>1);o0}validAction(e,A){return!!this.allActions(e,i=>i==A?!0:null)}allActions(e,A){let i=this.stateSlot(e,4),n=i?A(i):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=$0(this.data,o+2);else break;n=A($0(this.data,o+1))}return n}nextStates(e){let A=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=$0(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];A.some((o,a)=>a&1&&o==n)||A.push(this.data[i],n)}}return A}configure(e){let A=Object.assign(Object.create(t.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=i}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(i=>{let n=e.tokenizers.find(o=>o.from==i);return n?n.to:i})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=e.specializers.find(r=>r.from==i.external);if(!o)return i;let a=Object.assign(Object.assign({},i),{external:o.to});return A.specializers[n]=EV(a),a})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),i=A.map(()=>!1);if(e)for(let o of e.split(" ")){let a=A.indexOf(o);a>=0&&(i[a]=!0)}let n=null;for(let o=0;oi)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scoret.external(A,i)<<1|e}return t.get}var imA=d5({String:xe.string,Number:xe.number,"True False":xe.bool,PropertyName:xe.propertyName,Null:xe.null,", :":xe.separator,"[ ]":xe.squareBracket,"{ }":xe.brace}),uV=x5.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[imA],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var nmA=B5.define({name:"json",parser:uV.configure({props:[SS.add({Object:xS({except:/^\s*\}/}),Array:xS({except:/^\s*\]/})}),S3.add({"Object Array":Aq})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function fV(){return new Q5(nmA)}var mV=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t,Y2=class{constructor(e,A,i=0,n=e.length,o,a){this.test=a,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=o?r=>o(mV(r)):mV,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Fr(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=t3(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=Eg(e);let n=this.normalize(A);if(n.length)for(let o=0,a=i;;o++){let r=n.charCodeAt(o),s=this.match(r,a,this.bufferPos+this.bufferStart);if(o==n.length-1){if(s)return this.value=s,this;break}a==i&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let i=this.curLineStart+A.index,n=i+A[0].length;if(this.matchPos=G5(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||n.to<=A){let r=new t(A,e.sliceString(A,i));return tx.set(e,r),r}if(n.from==A&&n.to==i)return n;let{text:o,from:a}=n;return a>A&&(o=e.sliceString(A,a)+o,a=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let i=this.flat.from+A.index,n=i+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this.matchPos=G5(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=L5.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(F5.prototype[Symbol.iterator]=_5.prototype[Symbol.iterator]=function(){return this});function omA(t){try{return new RegExp(t,sx),!0}catch(e){return!1}}function G5(t,e){if(e>=t.length)return e;let A=t.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}var amA=t=>{let{state:e}=t,A=String(e.doc.lineAt(t.state.selection.main.head).number),{close:i,result:n}=Mj(t,{label:e.phrase("Go to line"),input:{type:"text",name:"line",value:A},focus:!0,submitLabel:e.phrase("go")});return n.then(o=>{let a=o&&/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(o.elements.line.value);if(!a){t.dispatch({effects:i});return}let r=e.doc.lineAt(e.selection.main.head),[,s,g,l,C]=a,I=l?+l.slice(1):0,d=g?+g:r.number;if(g&&C){let E=d/100;s&&(E=E*(s=="-"?-1:1)+r.number/e.doc.lines),d=Math.round(e.doc.lines*E)}else g&&s&&(d=d*(s=="-"?-1:1)+r.number);let B=e.doc.line(Math.max(1,Math.min(e.doc.lines,d))),Q=ce.cursor(B.from+Math.max(0,Math.min(I,B.length)));t.dispatch({effects:[i,ai.scrollIntoView(Q.from,{y:"center"})],selection:Q})}),!0},rmA={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},yV=qe.define({combine(t){return Ir(t,rmA,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function vV(t){let e=[CmA,cmA];return t&&e.push(yV.of(t)),e}var smA=vt.mark({class:"cm-selectionMatch"}),gmA=vt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function pV(t,e,A,i){return(A==0||t(e.sliceDoc(A-1,A))!=yo.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=yo.Word)}function lmA(t,e,A,i){return t(e.sliceDoc(A,A+1))==yo.Word&&t(e.sliceDoc(i-1,i))==yo.Word}var cmA=ho.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(yV),{state:A}=t,i=A.selection;if(i.ranges.length>1)return vt.none;let n=i.main,o,a=null;if(n.empty){if(!e.highlightWordAroundCursor)return vt.none;let s=A.wordAt(n.head);if(!s)return vt.none;a=A.charCategorizer(n.head),o=A.sliceDoc(s.from,s.to)}else{let s=n.to-n.from;if(s200)return vt.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),a=A.charCategorizer(n.head),!(pV(a,A,n.from,n.to)&&lmA(a,A,n.from,n.to)))return vt.none}else if(o=A.sliceDoc(n.from,n.to),!o)return vt.none}let r=[];for(let s of t.visibleRanges){let g=new Y2(A.doc,o,s.from,s.to);for(;!g.next().done;){let{from:l,to:C}=g.value;if((!a||pV(a,A,l,C))&&(n.empty&&l<=n.from&&C>=n.to?r.push(gmA.range(l,C)):(l>=n.to||C<=n.from)&&r.push(smA.range(l,C)),r.length>e.maxMatches))return vt.none}}return vt.set(r)}},{decorations:t=>t.decorations}),CmA=ai.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),ImA=({state:t,dispatch:e})=>{let{selection:A}=t,i=ce.create(A.ranges.map(n=>t.wordAt(n.head)||ce.cursor(n.head)),A.mainIndex);return i.eq(A)?!1:(e(t.update({selection:i})),!0)};function dmA(t,e){let{main:A,ranges:i}=t.selection,n=t.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let a=!1,r=new Y2(t.doc,e,i[i.length-1].to);;)if(r.next(),r.done){if(a)return null;r=new Y2(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),a=!0}else{if(a&&i.some(s=>s.from==r.value.from))continue;if(o){let s=t.wordAt(r.value.from);if(!s||s.from!=r.value.from||s.to!=r.value.to)continue}return r.value}}var BmA=({state:t,dispatch:e})=>{let{ranges:A}=t.selection;if(A.some(o=>o.from===o.to))return ImA({state:t,dispatch:e});let i=t.sliceDoc(A[0].from,A[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=dmA(t,i);return n?(e(t.update({selection:t.selection.addRange(ce.range(n.from,n.to),!1),effects:ai.scrollIntoView(n.to)})),!0):!1},S1=qe.define({combine(t){return Ir(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new ax(e),scrollToMatch:e=>ai.scrollIntoView(e)})}});function bV(t){return t?[S1.of(t),rx]:rx}var K5=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||omA(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord,this.test=e.test}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,i)=>i=="n"?` `:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord&&this.test==e.test}create(){return this.regexp?new nx(this):new ix(this)}getCursor(e,A=0,i){let n=e.doc?e:Ga.create({doc:e});return i==null&&(i=n.doc.length),this.regexp?bQ(this,n,A,i):vQ(this,n,A,i)}},U5=class{constructor(e){this.spec=e}};function QmA(t,e,A){return(i,n,o,a)=>{if(A&&!A(i,n,o,a))return!1;let r=i>=a&&n<=a+o.length?o.slice(i-a,n-a):e.doc.sliceString(i,n);return t(r,e,i,n)}}function vQ(t,e,A,i){let n;return t.wholeWord&&(n=EmA(e.doc,e.charCategorizer(e.selection.main.head))),t.test&&(n=QmA(t.test,e,n)),new Y2(e.doc,t.unquoted,A,i,t.caseSensitive?void 0:o=>o.toLowerCase(),n)}function EmA(t,e){return(A,i,n,o)=>((o>A||o+n.length=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=vQ(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function hmA(t,e,A){return(i,n,o)=>(!A||A(i,n,o))&&t(o[0],e,i,n)}function bQ(t,e,A,i){let n;return t.wholeWord&&(n=umA(e.charCategorizer(e.selection.main.head))),t.test&&(n=hmA(t.test,e,n)),new F5(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:n},A,i)}function J5(t,e){return t.slice(_a(t,e,!1),e)}function Y5(t,e){return t.slice(e,_a(t,e))}function umA(t){return(e,A,i)=>!i[0].length||(t(J5(i.input,i.index))!=yo.Word||t(Y5(i.input,i.index))!=yo.Word)&&(t(Y5(i.input,i.index+i[0].length))!=yo.Word||t(J5(i.input,i.index+i[0].length))!=yo.Word)}var nx=class extends U5{nextMatch(e,A,i){let n=bQ(this.spec,e,i,e.doc.length).next();return n.done&&(n=bQ(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,i){for(let n=1;;n++){let o=Math.max(A,i-n*1e4),a=bQ(this.spec,e,o,i),r=null;for(;!a.next().done;)r=a.value;if(r&&(o==A||r.from>o+10))return r;if(o==A)return null}}prevMatch(e,A,i){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=bQ(this.spec,e,Math.max(0,A-250),Math.min(i+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},G3=Ui.define(),gx=Ui.define(),J2=Qa.define({create(t){return new _3(ox(t).create(),null)},update(t,e){for(let A of e.effects)A.is(G3)?t=new _3(A.value.create(),t.panel):A.is(gx)&&(t=new _3(t.query,A.value?lx:null));return t},provide:t=>m1.from(t,e=>e.panel)});var _3=class{constructor(e,A){this.query=e,this.panel=A}},fmA=vt.mark({class:"cm-searchMatch"}),mmA=vt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),pmA=ho.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(J2))}update(t){let e=t.state.field(J2);(e!=t.startState.field(J2)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return vt.none;let{view:A}=this,i=new Nr;for(let n=0,o=A.visibleRanges,a=o.length;no[n+1].from-500;)s=o[++n].to;t.highlight(A.state,r,s,(g,l)=>{let C=A.state.selection.ranges.some(I=>I.from==g&&I.to==l);i.add(g,l,C?mmA:fmA)})}return i.finish()}},{decorations:t=>t.decorations});function K3(t){return e=>{let A=e.state.field(J2,!1);return A&&A.query.spec.valid?t(e,A):O5(e)}}var H5=K3((t,{query:e})=>{let{to:A}=t.state.selection.main,i=e.nextMatch(t.state,A,A);if(!i)return!1;let n=ce.single(i.from,i.to),o=t.state.facet(S1);return t.dispatch({selection:n,effects:[cx(t,i),o.scrollToMatch(n.main,t)],userEvent:"select.search"}),kV(t),!0}),T5=K3((t,{query:e})=>{let{state:A}=t,{from:i}=A.selection.main,n=e.prevMatch(A,i,i);if(!n)return!1;let o=ce.single(n.from,n.to),a=t.state.facet(S1);return t.dispatch({selection:o,effects:[cx(t,n),a.scrollToMatch(o.main,t)],userEvent:"select.search"}),kV(t),!0}),DmA=K3((t,{query:e})=>{let A=e.matchAll(t.state,1e3);return!A||!A.length?!1:(t.dispatch({selection:ce.create(A.map(i=>ce.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),wmA=({state:t,dispatch:e})=>{let A=t.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:i,to:n}=A.main,o=[],a=0;for(let r=new Y2(t.doc,t.sliceDoc(i,n));!r.next().done;){if(o.length>1e3)return!1;r.value.from==i&&(a=o.length),o.push(ce.range(r.value.from,r.value.to))}return e(t.update({selection:ce.create(o,a),userEvent:"select.search.matches"})),!0},DV=K3((t,{query:e})=>{let{state:A}=t,{from:i,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,i,i);if(!o)return!1;let a=o,r=[],s,g,l=[];a.from==i&&a.to==n&&(g=A.toText(e.getReplacement(a)),r.push({from:a.from,to:a.to,insert:g}),a=e.nextMatch(A,a.from,a.to),l.push(ai.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(i).number)+".")));let C=t.state.changes(r);return a&&(s=ce.single(a.from,a.to).map(C),l.push(cx(t,a)),l.push(A.facet(S1).scrollToMatch(s.main,t))),t.dispatch({changes:C,selection:s,effects:l,userEvent:"input.replace"}),!0}),ymA=K3((t,{query:e})=>{if(t.state.readOnly)return!1;let A=e.matchAll(t.state,1e9).map(n=>{let{from:o,to:a}=n;return{from:o,to:a,insert:e.getReplacement(n)}});if(!A.length)return!1;let i=t.state.phrase("replaced $ matches",A.length)+".";return t.dispatch({changes:A,effects:ai.announce.of(i),userEvent:"input.replace.all"}),!0});function lx(t){return t.state.facet(S1).createPanel(t)}function ox(t,e){var A,i,n,o,a;let r=t.selection.main,s=r.empty||r.to>r.from+100?"":t.sliceDoc(r.from,r.to);if(e&&!s)return e;let g=t.facet(S1);return new K5({search:((A=e?.literal)!==null&&A!==void 0?A:g.literal)?s:s.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:g.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:g.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:g.regexp,wholeWord:(a=e?.wholeWord)!==null&&a!==void 0?a:g.wholeWord})}function MV(t){let e=f3(t,lx);return e&&e.dom.querySelector("[main-field]")}function kV(t){let e=MV(t);e&&e==t.root.activeElement&&e.select()}var O5=t=>{let e=t.state.field(J2,!1);if(e&&e.panel){let A=MV(t);if(A&&A!=t.root.activeElement){let i=ox(t.state,e.query.spec);i.valid&&t.dispatch({effects:G3.of(i)}),A.focus(),A.select()}}else t.dispatch({effects:[gx.of(!0),e?G3.of(ox(t.state,e.query.spec)):Ui.appendConfig.of(rx)]});return!0},z5=t=>{let e=t.state.field(J2,!1);if(!e||!e.panel)return!1;let A=f3(t,lx);return A&&A.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:gx.of(!1)}),!0},SV=[{key:"Mod-f",run:O5,scope:"editor search-panel"},{key:"F3",run:H5,shift:T5,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:H5,shift:T5,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:z5,scope:"editor search-panel"},{key:"Mod-Shift-l",run:wmA},{key:"Mod-Alt-g",run:amA},{key:"Mod-d",run:BmA,preventDefault:!0}],ax=class{constructor(e){this.view=e;let A=this.query=e.state.field(J2).query.spec;this.commit=this.commit.bind(this),this.searchField=Pn("input",{value:A.search,placeholder:mg(e,"Find"),"aria-label":mg(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Pn("input",{value:A.replace,placeholder:mg(e,"Replace"),"aria-label":mg(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Pn("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=Pn("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=Pn("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function i(n,o,a){return Pn("button",{class:"cm-button",name:n,onclick:o,type:"button"},a)}this.dom=Pn("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,i("next",()=>H5(e),[mg(e,"next")]),i("prev",()=>T5(e),[mg(e,"previous")]),i("select",()=>DmA(e),[mg(e,"all")]),Pn("label",null,[this.caseField,mg(e,"match case")]),Pn("label",null,[this.reField,mg(e,"regexp")]),Pn("label",null,[this.wordField,mg(e,"by word")]),...e.state.readOnly?[]:[Pn("br"),this.replaceField,i("replace",()=>DV(e),[mg(e,"replace")]),i("replaceAll",()=>ymA(e),[mg(e,"replace all")])],Pn("button",{name:"close",onclick:()=>z5(e),"aria-label":mg(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new K5({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:G3.of(e)}))}keydown(e){dj(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?T5:H5)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),DV(this.view))}update(e){for(let A of e.transactions)for(let i of A.effects)i.is(G3)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(S1).top}};function mg(t,e){return t.state.phrase(e)}var R5=30,N5=/[\s\.,:;?!]/;function cx(t,{from:e,to:A}){let i=t.state.doc.lineAt(e),n=t.state.doc.lineAt(A).to,o=Math.max(i.from,e-R5),a=Math.min(n,A+R5),r=t.state.sliceDoc(o,a);if(o!=i.from){for(let s=0;sr.length-R5;s--)if(!N5.test(r[s-1])&&N5.test(r[s])){r=r.slice(0,s);break}}return ai.announce.of(`${t.state.phrase("current match")}. ${r} ${t.state.phrase("on line")} ${i.number}.`)}var vmA=ai.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),rx=[J2,zl.low(pmA),vmA];var j5=class{constructor(e,A,i,n){this.state=e,this.pos=A,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=Br(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),i=Math.max(A.from,this.pos-250),n=A.text.slice(i-A.from,this.pos-A.from),o=n.search(KV(e,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function xV(t){let e=Object.keys(t).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function bmA(t){let e=Object.create(null),A=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,i]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:bmA(e);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var q5=class{constructor(e,A,i,n){this.completion=e,this.source=A,this.match=i,this.score=n}};function R1(t){return t.selection.main.from}function KV(t,e){var A;let{source:i}=t,n=e&&i[0]!="^",o=i[i.length-1]!="$";return!n&&!o?t:new RegExp(`${n?"^":""}(?:${i})${o?"$":""}`,(A=t.flags)!==null&&A!==void 0?A:t.ignoreCase?"i":"")}var UV=Os.define();function kmA(t,e,A,i){let{main:n}=t.selection,o=A-n.from,a=i-n.from;return Ve(BA({},t.changeByRange(r=>{if(r!=n&&A!=i&&t.sliceDoc(r.from+o,r.from+a)!=t.sliceDoc(A,i))return{range:r};let s=t.toText(e);return{changes:{from:r.from+o,to:i==n.from?r.to:r.from+a,insert:s},range:ce.cursor(r.from+o+s.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var RV=new WeakMap;function SmA(t){if(!Array.isArray(t))return t;let e=RV.get(t);return e||RV.set(t,e=MmA(t)),e}var V5=Ui.define(),U3=Ui.define(),Bx=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&v<=57||v>=97&&v<=122?2:v>=65&&v<=90?1:0:(F=t3(v))!=F.toLowerCase()?1:F!=F.toUpperCase()?2:0;(!b||G==1&&E||M==0&&G!=0)&&(A[C]==v||i[C]==v&&(I=!0)?a[C++]=b:a.length&&(f=!1)),M=G,b+=Eg(v)}return C==s&&a[0]==0&&f?this.result(-100+(I?-200:0),a,e):d==s&&B==0?this.ret(-200-e.length+(Q==e.length?0:-100),[0,Q]):r>-1?this.ret(-700-e.length,[r,r+this.pattern.length]):d==s?this.ret(-900-e.length,[B,Q]):C==s?this.result(-100+(I?-200:0)+-700+(f?0:-1100),a,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,i){let n=[],o=0;for(let a of A){let r=a+(this.astral?Eg(Fr(i,a)):1);o&&n[o-1]==a?n[o-1]=r:(n[o++]=a,n[o++]=r)}return this.ret(e-i.length,n)}},Qx=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:xmA,filterStrict:!1,compareCompletions:(e,A)=>(e.sortText||e.label).localeCompare(A.sortText||A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>i=>NV(e(i),A(i)),optionClass:(e,A)=>i=>NV(e(i),A(i)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function NV(t,e){return t?e?t+" "+e:t:e}function xmA(t,e,A,i,n,o){let a=t.textDirection==go.RTL,r=a,s=!1,g="top",l,C,I=e.left-n.left,d=n.right-e.right,B=i.right-i.left,Q=i.bottom-i.top;if(r&&I=Q||b>e.top?l=A.bottom-e.top:(g="bottom",l=e.bottom-A.top)}let E=(e.bottom-e.top)/o.offsetHeight,f=(e.right-e.left)/o.offsetWidth;return{style:`${g}: ${l/E}px; max-width: ${C/f}px`,class:"cm-completionInfo-"+(s?a?"left-narrow":"right-narrow":r?"left":"right")}}var mx=Ui.define();function RmA(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(A){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),A.type&&i.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(A,i,n,o){let a=document.createElement("span");a.className="cm-completionLabel";let r=A.displayLabel||A.label,s=0;for(let g=0;gs&&a.appendChild(document.createTextNode(r.slice(s,l)));let I=a.appendChild(document.createElement("span"));I.appendChild(document.createTextNode(r.slice(l,C))),I.className="cm-completionMatchedText",s=C}return sA.position-i.position).map(A=>A.render)}function Cx(t,e,A){if(t<=A)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let i=Math.floor((t-e)/A);return{from:t-(i+1)*A,to:t-i*A}}var Ex=class{constructor(e,A,i){this.view=e,this.stateField=A,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:s=>this.placeInfo(s),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:a}=n.open,r=e.state.facet(Qr);this.optionContent=RmA(r),this.optionClass=r.optionClass,this.tooltipClass=r.tooltipClass,this.range=Cx(o.length,a,r.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",s=>{let{options:g}=e.state.field(A).open;for(let l=s.target,C;l&&l!=this.dom;l=l.parentNode)if(l.nodeName=="LI"&&(C=/-(\d+)$/.exec(l.id))&&+C[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;l!=null&&(e.dispatch({effects:mx.of(l)}),s.preventDefault())}}),this.dom.addEventListener("focusout",s=>{let g=e.state.field(this.stateField,!1);g&&g.tooltip&&e.state.facet(Qr).closeOnBlur&&s.relatedTarget!=e.contentDOM&&e.dispatch({effects:U3.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:o,selected:a,disabled:r}=i.open;(!n.open||n.open.options!=o)&&(this.range=Cx(o.length,a,e.state.facet(Qr).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),r!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!r)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of A.split(" "))i&&this.dom.classList.add(i);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;(A.selected>-1&&A.selected=this.range.to)&&(this.range=Cx(A.options.length,A.selected,this.view.state.facet(Qr).maxRenderedOptions),this.showOptions(A.options,e.id));let i=this.updateSelectedOption(A.selected);if(i){this.destroyInfo();let{completion:n}=A.options[A.selected],{info:o}=n;if(!o)return;let a=typeof o=="string"?document.createTextNode(o):o(n);if(!a)return;"then"in a?a.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,n)}).catch(r=>dr(this.view.state,r,"completion info")):(this.addInfoPane(a,n),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,A){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!="LI"||!i.id?n--:n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),A=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return A&&FmA(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let a=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:a.clientWidth,bottom:a.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{a.target==n&&a.preventDefault()});let o=null;for(let a=i.from;ai.from||i.from==0))if(o=I,typeof g!="string"&&g.header)n.appendChild(g.header(g));else{let d=n.appendChild(document.createElement("completion-section"));d.textContent=I}}let l=n.appendChild(document.createElement("li"));l.id=A+"-"+a,l.setAttribute("role","option");let C=this.optionClass(r);C&&(l.className=C);for(let I of this.optionContent){let d=I(r,this.view.state,this.view,s);d&&l.appendChild(d)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew Ex(A,t,e)}function FmA(t,e){let A=t.getBoundingClientRect(),i=e.getBoundingClientRect(),n=A.height/t.offsetHeight;i.topA.bottom&&(t.scrollTop+=(i.bottom-A.bottom)/n)}function FV(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function LmA(t,e){let A=[],i=null,n=null,o=l=>{A.push(l);let{section:C}=l.completion;if(C){i||(i=[]);let I=typeof C=="string"?C:C.name;i.some(d=>d.name==I)||i.push(typeof C=="string"?{name:I}:C)}},a=e.facet(Qr);for(let l of t)if(l.hasResult()){let C=l.result.getMatch;if(l.result.filter===!1)for(let I of l.result.options)o(new q5(I,l.source,C?C(I):[],1e9-A.length));else{let I=e.sliceDoc(l.from,l.to),d,B=a.filterStrict?new Qx(I):new Bx(I);for(let Q of l.result.options)if(d=B.match(Q.label)){let E=Q.displayLabel?C?C(Q,d.matched):[]:d.matched,f=d.score+(Q.boost||0);if(o(new q5(Q,l.source,E,f)),typeof Q.section=="object"&&Q.section.rank==="dynamic"){let{name:b}=Q.section;n||(n=Object.create(null)),n[b]=Math.max(f,n[b]||-1e9)}}}}if(i){let l=Object.create(null),C=0,I=(d,B)=>(d.rank==="dynamic"&&B.rank==="dynamic"?n[B.name]-n[d.name]:0)||(typeof d.rank=="number"?d.rank:1e9)-(typeof B.rank=="number"?B.rank:1e9)||(d.nameI.score-C.score||g(C.completion,I.completion))){let C=l.completion;!s||s.label!=C.label||s.detail!=C.detail||s.type!=null&&C.type!=null&&s.type!=C.type||s.apply!=C.apply||s.boost!=C.boost?r.push(l):FV(l.completion)>FV(s)&&(r[r.length-1]=l),s=l.completion}return r}var hx=class t{constructor(e,A,i,n,o,a){this.options=e,this.attrs=A,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=a}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new t(this.options,LV(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,i,n,o,a){if(n&&!a&&e.some(g=>g.isPending))return n.setDisabled();let r=LmA(e,A);if(!r.length)return n&&e.some(g=>g.isPending)?n.setDisabled():null;let s=A.facet(Qr).selectOnOpen?0:-1;if(n&&n.selected!=s&&n.selected!=-1){let g=n.options[n.selected].completion;for(let l=0;ll.hasResult()?Math.min(g,l.from):g,1e8),create:YmA,above:o.aboveCursor},n?n.timestamp:Date.now(),s,!1)}map(e){return new t(this.options,this.attrs,Ve(BA({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},ux=class t{constructor(e,A,i){this.active=e,this.id=A,this.open=i}static start(){return new t(UmA,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,i=A.facet(Qr),o=(i.override||A.languageDataAt("autocomplete",R1(A)).map(SmA)).map(s=>(this.active.find(l=>l.source==s)||new AC(s,this.active.some(l=>l.state!=0)?1:0)).update(e,i));o.length==this.active.length&&o.every((s,g)=>s==this.active[g])&&(o=this.active);let a=this.open,r=e.effects.some(s=>s.is(px));a&&e.docChanged&&(a=a.map(e.changes)),e.selection||o.some(s=>s.hasResult()&&e.changes.touchesRange(s.from,s.to))||!_mA(o,this.active)||r?a=hx.build(o,A,this.id,a,i,r):a&&a.disabled&&!o.some(s=>s.isPending)&&(a=null),!a&&o.every(s=>!s.isPending)&&o.some(s=>s.hasResult())&&(o=o.map(s=>s.hasResult()?new AC(s.source,0):s));for(let s of e.effects)s.is(mx)&&(a=a&&a.setSelected(s.value,this.id));return o==this.active&&a==this.open?this:new t(o,this.id,a)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?GmA:KmA}};function _mA(t,e){if(t==e)return!0;for(let A=0,i=0;;){for(;A-1&&(A["aria-activedescendant"]=t+"-"+e),A}var UmA=[];function JV(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(UV);if(i&&e.activateOnCompletion(i))return 12}let A=t.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}var AC=class t{constructor(e,A,i=!1){this.source=e,this.state=A,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let i=JV(e,A),n=this;(i&8||i&16&&this.touches(e))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(e,i);for(let o of e.effects)if(o.is(V5))n=new t(n.source,1,o.value);else if(o.is(U3))n=new t(n.source,0);else if(o.is(px))for(let a of o.value)a.source==n.source&&(n=a);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(R1(e.state))}},W5=class t extends AC{constructor(e,A,i,n,o,a){super(e,3,A),this.limit=i,this.result=n,this.from=o,this.to=a}hasResult(){return!0}updateFor(e,A){var i;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),a=e.changes.mapPos(this.to,1),r=R1(e.state);if(r>a||!n||A&2&&(R1(e.startState)==this.from||rA.map(e))}}),Vs=Qa.define({create(){return ux.start()},update(t,e){return t.update(e)},provide:t=>[EQ.from(t,e=>e.tooltip),ai.contentAttributes.from(t,e=>e.attrs)]});function Dx(t,e){let A=e.completion.apply||e.completion.label,i=t.state.field(Vs).active.find(n=>n.source==e.source);return i instanceof W5?(typeof A=="string"?t.dispatch(Ve(BA({},kmA(t.state,A,i.from,i.to)),{annotations:UV.of(e.completion)})):A(t,e.completion,i.from,i.to),!0):!1}var YmA=NmA(Vs,Dx);function P5(t,e="option"){return A=>{let i=A.state.field(Vs,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+n*(t?1:-1):t?0:a-1;return r<0?r=e=="page"?0:a-1:r>=a&&(r=e=="page"?a-1:0),A.dispatch({effects:mx.of(r)}),!0}}var HmA=t=>{let e=t.state.field(Vs,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.state.field(Vs,!1)?(t.dispatch({effects:V5.of(!0)}),!0):!1,TmA=t=>{let e=t.state.field(Vs,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(t.dispatch({effects:U3.of(null)}),!0)},fx=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},OmA=50,zmA=1e3,PmA=ho.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(Vs).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(Vs),A=t.state.facet(Qr);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Vs)==e)return;let i=t.transactions.some(o=>{let a=JV(o,A);return a&8||(o.selection||o.docChanged)&&!(a&3)});for(let o=0;oOmA&&Date.now()-a.time>zmA){for(let r of a.context.abortListeners)try{r()}catch(s){dr(this.view.state,s)}a.context.abortListeners=null,this.running.splice(o--,1)}else a.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(a=>a.is(V5)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(a=>a.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(Vs);for(let A of e.active)A.isPending&&!this.running.some(i=>i.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Qr).updateSyncTime))}startQuery(t){let{state:e}=this.view,A=R1(e),i=new j5(e,A,t.explicit,this.view),n=new fx(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:U3.of(null)}),dr(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Qr).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(Qr),i=this.view.state.field(Vs);for(let n=0;nr.source==o.active.source);if(a&&a.isPending)if(o.done==null){let r=new AC(o.active.source,0);for(let s of o.updates)r=r.update(s,A);r.isPending||e.push(r)}else this.startQuery(a)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:px.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(Vs,!1);if(e&&e.tooltip&&this.view.state.facet(Qr).closeOnBlur){let A=e.open&&oS(this.view,e.open.tooltip);(!A||!A.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:U3.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:V5.of(!1)}),20),this.composing=0}}}),jmA=typeof navigator=="object"&&/Win/.test(navigator.platform),qmA=zl.highest(ai.domEventHandlers({keydown(t,e){let A=e.state.field(Vs,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||t.key.length>1||t.ctrlKey&&!(jmA&&t.altKey)||t.metaKey)return!1;let i=A.open.options[A.open.selected],n=A.active.find(a=>a.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&Dx(e,i),!1}})),VmA=ai.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var J3={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},x1=Ui.define({map(t,e){let A=e.mapPos(t,-1,xr.TrackAfter);return A??void 0}}),wx=new class extends Zg{};wx.startSide=1;wx.endSide=-1;var YV=Qa.define({create(){return zn.empty},update(t,e){if(t=t.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=A.from&&i<=A.to})}for(let A of e.effects)A.is(x1)&&(t=t.update({add:[wx.range(A.value,A.value+1)]}));return t}});function HV(){return[ZmA,YV]}var dx="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function TV(t){for(let e=0;e{if((WmA?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&Eg(Fr(i,0))==1||e!=n.from||A!=n.to)return!1;let o=$mA(t.state,i);return o?(t.dispatch(o),!0):!1}),XmA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=OV(t,t.selection.main.head).brackets||J3.brackets,n=null,o=t.changeByRange(a=>{if(a.empty){let r=ApA(t.doc,a.head);for(let s of i)if(s==r&&Z5(t.doc,a.head)==TV(Fr(s,0)))return{changes:{from:a.head-s.length,to:a.head+s.length},range:ce.cursor(a.head-s.length)}}return{range:n=a}});return n||e(t.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},zV=[{key:"Backspace",run:XmA}];function $mA(t,e){let A=OV(t,t.selection.main.head),i=A.brackets||J3.brackets;for(let n of i){let o=TV(Fr(n,0));if(e==n)return o==n?ipA(t,n,i.indexOf(n+n+n)>-1,A):epA(t,n,o,A.before||J3.before);if(e==o&&PV(t,t.selection.main.from))return tpA(t,n,o)}return null}function PV(t,e){let A=!1;return t.field(YV).between(0,t.doc.length,i=>{i==e&&(A=!0)}),A}function Z5(t,e){let A=t.sliceString(e,e+2);return A.slice(0,Eg(Fr(A,0)))}function ApA(t,e){let A=t.sliceString(e-2,e);return Eg(Fr(A,0))==A.length?A:A.slice(1)}function epA(t,e,A,i){let n=null,o=t.changeByRange(a=>{if(!a.empty)return{changes:[{insert:e,from:a.from},{insert:A,from:a.to}],effects:x1.of(a.to+e.length),range:ce.range(a.anchor+e.length,a.head+e.length)};let r=Z5(t.doc,a.head);return!r||/\s/.test(r)||i.indexOf(r)>-1?{changes:{insert:e+A,from:a.head},effects:x1.of(a.head+e.length),range:ce.cursor(a.head+e.length)}:{range:n=a}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function tpA(t,e,A){let i=null,n=t.changeByRange(o=>o.empty&&Z5(t.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:ce.cursor(o.head+A.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function ipA(t,e,A,i){let n=i.stringPrefixes||J3.stringPrefixes,o=null,a=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:e,from:r.to}],effects:x1.of(r.to+e.length),range:ce.range(r.anchor+e.length,r.head+e.length)};let s=r.head,g=Z5(t.doc,s),l;if(g==e){if(_V(t,s))return{changes:{insert:e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)};if(PV(t,s)){let I=A&&t.sliceDoc(s,s+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:s,to:s+I.length,insert:I},range:ce.cursor(s+I.length)}}}else{if(A&&t.sliceDoc(s-2*e.length,s)==e+e&&(l=GV(t,s-2*e.length,n))>-1&&_V(t,l))return{changes:{insert:e+e+e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)};if(t.charCategorizer(s)(g)!=yo.Word&&GV(t,s,n)>-1&&!npA(t,s,e,n))return{changes:{insert:e+e,from:s},effects:x1.of(s+e.length),range:ce.cursor(s+e.length)}}return{range:o=r}});return o?null:t.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function _V(t,e){let A=Br(t).resolveInner(e+1);return A.parent&&A.from==e}function npA(t,e,A,i){let n=Br(t).resolveInner(e,-1),o=i.reduce((a,r)=>Math.max(a,r.length),0);for(let a=0;a<5;a++){let r=t.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),s=r.indexOf(A);if(!s||s>-1&&i.indexOf(r.slice(0,s))>-1){let l=n.firstChild;for(;l&&l.from==n.from&&l.to-l.from>A.length+s;){if(t.sliceDoc(l.to-A.length,l.to)==A)return!1;l=l.firstChild}return!0}let g=n.to==e&&n.parent;if(!g)break;n=g}return!1}function GV(t,e,A){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=yo.Word)return e;for(let n of A){let o=e-n.length;if(t.sliceDoc(o,e)==n&&i(t.sliceDoc(o-1,o))!=yo.Word)return o}return-1}function jV(t={}){return[qmA,Vs,Qr.of(t),PmA,opA,VmA]}var yx=[{key:"Ctrl-Space",run:Ix},{mac:"Alt-`",run:Ix},{mac:"Alt-i",run:Ix},{key:"Escape",run:TmA},{key:"ArrowDown",run:P5(!0)},{key:"ArrowUp",run:P5(!1)},{key:"PageDown",run:P5(!0,"page")},{key:"PageUp",run:P5(!1,"page")},{key:"Enter",run:HmA}],opA=zl.highest(QQ.computeN([Qr],t=>t.facet(Qr).defaultKeymap?[yx]:[]));function apA(t,e=t.state){let A=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let a=e.doc.lineAt(o);A.has(a)||A.add(a),o=a.to+1}}return A}function vx(t){let e=t.selection.main.head;return t.doc.lineAt(e)}function qV(t,e){let A=0;A:for(let i=0;i=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=qV(e.text,this.state.tabSize),i=Math.floor(A/this.unitWidth);return this.set(e,A,i)}closestNonEmpty(e,A){let i=e.number+A;for(;A===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let a=this.get(i);if(!a.empty)return a}let o=this.state.doc.line(i);if(o.text.trim().length){let a=qV(o.text,this.state.tabSize),r=Math.floor(a/this.unitWidth);return this.set(o,a,r)}i+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=vx(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let i,n;for(i=A.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level0&&s.push(X5("--indent-marker-bg-color",i,e,r,g)),s.push(X5("--indent-marker-active-bg-color",n,e,a-1,1)),a!==o&&s.push(X5("--indent-marker-bg-color",i,e,a,o-a))}else s.push(X5("--indent-marker-bg-color",i,e,r,o-r));return s.join(",")}var Mx=class{constructor(e){this.view=e,this.unitWidth=Xl(e.state),this.currentLineNumber=vx(e.state).number,this.generate(e.state)}update(e){let A=Xl(e.state),i=A!==this.unitWidth;i&&(this.unitWidth=A);let n=vx(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let a=e.state.facet($5).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||i||a)&&this.generate(e.state)}generate(e){let A=new Nr,i=apA(this.view,e),{hideFirstIndent:n,markerType:o,thickness:a,activeThickness:r}=e.facet($5),s=new bx(i,e,this.unitWidth,o);for(let g of i){let l=s.get(g.number);if(!l?.level)continue;let C=spA(l,this.unitWidth,n,a,r);A.add(g.from,g.from,vt.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${C}`}}))}this.decorations=A.finish()}};function VV(t={}){return[$5.of(t),rpA(t.colors),ho.fromClass(Mx,{decorations:e=>e.decorations})]}var gpA=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],lpA=["mainAxis","crossAxis","limiter"];function IZ(t,e){if(t==null)return{};var A,i,n=(function(a,r){if(a==null)return{};var s={};for(var g in a)if({}.hasOwnProperty.call(a,g)){if(r.indexOf(g)!==-1)continue;s[g]=a[g]}return s})(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i{};function hpA(t){return t()}function iR(t){for(var e=0;e{t=A,e=i}),resolve:t,reject:e}}var upA=1<<24,cE=16,qD=32,uZ=64,KR=128,rc=512,Gr=1024,sc=2048,hC=4096,l0=8192,CE=16384,UR=32768,P1=65536,fpA=1<<17,fZ=1<<18,mZ=1<<19,iC=1<<25,bD=32768,nR=1<<21,tI=1<<23,c0=Symbol("$state"),pZ=Symbol("legacy props"),mpA=Symbol(""),UQ=new class extends Error{constructor(){super(...arguments),a0(this,"name","StaleReactionError"),a0(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function Bu(t){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function DZ(t){return t===this.v}function wZ(t,e){return t!=t?e==e:t!==e||t!==null&&typeof t=="object"||typeof t=="function"}function yZ(t){return!wZ(t,this.v)}var Ao=null;function XQ(t){Ao=t}function cI(t){return vZ().get(t)}function kt(t){Ao={p:Ao,i:!1,c:null,e:null,s:t,x:null,l:lE&&!(arguments.length>1&&arguments[1]!==void 0&&arguments[1])?{s:null,u:null,$:[]}:null}}function St(t){var e=Ao,A=e.e;if(A!==null)for(var i of(e.e=null,A))TZ(i);return t!==void 0&&(e.x=t),e.i=!0,Ao=e.p,t??{}}function IE(){return!lE||Ao!==null&&Ao.l===null}function vZ(t){var e,A;return Ao===null&&Bu(),(A=(e=Ao).c)!==null&&A!==void 0?A:e.c=new Map((function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null})(Ao)||void 0)}var J1=[];function bZ(){var t=J1;J1=[],iR(t)}function j1(t){if(J1.length===0&&!X3){var e=J1;queueMicrotask(()=>{e===J1&&bZ()})}J1.push(t)}function ppA(){for(;J1.length>0;)bZ()}function MZ(t){var e=Gn;if(e===null)return _n.f|=tI,t;if((e.f&UR)===0){if((e.f&KR)===0)throw t;e.b.error(t)}else $Q(t,e)}function $Q(t,e){for(;e!==null;){if((e.f&KR)!==0)try{return void e.b.error(t)}catch(A){t=A}e=e.parent}throw t}var uD=new Set,bo=null,Z3=null,sl=null,rl=[],VD=null,oR=!1,X3=!1,MD=new WeakMap,AD=new WeakMap,_1=new WeakMap,G1=new WeakMap,eD=new WeakMap,fD=new WeakMap,mD=new WeakMap,Dg=new WeakSet,q1=class t{constructor(){dZ(this,Dg),a0(this,"committed",!1),a0(this,"current",new Map),a0(this,"previous",new Map),lo(this,MD,new Set),lo(this,AD,new Set),lo(this,_1,0),lo(this,G1,0),lo(this,eD,null),lo(this,fD,[]),lo(this,mD,[]),a0(this,"skipped_effects",new Set),a0(this,"is_fork",!1)}is_deferred(){return this.is_fork||De(G1,this)>0}process(e){rl=[],Z3=null,this.apply();var A,i={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var n of e)Ua(Dg,this,kZ).call(this,n,i);this.is_fork||Ua(Dg,this,DpA).call(this),this.is_deferred()?(Ua(Dg,this,zQ).call(this,i.effects),Ua(Dg,this,zQ).call(this,i.render_effects),Ua(Dg,this,zQ).call(this,i.block_effects)):(Z3=this,bo=null,eW(i.render_effects),eW(i.effects),Z3=null,(A=De(eD,this))===null||A===void 0||A.resolve()),sl=null}capture(e,A){var i;this.previous.has(e)||this.previous.set(e,A),(e.f&tI)===0&&(this.current.set(e,e.v),(i=sl)===null||i===void 0||i.set(e,e.v))}activate(){bo=this,this.apply()}deactivate(){bo===this&&(bo=null,sl=null)}flush(){if(this.activate(),rl.length>0){if(xZ(),bo!==null&&bo!==this)return}else De(_1,this)===0&&this.process([]);this.deactivate()}discard(){for(var e of De(AD,this))e(this);De(AD,this).clear()}increment(e){on(_1,this,De(_1,this)+1),e&&on(G1,this,De(G1,this)+1)}decrement(e){on(_1,this,De(_1,this)-1),e&&on(G1,this,De(G1,this)-1),this.revive()}revive(){for(var e of De(fD,this))Ur(e,sc),V1(e);for(var A of De(mD,this))Ur(A,hC),V1(A);on(fD,this,[]),on(mD,this,[]),this.flush()}oncommit(e){De(MD,this).add(e)}ondiscard(e){De(AD,this).add(e)}settled(){var e;return((e=De(eD,this))!==null&&e!==void 0?e:on(eD,this,hZ())).promise}static ensure(){if(bo===null){var e=bo=new t;uD.add(bo),X3||t.enqueue(()=>{bo===e&&e.flush()})}return bo}static enqueue(e){j1(e)}apply(){}};function kZ(t,e){t.f^=Gr;for(var A=t.first;A!==null;){var i,n=A.f,o=!!(96&n),a=o&&(n&Gr)!==0||(n&l0)!==0||this.skipped_effects.has(A);if((A.f&KR)!==0&&(i=A.b)!==null&&i!==void 0&&i.is_pending()&&(e={parent:e,effect:A,effects:[],render_effects:[],block_effects:[]}),!a&&A.fn!==null){o?A.f^=Gr:4&n?e.effects.push(A):QE(A)&&((A.f&cE)!==0&&e.block_effects.push(A),tE(A));var r=A.first;if(r!==null){A=r;continue}}var s=A.parent;for(A=A.next;A===null&&s!==null;)s===e.effect&&(Ua(Dg,this,zQ).call(this,e.effects),Ua(Dg,this,zQ).call(this,e.render_effects),Ua(Dg,this,zQ).call(this,e.block_effects),e=e.parent),A=s.next,s=s.parent}}function zQ(t){for(var e of t)((e.f&sc)!==0?De(fD,this):De(mD,this)).push(e),Ua(Dg,this,SZ).call(this,e.deps),Ur(e,Gr)}function SZ(t){if(t!==null)for(var e of t)2&e.f&&(e.f&bD)!==0&&(e.f^=bD,Ua(Dg,this,SZ).call(this,e.deps))}function DpA(){if(De(G1,this)===0){for(var t of De(MD,this))t();De(MD,this).clear()}De(_1,this)===0&&Ua(Dg,this,wpA).call(this)}function wpA(){if(uD.size>1){this.previous.clear();var t=sl,e=!0,A={parent:null,effect:null,effects:[],render_effects:[],block_effects:[]};for(var i of uD)if(i!==this){var n=[];for(var[o,a]of this.current){if(i.current.has(o)){if(!e||a===i.current.get(o))continue;i.current.set(o,a)}n.push(o)}if(n.length!==0){var r=[...i.current.keys()].filter(d=>!this.current.has(d));if(r.length>0){var s=rl;rl=[];var g=new Set,l=new Map;for(var C of n)RZ(C,r,g,l);if(rl.length>0){for(var I of(bo=i,i.apply(),rl))Ua(Dg,i,kZ).call(i,I,A);i.deactivate()}rl=s}}}else e=!1;bo=null,sl=t}this.committed=!0,uD.delete(this)}function uo(t){var e=X3;X3=!0;try{for(;;){var A;if(ppA(),rl.length===0&&((A=bo)===null||A===void 0||A.flush(),rl.length===0))return void(VD=null);xZ()}}finally{X3=e}}function xZ(){var t=H1;oR=!0;try{var e=0;for(kD(!0);rl.length>0;){var A=q1.ensure();e++>1e3&&ypA(),A.process(rl),iI.clear()}}finally{oR=!1,kD(t),VD=null}}function ypA(){try{(function(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")})()}catch(t){$Q(t,VD)}}var oC=null;function eW(t){var e=t.length;if(e!==0){for(var A=0;A0)){for(var o of(iI.clear(),oC))if(!(24576&o.f)){for(var a=[o],r=o.parent;r!==null;)oC.has(r)&&(oC.delete(r),a.push(r)),r=r.parent;for(var s=a.length-1;s>=0;s--){var g=a[s];24576&g.f||tE(g)}}oC.clear()}}oC=null}}function RZ(t,e,A,i){if(!A.has(t)&&(A.add(t),t.reactions!==null))for(var n of t.reactions){var o=n.f;2&o?RZ(n,e,A,i):4194320&o&&(o&sc)===0&&NZ(n,e,i)&&(Ur(n,sc),V1(n))}}function NZ(t,e,A){var i=A.get(t);if(i!==void 0)return i;if(t.deps!==null)for(var n of t.deps){if(e.includes(n))return!0;if(2&n.f&&NZ(n,e,A))return A.set(n,!0),!0}return A.set(t,!1),!1}function V1(t){for(var e=VD=t;e.parent!==null;){var A=(e=e.parent).f;if(oR&&e===Gn&&(A&cE)!==0&&(A&fZ)===0)return;if(96&A){if((A&Gr)===0)return;e.f^=Gr}}rl.push(e)}var j2=new WeakMap,X2=new WeakMap,vpA=new WeakMap,K1=new WeakMap,xx=new WeakMap,Z2=new WeakMap,q2=new WeakMap,sC=new WeakMap,H2=new WeakMap,Y1=new WeakMap,PQ=new WeakMap,MQ=new WeakMap,jQ=new WeakMap,H3=new WeakMap,kQ=new WeakMap,tW=new WeakMap,O2=new WeakSet,aR=class{constructor(e,A,i){var n,o,a,r;dZ(this,O2),a0(this,"parent",void 0),lo(this,j2,!1),lo(this,X2,void 0),lo(this,vpA,null),lo(this,K1,void 0),lo(this,xx,void 0),lo(this,Z2,void 0),lo(this,q2,null),lo(this,sC,null),lo(this,H2,null),lo(this,Y1,null),lo(this,PQ,null),lo(this,MQ,0),lo(this,jQ,0),lo(this,H3,!1),lo(this,kQ,null),lo(this,tW,(n=()=>(on(kQ,this,uC(De(MQ,this))),()=>{on(kQ,this,null)}),a=0,r=uC(0),()=>{Au()&&(c(r),dE(()=>(a===0&&(o=QA(()=>n(()=>$3(r)))),a+=1,()=>{j1(()=>{var s;(a-=1)==0&&((s=o)===null||s===void 0||s(),o=void 0,$3(r))})})))})),on(X2,this,e),on(K1,this,A),on(xx,this,i),this.parent=Gn.b,on(j2,this,!!De(K1,this).pending),on(Z2,this,BE(()=>{Gn.b=this;var s=Ua(O2,this,bpA).call(this);try{on(q2,this,C0(()=>i(s)))}catch(g){this.error(g)}return De(jQ,this)>0?Ua(O2,this,nW).call(this):on(j2,this,!1),()=>{var g;(g=De(PQ,this))===null||g===void 0||g.remove()}},589952))}is_pending(){return De(j2,this)||!!this.parent&&this.parent.is_pending()}has_pending_snippet(){return!!De(K1,this).pending}update_pending_count(e){Ua(O2,this,FZ).call(this,e),on(MQ,this,De(MQ,this)+e),De(kQ,this)&&AE(De(kQ,this),De(MQ,this))}get_effect_pending(){return De(tW,this).call(this),c(De(kQ,this))}error(e){var A=De(K1,this).onerror,i=De(K1,this).failed;if(De(H3,this)||!A&&!i)throw e;De(q2,this)&&(Kr(De(q2,this)),on(q2,this,null)),De(sC,this)&&(Kr(De(sC,this)),on(sC,this,null)),De(H2,this)&&(Kr(De(H2,this)),on(H2,this,null));var n=!1,o=!1,a=()=>{n?console.warn("https://svelte.dev/e/svelte_boundary_reset_noop"):(n=!0,o&&(function(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")})(),q1.ensure(),on(MQ,this,0),De(H2,this)!==null&&eE(De(H2,this),()=>{on(H2,this,null)}),on(j2,this,this.has_pending_snippet()),on(q2,this,Ua(O2,this,iW).call(this,()=>(on(H3,this,!1),C0(()=>De(xx,this).call(this,De(X2,this)))))),De(jQ,this)>0?Ua(O2,this,nW).call(this):on(j2,this,!1))},r=_n;try{Ag(null),o=!0,A?.(e,a),o=!1}catch(s){$Q(s,De(Z2,this)&&De(Z2,this).parent)}finally{Ag(r)}i&&j1(()=>{on(H2,this,Ua(O2,this,iW).call(this,()=>{q1.ensure(),on(H3,this,!0);try{return C0(()=>{i(De(X2,this),()=>e,()=>a)})}catch(s){return $Q(s,De(Z2,this).parent),null}finally{on(H3,this,!1)}}))})}};function bpA(){var t=De(X2,this);return De(j2,this)&&(on(PQ,this,nI()),De(X2,this).before(De(PQ,this)),t=De(PQ,this)),t}function iW(t){var e=Gn,A=_n,i=Ao;ll(De(Z2,this)),Ag(De(Z2,this)),XQ(De(Z2,this).ctx);try{return t()}catch(n){return MZ(n),null}finally{ll(e),Ag(A),XQ(i)}}function nW(){var t=De(K1,this).pending;De(q2,this)!==null&&(on(Y1,this,document.createDocumentFragment()),De(Y1,this).append(De(PQ,this)),ZZ(De(q2,this),De(Y1,this))),De(sC,this)===null&&on(sC,this,C0(()=>t(De(X2,this))))}function FZ(t){var e;this.has_pending_snippet()?(on(jQ,this,De(jQ,this)+t),De(jQ,this)===0&&(on(j2,this,!1),De(sC,this)&&eE(De(sC,this),()=>{on(sC,this,null)}),De(Y1,this)&&(De(X2,this).before(De(Y1,this)),on(Y1,this,null)))):this.parent&&Ua(O2,e=this.parent,FZ).call(e,t)}function LZ(t,e,A,i){var n=IE()?Qu:et;if(A.length!==0||t.length!==0){var o=bo,a=Gn,r=(function(){var g=Gn,l=_n,C=Ao,I=bo;return function(){var d=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];ll(g),Ag(l),XQ(C),d&&I?.activate()}})();t.length>0?Promise.all(t).then(()=>{r();try{return s()}finally{o?.deactivate(),tD()}}):s()}else i(e.map(n));function s(){Promise.all(A.map(g=>(function(l){var C=Gn;C===null&&(function(){throw new Error("https://svelte.dev/e/async_derived_orphan")})();var I=C.b,d=void 0,B=uC(_r),Q=!_n,E=new Map;return(function(f){lc(4718592,f,!0)})(()=>{var f=hZ();d=f.promise;try{Promise.resolve(l()).then(f.resolve,f.reject).then(()=>{b===bo&&b.committed&&b.deactivate(),tD()})}catch(F){f.reject(F),tD()}var b=bo;if(Q){var R,M=!I.is_pending();I.update_pending_count(1),b.increment(M),(R=E.get(b))===null||R===void 0||R.reject(UQ),E.delete(b),E.set(b,f)}var v=function(F){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:void 0;if(b.activate(),G)G!==UQ&&(B.f|=tI,AE(B,G));else for(var[U,Y]of((B.f&tI)!==0&&(B.f^=tI),AE(B,F),E)){if(E.delete(U),U===b)break;Y.reject(UQ)}Q&&(I.update_pending_count(-1),b.decrement(M))};f.promise.then(v,F=>v(null,F||"unknown"))}),ZD(()=>{for(var f of E.values())f.reject(UQ)}),new Promise(f=>{function b(R){function M(){R===d?f(B):b(d)}R.then(M,M)}b(d)})})(g))).then(g=>{r();try{i([...e.map(n),...g])}catch(l){(a.f&CE)===0&&$Q(l,a)}o?.deactivate(),tD()}).catch(g=>{$Q(g,a)})}}function tD(){ll(null),Ag(null),XQ(null)}function Qu(t){var e=_n!==null&&2&_n.f?_n:null;return Gn!==null&&(Gn.f|=mZ),{ctx:Ao,deps:null,effects:null,equals:DZ,f:2050,fn:t,reactions:null,rv:0,v:_r,wv:0,parent:e??Gn,ac:null}}function Zs(t){var e=Qu(t);return XZ(e),e}function et(t){var e=Qu(t);return e.equals=yZ,e}function _Z(t){var e=t.effects;if(e!==null){t.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=uC(t);return i||(o.equals=yZ),lE&&n&&Ao!==null&&Ao.l!==null&&((A=(e=Ao.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function yg(t,e){return x(t,QA(()=>c(t))),e}function x(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return _n===null||s0&&(_n.f&fpA)===0||!IE()||!(4325394&_n.f)||(A=BC)!==null&&A!==void 0&&A.includes(t)||(function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")})(),AE(t,i?JQ(e):e)}function AE(t,e){if(!t.equals(e)){var A=t.v;td?iI.set(t,e):iI.set(t,A),t.v=e;var i=q1.ensure();i.capture(t,A),2&t.f&&((t.f&sc)!==0&&JR(t),Ur(t,(t.f&rc)!==0?Gr:hC)),t.wv=AX(),YZ(t,sc),!IE()||Gn===null||(Gn.f&Gr)===0||96&Gn.f||(il===null?(function(n){il=n})([t]):il.push(t)),!i.is_fork&&Rx.size>0&&!oW&&(function(){oW=!1;var n=H1;kD(!0);var o=Array.from(Rx);try{for(var a of o)(a.f&Gr)!==0&&Ur(a,hC),QE(a)&&tE(a)}finally{kD(n)}Rx.clear()})()}return e}function aW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=c(t),i=e===1?A++:A--;return x(t,A),i}function $3(t){x(t,t.v+1)}function YZ(t,e){var A=t.reactions;if(A!==null)for(var i=IE(),n=A.length,o=0;o{if(T1===o)return r();var s=_n,g=T1;Ag(null),lW(o);var l=r();return Ag(s),lW(g),l};return i&&A.set("length",nC(t.length)),new Proxy(t,{defineProperty(r,s,g){"value"in g&&g.configurable!==!1&&g.enumerable!==!1&&g.writable!==!1||(function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")})();var l=A.get(s);return l===void 0?l=a(()=>{var C=nC(g.value);return A.set(s,C),C}):x(l,g.value,!0),!0},deleteProperty(r,s){var g=A.get(s);if(g===void 0){if(s in r){var l=a(()=>nC(_r));A.set(s,l),$3(n)}}else x(g,_r),$3(n);return!0},get(r,s,g){var l;if(s===c0)return t;var C=A.get(s),I=s in r;if(C===void 0&&(!I||(l=IC(r,s))!==null&&l!==void 0&&l.writable)&&(C=a(()=>nC(JQ(I?r[s]:_r))),A.set(s,C)),C!==void 0){var d=c(C);return d===_r?void 0:d}return Reflect.get(r,s,g)},getOwnPropertyDescriptor(r,s){var g=Reflect.getOwnPropertyDescriptor(r,s);if(g&&"value"in g){var l=A.get(s);l&&(g.value=c(l))}else if(g===void 0){var C=A.get(s),I=C?.v;if(C!==void 0&&I!==_r)return{enumerable:!0,configurable:!0,value:I,writable:!0}}return g},has(r,s){var g;if(s===c0)return!0;var l=A.get(s),C=l!==void 0&&l.v!==_r||Reflect.has(r,s);return(l!==void 0||Gn!==null&&(!C||(g=IC(r,s))!==null&&g!==void 0&&g.writable))&&(l===void 0&&(l=a(()=>nC(C?JQ(r[s]):_r)),A.set(s,l)),c(l)===_r)?!1:C},set(r,s,g,l){var C,I=A.get(s),d=s in r;if(i&&s==="length")for(var B=g;BnC(_r)),A.set(B+"",Q))}I===void 0?(!d||(C=IC(r,s))!==null&&C!==void 0&&C.writable)&&(x(I=a(()=>nC(void 0)),JQ(g)),A.set(s,I)):(d=I.v!==_r,x(I,a(()=>JQ(g))));var E=Reflect.getOwnPropertyDescriptor(r,s);if(E!=null&&E.set&&E.set.call(l,g),!d){if(i&&typeof s=="string"){var f=A.get("length"),b=Number(s);Number.isInteger(b)&&b>=f.v&&x(f,b+1)}$3(n)}return!0},ownKeys(r){c(n);var s=Reflect.ownKeys(r).filter(C=>{var I=A.get(C);return I===void 0||I.v!==_r});for(var[g,l]of A)l.v===_r||g in r||s.push(g);return s},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function rW(t){try{if(t!==null&&typeof t=="object"&&c0 in t)return t[c0]}catch(e){}return t}function MpA(t,e){return Object.is(rW(t),rW(e))}function nI(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(t)}function vg(t){return UZ.call(t)}function Eu(t){return JZ.call(t)}function cA(t,e){return vg(t)}function $e(t){var e=vg(t);return e instanceof Comment&&e.data===""?Eu(e):e}function bA(t){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=t;e--;)A=Eu(A);return A}var sW=!1;function WD(t){var e=_n,A=Gn;Ag(null),ll(null);try{return t()}finally{Ag(e),ll(A)}}function kpA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;t.addEventListener(e,()=>WD(A));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),sW||(sW=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var a of o.target.elements){var r;(r=a.__on_r)===null||r===void 0||r.call(a)}})},{capture:!0}))}function HZ(t){Gn===null&&(_n===null&&(function(){throw new Error("https://svelte.dev/e/effect_orphan")})(),(function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")})()),td&&(function(){throw new Error("https://svelte.dev/e/effect_in_teardown")})()}function lc(t,e,A){var i=Gn;i!==null&&(i.f&l0)!==0&&(t|=l0);var n={ctx:Ao,deps:null,nodes:null,f:t|sc|rc,first:null,fn:e,last:null,next:null,parent:i,b:i&&i.b,prev:null,teardown:null,wv:0,ac:null};if(A)try{tE(n),n.f|=UR}catch(s){throw Kr(n),s}else e!==null&&V1(n);var o=n;if(A&&o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&(o.f&mZ)===0&&(o=o.first,(t&cE)!==0&&(t&P1)!==0&&o!==null&&(o.f|=P1)),o!==null&&(o.parent=i,i!==null&&(function(s,g){var l=g.last;l===null?g.last=g.first=s:(l.next=s,s.prev=l,g.last=s)})(o,i),_n!==null&&2&_n.f&&(t&uZ)===0)){var a,r=_n;((a=r.effects)!==null&&a!==void 0?a:r.effects=[]).push(o)}return n}function Au(){return _n!==null&&!s0}function ZD(t){var e=lc(8,null,!1);return Ur(e,Gr),e.teardown=t,e}function rR(t){HZ();var e=Gn.f;if(!(!_n&&(e&qD)!==0&&(e&UR)===0))return TZ(t);var A,i=Ao;((A=i.e)!==null&&A!==void 0?A:i.e=[]).push(t)}function TZ(t){return lc(1048580,t,!1)}function Er(t){return lc(4,t,!1)}function RA(t,e){var A={effect:null,ran:!1,deps:t};Ao.l.$.push(A),A.effect=dE(()=>{t(),A.ran||(A.ran=!0,QA(e))})}function mn(){var t=Ao;dE(()=>{for(var e of t.l.$){e.deps();var A=e.effect;(A.f&Gr)!==0&&Ur(A,hC),QE(A)&&tE(A),e.ran=!1}})}function dE(t){return lc(8|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function ve(t){LZ(arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],e=>{lc(8,()=>t(...e.map(c)),!0)})}function BE(t){return lc(cE|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function OZ(t){return lc(upA|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function C0(t){return lc(524320,t,!0)}function zZ(t){var e=t.teardown;if(e!==null){var A=td,i=_n;gW(!0),Ag(null);try{e.call(null)}finally{gW(A),Ag(i)}}}function PZ(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=t.first;t.first=t.last=null;for(var i,n=function(){var o=A.ac;o!==null&&WD(()=>{o.abort(UQ)}),i=A.next,(A.f&uZ)!==0?A.parent=null:Kr(A,e),A=i};A!==null;)n()}function Kr(t){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;!e&&(t.f&fZ)===0||t.nodes===null||t.nodes.end===null||(jZ(t.nodes.start,t.nodes.end),A=!0),PZ(t,e&&!A),SD(t,0),Ur(t,CE);var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)n.stop();zZ(t);var o=t.parent;o!==null&&o.first!==null&&qZ(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes=t.ac=null}function jZ(t,e){for(;t!==null;){var A=t===e?null:Eu(t);t.remove(),t=A}}function qZ(t){var e=t.parent,A=t.prev,i=t.next;A!==null&&(A.next=i),i!==null&&(i.prev=A),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=A))}function eE(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];VZ(t,i,!0);var n=()=>{A&&Kr(t),e&&e()},o=i.length;if(o>0){var a=()=>--o||n();for(var r of i)r.out(a)}else n()}function VZ(t,e,A){if((t.f&l0)===0){t.f^=l0;var i=t.nodes&&t.nodes.t;if(i!==null)for(var n of i)(n.is_global||A)&&e.push(n);for(var o=t.first;o!==null;){var a=o.next;VZ(o,e,((o.f&P1)!==0||(o.f&qD)!==0&&(t.f&cE)!==0)&&A),o=a}}}function sR(t){WZ(t,!0)}function WZ(t,e){if((t.f&l0)!==0){t.f^=l0,(t.f&Gr)===0&&(Ur(t,sc),V1(t));for(var A=t.first;A!==null;){var i=A.next;WZ(A,((A.f&P1)!==0||(A.f&qD)!==0)&&e),A=i}var n=t.nodes&&t.nodes.t;if(n!==null)for(var o of n)(o.is_global||e)&&o.in()}}function ZZ(t,e){if(t.nodes)for(var A=t.nodes.start,i=t.nodes.end;A!==null;){var n=A===i?null:Eu(A);e.append(A),A=n}}var SpA=null;var H1=!1;function kD(t){H1=t}var td=!1;function gW(t){td=t}var _n=null,s0=!1;function Ag(t){_n=t}var Gn=null;function ll(t){Gn=t}var BC=null;function XZ(t){_n!==null&&(BC===null?BC=[t]:BC.push(t))}var fs=null,pg=0,il=null,$Z=1,eu=0,T1=eu;function lW(t){T1=t}function AX(){return++$Z}function QE(t){var e=t.f;if((e&sc)!==0)return!0;if(2&e&&(t.f&=-32769),(e&hC)!==0){var A=t.deps;if(A!==null)for(var i=A.length,n=0;nt.wv)return!0}(e&rc)!==0&&sl===null&&Ur(t,Gr)}return!1}function eX(t,e){var A,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((A=BC)===null||A===void 0||!A.includes(t)))for(var o=0;o{t.ac.abort(UQ)}),t.ac=null);try{t.f|=nR;var l=(0,t.fn)(),C=t.deps;if(fs!==null){var I;if(SD(t,pg),C!==null&&pg>0)for(C.length=pg+fs.length,I=0;I1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!="object"||t===null||t instanceof EventTarget||e.has(t))){for(var A in e.add(t),t instanceof Date&&t.getTime(),t)try{gR(t[A],e)}catch(r){}var i=GR(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=EZ(i);for(var o in n){var a=n[o].get;if(a)try{a.call(t)}catch(r){}}}}}var rX=new Set,lR=new Set;function sX(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||j3.call(e,o),!o.cancelBubble)return WD(()=>A?.call(this,o))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?j1(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function ue(t,e,A,i,n){var o={capture:i,passive:n},a=sX(t,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&ZD(()=>{e.removeEventListener(t,a,o)})}function hu(t){for(var e=0;ea||i});var C=_n,I=Gn;Ag(null),ll(null);try{for(var d,B=[];a!==null;){var Q=a.assignedSlot||a.parentNode||a.host||null;try{var E=a["__"+n];E==null||a.disabled&&t.target!==a||E.call(a,t)}catch(R){d?B.push(R):d=R}if(t.cancelBubble||Q===A||Q===null)break;a=Q}if(d){var f=function(R){queueMicrotask(()=>{throw R})};for(var b of B)f(b);throw d}}finally{t.__root=A,delete t.currentTarget,Ag(C),ll(I)}}}function YR(t){var e=document.createElement("template");return e.innerHTML=t.replaceAll("",""),e.content}function W1(t,e){var A=Gn;A.nodes===null&&(A.nodes={start:t,end:e,a:null,t:null})}function FA(t,e){var A,i=!!(1&e),n=!!(2&e),o=!t.startsWith("");return()=>{A===void 0&&(A=YR(o?t:""+t),i||(A=vg(A)));var a=n||KZ?document.importNode(A,!0):A.cloneNode(!0);return i?W1(vg(a),a.lastChild):W1(a,a),a}}function CI(t,e){return(function(A,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",a=!A.startsWith(""),r=!!(1&i),s="<".concat(o,">").concat(a?A:""+A,"");return()=>{if(!n){var g=vg(YR(s));if(r)for(n=document.createDocumentFragment();vg(g);)n.appendChild(vg(g));else n=vg(g)}var l=n.cloneNode(!0);return r?W1(vg(l),l.lastChild):W1(l,l),l}})(t,e,"svg")}function tr(){var t=nI((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return W1(t,t),t}function yi(){var t=document.createDocumentFragment(),e=document.createComment(""),A=nI();return t.append(e,A),W1(e,A),t}function lA(t,e){t!==null&&t.before(e)}var NpA=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],FpA={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},LpA=["touchstart","touchmove"];function _pA(t){return LpA.includes(t)}function xt(t,e){var A,i=e==null?"":typeof e=="object"?e+"":e;i!==((A=t.__t)!==null&&A!==void 0?A:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+"")}function GpA(t,e){return(function(A,i){var{target:n,anchor:o,props:a={},events:r,context:s,intro:g=!0}=i;(function(){if(dC===void 0){dC=window,KZ=/Firefox/.test(navigator.userAgent);var B=Element.prototype,Q=Node.prototype,E=Text.prototype;UZ=IC(Q,"firstChild").get,JZ=IC(Q,"nextSibling").get,AW(B)&&(B.__click=void 0,B.__className=void 0,B.__attributes=null,B.__style=void 0,B.__e=void 0),AW(E)&&(E.__t=void 0)}})();var l=new Set,C=B=>{for(var Q=0;Q0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(f=>{E.outro?eE(Q,()=>{Kr(Q),f(void 0)}):(Kr(Q),f(void 0))})}})(()=>{var B=o??n.appendChild(nI());return(function(Q,E,f){new aR(Q,E,f)})(B,{pending:()=>{}},Q=>{s&&(kt({}),Ao.c=s),r&&(a.$$events=r),I=A(Q,a)||{},s&&St()}),()=>{for(var Q of l){n.removeEventListener(Q,j3);var E=SQ.get(Q);--E===0?(document.removeEventListener(Q,j3),SQ.delete(Q)):SQ.set(Q,E)}var f;lR.delete(C),B!==o&&((f=B.parentNode)===null||f===void 0||f.removeChild(B))}});return cR.set(I,d),I})(t,e)}var SQ=new Map,cR=new WeakMap,xQ,eC=new WeakMap,N1=new WeakMap,tC=new WeakMap,T3=new WeakMap,Nx=new WeakMap,cW=new WeakMap,KpA=new WeakMap,iE=class{constructor(e){var A=this,i=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1];a0(this,"anchor",void 0),lo(this,eC,new Map),lo(this,N1,new Map),lo(this,tC,new Map),lo(this,T3,new Set),lo(this,Nx,!0),lo(this,cW,()=>{var n=bo;if(De(eC,this).has(n)){var o=De(eC,this).get(n),a=De(N1,this).get(o);if(a)sR(a),De(T3,this).delete(o);else{var r=De(tC,this).get(o);r&&(De(N1,this).set(o,r.effect),De(tC,this).delete(o),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),a=r.effect)}for(var[s,g]of De(eC,this)){if(De(eC,this).delete(s),s===n)break;var l=De(tC,this).get(g);l&&(Kr(l.effect),De(tC,this).delete(g))}var C=function(B,Q){if(B===o||De(T3,A).has(B))return 1;var E=()=>{if(Array.from(De(eC,A).values()).includes(B)){var f=document.createDocumentFragment();ZZ(Q,f),f.append(nI()),De(tC,A).set(B,{effect:Q,fragment:f})}else Kr(Q);De(T3,A).delete(B),De(N1,A).delete(B)};De(Nx,A)||!a?(De(T3,A).add(B),eE(Q,E,!1)):E()};for(var[I,d]of De(N1,this))C(I,d)}}),lo(this,KpA,n=>{De(eC,this).delete(n);var o=Array.from(De(eC,this).values());for(var[a,r]of De(tC,this))o.includes(a)||(Kr(r.effect),De(tC,this).delete(a))}),this.anchor=e,on(Nx,this,i)}ensure(e,A){var i=bo;!A||De(N1,this).has(e)||De(tC,this).has(e)||De(N1,this).set(e,C0(()=>A(this.anchor))),De(eC,this).set(i,e),De(cW,this).call(this)}};function Jr(t){Ao===null&&Bu(),lE&&Ao.l!==null?gX(Ao).m.push(t):rR(()=>{var e=QA(t);if(typeof e=="function")return e})}function cl(t){Ao===null&&Bu(),Jr(()=>()=>QA(t))}function UpA(){var t=Ao;return t===null&&Bu(),(e,A,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[e];if(o){var a=du(o)?o.slice():[o],r=(function(g,l){var{bubbles:C=!1,cancelable:I=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(g,{detail:l,bubbles:C,cancelable:I})})(e,A,i);for(var s of a)s.call(t.x,r);return!r.defaultPrevented}return!0}}function JpA(t){Ao===null&&Bu(),Ao.l===null&&(function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")})(),gX(Ao).b.push(t)}function gX(t){var e,A=t.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function YA(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=new iE(t);function n(o,a){i.ensure(o,a)}BE(()=>{var o=!1;e(function(a){o=!0,n(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],a)}),o||n(!1,null)},A?P1:0)}function lX(t,e,A){var i=new iE(t),n=!IE();BE(()=>{var o=e();n&&o!==null&&typeof o=="object"&&(o={}),i.ensure(o,A)})}function ha(t,e){return e}function Fx(t){for(var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=0;A5&&arguments[5]!==void 0?arguments[5]:null,a=t,r=new Map;!(4&e)||(a=t.appendChild(nI()));var s,g=null,l=et(()=>{var Q=A();return du(Q)?Q:Q==null?[]:hD(Q)}),C=!0;function I(){B.fallback=g,(function(Q,E,f,b,R){var M,v,F,G,U,Y=!!(8&b),j=E.length,AA=Q.items,z=Q.effect.first,yA=null,P=[],nA=[];if(Y)for(U=0;U0){var HA=4&b&&j===0?f:null;if(Y){for(U=0;U{if(be){if(be.pending.delete(ht),be.done.add(ht),be.pending.size===0){var Me=EA.outrogroups;Fx(hD(be.done)),Me.delete(be),Me.size===0&&(EA.outrogroups=null)}}else pA-=1},!1)},Et=0;Et<_A;Et++)Rt();if(pA===0){var Qe=MA!==null;if(Qe){var _t=MA,Ue=_t.parentNode;Ue.textContent="",Ue.append(_t),EA.items.clear()}Fx(ZA,!Qe)}else{var Te;be={pending:new Set(ZA),done:new Set},((Te=EA.outrogroups)!==null&&Te!==void 0?Te:EA.outrogroups=new Set).add(be)}})(Q,ze,HA)}}Y&&j1(()=>{if(v!==void 0)for(G of v){var EA;(EA=G.nodes)===null||EA===void 0||(EA=EA.a)===null||EA===void 0||EA.apply()}})})(B,s,a,e,i),g!==null&&(s.length===0?(g.f&iC)===0?sR(g):(g.f^=iC,O3(g,null,a)):eE(g,()=>{g=null}))}var d=BE(()=>{for(var Q=(s=c(l)).length,E=new Set,f=0;fo(a)):(g=C0(()=>o(xQ??(xQ=nI())))).f|=iC),C||I(),c(l)}),B={effect:d,items:r,outrogroups:null,fallback:g};C=!1}function YpA(t,e,A,i,n,o,a,r){var s=1&a?16&a?uC(A):CA(A,!1,!1):null,g=2&a?uC(n):null;return{v:s,i:g,e:C0(()=>(o(e,s??A,g??n,r),()=>{t.delete(i)}))}}function O3(t,e,A){if(t.nodes)for(var i=t.nodes.start,n=t.nodes.end,o=e&&(e.f&iC)===0?e.nodes.start:A;i!==null;){var a=Eu(i);if(o.before(i),i===n)return;i=a}}function T2(t,e,A){e===null?t.effect.first=A:e.next=A,A===null?t.effect.last=e:A.prev=e}function cX(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o="";ve(()=>{var a,r=Gn;if(o!==(o=(a=e())!==null&&a!==void 0?a:"")&&(r.nodes!==null&&(jZ(r.nodes.start,r.nodes.end),r.nodes=null),o!=="")){var s=o+"";A?s="".concat(s,""):i&&(s="".concat(s,""));var g=YR(s);if((A||i)&&(g=vg(g)),W1(vg(g),g.lastChild),A||i)for(;vg(g);)n.before(vg(g));else n.before(g)}})}function Aa(t,e,A,i,n){var o,a=(o=e.$$slots)===null||o===void 0?void 0:o[A],r=!1;a===!0&&(a=e[A==="default"?"children":A],r=!0),a===void 0?n!==null&&n(t):a(t,r?()=>i:i)}function CX(t,e,A){var i=new iE(t);BE(()=>{var n,o=(n=e())!==null&&n!==void 0?n:null;i.ensure(o,o&&(a=>A(a,o)))},P1)}function as(t,e,A){Er(()=>{var i=QA(()=>e(t,A?.())||{});if(A&&i!=null&&i.update){var n=!1,o={};dE(()=>{var a=A();_(a),n&&wZ(o,a)&&(o=a,i.update(a))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function HpA(t,e){var A,i=void 0;OZ(()=>{i!==(i=e())&&(A&&(Kr(A),A=null),i&&(A=C0(()=>{Er(()=>i(t))})))})}function IX(t){var e,A,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var i in t){var n=t[i];n!=null&&n!==""&&(A+=" "+i+": "+n+e)}return A}function Lx(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Xt(t,e,A,i,n,o){var a=t.__className;if(a!==A||a===void 0){var r=(function(l,C,I){var d=l==null?"":""+l;if(C&&(d=d?d+" "+C:C),I){for(var B in I)if(I[B])d=d?d+" "+B:B;else if(d.length)for(var Q=B.length,E=0;(E=d.indexOf(B,E))>=0;){var f=E+Q;E!==0&&!CW.includes(d[E-1])||f!==d.length&&!CW.includes(d[f])?E=f:d=(E===0?"":d.substring(0,E))+d.substring(f+1)}}return d===""?null:d})(A,i,o);r==null?t.removeAttribute("class"):e?t.className=r:t.setAttribute("class",r),t.__className=A}else if(o&&n!==o)for(var s in o){var g=!!o[s];n!=null&&g===!!n[s]||t.classList.toggle(s,g)}return o}function _x(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function gl(t,e,A,i){if(t.__style!==e){var n=(function(o,a){if(a){var r,s,g="";if(Array.isArray(a)?(r=a[0],s=a[1]):r=a,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var l=!1,C=0,I=!1,d=[];r&&d.push(...Object.keys(r).map(Lx)),s&&d.push(...Object.keys(s).map(Lx));for(var B=0,Q=-1,E=o.length,f=0;f2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(e==null)return;if(!du(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var i of t.options)i.selected=e.includes(dW(i))}else{for(i of t.options)if(MpA(dW(i),e))return void(i.selected=!0);A&&e===void 0||(t.selectedIndex=-1)}}function TpA(t){var e=new MutationObserver(()=>{CR(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),ZD(()=>{e.disconnect()})}function dW(t){return"__value"in t?t.__value:t.value}var GQ=Symbol("class"),z3=Symbol("style"),dX=Symbol("is custom element"),BX=Symbol("is html");function Z1(t,e){var A=HR(t);A.value!==(A.value=e??void 0)&&(t.value!==e||e===0&&t.nodeName==="PROGRESS")&&(t.value=e??"")}function fn(t,e,A,i){var n=HR(t);n[e]!==(n[e]=A)&&(e==="loading"&&(t[mpA]=A),A==null?t.removeAttribute(e):typeof A!="string"&&QX(t).includes(e)?t[e]=A:t.setAttribute(e,A))}function OpA(t,e,A,i){var n,o=HR(t),a=o[dX],r=!o[BX],s=e||{},g=t.tagName==="OPTION";for(var l in e)l in A||(A[l]=null);A.class?A.class=sI(A.class):(i||A[GQ])&&(A.class=null),A[z3]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var C,I,d,B,Q,E,f=QX(t),b=function(M){var v=A[M];if(g&&M==="value"&&v==null)return t.value=t.__value="",s[M]=v,0;if(M==="class")return C=t.namespaceURI==="http://www.w3.org/1999/xhtml",Xt(t,C,v,i,e?.[GQ],A[GQ]),s[M]=v,s[GQ]=A[GQ],0;if(M==="style")return gl(t,v,e?.[z3],A[z3]),s[M]=v,s[z3]=A[z3],0;if(v===(I=s[M])&&(v!==void 0||!t.hasAttribute(M))||(s[M]=v,(d=M[0]+M[1])==="$$"))return 0;if(d==="on"){var F={},G="$$"+M,U=M.slice(2);if(B=(function(P){return NpA.includes(P)})(U),(function(P){return P.endsWith("capture")&&P!=="gotpointercapture"&&P!=="lostpointercapture"})(U)&&(U=U.slice(0,-7),F.capture=!0),!B&&I){if(v!=null)return 0;t.removeEventListener(U,s[G],F),s[G]=null}if(v!=null)if(B)t["__".concat(U)]=v,hu([U]);else{let P=function(nA){s[M].call(this,nA)};var yA=P;s[G]=sX(U,t,P,F)}else B&&(t["__".concat(U)]=void 0)}else if(M==="style")fn(t,M,v);else if(M==="autofocus")(function(P,nA){if(nA){var eA=document.body;P.autofocus=!0,j1(()=>{document.activeElement===eA&&P.focus()})}})(t,!!v);else if(a||M!=="__value"&&(M!=="value"||v==null))if(M==="selected"&&g)(function(P,nA){nA?P.hasAttribute("selected")||P.setAttribute("selected",""):P.removeAttribute("selected")})(t,v);else if(Q=M,r||(Q=(function(P){var nA;return P=P.toLowerCase(),(nA=FpA[P])!==null&&nA!==void 0?nA:P})(Q)),E=Q==="defaultValue"||Q==="defaultChecked",v!=null||a||E)E||f.includes(Q)&&(a||typeof v!="string")?(t[Q]=v,Q in o&&(o[Q]=_r)):typeof v!="function"&&fn(t,Q,v);else if(o[M]=null,Q==="value"||Q==="checked"){var Y=t,j=e===void 0;if(Q==="value"){var AA=Y.defaultValue;Y.removeAttribute(Q),Y.defaultValue=AA,Y.value=Y.__value=j?AA:null}else{var z=Y.defaultChecked;Y.removeAttribute(Q),Y.defaultChecked=z,Y.checked=!!j&&z}}else t.removeAttribute(M);else t.value=t.__value=v};for(var R in A)b(R);return s}function pD(t,e){var A=arguments.length>5?arguments[5]:void 0,i=arguments.length>6&&arguments[6]!==void 0&&arguments[6],n=arguments.length>7&&arguments[7]!==void 0&&arguments[7];LZ(arguments.length>4&&arguments[4]!==void 0?arguments[4]:[],arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],arguments.length>3&&arguments[3]!==void 0?arguments[3]:[],o=>{var a=void 0,r={},s=t.nodeName==="SELECT",g=!1;if(OZ(()=>{var C=e(...o.map(c)),I=OpA(t,a,C,A,i,n);for(var d of(g&&s&&"value"in C&&CR(t,C.value),Object.getOwnPropertySymbols(r)))C[d]||Kr(r[d]);for(var B of Object.getOwnPropertySymbols(C)){var Q=C[B];B.description!=="@attach"||a&&Q===a[B]||(r[B]&&Kr(r[B]),r[B]=C0(()=>HpA(t,()=>Q))),I[B]=Q}a=I}),s){var l=t;Er(()=>{CR(l,a.value,!0),TpA(l)})}g=!0})}function HR(t){var e;return(e=t.__attributes)!==null&&e!==void 0?e:t.__attributes={[dX]:t.nodeName.includes("-"),[BX]:t.namespaceURI==="http://www.w3.org/1999/xhtml"}}var BW=new Map;function QX(t){var e,A=t.getAttribute("is")||t.nodeName,i=BW.get(A);if(i)return i;BW.set(A,i=[]);for(var n=t,o=Element.prototype;o!==n;){for(var a in e=EZ(n))e[a].set&&i.push(a);n=GR(n)}return i}function xD(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,i=new WeakSet;kpA(t,"input",(function(){var n=Ut(function*(o){var a=o?t.defaultValue:t.value;if(a=Gx(t)?Kx(a):a,A(a),bo!==null&&i.add(bo),yield iX(),a!==(a=e())){var r=t.selectionStart,s=t.selectionEnd,g=t.value.length;if(t.value=a??"",s!==null){var l=t.value.length;r===s&&s===g&&l>g?(t.selectionStart=l,t.selectionEnd=l):(t.selectionStart=r,t.selectionEnd=Math.min(s,l))}}});return function(o){return n.apply(this,arguments)}})()),QA(e)==null&&t.value&&(A(Gx(t)?Kx(t.value):t.value),bo!==null&&i.add(bo)),dE(()=>{var n=e();if(t===document.activeElement){var o=Z3??bo;if(i.has(o))return}Gx(t)&&n===Kx(t.value)||(t.type!=="date"||n||t.value)&&n!==t.value&&(t.value=n??"")})}function Gx(t){var e=t.type;return e==="number"||e==="range"}function Kx(t){return t===""?null:+t}function Tt(t,e,A){var i=IC(t,e);i&&i.set&&(t[e]=A,ZD(()=>{t[e]=null}))}function QW(t,e){return t===e||t?.[c0]===e}function Mo(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return Er(()=>{var i,n;return dE(()=>{i=n,n=[],QA(()=>{t!==A(...n)&&(e(t,...n),i&&QW(A(...i),t)&&e(null,...i))})}),()=>{j1(()=>{n&&QW(A(...n),t)&&e(null,...n)})}}),t}function aC(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i0&&arguments[0]!==void 0&&arguments[0],e=Ao,A=e.l.u;if(A){var i,n=()=>_(e.s);if(t){var o=0,a={},r=Qu(()=>{var s=!1,g=e.s;for(var l in g)g[l]!==a[l]&&(a[l]=g[l],s=!0);return s&&o++,o});n=()=>c(r)}A.b.length&&(i=()=>{EW(e,n),iR(A.b)},HZ(),lc(1048584,i,!0)),rR(()=>{var s=QA(()=>A.m.map(hpA));return()=>{for(var g of s)typeof g=="function"&&g()}}),A.a.length&&rR(()=>{EW(e,n),iR(A.a)})}}function EW(t,e){if(t.l.s)for(var A of t.l.s)c(A);e()}function XD(t){var e=uC(0);return function(){return arguments.length===1?(x(e,c(e)+1),arguments[0]):(c(e),t())}}function q3(t,e){var A,i=(A=t.$$events)===null||A===void 0?void 0:A[e.type],n=du(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,e)}var iD=!1,zpA={get(t,e){if(!t.exclude.includes(e))return c(t.version),e in t.special?t.special[e]():t.props[e]},set(t,e,A){if(!(e in t.special)){var i=Gn;try{ll(t.parent_effect),t.special[e]=N({get[e](){return t.props[e]}},e,4)}finally{ll(i)}}return t.special[e](A),aW(t.version),!0},getOwnPropertyDescriptor(t,e){if(!t.exclude.includes(e))return e in t.props?{enumerable:!0,configurable:!0,value:t.props[e]}:void 0},deleteProperty:(t,e)=>(t.exclude.includes(e)||(t.exclude.push(e),aW(t.version)),!0),has:(t,e)=>!t.exclude.includes(e)&&e in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(e=>!t.exclude.includes(e))};function nD(t,e){return new Proxy({props:t,exclude:e,special:{},version:uC(0),parent_effect:Gn},zpA)}var PpA={get(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Y3(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i)return i[e]}},set(t,e,A){for(var i=t.props.length;i--;){var n=t.props[i];Y3(n)&&(n=n());var o=IC(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(Y3(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i){var n=IC(i,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,e){if(e===c0||e===pZ)return!1;for(var A of t.props)if(Y3(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(t){var e=[];for(var A of t.props)if(Y3(A)&&(A=A()),A){for(var i in A)e.includes(i)||e.push(i);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function oI(){for(var t=arguments.length,e=new Array(t),A=0;A(l&&(l=!1,g=s?QA(i):i),g);if(r){var I,d,B=c0 in t||pZ in t;n=(I=(d=IC(t,e))===null||d===void 0?void 0:d.set)!==null&&I!==void 0?I:B&&e in t?v=>t[e]=v:void 0}var Q,E=!1;if(r?[o,E]=(function(v){var F=iD;try{return iD=!1,[v(),iD]}finally{iD=F}})(()=>t[e]):o=t[e],o===void 0&&i!==void 0&&(o=C(),n&&(a&&(function(){throw new Error("https://svelte.dev/e/props_invalid_value")})(),n(o))),Q=a?()=>{var v=t[e];return v===void 0?C():(l=!0,v)}:()=>{var v=t[e];return v!==void 0&&(g=void 0),v===void 0?g:v},a&&!(4&A))return Q;if(n){var f=t.$$legacy;return function(v,F){return arguments.length>0?(a&&F&&!f&&!E||n(F?Q():v),v):Q()}}var b=!1,R=(1&A?Qu:et)(()=>(b=!1,Q()));r&&c(R);var M=Gn;return function(v,F){if(arguments.length>0){var G=F?c(R):a&&r?JQ(v):v;return x(R,G),b=!0,g!==void 0&&(g=G),v}return td&&b||(M.f&CE)!==0?R.v:c(R)}}function qa(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:(function(i){var n=(function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch(a){}})("debug");return n!=null&&n.endsWith("*")?i.startsWith(n.slice(0,-1)):i===n})(t);if(!e)return jpA;var A=(function(i){for(var n=0,o=0;o9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t=="bigint")return IR(Number(t));try{var e=t&&t.valueOf();if(e!==t)return IR(e)}catch(A){return!1}return!1}function EX(t){(oD=oD||window.document.createElement("div")).style.color="",oD.style.color=t;var e=oD.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var oD=void 0;function ZpA(t){return typeof t=="string"&&t.length<99&&!!EX(t)}function OR(t,e){if(typeof t=="number"||typeof t=="string"||typeof t=="boolean"||t===void 0)return typeof t;if(typeof t=="bigint")return"number";if(t===null)return"null";if(Array.isArray(t))return"array";if(Qn(t))return"object";var A=e.stringify(t);return A&&TR(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var XpA=/^https?:\/\/\S+$/;function $D(t){return typeof t=="string"&&XpA.test(t)}function EE(t,e){if(t==="")return"";var A=t.trim();return A==="null"?null:A==="true"||A!=="false"&&(TR(A)?e.parse(A):t)}var $pA=[];function uW(t,e){if(t.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(t))throw new TypeError("Array expected");function i(a,r){(!Array.isArray(a)&&!Qn(a)||e&&r.length>0)&&(A[pt(r)]=!0),Qn(a)&&Object.keys(a).forEach(s=>{i(a[s],r.concat(s))})}for(var n=Math.min(t.length,1e4),o=0;oe?t.slice(0,e):t}function fW(t){return ye({},t)}function mW(t){return Object.values(t)}function pW(t,e,A,i){var n=t.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+i,0,...o]),n}function A6A(t,e,A){return t.slice(0,e).concat(A).concat(t.slice(e))}function uu(t,e){try{return e.parse(t)}catch(A){return e.parse(jg(t))}}function uX(t,e){try{return uu(t,e)}catch(A){return}}function fu(t,e){t=t.replace(mX,"");try{return e(t)}catch(A){}try{return e("{"+t+"}")}catch(A){}try{return e("["+t+"]")}catch(A){}throw new Error("Failed to parse partial JSON")}function fX(t){t=t.replace(mX,"");try{return jg(t)}catch(i){}try{var e=jg("["+t+"]");return e.substring(1,e.length-1)}catch(i){}try{var A=jg("{"+t+"}");return A.substring(1,A.length-1)}catch(i){}throw new Error("Failed to repair partial JSON")}var mX=/,\s*$/;function nE(t,e){var A=wW.exec(e);if(A){var i=hr(A[2]),n=(function(d,B){for(var Q=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,E=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d.length,f=0,b=Q;b"line ".concat(n+1," column ").concat(o+1))}}var a=n6A.exec(e),r=a?hr(a[1]):void 0,s=r!==void 0?r-1:void 0,g=o6A.exec(e),l=g?hr(g[1]):void 0,C=l!==void 0?l-1:void 0,I=s!==void 0&&C!==void 0?(function(d,B,Q){for(var E=d.indexOf(` `),f=1;f1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return tu(t)?t:{text:A.stringify(t.json,null,e)}}function DW(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return iu(t)?t:{json:e.parse(t.text)}}function BR(t,e,A){return e6A(t,e,A).text}function t6A(t,e){return i6A(t,e)>e}function i6A(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(tu(t))return t.text.length;var A=t.json,i=0;return(function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>e)return;for(var a=0;ae)return}else if(Qn(o)){var r=Object.keys(o);i+=2+r.length+(r.length-1);for(var s=0;sDX(vX(String(t))),unescapeValue:t=>bX(wX(t))},s6A={escapeValue:t=>vX(String(t)),unescapeValue:t=>bX(t)},g6A={escapeValue:t=>DX(String(t)),unescapeValue:t=>wX(t)},l6A={escapeValue:t=>String(t),unescapeValue:t=>t};function DX(t){return t.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` `||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function wX(t){return t.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return yX[A]||A}catch(i){return e}})}var yX={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},c6A={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` `,"\\r":"\r","\\t":" "};function vX(t){return t.replace(/["\b\f\n\r\t\\]/g,e=>yX[e]||e)}function bX(t){return t.replace(/\\["bfnrt\\]/g,e=>c6A[e]||e)}function oE(t){return typeof t!="string"?String(t):t.endsWith(` `)?t+` `:t}function MX(t,e){return hE(t,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function $2(t,e,A){return hE(t,i=>(function(n,o,a){return typeof n.getAttribute=="function"&&n.getAttribute(o)===a})(i,e,A))}function hE(t,e){return!!PR(t,e)}function PR(t,e){for(var A=t;A&&!e(A);)A=A.parentNode;return A}function mu(t){var e,A;return(e=t==null||(A=t.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function jR(t){var e=mu(t),A=e?.document.activeElement;return!!A&&hE(A,i=>i===t)}function kX(t,e){return PR(t,A=>A.nodeName===e)}function Yx(t){return $2(t,"data-type","selectable-key")?jn.key:$2(t,"data-type","selectable-value")?jn.value:$2(t,"data-type","insert-selection-area-inside")?jn.inside:$2(t,"data-type","insert-selection-area-after")?jn.after:jn.multi}function DD(t){return encodeURIComponent(pt(t))}function SX(t){var e,A=PR(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),i=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return i?As(decodeURIComponent(i)):void 0}function C6A(t){var{allElements:e,currentElement:A,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,a=Z9(e.filter(function(f){var b=f.getBoundingClientRect();return b.width>0&&b.height>0}),s),r=s(A);function s(f){var b=f.getBoundingClientRect();return{x:b.left+b.width/2,y:b.top+b.height/2,rect:b,element:f}}function g(f,b){var R=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,M=f.x-b.x,v=(f.y-b.y)*R;return Math.sqrt(M*M+v*v)}var l=f=>g(f,r);if(i==="Left"||i==="Right"){var C=i==="Left"?a.filter(f=>{return b=r,f.rect.left+o{return b=r,f.rect.right>b.rect.right+o;var b}),I=C.filter(f=>{return b=f,R=r,Math.abs(b.y-R.y)g(f,r,10));return d?.element}if(i==="Up"||i==="Down"){var B=i==="Up"?a.filter(f=>{return b=r,f.y+o{return b=r,f.y>b.y+o;var b}),Q=B.filter(f=>n(f.element)),E=jB(Q,l)||jB(B,l);return E?.element}}function qR(){var t,e,A,i;return typeof navigator<"u"&&(t=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes("MAC"))!==null&&t!==void 0&&t}function fC(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];VR(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:qR)&&A.push("Ctrl"),t.altKey&&A.push("Alt"),t.shiftKey&&A.push("Shift");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in I6A||A.push(i),A.join(e)}function VR(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:qR;return t.ctrlKey||t.metaKey&&e()}var I6A={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Pt(t,e){e===void 0&&(e={});var A=e.insertAt;if(t&&typeof document<"u"){var i=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Pt(`.jse-absolute-popup.svelte-enkkpn { position: relative; left: 0; top: 0; width: 0; height: 0; z-index: 1001; } .jse-absolute-popup.svelte-enkkpn .jse-hidden-input:where(.svelte-enkkpn) { position: fixed; left: 0; top: 0; width: 0; height: 0; padding: 0; margin: 0; border: none; outline: none; overflow: hidden; } .jse-absolute-popup.svelte-enkkpn .jse-absolute-popup-content:where(.svelte-enkkpn) { position: absolute; }`);var d6A=FA('
    '),B6A=FA('
    ');function Q6A(t,e){kt(e,!1);var A=N(e,"popup",8),i=N(e,"closeAbsolutePopup",8),n=CA(),o=CA();function a(C){A().options&&A().options.closeOnOuterClick&&!hE(C.target,I=>I===c(n))&&i()(A().id)}function r(C){fC(C)==="Escape"&&(C.preventDefault(),C.stopPropagation(),i()(A().id))}Jr(function(){c(o)&&c(o).focus()}),$t();var s=B6A();ue("mousedown",dC,function(C){a(C)},!0),ue("keydown",dC,r,!0),ue("wheel",dC,function(C){a(C)},!0);var g=cA(s),l=C=>{var I=d6A(),d=cA(I);Mo(d,B=>x(o,B),()=>c(o)),CX(bA(d,2),()=>A().component,(B,Q)=>{Q(B,oI(()=>A().props))}),ve(B=>gl(I,B),[()=>(c(n),_(A()),QA(()=>(function(B,Q){var E=B.getBoundingClientRect(),{left:f,top:b,positionAbove:R,positionLeft:M}=(function(){if(Q.anchor){var{anchor:v,width:F=0,height:G=0,offsetTop:U=0,offsetLeft:Y=0,position:j}=Q,{left:AA,top:z,bottom:yA,right:P}=v.getBoundingClientRect(),nA=j==="top"||z+G>window.innerHeight&&z>G,eA=j==="left"||AA+F>window.innerWidth&&AA>F;return{left:eA?P-Y:AA+Y,top:nA?z-U:yA+U,positionAbove:nA,positionLeft:eA}}if(typeof Q.left=="number"&&typeof Q.top=="number"){var{left:dA,top:iA,width:aA=0,height:hA=0}=Q;return{left:dA,top:iA,positionAbove:iA+hA>window.innerHeight&&iA>hA,positionLeft:dA+aA>window.innerWidth&&dA>aA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')})();return(R?"bottom: ".concat(E.top-b,"px;"):"top: ".concat(b-E.top,"px;"))+(M?"right: ".concat(E.left-f,"px;"):"left: ".concat(f-E.left,"px;"))})(c(n),A().options)))]),lA(C,I)};YA(g,C=>{c(n)&&C(l)}),Mo(s,C=>x(n,C),()=>c(n)),ue("mousedown",s,function(C){C.stopPropagation()}),ue("keydown",s,r),lA(t,s),St()}var E6A=FA(" ",1);function QR(t,e){kt(e,!1);var A=qa("jsoneditor:AbsolutePopup"),i=CA([],!0);function n(r){var s=c(i).findIndex(l=>l.id===r);if(s!==-1){var g=c(i)[s];g.options.onClose&&g.options.onClose(),x(i,c(i).filter(l=>l.id!==r))}}(function(r,s){vZ().set(r,s)})("absolute-popup",{openAbsolutePopup:function(r,s,g){A("open...",s,g);var l={id:YQ(),component:r,props:s||{},options:g||{}};return x(i,[...c(i),l]),l.id},closeAbsolutePopup:n}),RA(()=>c(i),()=>{A("popups",c(i))}),mn(),$t(!0);var o=E6A(),a=$e(o);ea(a,1,()=>c(i),ha,(r,s)=>{Q6A(r,{get popup(){return c(s)},closeAbsolutePopup:n})}),Aa(bA(a,2),e,"default",{},null),lA(t,o),St()}function pu(t,e){for(var A=new Set(e),i=t.replace(/ \(copy( \d+)?\)$/,""),n=t,o=1;A.has(n);){var a="copy"+(o>1?" "+o:"");n="".concat(i," (").concat(a,")"),o++}return n}function gC(t,e){var A=e-3;return t.length>e?t.substring(0,A)+"...":t}function h6A(t){if(t==="")return"";var e=t.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(t),i=parseFloat(t);return isNaN(A)||isNaN(i)?t:A}}var u6A={id:"jsonquery",name:"JSONQuery",description:`

    Enter a JSON Query function to filter, sort, or transform the data. You can use functions like get, filter, sort, pick, groupBy, uniq, etcetera. Example query: filter(.age >= 18)

    `,createQuery:function(t,e){var{filter:A,sort:i,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(a=A.relation,aM("1 ".concat(a," 1"))[0]),aD(A.path),h6A(A.value)]]);var a;return i&&i.path&&i.direction&&o.push(["sort",aD(i.path),i.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(aD)]):o.push(["map",aD(n.paths[0])])),KO(["pipe",...o])},executeQuery:function(t,e,A){var i=pX(A,JSON)?t:(function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0})(t);return e.trim()!==""?UO(i,e):i}};function aD(t){return["get",...t]}var f6A=CI("");function m6A(t,e){kt(e,!1);var A=870711,i=CA(""),n=N(e,"data",8);function o(r){if(!r||!r.raw)return"";var s=r.raw,g={};return s=s.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(l,C)=>{var I="fa-".concat((A+=1).toString(16));return g[C]=I,' id="'.concat(I,'"')}),s=s.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(l,C,I,d)=>{var B=C||d;return B&&g[B]?"#".concat(g[B]):l}),s}RA(()=>_(n()),()=>{x(i,o(n()))}),mn();var a=f6A();cX(cA(a),()=>c(i),!0),lA(t,a),St()}Pt(` .fa-icon.svelte-v67cny { display: inline-block; fill: currentColor; } .fa-flip-horizontal.svelte-v67cny { transform: scale(-1, 1); } .fa-flip-vertical.svelte-v67cny { transform: scale(1, -1); } .fa-spin.svelte-v67cny { animation: svelte-v67cny-fa-spin 1s 0s infinite linear; } .fa-inverse.svelte-v67cny { color: #fff; } .fa-pulse.svelte-v67cny { animation: svelte-v67cny-fa-spin 1s infinite steps(8); } @keyframes svelte-v67cny-fa-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `);var p6A=CI(""),D6A=CI(""),w6A=CI(""),y6A=CI("",1);function Pi(t,e){var A=nD(e,["children","$$slots","$$events","$$legacy"]),i=nD(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);kt(e,!1);var n=N(e,"class",8,""),o=N(e,"data",8),a=CA(),r=N(e,"scale",8,1),s=N(e,"spin",8,!1),g=N(e,"inverse",8,!1),l=N(e,"pulse",8,!1),C=N(e,"flip",8,void 0),I=N(e,"label",8,""),d=N(e,"style",8,""),B=CA(10),Q=CA(10),E=CA(),f=CA();function b(){var M=1;return r()!==void 0&&(M=Number(r())),isNaN(M)||M<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*M}function R(){return c(a)?Math.max(c(a).width,c(a).height)/16:1}RA(()=>(_(o()),_(d()),_(r())),()=>{x(a,(function(M){var v;if(M){if(!("definition"in M)){if("iconName"in M&&"icon"in M){M.iconName;var[F,G,,,U]=M.icon;v={width:F,height:G,paths:(Array.isArray(U)?U:[U]).map(Y=>({d:Y}))}}else v=M[Object.keys(M)[0]];return v}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}})(o())),d(),r(),x(B,c(a)?c(a).width/R()*b():0),x(Q,c(a)?c(a).height/R()*b():0),x(E,(function(){var M="";d()!==null&&(M+=d());var v=b();return v===1?M.length===0?"":M:(M===""||M.endsWith(";")||(M+="; "),"".concat(M,"font-size: ").concat(v,"em"))})()),x(f,c(a)?"0 0 ".concat(c(a).width," ").concat(c(a).height):"0 0 ".concat(c(B)," ").concat(c(Q)))}),mn(),$t(),(function(M,v){var F=nD(v,["children","$$slots","$$events","$$legacy"]),G=nD(F,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),U=N(v,"class",8,""),Y=N(v,"width",8),j=N(v,"height",8),AA=N(v,"box",8,"0 0 0 0"),z=N(v,"spin",8,!1),yA=N(v,"inverse",8,!1),P=N(v,"pulse",8,!1),nA=N(v,"flip",8,"none"),eA=N(v,"style",8,""),dA=N(v,"label",8,""),iA=p6A();pD(iA,()=>{var aA;return ye(ye({version:"1.1",class:"fa-icon ".concat((aA=U())!==null&&aA!==void 0?aA:""),width:Y(),height:j(),"aria-label":dA(),role:dA()?"img":"presentation",viewBox:AA(),style:eA()},G),{},{[GQ]:{"fa-spin":z(),"fa-pulse":P(),"fa-inverse":yA(),"fa-flip-horizontal":nA()==="horizontal","fa-flip-vertical":nA()==="vertical"}})},void 0,void 0,void 0,"svelte-v67cny"),Aa(cA(iA),v,"default",{},null),lA(M,iA)})(t,oI({get label(){return I()},get width(){return c(B)},get height(){return c(Q)},get box(){return c(f)},get style(){return c(E)},get spin(){return s()},get flip(){return C()},get inverse(){return g()},get pulse(){return l()},get class(){return n()}},()=>i,{children:(M,v)=>{var F=yi();Aa($e(F),e,"default",{},G=>{var U=y6A(),Y=$e(U);ea(Y,1,()=>(c(a),QA(()=>{var yA;return((yA=c(a))===null||yA===void 0?void 0:yA.paths)||[]})),ha,(yA,P)=>{var nA=D6A();pD(nA,()=>ye({},c(P))),lA(yA,nA)});var j=bA(Y);ea(j,1,()=>(c(a),QA(()=>{var yA;return((yA=c(a))===null||yA===void 0?void 0:yA.polygons)||[]})),ha,(yA,P)=>{var nA=w6A();pD(nA,()=>ye({},c(P))),lA(yA,nA)});var AA=bA(j),z=yA=>{m6A(yA,{get data(){return c(a)},set data(P){x(a,P)},$$legacy:!0})};YA(AA,yA=>{c(a),QA(()=>{var P;return(P=c(a))===null||P===void 0?void 0:P.raw})&&yA(z)}),lA(G,U)}),lA(M,F)},$$slots:{default:!0}})),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-boolean-toggle.svelte-eli4ob { padding: 0; margin: 1px 0 0; vertical-align: top; display: inline-flex; color: var(--jse-value-color-boolean, #ff8c00); } .jse-boolean-toggle.svelte-eli4ob:not(.jse-readonly) { cursor: pointer; }`);var v6A=FA('
    ');function b6A(t,e){kt(e,!1);var A=N(e,"path",9),i=N(e,"value",9),n=N(e,"readOnly",9),o=N(e,"onPatch",9),a=N(e,"focus",9);$t(!0);var r,s=v6A(),g=cA(s),l=et(()=>i()===!0?rM:sM);Pi(g,{get data(){return c(l)}}),ve(()=>{fn(s,"aria-checked",i()===!0),r=Xt(s,1,"jse-boolean-toggle svelte-eli4ob",null,r,{"jse-readonly":n()}),fn(s,"title",n()?"Boolean value ".concat(i()):"Click to toggle this boolean value")}),ue("mousedown",s,function(C){C.stopPropagation(),n()||(o()([{op:"replace",path:pt(A()),value:!i()}]),a()())}),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup, .jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::before, .jse-color-picker-popup.svelte-v77py2 .picker_wrapper.popup .picker_arrow::after { background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); line-height: normal; } .jse-color-picker-popup.svelte-v77py2 .picker_slider, .jse-color-picker-popup.svelte-v77py2 .picker_sl, .jse-color-picker-popup.svelte-v77py2 .picker_editor input, .jse-color-picker-popup.svelte-v77py2 .picker_sample, .jse-color-picker-popup.svelte-v77py2 .picker_done button { box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); } .jse-color-picker-popup.svelte-v77py2 .picker_editor input { background: var(--jse-background-color, #fff); color: var(--jse-text-color, #4d4d4d); } .jse-color-picker-popup.svelte-v77py2 .picker_done button { background: var(--jse-button-background, #e0e0e0); color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); } .jse-color-picker-popup.svelte-v77py2 .picker_done button:hover { background: var(--jse-button-background-highlight, #e7e7e7); }`);var M6A=FA('
    ');function k6A(t,e){kt(e,!1);var A=N(e,"color",8),i=N(e,"onChange",8),n=N(e,"showOnTop",8),o=CA(),a=()=>{};Jr(Ut(function*(){var s,g=new((s=yield import("./chunk-GLGRLUIJ.js"))===null||s===void 0?void 0:s.default)({parent:c(o),color:A(),popup:n()?"top":"bottom",onDone(l){var C=l.rgba[3]===1?l.hex.substring(0,7):l.hex;i()(C)}});g.show(),a=()=>{g.destroy()}})),cl(()=>{a()}),$t();var r=M6A();Mo(r,s=>x(o,s),()=>c(o)),lA(t,r),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-color-picker-button.svelte-13mgyo6 { font-size: var(--jse-font-size-mono, 14px); width: var(--jse-color-picker-button-size, 1em); height: var(--jse-color-picker-button-size, 1em); box-sizing: border-box; padding: 0; margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); display: inline-flex; vertical-align: top; border: 1px solid var(--jse-text-color, #4d4d4d); border-radius: 2px; background: inherit; outline: none; } .jse-color-picker-button.svelte-13mgyo6:not(.jse-readonly) { cursor: pointer; }`);var S6A=FA('');function x6A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),{openAbsolutePopup:n}=cI("absolute-popup"),o=N(e,"path",9),a=N(e,"value",9),r=N(e,"readOnly",9),s=N(e,"onPatch",9),g=N(e,"focus",9);function l(B){s()([{op:"replace",path:pt(o()),value:B}]),C()}function C(){g()()}RA(()=>_(a()),()=>{x(A,EX(a()))}),RA(()=>(_(r()),_(a())),()=>{x(i,r()?"Color ".concat(a()):"Click to open a color picker")}),mn(),$t(!0);var I,d=S6A();ve(()=>{var B;I=Xt(d,1,"jse-color-picker-button svelte-13mgyo6",null,I,{"jse-readonly":r()}),gl(d,"background: ".concat((B=c(A))!==null&&B!==void 0?B:"")),fn(d,"title",c(i)),fn(d,"aria-label",c(i))}),ue("click",d,function(B){var Q,E;if(!r()){var f=B.target,b=f.getBoundingClientRect().top,R=((Q=(E=mu(f))===null||E===void 0?void 0:E.innerHeight)!==null&&Q!==void 0?Q:0)-b<300&&b>300,M={color:a(),onChange:l,showOnTop:R};n(k6A,M,{anchor:f,closeOnOuterClick:!0,onClose:C,offsetTop:18,offsetLeft:-8,height:300})}}),lA(t,d),St()}var Hx=1e3,nu=100,rD=100,ND=2e4,qQ=[{start:0,end:nu}],R6A=1048576,N6A=1048576,Tx=10485760,Ox="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",WR="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",F1="hover-insert-inside",sD="hover-insert-after",vW="hover-collection",zx="valid",bW="repairable",lC=336,cC=260,V3=100,MW={[al.asc]:"ascending",[al.desc]:"descending"};function xX(t){for(var e=eM(t,r=>r.start),A=[e[0]],i=0;i0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:t,visibleSections:qQ,items:[]}}function $R(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:t,properties:{}}}var AN={createObjectDocumentState:$R,createArrayDocumentState:XR,createValueDocumentState:function(){return{type:"value"}}};function NX(t,e,A,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:a}=i;return(function r(s,g,l){if(Array.isArray(s)){var C=Pa(g)?g:o();if(l.length===0)return C;var I=hr(l[0]),d=r(s[I],C.items[I],l.slice(1));return Sr(C,["items",l[0]],d)}if(Qn(s)){var B=Ws(g)?g:n();if(l.length===0)return B;var Q=l[0],E=r(s[Q],B.properties[Q],l.slice(1));return Sr(B,["properties",Q],E)}return ZR(g)?g:a()})(t,e,A)}function wg(t,e){return ou(t,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,i)=>{if(A!==void 0&&i!==void 0)return Array.isArray(A)?Pa(i)?i:XR({expanded:!!X1(i)&&i.expanded}):Qn(A)?Ws(i)?i:$R({expanded:!!X1(i)&&i.expanded}):ZR(i)?i:void 0},()=>!0)}function ou(t,e,A,i,n){var o=i(t,e,A);if(Array.isArray(t)&&Pa(o)&&n(o)){var a=[];return eN(t,o.visibleSections,s=>{var g=A.concat(String(s)),l=ou(t[s],o.items[s],g,i,n);l!==void 0&&(a[s]=l)}),uW(a,o.items)?o:ye(ye({},o),{},{items:a})}if(Qn(t)&&Ws(o)&&n(o)){var r={};return Object.keys(t).forEach(s=>{var g=A.concat(s),l=ou(t[s],o.properties[s],g,i,n);l!==void 0&&(r[s]=l)}),uW(Object.values(r),Object.values(o.properties))?o:ye(ye({},o),{},{properties:r})}return o}function eN(t,e,A){e.forEach(i=>{var{start:n,end:o}=i;hX(n,Math.min(t.length,o),A)})}function au(t,e){for(var A=t,i=[],n=0;n{var C=X1(l)&&!l.expanded?ye(ye({},l),{},{expanded:!0}):l;return Pa(C)?(function(I,d){if((function(E,f){return E.some(b=>f>=b.start&&f(function(g,l,C,I){return ou(g,l,C,(d,B,Q)=>Array.isArray(d)&&I(Q)?Pa(B)?B.expanded?B:ye(ye({},B),{},{expanded:!0}):XR({expanded:!0}):Qn(d)&&I(Q)?Ws(B)?B.expanded?B:ye(ye({},B),{},{expanded:!0}):$R({expanded:!0}):B,d=>X1(d)&&d.expanded)})(r,s,[],i))}function LW(t,e,A,i){return aE(t,e,A,(n,o)=>i?(function(a,r,s){return ou(a,r,s,(g,l)=>_W(l),()=>!0)})(n,o,A):_W(o))}function _W(t){return Pa(t)&&t.expanded?ye(ye({},t),{},{expanded:!1,visibleSections:qQ}):Ws(t)&&t.expanded?ye(ye({},t),{},{expanded:!1}):t}function FX(t,e,A){var i={json:t,documentState:e},n=A.reduce((o,a)=>({json:Js(o.json,[a]),documentState:K6A(o.json,o.documentState,a)}),i);return{json:n.json,documentState:wg(n.json,n.documentState)}}function K6A(t,e,A){if(b9(A))return GW(t,e,A,void 0);if(M9(A))return KW(t,e,A);if(m6(A)){var i=Ys(t,A.path),n=g0(t,e,i);return n?Aw(t,e,i,{type:"value",enforceString:n}):e}return p6(A)||s2(A)?(function(o,a,r){if(s2(r)&&r.from===r.path)return a;var s=a,g=Ys(o,r.from),l=o0(o,s,g);return s2(r)&&(s=KW(o,s,{path:r.from})),s=GW(o,s,{path:r.path},l),s})(t,e,A):e}function o0(t,e,A){try{return Pe(e,au(t,A))}catch(i){return}}function tN(t,e,A,i,n){var o=NX(t,e,A,n);return S4(o,au(t,A),a=>{var r=Pe(t,A);return i(r,a)})}function Aw(t,e,A,i){return(function(n,o,a,r,s){var g=NX(n,o,a,s);return Sr(g,au(n,a),r)})(t,e,A,i,AN)}function aE(t,e,A,i){return tN(t,e,A,i,AN)}function GW(t,e,A,i){var n=Ys(t,A.path),o=e;return o=aE(t,o,Li(n),(a,r)=>{if(!Pa(r))return r;var s=hr(fi(n)),{items:g,visibleSections:l}=r;return ye(ye({},r),{},{items:s{if(!Pa(r))return r;var s=hr(fi(i)),{items:g,visibleSections:l}=r;return ye(ye({},r),{},{items:g.slice(0,s).concat(g.slice(s+1)),visibleSections:LX(l,s,-1)})}):(function(a,r,s){var g=au(a,s);return cr(r,g)?n1(r,au(a,s)):r})(t,e,i)}function LX(t,e,A){return(function(i){for(var n=i.slice(0),o=1;o({start:i.start>e?i.start+A:i.start,end:i.end>e?i.end+A:i.end})))}function g0(t,e,A){var i,n=Pe(t,A),o=o0(t,e,A),a=ZR(o)?o.enforceString:void 0;return typeof a=="boolean"?a:typeof(i=n)=="string"&&typeof EE(i,JSON)!="string"}function Du(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(e);return i!==-1?A?t.slice(i):t.slice(i+1):[]}function iN(t,e){var A=[];return(function i(n,o,a){A.push(a),Lo(n)&&Pa(o)&&o.expanded&&eN(n,o.visibleSections,r=>{i(n[r],o.items[r],a.concat(String(r)))}),Oo(n)&&Ws(o)&&o.expanded&&Object.keys(n).forEach(r=>{i(n[r],o.properties[r],a.concat(r))})})(t,e,[]),A}function _X(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return(function n(o,a){i.push({path:a,type:tc.value});var r=o0(t,e,a);if(o&&X1(r)&&r.expanded){if(A&&i.push({path:a,type:tc.inside}),Lo(o)){var s=Pa(r)?r.visibleSections:qQ;eN(o,s,g=>{var l=a.concat(String(g));n(o[g],l),A&&i.push({path:l,type:tc.after})})}Oo(o)&&Object.keys(o).forEach(g=>{var l=a.concat(g);i.push({path:l,type:tc.key}),n(o[g],l),A&&i.push({path:l,type:tc.after})})}})(t,[]),i}function Px(t,e,A){var i=iN(t,e),n=i.map(pt).indexOf(pt(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return ec(t,e,A,t6A({json:Pe(t,A)},i)?W3:nN)}function jx(t,e,A){var i=o0(t,e,A);return X1(i)&&i.expanded?e:$1(t,e,A)}function W3(t){return t.length===0||t.length===1&&t[0]==="0"}function fR(t){return t.length===0}function nN(){return!0}function wD(){return!1}function Xs(t){return t&&t.type===jn.after||!1}function Ka(t){return t&&t.type===jn.inside||!1}function ja(t){return t&&t.type===jn.key||!1}function an(t){return t&&t.type===jn.value||!1}function $n(t){return t&&t.type===jn.multi||!1}function ew(t){return $n(t)&&di(t.focusPath,t.anchorPath)}function ru(t){return $n(t)||Xs(t)||Ka(t)||ja(t)||an(t)}function qx(t){return t&&t.type===jn.text||!1}function gI(t,e){var A=[];return(function(i,n,o){if(n){var a=O1(n),r=st(n);if(di(a,r))return o(a);if(i!==void 0){var s=KX(a,r);if(a.length===s.length||r.length===s.length)return o(s);var g=ns(a,r),l=CC(i,g),C=rI(i,g),I=EC(i,g,l),d=EC(i,g,C);if(!(I===-1||d===-1)){var B=Pe(i,s);if(Oo(B)){for(var Q=Object.keys(B),E=I;E<=d;E++){var f=o(s.concat(Q[E]));if(f!==void 0)return f}return}if(Lo(B)){for(var b=I;b<=d;b++){var R=o(s.concat(String(b)));if(R!==void 0)return R}return}throw new Error("Failed to create selection")}}}})(t,e,i=>{A.push(i)}),A}function GX(t){return Ka(t)?t.path:Li(st(t))}function CC(t,e){if(!$n(e))return e.path;var A=EC(t,e,e.anchorPath);return EC(t,e,e.focusPath)A?e.focusPath:e.anchorPath}function UW(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=i?st(A):CC(t,A),o=(function(s,g,l){var C=iN(s,g),I=C.map(pt),d=pt(l),B=I.indexOf(d);if(B!==-1&&B>0)return C[B-1]})(t,e,n);if(i)return Ka(A)||Xs(A)?o!==void 0?ns(n,n):void 0:o!==void 0?ns(O1(A),o):void 0;if(Xs(A)||Ka(A))return _i(n);if(ja(A)){if(o===void 0||o.length===0)return;var a=Li(o),r=Pe(t,a);return Array.isArray(r)||zi(o)?_i(o):mC(o)}return an(A),o!==void 0?_i(o):void 0}}function JW(t,e,A,i){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=_X(t,e,i),o=n.findIndex(a=>di(a.path,st(A))&&String(a.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[i].length;)i++;var n=A[i];return n===void 0||n.length===0||Array.isArray(Pe(t,Li(n)))?_i(n):mC(n)}function rE(t,e){if(e.length===1){var A=Wg(e);if(A.op==="replace")return _i(Ys(t,A.path))}if(!zi(e)&&e.every(a=>a.op==="move")){var i=Wg(e),n=e.slice(1);if((p6(i)||s2(i))&&i.from!==i.path&&n.every(a=>(p6(a)||s2(a))&&a.from===a.path))return mC(Ys(t,i.path))}var o=e.filter(a=>a.op!=="test"&&a.op!=="remove"&&(a.op!=="move"||a.from!==a.path)&&typeof a.path=="string").map(a=>Ys(t,a.path));if(!zi(o))return{type:jn.multi,anchorPath:Wg(o),focusPath:fi(o)}}function KX(t,e){for(var A=0;AA.length&&e.length>A.length;return{type:jn.multi,anchorPath:i?A.concat(t[A.length]):A,focusPath:i?A.concat(e[A.length]):A}}function UX(t,e,A,i){if(ja(e))return String(fi(e.path));if(an(e)){var n=Pe(t,e.path);return typeof n=="string"?n:i.stringify(n,null,A)}if($n(e)){if(zi(e.focusPath))return i.stringify(t,null,A);var o=GX(e),a=Pe(t,o);if(Array.isArray(a)){if(ew(e)){var r=Pe(t,e.focusPath);return i.stringify(r,null,A)}return gI(t,e).map(s=>{var g=Pe(t,s);return"".concat(i.stringify(g,null,A),",")}).join(` `)}return gI(t,e).map(s=>{var g=fi(s),l=Pe(t,s);return"".concat(i.stringify(g),": ").concat(i.stringify(l,null,A),",")}).join(` `)}}function za(t){return(ja(t)||an(t))&&t.edit===!0}function HQ(t){return ja(t)||an(t)||$n(t)}function gD(t){return ja(t)||an(t)||ew(t)}function mR(t){switch(t.type){case tc.key:return mC(t.path);case tc.value:return _i(t.path);case tc.after:return QC(t.path);case tc.inside:return pC(t.path)}}function HW(t,e){switch(t){case jn.key:return mC(e);case jn.value:return _i(e);case jn.after:return QC(e);case jn.inside:return pC(e);case jn.multi:case jn.text:return ns(e,e)}}function lD(t,e,A){if(e)return su(t,e,A)||I0($n(e)?Li(e.focusPath):e.path,A)?e:void 0}function su(t,e,A){if(t===void 0||!e)return!1;if(ja(e)||Ka(e)||Xs(e))return di(e.path,A);if(an(e))return I0(A,e.path);if($n(e)){var i=CC(t,e),n=rI(t,e),o=Li(e.focusPath);if(!I0(A,o)||A.length<=o.length)return!1;var a=EC(t,e,i),r=EC(t,e,n),s=EC(t,e,A);return s!==-1&&s>=a&&s<=r}return!1}function EC(t,e,A){var i=Li(e.focusPath);if(!I0(A,i)||A.length<=i.length)return-1;var n=A[i.length],o=Pe(t,i);if(Oo(o))return Object.keys(o).indexOf(n);if(Lo(o)){var a=hr(n);if(a');function YX(t,e){kt(e,!1);var A=qa("jsoneditor:EditableDiv"),i=N(e,"value",9),n=N(e,"initialValue",9),o=N(e,"shortText",9,!1),a=N(e,"label",9),r=N(e,"onChange",9),s=N(e,"onCancel",9),g=N(e,"onFind",9),l=N(e,"onPaste",9,ra),C=N(e,"onValueClass",9,()=>""),I=CA(void 0,!0),d=CA(void 0,!0),B=!1;function Q(){return c(I)?(function(b){return b.replace(/\n$/,"")})(c(I).innerText):""}function E(b){c(I)&&yg(I,c(I).innerText=oE(b))}Jr(()=>{A("onMount",{value:i(),initialValue:n()}),E(n()!==void 0?n():i()),c(I)&&(function(b){if(b.firstChild!=null){var R=document.createRange(),M=window.getSelection();R.setStart(b,1),R.collapse(!0),M?.removeAllRanges(),M?.addRange(R)}else b.focus()})(c(I))}),cl(()=>{var b=Q();A("onDestroy",{closed:B,value:i(),newValue:b}),B||b===i()||r()(b,aI.no)}),RA(()=>(_(C()),_(i())),()=>{x(d,C()(i()))}),mn(),$t(!0);var f=U6A();Mo(f,b=>x(I,b),()=>c(I)),ve(b=>{fn(f,"aria-label",a()),Xt(f,1,b,"svelte-1r0oryi")},[()=>sI((_(gc),c(d),_(o()),QA(()=>gc("jse-editable-div",c(d),{"jse-short-text":o()}))))]),ue("input",f,function(){var b=Q();b===""&&E(""),x(d,C()(b))}),ue("keydown",f,function(b){b.stopPropagation();var R=fC(b);if(R==="Escape"&&(b.preventDefault(),B=!0,s()()),R==="Enter"||R==="Tab"){b.preventDefault(),B=!0;var M=Q();r()(M,aI.nextInside)}R==="Ctrl+F"&&(b.preventDefault(),g()(!1)),R==="Ctrl+H"&&(b.preventDefault(),g()(!0))}),ue("paste",f,function(b){if(b.stopPropagation(),l()&&b.clipboardData){var R=b.clipboardData.getData("text/plain");l()(R)}}),ue("blur",f,function(){var b=document.hasFocus(),R=Q();A("handleBlur",{hasFocus:b,closed:B,value:i(),newValue:R}),document.hasFocus()&&!B&&(B=!0,R!==i()&&r()(R,aI.self))}),lA(t,f),St()}function J6A(t,e){kt(e,!1);var A=N(e,"path",9),i=N(e,"value",9),n=N(e,"selection",9),o=N(e,"mode",9),a=N(e,"parser",9),r=N(e,"normalization",9),s=N(e,"enforceString",9),g=N(e,"onPatch",9),l=N(e,"onPasteJson",9),C=N(e,"onSelect",9),I=N(e,"onFind",9),d=N(e,"focus",9),B=N(e,"findNextInside",9);function Q(R){return s()?R:EE(R,a())}function E(){C()(_i(A())),d()()}$t(!0);var f=et(()=>(_(r()),_(i()),QA(()=>r().escapeValue(i())))),b=et(()=>(_(za),_(n()),QA(()=>za(n())?n().initialValue:void 0)));YX(t,{get value(){return c(f)},get initialValue(){return c(b)},label:"Edit value",onChange:function(R,M){g()([{op:"replace",path:pt(A()),value:Q(r().unescapeValue(R))}],(v,F,G)=>{if(!G||di(A(),st(G)))return{state:F,selection:M===aI.nextInside?B()(A()):_i(A())}}),d()()},onCancel:E,onPaste:function(R){try{var M=a().parse(R);jo(M)&&l()({path:A(),contents:M,onPasteAsJson:()=>{E();var v=[{op:"replace",path:pt(A()),value:M}];g()(v,(F,G)=>({state:$1(F,G,A())}))}})}catch(v){}},get onFind(){return I()},onValueClass:function(R){return JX(Q(r().unescapeValue(R)),o(),a())}}),St()}function TQ(t,e,A){var i=Li(e),n=Pe(t,i);if(Lo(n)){var o=hr(fi(e));return A.map((g,l)=>({op:"add",path:pt(i.concat(String(o+l))),value:g.value}))}if(Oo(n)){var a=fi(e),r=Object.keys(n),s=a!==void 0?Du(r,a,!0):[];return[...A.map(g=>{var l=pu(g.key,r);return{op:"add",path:pt(i.concat(l)),value:g.value}}),...s.map(g=>lI(i,g))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function pR(t,e,A){var i=Pe(t,e);if(Array.isArray(i)){var n=i.length;return A.map((o,a)=>({op:"add",path:pt(e.concat(String(n+a))),value:o.value}))}return A.map(o=>{var a=pu(o.key,Object.keys(i));return{op:"add",path:pt(e.concat(a)),value:o.value}})}function wu(t,e,A,i){var n=e.filter(r=>r!==A),o=pu(i,n),a=Du(e,A,!1);return[{op:"move",from:pt(t.concat(A)),path:pt(t.concat(o))},...a.map(r=>lI(t,r))]}function HX(t,e){var A=fi(e);if(zi(A))throw new Error("Cannot duplicate root object");var i=Li(A),n=fi(A),o=Pe(t,i);if(Lo(o)){var a=fi(e),r=a?hr(fi(a))+1:0;return[...e.map((l,C)=>({op:"copy",from:pt(l),path:pt(i.concat(String(C+r)))}))]}if(Oo(o)){var s=Object.keys(o),g=n!==void 0?Du(s,n,!1):[];return[...e.map(l=>{var C=pu(fi(l),s);return{op:"copy",from:pt(l),path:pt(i.concat(C))}}),...g.map(l=>lI(i,l))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function TX(t,e){if(an(e))return[{op:"move",from:pt(e.path),path:""}];if(!$n(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=Li(e.focusPath),i=Pe(t,A);if(Lo(i)){var n=gI(t,e).map(a=>{var r=hr(fi(a));return i[r]});return[{op:"replace",path:"",value:n}]}if(Oo(i)){var o={};return gI(t,e).forEach(a=>{var r=String(fi(a));o[r]=i[r]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function OX(t,e,A,i){if(ja(e)){var n=uX(A,i),o=Li(e.path),a=Pe(t,o);return wu(o,Object.keys(a),fi(e.path),typeof n=="string"?n:A)}if(an(e)||$n(e)&&zi(e.focusPath))try{return[{op:"replace",path:pt(st(e)),value:fu(A,F=>uu(F,i))}]}catch(F){return[{op:"replace",path:pt(st(e)),value:A}]}if($n(e)){var r=Vx(A,i);return(function(F,G,U){var Y=Wg(G),j=Li(Y),AA=Pe(F,j);if(Lo(AA)){var z=Wg(G),yA=z?hr(fi(z)):0;return[...KD(G),...U.map((JA,ee)=>({op:"add",path:pt(j.concat(String(ee+yA))),value:JA.value}))]}if(Oo(AA)){var P=fi(G),nA=Li(P),eA=fi(P),dA=Object.keys(AA),iA=eA!==void 0?Du(dA,eA,!1):[],aA=new Set(G.map(JA=>fi(JA))),hA=dA.filter(JA=>!aA.has(JA));return[...KD(G),...U.map(JA=>{var ee=pu(JA.key,hA);return{op:"add",path:pt(nA.concat(ee)),value:JA.value}}),...iA.map(JA=>lI(nA,JA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")})(t,gI(t,e),r)}if(Xs(e)){var s=Vx(A,i),g=e.path,l=Li(g),C=Pe(t,l);if(Lo(C)){var I=hr(fi(g));return TQ(t,l.concat(String(I+1)),s)}if(Oo(C)){var d=String(fi(g)),B=Object.keys(C);if(zi(B)||fi(B)===d)return pR(t,l,s);var Q=B.indexOf(d),E=B[Q+1];return TQ(t,l.concat(E),s)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(Ka(e)){var f=Vx(A,i),b=e.path,R=Pe(t,b);if(Lo(R))return TQ(t,b.concat("0"),f);if(Oo(R)){var M=Object.keys(R);if(zi(M))return pR(t,b,f);var v=Wg(M);return TQ(t,b.concat(v),f)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function KD(t){return t.map(e=>({op:"remove",path:pt(e)})).reverse()}function lI(t,e){return{op:"move",from:pt(t.concat(e)),path:pt(t.concat(e))}}function Vx(t,e){var A=/^\s*{/.test(t),i=/^\s*\[/.test(t),n=uX(t,e),o=n!==void 0?n:fu(t,a=>uu(a,e));return A&&Qn(o)||i&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((a,r)=>({key:"New item "+r,value:a})):Qn(o)?Object.keys(o).map(a=>({key:a,value:o[a]})):[{key:"New item",value:o}]}function zX(t,e){if(ja(e)){var A=Li(e.path),i=Pe(t,A),n=wu(A,Object.keys(i),fi(e.path),"");return{operations:n,newSelection:rE(t,n)}}if(an(e))return{operations:[{op:"replace",path:pt(e.path),value:""}],newSelection:e};if($n(e)){var o=gI(t,e),a=KD(o),r=fi(o);if(zi(r))return{operations:[{op:"replace",path:"",value:""}],newSelection:_i([])};var s=Li(r),g=Pe(t,s);if(Lo(g)){var l=Wg(o),C=hr(fi(l));return{operations:a,newSelection:C===0?pC(s):QC(s.concat(String(C-1)))}}if(Oo(g)){var I=Object.keys(g),d=Wg(o),B=fi(d),Q=I.indexOf(B),E=I[Q-1];return{operations:a,newSelection:Q===0?pC(s):QC(s.concat(E))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function PX(t,e){var A=(function(i,n){if(zi(n)||!n.every(s2))return n;var o=[];for(var a of n){var r=TW(As(a.from)),s=TW(As(a.path));if(!r||!s)return n;o.push({from:r,path:s,operation:a})}var g=o[0].path.parent,l=Pe(i,g);if(!Oo(l)||!o.every(B=>(function(Q,E){return di(Q.from.parent,E)&&di(Q.path.parent,E)})(B,g)))return n;var C=(function(B,Q){var E=Object.keys(Q),f=E.slice();for(var b of B){var R=f.indexOf(b.from.key);R!==-1&&(f.splice(R,1),f.push(b.path.key))}for(var M=0;MB.operation,d=o.filter(B=>B.operation.from!==B.operation.path);return d.some(B=>B.path.key===C)?d.map(I):[lI(g,C),...d.map(I)]})(t,e);return D6(t,A,{before:(i,n,o)=>{if(M9(n)){var a=As(n.path);return{revertOperations:[...o,...Wx(i,a)]}}if(s2(n)){var r=As(n.from);return{revertOperations:n.from===n.path?[n,...Wx(i,r)]:[...o,...Wx(i,r)]}}return{document:i}}})}function TW(t){return t.length>0?{parent:Li(t),key:fi(t)}:void 0}function Wx(t,e){var A=Li(e),i=fi(e),n=Pe(t,A);return Oo(n)?Du(Object.keys(n),i,!1).map(o=>lI(A,o)):[]}function OW(t){var e=t.activeIndex0?0:-1,A=t.items[e],i=t.items.map((n,o)=>ye(ye({},n),{},{active:o===e}));return ye(ye({},t),{},{items:i,activeItem:A,activeIndex:e})}function zW(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(A=i?.maxResults)!==null&&A!==void 0?A:1/0,a=i?.columns,r=[],s=[];function g(E){r.length>=o||r.push(E)}function l(E,f){if(Lo(f)){var b=s.length;s.push("0");for(var R=0;R=o)return;s.pop()}else if(Oo(f)){var M=Object.keys(f),v=s.length;for(var F of(s.push(""),M))if(s[v]=F,PW(F,E,s,nc.key,g),l(E,f[F]),r.length>=o)return;s.pop()}else PW(String(f),E,s,nc.value,g)}if(t==="")return[];if(a){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var C=0;CB.length+1;)s.pop();l(n,Pe(I,B))}if(r.length>=o)break}return r}return l(n,e),r}function PW(t,e,A,i,n){var o=t.toLowerCase(),a=0,r=-1,s=-1;do(s=o.indexOf(e,r))!==-1&&(r=s+e.length,n({path:A.slice(0),field:i,fieldIndex:a,start:s,end:r}),a++);while(s!==-1)}function DR(t,e,A,i){return t.substring(0,A)+e+t.substring(i)}function jW(t,e,A){var i=t;return W9(A,n=>{i=DR(i,e,n.start,n.end)}),i}function Y6A(t,e,A,i,n){var{field:o,path:a,start:r,end:s}=i;if(o===nc.key){var g=Li(a),l=Pe(t,g),C=fi(a),I=wu(g,Object.keys(l),C,DR(C,A,r,s));return{newSelection:rE(t,I),operations:I}}if(o===nc.value){var d=Pe(t,a);if(d===void 0)throw new Error("Cannot replace: path not found ".concat(pt(a)));var B=typeof d=="string"?d:String(d),Q=g0(t,e,a),E=DR(B,A,r,s),f=[{op:"replace",path:pt(a),value:Q?E:EE(E,n)}];return{newSelection:rE(t,f),operations:f}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function qW(t){return t.path.concat(t.field,String(t.fieldIndex))}function VW(t){var e=RX(t)?t.searchResults.filter(A=>A.field===nc.key):void 0;return e&&e.length>0?e:void 0}function WW(t){var e=RX(t)?t.searchResults.filter(A=>A.field===nc.value):void 0;return e&&e.length>0?e:void 0}var H6A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function jX(t,e){return e.reduce((A,i)=>(function(n,o,a,r){return tN(n,o,a,r,H6A)})(t,A,i.path,(n,o)=>ye(ye({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function UD(t){var e,A=(e=t?.searchResults)!==null&&e!==void 0?e:[],i=Ws(t)?Object.values(t.properties).flatMap(UD):Pa(t)?t.items.flatMap(UD):[];return A.concat(i)}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-highlight.svelte-19qyvy6 { background-color: var(--jse-search-match-color, #ffe665); outline: var(--jse-search-match-outline, none); } .jse-highlight.jse-active.svelte-19qyvy6 { background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); outline: var(--jse-search-match-outline, 2px solid #e0be00); }`);var T6A=FA(" ");function qX(t,e){kt(e,!1);var A=CA(),i=N(e,"text",8),n=N(e,"searchResultItems",8);RA(()=>(_(i()),_(n())),()=>{x(A,(function(a,r){var s=[],g=0;for(var l of r){var C=a.slice(g,l.start);C!==""&&s.push({resultIndex:void 0,type:"normal",text:C,active:!1});var I=a.slice(l.start,l.end);s.push({resultIndex:l.resultIndex,type:"highlight",text:I,active:l.active}),g=l.end}var d=fi(r);return d&&d.endc(A),ha,(a,r)=>{var s=yi(),g=$e(s),l=I=>{var d=tr();ve(()=>xt(d,(c(r),QA(()=>c(r).text)))),lA(I,d)},C=I=>{var d,B=T6A(),Q=cA(B);ve((E,f)=>{d=Xt(B,1,"jse-highlight svelte-19qyvy6",null,d,{"jse-active":c(r).active}),fn(B,"data-search-result-index",E),xt(Q,f)},[()=>(c(r),QA(()=>String(c(r).resultIndex))),()=>(_(oE),c(r),QA(()=>oE(c(r).text)))]),lA(I,B)};YA(g,I=>{c(r),QA(()=>c(r).type==="normal")?I(l):I(C,!1)}),lA(a,s)}),lA(t,o),St()}function yD(t){var e=1e3;if(t<900)return t.toFixed()+" B";var A=t/e;if(A<900)return A.toFixed(1)+" KB";var i=A/e;if(i<900)return i.toFixed(1)+" MB";var n=i/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-tag.svelte-ubve9r { border: none; font-size: 80%; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); border-radius: 2px; cursor: pointer; display: inline-block; padding: 0 4px; line-height: normal; margin: 1px 0; } .jse-tag.svelte-ubve9r:hover { opacity: 0.8; } .jse-tag.disabled.svelte-ubve9r { opacity: 0.7; cursor: inherit; }`);var O6A=FA('');function vD(t,e){kt(e,!0);var A,i=Zs(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=O6A();n.__click=function(){for(var o,a=arguments.length,r=new Array(a),s=0;s2?r-2:0),g=2;g{var C,I=(C=a())!==null&&C!==void 0?C:null;l.ensure(I,I&&(d=>I(d,...s)))},P1)})(cA(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:EpA}),ve(()=>A=Xt(n,1,"jse-tag svelte-ubve9r",null,A,{disabled:!e.onclick})),lA(t,n),St()}hu(["click"]);Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-value.jse-string.svelte-1saqp8c { color: var(--jse-value-color-string, #008000); } .jse-value.jse-object.svelte-1saqp8c, .jse-value.jse-array.svelte-1saqp8c { min-width: 16px; color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); } .jse-value.jse-number.svelte-1saqp8c { color: var(--jse-value-color-number, #ee422e); } .jse-value.jse-boolean.svelte-1saqp8c { color: var(--jse-value-color-boolean, #ff8c00); } .jse-value.jse-null.svelte-1saqp8c { color: var(--jse-value-color-null, #004ed0); } .jse-value.jse-invalid.svelte-1saqp8c { color: var(--jse-text-color, #4d4d4d); } .jse-value.jse-url.svelte-1saqp8c { color: var(--jse-value-color-url, #008000); text-decoration: underline; } .jse-value.svelte-1saqp8c { display: inline-block; min-width: 2em; padding: 0 5px; box-sizing: border-box; outline: none; border-radius: 1px; vertical-align: top; word-break: normal; overflow-wrap: anywhere; white-space: pre-wrap; } .jse-value.jse-table-cell.svelte-1saqp8c { overflow-wrap: normal; white-space: nowrap; } .jse-value.jse-empty.svelte-1saqp8c { min-width: 4em; outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); -moz-outline-radius: 2px; } .jse-value.jse-empty.svelte-1saqp8c::after { pointer-events: none; color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); content: "value"; }`);var z6A=FA('
    ');function P6A(t,e){kt(e,!0);var A=nC(!0),i=Zs(()=>c(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(d=>d.active&&d.end>e.truncateTextSize))),n=Zs(()=>c(i)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Zs(()=>$D(e.value));function a(){x(A,!1)}var r=z6A();r.__click=function(d){typeof e.value=="string"&&c(o)&&VR(d)&&(d.preventDefault(),d.stopPropagation(),window.open(e.value,"_blank"))},r.__dblclick=function(d){e.readOnly||(d.preventDefault(),e.onSelect(GD(e.path)))};var s=cA(r),g=d=>{var B=Zs(()=>e.normalization.escapeValue(c(n)));qX(d,{get text(){return c(B)},get searchResultItems(){return e.searchResultItems}})},l=d=>{var B=tr();ve(Q=>xt(B,Q),[()=>oE(e.normalization.escapeValue(c(n)))]),lA(d,B)};YA(s,d=>{e.searchResultItems?d(g):d(l,!1)});var C=bA(s,2),I=d=>{vD(d,{onclick:a,children:(B,Q)=>{var E=tr();ve(f=>xt(E,"Show more (".concat(f??"",")")),[()=>yD(e.value.length)]),lA(B,E)},$$slots:{default:!0}})};YA(C,d=>{c(i)&&typeof e.value=="string"&&d(I)}),ve(d=>{Xt(r,1,d,"svelte-1saqp8c"),fn(r,"title",c(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>sI(JX(e.value,e.mode,e.parser))]),lA(t,r),St()}hu(["click","dblclick"]);Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-tooltip.svelte-brt1mq { font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); line-height: normal; padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); border-radius: 3px; background: var(--jse-context-menu-background, #656565); color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); white-space: nowrap; box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); }`);var j6A=FA('
    ');function q6A(t,e){var A=N(e,"text",8),i=j6A(),n=cA(i);ve(()=>xt(n,A())),lA(t,i)}function sE(t,e){var A,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function a(){A=n(q6A,{text:i},{position:"top",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function r(){o(A)}return t.addEventListener("mouseenter",a),t.addEventListener("mouseleave",r),{destroy(){t.removeEventListener("mouseenter",a),t.removeEventListener("mouseleave",r)}}}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-timestamp.svelte-1jcpman { padding: 0; margin: 0; vertical-align: middle; display: inline-flex; color: var(--jse-value-color-number, #ee422e); }`);var V6A=FA('
    ');function W6A(t,e){kt(e,!1);var A=CA(void 0,!0),i=cI("absolute-popup"),n=N(e,"value",9);RA(()=>_(n()),()=>{x(A,"Time: ".concat(new Date(n()).toString()))}),mn(),$t(!0);var o=V6A();Pi(cA(o),{get data(){return JO}}),as(o,(a,r)=>sE?.(a,r),()=>ye({text:c(A)},i)),lA(t,o),St()}function Z6A(t){var e=[];return!t.isEditing&&WpA(t.value)&&e.push({component:b6A,props:t}),!t.isEditing&&ZpA(t.value)&&e.push({component:x6A,props:t}),t.isEditing&&e.push({component:J6A,props:t}),t.isEditing||e.push({component:P6A,props:t}),!t.isEditing&&IR(t.value)&&e.push({component:W6A,props:t}),e}function $s(t){return t.map((e,A)=>$6A.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+(function(i){return i.replace(/"/g,'\\"')})(e)+'"]':(A>0?".":"")+e).join("")}function X6A(t){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(i(o=>o==="]")),n("]")):e.push(i(o=>o==="."||o==="["));function i(o){for(var a=arguments.length>1&&arguments[1]!==void 0&&arguments[1],r="";A({x:t,y:t}),t8A={left:"right",right:"left",bottom:"top",top:"bottom"},i8A={start:"end",end:"start"};function ZW(t,e,A){return z1(t,JD(e,A))}function tw(t,e){return typeof t=="function"?t(e):t}function Ad(t){return t.split("-")[0]}function iw(t){return t.split("-")[1]}function VX(t){return t==="x"?"y":"x"}function WX(t){return t==="y"?"height":"width"}var n8A=new Set(["top","bottom"]);function AI(t){return n8A.has(Ad(t))?"y":"x"}function ZX(t){return VX(AI(t))}function wR(t){return t.replace(/start|end/g,e=>i8A[e])}var XW=["left","right"],$W=["right","left"],o8A=["top","bottom"],a8A=["bottom","top"];function r8A(t,e,A,i){var n=iw(t),o=(function(a,r,s){switch(a){case"top":case"bottom":return s?r?$W:XW:r?XW:$W;case"left":case"right":return r?o8A:a8A;default:return[]}})(Ad(t),A==="start",i);return n&&(o=o.map(a=>a+"-"+n),e&&(o=o.concat(o.map(wR)))),o}function CD(t){return t.replace(/left|right|bottom|top/g,e=>t8A[e])}function s8A(t){return typeof t!="number"?(function(e){return ye({top:0,right:0,bottom:0,left:0},e)})(t):{top:t,right:t,bottom:t,left:t}}function HD(t){var{x:e,y:A,width:i,height:n}=t;return{width:i,height:n,top:A,left:e,right:e+i,bottom:A+n,x:e,y:A}}function AZ(t,e,A){var i,{reference:n,floating:o}=t,a=AI(e),r=ZX(e),s=WX(r),g=Ad(e),l=a==="y",C=n.x+n.width/2-o.width/2,I=n.y+n.height/2-o.height/2,d=n[s]/2-o[s]/2;switch(g){case"top":i={x:C,y:n.y-o.height};break;case"bottom":i={x:C,y:n.y+n.height};break;case"right":i={x:n.x+n.width,y:I};break;case"left":i={x:n.x-o.width,y:I};break;default:i={x:n.x,y:n.y}}switch(iw(e)){case"start":i[r]-=d*(A&&l?-1:1);break;case"end":i[r]+=d*(A&&l?-1:1)}return i}var g8A=(function(){var t=Ut(function*(e,A,i){for(var{placement:n="bottom",strategy:o="absolute",middleware:a=[],platform:r}=i,s=a.filter(Boolean),g=yield r.isRTL==null?void 0:r.isRTL(A),l=yield r.getElementRects({reference:e,floating:A,strategy:o}),{x:C,y:I}=AZ(l,n,g),d=n,B={},Q=0,E=0;E"u")&&(t instanceof ShadowRoot||t instanceof bg(t).ShadowRoot)}var c8A=new Set(["inline","contents"]);function gu(t){var{overflow:e,overflowX:A,overflowY:i,display:n}=ac(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+A)&&!c8A.has(n)}var C8A=new Set(["table","td","th"]);function I8A(t){return C8A.has(gE(t))}var d8A=[":popover-open",":modal"];function TD(t){return d8A.some(e=>{try{return t.matches(e)}catch(A){return!1}})}var B8A=["transform","translate","scale","rotate","perspective"],Q8A=["transform","translate","scale","rotate","perspective","filter"],E8A=["paint","layout","strict","content"];function bR(t){var e=aN(),A=oc(t)?ac(t):t;return B8A.some(i=>!!A[i]&&A[i]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||Q8A.some(i=>(A.willChange||"").includes(i))||E8A.some(i=>(A.contain||"").includes(i))}function aN(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var h8A=new Set(["html","body","#document"]);function VQ(t){return h8A.has(gE(t))}function ac(t){return bg(t).getComputedStyle(t)}function ow(t){return oc(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function eI(t){if(gE(t)==="html")return t;var e=t.assignedSlot||t.parentNode||eZ(t)&&t.host||B0(t);return eZ(e)?e.host:e}function A$(t){var e=eI(t);return VQ(e)?t.ownerDocument?t.ownerDocument.body:t.body:Q0(e)&&gu(e)?e:A$(e)}function lu(t,e,A){var i;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=A$(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),a=bg(n);if(o){var r=MR(a);return e.concat(a,a.visualViewport||[],gu(n)?n:[],r&&A?lu(r):[])}return e.concat(n,lu(n,[],A))}function MR(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function e$(t){var e=ac(t),A=parseFloat(e.width)||0,i=parseFloat(e.height)||0,n=Q0(t),o=n?t.offsetWidth:A,a=n?t.offsetHeight:i,r=YD(A)!==o||YD(i)!==a;return r&&(A=o,i=a),{width:A,height:i,$:r}}function rN(t){return oc(t)?t:t.contextElement}function WQ(t){var e=rN(t);if(!Q0(e))return d0(1);var A=e.getBoundingClientRect(),{width:i,height:n,$:o}=e$(e),a=(o?YD(A.width):A.width)/i,r=(o?YD(A.height):A.height)/n;return a&&Number.isFinite(a)||(a=1),r&&Number.isFinite(r)||(r=1),{x:a,y:r}}var u8A=d0(0);function t$(t){var e=bg(t);return aN()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:u8A}function ed(t,e,A,i){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=t.getBoundingClientRect(),o=rN(t),a=d0(1);e&&(i?oc(i)&&(a=WQ(i)):a=WQ(t));var r=(function(v,F,G){return F===void 0&&(F=!1),!(!G||F&&G!==bg(v))&&F})(o,A,i)?t$(o):d0(0),s=(n.left+r.x)/a.x,g=(n.top+r.y)/a.y,l=n.width/a.x,C=n.height/a.y;if(o)for(var I=bg(o),d=i&&oc(i)?bg(i):i,B=I,Q=MR(B);Q&&i&&d!==B;){var E=WQ(Q),f=Q.getBoundingClientRect(),b=ac(Q),R=f.left+(Q.clientLeft+parseFloat(b.paddingLeft))*E.x,M=f.top+(Q.clientTop+parseFloat(b.paddingTop))*E.y;s*=E.x,g*=E.y,l*=E.x,C*=E.y,s+=R,g+=M,Q=MR(B=bg(Q))}return HD({width:l,height:C,x:s,y:g})}function OD(t,e){var A=ow(t).scrollLeft;return e?e.left+A:ed(B0(t)).left+A}function i$(t,e){var A=t.getBoundingClientRect();return{x:A.left+e.scrollLeft-OD(t,A),y:A.top+e.scrollTop}}var f8A=new Set(["absolute","fixed"]);function tZ(t,e,A){var i;if(e==="viewport")i=(function(o,a){var r=bg(o),s=B0(o),g=r.visualViewport,l=s.clientWidth,C=s.clientHeight,I=0,d=0;if(g){l=g.width,C=g.height;var B=aN();(!B||B&&a==="fixed")&&(I=g.offsetLeft,d=g.offsetTop)}var Q=OD(s);if(Q<=0){var E=s.ownerDocument,f=E.body,b=getComputedStyle(f),R=E.compatMode==="CSS1Compat"&&parseFloat(b.marginLeft)+parseFloat(b.marginRight)||0,M=Math.abs(s.clientWidth-f.clientWidth-R);M<=25&&(l-=M)}else Q<=25&&(l+=Q);return{width:l,height:C,x:I,y:d}})(t,A);else if(e==="document")i=(function(o){var a=B0(o),r=ow(o),s=o.ownerDocument.body,g=z1(a.scrollWidth,a.clientWidth,s.scrollWidth,s.clientWidth),l=z1(a.scrollHeight,a.clientHeight,s.scrollHeight,s.clientHeight),C=-r.scrollLeft+OD(o),I=-r.scrollTop;return ac(s).direction==="rtl"&&(C+=z1(a.clientWidth,s.clientWidth)-g),{width:g,height:l,x:C,y:I}})(B0(t));else if(oc(e))i=(function(o,a){var r=ed(o,!0,a==="fixed"),s=r.top+o.clientTop,g=r.left+o.clientLeft,l=Q0(o)?WQ(o):d0(1);return{width:o.clientWidth*l.x,height:o.clientHeight*l.y,x:g*l.x,y:s*l.y}})(e,A);else{var n=t$(t);i={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return HD(i)}function n$(t,e){var A=eI(t);return!(A===e||!oc(A)||VQ(A))&&(ac(A).position==="fixed"||n$(A,e))}function m8A(t,e,A){var i=Q0(e),n=B0(e),o=A==="fixed",a=ed(t,!0,o,e),r={scrollLeft:0,scrollTop:0},s=d0(0);function g(){s.x=OD(n)}if(i||!i&&!o)if((gE(e)!=="body"||gu(n))&&(r=ow(e)),i){var l=ed(e,!0,o,e);s.x=l.x+e.clientLeft,s.y=l.y+e.clientTop}else n&&g();o&&!i&&n&&g();var C=!n||i||o?d0(0):i$(n,r);return{x:a.left+r.scrollLeft-s.x-C.x,y:a.top+r.scrollTop-s.y-C.y,width:a.width,height:a.height}}function Zx(t){return ac(t).position==="static"}function iZ(t,e){if(!Q0(t)||ac(t).position==="fixed")return null;if(e)return e(t);var A=t.offsetParent;return B0(t)===A&&(A=A.ownerDocument.body),A}function nZ(t,e){var A=bg(t);if(TD(t))return A;if(!Q0(t)){for(var i=eI(t);i&&!VQ(i);){if(oc(i)&&!Zx(i))return i;i=eI(i)}return A}for(var n=iZ(t,e);n&&I8A(n)&&Zx(n);)n=iZ(n,e);return n&&VQ(n)&&Zx(n)&&!bR(n)?A:n||(function(o){for(var a=eI(o);Q0(a)&&!VQ(a);){if(bR(a))return a;if(TD(a))return null;a=eI(a)}return null})(t)||A}var p8A={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:e,rect:A,offsetParent:i,strategy:n}=t,o=n==="fixed",a=B0(i),r=!!e&&TD(e.floating);if(i===a||r&&o)return A;var s={scrollLeft:0,scrollTop:0},g=d0(1),l=d0(0),C=Q0(i);if((C||!C&&!o)&&((gE(i)!=="body"||gu(a))&&(s=ow(i)),Q0(i))){var I=ed(i);g=WQ(i),l.x=I.x+i.clientLeft,l.y=I.y+i.clientTop}var d=!a||C||o?d0(0):i$(a,s);return{width:A.width*g.x,height:A.height*g.y,x:A.x*g.x-s.scrollLeft*g.x+l.x+d.x,y:A.y*g.y-s.scrollTop*g.y+l.y+d.y}},getDocumentElement:B0,getClippingRect:function(t){var{element:e,boundary:A,rootBoundary:i,strategy:n}=t,o=A==="clippingAncestors"?TD(e)?[]:(function(g,l){var C=l.get(g);if(C)return C;for(var I=lu(g,[],!1).filter(b=>oc(b)&&gE(b)!=="body"),d=null,B=ac(g).position==="fixed",Q=B?eI(g):g;oc(Q)&&!VQ(Q);){var E=ac(Q),f=bR(Q);f||E.position!=="fixed"||(d=null),(B?!f&&!d:!f&&E.position==="static"&&d&&f8A.has(d.position)||gu(Q)&&!f&&n$(g,Q))?I=I.filter(b=>b!==Q):d=E,Q=eI(Q)}return l.set(g,I),I})(e,this._c):[].concat(A),a=[...o,i],r=a[0],s=a.reduce((g,l)=>{var C=tZ(e,l,n);return g.top=z1(C.top,g.top),g.right=JD(C.right,g.right),g.bottom=JD(C.bottom,g.bottom),g.left=z1(C.left,g.left),g},tZ(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:nZ,getElementRects:(function(){var t=Ut(function*(e){var A=this.getOffsetParent||nZ,i=this.getDimensions,n=yield i(e.floating);return{reference:m8A(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return t.apply(this,arguments)}})(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:e,height:A}=e$(t);return{width:e,height:A}},getScale:WQ,isElement:oc,isRTL:function(t){return ac(t).direction==="rtl"}};function oZ(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function D8A(t,e,A,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:s=!1}=i,g=rN(t),l=n||o?[...g?lu(g):[],...lu(e)]:[];l.forEach(E=>{n&&E.addEventListener("scroll",A,{passive:!0}),o&&E.addEventListener("resize",A)});var C,I=g&&r?(function(E,f){var b,R=null,M=B0(E);function v(){var F;clearTimeout(b),(F=R)==null||F.disconnect(),R=null}return(function F(G,U){G===void 0&&(G=!1),U===void 0&&(U=1),v();var Y=E.getBoundingClientRect(),{left:j,top:AA,width:z,height:yA}=Y;if(G||f(),z&&yA){var P={rootMargin:-cD(AA)+"px "+-cD(M.clientWidth-(j+z))+"px "+-cD(M.clientHeight-(AA+yA))+"px "+-cD(j)+"px",threshold:z1(0,JD(1,U))||1},nA=!0;try{R=new IntersectionObserver(eA,ye(ye({},P),{},{root:M.ownerDocument}))}catch(dA){R=new IntersectionObserver(eA,P)}R.observe(E)}function eA(dA){var iA=dA[0].intersectionRatio;if(iA!==U){if(!nA)return F();iA?F(!1,iA):b=setTimeout(()=>{F(!1,1e-7)},1e3)}iA!==1||oZ(Y,E.getBoundingClientRect())||F(),nA=!1}})(!0),v})(g,A):null,d=-1,B=null;a&&(B=new ResizeObserver(E=>{var[f]=E;f&&f.target===g&&B&&(B.unobserve(e),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var b;(b=B)==null||b.observe(e)})),A()}),g&&!s&&B.observe(g),B.observe(e));var Q=s?ed(t):null;return s&&(function E(){var f=ed(t);Q&&!oZ(Q,f)&&A(),Q=f,C=requestAnimationFrame(E)})(),A(),()=>{var E;l.forEach(f=>{n&&f.removeEventListener("scroll",A),o&&f.removeEventListener("resize",A)}),I?.(),(E=B)==null||E.disconnect(),B=null,s&&cancelAnimationFrame(C)}}var w8A=function(t){return t===void 0&&(t=0),{name:"offset",options:t,fn:e=>Ut(function*(){var A,i,{x:n,y:o,placement:a,middlewareData:r}=e,s=yield(function(g,l){return vR.apply(this,arguments)})(e,t);return a===((A=r.offset)==null?void 0:A.placement)&&(i=r.arrow)!=null&&i.alignmentOffset?{}:{x:n+s.x,y:o+s.y,data:ye(ye({},s),{},{placement:a})}})()}},y8A=function(t){return t===void 0&&(t={}),{name:"shift",options:t,fn:e=>Ut(function*(){var{x:A,y:i,placement:n}=e,o=tw(t,e),{mainAxis:a=!0,crossAxis:r=!1,limiter:s={fn:R=>{var{x:M,y:v}=R;return{x:M,y:v}}}}=o,g=IZ(o,lpA),l={x:A,y:i},C=yield XX(e,g),I=AI(Ad(n)),d=VX(I),B=l[d],Q=l[I];if(a){var E=d==="y"?"bottom":"right";B=ZW(B+C[d==="y"?"top":"left"],B,B-C[E])}if(r){var f=I==="y"?"bottom":"right";Q=ZW(Q+C[I==="y"?"top":"left"],Q,Q-C[f])}var b=s.fn(ye(ye({},e),{},{[d]:B,[I]:Q}));return ye(ye({},b),{},{data:{x:b.x-A,y:b.y-i,enabled:{[d]:a,[I]:r}}})})()}},v8A=function(t){return t===void 0&&(t={}),{name:"flip",options:t,fn:e=>Ut(function*(){var A,i,{placement:n,middlewareData:o,rects:a,initialPlacement:r,platform:s,elements:g}=e,l=tw(t,e),{mainAxis:C=!0,crossAxis:I=!0,fallbackPlacements:d,fallbackStrategy:B="bestFit",fallbackAxisSideDirection:Q="none",flipAlignment:E=!0}=l,f=IZ(l,gpA);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var b=Ad(n),R=AI(r),M=Ad(r)===r,v=yield s.isRTL==null?void 0:s.isRTL(g.floating),F=d||(M||!E?[CD(r)]:(function(hA){var JA=CD(hA);return[wR(hA),JA,wR(JA)]})(r)),G=Q!=="none";!d&&G&&F.push(...r8A(r,E,Q,v));var U=[r,...F],Y=yield XX(e,f),j=[],AA=((i=o.flip)==null?void 0:i.overflows)||[];if(C&&j.push(Y[b]),I){var z=(function(hA,JA,ee){ee===void 0&&(ee=!1);var UA=iw(hA),mA=ZX(hA),KA=WX(mA),ze=mA==="x"?UA===(ee?"end":"start")?"right":"left":UA==="start"?"bottom":"top";return JA.reference[KA]>JA.floating[KA]&&(ze=CD(ze)),[ze,CD(ze)]})(n,a,v);j.push(Y[z[0]],Y[z[1]])}if(AA=[...AA,{placement:n,overflows:j}],!j.every(hA=>hA<=0)){var yA,P,nA=(((yA=o.flip)==null?void 0:yA.index)||0)+1,eA=U[nA];if(eA&&(!(I==="alignment"&&R!==AI(eA))||AA.every(hA=>AI(hA.placement)!==R||hA.overflows[0]>0)))return{data:{index:nA,overflows:AA},reset:{placement:eA}};var dA=(P=AA.filter(hA=>hA.overflows[0]<=0).sort((hA,JA)=>hA.overflows[1]-JA.overflows[1])[0])==null?void 0:P.placement;if(!dA)switch(B){case"bestFit":var iA,aA=(iA=AA.filter(hA=>{if(G){var JA=AI(hA.placement);return JA===R||JA==="y"}return!0}).map(hA=>[hA.placement,hA.overflows.filter(JA=>JA>0).reduce((JA,ee)=>JA+ee,0)]).sort((hA,JA)=>hA[1]-JA[1])[0])==null?void 0:iA[0];aA&&(dA=aA);break;case"initialPlacement":dA=r}if(n!==dA)return{reset:{placement:dA}}}return{}})()}};function b8A(t){var e,A,i={autoUpdate:!0},n=t,o=s=>ye(ye(ye({},i),t||{}),s||{}),a=s=>{e&&A&&(n=o(s),((g,l,C)=>{var I=new Map,d=ye({platform:p8A},C),B=ye(ye({},d.platform),{},{_c:I});return g8A(g,l,ye(ye({},d),{},{platform:B}))})(e,A,n).then(g=>{var l;Object.assign(A.style,{position:g.strategy,left:"".concat(g.x,"px"),top:"".concat(g.y,"px")}),!((l=n)===null||l===void 0)&&l.onComputed&&n.onComputed(g)}))},r=s=>{cl(s.subscribe(g=>{e===void 0?(e=g,a()):(Object.assign(e,g),a())}))};return[s=>{if("subscribe"in s)return r(s),{};e=s,a()},(s,g)=>{var l;A=s,n=o(g),setTimeout(()=>a(g),0),a(g);var C=()=>{l&&(l(),l=void 0)},I=function(){var{autoUpdate:d}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};C(),d!==!1&&iX().then(()=>D8A(e,A,()=>a(n),d===!0?{}:d))};return l=I(),{update(d){a(d),l=I(d)},destroy(){C()}}},a]}function M8A(t){var{loadOptions:e,filterText:A,items:i,multiple:n,value:o,itemId:a,groupBy:r,filterSelectedItems:s,itemFilter:g,convertStringItemsToObjects:l,filterGroupedItems:C,label:I}=t;if(i&&e)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!="object"&&(i=l(i));var d=i.filter(B=>{var Q=g(B[I],A,B);return Q&&n&&o!=null&&o.length&&(Q=!o.some(E=>!!s&&E[a]===B[a])),Q});return r&&(d=C(d)),d}function k8A(t){return o$.apply(this,arguments)}function o$(){return(o$=Ut(function*(t){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:i,filterText:n}=t,o=yield A(n).catch(a=>{console.warn("svelte-select loadOptions error :>> ",a),e("error",{type:"loadOptions",details:a})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=i(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Pt(` svg.svelte-1kxu7be { width: var(--chevron-icon-width, 20px); height: var(--chevron-icon-width, 20px); color: var(--chevron-icon-colour, currentColor); } `);var S8A=CI(``);Pt(` svg.svelte-1hraxrc { width: var(--clear-icon-width, 20px); height: var(--clear-icon-width, 20px); color: var(--clear-icon-color, currentColor); } `);var x8A=CI(``);function Xx(t){lA(t,x8A())}Pt(` .loading.svelte-y9fi5p { width: var(--spinner-width, 20px); height: var(--spinner-height, 20px); color: var(--spinner-color, var(--icons-color)); animation: svelte-y9fi5p-rotate 0.75s linear infinite; transform-origin: center center; transform: none; } .circle_path.svelte-y9fi5p { stroke-dasharray: 90; stroke-linecap: round; } @keyframes svelte-y9fi5p-rotate { 100% { transform: rotate(360deg); } } `);var R8A=CI('');Pt(` .svelte-select.svelte-1ul7oo4 { /* deprecating camelCase custom props in favour of kebab-case for v5 */ --borderRadius: var(--border-radius); --clearSelectColor: var(--clear-select-color); --clearSelectWidth: var(--clear-select-width); --disabledBackground: var(--disabled-background); --disabledBorderColor: var(--disabled-border-color); --disabledColor: var(--disabled-color); --disabledPlaceholderColor: var(--disabled-placeholder-color); --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); --errorBackground: var(--error-background); --errorBorder: var(--error-border); --groupItemPaddingLeft: var(--group-item-padding-left); --groupTitleColor: var(--group-title-color); --groupTitleFontSize: var(--group-title-font-size); --groupTitleFontWeight: var(--group-title-font-weight); --groupTitlePadding: var(--group-title-padding); --groupTitleTextTransform: var(--group-title-text-transform); --groupTitleBorderColor: var(--group-title-border-color); --groupTitleBorderWidth: var(--group-title-border-width); --groupTitleBorderStyle: var(--group-title-border-style); --indicatorColor: var(--chevron-color); --indicatorHeight: var(--chevron-height); --indicatorWidth: var(--chevron-width); --inputColor: var(--input-color); --inputLeft: var(--input-left); --inputLetterSpacing: var(--input-letter-spacing); --inputMargin: var(--input-margin); --inputPadding: var(--input-padding); --itemActiveBackground: var(--item-active-background); --itemColor: var(--item-color); --itemFirstBorderRadius: var(--item-first-border-radius); --itemHoverBG: var(--item-hover-bg); --itemHoverColor: var(--item-hover-color); --itemIsActiveBG: var(--item-is-active-bg); --itemIsActiveColor: var(--item-is-active-color); --itemIsNotSelectableColor: var(--item-is-not-selectable-color); --itemPadding: var(--item-padding); --listBackground: var(--list-background); --listBorder: var(--list-border); --listBorderRadius: var(--list-border-radius); --listEmptyColor: var(--list-empty-color); --listEmptyPadding: var(--list-empty-padding); --listEmptyTextAlign: var(--list-empty-text-align); --listMaxHeight: var(--list-max-height); --listPosition: var(--list-position); --listShadow: var(--list-shadow); --listZIndex: var(--list-z-index); --multiItemBG: var(--multi-item-bg); --multiItemBorderRadius: var(--multi-item-border-radius); --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); --multiItemHeight: var(--multi-item-height); --multiItemMargin: var(--multi-item-margin); --multiItemPadding: var(--multi-item-padding); --multiSelectInputMargin: var(--multi-select-input-margin); --multiSelectInputPadding: var(--multi-select-input-padding); --multiSelectPadding: var(--multi-select-padding); --placeholderColor: var(--placeholder-color); --placeholderOpacity: var(--placeholder-opacity); --selectedItemPadding: var(--selected-item-padding); --spinnerColor: var(--spinner-color); --spinnerHeight: var(--spinner-height); --spinnerWidth: var(--spinner-width); --internal-padding: 0 0 0 16px; border: var(--border, 1px solid #d8dbdf); border-radius: var(--border-radius, 6px); min-height: var(--height, 42px); position: relative; display: flex; align-items: stretch; padding: var(--padding, var(--internal-padding)); background: var(--background, #fff); margin: var(--margin, 0); width: var(--width, 100%); font-size: var(--font-size, 16px); max-height: var(--max-height); } .svelte-1ul7oo4 { box-sizing: var(--box-sizing, border-box); } .svelte-select.svelte-1ul7oo4:hover { border: var(--border-hover, 1px solid #b2b8bf); } .value-container.svelte-1ul7oo4 { display: flex; flex: 1 1 0%; flex-wrap: wrap; align-items: center; gap: 5px 10px; padding: var(--value-container-padding, 5px 0); position: relative; overflow: var(--value-container-overflow, hidden); align-self: stretch; } .prepend.svelte-1ul7oo4, .indicators.svelte-1ul7oo4 { display: flex; flex-shrink: 0; align-items: center; } .indicators.svelte-1ul7oo4 { position: var(--indicators-position); top: var(--indicators-top); right: var(--indicators-right); bottom: var(--indicators-bottom); } input.svelte-1ul7oo4 { position: absolute; cursor: default; border: none; color: var(--input-color, var(--item-color)); padding: var(--input-padding, 0); letter-spacing: var(--input-letter-spacing, inherit); margin: var(--input-margin, 0); min-width: 10px; top: 0; right: 0; bottom: 0; left: 0; background: transparent; font-size: var(--font-size, 16px); } .svelte-1ul7oo4:not(.multi) > .value-container:where(.svelte-1ul7oo4) > input:where(.svelte-1ul7oo4) { width: 100%; height: 100%; } input.svelte-1ul7oo4::placeholder { color: var(--placeholder-color, #78848f); opacity: var(--placeholder-opacity, 1); } input.svelte-1ul7oo4:focus { outline: none; } .svelte-select.focused.svelte-1ul7oo4 { border: var(--border-focused, 1px solid #006fe8); border-radius: var(--border-radius-focused, var(--border-radius, 6px)); } .disabled.svelte-1ul7oo4 { background: var(--disabled-background, #ebedef); border-color: var(--disabled-border-color, #ebedef); color: var(--disabled-color, #c1c6cc); } .disabled.svelte-1ul7oo4 input:where(.svelte-1ul7oo4)::placeholder { color: var(--disabled-placeholder-color, #c1c6cc); opacity: var(--disabled-placeholder-opacity, 1); } .selected-item.svelte-1ul7oo4 { position: relative; overflow: var(--selected-item-overflow, hidden); padding: var(--selected-item-padding, 0 20px 0 0); text-overflow: ellipsis; white-space: nowrap; color: var(--selected-item-color, inherit); font-size: var(--font-size, 16px); } .multi.svelte-1ul7oo4 .selected-item:where(.svelte-1ul7oo4) { position: absolute; line-height: var(--height, 42px); height: var(--height, 42px); } .selected-item.svelte-1ul7oo4:focus { outline: none; } .hide-selected-item.svelte-1ul7oo4 { opacity: 0; } .icon.svelte-1ul7oo4 { display: flex; align-items: center; justify-content: center; } .clear-select.svelte-1ul7oo4 { all: unset; display: flex; align-items: center; justify-content: center; width: var(--clear-select-width, 40px); height: var(--clear-select-height, 100%); color: var(--clear-select-color, var(--icons-color)); margin: var(--clear-select-margin, 0); pointer-events: all; flex-shrink: 0; } .clear-select.svelte-1ul7oo4:focus { outline: var(--clear-select-focus-outline, 1px solid #006fe8); } .loading.svelte-1ul7oo4 { width: var(--loading-width, 40px); height: var(--loading-height); color: var(--loading-color, var(--icons-color)); margin: var(--loading--margin, 0); flex-shrink: 0; } .chevron.svelte-1ul7oo4 { width: var(--chevron-width, 40px); height: var(--chevron-height, 40px); background: var(--chevron-background, transparent); pointer-events: var(--chevron-pointer-events, none); color: var(--chevron-color, var(--icons-color)); border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); flex-shrink: 0; } .multi.svelte-1ul7oo4 { padding: var(--multi-select-padding, var(--internal-padding)); } .multi.svelte-1ul7oo4 input:where(.svelte-1ul7oo4) { padding: var(--multi-select-input-padding, 0); position: relative; margin: var(--multi-select-input-margin, 5px 0); flex: 1 1 40px; } .svelte-select.error.svelte-1ul7oo4 { border: var(--error-border, 1px solid #ff2d55); background: var(--error-background, #fff); } .a11y-text.svelte-1ul7oo4 { z-index: 9999; border: 0px; clip: rect(1px, 1px, 1px, 1px); height: 1px; width: 1px; position: absolute; overflow: hidden; padding: 0px; white-space: nowrap; } .multi-item.svelte-1ul7oo4 { background: var(--multi-item-bg, #ebedef); margin: var(--multi-item-margin, 0); outline: var(--multi-item-outline, 1px solid #ddd); border-radius: var(--multi-item-border-radius, 4px); height: var(--multi-item-height, 25px); line-height: var(--multi-item-height, 25px); display: flex; cursor: default; padding: var(--multi-item-padding, 0 5px); overflow: hidden; gap: var(--multi-item-gap, 4px); outline-offset: -1px; max-width: var(--multi-max-width, none); color: var(--multi-item-color, var(--item-color)); } .multi-item.disabled.svelte-1ul7oo4:hover { background: var(--multi-item-disabled-hover-bg, #ebedef); color: var(--multi-item-disabled-hover-color, #c1c6cc); } .multi-item-text.svelte-1ul7oo4 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .multi-item-clear.svelte-1ul7oo4 { display: flex; align-items: center; justify-content: center; --clear-icon-color: var(--multi-item-clear-icon-color, #000); } .multi-item.active.svelte-1ul7oo4 { outline: var(--multi-item-active-outline, 1px solid #006fe8); } .svelte-select-list.svelte-1ul7oo4 { box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); border-radius: var(--list-border-radius, 4px); max-height: var(--list-max-height, 252px); overflow-y: auto; background: var(--list-background, #fff); position: var(--list-position, absolute); z-index: var(--list-z-index, 2); border: var(--list-border); } .prefloat.svelte-1ul7oo4 { opacity: 0; pointer-events: none; } .list-group-title.svelte-1ul7oo4 { color: var(--group-title-color, #8f8f8f); cursor: default; font-size: var(--group-title-font-size, 16px); font-weight: var(--group-title-font-weight, 600); height: var(--height, 42px); line-height: var(--height, 42px); padding: var(--group-title-padding, 0 20px); text-overflow: ellipsis; overflow-x: hidden; white-space: nowrap; text-transform: var(--group-title-text-transform, uppercase); border-width: var(--group-title-border-width, medium); border-style: var(--group-title-border-style, none); border-color: var(--group-title-border-color, color); } .empty.svelte-1ul7oo4 { text-align: var(--list-empty-text-align, center); padding: var(--list-empty-padding, 20px 0); color: var(--list-empty-color, #78848f); } .item.svelte-1ul7oo4 { cursor: default; height: var(--item-height, var(--height, 42px)); line-height: var(--item-line-height, var(--height, 42px)); padding: var(--item-padding, 0 20px); color: var(--item-color, inherit); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; transition: var(--item-transition, all 0.2s); align-items: center; width: 100%; } .item.group-item.svelte-1ul7oo4 { padding-left: var(--group-item-padding-left, 40px); } .item.svelte-1ul7oo4:active { background: var(--item-active-background, #b9daff); } .item.active.svelte-1ul7oo4 { background: var(--item-is-active-bg, #007aff); color: var(--item-is-active-color, #fff); } .item.first.svelte-1ul7oo4 { border-radius: var(--item-first-border-radius, 4px 4px 0 0); } .item.hover.svelte-1ul7oo4:not(.active) { background: var(--item-hover-bg, #e7f2ff); color: var(--item-hover-color, inherit); } .item.not-selectable.svelte-1ul7oo4, .item.hover.item.not-selectable.svelte-1ul7oo4, .item.active.item.not-selectable.svelte-1ul7oo4, .item.not-selectable.svelte-1ul7oo4:active { color: var(--item-is-not-selectable-color, #999); background: transparent; } .required.svelte-1ul7oo4 { opacity: 0; z-index: -1; position: absolute; top: 0; left: 0; bottom: 0; right: 0; } `);var N8A=FA('
    '),F8A=FA('
    No options
    '),L8A=FA('
    '),_8A=FA(' ',1),G8A=FA('
    '),K8A=FA('
    '),U8A=FA("
    "),J8A=FA(''),Y8A=FA(''),H8A=FA(''),T8A=FA(''),O8A=FA(''),z8A=FA('
    ');function U1(t,e){var A=(function(IA){var SA={};for(var re in IA.children&&(SA.default=!0),IA.$$slots)SA[re]=!0;return SA})(e);kt(e,!1);var i,n=CA(),o=CA(),a=CA(),r=CA(),s=CA(),g=CA(),l=CA(),C=CA(),I=CA(),d=UpA(),B=N(e,"justValue",12,null),Q=N(e,"filter",8,M8A),E=N(e,"getItems",8,k8A),f=N(e,"id",8,null),b=N(e,"name",8,null),R=N(e,"container",12,void 0),M=N(e,"input",12,void 0),v=N(e,"multiple",8,!1),F=N(e,"multiFullItemClearable",8,!1),G=N(e,"disabled",8,!1),U=N(e,"focused",12,!1),Y=N(e,"value",12,null),j=N(e,"filterText",12,""),AA=N(e,"placeholder",8,"Please select"),z=N(e,"placeholderAlwaysShow",8,!1),yA=N(e,"items",12,null),P=N(e,"label",8,"label"),nA=N(e,"itemFilter",8,(IA,SA,re)=>"".concat(IA).toLowerCase().includes(SA.toLowerCase())),eA=N(e,"groupBy",8,void 0),dA=N(e,"groupFilter",8,IA=>IA),iA=N(e,"groupHeaderSelectable",8,!1),aA=N(e,"itemId",8,"value"),hA=N(e,"loadOptions",8,void 0),JA=N(e,"containerStyles",8,""),ee=N(e,"hasError",8,!1),UA=N(e,"filterSelectedItems",8,!0),mA=N(e,"required",8,!1),KA=N(e,"closeListOnChange",8,!0),ze=N(e,"clearFilterTextOnBlur",8,!0),Ke=N(e,"createGroupHeaderItem",8,(IA,SA)=>({value:IA,[P()]:IA})),HA=()=>c(l),uA=N(e,"searchable",8,!0),XA=N(e,"inputStyles",8,""),EA=N(e,"clearable",8,!0),ZA=N(e,"loading",12,!1),MA=N(e,"listOpen",12,!1),be=N(e,"debounce",8,function(IA){var SA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(IA,SA)}),_A=N(e,"debounceWait",8,300),pA=N(e,"hideEmptyState",8,!1),Rt=N(e,"inputAttributes",24,()=>({})),Et=N(e,"listAutoWidth",8,!0),Qe=N(e,"showChevron",8,!1),_t=N(e,"listOffset",8,5),Ue=N(e,"hoverItemIndex",12,0),Te=N(e,"floatingConfig",24,()=>({})),ht=N(e,"class",8,""),Me=CA(),Ai=CA(),J=CA(),O=CA(),tA=CA();function oA(IA){return IA.map((SA,re)=>({index:re,value:SA,label:"".concat(SA)}))}function NA(IA){var SA=[],re={};IA.forEach(tt=>{var at=eA()(tt);SA.includes(at)||(SA.push(at),re[at]=[],at&&re[at].push(Object.assign(Ke()(at,tt),{id:at,groupHeader:!0,selectable:iA()}))),re[at].push(Object.assign({groupItem:!!at},tt))});var Se=[];return dA()(SA).forEach(tt=>{re[tt]&&Se.push(...re[tt])}),Se}function de(){var IA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,SA=arguments.length>1?arguments[1]:void 0;Ue(IA<0?0:IA),!SA&&eA()&&c(l)[Ue()]&&!c(l)[Ue()].selectable&&gi(1)}function Ee(){var IA=!0;if(Y()){var SA=[],re=[];Y().forEach(Se=>{SA.includes(Se[aA()])?IA=!1:(SA.push(Se[aA()]),re.push(Se))}),IA||Y(re)}return IA}function xA(IA){var SA=IA?IA[aA()]:Y()[aA()];return yA().find(re=>re[aA()]===SA)}function LA(IA){return dt.apply(this,arguments)}function dt(){return(dt=Ut(function*(IA){var SA=Y()[IA];Y().length===1?Y(void 0):Y(Y().filter(re=>re!==SA)),d("clear",SA)})).apply(this,arguments)}function At(IA){if(U())switch(IA.stopPropagation(),IA.key){case"Escape":IA.preventDefault(),Le();break;case"Enter":if(IA.preventDefault(),MA()){if(c(l).length===0)break;var SA=c(l)[Ue()];if(Y()&&!v()&&Y()[aA()]===SA[aA()]){Le();break}L(c(l)[Ue()])}break;case"ArrowDown":IA.preventDefault(),MA()?gi(1):(MA(!0),x(Me,void 0));break;case"ArrowUp":IA.preventDefault(),MA()?gi(-1):(MA(!0),x(Me,void 0));break;case"Tab":if(MA()&&U()){if(c(l).length===0||Y()&&Y()[aA()]===c(l)[Ue()][aA()])return Le();IA.preventDefault(),L(c(l)[Ue()]),Le()}break;case"Backspace":if(!v()||j().length>0)return;if(v()&&Y()&&Y().length>0){if(LA(c(Me)!==void 0?c(Me):Y().length-1),c(Me)===0||c(Me)===void 0)break;x(Me,Y().length>c(Me)?c(Me)-1:void 0)}break;case"ArrowLeft":if(!Y()||!v()||j().length>0)return;c(Me)===void 0?x(Me,Y().length-1):Y().length>c(Me)&&c(Me)!==0&&x(Me,c(Me)-1);break;case"ArrowRight":if(!Y()||!v()||j().length>0||c(Me)===void 0)return;c(Me)===Y().length-1?x(Me,void 0):c(Me)0?MA(!0):void MA(!MA())}function rn(){d("clear",Y()),Y(void 0),Le(),Je()}function Le(){ze()&&j(""),MA(!1)}JpA(Ut(function*(){x(Ai,Y()),x(J,j()),x(O,v())})),Jr(()=>{MA()&&U(!0),U()&&M()&&M().focus()});var ji=N(e,"ariaValues",8,IA=>"Option ".concat(IA,", selected.")),Bi=N(e,"ariaListOpen",8,(IA,SA)=>"You are currently focused on option ".concat(IA,". There are ").concat(SA," results available.")),vi=N(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),Ji,Dt=CA(null);function qi(){clearTimeout(Ji),Ji=setTimeout(()=>{Nt=!1},100)}cl(()=>{var IA;(IA=c(Dt))===null||IA===void 0||IA.remove()});var Nt=!1;function L(IA){IA&&IA.selectable!==!1&&(function(SA){if(SA){j("");var re=Object.assign({},SA);if(re.groupHeader&&!re.selectable)return;Y(v()?Y()?Y().concat([re]):[re]:Y(re)),setTimeout(()=>{KA()&&Le(),x(Me,void 0),d("change",Y()),d("select",SA)})}})(IA)}function gt(IA){Nt||Ue(IA)}function gi(IA){if(c(l).filter(re=>!Object.hasOwn(re,"selectable")||re.selectable===!0).length===0)return Ue(0);IA>0&&Ue()===c(l).length-1?Ue(0):IA<0&&Ue()===0?Ue(c(l).length-1):Ue(Ue()+IA);var SA=c(l)[Ue()];SA&&SA.selectable===!1&&(IA!==1&&IA!==-1||gi(IA))}function sn(IA,SA,re){if(!v())return SA&&SA[re]===IA[re]}var gn=ko,Kn=ko;function ko(IA){return{update(SA){SA.scroll&&(qi(),IA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var eo=CA({strategy:"absolute",placement:"bottom-start",middleware:[w8A(_t()),v8A(),y8A()],autoUpdate:!1}),[fo,Go,co]=b8A(c(eo)),ta=CA(!0);RA(()=>(_(yA()),_(Y())),()=>{yA(),Y()&&(function(){if(typeof Y()=="string"){var IA=(yA()||[]).find(SA=>SA[aA()]===Y());Y(IA||{[aA()]:Y(),label:Y()})}else v()&&Array.isArray(Y())&&Y().length>0&&Y(Y().map(SA=>typeof SA=="string"?{value:SA,label:SA}:SA))})()}),RA(()=>(_(Rt()),_(uA())),()=>{!Rt()&&uA()||(x(tA,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Rt())),f()&&yg(tA,c(tA).id=f()),uA()||yg(tA,c(tA).readonly=!0))}),RA(()=>_(v()),()=>{v()&&Y()&&(Array.isArray(Y())?Y([...Y()]):Y([Y()]))}),RA(()=>(c(O),_(v())),()=>{c(O)&&!v()&&Y()&&Y(null)}),RA(()=>(_(v()),_(Y())),()=>{v()&&Y()&&Y().length>1&&Ee()}),RA(()=>_(Y()),()=>{Y()&&(v()?JSON.stringify(Y())!==JSON.stringify(c(Ai))&&Ee()&&d("input",Y()):c(Ai)&&JSON.stringify(Y()[aA()])===JSON.stringify(c(Ai)[aA()])||d("input",Y()))}),RA(()=>(_(Y()),_(v()),c(Ai)),()=>{!Y()&&v()&&c(Ai)&&d("input",Y())}),RA(()=>(_(U()),_(M())),()=>{!U()&&M()&&Le()}),RA(()=>(_(j()),c(J)),()=>{j()!==c(J)&&(hA()||j().length!==0)&&(hA()?be()(Ut(function*(){ZA(!0);var IA=yield E()({dispatch:d,loadOptions:hA(),convertStringItemsToObjects:oA,filterText:j()});IA?(ZA(IA.loading),MA(MA()?IA.listOpen:j().length>0),U(MA()&&IA.focused),yA(eA()?NA(IA.filteredItems):IA.filteredItems)):(ZA(!1),U(!0),MA(!0))}),_A()):(MA(!0),v()&&x(Me,void 0)))}),RA(()=>(_(Q()),_(hA()),_(j()),_(yA()),_(v()),_(Y()),_(aA()),_(eA()),_(P()),_(UA()),_(nA())),()=>{x(l,Q()({loadOptions:hA(),filterText:j(),items:yA(),multiple:v(),value:Y(),itemId:aA(),groupBy:eA(),label:P(),filterSelectedItems:UA(),itemFilter:nA(),convertStringItemsToObjects:oA,filterGroupedItems:NA}))}),RA(()=>(_(v()),_(MA()),_(Y()),c(l)),()=>{!v()&&MA()&&Y()&&c(l)&&de(c(l).findIndex(IA=>IA[aA()]===Y()[aA()]),!0)}),RA(()=>(_(MA()),_(v())),()=>{MA()&&v()&&Ue(0)}),RA(()=>_(j()),()=>{j()&&Ue(0)}),RA(()=>_(Ue()),()=>{var IA;IA=Ue(),d("hoverItem",IA)}),RA(()=>(_(v()),_(Y())),()=>{x(n,v()?Y()&&Y().length>0:Y())}),RA(()=>(c(n),_(j())),()=>{x(o,c(n)&&j().length>0)}),RA(()=>(c(n),_(EA()),_(G()),_(ZA())),()=>{x(a,c(n)&&EA()&&!G()&&!ZA())}),RA(()=>(_(z()),_(v()),_(AA()),_(Y())),()=>{var IA;x(r,z()&&v()||v()&&((IA=Y())===null||IA===void 0?void 0:IA.length)===0?AA():Y()?"":AA())}),RA(()=>(_(Y()),_(v())),()=>{var IA,SA;x(s,Y()?(IA=v(),SA=void 0,SA=IA&&Y().length>0?Y().map(re=>re[P()]).join(", "):Y()[P()],ji()(SA)):"")}),RA(()=>(c(l),_(Ue()),_(U()),_(MA())),()=>{x(g,(function(){if(!c(l)||c(l).length===0)return"";var IA=c(l)[Ue()];if(MA()&&IA){var SA=c(l)?c(l).length:0;return Bi()(IA[P()],SA)}return vi()()})((c(l),Ue(),U(),MA())))}),RA(()=>_(yA()),()=>{(function(IA){IA&&IA.length!==0&&!IA.some(SA=>typeof SA!="object")&&Y()&&(v()?!Y().some(SA=>!SA||!SA[aA()]):Y()[aA()])&&(Array.isArray(Y())?Y(Y().map(SA=>xA(SA)||SA)):Y(xA()||Y()))})(yA())}),RA(()=>(_(v()),_(Y()),_(aA())),()=>{B((v(),Y(),aA(),v()?Y()?Y().map(IA=>IA[aA()]):null:Y()?Y()[aA()]:Y()))}),RA(()=>(_(v()),c(Ai),_(Y())),()=>{v()||!c(Ai)||Y()||d("input",Y())}),RA(()=>(_(MA()),c(l),_(v()),_(Y())),()=>{MA()&&c(l)&&!v()&&!Y()&&de()}),RA(()=>c(l),()=>{(function(IA){MA()&&d("filter",IA)})(c(l))}),RA(()=>(_(R()),_(Te()),c(eo)),()=>{R()&&Te()&&co(Object.assign(c(eo),Te()))}),RA(()=>c(Dt),()=>{x(C,!!c(Dt))}),RA(()=>(c(Dt),_(MA())),()=>{(function(IA,SA){if(!IA||!SA)return x(ta,!0);setTimeout(()=>{x(ta,!1)},0)})(c(Dt),MA())}),RA(()=>(_(MA()),_(R()),c(Dt)),()=>{MA()&&R()&&c(Dt)&&(function(){var{width:IA}=R().getBoundingClientRect();yg(Dt,c(Dt).style.width=Et()?IA+"px":"auto")})()}),RA(()=>_(Ue()),()=>{x(I,Ue())}),RA(()=>(_(M()),_(MA()),_(U())),()=>{M()&&MA()&&!U()&&Je()}),RA(()=>(_(R()),_(Te())),()=>{var IA;R()&&((IA=Te())===null||IA===void 0?void 0:IA.autoUpdate)===void 0&&yg(eo,c(eo).autoUpdate=!0)}),mn();var Ko={getFilteredItems:HA,handleClear:rn};$t();var qo,Co=z8A();ue("click",dC,function(IA){var SA;MA()||U()||!R()||R().contains(IA.target)||(SA=c(Dt))!==null&&SA!==void 0&&SA.contains(IA.target)||Ge()}),ue("keydown",dC,At);var se=cA(Co),Ci=IA=>{var SA,re=L8A(),Se=cA(re),tt=jt=>{var Si=yi();Aa($e(Si),e,"list-prepend",{},null),lA(jt,Si)};YA(Se,jt=>{QA(()=>A["list-prepend"])&&jt(tt)});var at=bA(Se,2),bt=jt=>{var Si=yi();Aa($e(Si),e,"list",{get filteredItems(){return c(l)}},null),lA(jt,Si)},Sn=jt=>{var Si=yi(),ca=$e(Si),Ft=xi=>{var Yi=yi();ea($e(Yi),1,()=>c(l),ha,(Un,cn,Mt)=>{var Vo,xo=N8A(),u=cA(xo);Aa(cA(u),e,"item",{get item(){return c(cn)},index:Mt},w=>{var S=tr();ve(()=>xt(S,(c(cn),_(P()),QA(()=>{var T;return(T=c(cn))===null||T===void 0?void 0:T[P()]})))),lA(w,S)}),as(u,(w,S)=>gn?.(w),()=>({scroll:sn(c(cn),Y(),aA()),listDom:c(C)})),as(u,(w,S)=>Kn?.(w),()=>({scroll:c(I)===Mt,listDom:c(C)})),ve(w=>Vo=Xt(u,1,"item svelte-1ul7oo4",null,Vo,w),[()=>{var w,S;return{"list-group-title":c(cn).groupHeader,active:sn(c(cn),Y(),aA()),first:(S=Mt,S===0),hover:Ue()===Mt,"group-item":c(cn).groupItem,"not-selectable":((w=c(cn))===null||w===void 0?void 0:w.selectable)===!1}}]),ue("mouseover",xo,()=>gt(Mt)),ue("focus",xo,()=>gt(Mt)),ue("click",xo,aC(()=>(function(w){var{item:S,i:T}=w;if(S?.selectable!==!1)return Y()&&!v()&&Y()[aA()]===S[aA()]?Le():void((function(k){return k.groupHeader&&k.selectable||k.selectable||!k.hasOwnProperty("selectable")})(S)&&(Ue(T),L(S)))})({item:c(cn),i:Mt}))),ue("keydown",xo,z2(aC(function(w){q3.call(this,e,w)}))),lA(Un,xo)}),lA(xi,Yi)},rt=xi=>{var Yi=yi(),Un=$e(Yi),cn=Mt=>{var Vo=yi();Aa($e(Vo),e,"empty",{},xo=>{lA(xo,F8A())}),lA(Mt,Vo)};YA(Un,Mt=>{pA()||Mt(cn)},!0),lA(xi,Yi)};YA(ca,xi=>{c(l),QA(()=>c(l).length>0)?xi(Ft):xi(rt,!1)},!0),lA(jt,Si)};YA(at,jt=>{QA(()=>A.list)?jt(bt):jt(Sn,!1)});var ki=bA(at,2),Gi=jt=>{var Si=yi();Aa($e(Si),e,"list-append",{},null),lA(jt,Si)};YA(ki,jt=>{QA(()=>A["list-append"])&&jt(Gi)}),as(re,jt=>Go?.(jt)),Mo(re,jt=>x(Dt,jt),()=>c(Dt)),Er(()=>ue("scroll",re,qi)),Er(()=>ue("pointerup",re,z2(aC(function(jt){q3.call(this,e,jt)})))),Er(()=>ue("mousedown",re,z2(aC(function(jt){q3.call(this,e,jt)})))),ve(()=>SA=Xt(re,1,"svelte-select-list svelte-1ul7oo4",null,SA,{prefloat:c(ta)})),lA(IA,re)};YA(se,IA=>{MA()&&IA(Ci)});var tn=bA(se,2),ln=cA(tn),So=IA=>{var SA=_8A(),re=$e(SA),Se=cA(re),tt=cA(bA(re,2));ve(()=>{xt(Se,c(s)),xt(tt,c(g))}),lA(IA,SA)};YA(ln,IA=>{U()&&IA(So)});var la=bA(tn,2);Aa(cA(la),e,"prepend",{},null);var pi=bA(la,2),to=cA(pi),Ja=IA=>{var SA=yi(),re=$e(SA),Se=at=>{var bt=yi();ea($e(bt),1,Y,ha,(Sn,ki,Gi)=>{var jt,Si=K8A(),ca=cA(Si);Aa(cA(ca),e,"selection",{get selection(){return c(ki)},index:Gi},xi=>{var Yi=tr();ve(()=>xt(Yi,(c(ki),_(P()),QA(()=>c(ki)[P()])))),lA(xi,Yi)});var Ft=bA(ca,2),rt=xi=>{var Yi=G8A();Aa(cA(Yi),e,"multi-clear-icon",{},Un=>{Xx(Un)}),ue("pointerup",Yi,z2(aC(()=>LA(Gi)))),lA(xi,Yi)};YA(Ft,xi=>{G()||F()||!Xx||xi(rt)}),ve(()=>jt=Xt(Si,1,"multi-item svelte-1ul7oo4",null,jt,{active:c(Me)===Gi,disabled:G()})),ue("click",Si,z2(()=>F()?LA(Gi):{})),ue("keydown",Si,z2(aC(function(xi){q3.call(this,e,xi)}))),lA(Sn,Si)}),lA(at,bt)},tt=at=>{var bt,Sn=U8A();Aa(cA(Sn),e,"selection",{get selection(){return Y()}},ki=>{var Gi=tr();ve(()=>xt(Gi,(_(Y()),_(P()),QA(()=>Y()[P()])))),lA(ki,Gi)}),ve(()=>bt=Xt(Sn,1,"selected-item svelte-1ul7oo4",null,bt,{"hide-selected-item":c(o)})),lA(at,Sn)};YA(re,at=>{v()?at(Se):at(tt,!1)}),lA(IA,SA)};YA(to,IA=>{c(n)&&IA(Ja)});var Io=bA(to,2);pD(Io,()=>ye(ye({readOnly:!uA()},c(tA)),{},{placeholder:c(r),style:XA(),disabled:G()}),void 0,void 0,void 0,"svelte-1ul7oo4",!0),Mo(Io,IA=>M(IA),()=>M());var Sa=bA(pi,2),kn=cA(Sa),Mi=IA=>{var SA=J8A();Aa(cA(SA),e,"loading-icon",{},re=>{(function(Se){lA(Se,R8A())})(re)}),lA(IA,SA)};YA(kn,IA=>{ZA()&&IA(Mi)});var Ot=bA(kn,2),pn=IA=>{var SA=Y8A();Aa(cA(SA),e,"clear-icon",{},re=>{Xx(re)}),ue("click",SA,rn),lA(IA,SA)};YA(Ot,IA=>{c(a)&&IA(pn)});var io=bA(Ot,2),mo=IA=>{var SA=H8A();Aa(cA(SA),e,"chevron-icon",{get listOpen(){return MA()}},re=>{(function(Se){lA(Se,S8A())})(re)}),lA(IA,SA)};YA(io,IA=>{Qe()&&IA(mo)});var vA=bA(Sa,2);Aa(vA,e,"input-hidden",{get value(){return Y()}},IA=>{var SA=T8A();ve(re=>{fn(SA,"name",b()),Z1(SA,re)},[()=>(_(Y()),QA(()=>Y()?JSON.stringify(Y()):null))]),lA(IA,SA)});var VA=bA(vA,2),me=IA=>{var SA=yi();Aa($e(SA),e,"required",{get value(){return Y()}},re=>{lA(re,O8A())}),lA(IA,SA)};return YA(VA,IA=>{_(mA()),_(Y()),QA(()=>mA()&&(!Y()||Y().length===0))&&IA(me)}),Er(()=>ue("pointerup",Co,z2(en))),Mo(Co,IA=>R(IA),()=>R()),as(Co,IA=>fo?.(IA)),ve(()=>{var IA;qo=Xt(Co,1,"svelte-select ".concat((IA=ht())!==null&&IA!==void 0?IA:""),"svelte-1ul7oo4",qo,{multi:v(),disabled:G(),focused:U(),"list-open":MA(),"show-chevron":Qe(),error:ee()}),gl(Co,JA())}),ue("keydown",Io,At),ue("blur",Io,Ge),ue("focus",Io,Je),xD(Io,j),lA(t,Co),Tt(e,"getFilteredItems",HA),Tt(e,"handleClear",rn),St(Ko)}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ table.jse-transform-wizard.svelte-9wqi8y { border-collapse: collapse; border-spacing: 0; width: 100%; } table.jse-transform-wizard.svelte-9wqi8y input:where(.svelte-9wqi8y) { font-family: inherit; font-size: inherit; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) th:where(.svelte-9wqi8y) { font-weight: normal; text-align: left; width: 60px; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) { width: 100%; display: flex; flex-direction: row; margin-bottom: calc(0.5 * var(--jse-padding, 10px)); } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .multi-item { align-items: center; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select .value-container { gap: 0 !important; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-path { flex: 4; margin-right: calc(0.5 * var(--jse-padding, 10px)); } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-filter-relation { flex: 1.5; margin-right: calc(0.5 * var(--jse-padding, 10px)); } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-path { flex: 3; margin-right: calc(0.5 * var(--jse-padding, 10px)); } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-sort-direction { flex: 1; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select.jse-projection-paths { flex: 1; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .svelte-select input { box-sizing: border-box; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y) { flex: 4; padding: 4px 8px; border: var(--jse-input-border, 1px solid #d8dbdf); border-radius: var(--jse-input-radius, 3px); outline: none; background: var(--jse-input-background, var(--jse-background-color, #fff)); color: inherit; } table.jse-transform-wizard.svelte-9wqi8y tr:where(.svelte-9wqi8y) td:where(.svelte-9wqi8y) .jse-horizontal:where(.svelte-9wqi8y) .jse-filter-value:where(.svelte-9wqi8y):focus { border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); }`);var P8A=FA('
    Filter
    Sort
    Pick
    ');function j8A(t,e){var A,i,n,o,a;kt(e,!1);var r=CA(void 0,!0),s=CA(void 0,!0),g=CA(void 0,!0),l=CA(void 0,!0),C=CA(void 0,!0),I=CA(void 0,!0),d=qa("jsoneditor:TransformWizard"),B=N(e,"json",9),Q=N(e,"queryOptions",29,()=>({})),E=N(e,"onChange",9),f=["==","!=","<","<=",">",">="].map(UA=>({value:UA,label:UA})),b=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],R=CA((A=Q())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?W2(Q().filter.path):void 0,!0),M=CA((i=f.find(UA=>{var mA;return UA.value===((mA=Q().filter)===null||mA===void 0?void 0:mA.relation)}))!==null&&i!==void 0?i:f[0],!0),v=CA(((n=Q())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),F=CA((o=Q())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?W2(Q().sort.path):void 0,!0),G=CA((a=b.find(UA=>{var mA;return UA.value===((mA=Q().sort)===null||mA===void 0?void 0:mA.direction)}))!==null&&a!==void 0?a:b[0],!0);RA(()=>_(B()),()=>{x(r,Array.isArray(B()))}),RA(()=>(c(r),_(B())),()=>{x(s,c(r)?dR(B()):[])}),RA(()=>(c(r),_(B())),()=>{x(g,c(r)?dR(B(),!0):[])}),RA(()=>(c(s),W2),()=>{x(l,c(s).map(W2))}),RA(()=>(c(g),W2),()=>{x(C,c(g)?c(g).map(W2):[])}),RA(()=>(_(Q()),c(C),di),()=>{var UA;x(I,(UA=Q())!==null&&UA!==void 0&&(UA=UA.projection)!==null&&UA!==void 0&&UA.paths&&c(C)?Q().projection.paths.map(mA=>c(C).find(KA=>di(KA.value,mA))).filter(mA=>!!mA):void 0)}),RA(()=>c(R),()=>{var UA,mA,KA;mA=(UA=c(R))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.filter)===null||KA===void 0?void 0:KA.path,mA)||(d("changeFilterPath",mA),Q(Sr(Q(),["filter","path"],mA,!0)),E()(Q()))}),RA(()=>c(M),()=>{var UA,mA,KA;mA=(UA=c(M))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.filter)===null||KA===void 0?void 0:KA.relation,mA)||(d("changeFilterRelation",mA),Q(Sr(Q(),["filter","relation"],mA,!0)),E()(Q()))}),RA(()=>c(v),()=>{var UA,mA;UA=c(v),di((mA=Q())===null||mA===void 0||(mA=mA.filter)===null||mA===void 0?void 0:mA.value,UA)||(d("changeFilterValue",UA),Q(Sr(Q(),["filter","value"],UA,!0)),E()(Q()))}),RA(()=>c(F),()=>{var UA,mA,KA;mA=(UA=c(F))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.sort)===null||KA===void 0?void 0:KA.path,mA)||(d("changeSortPath",mA),Q(Sr(Q(),["sort","path"],mA,!0)),E()(Q()))}),RA(()=>c(G),()=>{var UA,mA,KA;mA=(UA=c(G))===null||UA===void 0?void 0:UA.value,di((KA=Q())===null||KA===void 0||(KA=KA.sort)===null||KA===void 0?void 0:KA.direction,mA)||(d("changeSortDirection",mA),Q(Sr(Q(),["sort","direction"],mA,!0)),E()(Q()))}),RA(()=>c(I),()=>{(function(UA){var mA;di((mA=Q())===null||mA===void 0||(mA=mA.projection)===null||mA===void 0?void 0:mA.paths,UA)||(d("changeProjectionPaths",UA),Q(Sr(Q(),["projection","paths"],UA,!0)),E()(Q()))})(c(I)?c(I).map(UA=>UA.value):void 0)}),mn(),$t(!0);var U=P8A(),Y=cA(U),j=cA(Y),AA=bA(cA(j)),z=cA(AA),yA=cA(z);U1(yA,{class:"jse-filter-path",showChevron:!0,get items(){return c(l)},get value(){return c(R)},set value(UA){x(R,UA)},$$legacy:!0});var P=bA(yA,2);U1(P,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return f},get value(){return c(M)},set value(UA){x(M,UA)},$$legacy:!0});var nA=bA(P,2),eA=bA(j),dA=bA(cA(eA)),iA=cA(dA),aA=cA(iA);U1(aA,{class:"jse-sort-path",showChevron:!0,get items(){return c(l)},get value(){return c(F)},set value(UA){x(F,UA)},$$legacy:!0}),U1(bA(aA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return b},get value(){return c(G)},set value(UA){x(G,UA)},$$legacy:!0});var hA=bA(eA),JA=bA(cA(hA)),ee=cA(JA);U1(cA(ee),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return c(C)},get value(){return c(I)},set value(UA){x(I,UA)},$$legacy:!0}),xD(nA,()=>c(v),UA=>x(v,UA)),lA(t,U),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-select-query-language.svelte-jrd4q2 { position: relative; width: 32px; } .jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) { position: absolute; top: 0; right: 0; display: flex; flex-direction: column; box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); } .jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; text-align: left; padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); white-space: nowrap; color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); background: var(--jse-context-menu-background, #656565); } .jse-select-query-language.svelte-jrd4q2 .jse-select-query-language-container:where(.svelte-jrd4q2) .jse-query-language:where(.svelte-jrd4q2):hover { background: var(--jse-context-menu-background-highlight, #7a7a7a); }`);var q8A=FA(''),V8A=FA('
    ');function W8A(t,e){kt(e,!1);var A=N(e,"queryLanguages",8),i=N(e,"queryLanguageId",12),n=N(e,"onChangeQueryLanguage",8);$t();var o=V8A();ea(cA(o),5,A,ha,(a,r)=>{var s,g=q8A(),l=cA(g),C=B=>{Pi(B,{get data(){return rM}})},I=B=>{Pi(B,{get data(){return sM}})};YA(l,B=>{c(r),_(i()),QA(()=>c(r).id===i())?B(C):B(I,!1)});var d=bA(l);ve(()=>{var B;s=Xt(g,1,"jse-query-language svelte-jrd4q2",null,s,{selected:c(r).id===i()}),fn(g,"title",(c(r),QA(()=>"Select ".concat(c(r).name," as query language")))),xt(d," ".concat((c(r),(B=QA(()=>c(r).name))!==null&&B!==void 0?B:"")))}),ue("click",g,()=>{return B=c(r).id,i(B),void n()(B);var B}),lA(a,g)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-header.svelte-1k211ye { display: flex; background: var(--jse-theme-color, #3883fa); color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); } .jse-header.svelte-1k211ye .jse-title:where(.svelte-1k211ye) { flex: 1; padding: 5px; vertical-align: middle; } .jse-header.svelte-1k211ye button:where(.svelte-1k211ye) { border: none; background: transparent; min-width: 32px; color: inherit; cursor: pointer; } .jse-header.svelte-1k211ye button:where(.svelte-1k211ye):hover { background: rgba(255, 255, 255, 0.1); }`);var Z8A=FA(''),X8A=FA('
    ');function zD(t,e){kt(e,!1);var A=N(e,"title",9,"Modal"),i=N(e,"fullScreenButton",9,!1),n=N(e,"fullscreen",13,!1),o=N(e,"onClose",9,void 0);$t(!0);var a=X8A(),r=cA(a),s=cA(r),g=bA(r,2);Aa(g,e,"actions",{},null);var l=bA(g,2),C=d=>{var B=Z8A(),Q=cA(B),E=et(()=>n()?iz:XO);Pi(Q,{get data(){return c(E)}}),ue("click",B,()=>n(!n())),lA(d,B)};YA(l,d=>{i()&&d(C)});var I=bA(l,2);Pi(cA(I),{get data(){return q4}}),ve(()=>xt(s,A())),ue("click",I,()=>{var d;return(d=o())===null||d===void 0?void 0:d()}),lA(t,a),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-config.svelte-5gkegr { border: none; background: transparent; min-width: 32px; color: inherit; cursor: pointer; } .jse-config.svelte-5gkegr:hover { background: rgba(255, 255, 255, 0.1); } .jse-config.hide.svelte-5gkegr { display: none; }`);var $8A=FA(''),$x=qa("jsoneditor:AutoScrollHandler");function aZ(t){var e,A;function i(r){return r<20?200:r<50?400:1200}function n(){if(t){var r=.05*(e||0);t.scrollTop+=r}}function o(r){A&&r===e||(a(),$x("startAutoScroll",r),e=r,A=setInterval(n,50))}function a(){A&&($x("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return $x("createAutoScrollHandler",t),{onDrag:function(r){if(t){var s=r.clientY,{top:g,bottom:l}=t.getBoundingClientRect();sl?o(i(s-l)):a()}},onDragEnd:function(){a()}}}var A5A=(t,e,A,i)=>(t/=i/2)<1?A/2*t*t+e:-A/2*(--t*(t-2)-1)+e,a$=()=>{var t,e,A,i,n,o,a,r,s,g,l,C,I;function d(E){return E.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+A}function B(E){t.scrollTo?t.scrollTo(t.scrollLeft,E):t.scrollTop=E}function Q(E){g||(g=E),B(o(l=E-g,A,r,s)),I=!0,l1&&arguments[1]!==void 0?arguments[1]:{};switch(s=1e3,n=f.offset||0,C=f.callback,o=f.easing||A5A,a=f.a11y||!1,typeof f.container){case"object":t=f.container;break;case"string":t=document.querySelector(f.container);break;default:t=window.document.documentElement}switch(A=t.scrollTop,typeof E){case"number":e=void 0,a=!1,i=A+E;break;case"object":i=d(e=E);break;case"string":e=document.querySelector(E),i=d(e)}switch(r=i-A+n,typeof f.duration){case"number":s=f.duration;break;case"function":s=f.duration(r)}I?g=0:requestAnimationFrame(Q)}};function OQ(t,e){var A=Date.now(),i=t();return e(Date.now()-A),i}var KQ=qa("validation"),e5A={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function rZ(t,e,A,i){return tN(t,e,A,i,e5A)}function r$(t,e,A,i){if(KQ("validateJSON"),!e)return[];if(A!==i){var n=A.stringify(t);return e(n!==void 0?i.parse(n):void 0)}return e(t)}function t5A(t,e,A,i){if(KQ("validateText"),t.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:ic.info}]};if(t.length!==0)try{var n=OQ(()=>A.parse(t),s=>KQ("validate: parsed json in ".concat(s," ms")));if(!e)return;var o=A===i?n:OQ(()=>i.parse(t),s=>KQ("validate: parsed json with the validationParser in ".concat(s," ms"))),a=OQ(()=>e(o),s=>KQ("validate: validated json in ".concat(s," ms")));return zi(a)?void 0:{validationErrors:a}}catch(s){var r=OQ(()=>(function(g,l){if(g.length>R6A)return!1;try{return l.parse(jg(g)),!0}catch(C){return!1}})(t,A),g=>KQ("validate: checked whether repairable in ".concat(g," ms")));return{parseError:nE(t,s.message||s.toString()),isRepairable:r}}}var ID=qa("jsoneditor:FocusTracker");function sN(t){var e,{onMount:A,onDestroy:i,getWindow:n,hasFocus:o,onFocus:a,onBlur:r}=t,s=!1;function g(){var C=o();C&&(clearTimeout(e),s||(ID("focus"),a(),s=C))}function l(){s&&(clearTimeout(e),e=setTimeout(()=>{o()||(ID("blur"),s=!1,r())}))}A(()=>{ID("mount FocusTracker");var C=n();C&&(C.addEventListener("focusin",g,!0),C.addEventListener("focusout",l,!0))}),i(()=>{ID("destroy FocusTracker");var C=n();C&&(C.removeEventListener("focusin",g,!0),C.removeEventListener("focusout",l,!0))})}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-message.svelte-cbvd26 { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); padding: var(--jse-padding, 10px); display: flex; gap: var(--jse-padding, 10px); flex-wrap: wrap; align-items: stretch; } .jse-message.jse-success.svelte-cbvd26 { background: var(--message-success-background, #9ac45d); color: var(--jse-message-success-color, #fff); } .jse-message.svelte-cbvd26 .jse-text:where(.svelte-cbvd26) { display: flex; flex: 1; min-width: 60%; align-items: center; } .jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26) { cursor: pointer; } .jse-message.svelte-cbvd26 .jse-text.jse-clickable:where(.svelte-cbvd26):hover { background-color: rgba(255, 255, 255, 0.1); } .jse-message.jse-error.svelte-cbvd26 { background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); color: var(--jse-message-error-color, #fff); } .jse-message.jse-warning.svelte-cbvd26 { background: var(--jse-message-warning-background, #ffde5c); color: var(--jse-message-warning-color, #4d4d4d); } .jse-message.jse-info.svelte-cbvd26 { background: var(--jse-message-info-background, #4f91ff); color: var(--jse-message-info-color, #fff); } .jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) { display: flex; gap: var(--jse-padding, 10px); } .jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); color: inherit; padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); } .jse-message.svelte-cbvd26 .jse-actions:where(.svelte-cbvd26) button.jse-action:where(.svelte-cbvd26):hover { background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); }`);var i5A=FA(''),n5A=FA('
    ');function Mg(t,e){kt(e,!1);var A=N(e,"type",9,"success"),i=N(e,"icon",9,void 0),n=N(e,"message",9,void 0),o=N(e,"actions",25,()=>[]),a=N(e,"onClick",9,void 0),r=N(e,"onClose",9,void 0);r()&&cl(r()),$t(!0);var s,g=n5A(),l=cA(g),C=cA(l),I=cA(C),d=Q=>{Pi(Q,{get data(){return i()}})};YA(I,Q=>{i()&&Q(d)});var B=bA(I);ea(bA(l,2),5,o,ha,(Q,E)=>{var f=i5A(),b=cA(f),R=v=>{Pi(v,{get data(){return c(E),QA(()=>c(E).icon)}})};YA(b,v=>{c(E),QA(()=>c(E).icon)&&v(R)});var M=bA(b);ve(()=>{var v;fn(f,"title",(c(E),QA(()=>c(E).title))),f.disabled=(c(E),QA(()=>c(E).disabled)),xt(M," ".concat((c(E),(v=QA(()=>c(E).text))!==null&&v!==void 0?v:"")))}),ue("click",f,()=>{c(E).onClick&&c(E).onClick()}),ue("mousedown",f,()=>{c(E).onMouseDown&&c(E).onMouseDown()}),lA(Q,f)}),ve(()=>{var Q,E;Xt(g,1,"jse-message jse-".concat((Q=A())!==null&&Q!==void 0?Q:""),"svelte-cbvd26"),s=Xt(l,1,"jse-text svelte-cbvd26",null,s,{"jse-clickable":!!a()}),xt(B," ".concat((E=n())!==null&&E!==void 0?E:""))}),ue("click",l,function(){a()&&a()()}),lA(t,g),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-validation-errors-overview.svelte-1342rh4 { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); overflow: auto; max-height: 25%; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) { border-collapse: collapse; width: 100%; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) { cursor: pointer; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-error:where(.svelte-1342rh4) { background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); color: var(--jse-message-error-color, #fff); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4) { background: var(--jse-message-warning-background, #ffde5c); color: var(--jse-message-warning-color, #4d4d4d); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-warning:where(.svelte-1342rh4):hover { filter: brightness(105%); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr.jse-validation-info:where(.svelte-1342rh4) { background: var(--jse-message-info-background, #4f91ff); color: var(--jse-message-info-color, #fff); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4):hover { filter: brightness(110%); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) { padding: 4px var(--jse-padding, 10px); vertical-align: middle; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-icon:where(.svelte-1342rh4) { width: 36px; box-sizing: border-box; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) { width: 36px; box-sizing: border-box; padding: 0; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; width: 36px; height: 26px; cursor: pointer; } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td.jse-validation-error-action:where(.svelte-1342rh4) button.jse-validation-errors-collapse:where(.svelte-1342rh4):hover { background-color: rgba(255, 255, 255, 0.2); } .jse-validation-errors-overview.svelte-1342rh4 table:where(.svelte-1342rh4) tr:where(.svelte-1342rh4) td:where(.svelte-1342rh4) div.jse-validation-errors-expand:where(.svelte-1342rh4) { display: inline-block; position: relative; top: 3px; }`);var o5A=FA(''),a5A=FA(' '),r5A=FA(' '),s5A=FA('
    '),g5A=FA('
    '),l5A=FA('
    ');function gN(t,e){kt(e,!1);var A=CA(void 0,!0),i=N(e,"validationErrors",9),n=N(e,"selectError",9),o=CA(!0,!0);function a(){x(o,!1)}function r(){x(o,!0)}RA(()=>_(i()),()=>{x(A,i().length)}),mn(),$t(!0);var s=yi(),g=$e(s),l=C=>{var I=l5A(),d=cA(I),B=E=>{var f=s5A(),b=cA(f),R=cA(b);ea(R,1,()=>(_(RD),_(i()),_(rD),QA(()=>RD(i(),rD))),ha,(F,G,U)=>{var Y=a5A(),j=cA(Y);Pi(cA(j),{get data(){return v2}});var AA=bA(j),z=cA(AA),yA=bA(AA),P=cA(yA),nA=cA(bA(yA)),eA=dA=>{var iA=o5A();Pi(cA(iA),{get data(){return tz}}),ue("click",iA,aC(a)),lA(dA,iA)};YA(nA,dA=>{_(i()),QA(()=>U===0&&i().length>1)&&dA(eA)}),ve(dA=>{var iA;Xt(Y,1,"jse-validation-".concat((c(G),(iA=QA(()=>c(G).severity))!==null&&iA!==void 0?iA:"")),"svelte-1342rh4"),xt(z,dA),xt(P,(c(G),QA(()=>c(G).message)))},[()=>(_($s),c(G),QA(()=>$s(c(G).path)))]),ue("click",Y,()=>{setTimeout(()=>n()(c(G)))}),lA(F,Y)});var M=bA(R),v=F=>{var G=r5A(),U=bA(cA(G),2),Y=cA(U);ve(()=>xt(Y,"(and ".concat(c(A)-rD," more errors)"))),lA(F,G)};YA(M,F=>{c(A)>rD&&F(v)}),lA(E,f)},Q=E=>{var f=g5A(),b=cA(f),R=cA(b),M=cA(R);Pi(cA(M),{get data(){return v2}});var v=cA(bA(M));Pi(cA(bA(v)),{get data(){return IM}}),ve(F=>{var G;Xt(R,1,"jse-validation-".concat(F??""),"svelte-1342rh4"),xt(v,"".concat((G=c(A))!==null&&G!==void 0?G:""," validation errors "))},[()=>(_(i()),QA(()=>{return F=i(),[ic.error,ic.warning,ic.info].find(G=>F.some(U=>U.severity===G));var F}))]),ue("click",R,r),lA(E,f)};YA(d,E=>{c(o)||c(A)===1?E(B):E(Q,!1)}),lA(C,I)};YA(g,C=>{_(zi),_(i()),QA(()=>!zi(i()))&&C(l)}),lA(t,s),St()}function PD(t,e){if(t)return t.addEventListener("keydown",A),{destroy(){t.removeEventListener("keydown",A)}};function A(i){i.key==="Escape"&&(i.preventDefault(),i.stopPropagation(),e())}}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ dialog.jse-modal.svelte-2aoco4 { border-radius: 3px; font-size: var(--jse-padding, 10px); border: none; padding: 0; display: flex; min-width: 0; margin: auto; overflow: visible; transition: width 0.1s ease-in-out, height 0.1s ease-in-out; } dialog.jse-modal.jse-sort-modal.svelte-2aoco4 { width: 400px; } dialog.jse-modal.jse-repair-modal.svelte-2aoco4 { width: 600px; height: 500px; } dialog.jse-modal.jse-jsoneditor-modal.svelte-2aoco4 { width: 800px; height: 600px; } dialog.jse-modal.jse-transform-modal.svelte-2aoco4 { width: 1200px; height: 800px; } dialog.jse-modal.jse-fullscreen.svelte-2aoco4 { width: 100%; height: 100%; } dialog.jse-modal.svelte-2aoco4::backdrop { background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); } dialog.jse-modal[open].svelte-2aoco4 { animation: svelte-2aoco4-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); } dialog.jse-modal[open].svelte-2aoco4::backdrop { animation: svelte-2aoco4-fade 0.2s ease-out; } dialog.jse-modal.svelte-2aoco4 .jse-modal-inner:where(.svelte-2aoco4) { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; padding: 0; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); line-height: normal; background: var(--jse-modal-background, #f5f5f5); color: var(--jse-text-color, #4d4d4d); } @keyframes svelte-2aoco4-zoom { from { transform: scale(0.95); } to { transform: scale(1); } } @keyframes svelte-2aoco4-fade { from { opacity: 0; } to { opacity: 1; } } dialog.jse-modal.svelte-2aoco4 .svelte-select { --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); --border-radius: var(--jse-svelte-select-border-radius, 3px); --background: var(--jse-svelte-select-background, #fff); --padding: var(--jse-svelte-select-padding, 0 10px); --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); --height: 36px; --multi-item-height: 28px; --multi-item-margin: 2px; --multi-item-padding: 2px 8px; --multi-item-border-radius: 6px; --indicator-top: 8px; }`);var c5A=FA('
    ');function cu(t,e){kt(e,!1);var A=N(e,"className",8,void 0),i=N(e,"fullscreen",8,!1),n=N(e,"onClose",8),o=CA();function a(){n()()}Jr(()=>c(o).showModal()),cl(()=>c(o).close()),$t();var r,s=c5A(),g=cA(s);Aa(cA(g),e,"default",{},null),Mo(s,l=>x(o,l),()=>c(o)),Er(()=>ue("close",s,a)),Er(()=>{return ue("pointerdown",s,(l=a,function(){for(var C=arguments.length,I=new Array(C),d=0;due("cancel",s,z2(function(l){q3.call(this,e,l)}))),as(s,(l,C)=>PD?.(l,C),()=>a),ve(l=>r=Xt(s,1,l,"svelte-2aoco4",r,{"jse-fullscreen":i()}),[()=>sI((_(gc),_(A()),QA(()=>gc("jse-modal",A()))))]),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-modal-contents.svelte-10a6ob6 { flex: 1; display: flex; flex-direction: column; padding: 20px; overflow: auto; min-width: 0; min-height: 0; } .jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) { display: flex; flex-direction: row; justify-content: flex-end; padding-top: var(--jse-padding, 10px); } .jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-modal-contents.svelte-10a6ob6 .jse-actions:where(.svelte-10a6ob6) button.jse-primary:where(.svelte-10a6ob6):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); } .jse-shortcuts.svelte-10a6ob6 { display: flex; flex-wrap: wrap; justify-content: space-around; margin: calc(2 * var(--jse-padding, 10px)) 0; } .jse-shortcuts.svelte-10a6ob6 .jse-shortcut:where(.svelte-10a6ob6) .jse-key:where(.svelte-10a6ob6) { font-size: 200%; color: var(--jse-theme-color, #3883fa); }`);var C5A=FA('
    Clipboard permission is disabled by your browser. You can use:
    for copy
    for cut
    for paste
    ',1);function s$(t,e){kt(e,!1);var A=N(e,"onClose",9),i=qR()?"\u2318":"Ctrl";$t(!0),cu(t,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var a=C5A(),r=$e(a);zD(r,{title:"Copying and pasting",get onClose(){return A()}});var s=bA(r,2),g=bA(cA(s),2),l=cA(g),C=cA(l),I=cA(C),d=bA(l,2),B=cA(d),Q=cA(B),E=cA(bA(d,2)),f=cA(E),b=cA(bA(g,2));ve(()=>{xt(I,"".concat(i,"+C")),xt(Q,"".concat(i,"+X")),xt(f,"".concat(i,"+V"))}),ue("click",b,function(){for(var R,M=arguments.length,v=new Array(M),F=0;F'),d5A=FA('
    '),B5A=FA(''),Q5A=FA('
    ');function aw(t,e){kt(e,!1);var A=N(e,"items",25,()=>[]);$t(!0);var i=Q5A(),n=cA(i);Aa(n,e,"left",{},null);var o=bA(n,2);ea(o,1,A,ha,(a,r)=>{var s=yi(),g=$e(s),l=I=>{lA(I,I5A())},C=I=>{var d=yi(),B=$e(d),Q=f=>{lA(f,d5A())},E=f=>{var b=yi(),R=$e(b),M=F=>{var G=B5A(),U=cA(G),Y=z=>{Pi(z,{get data(){return c(r),QA(()=>c(r).icon)}})};YA(U,z=>{c(r),QA(()=>c(r).icon)&&z(Y)});var j=bA(U,2),AA=z=>{var yA=tr();ve(()=>xt(yA,(c(r),QA(()=>c(r).text)))),lA(z,yA)};YA(j,z=>{c(r),QA(()=>c(r).text)&&z(AA)}),ve(()=>{var z;Xt(G,1,"jse-button ".concat((c(r),(z=QA(()=>c(r).className))!==null&&z!==void 0?z:"")),"svelte-3erbu0"),fn(G,"title",(c(r),QA(()=>c(r).title))),G.disabled=(c(r),QA(()=>c(r).disabled||!1))}),ue("click",G,function(){for(var z,yA=arguments.length,P=new Array(yA),nA=0;nA{var G=tr();ve(U=>xt(G,U),[()=>(c(r),QA(()=>(function(U){return console.error("Unknown type of menu item",U),"???"})(c(r))))]),lA(F,G)};YA(R,F=>{_(rC),c(r),QA(()=>rC(c(r)))?F(M):F(v,!1)},!0),lA(f,b)};YA(B,f=>{_(hR),c(r),QA(()=>hR(c(r)))?f(Q):f(E,!1)},!0),lA(I,d)};YA(g,I=>{_(V2),c(r),QA(()=>V2(c(r)))?I(l):I(C,!1)}),lA(a,s)}),Aa(bA(o,2),e,"right",{},null),lA(t,i),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-json-repair-component.svelte-16jv58j { flex: 1; display: flex; flex-direction: column; background: var(--jse-background-color, #fff); color: var(--jse-text-color, #4d4d4d); } .jse-json-repair-component.svelte-16jv58j .jse-info:where(.svelte-16jv58j) { padding: calc(0.5 * var(--jse-padding, 10px)); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); vertical-align: center; } .jse-json-repair-component.svelte-16jv58j .jse-json-text:where(.svelte-16jv58j) { flex: 1; border: none; padding: 2px; font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); background: var(--jse-input-background, var(--jse-background-color, #fff)); color: var(--jse-text-color, #4d4d4d); resize: none; outline: none; }`);var E5A=FA('
    Repair invalid JSON, then click apply
    '),h5A=FA('
    ');function u5A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=CA(void 0,!0),a=CA(void 0,!0),r=CA(void 0,!0),s=N(e,"text",13,""),g=N(e,"readOnly",9,!1),l=N(e,"onParse",9),C=N(e,"onRepair",9),I=N(e,"onChange",9,void 0),d=N(e,"onApply",9),B=N(e,"onCancel",9),Q=qa("jsoneditor:JSONRepair"),E=CA(void 0,!0);function f(){if(c(E)&&c(A)){var AA=c(A).position!==void 0?c(A).position:0;c(E).setSelectionRange(AA,AA),c(E).focus()}}function b(){d()(s())}function R(){try{s(C()(s())),I()&&I()(s())}catch(AA){}}var M=CA(void 0,!0);RA(()=>_(s()),()=>{x(A,(function(AA){try{return void l()(AA)}catch(z){return nE(AA,z.message)}})(s()))}),RA(()=>_(s()),()=>{x(i,(function(AA){try{return C()(AA),!0}catch(z){return!1}})(s()))}),RA(()=>c(A),()=>{Q("error",c(A))}),RA(()=>_(B()),()=>{x(M,[{type:"space"},{type:"button",icon:q4,title:"Cancel repair",className:"jse-cancel",onClick:B()}])}),RA(()=>QM,()=>{x(n,{icon:QM,text:"Show me",title:"Scroll to the error location",onClick:f})}),RA(()=>P0,()=>{x(o,{icon:P0,text:"Auto repair",title:"Automatically repair JSON",onClick:R})}),RA(()=>(c(i),c(n),c(o)),()=>{x(a,c(i)?[c(n),c(o)]:[c(n)])}),RA(()=>_(g()),()=>{x(r,[{icon:g8,text:"Apply",title:"Apply fixed JSON",disabled:g(),onClick:b}])}),mn(),$t(!0);var v=h5A(),F=cA(v);aw(F,{get items(){return c(M)},$$slots:{left:(AA,z)=>{lA(AA,E5A())}}});var G=bA(F,2),U=AA=>{var z=et(()=>(c(A),QA(()=>"Cannot parse JSON: ".concat(c(A).message))));Mg(AA,{type:"error",get icon(){return v2},get message(){return c(z)},get actions(){return c(a)}})},Y=AA=>{Mg(AA,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return c(r)}})};YA(G,AA=>{c(A)?AA(U):AA(Y,!1)});var j=bA(G,2);Mo(j,AA=>x(E,AA),()=>c(E)),ve(()=>{j.readOnly=g(),Z1(j,s())}),ue("input",j,function(AA){Q("handleChange");var z=AA.target.value;s()!==z&&(s(z),I()&&I()(s()))}),lA(t,v),St()}function g$(t,e){kt(e,!1);var A=N(e,"text",13),i=N(e,"onParse",9),n=N(e,"onRepair",9),o=N(e,"onApply",9),a=N(e,"onClose",9);function r(g){o()(g),a()()}function s(){a()()}$t(!0),cu(t,{get onClose(){return a()},className:"jse-repair-modal",children:(g,l)=>{u5A(g,{get onParse(){return i()},get onRepair(){return n()},onApply:r,onCancel:s,get text(){return A()},set text(C){A(C)},$$legacy:!0})},$$slots:{default:!0}}),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ div.jse-collapsed-items.svelte-1v6dhm4 { margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); padding: calc(0.5 * var(--jse-padding, 10px)); border: 8px solid transparent; border-width: 8px 0; background-color: var(--jse-contents-background-color, transparent); background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; background-clip: padding-box, border-box, border-box, border-box, border-box; background-origin: padding-box, border-box, border-box, border-box, border-box; display: flex; } div.jse-collapsed-items.jse-selected.svelte-1v6dhm4 { background-color: var(--jse-selection-background-color, #d3d3d3); --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); } div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4), div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { margin: 0 calc(0.5 * var(--jse-padding, 10px)); } div.jse-collapsed-items.svelte-1v6dhm4 div.jse-text:where(.svelte-1v6dhm4) { display: inline; } div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4) { font-family: inherit; font-size: inherit; color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); background: none; border: none; padding: 0; text-decoration: underline; cursor: pointer; } div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):hover, div.jse-collapsed-items.svelte-1v6dhm4 button.jse-expand-items:where(.svelte-1v6dhm4):focus { color: var(--jse-collapsed-items-link-color-highlight, #ee5341); }`);var f5A=FA(''),m5A=FA('
    ');function p5A(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=CA(void 0,!0),a=CA(void 0,!0),r=N(e,"visibleSections",9),s=N(e,"sectionIndex",9),g=N(e,"total",9),l=N(e,"path",9),C=N(e,"selection",9),I=N(e,"onExpandSection",9),d=N(e,"context",9);RA(()=>(_(r()),_(s())),()=>{x(A,r()[s()])}),RA(()=>c(A),()=>{x(i,c(A).end)}),RA(()=>(_(r()),_(s()),_(g())),()=>{x(n,r()[s()+1]?r()[s()+1].start:g())}),RA(()=>(_(d()),_(C()),_(l()),c(i)),()=>{x(o,su(d().getJson(),C(),l().concat(String(c(i)))))}),RA(()=>(c(i),c(n)),()=>{x(a,(function(M,v){var F={start:M,end:Math.min(ER(M),v)},G=Math.max(FD((M+v)/2),M),U={start:G,end:Math.min(ER(G),v)},Y=FD(v),j=Y===v?Y-nu:Y,AA={start:Math.max(j,M),end:v},z=[F],yA=U.start>=F.end&&U.end<=AA.start;return yA&&z.push(U),AA.start>=(yA?U.end:F.end)&&z.push(AA),z})(c(i),c(n)))}),mn(),$t(!0);var B,Q,E=m5A(),f=cA(E),b=cA(f),R=cA(b);ea(bA(b,2),1,()=>c(a),ha,(M,v)=>{var F=f5A(),G=cA(F);ve(()=>{var U,Y;return xt(G,"show ".concat((c(v),(U=QA(()=>c(v).start))!==null&&U!==void 0?U:""),"-").concat((c(v),(Y=QA(()=>c(v).end))!==null&&Y!==void 0?Y:"")))}),ue("click",F,()=>I()(l(),c(v))),lA(M,F)}),ve(()=>{var M,v;B=Xt(E,1,"jse-collapsed-items svelte-1v6dhm4",null,B,{"jse-selected":c(o)}),Q=gl(E,"",Q,{"--level":(_(l()),QA(()=>l().length+2))}),xt(R,"Items ".concat((M=c(i))!==null&&M!==void 0?M:"","-").concat((v=c(n))!==null&&v!==void 0?v:""))}),ue("mousemove",E,function(M){M.stopPropagation()}),lA(t,E),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-context-menu-pointer.svelte-10ijtzr { position: absolute; top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); padding: 0; margin: 0; cursor: pointer; background: transparent; border-radius: 2px; background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); border: none; box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); } .jse-context-menu-pointer.jse-root.svelte-10ijtzr { top: 0; right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); } .jse-context-menu-pointer.jse-insert.svelte-10ijtzr { right: -1px; } .jse-context-menu-pointer.svelte-10ijtzr:hover { background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); } .jse-context-menu-pointer.jse-selected.svelte-10ijtzr { background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); } .jse-context-menu-pointer.jse-selected.svelte-10ijtzr:hover { background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); }`);var D5A=FA('');function P2(t,e){kt(e,!1);var A=N(e,"root",9,!1),i=N(e,"insert",9,!1),n=N(e,"selected",9),o=N(e,"onContextMenu",9);$t(!0);var a,r=D5A();Pi(cA(r),{get data(){return qc}}),ve(()=>{a=Xt(r,1,"jse-context-menu-pointer svelte-10ijtzr",null,a,{"jse-root":A(),"jse-insert":i(),"jse-selected":n()}),fn(r,"title",WR)}),ue("click",r,function(s){for(var g=s.target;g&&g.nodeName!=="BUTTON";)g=g.parentNode;g&&o()({anchor:g,left:0,top:0,width:cC,height:lC,offsetTop:2,offsetLeft:0,showTip:!0})}),lA(t,r),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-key.svelte-1n4cez4 { display: inline-block; min-width: 2em; padding: 0 5px; box-sizing: border-box; outline: none; border-radius: 1px; vertical-align: top; color: var(--jse-key-color, #1a1a1a); word-break: normal; overflow-wrap: normal; white-space: pre-wrap; } .jse-key.jse-empty.svelte-1n4cez4 { min-width: 3em; outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); -moz-outline-radius: 2px; } .jse-key.jse-empty.svelte-1n4cez4::after { pointer-events: none; color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); content: "key"; }`);var w5A=FA('
    '),y5A=FA(" ",1),v5A=FA('
    ');function l$(t,e){kt(e,!0);var A=Zs(()=>an(e.selection)&&za(e.selection)),i=Zs(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:c(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=yi();ea($e(n),17,()=>c(i),ha,(o,a)=>{var r=yi(),s=$e(r),g=C=>{var I=Zs(()=>c(a).action),d=v5A();as(d,(B,Q)=>{var E;return(E=c(I))===null||E===void 0?void 0:E(B,Q)},()=>c(a).props),lA(C,d)},l=C=>{var I=Zs(()=>c(a).component),d=yi();CX($e(d),()=>c(I),(B,Q)=>{Q(B,oI(()=>c(a).props))}),lA(C,d)};YA(s,C=>{G6A(c(a))?C(g):C(l,!1)}),lA(o,r)}),lA(t,n),St()}var b5A={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function AR(t){var{json:e,selection:A,deltaY:i,items:n}=t;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?(function(l){for(var{json:C,items:I,selection:d,deltaY:B}=l,Q=CC(C,d),E=I.findIndex(F=>di(F.path,Q)),f=()=>{var F;return(F=I[b-1])===null||F===void 0?void 0:F.height},b=E,R=0;f()!==void 0&&Math.abs(B)>R+f()/2;)R+=f(),b-=1;var M=I[b].path,v=b-E;return b!==E&&I[b]!==void 0?{beforePath:M,offset:v}:void 0})({json:e,selection:A,deltaY:i,items:n}):(function(l){for(var C,{json:I,items:d,selection:B,deltaY:Q}=l,E=rI(I,B),f=d.findIndex(j=>di(j.path,E)),b=0,R=f,M=()=>{var j;return(j=d[R+1])===null||j===void 0?void 0:j.height};M()!==void 0&&Math.abs(Q)>b+M()/2;)b+=M(),R+=1;var v=Li(E),F=Pe(I,v),G=Array.isArray(F)?R:R+1,U=(C=d[G])===null||C===void 0?void 0:C.path,Y=R-f;return U?{beforePath:U,offset:Y}:{append:!0,offset:Y}})({json:e,selection:A,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var a=(function(l,C,I){if(!C)return[];var d="beforePath"in I?I.beforePath:void 0,B="append"in I?I.append:void 0,Q=Li(st(C)),E=Pe(l,Q);if(!(B||d&&I0(d,Q)&&d.length>Q.length))return[];var f=CC(l,C),b=rI(l,C),R=fi(f),M=fi(b),v=d?d[Q.length]:void 0;if(!Oo(E)){if(Lo(E)){var F=hr(R),G=hr(M),U=v!==void 0?hr(v):E.length;return iM(G-F+1,U({op:"move",from:pt(Q.concat(String(F+yA))),path:pt(Q.concat(String(U+yA)))}):()=>({op:"move",from:pt(Q.concat(String(F))),path:pt(Q.concat(String(U)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var Y=Object.keys(E),j=Y.indexOf(R),AA=Y.indexOf(M),z=B?Y.length:v!==void 0?Y.indexOf(v):-1;return j!==-1&&AA!==-1&&z!==-1?z>j?[...Y.slice(j,AA+1),...Y.slice(z,Y.length)].map(yA=>lI(Q,yA)):[...Y.slice(z,j),...Y.slice(AA+1,Y.length)].map(yA=>lI(Q,yA)):[]})(e,A,o),r=Li(CC(e,A)),s=Pe(e,r);if(Array.isArray(s)){var g=(function(l){var C,I,{items:d,json:B,selection:Q,offset:E}=l,f=CC(B,Q),b=rI(B,Q),R=d.findIndex(G=>di(G.path,f)),M=d.findIndex(G=>di(G.path,b)),v=(C=d[R+E])===null||C===void 0?void 0:C.path,F=(I=d[M+E])===null||I===void 0?void 0:I.path;return ns(v,F)})({items:n,json:e,selection:A,offset:o.offset});return{operations:a,updatedSelection:g,offset:o.offset}}return{operations:a,updatedSelection:void 0,offset:o.offset}}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ button.jse-validation-error.svelte-q6a061 { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; padding: 0; margin: 0; vertical-align: top; display: inline-flex; color: var(--jse-error-color, #ee5341); } button.jse-validation-info.svelte-q6a061 { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; padding: 0; margin: 0; vertical-align: top; display: inline-flex; color: var(--jse-info-color, #4f91ff); } button.jse-validation-warning.svelte-q6a061 { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; padding: 0; margin: 0; vertical-align: top; display: inline-flex; color: var(--jse-warning-color, #fdc539); }`);var M5A=FA('');function ZQ(t,e){kt(e,!1);var A=CA(),i=cI("absolute-popup"),n=N(e,"validationError",8),o=N(e,"onExpand",8);RA(()=>_(n()),()=>{x(A,_6A(n())&&n().isChildError?"Contains invalid data":n().message)}),mn(),$t();var a=M5A();Pi(cA(a),{get data(){return v2}}),Er(()=>ue("click",a,function(){for(var r,s=arguments.length,g=new Array(s),l=0;lsE?.(r,s),()=>ye({text:c(A)},i)),ve(()=>{var r;return Xt(a,1,"jse-validation-".concat((_(n()),(r=QA(()=>n().severity))!==null&&r!==void 0?r:"")),"svelte-q6a061")}),lA(t,a),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-expand.svelte-1qi6rc1 { width: var(--jse-indent-size, calc(1em + 4px)); padding: 0; margin: 0; border: none; cursor: pointer; background: transparent; color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); font-size: var(--jse-font-size-mono, 14px); height: var(--jse-line-height, calc(1em + 4px)); } .jse-expand.svelte-1qi6rc1:hover { opacity: 0.8; } .jse-meta.svelte-1qi6rc1, .jse-separator.svelte-1qi6rc1, .jse-index.svelte-1qi6rc1, .jse-bracket.svelte-1qi6rc1 { vertical-align: top; color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); } .jse-index.svelte-1qi6rc1 { padding: 0 calc(0.5 * var(--jse-padding, 10px)); } .jse-bracket.svelte-1qi6rc1 { padding: 0 2px; } .jse-bracket.jse-expanded.svelte-1qi6rc1 { padding-right: var(--jse-padding, 10px); } .jse-identifier.svelte-1qi6rc1 { vertical-align: top; position: relative; } .jse-json-node.svelte-1qi6rc1 { position: relative; color: var(--jse-text-color, #4d4d4d); } .jse-json-node.jse-root.svelte-1qi6rc1 { min-height: 100%; padding-bottom: 2px; box-sizing: border-box; } .jse-json-node.jse-root.svelte-1qi6rc1 > .jse-contents-outer:where(.svelte-1qi6rc1) > .jse-contents:where(.svelte-1qi6rc1) { padding-left: 0; } .jse-json-node.svelte-1qi6rc1 .jse-props:where(.svelte-1qi6rc1), .jse-json-node.svelte-1qi6rc1 .jse-items:where(.svelte-1qi6rc1) { position: relative; } .jse-json-node.svelte-1qi6rc1 .jse-header-outer:where(.svelte-1qi6rc1), .jse-json-node.svelte-1qi6rc1 .jse-footer-outer:where(.svelte-1qi6rc1) { display: flex; margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); } .jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) { position: relative; } .jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1) .jse-meta:where(.svelte-1qi6rc1) > .jse-meta-inner:where(.svelte-1qi6rc1) { display: flex; justify-content: center; } .jse-json-node.svelte-1qi6rc1 .jse-contents-outer:where(.svelte-1qi6rc1) { display: flex; margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); } .jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), .jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { display: flex; flex-direction: row; align-items: flex-start; } .jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) { padding-left: var(--jse-indent-size, calc(1em + 4px)); cursor: var(--jse-contents-cursor, pointer); } .jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1) .jse-value-outer:where(.svelte-1qi6rc1) { display: inline-flex; } .jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { display: inline-flex; padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); } .jse-json-node.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), .jse-json-node.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), .jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { background: var(--jse-contents-background-color, transparent); } .jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area:where(.svelte-1qi6rc1) { padding: 0 calc(0.5 * var(--jse-padding, 10px)); flex: 1; } .jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-inside:where(.svelte-1qi6rc1) { display: inline-flex; align-items: center; } .jse-json-node.svelte-1qi6rc1 .jse-insert-selection-area.jse-after:where(.svelte-1qi6rc1) { display: flex; align-items: flex-end; } .jse-json-node.svelte-1qi6rc1 .jse-context-menu-pointer-anchor:where(.svelte-1qi6rc1) { position: relative; } .jse-json-node.svelte-1qi6rc1 .jse-insert-area:where(.svelte-1qi6rc1) { display: flex; position: relative; z-index: 1; margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); max-width: 250px; min-width: 100px; height: 0; margin-right: calc(0.5 * var(--jse-padding, 10px)); outline: 1px solid; } .jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-hovered:where(.svelte-1qi6rc1) { outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); } .jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1) { position: relative; } .jse-json-node.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, .jse-json-node.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, .jse-json-node.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, .jse-json-node.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); cursor: var(--jse-contents-cursor, pointer); } .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer { background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); cursor: var(--jse-contents-cursor, pointer); } .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, .jse-json-node.jse-hovered.svelte-1qi6rc1:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { background: none; } .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-header:where(.svelte-1qi6rc1), .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-contents:where(.svelte-1qi6rc1), .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1) { background: var(--jse-selection-background-color, #d3d3d3); cursor: var(--jse-contents-selected-cursor, grab); } .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-key-outer:where(.svelte-1qi6rc1):hover, .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-value-outer:where(.svelte-1qi6rc1):hover, .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-meta:where(.svelte-1qi6rc1):hover, .jse-json-node.jse-selected.svelte-1qi6rc1 .jse-footer:where(.svelte-1qi6rc1):hover { background: inherit; cursor: inherit; } .jse-json-node.svelte-1qi6rc1 .jse-key-outer.jse-selected-key:where(.svelte-1qi6rc1) { background: var(--jse-selection-background-color, #d3d3d3); cursor: var(--jse-contents-selected-cursor, grab); } .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer { background: var(--jse-selection-background-color, #d3d3d3); cursor: var(--jse-contents-selected-cursor, grab); } .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-value-outer .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-meta .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-header .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-items .jse-contents .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-header .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-props .jse-contents .jse-key-outer:hover, .jse-json-node.jse-selected-value.svelte-1qi6rc1 .jse-footer .jse-key-outer:hover { background: inherit; cursor: inherit; } .jse-json-node.jse-readonly.svelte-1qi6rc1 { --jse-contents-selected-cursor: pointer; } .jse-json-node.svelte-1qi6rc1 .jse-insert-area.jse-selected:where(.svelte-1qi6rc1) { outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); }`);var vo=XD(()=>b5A),k5A=FA('
    :
    '),S5A=FA('
    [
     ',1),x5A=FA('
    [
    ]
    ',1),R5A=FA('
    '),N5A=FA('
    '),F5A=FA('
    '),L5A=FA('
    '),_5A=FA('
    '),G5A=FA(" ",1),K5A=FA('
    '),U5A=FA('
    ',1),J5A=FA('
    ',1),Y5A=FA('
    :
    '),H5A=FA('
    {
    '),T5A=FA('
    {
    }
    ',1),O5A=FA('
    '),z5A=FA('
    '),P5A=FA('
    '),j5A=FA('
    '),q5A=FA('
    '),V5A=FA('
    '),W5A=FA('
    ',1),Z5A=FA('
    ',1),X5A=FA('
    :
    '),$5A=FA('
    '),ADA=FA('
    '),eDA=FA('
    '),tDA=FA('
    '),iDA=FA('
    ');function kR(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=N(e,"pointer",9),o=N(e,"value",9),a=N(e,"state",9),r=N(e,"validationErrors",9),s=N(e,"searchResults",9),g=N(e,"selection",9),l=N(e,"context",9),C=N(e,"onDragSelectionStart",9),I=qa("jsoneditor:JSONNode"),d=CA(void 0,!0),B=void 0,Q=CA(void 0,!0),E=CA(void 0,!0),f=CA(void 0,!0),b=CA(void 0,!0),R=CA(void 0,!0),M=CA(void 0,!0),v=CA(void 0,!0);function F(HA){HA.stopPropagation();var uA=VR(HA);l().onExpand(c(E),!c(f),uA)}function G(){l().onExpand(c(E),!0)}function U(HA,uA){var XA=wu(c(E),Object.keys(o()),HA,uA);return l().onPatch(XA),fi(As(XA[0].path))}function Y(HA){l().onDrag(HA)}function j(HA){vo().selecting&&(vo(vo().selecting=!1),HA.stopPropagation()),l().onDragEnd(),document.removeEventListener("mousemove",Y,!0),document.removeEventListener("mouseup",j)}function AA(){var HA;return((HA=l().findElement([]))===null||HA===void 0||(HA=HA.getBoundingClientRect())===null||HA===void 0?void 0:HA.top)||0}function z(HA,uA){var XA=AA()-HA.initialContentTop;return uA.clientY-HA.initialClientY-XA}function yA(HA){if(!l().readOnly&&g()){var uA=Li(st(g()));if(di(c(E),uA)){var XA=(function(_A,pA){var Rt=[];function Et(O){var tA=c(E).concat(O),oA=l().findElement(tA);oA!==void 0&&Rt.push({path:tA,height:oA.clientHeight})}if(Array.isArray(o())){var Qe=l().getJson();if(Qe===void 0)return;var _t=CC(Qe,_A),Ue=rI(Qe,_A),Te=parseInt(fi(_t),10),ht=parseInt(fi(Ue),10),Me=pA.find(O=>Te>=O.start&&ht<=O.end);if(!Me)return;var{start:Ai,end:J}=Me;hX(Ai,Math.min(o().length,J),O=>Et(String(O)))}else Object.keys(o()).forEach(Et);return Rt})(g(),c(R)||qQ);if(I("dragSelectionStart",{selection:g(),items:XA}),XA){var EA=l().getJson();if(EA!==void 0){var ZA=CC(EA,g()),MA=XA.findIndex(_A=>di(_A.path,ZA)),{offset:be}=AR({json:EA,selection:l().getSelection(),deltaY:0,items:XA});x(Q,{initialTarget:HA.target,initialClientY:HA.clientY,initialContentTop:AA(),selectionStartIndex:MA,selectionItemsCount:gI(EA,g()).length,items:XA,offset:be,didMoveItems:!1}),vo(vo().dragging=!0),document.addEventListener("mousemove",P,!0),document.addEventListener("mouseup",nA)}}else I("Cannot drag the current selection (probably spread over multiple sections)")}else C()(HA)}}function P(HA){if(c(Q)){var uA=l().getJson();if(uA===void 0)return;var XA=z(c(Q),HA),{offset:EA}=AR({json:uA,selection:l().getSelection(),deltaY:XA,items:c(Q).items});EA!==c(Q).offset&&(I("drag selection",EA,XA),x(Q,ye(ye({},c(Q)),{},{offset:EA,didMoveItems:!0})))}}function nA(HA){if(c(Q)){var uA=l().getJson();if(uA===void 0)return;var XA=z(c(Q),HA),{operations:EA,updatedSelection:ZA}=AR({json:uA,selection:l().getSelection(),deltaY:XA,items:c(Q).items});if(EA)l().onPatch(EA,(_A,pA)=>({state:pA,selection:ZA??g()}));else if(HA.target===c(Q).initialTarget&&!c(Q).didMoveItems){var MA=Yx(HA.target),be=SX(HA.target);be&&l().onSelect(HW(MA,be))}x(Q,void 0),vo(vo().dragging=!1),document.removeEventListener("mousemove",P,!0),document.removeEventListener("mouseup",nA)}}function eA(HA){HA.shiftKey||(HA.stopPropagation(),HA.preventDefault(),l().onSelect(pC(c(E))))}function dA(HA){HA.shiftKey||(HA.stopPropagation(),HA.preventDefault(),l().onSelect(QC(c(E))))}function iA(HA){l().onSelect(pC(c(E))),uo(),l().onContextMenu(HA)}function aA(HA){l().onSelect(QC(c(E))),uo(),l().onContextMenu(HA)}RA(()=>_(n()),()=>{x(E,As(n()))}),RA(()=>_(n()),()=>{x(A,encodeURIComponent(n()))}),RA(()=>_(a()),()=>{x(f,!!X1(a())&&a().expanded)}),RA(()=>(_(o()),_(a())),()=>{x(b,g0(o(),a(),[]))}),RA(()=>_(a()),()=>{x(R,Pa(a())?a().visibleSections:void 0)}),RA(()=>_(r()),()=>{var HA;x(M,(HA=r())===null||HA===void 0?void 0:HA.validationError)}),RA(()=>(_(l()),_(g()),c(E)),()=>{x(v,su(l().getJson(),g(),c(E)))}),RA(()=>c(E),()=>{x(i,c(E).length===0)}),mn(),$t(!0);var hA,JA,ee=iDA(),UA=cA(ee),mA=HA=>{var uA=J5A(),XA=$e(uA),EA=cA(XA),ZA=cA(EA),MA=cA(ZA),be=xA=>{Pi(xA,{get data(){return qc}})},_A=xA=>{Pi(xA,{get data(){return qB}})};YA(MA,xA=>{c(f)?xA(be):xA(_A,!1)});var pA=bA(ZA,2);Aa(pA,e,"identifier",{},null);var Rt=bA(pA,2),Et=xA=>{lA(xA,k5A())};YA(Rt,xA=>{c(i)||xA(Et)});var Qe=bA(Rt,2),_t=cA(Qe),Ue=cA(_t),Te=xA=>{var LA=S5A();vD(bA($e(LA),2),{children:(dt,At)=>{var Je=tr();ve(()=>{var Ge,ri;return xt(Je,"".concat((_(o()),(Ge=QA(()=>o().length))!==null&&Ge!==void 0?Ge:""),` `).concat((_(o()),(ri=QA(()=>o().length===1?"item":"items"))!==null&&ri!==void 0?ri:"")))}),lA(dt,Je)},$$slots:{default:!0}}),lA(xA,LA)},ht=xA=>{var LA=x5A();vD(bA($e(LA),2),{onclick:G,children:(dt,At)=>{var Je=tr();ve(()=>{var Ge,ri;return xt(Je,"".concat((_(o()),(Ge=QA(()=>o().length))!==null&&Ge!==void 0?Ge:""),` `).concat((_(o()),(ri=QA(()=>o().length===1?"item":"items"))!==null&&ri!==void 0?ri:"")))}),lA(dt,Je)},$$slots:{default:!0}}),lA(xA,LA)};YA(Ue,xA=>{c(f)?xA(Te):xA(ht,!1)});var Me=bA(Qe,2),Ai=xA=>{var LA=R5A();P2(cA(LA),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(xA,LA)};YA(Me,xA=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&xA(Ai)});var J=bA(EA,2),O=xA=>{ZQ(xA,{get validationError(){return c(M)},onExpand:G})};YA(J,xA=>{c(M),c(f),QA(()=>c(M)&&(!c(f)||!c(M).isChildError))&&xA(O)});var tA=bA(J,2),oA=xA=>{var LA=N5A();ue("click",LA,eA),lA(xA,LA)},NA=xA=>{var LA=F5A();ue("click",LA,dA),lA(xA,LA)};YA(tA,xA=>{c(f)?xA(oA):xA(NA,!1)});var de=bA(XA,2),Ee=xA=>{var LA=U5A(),dt=$e(LA),At=cA(dt),Je=rn=>{var Le,ji,Bi=L5A(),vi=cA(Bi),Ji=et(()=>(c(v),_(Ka),_(g()),QA(()=>c(v)&&Ka(g()))));P2(vi,{insert:!0,get selected(){return c(Ji)},onContextMenu:iA}),ve(Dt=>{Le=Xt(Bi,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Le,Dt),fn(Bi,"title",Ox),ji=gl(Bi,"",ji,{"--level":(c(E),QA(()=>c(E).length+1))})},[()=>({"jse-hovered":c(d)===F1,"jse-selected":c(v)&&Ka(g())})]),lA(rn,Bi)};YA(At,rn=>{_(l()),c(d),_(F1),c(v),_(Ka),_(g()),QA(()=>!l().readOnly&&(c(d)===F1||c(v)&&Ka(g())))&&rn(Je)}),ea(bA(At,2),1,()=>c(R)||qQ,ha,(rn,Le,ji)=>{var Bi=G5A(),vi=$e(Bi);ea(vi,1,()=>(_(o()),c(Le),c(Q),QA(()=>(function(qi,Nt,L){var gt=Nt.start,gi=Math.min(Nt.end,qi.length),sn=a8(gt,gi);return L&&L.offset!==0?pW(sn,L.selectionStartIndex,L.selectionItemsCount,L.offset).map((gn,Kn)=>({index:gn,gutterIndex:Kn})):sn.map(gn=>({index:gn,gutterIndex:gn}))})(o(),c(Le),c(Q)))),qi=>qi.index,(qi,Nt)=>{var L=et(()=>(_(Pa),_(r()),c(Nt),QA(()=>Pa(r())?r().items[c(Nt).index]:void 0))),gt=et(()=>(_(lD),_(l()),_(g()),c(E),c(Nt),QA(()=>lD(l().getJson(),g(),c(E).concat(String(c(Nt).index)))))),gi=yi(),sn=$e(gi),gn=et(()=>(_(R4),_(n()),c(Nt),QA(()=>R4(n(),c(Nt).index)))),Kn=et(()=>(_(Pa),_(a()),c(Nt),QA(()=>Pa(a())?a().items[c(Nt).index]:void 0))),ko=et(()=>(_(Pa),_(s()),c(Nt),QA(()=>Pa(s())?s().items[c(Nt).index]:void 0)));kR(sn,{get value(){return _(o()),c(Nt),QA(()=>o()[c(Nt).index])},get pointer(){return c(gn)},get state(){return c(Kn)},get validationErrors(){return c(L)},get searchResults(){return c(ko)},get selection(){return c(gt)},get context(){return l()},onDragSelectionStart:yA,$$slots:{identifier:(eo,fo)=>{var Go=_5A(),co=cA(Go),ta=cA(co);ve(()=>xt(ta,(c(Nt),QA(()=>c(Nt).gutterIndex)))),lA(eo,Go)}}}),lA(qi,gi)});var Ji=bA(vi,2),Dt=qi=>{var Nt=et(()=>c(R)||qQ);p5A(qi,{get visibleSections(){return c(Nt)},sectionIndex:ji,get total(){return _(o()),QA(()=>o().length)},get path(){return c(E)},get onExpandSection(){return _(l()),QA(()=>l().onExpandSection)},get selection(){return g()},get context(){return l()}})};YA(Ji,qi=>{c(Le),_(o()),QA(()=>c(Le).end{var Le=K5A();ue("click",Le,dA),lA(rn,Le)};YA(ri,rn=>{c(i)||rn(en)}),lA(xA,LA)};YA(de,xA=>{c(f)&&xA(Ee)}),ue("click",ZA,F),lA(HA,uA)},KA=HA=>{var uA=yi(),XA=$e(uA),EA=MA=>{var be=Z5A(),_A=$e(be),pA=cA(_A),Rt=cA(pA),Et=cA(Rt),Qe=Ge=>{Pi(Ge,{get data(){return qc}})},_t=Ge=>{Pi(Ge,{get data(){return qB}})};YA(Et,Ge=>{c(f)?Ge(Qe):Ge(_t,!1)});var Ue=bA(Rt,2);Aa(Ue,e,"identifier",{},null);var Te=bA(Ue,2),ht=Ge=>{lA(Ge,Y5A())};YA(Te,Ge=>{c(i)||Ge(ht)});var Me=bA(Te,2),Ai=cA(Me),J=cA(Ai),O=Ge=>{lA(Ge,H5A())},tA=Ge=>{var ri=T5A();vD(bA($e(ri),2),{onclick:G,children:(en,rn)=>{var Le=tr();ve((ji,Bi)=>xt(Le,"".concat(ji??"",` `).concat(Bi??"")),[()=>(_(o()),QA(()=>Object.keys(o()).length)),()=>(_(o()),QA(()=>Object.keys(o()).length===1?"prop":"props"))]),lA(en,Le)},$$slots:{default:!0}}),lA(Ge,ri)};YA(J,Ge=>{c(f)?Ge(O):Ge(tA,!1)});var oA=bA(Me,2),NA=Ge=>{var ri=O5A();P2(cA(ri),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(Ge,ri)};YA(oA,Ge=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&Ge(NA)});var de=bA(pA,2),Ee=Ge=>{ZQ(Ge,{get validationError(){return c(M)},onExpand:G})};YA(de,Ge=>{c(M),c(f),QA(()=>c(M)&&(!c(f)||!c(M).isChildError))&&Ge(Ee)});var xA=bA(de,2),LA=Ge=>{var ri=z5A();ue("click",ri,eA),lA(Ge,ri)},dt=Ge=>{var ri=yi(),en=$e(ri),rn=Le=>{var ji=P5A();ue("click",ji,dA),lA(Le,ji)};YA(en,Le=>{c(i)||Le(rn)},!0),lA(Ge,ri)};YA(xA,Ge=>{c(f)?Ge(LA):Ge(dt,!1)});var At=bA(_A,2),Je=Ge=>{var ri=W5A(),en=$e(ri),rn=cA(en),Le=Ji=>{var Dt,qi,Nt=j5A(),L=cA(Nt),gt=et(()=>(c(v),_(Ka),_(g()),QA(()=>c(v)&&Ka(g()))));P2(L,{insert:!0,get selected(){return c(gt)},onContextMenu:iA}),ve(gi=>{Dt=Xt(Nt,1,"jse-insert-area jse-inside svelte-1qi6rc1",null,Dt,gi),fn(Nt,"title",Ox),qi=gl(Nt,"",qi,{"--level":(c(E),QA(()=>c(E).length+1))})},[()=>({"jse-hovered":c(d)===F1,"jse-selected":c(v)&&Ka(g())})]),lA(Ji,Nt)};YA(rn,Ji=>{_(l()),c(d),_(F1),c(v),_(Ka),_(g()),QA(()=>!l().readOnly&&(c(d)===F1||c(v)&&Ka(g())))&&Ji(Le)}),ea(bA(rn,2),1,()=>(_(o()),c(Q),QA(()=>(function(Ji,Dt){var qi=Object.keys(Ji);return Dt&&Dt.offset!==0?pW(qi,Dt.selectionStartIndex,Dt.selectionItemsCount,Dt.offset):qi})(o(),c(Q)))),ha,(Ji,Dt)=>{var qi=et(()=>(_(R4),_(n()),c(Dt),QA(()=>R4(n(),c(Dt))))),Nt=et(()=>(_(Ws),_(s()),c(Dt),QA(()=>Ws(s())?s().properties[c(Dt)]:void 0))),L=et(()=>(_(Ws),_(r()),c(Dt),QA(()=>Ws(r())?r().properties[c(Dt)]:void 0))),gt=et(()=>(c(E),c(Dt),QA(()=>c(E).concat(c(Dt))))),gi=et(()=>(_(lD),_(l()),_(g()),_(c(gt)),QA(()=>lD(l().getJson(),g(),c(gt))))),sn=yi(),gn=$e(sn),Kn=et(()=>(_(Ws),_(a()),c(Dt),QA(()=>Ws(a())?a().properties[c(Dt)]:void 0)));kR(gn,{get value(){return _(o()),c(Dt),QA(()=>o()[c(Dt)])},get pointer(){return c(qi)},get state(){return c(Kn)},get validationErrors(){return c(L)},get searchResults(){return c(Nt)},get selection(){return c(gi)},get context(){return l()},onDragSelectionStart:yA,$$slots:{identifier:(ko,eo)=>{var fo,Go=q5A(),co=cA(Go),ta=et(()=>(_(VW),_(c(Nt)),QA(()=>VW(c(Nt)))));(function(Ko,qo){kt(qo,!1);var Co=CA(void 0,!0),se=CA(void 0,!0),Ci=N(qo,"pointer",9),tn=N(qo,"key",9),ln=N(qo,"selection",9),So=N(qo,"searchResultItems",9),la=N(qo,"onUpdateKey",9),pi=N(qo,"context",9),to=CA(void 0,!0);function Ja(vA){c(se)||pi().readOnly||(vA.preventDefault(),pi().onSelect(oN(c(to))))}function Io(vA,VA){var me=la()(tn(),pi().normalization.unescapeValue(vA)),IA=Li(c(to)).concat(me);pi().onSelect(VA===aI.nextInside?_i(IA):mC(IA)),VA!==aI.self&&pi().focus()}function Sa(){pi().onSelect(mC(c(to))),pi().focus()}RA(()=>_(Ci()),()=>{x(to,As(Ci()))}),RA(()=>(_(ln()),c(to)),()=>{x(Co,ja(ln())&&di(ln().path,c(to)))}),RA(()=>(c(Co),_(ln())),()=>{x(se,c(Co)&&za(ln()))}),mn(),$t(!0);var kn=y5A(),Mi=$e(kn),Ot=vA=>{var VA=et(()=>(_(pi()),_(tn()),QA(()=>pi().normalization.escapeValue(tn())))),me=et(()=>(_(za),_(ln()),QA(()=>za(ln())?ln().initialValue:void 0)));YX(vA,{get value(){return c(VA)},get initialValue(){return c(me)},label:"Edit key",shortText:!0,onChange:Io,onCancel:Sa,get onFind(){return _(pi()),QA(()=>pi().onFind)}})},pn=vA=>{var VA,me=w5A(),IA=cA(me),SA=Se=>{var tt=et(()=>(_(pi()),_(tn()),QA(()=>pi().normalization.escapeValue(tn()))));qX(Se,{get text(){return c(tt)},get searchResultItems(){return So()}})},re=Se=>{var tt=tr();ve(at=>xt(tt,at),[()=>(_(oE),_(pi()),_(tn()),QA(()=>oE(pi().normalization.escapeValue(tn()))))]),lA(Se,tt)};YA(IA,Se=>{So()?Se(SA):Se(re,!1)}),ve(()=>VA=Xt(me,1,"jse-key svelte-1n4cez4",null,VA,{"jse-empty":tn()===""})),ue("dblclick",me,Ja),lA(vA,me)};YA(Mi,vA=>{_(pi()),c(se),QA(()=>!pi().readOnly&&c(se))?vA(Ot):vA(pn,!1)});var io=bA(Mi,2),mo=vA=>{P2(vA,{selected:!0,get onContextMenu(){return _(pi()),QA(()=>pi().onContextMenu)}})};YA(io,vA=>{_(pi()),c(Co),c(se),QA(()=>!pi().readOnly&&c(Co)&&!c(se))&&vA(mo)}),lA(Ko,kn),St()})(co,{get pointer(){return c(qi)},get key(){return c(Dt)},get selection(){return c(gi)},get searchResultItems(){return c(ta)},get context(){return l()},onUpdateKey:U}),ve(Ko=>fo=Xt(Go,1,"jse-key-outer svelte-1qi6rc1",null,fo,Ko),[()=>({"jse-selected-key":ja(c(gi))&&di(c(gi).path,c(gt))})]),lA(ko,Go)}}}),lA(Ji,sn)});var ji=bA(en,2),Bi=bA(cA(ji),2),vi=Ji=>{var Dt=V5A();ue("click",Dt,dA),lA(Ji,Dt)};YA(Bi,Ji=>{c(i)||Ji(vi)}),lA(Ge,ri)};YA(At,Ge=>{c(f)&&Ge(Je)}),ue("click",Rt,F),lA(MA,be)},ZA=MA=>{var be=eDA(),_A=cA(be),pA=cA(_A);Aa(pA,e,"identifier",{},null);var Rt=bA(pA,2),Et=oA=>{lA(oA,X5A())};YA(Rt,oA=>{c(i)||oA(Et)});var Qe=bA(Rt,2),_t=cA(Qe),Ue=et(()=>c(v)?g():void 0),Te=et(()=>(_(WW),_(s()),QA(()=>WW(s()))));l$(_t,{get path(){return c(E)},get value(){return o()},get enforceString(){return c(b)},get selection(){return c(Ue)},get searchResultItems(){return c(Te)},get context(){return l()}});var ht=bA(Qe,2),Me=oA=>{var NA=$5A();P2(cA(NA),{get root(){return c(i)},selected:!0,get onContextMenu(){return _(l()),QA(()=>l().onContextMenu)}}),lA(oA,NA)};YA(ht,oA=>{_(l()),c(v),_(g()),_(an),_($n),_(za),_(di),_(st),c(E),QA(()=>!l().readOnly&&c(v)&&g()&&(an(g())||$n(g()))&&!za(g())&&di(st(g()),c(E)))&&oA(Me)});var Ai=bA(_A,2),J=oA=>{ZQ(oA,{get validationError(){return c(M)},onExpand:G})};YA(Ai,oA=>{c(M)&&oA(J)});var O=bA(Ai,2),tA=oA=>{var NA=ADA();ue("click",NA,dA),lA(oA,NA)};YA(O,oA=>{c(i)||oA(tA)}),lA(MA,be)};YA(XA,MA=>{_(Qn),_(o()),QA(()=>Qn(o()))?MA(EA):MA(ZA,!1)},!0),lA(HA,uA)};YA(UA,HA=>{_(o()),QA(()=>Array.isArray(o()))?HA(mA):HA(KA,!1)});var ze=bA(UA,2),Ke=HA=>{var uA,XA=tDA(),EA=cA(XA),ZA=et(()=>(c(v),_(Xs),_(g()),QA(()=>c(v)&&Xs(g()))));P2(EA,{insert:!0,get selected(){return c(ZA)},onContextMenu:aA}),ve(MA=>{uA=Xt(XA,1,"jse-insert-area jse-after svelte-1qi6rc1",null,uA,MA),fn(XA,"title",Ox)},[()=>({"jse-hovered":c(d)===sD,"jse-selected":c(v)&&Xs(g())})]),lA(HA,XA)};YA(ze,HA=>{_(l()),c(d),_(sD),c(v),_(Xs),_(g()),QA(()=>!l().readOnly&&(c(d)===sD||c(v)&&Xs(g())))&&HA(Ke)}),ve((HA,uA)=>{hA=Xt(ee,1,HA,"svelte-1qi6rc1",hA,uA),fn(ee,"data-path",c(A)),fn(ee,"aria-selected",c(v)),JA=gl(ee,"",JA,{"--level":(c(E),QA(()=>c(E).length))})},[()=>sI((_(gc),c(f),_(l()),c(E),_(o()),QA(()=>gc("jse-json-node",{"jse-expanded":c(f)},l().onClassName(c(E),o()))))),()=>({"jse-root":c(i),"jse-selected":c(v)&&$n(g()),"jse-selected-value":c(v)&&an(g()),"jse-readonly":l().readOnly,"jse-hovered":c(d)===vW})]),ue("mousedown",ee,function(HA){if((HA.buttons===1||HA.buttons===2)&&!((uA=HA.target).nodeName==="DIV"&&uA.contentEditable==="true"||HA.buttons===1&&MX(HA.target,"BUTTON"))){var uA;HA.stopPropagation(),HA.preventDefault(),l().focus(),document.addEventListener("mousemove",Y,!0),document.addEventListener("mouseup",j);var XA=Yx(HA.target),EA=l().getJson(),ZA=l().getDocumentState();if(!g()||XA===jn.after||XA===jn.inside||g().type!==XA&&g().type!==jn.multi||!su(EA,g(),c(E)))if(vo(vo().selecting=!0),vo(vo().selectionAnchor=c(E)),vo(vo().selectionAnchorType=XA),vo(vo().selectionFocus=c(E)),HA.shiftKey){var MA=l().getSelection();MA&&l().onSelect(ns(O1(MA),c(E)))}else if(XA===jn.multi)if(c(i)&&HA.target.hasAttribute("data-path")){var be=fi(_X(o(),ZA));l().onSelect(mR(be))}else l().onSelect(ns(c(E),c(E)));else EA!==void 0&&l().onSelect(HW(XA,c(E)));else HA.button===0&&C()(HA)}}),ue("mousemove",ee,function(HA){if(vo().selecting){HA.preventDefault(),HA.stopPropagation(),vo().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var uA=Yx(HA.target);di(c(E),vo().selectionFocus)&&uA===vo().selectionAnchorType||(vo(vo().selectionFocus=c(E)),vo(vo().selectionAnchorType=uA),l().onSelect(ns(vo().selectionAnchor||vo().selectionFocus,vo().selectionFocus)))}}),ue("mouseover",ee,function(HA){vo().selecting||vo().dragging||(HA.stopPropagation(),$2(HA.target,"data-type","selectable-value")?x(d,vW):$2(HA.target,"data-type","selectable-key")?x(d,void 0):$2(HA.target,"data-type","insert-selection-area-inside")?x(d,F1):$2(HA.target,"data-type","insert-selection-area-after")&&x(d,sD),clearTimeout(B))}),ue("mouseout",ee,function(HA){HA.stopPropagation(),B=window.setTimeout(()=>x(d,void 0))}),lA(t,ee),St()}var c$={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},C$={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},sZ={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},nDA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-welcome.svelte-1lhnan { flex: 1; overflow: auto; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); display: flex; flex-direction: column; align-items: center; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-welcome.svelte-1lhnan:last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-welcome.svelte-1lhnan .jse-space.jse-before:where(.svelte-1lhnan) { flex: 1; } .jse-welcome.svelte-1lhnan .jse-space.jse-after:where(.svelte-1lhnan) { flex: 2; } .jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) { display: flex; flex-direction: column; max-width: 300px; margin: 2em var(--jse-padding, 10px); gap: var(--jse-padding, 10px); } .jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) .jse-welcome-info:where(.svelte-1lhnan) { color: var(--jse-panel-color-readonly, #b2b2b2); } .jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-welcome.svelte-1lhnan .jse-contents:where(.svelte-1lhnan) button:where(.svelte-1lhnan):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); }`);var oDA=FA('
    You can paste clipboard data using Ctrl+V, or use the following options:
    ',1),aDA=FA('
    Empty document
    ');function SR(t,e){var A=typeof t=="string"?t.toLowerCase():t,i=typeof e=="string"?e.toLowerCase():e;return(0,QZ.default)(A,i)}function I$(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Pe(t,e);if(Lo(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return(function(o){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,g=(function(C,I){var d={boolean:0,number:1,string:2,undefined:4},B=3;return function(Q,E){var f=Pe(Q,C),b=Pe(E,C);if(typeof f!=typeof b){var R,M,v=(R=d[typeof f])!==null&&R!==void 0?R:B,F=(M=d[typeof b])!==null&&M!==void 0?M:B;return v>F?I:vb?I:f1&&arguments[1]!==void 0?arguments[1]:[],r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,s=Pe(o,a),g=Object.keys(s).slice();g.sort((C,I)=>r*SR(C,I));var l={};return g.forEach(C=>l[C]=s[C]),[{op:"replace",path:pt(a),value:l}]})(t,e,i);throw new Error("Cannot sort: no array or object")}hu(["click"]);Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-navigation-bar-dropdown.svelte-1k47orx { position: absolute; top: 100%; left: 0; z-index: 3; background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); color: var(--jse-navigation-bar-dropdown-color, #656565); box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); display: flex; flex-direction: column; max-height: 300px; overflow: auto; min-width: 80px; } .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx) { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); border: none; background: transparent; color: inherit; cursor: pointer; outline: none; text-align: left; white-space: nowrap; box-sizing: border-box; padding: calc(0.5 * var(--jse-padding, 10px)) 36px; } .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):focus, .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item:where(.svelte-1k47orx):hover { background: var(--jse-navigation-bar-background-highlight, #e5e5e5); } .jse-navigation-bar-dropdown.svelte-1k47orx button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-1k47orx) { background: var(--jse-navigation-bar-dropdown-color, #656565); color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); }`);var rDA=FA(''),sDA=FA(''),gDA=FA('
    ');function lDA(t,e){kt(e,!1);var A=N(e,"items",9),i=N(e,"selectedItem",9),n=N(e,"onSelect",9);$t(!0);var o=gDA(),a=cA(o);ea(a,1,()=>(_(RD),_(A()),QA(()=>RD(A(),100))),g=>g,(g,l)=>{var C,I=rDA(),d=cA(I);ve((B,Q)=>{C=Xt(I,1,"jse-navigation-bar-dropdown-item svelte-1k47orx",null,C,{"jse-selected":c(l)===i()}),fn(I,"title",B),xt(d,Q)},[()=>(c(l),QA(()=>c(l).toString())),()=>(_(gC),c(l),QA(()=>gC(c(l).toString(),30)))]),ue("click",I,aC(()=>n()(c(l)))),lA(g,I)});var r=bA(a,2),s=g=>{var l=sDA();fn(l,"title","Limited to 100 items"),lA(g,l)};YA(r,g=>{_(A()),QA(()=>A().length>100)&&g(s)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-navigation-bar-item.svelte-13sijxb { position: relative; display: flex; } .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb) { font-family: inherit; font-size: inherit; padding: calc(0.5 * var(--jse-padding, 10px)) 2px; border: none; background: transparent; color: inherit; cursor: pointer; outline: none; min-width: 2em; white-space: nowrap; } .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):focus, .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button:where(.svelte-13sijxb):hover { background: var(--jse-panel-button-background-highlight, #e0e0e0); color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); } .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-13sijxb) { padding: 2px var(--jse-padding, 10px) 0; } .jse-navigation-bar-item.svelte-13sijxb button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-13sijxb) { background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); color: var(--jse-navigation-bar-dropdown-color, #656565); } .jse-navigation-bar-item.svelte-13sijxb:last-child { padding-right: var(--jse-padding, 10px); }`);var cDA=FA(''),CDA=FA('
    ');function gZ(t,e){kt(e,!1);var A,i=CA(void 0,!0),n=CA(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:a}=cI("absolute-popup"),r=N(e,"path",9),s=N(e,"index",9),g=N(e,"onSelect",9),l=N(e,"getItems",9),C=CA(void 0,!0),I=CA(!1,!0);function d(R){a(A),g()(c(i).concat(R))}RA(()=>(_(r()),_(s())),()=>{x(i,r().slice(0,s()))}),RA(()=>(_(r()),_(s())),()=>{x(n,r()[s()])}),mn(),$t(!0);var B,Q=CDA(),E=cA(Q);Pi(cA(E),{get data(){return IM}});var f=bA(E,2),b=R=>{var M=cDA(),v=cA(M);ve(()=>xt(v,c(n))),ue("click",M,()=>d(c(n))),lA(R,M)};YA(f,R=>{c(n)!==void 0&&R(b)}),Mo(Q,R=>x(C,R),()=>c(C)),ve(()=>B=Xt(E,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-13sijxb",null,B,{"jse-open":c(I)})),ue("click",E,function(){if(c(C)){x(I,!0);var R={items:l()(c(i)),selectedItem:c(n),onSelect:d};A=o(lDA,R,{anchor:c(C),closeOnOuterClick:!0,onClose:()=>{x(I,!1)}})}}),lA(t,Q),St()}function lN(t){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-navigation-bar-path-editor.svelte-uyexy4 { flex: 1; display: flex; border: var(--jse-edit-outline, 2px solid #656565); background: var(--jse-background-color, #fff); } .jse-navigation-bar-path-editor.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { flex: 1; font-family: inherit; font-size: inherit; padding: 0 5px 1px; background: var(--jse-background-color, #fff); color: var(--jse-text-color, #4d4d4d); border: none; outline: none; } .jse-navigation-bar-path-editor.svelte-uyexy4 button:where(.svelte-uyexy4) { border: none; background: var(--jse-background-color, #fff); cursor: pointer; font-family: inherit; font-size: 80%; color: inherit; } .jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-copy.copied:where(.svelte-uyexy4) { color: var(--message-success-background, #9ac45d); } .jse-navigation-bar-path-editor.svelte-uyexy4 button.jse-navigation-bar-validation-error:where(.svelte-uyexy4) { color: var(--jse-error-color, #ee5341); } .jse-navigation-bar-path-editor.error.svelte-uyexy4 { border-color: var(--jse-error-color, #ee5341); } .jse-navigation-bar-path-editor.error.svelte-uyexy4 input.jse-navigation-bar-text:where(.svelte-uyexy4) { color: var(--jse-error-color, #ee5341); } .jse-navigation-bar-path-editor.svelte-uyexy4 .jse-copied-text:where(.svelte-uyexy4) { background: var(--message-success-background, #9ac45d); color: var(--jse-message-success-color, #fff); position: relative; margin: 2px; padding: 0 5px; border-radius: 3px; }`);var IDA=FA(''),dDA=FA('
    Copied!
    '),BDA=FA('
    ');function QDA(t,e){kt(e,!1);var A=CA(),i=cI("absolute-popup"),n=N(e,"path",8),o=N(e,"pathParser",8),a=N(e,"onChange",8),r=N(e,"onClose",8),s=N(e,"onError",8),g=N(e,"pathExists",8),l=CA(),C=CA(),I=CA(!1),d=void 0,B=CA(!1);function Q(){c(l).focus()}function E(j){try{var AA=o().parse(j);return(function(z){if(!g()(z))throw new Error("Path does not exist in current document")})(AA),{path:AA,error:void 0}}catch(z){return{path:void 0,error:z}}}Jr(()=>{Q()}),cl(()=>{clearTimeout(d)}),RA(()=>(_(o()),_(n())),()=>{x(C,o().stringify(n()))}),RA(()=>(c(I),c(C)),()=>{x(A,c(I)?E(c(C)).error:void 0)}),mn(),$t();var f,b=BDA(),R=cA(b);Mo(R,j=>x(l,j),()=>c(l));var M=bA(R,2),v=j=>{var AA=IDA();Pi(cA(AA),{get data(){return v2}}),as(AA,(z,yA)=>sE?.(z,yA),()=>ye({text:String(c(A)||"")},i)),lA(j,AA)};YA(M,j=>{c(A)&&j(v)});var F=bA(M,2),G=j=>{lA(j,dDA())};YA(F,j=>{c(B)&&j(G)});var U,Y=bA(F,2);Pi(cA(Y),{get data(){return j0}}),ve(()=>{f=Xt(b,1,"jse-navigation-bar-path-editor svelte-uyexy4",null,f,{error:c(A)}),Z1(R,c(C)),U=Xt(Y,1,"jse-navigation-bar-copy svelte-uyexy4",null,U,{copied:c(B)})}),ue("keydown",R,aC(function(j){var AA=fC(j);if(AA==="Escape"&&(j.preventDefault(),r()()),AA==="Enter"){j.preventDefault(),x(I,!0);var z=E(c(C));z.path!==void 0?a()(z.path):s()(z.error)}})),ue("input",R,function(j){x(C,j.currentTarget.value)}),ue("click",Y,function(){lN(c(C)),x(B,!0),d=window.setTimeout(()=>x(B,!1),1e3),Q()}),lA(t,b),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-navigation-bar.svelte-hjhal6 { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); background: var(--jse-panel-background, #ebebeb); color: var(--jse-panel-button-color, inherit); padding: 0; margin: 0; display: flex; overflow: auto; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); color: var(--jse-panel-color-readonly, #b2b2b2); background: transparent; border: none; display: flex; cursor: pointer; outline: none; align-items: center; } .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.flex:where(.svelte-hjhal6) { flex: 1; } .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):focus, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6):hover, .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit.editing:where(.svelte-hjhal6) { background: var(--jse-panel-button-background-highlight, #e0e0e0); color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); transition: color 0.2s ease-in, background 0.2s ease-in; } .jse-navigation-bar.svelte-hjhal6 .jse-navigation-bar-edit:where(.svelte-hjhal6) .jse-navigation-bar-space:where(.svelte-hjhal6) { flex: 1; text-align: left; }`);var EDA=FA(" ",1),hDA=FA('
    ');function uDA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=qa("jsoneditor:NavigationBar"),o=N(e,"json",9),a=N(e,"selection",9),r=N(e,"onSelect",9),s=N(e,"onError",9),g=N(e,"pathParser",9),l=CA(void 0,!0),C=CA(!1,!0);function I(AA){n("get items for path",AA);var z=Pe(o(),AA);if(Array.isArray(z))return a8(0,z.length).map(String);if(Qn(z)){var yA=Object.keys(z).slice(0);return yA.sort(SR),yA}return[]}function d(AA){return cr(o(),AA)}function B(AA){n("select path",JSON.stringify(AA)),r()(ns(AA,AA))}function Q(){x(C,!1)}function E(AA){Q(),B(AA)}RA(()=>(_(a()),st),()=>{x(A,a()?st(a()):[])}),RA(()=>(_(o()),c(A)),()=>{x(i,jo(Pe(o(),c(A))))}),RA(()=>c(A),()=>{c(A),setTimeout(()=>{if(c(l)&&c(l).scrollTo){var AA=c(l).scrollWidth-c(l).clientWidth;AA>0&&(n("scrollTo ",AA),c(l).scrollTo({left:AA,behavior:"smooth"}))}})}),mn(),$t(!0);var f=hDA(),b=cA(f),R=AA=>{var z=EDA(),yA=$e(z);ea(yA,1,()=>c(A),ha,(eA,dA,iA)=>{gZ(eA,{getItems:I,get path(){return c(A)},index:iA,onSelect:B})});var P=bA(yA,2),nA=eA=>{gZ(eA,{getItems:I,get path(){return c(A)},get index(){return c(A),QA(()=>c(A).length)},onSelect:B})};YA(P,eA=>{c(i)&&eA(nA)}),lA(AA,z)},M=AA=>{QDA(AA,{get path(){return c(A)},onClose:Q,onChange:E,get onError(){return s()},pathExists:d,get pathParser(){return g()}})};YA(b,AA=>{c(C)?AA(M,!1):AA(R)});var v,F=bA(b,2),G=cA(F),U=cA(G),Y=bA(G,2),j=et(()=>c(C)?Az:VO);Pi(Y,{get data(){return c(j)}}),Mo(f,AA=>x(l,AA),()=>c(l)),ve(AA=>{v=Xt(F,1,"jse-navigation-bar-edit svelte-hjhal6",null,v,{flex:!c(C),editing:c(C)}),fn(F,"title",c(C)?"Cancel editing the selected path":"Edit the selected path"),xt(U,AA)},[()=>(_(jo),_(o()),c(C),QA(()=>jo(o())||c(C)?"\xA0":"Navigation bar"))]),ue("click",F,function(){x(C,!c(C))}),lA(t,f),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-search-box.svelte-1x1x8q0 { border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); border-radius: 3px; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); background: var(--jse-panel-background, #ebebeb); color: var(--jse-panel-color-readonly, #b2b2b2); box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); display: inline-block; width: 400px; max-width: 100%; overflow: auto; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) { display: flex; align-items: stretch; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0), .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { font-family: inherit; font-size: inherit; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { display: block; text-align: center; border: none; padding: 0 5px; margin: 0; cursor: pointer; color: var(--jse-panel-button-color, inherit); background: var(--jse-panel-button-background, transparent); } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0):hover { color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); background: var(--jse-panel-button-background-highlight, #e0e0e0); } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) input:where(.svelte-1x1x8q0) { color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); border: var(--jse-input-border, 1px solid #d8dbdf); border-radius: 3px; background: var(--jse-input-background, var(--jse-background-color, #fff)); height: 28px; padding: 0 5px; margin: 0; flex: 1; width: 0; min-width: 50px; outline: none; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-replace-toggle:where(.svelte-1x1x8q0) { padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); min-width: 20px; background: var(--jse-panel-button-background-highlight, #e0e0e0); } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) { flex: 1; display: flex; flex-direction: column; padding: calc(0.5 * var(--jse-padding, 10px)); gap: calc(0.5 * var(--jse-padding, 10px)); } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) { flex: 1; display: flex; align-items: center; position: relative; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-icon:where(.svelte-1x1x8q0) { color: inherit; cursor: inherit; background: inherit; width: 32px; text-align: center; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) label.jse-search-input-label:where(.svelte-1x1x8q0) { flex: 1; display: flex; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count:where(.svelte-1x1x8q0) { color: inherit; font-size: 80%; visibility: hidden; padding: 0 5px; min-width: 36px; text-align: center; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-search-section:where(.svelte-1x1x8q0) .jse-search-count.jse-visible:where(.svelte-1x1x8q0) { visibility: visible; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) { flex: 1; display: flex; padding-left: 32px; } .jse-search-box.svelte-1x1x8q0 .jse-search-form:where(.svelte-1x1x8q0) .jse-search-contents:where(.svelte-1x1x8q0) .jse-replace-section:where(.svelte-1x1x8q0) button:where(.svelte-1x1x8q0) { width: auto; }`);var fDA=FA(''),mDA=FA('
    '),pDA=FA('');function d$(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=qa("jsoneditor:SearchBox"),a=N(e,"json",9),r=N(e,"documentState",9),s=N(e,"parser",9),g=N(e,"showSearch",9),l=N(e,"showReplace",13),C=N(e,"readOnly",9),I=N(e,"columns",9),d=N(e,"onSearch",9),B=N(e,"onFocus",9),Q=N(e,"onPatch",9),E=N(e,"onClose",9),f=CA("",!0),b="",R=CA("",!0),M=CA(!1,!0),v=CA(void 0,!0),F=PB(function(MA){return KA.apply(this,arguments)},300),G=PB(function(MA){return ze.apply(this,arguments)},300);function U(){l(!l()&&!C())}function Y(MA){MA.stopPropagation();var be=fC(MA);be==="Enter"&&(MA.preventDefault(),c(f)!==b?F.flush():iA()),be==="Shift+Enter"&&(MA.preventDefault(),hA()),be==="Ctrl+Enter"&&(MA.preventDefault(),l()?yA():iA()),be==="Ctrl+H"&&(MA.preventDefault(),U()),be==="Escape"&&(MA.preventDefault(),uA())}function j(MA){fC(MA)==="Enter"&&(MA.preventDefault(),MA.stopPropagation(),yA())}function AA(){return z.apply(this,arguments)}function z(){return(z=Ut(function*(){uo(),yield F.flush()})).apply(this,arguments)}function yA(){return P.apply(this,arguments)}function P(){return(P=Ut(function*(){var MA;if(!C()){var be=(MA=c(v))===null||MA===void 0?void 0:MA.activeItem;if(o("handleReplace",{replaceText:c(R),activeItem:be}),c(v)&&be&&a()!==void 0){x(v,ye(ye({},OW(c(v))),{},{activeIndex:c(i)}));var{operations:_A,newSelection:pA}=Y6A(a(),r(),c(R),be,s());Q()(_A,(Rt,Et)=>({state:Et,selection:pA})),uo(),yield G.flush(),yield ee()}}})).apply(this,arguments)}function nA(){return eA.apply(this,arguments)}function eA(){return(eA=Ut(function*(){if(!C()){o("handleReplaceAll",{text:c(f),replaceText:c(R)});var{operations:MA,newSelection:be}=(function(_A,pA,Rt,Et,Qe){for(var _t=zW(Rt,_A,{maxResults:1/0}),Ue=[],Te=0;Te<_t.length;Te++){var ht=_t[Te-1],Me=_t[Te];Te!==0&&Me.field===ht.field&&di(Me.path,ht.path)?fi(Ue).items.push(Me):Ue.push({path:Me.path,field:Me.field,items:[Me]})}Ue.sort((O,tA)=>O.field!==tA.field?O.field===nc.key?1:-1:tA.path.length-O.path.length);var Ai,J=[];return Ue.forEach(O=>{var{field:tA,path:oA,items:NA}=O;if(tA===nc.key){var de=Li(oA),Ee=Pe(_A,de),xA=fi(oA),LA=wu(de,Object.keys(Ee),xA,jW(xA,Et,NA));J=J.concat(LA),Ai=rE(_A,LA)}else{if(tA!==nc.value)throw new Error("Cannot replace: unknown type of search result field ".concat(tA));var dt=Pe(_A,oA);if(dt===void 0)throw new Error("Cannot replace: path not found ".concat(pt(oA)));var At=typeof dt=="string"?dt:String(dt),Je=g0(_A,pA,oA),Ge=jW(At,Et,NA),ri=[{op:"replace",path:pt(oA),value:Je?Ge:EE(Ge,Qe)}];J=J.concat(ri),Ai=rE(_A,ri)}}),{operations:J,newSelection:Ai}})(a(),r(),c(f),c(R),s());Q()(MA,(_A,pA)=>({state:pA,selection:be})),yield ee()}})).apply(this,arguments)}function dA(MA){MA.select()}function iA(){return aA.apply(this,arguments)}function aA(){return(aA=Ut(function*(){x(v,c(v)?OW(c(v)):void 0),yield ee()})).apply(this,arguments)}function hA(){return JA.apply(this,arguments)}function JA(){return JA=Ut(function*(){x(v,c(v)?(function(MA){var be=MA.activeIndex>0?MA.activeIndex-1:MA.items.length-1,_A=MA.items[be],pA=MA.items.map((Rt,Et)=>ye(ye({},Rt),{},{active:Et===be}));return ye(ye({},MA),{},{items:pA,activeItem:_A,activeIndex:be})})(c(v)):void 0),yield ee()}),JA.apply(this,arguments)}function ee(){return UA.apply(this,arguments)}function UA(){return(UA=Ut(function*(){var MA;o("handleFocus",c(v));var be=(MA=c(v))===null||MA===void 0?void 0:MA.activeItem;be&&a()!==void 0&&(yield B()(be.path,be.resultIndex))})).apply(this,arguments)}function mA(){return mA=Ut(function*(MA){yield Ke(MA,c(f),a())}),mA.apply(this,arguments)}function KA(){return KA=Ut(function*(MA){yield Ke(g(),MA,a()),yield ee()}),KA.apply(this,arguments)}function ze(){return ze=Ut(function*(MA){yield Ke(g(),c(f),MA)}),ze.apply(this,arguments)}function Ke(MA,be,_A){return HA.apply(this,arguments)}function HA(){return HA=Ut(function*(MA,be,_A){return MA?(o("applySearch",{showSearch:MA,text:be}),be===""?(o("clearing search result"),c(v)!==void 0&&x(v,void 0),Promise.resolve()):(b=be,x(M,!0),new Promise(pA=>{setTimeout(()=>{var Rt=zW(be,_A,{maxResults:Hx,columns:I()});x(v,(function(Et,Qe){var _t=Qe!=null&&Qe.activeItem?qW(Qe.activeItem):void 0,Ue=Et.findIndex(Me=>di(_t,qW(Me))),Te=Ue!==-1?Ue:Qe?.activeIndex!==void 0&&Qe?.activeIndex0?0:-1,ht=Et.map((Me,Ai)=>ye(ye({resultIndex:Ai},Me),{},{active:Ai===Te}));return{items:ht,activeItem:ht[Te],activeIndex:Te}})(Rt,c(v))),x(M,!1),pA()})}))):(c(v)&&x(v,void 0),Promise.resolve())}),HA.apply(this,arguments)}function uA(){o("handleClose"),F.cancel(),G.cancel(),Ke(!1,c(f),a()),E()()}RA(()=>c(v),()=>{var MA;x(A,((MA=c(v))===null||MA===void 0||(MA=MA.items)===null||MA===void 0?void 0:MA.length)||0)}),RA(()=>c(v),()=>{var MA;x(i,((MA=c(v))===null||MA===void 0?void 0:MA.activeIndex)||0)}),RA(()=>(c(A),Hx),()=>{x(n,c(A)>=Hx?"".concat(999,"+"):String(c(A)))}),RA(()=>(_(d()),c(v)),()=>{d()(c(v))}),RA(()=>_(g()),()=>{(function(MA){mA.apply(this,arguments)})(g())}),RA(()=>c(f),()=>{F(c(f))}),RA(()=>_(a()),()=>{G(a())}),mn(),$t(!0);var XA=yi(),EA=$e(XA),ZA=MA=>{var be=pDA(),_A=cA(be),pA=cA(_A),Rt=xA=>{var LA=fDA(),dt=cA(LA),At=et(()=>l()?qc:qB);Pi(dt,{get data(){return c(At)}}),ue("click",LA,U),lA(xA,LA)};YA(pA,xA=>{C()||xA(Rt)});var Et=cA(bA(pA,2)),Qe=cA(Et),_t=cA(Qe),Ue=xA=>{Pi(xA,{get data(){return qO},spin:!0})},Te=xA=>{Pi(xA,{get data(){return P4}})};YA(_t,xA=>{c(M)?xA(Ue):xA(Te,!1)});var ht=bA(Qe,2),Me=cA(ht);Er(()=>xD(Me,()=>c(f),xA=>x(f,xA))),as(Me,xA=>dA?.(xA)),Er(()=>ue("paste",Me,AA));var Ai,J=bA(ht,2),O=cA(J),tA=bA(J,2);Pi(cA(tA),{get data(){return ez}});var oA=bA(tA,2);Pi(cA(oA),{get data(){return jO}});var NA=bA(oA,2);Pi(cA(NA),{get data(){return q4}});var de=bA(Et,2),Ee=xA=>{var LA=mDA(),dt=cA(LA),At=bA(dt,2),Je=bA(At,2);xD(dt,()=>c(R),Ge=>x(R,Ge)),ue("keydown",dt,j),ue("click",At,yA),ue("click",Je,nA),lA(xA,LA)};YA(de,xA=>{l()&&!C()&&xA(Ee)}),ve(()=>{var xA;Ai=Xt(J,1,"jse-search-count svelte-1x1x8q0",null,Ai,{"jse-visible":c(f)!==""}),xt(O,"".concat(c(i)!==-1&&c(i){g()&&MA(ZA)}),lA(t,XA),St()}var Cu=Symbol("path");function DDA(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&(function(o,a,r){if(o.length1?(o.length-1)/(a-1):o.length,g=0;g{Qn(o)?B$(o,i,e):i[Cu]=!0});var n=[];return Cu in i&&n.push([]),Q$(i,[],n,e),n}function B$(t,e,A){for(var i in t){var n=t[i],o=e[i]||(e[i]={});Qn(n)&&A?B$(n,o,A):o[Cu]===void 0&&(o[Cu]=!0)}}function Q$(t,e,A,i){for(var n in t){var o=e.concat(n),a=t[n];a&&a[Cu]===!0&&A.push(o),Oo(a)&&i&&Q$(a,o,A,i)}}function wDA(t,e,A,i,n,o){for(var a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,r=Lo(A)?A.length:0,s=(function(b,R){var M=Object.values(b);if(zi(M))return R;var v=(F,G)=>F+G;return M.reduce(v)/M.length})(i,n),g=t-a,l=e+2*a,C=b=>i[b]||n,I=0,d=o;d0&&(d-=C(--I));for(var B=I,Q=0;QI0(i,o))}}function L1(t,e){var{rowIndex:A,columnIndex:i}=t;return[String(A),...e[i]]}function yDA(t,e){var[A,i]=AM(t,a=>TR(a.path[0])),n=X9(A,vDA),o=$9(n,a=>{var r={row:[],columns:{}};return a.forEach(s=>{var g=(function(l,C){var I=nl(l.path,C);return I.columnIndex!==-1?I.columnIndex:-1})(s,e);g!==-1?(r.columns[g]===void 0&&(r.columns[g]=[]),r.columns[g].push(s)):r.row.push(s)}),r});return{root:i,rows:o}}function FQ(t,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:t,message:"Multiple validation issues: "+e.map(A=>$s(A.path)+" "+A.message).join(", "),severity:ic.warning}}function vDA(t){return parseInt(t.path[0],10)}function bDA(t,e,A){var i=e.some(n=>(function(o,a,r){if(!o)return!1;if(a.op==="replace"){var s=As(a.path),{rowIndex:g,columnIndex:l}=nl(s,r),C=r.findIndex(I=>di(I,o.path));if(g!==-1&&l!==-1&&l!==C)return!1}return!0})(t,n,A));return i?void 0:t}var os=qa("jsoneditor:actions");function E$(t){return xR.apply(this,arguments)}function xR(){return xR=Ut(function*(t){var{json:e,selection:A,indentation:i,readOnly:n,parser:o,onPatch:a}=t;if(!n&&e!==void 0&&A&&HQ(A)){var r=UX(e,A,i,o);if(r!==void 0){os("cut",{selection:A,clipboard:r,indentation:i}),yield lN(r);var{operations:s,newSelection:g}=zX(e,A);a(s,(l,C)=>({state:C,selection:g}))}}}),xR.apply(this,arguments)}function h$(t){return RR.apply(this,arguments)}function RR(){return RR=Ut(function*(t){var{json:e,selection:A,indentation:i,parser:n}=t,o=UX(e,A,i,n);o!==void 0&&(os("copy",{clipboard:o,indentation:i}),yield lN(o))}),RR.apply(this,arguments)}function u$(t){var{clipboardText:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onChangeText:r,onPasteMultilineText:s,openRepairModal:g}=t;if(!n)try{l(e)}catch(C){g(e,I=>{os("repaired pasted text: ",I),l(I)})}function l(C){if(A!==void 0){var I=i||_i([]),d=OX(A,I,C,o),B=(function(Q,E,f){var b=arguments.length>3&&arguments[3]!==void 0?arguments[3]:N6A;if(Q.length>b)return!1;var R=/\n/.test(Q);if(!R)return!1;var M=E.some(F=>F.op==="replace"&&Array.isArray(F.value)),v=E.filter(F=>F.op==="add").length>1;if(!M&&!v)return!1;try{return fu(Q,f.parse),!1}catch(F){return!0}})(e,d,o);os("paste",{pastedText:C,operations:d,ensureSelection:I,pasteMultilineText:B}),a(d,(Q,E)=>{var f=E;return d.filter(b=>(b9(b)||m6(b))&&jo(b.value)).forEach(b=>{var R=Ys(A,b.path);f=$1(Q,f,R)}),{state:f}}),B&&s(C)}else os("paste text",{pastedText:C}),r(e,(Q,E)=>{if(Q)return{state:$1(Q,E,[])}})}}function f$(t){var{json:e,text:A,selection:i,keepSelection:n,readOnly:o,onChange:a,onPatch:r}=t;if(!o&&i){var s=e!==void 0&&(ja(i)||an(i))?ns(i.path,i.path):i;if(zi(st(i)))os("remove root",{selection:i}),a&&a({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:g,newSelection:l}=zX(e,s);os("remove",{operations:g,selection:i,newSelection:l}),r(g,(C,I)=>({state:I,selection:n?i:l}))}}}function jD(t){var{insertType:e,selectInside:A,initialValue:i,json:n,selection:o,readOnly:a,parser:r,onPatch:s,onReplaceJson:g}=t;if(!a){var l=(function(Q,E,f){if(f==="object")return{};if(f==="array")return[];if(f==="structure"&&Q!==void 0){var b=E?GX(E):[],R=Pe(Q,b);if(Array.isArray(R)&&!zi(R)){var M=Wg(R);return jo(M)?q9(M,v=>Array.isArray(v)?[]:Qn(v)?void 0:""):""}}return""})(n,o,e);if(n!==void 0){var C=r.stringify(l),I=OX(n,o,C,r);os("onInsert",{insertType:e,operations:I,newValue:l,data:C});var d=fi(I.filter(Q=>Q.op==="add"||Q.op==="replace"));s(I,(Q,E,f)=>{if(d){var b=Ys(Q,d.path);if(jo(l))return{state:ec(Q,E,b,nN),selection:A?pC(b):f};if(l===""){var R=zi(b)?void 0:Pe(Q,Li(b));return{state:ec(Q,E,b,wD),selection:Qn(R)?oN(b,i):GD(b,i)}}}}),os("after patch")}else{os("onInsert",{insertType:e,newValue:l});var B=[];g(l,(Q,E)=>({state:$1(Q,E,B),selection:jo(l)?pC(B):GD(B)}))}}}function m$(t){return NR.apply(this,arguments)}function NR(){return NR=Ut(function*(t){var{char:e,selectInside:A,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s,onSelect:g}=t;o||(ja(n)?g(ye(ye({},n),{},{edit:!0,initialValue:e})):e==="{"?jD({insertType:"object",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):e==="["?jD({insertType:"array",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s}):an(n)&&i!==void 0?jo(Pe(i,n.path))||g(ye(ye({},n),{},{edit:!0,initialValue:e})):(os("onInsertValueWithCharacter",{char:e}),yield(function(l){return FR.apply(this,arguments)})({char:e,json:i,selection:n,readOnly:o,parser:a,onPatch:r,onReplaceJson:s})))}),NR.apply(this,arguments)}function FR(){return FR=Ut(function*(t){var{char:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r}=t;n||jD({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:i,readOnly:n,parser:o,onPatch:a,onReplaceJson:r})}),FR.apply(this,arguments)}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-json-preview.svelte-25xmyd { flex: 1; font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: var(--jse-panel-color-readonly, #b2b2b2); overflow: auto; white-space: pre-wrap; padding: 2px; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); border-bottom: var(--jse-main-border, 1px solid #d7d7d7); }`);var MDA=FA('
    ');function p$(t,e){kt(e,!1);var A=CA(),i=CA(),n=N(e,"text",8),o=N(e,"json",8),a=N(e,"indentation",8),r=N(e,"parser",8);RA(()=>(_(o()),_(n())),()=>{x(A,o()!==void 0?{json:o()}:{text:n()||""})}),RA(()=>(c(A),_(a()),_(r()),ND),()=>{x(i,gC(BR(c(A),a(),r()),ND))}),mn(),$t();var s=MDA(),g=cA(s);ve(()=>xt(g,c(i))),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ button.jse-context-menu-button.svelte-16jz6ui { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; flex: 1; white-space: nowrap; padding: var(--jse-padding, 10px); color: inherit; } button.jse-context-menu-button.svelte-16jz6ui:hover { background: var(--jse-context-menu-background-highlight, #7a7a7a); } button.jse-context-menu-button.svelte-16jz6ui:focus { background: var(--jse-context-menu-background-highlight, #7a7a7a); z-index: 1; } button.jse-context-menu-button.svelte-16jz6ui:disabled { color: var(--jse-context-menu-color-disabled, #9d9d9d); background: unset; } button.jse-context-menu-button.left.svelte-16jz6ui { text-align: left; } button.jse-context-menu-button.svelte-16jz6ui svg { width: 16px; }`);var kDA=FA('');function eR(t,e){kt(e,!1);var A=N(e,"item",8),i=N(e,"className",8,void 0),n=N(e,"onRequestClose",8);$t();var o=kDA(),a=cA(o),r=l=>{Pi(l,{get data(){return _(A()),QA(()=>A().icon)}})};YA(a,l=>{_(A()),QA(()=>A().icon)&&l(r)});var s=bA(a,2),g=l=>{var C=tr();ve(()=>xt(C,(_(A()),QA(()=>A().text)))),lA(l,C)};YA(s,l=>{_(A()),QA(()=>A().text)&&l(g)}),ve(l=>{Xt(o,1,l,"svelte-16jz6ui"),fn(o,"title",(_(A()),QA(()=>A().title))),o.disabled=(_(A()),QA(()=>A().disabled||!1))},[()=>sI((_(gc),_(i()),_(A()),QA(()=>gc("jse-context-menu-button",i(),A().className))))]),ue("click",o,l=>{n()(),A().onClick(l)}),lA(t,o),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-dropdown-button.svelte-bov1j6 { flex: 1; line-height: normal; border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; position: relative; padding: 0; display: flex; } .jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) { margin: 0; padding: 0; } .jse-dropdown-button.svelte-bov1j6 ul:where(.svelte-bov1j6) li:where(.svelte-bov1j6) { margin: 0; padding: 0; list-style-type: none; } .jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; width: 2em; background: var(--jse-context-menu-background, #656565); color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); border-radius: 0; } .jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown.jse-visible:where(.svelte-bov1j6) { background: var(--jse-context-menu-background, #656565); } .jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):hover { background: var(--jse-context-menu-background-highlight, #7a7a7a); } .jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):focus { z-index: 1; } .jse-dropdown-button.svelte-bov1j6 button.jse-open-dropdown:where(.svelte-bov1j6):disabled { color: var(--jse-context-menu-color-disabled, #9d9d9d); background: unset; } .jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) { display: none; position: absolute; top: 100%; left: 0; z-index: 1; background: var(--jse-context-menu-background, #656565); color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); } .jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items.jse-visible:where(.svelte-bov1j6) { display: block; } .jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; width: 100%; text-align: left; padding: var(--jse-padding, 10px); margin: 0; } .jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):hover { background: var(--jse-context-menu-background-highlight, #7a7a7a); } .jse-dropdown-button.svelte-bov1j6 .jse-dropdown-items:where(.svelte-bov1j6) button:where(.svelte-bov1j6):disabled { color: var(--jse-context-menu-color-disabled, #9d9d9d); background: unset; }`);var SDA=FA('
  • '),xDA=FA('
      ');Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ button.jse-context-menu-button.svelte-1y5l9l1 { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; flex: 1; white-space: nowrap; padding: var(--jse-padding, 10px); color: inherit; } button.jse-context-menu-button.svelte-1y5l9l1:hover { background: var(--jse-context-menu-background-highlight, #7a7a7a); } button.jse-context-menu-button.svelte-1y5l9l1:focus { background: var(--jse-context-menu-background-highlight, #7a7a7a); z-index: 1; } button.jse-context-menu-button.svelte-1y5l9l1:disabled { color: var(--jse-context-menu-color-disabled, #9d9d9d); background: unset; } button.jse-context-menu-button.left.svelte-1y5l9l1 { text-align: left; } button.jse-context-menu-button.svelte-1y5l9l1 svg { width: 16px; }`);var RDA=FA('');function tR(t,e){kt(e,!1);var A=CA(),i=N(e,"item",8),n=N(e,"className",8,void 0),o=N(e,"onRequestClose",8);RA(()=>(_(i()),_(o())),()=>{x(A,i().items.map(a=>ye(ye({},a),{},{onClick:r=>{o()(),a.onClick(r)}})))}),mn(),$t(),(function(a,r){kt(r,!1);var s=CA(void 0,!0),g=N(r,"items",25,()=>[]),l=N(r,"title",9,void 0),C=N(r,"width",9,"120px"),I=CA(!1,!0);function d(){x(I,!1)}function B(v){fC(v)==="Escape"&&(v.preventDefault(),x(I,!1))}Jr(()=>{document.addEventListener("click",d),document.addEventListener("keydown",B)}),cl(()=>{document.removeEventListener("click",d),document.removeEventListener("keydown",B)}),RA(()=>_(g()),()=>{x(s,g().every(v=>v.disabled===!0))}),mn(),$t(!0);var Q=xDA(),E=cA(Q);Aa(E,r,"defaultItem",{},null);var f,b=bA(E,2);Pi(cA(b),{get data(){return qc}});var R,M=bA(b,2);ea(cA(M),5,g,ha,(v,F)=>{var G=SDA(),U=cA(G),Y=cA(U),j=z=>{Pi(z,{get data(){return c(F),QA(()=>c(F).icon)}})};YA(Y,z=>{c(F),QA(()=>c(F).icon)&&z(j)});var AA=bA(Y);ve(()=>{var z;fn(U,"title",(c(F),QA(()=>c(F).title))),U.disabled=(c(F),QA(()=>c(F).disabled)),Xt(U,1,sI((c(F),QA(()=>c(F).className))),"svelte-bov1j6"),xt(AA," ".concat((c(F),(z=QA(()=>c(F).text))!==null&&z!==void 0?z:"")))}),ue("click",U,z=>c(F).onClick(z)),lA(v,G)}),ve(()=>{var v;fn(Q,"title",l()),f=Xt(b,1,"jse-open-dropdown svelte-bov1j6",null,f,{"jse-visible":c(I)}),b.disabled=c(s),R=Xt(M,1,"jse-dropdown-items svelte-bov1j6",null,R,{"jse-visible":c(I)}),gl(M,"width: ".concat((v=C())!==null&&v!==void 0?v:"",";"))}),ue("click",b,function(){var v=c(I);setTimeout(()=>x(I,!v))}),ue("click",Q,d),lA(a,Q),St()})(t,{get width(){return _(i()),QA(()=>i().width)},get items(){return c(A)},$$slots:{defaultItem:(a,r)=>{var s=RDA(),g=cA(s),l=I=>{Pi(I,{get data(){return _(i()),QA(()=>i().main.icon)}})};YA(g,I=>{_(i()),QA(()=>i().main.icon)&&I(l)});var C=bA(g);ve(I=>{var d;Xt(s,1,I,"svelte-1y5l9l1"),fn(s,"title",(_(i()),QA(()=>i().main.title))),s.disabled=(_(i()),QA(()=>i().main.disabled||!1)),xt(C," ".concat((_(i()),(d=QA(()=>i().main.text))!==null&&d!==void 0?d:"")))},[()=>sI((_(gc),_(n()),_(i()),QA(()=>gc("jse-context-menu-button",n(),i().main.className))))]),ue("click",s,I=>{o()(),i().main.onClick(I)}),lA(a,s)}}}),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-contextmenu.svelte-1shjn02 { box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); background: var(--jse-context-menu-background, #656565); color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); } .jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) { display: flex; flex-direction: row; align-items: flex-start; justify-content: stretch; } .jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-label:where(.svelte-1shjn02) { flex: 1; white-space: nowrap; padding: var(--jse-padding, 10px); color: var(--jse-context-menu-color-disabled, #9d9d9d); line-height: normal; } .jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) { flex: 1; background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); color: var(--context-menu-tip-color, inherit); margin: calc(0.5 * var(--jse-padding, 10px)); padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); font-size: 80%; line-height: 1.3em; display: flex; flex-direction: row; align-items: flex-start; gap: var(--jse-padding, 10px); border-radius: 3px; } .jse-contextmenu.svelte-1shjn02 .jse-row:where(.svelte-1shjn02) div.jse-tip:where(.svelte-1shjn02) div.jse-tip-icon:where(.svelte-1shjn02) { padding-top: calc(0.5 * var(--jse-padding, 10px)); } .jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02) { flex: 1; display: flex; flex-direction: column; align-items: stretch; } .jse-contextmenu.svelte-1shjn02 .jse-column:where(.svelte-1shjn02):not(:last-child) { border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); } .jse-contextmenu.svelte-1shjn02 .jse-separator:where(.svelte-1shjn02) { width: 100%; height: 1px; background: var(--jse-context-menu-separator-color, #7a7a7a); }`);var NDA=FA('
      '),FDA=FA('
      '),LDA=FA('
      '),_DA=FA('
      '),GDA=FA('
      '),KDA=FA('
      '),UDA=FA('
      '),JDA=FA('');function D$(t,e){kt(e,!1);var A=N(e,"items",9),i=N(e,"onRequestClose",9),n=N(e,"tip",9),o=CA(void 0,!0);Jr(()=>{var I=Array.from(c(o).querySelectorAll("button")).find(d=>!d.disabled);I&&I.focus()});var a={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function r(I){return console.error("Unknown type of context menu item",I),"???"}$t(!0);var s=JDA(),g=cA(s);ea(g,1,A,ha,(I,d)=>{var B=yi(),Q=$e(B),E=b=>{eR(b,{get item(){return c(d)},get onRequestClose(){return i()}})},f=b=>{var R=yi(),M=$e(R),v=G=>{tR(G,{get item(){return c(d)},get onRequestClose(){return i()}})},F=G=>{var U=yi(),Y=$e(U),j=z=>{var yA=GDA();ea(yA,5,()=>(c(d),QA(()=>c(d).items)),ha,(P,nA)=>{var eA=yi(),dA=$e(eA),iA=hA=>{eR(hA,{get item(){return c(nA)},get onRequestClose(){return i()}})},aA=hA=>{var JA=yi(),ee=$e(JA),UA=KA=>{tR(KA,{get item(){return c(nA)},get onRequestClose(){return i()}})},mA=KA=>{var ze=yi(),Ke=$e(ze),HA=XA=>{var EA=LDA();ea(EA,5,()=>(c(nA),QA(()=>c(nA).items)),ha,(ZA,MA)=>{var be=yi(),_A=$e(be),pA=Et=>{eR(Et,{className:"left",get item(){return c(MA)},get onRequestClose(){return i()}})},Rt=Et=>{var Qe=yi(),_t=$e(Qe),Ue=ht=>{tR(ht,{className:"left",get item(){return c(MA)},get onRequestClose(){return i()}})},Te=ht=>{var Me=yi(),Ai=$e(Me),J=tA=>{lA(tA,NDA())},O=tA=>{var oA=yi(),NA=$e(oA),de=xA=>{var LA=FDA(),dt=cA(LA);ve(()=>xt(dt,(c(MA),QA(()=>c(MA).text)))),lA(xA,LA)},Ee=xA=>{var LA=tr();ve(dt=>xt(LA,dt),[()=>(c(MA),QA(()=>r(c(MA))))]),lA(xA,LA)};YA(NA,xA=>{_(kW),c(MA),QA(()=>kW(c(MA)))?xA(de):xA(Ee,!1)},!0),lA(tA,oA)};YA(Ai,tA=>{_(V2),c(MA),QA(()=>V2(c(MA)))?tA(J):tA(O,!1)},!0),lA(ht,Me)};YA(_t,ht=>{_(RQ),c(MA),QA(()=>RQ(c(MA)))?ht(Ue):ht(Te,!1)},!0),lA(Et,Qe)};YA(_A,Et=>{_(rC),c(MA),QA(()=>rC(c(MA)))?Et(pA):Et(Rt,!1)}),lA(ZA,be)}),lA(XA,EA)},uA=XA=>{var EA=yi(),ZA=$e(EA),MA=_A=>{lA(_A,_DA())},be=_A=>{var pA=tr();ve(Rt=>xt(pA,Rt),[()=>(c(nA),QA(()=>r(c(nA))))]),lA(_A,pA)};YA(ZA,_A=>{_(V2),c(nA),QA(()=>V2(c(nA)))?_A(MA):_A(be,!1)},!0),lA(XA,EA)};YA(Ke,XA=>{_(xW),c(nA),QA(()=>xW(c(nA)))?XA(HA):XA(uA,!1)},!0),lA(KA,ze)};YA(ee,KA=>{_(RQ),c(nA),QA(()=>RQ(c(nA)))?KA(UA):KA(mA,!1)},!0),lA(hA,JA)};YA(dA,hA=>{_(rC),c(nA),QA(()=>rC(c(nA)))?hA(iA):hA(aA,!1)}),lA(P,eA)}),lA(z,yA)},AA=z=>{var yA=yi(),P=$e(yA),nA=dA=>{lA(dA,KDA())},eA=dA=>{var iA=tr();ve(aA=>xt(iA,aA),[()=>(c(d),QA(()=>r(c(d))))]),lA(dA,iA)};YA(P,dA=>{_(V2),c(d),QA(()=>V2(c(d)))?dA(nA):dA(eA,!1)},!0),lA(z,yA)};YA(Y,z=>{_(SW),c(d),QA(()=>SW(c(d)))?z(j):z(AA,!1)},!0),lA(G,U)};YA(M,G=>{_(RQ),c(d),QA(()=>RQ(c(d)))?G(v):G(F,!1)},!0),lA(b,R)};YA(Q,b=>{_(rC),c(d),QA(()=>rC(c(d)))?b(E):b(f,!1)}),lA(I,B)});var l=bA(g,2),C=I=>{var d=UDA(),B=cA(d),Q=cA(B);Pi(cA(Q),{get data(){return YO}});var E=cA(bA(Q,2));ve(()=>xt(E,n())),lA(I,d)};YA(l,I=>{n()&&I(C)}),Mo(s,I=>x(o,I),()=>c(o)),ue("keydown",s,function(I){var d=fC(I),B=a[d];if(B&&I.target){I.preventDefault();var Q=C6A({allElements:Array.from(c(o).querySelectorAll("button:not([disabled])")),currentElement:I.target,direction:B,hasPrio:E=>E.getAttribute("data-type")!=="jse-open-dropdown"});Q&&Q.focus()}}),lA(t,s),St()}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-value.jse-string.svelte-1htmvf1 { color: var(--jse-value-color-string, #008000); } .jse-value.jse-object.svelte-1htmvf1, .jse-value.jse-array.svelte-1htmvf1 { min-width: 16px; color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); } .jse-value.jse-number.svelte-1htmvf1 { color: var(--jse-value-color-number, #ee422e); } .jse-value.jse-boolean.svelte-1htmvf1 { color: var(--jse-value-color-boolean, #ff8c00); } .jse-value.jse-null.svelte-1htmvf1 { color: var(--jse-value-color-null, #004ed0); } .jse-value.jse-invalid.svelte-1htmvf1 { color: var(--jse-text-color, #4d4d4d); } .jse-value.jse-url.svelte-1htmvf1 { color: var(--jse-value-color-url, #008000); text-decoration: underline; } .jse-enum-value.svelte-1htmvf1 { background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); border: none; padding: 0; font-family: inherit; font-size: inherit; cursor: pointer; outline: none; } .jse-enum-value.jse-selected.svelte-1htmvf1 { background: var(--jse-selection-background-color, #d3d3d3); color: inherit; } .jse-enum-value.jse-value.svelte-1htmvf1:focus { color: var(--jse-text-color, #4d4d4d); }`);var iBe=FA(""),nBe=FA("");var dD,BD;function QD(t,e){return dD||(BD=new WeakMap,dD=new ResizeObserver(A=>{for(var i of A){var n=BD.get(i.target);n&&n(i.target)}})),BD.set(t,e),dD.observe(t),{destroy:()=>{BD.delete(t),dD.unobserve(t)}}}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-tree-mode.svelte-10mlrw4 { flex: 1; display: flex; flex-direction: column; position: relative; background: var(--jse-background-color, #fff); min-width: 0; min-height: 0; font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: var(--jse-text-color, #4d4d4d); line-height: var(--jse-line-height, calc(1em + 4px)); } .jse-tree-mode.svelte-10mlrw4 .jse-hidden-input-label:where(.svelte-10mlrw4) .jse-hidden-input:where(.svelte-10mlrw4) { position: fixed; top: -10px; left: -10px; width: 1px; height: 1px; padding: 0; border: 0; outline: none; } .jse-tree-mode.no-main-menu.svelte-10mlrw4 { border-top: var(--jse-main-border, 1px solid #d7d7d7); } .jse-tree-mode.svelte-10mlrw4 .jse-search-box-container:where(.svelte-10mlrw4) { position: relative; height: 0; top: var(--jse-padding, 10px); margin-right: calc(var(--jse-padding, 10px) + 20px); margin-left: var(--jse-padding, 10px); text-align: right; z-index: 3; } .jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) { flex: 1; overflow: auto; position: relative; padding: 2px; display: flex; flex-direction: column; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4):last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading-space:where(.svelte-10mlrw4) { flex: 1; } .jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-loading:where(.svelte-10mlrw4) { flex: 2; text-align: center; color: var(--jse-panel-color-readonly, #b2b2b2); box-sizing: border-box; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); } .jse-tree-mode.svelte-10mlrw4 .jse-contents:where(.svelte-10mlrw4) .jse-search-box-background:where(.svelte-10mlrw4) { border: 50px solid var(--jse-modal-background, #f5f5f5); margin: -2px; margin-bottom: 2px; display: inline-block; }`);var YDA=FA(" ",1),HDA=FA('
      '),TDA=FA('
      ',1),ODA=FA(' ',1),zDA=FA('
      loading...
      '),PDA=FA('
      ',1);function LR(t,e){kt(e,!1);var A=CA(void 0,!0),i=qa("jsoneditor:TreeMode"),n=typeof window>"u";i("isSSR:",n);var o=w2(),a=w2(),{openAbsolutePopup:r,closeAbsolutePopup:s}=cI("absolute-popup"),g=CA(void 0,!0),l=CA(void 0,!0),C=CA(void 0,!0),I=!1,d=a$(),B=N(e,"readOnly",9),Q=N(e,"externalContent",9),E=N(e,"externalSelection",9),f=N(e,"history",9),b=N(e,"truncateTextSize",9),R=N(e,"mainMenuBar",9),M=N(e,"navigationBar",9),v=N(e,"escapeControlCharacters",9),F=N(e,"escapeUnicodeCharacters",9),G=N(e,"parser",9),U=N(e,"parseMemoizeOne",9),Y=N(e,"validator",9),j=N(e,"validationParser",9),AA=N(e,"pathParser",9),z=N(e,"indentation",9),yA=N(e,"onError",9),P=N(e,"onChange",9),nA=N(e,"onChangeMode",9),eA=N(e,"onSelect",9),dA=N(e,"onUndo",9),iA=N(e,"onRedo",9),aA=N(e,"onRenderValue",9),hA=N(e,"onRenderMenu",9),JA=N(e,"onRenderContextMenu",9),ee=N(e,"onClassName",9),UA=N(e,"onFocus",9),mA=N(e,"onBlur",9),KA=N(e,"onSortModal",9),ze=N(e,"onTransformModal",9),Ke=N(e,"onJSONEditorModal",9),HA=!1,uA=CA(!1,!0),XA=CA(void 0,!0);sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(C)),hasFocus:()=>HA&&document.hasFocus()||jR(c(C)),onFocus:()=>{I=!0,UA()&&UA()()},onBlur:()=>{I=!1,mA()&&mA()()}});var EA=CA(void 0,!0),ZA=CA(void 0,!0),MA=void 0,be=!1,_A=CA(uR({json:c(EA)}),!0),pA=CA(ru(E())?E():void 0,!0);function Rt(q){x(pA,q)}Jr(()=>{if(c(pA)){var q=st(c(pA));x(_A,ec(c(EA),c(_A),q,wD)),setTimeout(()=>mo(q))}});var Et,Qe=CA(void 0,!0),_t=CA(void 0,!0),Ue=CA(void 0,!0),Te=CA(void 0,!0),ht=CA(!1,!0),Me=CA(!1,!0);function Ai(q){x(Te,(Et=q)?jX(c(EA),Et.items):void 0)}function J(q,fA){return O.apply(this,arguments)}function O(){return(O=Ut(function*(q,fA){x(_A,ec(c(EA),c(_A),q,wD));var PA=io(fA);yield Mi(q,{element:PA})})).apply(this,arguments)}function tA(){x(ht,!1),x(Me,!1),Mt()}function oA(q){i("select validation error",q),x(pA,_i(q.path)),Mi(q.path)}function NA(q){var fA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:fR;i("expand"),x(_A,ec(c(EA),c(_A),q,fA))}function de(q,fA){x(_A,LW(c(EA),c(_A),q,fA)),c(pA)&&(function(PA,Ne){return I0(st(PA),Ne)&&(st(PA).length>Ne.length||Ka(PA))})(c(pA),q)&&x(pA,void 0)}var Ee=CA(!1,!0),xA=CA([],!0),LA=CA(void 0,!0),dt=VB(r$);function At(q,fA,PA,Ne){OQ(()=>{var pe;try{pe=dt(q,fA,PA,Ne)}catch(we){pe=[{path:[],message:"Failed to validate: "+we.message,severity:ic.warning}]}di(pe,c(xA))||(i("validationErrors changed:",pe),x(xA,pe),x(LA,(function(we,it){var zt;return it.forEach(bi=>{zt=rZ(we,zt,bi.path,(Dn,Hi)=>ye(ye({},Hi),{},{validationError:bi}))}),it.forEach(bi=>{for(var Dn=bi.path;Dn.length>0;)Dn=Li(Dn),zt=rZ(we,zt,Dn,(Hi,no)=>no.validationError?no:ye(ye({},no),{},{validationError:{isChildError:!0,path:Dn,message:"Contains invalid data",severity:ic.warning}}))}),zt})(q,c(xA))))},pe=>i("validationErrors updated in ".concat(pe," ms")))}function Je(){return i("validate"),MA?{parseError:MA,isRepairable:!1}:(At(c(EA),Y(),G(),j()),zi(c(xA))?void 0:{validationErrors:c(xA)})}function Ge(){return c(EA)}function ri(){return c(_A)}function en(){return c(pA)}function rn(q){i("applyExternalContent",{updatedContent:q}),iu(q)?(function(fA){if(fA!==void 0){var PA=!di(c(EA),fA);if(i("update external json",{isChanged:PA,currentlyText:c(EA)===void 0}),!!PA){var Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};x(EA,fA),x(_A,wg(fA,c(_A))),Le(c(EA)),x(ZA,void 0),x(Ee,!1),MA=void 0,ji(c(EA)),Bi(Ne)}}})(q.json):tu(q)&&(function(fA){if(!(fA===void 0||iu(Q()))){var PA=fA!==c(ZA);if(i("update external text",{isChanged:PA}),!!PA){var Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};try{x(EA,U()(fA)),x(_A,wg(c(EA),c(_A))),Le(c(EA)),x(ZA,fA),x(Ee,!1),MA=void 0}catch(pe){try{x(EA,U()(jg(fA))),x(_A,wg(c(EA),c(_A))),Le(c(EA)),x(ZA,fA),x(Ee,!0),MA=void 0,ji(c(EA))}catch(we){x(EA,void 0),x(_A,void 0),x(ZA,Q().text),x(Ee,!1),MA=c(ZA)!==void 0&&c(ZA)!==""?nE(c(ZA),pe.message||String(pe)):void 0}}ji(c(EA)),Bi(Ne)}}})(q.text)}function Le(q){be||(be=!0,x(_A,$1(q,c(_A),[])))}function ji(q){c(pA)&&(cr(q,O1(c(pA)))&&cr(q,st(c(pA)))||(i("clearing selection: path does not exist anymore",c(pA)),x(pA,NQ(q,c(_A)))))}function Bi(q){if(q.json!==void 0||q.text!==void 0){var fA=c(EA)!==void 0&&q.json!==void 0;f().add({type:"tree",undo:{patch:fA?[{op:"replace",path:"",value:q.json}]:void 0,json:q.json,text:q.text,documentState:q.documentState,textIsRepaired:q.textIsRepaired,selection:r0(q.selection),sortedColumn:void 0},redo:{patch:fA?[{op:"replace",path:"",value:c(EA)}]:void 0,json:c(EA),text:c(ZA),documentState:c(_A),textIsRepaired:c(Ee),selection:r0(c(pA)),sortedColumn:void 0}})}}function vi(q,fA){var PA;if(i("patch",q,fA),c(EA)===void 0)throw new Error("Cannot apply patch: no JSON");var Ne=c(EA),pe={json:void 0,text:c(ZA),documentState:c(_A),selection:r0(c(pA)),textIsRepaired:c(Ee),sortedColumn:void 0},we=PX(c(EA),q),it=FX(c(EA),c(_A),q),zt=(PA=rE(c(EA),q))!==null&&PA!==void 0?PA:c(pA),bi=typeof fA=="function"?fA(it.json,it.documentState,zt):void 0;return x(EA,bi?.json!==void 0?bi.json:it.json),x(_A,bi?.state!==void 0?bi.state:it.documentState),x(pA,bi?.selection!==void 0?bi.selection:zt),x(ZA,void 0),x(Ee,!1),x(_t,void 0),x(Ue,void 0),MA=void 0,ji(c(EA)),f().add({type:"tree",undo:ye({patch:we},pe),redo:{patch:q,json:void 0,text:c(ZA),documentState:c(_A),selection:r0(c(pA)),sortedColumn:void 0,textIsRepaired:c(Ee)}}),{json:c(EA),previousJson:Ne,undo:we,redo:q}}function Ji(){!B()&&c(pA)&&x(pA,oN(st(c(pA))))}function Dt(){if(!B()&&c(pA)){var q=st(c(pA)),fA=Pe(c(EA),q);jo(fA)?(function(PA,Ne){i("openJSONEditorModal",{path:PA,value:Ne}),HA=!0,Ke()({content:{json:Ne},path:PA,onPatch:c(w).onPatch,onClose:()=>{HA=!1,setTimeout(Mt)}})})(q,fA):x(pA,GD(q))}}function qi(){if(!B()&&an(c(pA))){var q=st(c(pA)),fA=pt(q),PA=Pe(c(EA),q),Ne=!g0(c(EA),c(_A),q),pe=Ne?String(PA):EE(String(PA),G());i("handleToggleEnforceString",{enforceString:Ne,value:PA,updatedValue:pe}),VA([{op:"replace",path:fA,value:pe}],(we,it)=>({state:Aw(c(EA),it,q,{type:"value",enforceString:Ne})}))}}function Nt(){return c(Ee)&&c(EA)!==void 0&&me(c(EA)),c(EA)!==void 0?{json:c(EA)}:{text:c(ZA)||""}}function L(){return gt.apply(this,arguments)}function gt(){return gt=Ut(function*(){var q=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield E$({json:c(EA),selection:c(pA),indentation:q?z():void 0,readOnly:B(),parser:G(),onPatch:VA})}),gt.apply(this,arguments)}function gi(){return sn.apply(this,arguments)}function sn(){return sn=Ut(function*(){var q=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(EA)!==void 0&&(yield h$({json:c(EA),selection:c(pA),indentation:q?z():void 0,parser:G()}))}),sn.apply(this,arguments)}function gn(q){var fA;q.preventDefault(),eo((fA=q.clipboardData)===null||fA===void 0?void 0:fA.getData("text/plain"))}function Kn(){return ko.apply(this,arguments)}function ko(){return(ko=Ut(function*(){try{eo(yield navigator.clipboard.readText())}catch(q){console.error(q),x(uA,!0)}})).apply(this,arguments)}function eo(q){q!==void 0&&u$({clipboardText:q,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onChangeText:IA,onPasteMultilineText:Sn,openRepairModal:fo})}function fo(q,fA){x(XA,{text:q,onParse:PA=>fu(PA,Ne=>uu(Ne,G())),onRepair:fX,onApply:fA,onClose:Mt})}function Go(){f$({json:c(EA),text:c(ZA),selection:c(pA),keepSelection:!1,readOnly:B(),onChange:P(),onPatch:VA})}function co(){!B()&&c(EA)!==void 0&&c(pA)&&HQ&&!zi(st(c(pA)))&&(i("duplicate",{selection:c(pA)}),VA(HX(c(EA),gI(c(EA),c(pA)))))}function ta(){B()||!c(pA)||!$n(c(pA))&&!an(c(pA))||zi(st(c(pA)))||(i("extract",{selection:c(pA)}),VA(TX(c(EA),c(pA)),(q,fA)=>{if(jo(q))return{state:jx(q,fA,[])}}))}function Ko(q){jD({insertType:q,selectInside:!0,initialValue:void 0,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onReplaceJson:me})}function qo(q){ja(c(pA))&&x(pA,_i(c(pA).path)),c(pA)||x(pA,NQ(c(EA),c(_A))),Ko(q)}function Co(q){if(!B()&&c(pA))if(gD(c(pA)))try{var fA=O1(c(pA)),PA=Pe(c(EA),fA),Ne=(function(we,it,zt){if(it==="array"){if(Array.isArray(we))return we;if(Qn(we))return mW(we);if(typeof we=="string")try{var bi=zt.parse(we);if(Array.isArray(bi))return bi;if(Qn(bi))return mW(bi)}catch(Hi){return[we]}return[we]}if(it==="object"){if(Array.isArray(we))return fW(we);if(Qn(we))return we;if(typeof we=="string")try{var Dn=zt.parse(we);if(Qn(Dn))return Dn;if(Array.isArray(Dn))return fW(Dn)}catch(Hi){return{value:we}}return{value:we}}if(it==="value")return jo(we)?zt.stringify(we):we;throw new Error("Cannot convert ".concat(OR(we,zt)," to ").concat(it))})(PA,q,G());if(Ne===PA)return;var pe=[{op:"replace",path:pt(fA),value:Ne}];i("handleConvert",{selection:c(pA),path:fA,type:q,operations:pe}),VA(pe,(we,it)=>({state:c(pA)?$1(we,it,st(c(pA))):c(_A)}))}catch(we){yA()(we)}else yA()(new Error("Cannot convert current selection to ".concat(q)))}function se(){if(c(pA)){var q=UW(c(EA),c(_A),c(pA),!1),fA=Li(st(c(pA)));q&&!zi(st(q))&&di(fA,Li(st(q)))?x(pA,QC(st(q))):x(pA,pC(fA)),i("insert before",{selection:c(pA),selectionBefore:q,parentPath:fA}),uo(),Gi()}}function Ci(){if(c(pA)){var q=rI(c(EA),c(pA));i("insert after",q),x(pA,QC(q)),uo(),Gi()}}function tn(q){return ln.apply(this,arguments)}function ln(){return(ln=Ut(function*(q){yield m$({char:q,selectInside:!0,json:c(EA),selection:c(pA),readOnly:B(),parser:G(),onPatch:VA,onReplaceJson:me,onSelect:Rt})})).apply(this,arguments)}function So(){if(!B()&&f().canUndo){var q=f().undo();if(LD(q)){var fA={json:c(EA),text:c(ZA)};x(EA,q.undo.patch?Js(c(EA),q.undo.patch):q.undo.json),x(_A,q.undo.documentState),x(pA,q.undo.selection),x(ZA,q.undo.text),x(Ee,q.undo.textIsRepaired),MA=void 0,i("undo",{item:q,json:c(EA),documentState:c(_A),selection:c(pA)}),vA(fA,q.undo.patch&&q.redo.patch?{json:c(EA),previousJson:fA.json,redo:q.undo.patch,undo:q.redo.patch}:void 0),Mt(),c(pA)&&Mi(st(c(pA)),{scrollToWhenVisible:!1})}else dA()(q)}}function la(){if(!B()&&f().canRedo){var q=f().redo();if(LD(q)){var fA={json:c(EA),text:c(ZA)};x(EA,q.redo.patch?Js(c(EA),q.redo.patch):q.redo.json),x(_A,q.redo.documentState),x(pA,q.redo.selection),x(ZA,q.redo.text),x(Ee,q.redo.textIsRepaired),MA=void 0,i("redo",{item:q,json:c(EA),documentState:c(_A),selection:c(pA)}),vA(fA,q.undo.patch&&q.redo.patch?{json:c(EA),previousJson:fA.json,redo:q.redo.patch,undo:q.undo.patch}:void 0),Mt(),c(pA)&&Mi(st(c(pA)),{scrollToWhenVisible:!1})}else iA()(q)}}function pi(q){var fA;B()||c(EA)===void 0||(HA=!0,KA()({id:o,json:c(EA),rootPath:q,onSort:(fA=Ut(function*(PA){var{operations:Ne}=PA;i("onSort",q,Ne),VA(Ne,(pe,we)=>({state:jx(pe,we,q),selection:_i(q)}))}),function(PA){return fA.apply(this,arguments)}),onClose:()=>{HA=!1,setTimeout(Mt)}}))}function to(){c(pA)&&pi(YW(c(EA),c(pA)))}function Ja(){pi([])}function Io(q){if(c(EA)!==void 0){var{id:fA,onTransform:PA,onClose:Ne}=q,pe=q.rootPath||[];HA=!0,ze()({id:fA||a,json:c(EA),rootPath:pe,onTransform:we=>{PA?PA({operations:we,json:c(EA),transformedJson:Js(c(EA),we)}):(i("onTransform",pe,we),VA(we,(it,zt)=>({state:jx(it,zt,pe),selection:_i(pe)})))},onClose:()=>{HA=!1,setTimeout(Mt),Ne&&Ne()}})}}function Sa(){c(pA)&&Io({rootPath:YW(c(EA),c(pA))})}function kn(){Io({rootPath:[]})}function Mi(q){return Ot.apply(this,arguments)}function Ot(){return Ot=Ut(function*(q){var{scrollToWhenVisible:fA=!0,element:PA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};x(_A,ec(c(EA),c(_A),q,wD));var Ne=PA??pn(q);if(i("scrollTo",{path:q,elem:Ne,refContents:c(g)}),!Ne||!c(g))return Promise.resolve();var pe=c(g).getBoundingClientRect(),we=Ne.getBoundingClientRect();if(!fA&&we.bottom>pe.top&&we.top{d(Ne,{container:c(g),offset:it,duration:300,callback:()=>zt()})})}),Ot.apply(this,arguments)}function pn(q){var fA,PA;return uo(),(fA=(PA=c(g))===null||PA===void 0?void 0:PA.querySelector('div[data-path="'.concat(DD(q),'"]')))!==null&&fA!==void 0?fA:void 0}function io(q){var fA,PA;return uo(),(fA=(PA=c(g))===null||PA===void 0?void 0:PA.querySelector('span[data-search-result-index="'.concat(q,'"]')))!==null&&fA!==void 0?fA:void 0}function mo(q){var fA=pn(q);if(fA&&c(g)){var PA=c(g).getBoundingClientRect(),Ne=fA.getBoundingClientRect(),pe=jo(Pe(c(EA),q))?20:Ne.height;Ne.topPA.bottom-20&&d(fA,{container:c(g),offset:-(PA.height-pe-20),duration:0})}}function vA(q,fA){if(q.json!==void 0||q?.text!==void 0){if(c(ZA)!==void 0){var PA,Ne={text:c(ZA),json:void 0};(PA=P())===null||PA===void 0||PA(Ne,q,{contentErrors:Je(),patchResult:fA})}else if(c(EA)!==void 0){var pe,we={text:void 0,json:c(EA)};(pe=P())===null||pe===void 0||pe(we,q,{contentErrors:Je(),patchResult:fA})}}}function VA(q,fA){i("handlePatch",q,fA);var PA={json:c(EA),text:c(ZA)},Ne=vi(q,fA);return vA(PA,Ne),Ne}function me(q,fA){var PA={json:c(EA),text:c(ZA)},Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)},pe=ec(c(EA),wg(q,c(_A)),[],W3),we=typeof fA=="function"?fA(q,pe,c(pA)):void 0;x(EA,we?.json!==void 0?we.json:q),x(_A,we?.state!==void 0?we.state:pe),x(pA,we?.selection!==void 0?we.selection:c(pA)),x(ZA,void 0),x(Ee,!1),MA=void 0,ji(c(EA)),Bi(Ne),vA(PA,void 0)}function IA(q,fA){i("handleChangeText");var PA={json:c(EA),text:c(ZA)},Ne={documentState:c(_A),selection:c(pA),json:c(EA),text:c(ZA),textIsRepaired:c(Ee)};try{x(EA,U()(q)),x(_A,ec(c(EA),wg(c(EA),c(_A)),[],W3)),x(ZA,void 0),x(Ee,!1),MA=void 0}catch(we){try{x(EA,U()(jg(q))),x(_A,ec(c(EA),wg(c(EA),c(_A)),[],W3)),x(ZA,q),x(Ee,!0),MA=void 0}catch(it){x(EA,void 0),x(_A,uR({json:c(EA),expand:W3})),x(ZA,q),x(Ee,!1),MA=c(ZA)!==""?nE(c(ZA),we.message||String(we)):void 0}}if(typeof fA=="function"){var pe=fA(c(EA),c(_A),c(pA));x(EA,pe?.json!==void 0?pe.json:c(EA)),x(_A,pe?.state!==void 0?pe.state:c(_A)),x(pA,pe?.selection!==void 0?pe.selection:c(pA))}ji(c(EA)),Bi(Ne),vA(PA,void 0)}function SA(q,fA){var PA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i("handleExpand",{path:q,expanded:fA,recursive:PA}),fA?NA(q,PA?nN:fR):de(q,PA),Mt()}function re(){SA([],!0,!0)}function Se(){SA([],!1,!0)}function tt(q){i("openFind",{findAndReplace:q}),x(ht,!1),x(Me,!1),uo(),x(ht,!0),x(Me,q)}function at(q,fA){i("handleExpandSection",q,fA),x(_A,(function(PA,Ne,pe,we){return aE(PA,Ne,pe,(it,zt)=>{if(!Pa(zt))return zt;var bi=xX(zt.visibleSections.concat(we));return ye(ye({},zt),{},{visibleSections:bi})})})(c(EA),c(_A),q,fA))}function bt(q){i("pasted json as text",q),x(_t,q)}function Sn(q){i("pasted multiline text",{pastedText:q}),x(Ue,q)}function ki(q){var fA,{anchor:PA,left:Ne,top:pe,width:we,height:it,offsetTop:zt,offsetLeft:bi,showTip:Dn}=q,Hi=(function(Jn){var{json:Jo,documentState:Cn,selection:Lt,readOnly:Vi,onEditKey:Vt,onEditValue:mt,onToggleEnforceString:si,onCut:Wo,onCopy:Yn,onPaste:Yo,onRemove:ia,onDuplicate:nr,onExtract:u0,onInsertBefore:ng,onInsert:dl,onConvert:Ec,onInsertAfter:Bl,onSort:Hr,onTransform:or}=Jn,og=Jo!==void 0,f0=!!Lt,ag=!!Lt&&zi(st(Lt)),wn=Lt?Pe(Jo,st(Lt)):void 0,ua=Array.isArray(wn)?"Edit array":Qn(wn)?"Edit object":"Edit value",fa=og&&($n(Lt)||ja(Lt)||an(Lt)),mI=Lt&&!ag?Pe(Jo,Li(st(Lt))):void 0,dd=!Vi&&og&&_D(Lt)&&!ag&&!Array.isArray(mI),pI=!Vi&&og&&Lt!==void 0&&_D(Lt),YE=pI&&!jo(wn),Bd=!Vi&&fa,HE=fa,lv=!Vi&&f0,cv=!Vi&&og&&fa&&!ag,Cv=!Vi&&og&&Lt!==void 0&&($n(Lt)||an(Lt))&&!ag,hc=fa,DI=hc?"Convert to:":"Insert:",ma=!Vi&&(Ka(Lt)&&Array.isArray(wn)||Xs(Lt)&&Array.isArray(mI)),kg=!Vi&&(hc?gD(Lt)&&!Qn(wn):f0),TE=!Vi&&(hc?gD(Lt)&&!Array.isArray(wn):f0),OE=!Vi&&(hc?gD(Lt)&&jo(wn):f0),wI=Lt!==void 0&&g0(Jo,Cn,st(Lt));function fr(zE){fa?zE!=="structure"&&Ec(zE):dl(zE)}return[{type:"row",items:[{type:"button",onClick:()=>Vt(),icon:s1,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!dd},{type:"dropdown-button",main:{type:"button",onClick:()=>mt(),icon:s1,text:ua,title:"Edit the value (Double-click on the value)",disabled:!pI},width:"11em",items:[{type:"button",icon:s1,text:ua,title:"Edit the value (Double-click on the value)",onClick:()=>mt(),disabled:!pI},{type:"button",icon:wI?CM:BM,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>si(),disabled:!YE}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>Wo(!0),icon:g1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Bd},width:"10em",items:[{type:"button",icon:g1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Wo(!0),disabled:!Bd},{type:"button",icon:g1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Wo(!1),disabled:!Bd}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Yn(!0),icon:j0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!HE},width:"12em",items:[{type:"button",icon:j0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Yn(!0),disabled:!HE},{type:"button",icon:j0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Yn(!1),disabled:!HE}]},{type:"button",onClick:()=>Yo(),icon:gM,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!lv}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>nr(),icon:cM,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!cv},{type:"button",onClick:()=>u0(),icon:TO,text:"Extract",title:"Extract selected contents",disabled:!Cv},{type:"button",onClick:()=>Hr(),icon:V4,text:"Sort",title:"Sort array or object contents",disabled:Vi||!fa},{type:"button",onClick:()=>or(),icon:z4,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:Vi||!fa},{type:"button",onClick:()=>ia(),icon:s8,text:"Remove",title:"Remove selected contents (Delete)",disabled:Vi||!fa}]},{type:"column",items:[{type:"label",text:DI},{type:"button",onClick:()=>fr("structure"),icon:hc?W4:l1,text:"Structure",title:DI+" structure like the first item in the array",disabled:!ma},{type:"button",onClick:()=>fr("object"),icon:hc?W4:l1,text:"Object",title:DI+" object",disabled:!kg},{type:"button",onClick:()=>fr("array"),icon:hc?W4:l1,text:"Array",title:DI+" array",disabled:!TE},{type:"button",onClick:()=>fr("value"),icon:hc?W4:l1,text:"Value",title:DI+" value",disabled:!OE}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>ng(),icon:WO,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:Vi||!fa||ag},{type:"button",onClick:()=>Bl(),icon:OO,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:Vi||!fa||ag}]}]})({json:c(EA),documentState:c(_A),selection:c(pA),readOnly:B(),onEditKey:Ji,onEditValue:Dt,onToggleEnforceString:qi,onCut:L,onCopy:gi,onPaste:Kn,onRemove:Go,onDuplicate:co,onExtract:ta,onInsertBefore:se,onInsert:qo,onInsertAfter:Ci,onConvert:Co,onSort:to,onTransform:Sa}),no=(fA=JA()(Hi))!==null&&fA!==void 0?fA:Hi;if(no!==!1){var qt={left:Ne,top:pe,offsetTop:zt,offsetLeft:bi,width:we,height:it,anchor:PA,closeOnOuterClick:!0,onClose:()=>{HA=!1,Mt()}};HA=!0;var Uo=r(D$,{tip:Dn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:no,onRequestClose:()=>s(Uo)},qt)}}function Gi(q){if(!za(c(pA)))if(q&&(q.stopPropagation(),q.preventDefault()),q&&q.type==="contextmenu"&&q.target!==c(l))ki({left:q.clientX,top:q.clientY,width:cC,height:lC,showTip:!1});else{var fA,PA=(fA=c(g))===null||fA===void 0?void 0:fA.querySelector(".jse-context-menu-pointer.jse-selected");if(PA)ki({anchor:PA,offsetTop:2,width:cC,height:lC,showTip:!1});else{var Ne,pe=(Ne=c(g))===null||Ne===void 0?void 0:Ne.getBoundingClientRect();pe&&ki({top:pe.top+2,left:pe.left+2,width:cC,height:lC,showTip:!1})}}}function jt(q){ki({anchor:kX(q.target,"BUTTON"),offsetTop:0,width:cC,height:lC,showTip:!0})}function Si(){return ca.apply(this,arguments)}function ca(){return(ca=Ut(function*(){if(i("apply pasted json",c(_t)),c(_t)){var{onPasteAsJson:q}=c(_t);x(_t,void 0),q(),setTimeout(Mt)}})).apply(this,arguments)}function Ft(){return rt.apply(this,arguments)}function rt(){return(rt=Ut(function*(){i("apply pasted multiline text",c(Ue)),c(Ue)&&(eo(JSON.stringify(c(Ue))),setTimeout(Mt))})).apply(this,arguments)}function xi(){i("clear pasted json"),x(_t,void 0),Mt()}function Yi(){i("clear pasted multiline text"),x(Ue,void 0),Mt()}function Un(){nA()(ga.text)}function cn(q){x(pA,q),Mt(),Mi(st(q))}function Mt(){i("focus"),c(l)&&(c(l).focus(),c(l).select())}function Vo(q){return(function(fA,PA,Ne){var pe=Li(Ne),we=[fi(Ne)],it=Pe(fA,pe),zt=it?Px(it,PA,we):void 0;return zt?_i(pe.concat(zt)):QC(Ne)})(c(EA),c(_A),q)}function xo(q){c(A)&&c(A).onDrag(q)}function u(){c(A)&&c(A).onDragEnd()}var w=CA(void 0,!0);RA(()=>c(pA),()=>{var q;q=c(pA),di(q,E())||(i("onSelect",q),eA()(q))}),RA(()=>(_(v()),_(F())),()=>{x(Qe,zR({escapeControlCharacters:v(),escapeUnicodeCharacters:F()}))}),RA(()=>c(ht),()=>{(function(q){c(g)&&q&&c(g).scrollTop===0&&(yg(g,c(g).style.overflowAnchor="none"),yg(g,c(g).scrollTop+=V3),setTimeout(()=>{c(g)&&yg(g,c(g).style.overflowAnchor="")}))})(c(ht))}),RA(()=>_(Q()),()=>{rn(Q())}),RA(()=>_(E()),()=>{(function(q){di(c(pA),q)||(i("applyExternalSelection",{selection:c(pA),externalSelection:q}),ru(q)&&x(pA,q))})(E())}),RA(()=>(c(EA),_(Y()),_(G()),_(j())),()=>{At(c(EA),Y(),G(),j())}),RA(()=>(c(g),aZ),()=>{x(A,c(g)?aZ(c(g)):void 0)}),RA(()=>(_(B()),_(b()),_(G()),c(Qe),_(aA()),_(ee())),()=>{x(w,{mode:ga.tree,readOnly:B(),truncateTextSize:b(),parser:G(),normalization:c(Qe),getJson:Ge,getDocumentState:ri,getSelection:en,findElement:pn,findNextInside:Vo,focus:Mt,onPatch:VA,onInsert:Ko,onExpand:SA,onSelect:Rt,onFind:tt,onExpandSection:at,onPasteJson:bt,onRenderValue:aA(),onContextMenu:ki,onClassName:ee()||(()=>{}),onDrag:xo,onDragEnd:u})}),RA(()=>c(w),()=>{i("context changed",c(w))}),mn();var S={expand:NA,collapse:de,validate:Je,getJson:Ge,patch:vi,acceptAutoRepair:Nt,openTransformModal:Io,scrollTo:Mi,findElement:pn,findSearchResult:io,focus:Mt};$t(!0);var T=PDA();ue("mousedown",dC,function(q){!hE(q.target,fA=>fA===c(C))&&za(c(pA))&&(i("click outside the editor, exit edit mode"),x(pA,r0(c(pA))),I&&c(l)&&(c(l).focus(),c(l).blur()),i("blur (outside editor)"),c(l)&&c(l).blur())});var k,H=$e(T),Z=cA(H),gA=q=>{(function(fA,PA){kt(PA,!1);var Ne=CA(void 0,!0),pe=CA(void 0,!0),we=CA(void 0,!0),it=N(PA,"json",9),zt=N(PA,"selection",9),bi=N(PA,"readOnly",9),Dn=N(PA,"showSearch",13,!1),Hi=N(PA,"history",9),no=N(PA,"onExpandAll",9),qt=N(PA,"onCollapseAll",9),Uo=N(PA,"onUndo",9),Jn=N(PA,"onRedo",9),Jo=N(PA,"onSort",9),Cn=N(PA,"onTransform",9),Lt=N(PA,"onContextMenu",9),Vi=N(PA,"onCopy",9),Vt=N(PA,"onRenderMenu",9);function mt(){Dn(!Dn())}var si=CA(void 0,!0),Wo=CA(void 0,!0),Yn=CA(void 0,!0),Yo=CA(void 0,!0);RA(()=>_(it()),()=>{x(Ne,it()!==void 0)}),RA(()=>(c(Ne),_(zt()),an),()=>{x(pe,c(Ne)&&($n(zt())||ja(zt())||an(zt())))}),RA(()=>(_(no()),_(it())),()=>{x(si,{type:"button",icon:c$,title:"Expand all",className:"jse-expand-all",onClick:no(),disabled:!jo(it())})}),RA(()=>(_(qt()),_(it())),()=>{x(Wo,{type:"button",icon:C$,title:"Collapse all",className:"jse-collapse-all",onClick:qt(),disabled:!jo(it())})}),RA(()=>_(it()),()=>{x(Yn,{type:"button",icon:P4,title:"Search (Ctrl+F)",className:"jse-search",onClick:mt,disabled:it()===void 0})}),RA(()=>(_(bi()),c(si),c(Wo),_(Jo()),_(it()),_(Cn()),c(Yn),_(Lt()),_(Uo()),_(Hi()),_(Jn()),_(Vi()),c(pe)),()=>{x(Yo,bi()?[c(si),c(Wo),{type:"separator"},{type:"button",icon:j0,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:Vi(),disabled:!c(pe)},{type:"separator"},c(Yn),{type:"space"}]:[c(si),c(Wo),{type:"separator"},{type:"button",icon:V4,title:"Sort",className:"jse-sort",onClick:Jo(),disabled:bi()||it()===void 0},{type:"button",icon:z4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Cn(),disabled:bi()||it()===void 0},c(Yn),{type:"button",icon:lM,title:WR,className:"jse-contextmenu",onClick:Lt()},{type:"separator"},{type:"button",icon:c8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Uo(),disabled:!Hi().canUndo},{type:"button",icon:l8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Jn(),disabled:!Hi().canRedo},{type:"space"}])}),RA(()=>(_(Vt()),c(Yo)),()=>{x(we,Vt()(c(Yo))||c(Yo))}),mn(),$t(!0),aw(fA,{get items(){return c(we)}}),St()})(q,{get json(){return c(EA)},get selection(){return c(pA)},get readOnly(){return B()},get history(){return f()},onExpandAll:re,onCollapseAll:Se,onUndo:So,onRedo:la,onSort:Ja,onTransform:kn,onContextMenu:jt,onCopy:gi,get onRenderMenu(){return hA()},get showSearch(){return c(ht)},set showSearch(fA){x(ht,fA)},$$legacy:!0})};YA(Z,q=>{R()&&q(gA)});var DA=bA(Z,2),Ae=q=>{uDA(q,{get json(){return c(EA)},get selection(){return c(pA)},onSelect:cn,get onError(){return yA()},get pathParser(){return AA()}})};YA(DA,q=>{M()&&q(Ae)});var ne=bA(DA,2),Be=q=>{var fA=ODA(),PA=$e(fA),Ne=cA(PA);Ne.readOnly=!0,Mo(Ne,zt=>x(l,zt),()=>c(l));var pe=bA(PA,2),we=zt=>{var bi=yi(),Dn=$e(bi),Hi=qt=>{(function(Uo,Jn){function Jo(si){si.stopPropagation(),Jn.onCreateObject()}function Cn(si){si.stopPropagation(),Jn.onCreateArray()}kt(Jn,!0);var Lt=aDA();Lt.__click=()=>Jn.onClick();var Vi=bA(cA(Lt),2),Vt=bA(cA(Vi),2),mt=si=>{var Wo=oDA(),Yn=bA($e(Wo),2);fn(Yn,"title","Create an empty JSON object (press '{')"),Yn.__click=Jo;var Yo=bA(Yn,2);fn(Yo,"title","Create an empty JSON array (press '[')"),Yo.__click=Cn,lA(si,Wo)};YA(Vt,si=>{Jn.readOnly||si(mt)}),lA(Uo,Lt),St()})(qt,{get readOnly(){return B()},onCreateObject:()=>{Mt(),tn("{")},onCreateArray:()=>{Mt(),tn("[")},onClick:()=>{Mt()}})},no=qt=>{var Uo=YDA(),Jn=$e(Uo),Jo=et(()=>B()?[]:[{icon:j4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Un}]);Mg(Jn,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(Jo)}}),p$(bA(Jn,2),{get text(){return c(ZA)},get json(){return c(EA)},get indentation(){return z()},get parser(){return G()}}),lA(qt,Uo)};YA(Dn,qt=>{c(ZA)===""||c(ZA)===void 0?qt(Hi):qt(no,!1)}),lA(zt,bi)},it=zt=>{var bi=TDA(),Dn=$e(bi);d$(cA(Dn),{get json(){return c(EA)},get documentState(){return c(_A)},get parser(){return G()},get showSearch(){return c(ht)},get showReplace(){return c(Me)},get readOnly(){return B()},columns:void 0,onSearch:Ai,onFocus:J,onPatch:VA,onClose:tA});var Hi=bA(Dn,2);fn(Hi,"data-jsoneditor-scrollable-contents",!0);var no=cA(Hi),qt=Vt=>{lA(Vt,HDA())};YA(no,Vt=>{c(ht)&&Vt(qt)}),kR(bA(no,2),{get value(){return c(EA)},pointer:"",get state(){return c(_A)},get validationErrors(){return c(LA)},get searchResults(){return c(Te)},get selection(){return c(pA)},get context(){return c(w)},get onDragSelectionStart(){return ra}}),Mo(Hi,Vt=>x(g,Vt),()=>c(g));var Uo=bA(Hi,2),Jn=Vt=>{var mt=et(()=>(c(_t),QA(()=>"You pasted a JSON ".concat(Array.isArray(c(_t).contents)?"array":"object"," as text")))),si=et(()=>[{icon:P0,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Si},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:xi}]);Mg(Vt,{type:"info",get message(){return c(mt)},get actions(){return c(si)}})};YA(Uo,Vt=>{c(_t)&&Vt(Jn)});var Jo=bA(Uo,2),Cn=Vt=>{var mt=et(()=>[{icon:P0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Ft},{text:"Leave as is",title:"Keep the pasted array",onClick:Yi}]);Mg(Vt,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(mt)}})};YA(Jo,Vt=>{c(Ue)&&Vt(Cn)});var Lt=bA(Jo,2),Vi=Vt=>{var mt=et(()=>B()?[]:[{icon:g8,text:"Ok",title:"Accept the repaired document",onClick:Nt},{icon:j4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Un}]);Mg(Vt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(mt)},onClose:Mt})};YA(Lt,Vt=>{c(Ee)&&Vt(Vi)}),gN(bA(Lt,2),{get validationErrors(){return c(xA)},selectError:oA}),lA(zt,bi)};YA(pe,zt=>{c(EA)===void 0?zt(we):zt(it,!1)}),ue("paste",Ne,gn),lA(q,fA)},Ye=q=>{lA(q,zDA())};YA(ne,q=>{n?q(Ye,!1):q(Be)}),Mo(H,q=>x(C,q),()=>c(C));var ke=bA(H,2),Re=q=>{s$(q,{onClose:()=>x(uA,!1)})};YA(ke,q=>{c(uA)&&q(Re)});var ii=bA(ke,2),xn=q=>{g$(q,oI(()=>c(XA),{onClose:()=>{var fA;(fA=c(XA))===null||fA===void 0||fA.onClose(),x(XA,void 0)}}))};return YA(ii,q=>{c(XA)&&q(xn)}),ve(()=>k=Xt(H,1,"jse-tree-mode svelte-10mlrw4",null,k,{"no-main-menu":!R()})),ue("keydown",H,function(q){var fA=fC(q),PA=q.shiftKey;if(i("keydown",{combo:fA,key:q.key}),fA==="Ctrl+X"&&(q.preventDefault(),L(!0)),fA==="Ctrl+Shift+X"&&(q.preventDefault(),L(!1)),fA==="Ctrl+C"&&(q.preventDefault(),gi(!0)),fA==="Ctrl+Shift+C"&&(q.preventDefault(),gi(!1)),fA==="Ctrl+D"&&(q.preventDefault(),co()),fA!=="Delete"&&fA!=="Backspace"||(q.preventDefault(),Go()),fA==="Insert"&&(q.preventDefault(),Ko("structure")),fA==="Ctrl+A"&&(q.preventDefault(),x(pA,_i([]))),fA==="Ctrl+Q"&&Gi(q),fA==="ArrowUp"||fA==="Shift+ArrowUp"){q.preventDefault();var Ne=c(pA)?UW(c(EA),c(_A),c(pA),PA)||c(pA):NQ(c(EA),c(_A));x(pA,Ne),mo(st(Ne))}if(fA==="ArrowDown"||fA==="Shift+ArrowDown"){q.preventDefault();var pe=c(pA)?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(qt){var Jn=Uo?st(qt):rI(Hi,qt),Jo=jo(Pe(Hi,Jn))?LW(Hi,no,Jn,!0):no,Cn=Px(Hi,no,Jn),Lt=Px(Hi,Jo,Jn);if(Uo)return Ka(qt)?Cn!==void 0?ns(Cn,Cn):void 0:Xs(qt)?Lt!==void 0?ns(Lt,Lt):void 0:Lt!==void 0?ns(O1(qt),Lt):void 0;if(Xs(qt))return Lt!==void 0?_i(Lt):void 0;if(Ka(qt)||an(qt))return Cn!==void 0?_i(Cn):void 0;if(ja(qt)){if(Cn===void 0||Cn.length===0)return;var Vi=Li(Cn),Vt=Pe(Hi,Vi);return Array.isArray(Vt)?_i(Cn):mC(Cn)}return $n(qt)?Lt!==void 0?_i(Lt):Cn!==void 0?_i(Cn):void 0:void 0}})(c(EA),c(_A),c(pA),PA)||c(pA):NQ(c(EA),c(_A));x(pA,pe),mo(st(pe))}if(fA==="ArrowLeft"||fA==="Shift+ArrowLeft"){q.preventDefault();var we=c(pA)?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Jn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(qt){var{caret:Jo,previous:Cn}=JW(Hi,no,qt,Jn);if(Uo)return $n(qt)?void 0:ns(qt.path,qt.path);if(Jo&&Cn)return mR(Cn);var Lt=Li(st(qt)),Vi=Pe(Hi,Lt);return an(qt)&&Array.isArray(Vi)?ns(qt.path,qt.path):$n(qt)&&!Array.isArray(Vi)?mC(qt.focusPath):void 0}})(c(EA),c(_A),c(pA),PA,!B())||c(pA):NQ(c(EA),c(_A));x(pA,we),mo(st(we))}if(fA==="ArrowRight"||fA==="Shift+ArrowRight"){q.preventDefault();var it=c(pA)&&c(EA)!==void 0?(function(Hi,no,qt){var Uo=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Jn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(qt){var{caret:Jo,next:Cn}=JW(Hi,no,qt,Jn);return Uo?$n(qt)?void 0:ns(qt.path,qt.path):Jo&&Cn?mR(Cn):$n(qt)?_i(qt.focusPath):void 0}})(c(EA),c(_A),c(pA),PA,!B())||c(pA):NQ(c(EA),c(_A));x(pA,it),mo(st(it))}if(fA==="Enter"&&c(pA)){if(ew(c(pA))){var zt=c(pA).focusPath,bi=Pe(c(EA),Li(zt));Array.isArray(bi)&&(q.preventDefault(),x(pA,_i(zt)))}ja(c(pA))&&(q.preventDefault(),x(pA,ye(ye({},c(pA)),{},{edit:!0}))),an(c(pA))&&(q.preventDefault(),jo(Pe(c(EA),c(pA).path))?SA(c(pA).path,!0):x(pA,ye(ye({},c(pA)),{},{edit:!0})))}if(fA.replace(/^Shift\+/,"").length===1&&c(pA))return q.preventDefault(),void tn(q.key);if(fA==="Enter"&&(Xs(c(pA))||Ka(c(pA))))return q.preventDefault(),void tn("");if(fA==="Ctrl+Enter"&&an(c(pA))){var Dn=Pe(c(EA),c(pA).path);$D(Dn)&&window.open(String(Dn),"_blank")}fA==="Escape"&&c(pA)&&(q.preventDefault(),x(pA,void 0)),fA==="Ctrl+F"&&(q.preventDefault(),tt(!1)),fA==="Ctrl+H"&&(q.preventDefault(),tt(!0)),fA==="Ctrl+Z"&&(q.preventDefault(),So()),fA==="Ctrl+Shift+Z"&&(q.preventDefault(),la())}),ue("mousedown",H,function(q){i("handleMouseDown",q);var fA=q.target;MX(fA,"BUTTON")||fA.isContentEditable||(Mt(),c(pA)||c(EA)!==void 0||c(ZA)!==""&&c(ZA)!==void 0||(i("createDefaultSelection"),x(pA,_i([]))))}),ue("contextmenu",H,Gi),lA(t,T),Tt(e,"expand",NA),Tt(e,"collapse",de),Tt(e,"validate",Je),Tt(e,"getJson",Ge),Tt(e,"patch",vi),Tt(e,"acceptAutoRepair",Nt),Tt(e,"openTransformModal",Io),Tt(e,"scrollTo",Mi),Tt(e,"findElement",pn),Tt(e,"findSearchResult",io),Tt(e,"focus",Mt),St(S)}function w$(t){return typeof(e=t)!="object"||e===null?t:new Proxy(t,{get:(A,i,n)=>w$(Reflect.get(A,i,n)),set:()=>!1,deleteProperty:()=>!1});var e}var ED=qa("jsoneditor:History");function y$(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=t.maxItems||1e3,A=[],i=0;function n(){return i0}function a(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:s,undo:l,redo:C,clear:g}}function r(){t.onChange&&t.onChange(a())}function s(I){ED("add",I),A=[I].concat(A.slice(i)).slice(0,e),i=0,r()}function g(){ED("clear"),A=[],i=0,r()}function l(){if(n()){var I=A[i];return i+=1,ED("undo",I),r(),I}}function C(){if(o())return ED("redo",A[i-=1]),r(),A[i]}return{get:a}}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-transform-modal-inner.svelte-lta8xm { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) { color: inherit; flex: 1; display: flex; flex-direction: column; padding: 0; overflow: auto; min-width: 0; min-height: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { display: flex; flex-direction: row; justify-content: flex-end; padding-top: var(--jse-padding, 10px); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) button.jse-primary:where(.svelte-lta8xm):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { flex: 1; display: flex; gap: calc(2 * var(--jse-padding, 10px)); min-height: 0; box-sizing: border-box; padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) { flex: 1; display: flex; flex-direction: column; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p { margin: var(--jse-padding, 10px) 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:first-child { margin-top: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) p:last-child { margin-bottom: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .jse-description:where(.svelte-lta8xm) code { background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) .query-error:where(.svelte-lta8xm) { color: var(--jse-error-color, #ee5341); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { flex: 1; outline: none; resize: vertical; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) { flex: 1; display: flex; flex-direction: column; gap: calc(2 * var(--jse-padding, 10px)); } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm) { flex: 1; display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data.jse-hide:where(.svelte-lta8xm) { flex: none; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { flex: 1; display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents.jse-hide-original-data:where(.svelte-lta8xm) { flex-direction: column; gap: 0; margin-bottom: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-actions:where(.svelte-lta8xm) { padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); } @media screen and (max-width: 1200px) { .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) { flex-direction: column; overflow: auto; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-query-contents:where(.svelte-lta8xm) textarea.jse-query:where(.svelte-lta8xm) { min-height: 150px; flex: none; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-tree-mode { height: 300px; flex: none; } .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-original-data:where(.svelte-lta8xm), .jse-transform-modal-inner.svelte-lta8xm .jse-modal-contents:where(.svelte-lta8xm) .jse-main-contents:where(.svelte-lta8xm) .jse-data-contents:where(.svelte-lta8xm) .jse-preview-data:where(.svelte-lta8xm) { flex: unset; } } .jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) { font-weight: bold; display: block; box-sizing: border-box; } .jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) { margin-top: calc(2 * var(--jse-padding, 10px)); margin-bottom: calc(0.5 * var(--jse-padding, 10px)); box-sizing: border-box; } .jse-transform-modal-inner.svelte-lta8xm .jse-label:where(.svelte-lta8xm) .jse-label-inner:where(.svelte-lta8xm) button:where(.svelte-lta8xm) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; font-weight: bold; padding: 0; } .jse-transform-modal-inner.svelte-lta8xm .jse-tree-mode { flex: 1; background: var(--jse-input-background-readonly, transparent); box-shadow: none; box-sizing: border-box; --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); } .jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm), .jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm) { border: var(--jse-input-border, 1px solid #d8dbdf); outline: none; box-sizing: border-box; padding: calc(0.5 * var(--jse-padding, 10px)); font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: inherit; background: var(--jse-input-background, var(--jse-background-color, #fff)); } .jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):focus, .jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):focus { border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); } .jse-transform-modal-inner.svelte-lta8xm input:where(.svelte-lta8xm):read-only, .jse-transform-modal-inner.svelte-lta8xm textarea:where(.svelte-lta8xm):read-only { background: var(--jse-input-background-readonly, transparent); } .jse-transform-modal-inner.svelte-lta8xm .jse-preview.jse-error:where(.svelte-lta8xm) { flex: 1; background: var(--jse-input-background-readonly, transparent); border: var(--jse-input-border, 1px solid #d8dbdf); color: var(--jse-error-color, #ee5341); padding: calc(0.5 * var(--jse-padding, 10px)); } .jse-transform-modal-inner.svelte-lta8xm a { color: var(--jse-a-color, #156fc5); } .jse-transform-modal-inner.svelte-lta8xm a:hover { color: var(--jse-a-color-highlight, #0f508d); }`);var P3=XD(()=>A8A),LQ=XD(()=>e8A),jDA=FA('
      '),qDA=FA(" ",1),VDA=FA('
      '),WDA=FA('
      Language
      Path
      Query
      Preview
      ',1),ZDA=FA('
      ');function XDA(t,e){var A,i,n;kt(e,!1);var o=qa("jsoneditor:TransformModal"),a=N(e,"id",25,()=>"transform-modal-"+YQ()),r=N(e,"json",9),s=N(e,"rootPath",25,()=>[]),g=N(e,"indentation",9),l=N(e,"truncateTextSize",9),C=N(e,"escapeControlCharacters",9),I=N(e,"escapeUnicodeCharacters",9),d=N(e,"parser",9),B=N(e,"parseMemoizeOne",9),Q=N(e,"validationParser",9),E=N(e,"pathParser",9),f=N(e,"queryLanguages",9),b=N(e,"queryLanguageId",13),R=N(e,"onChangeQueryLanguage",9),M=N(e,"onRenderValue",9),v=N(e,"onRenderMenu",9),F=N(e,"onRenderContextMenu",9),G=N(e,"onClassName",9),U=N(e,"onTransform",9),Y=N(e,"onClose",9),j=CA(void 0,!0),AA=CA(y$({onChange:_A=>x(AA,_A)}).get(),!0),z=CA(void 0,!0),yA=CA(void 0,!0),P=CA(!1,!0),nA="".concat(a(),":").concat(pt(s())),eA=(A=P3()[nA])!==null&&A!==void 0?A:{},dA=CA(LQ().showWizard!==!1,!0),iA=CA(LQ().showOriginal!==!1,!0),aA=CA((i=eA.queryOptions)!==null&&i!==void 0?i:{},!0),hA=CA(b()===eA.queryLanguageId&&eA.query?eA.query:"",!0),JA=CA((n=eA.isManual)!==null&&n!==void 0&&n,!0),ee=CA(void 0,!0),UA=CA(void 0,!0),mA=CA({text:""},!0);function KA(_A){var pA;return(pA=f().find(Rt=>Rt.id===_A))!==null&&pA!==void 0?pA:f()[0]}function ze(_A){try{x(aA,_A),x(hA,KA(b()).createQuery(c(z),_A)),x(ee,void 0),x(JA,!1),o("updateQueryByWizard",{queryOptions:c(aA),query:c(hA),isManual:c(JA)})}catch(pA){x(ee,String(pA))}}function Ke(_A){x(hA,_A.target.value),x(JA,!0),o("handleChangeQuery",{query:c(hA),isManual:c(JA)})}c(JA)||ze(c(aA)),Jr(()=>{var _A;(_A=c(j))===null||_A===void 0||_A.focus()});var HA=PB(function(_A,pA){if(_A===void 0)return x(mA,{text:""}),void x(UA,"Error: No JSON");if(pA.trim()!=="")try{o("previewTransform",{query:pA});var Rt=KA(b()).executeQuery(_A,pA,d());x(mA,{json:Rt}),x(UA,void 0)}catch(Et){x(mA,{text:""}),x(UA,String(Et))}else x(mA,{json:_A})},300);function uA(){if(c(z)===void 0)return x(mA,{text:""}),void x(UA,"Error: No JSON");try{o("handleTransform",{query:c(hA)});var _A=KA(b()).executeQuery(c(z),c(hA),d());U()([{op:"replace",path:pt(s()),value:_A}]),Y()()}catch(pA){console.error(pA),x(mA,{text:""}),x(UA,String(pA))}}function XA(){x(dA,!c(dA)),LQ(LQ().showWizard=c(dA))}function EA(){x(iA,!c(iA)),LQ(LQ().showOriginal=c(iA))}function ZA(_A){_A.focus()}function MA(_A){o("handleChangeQueryLanguage",_A),b(_A),R()(_A),ze(c(aA))}function be(){c(P)?x(P,!c(P)):Y()()}RA(()=>(_(r()),_(s())),()=>{x(z,w$(Pe(r(),s())))}),RA(()=>c(z),()=>{x(yA,c(z)?{json:c(z)}:{text:""})}),RA(()=>(c(z),c(hA)),()=>{HA(c(z),c(hA))}),RA(()=>(P3(),c(aA),c(hA),_(b()),c(JA)),()=>{P3(P3()[nA]={queryOptions:c(aA),query:c(hA),queryLanguageId:b(),isManual:c(JA)}),o("store state in memory",nA,P3()[nA])}),mn(),$t(!0),cu(t,{get onClose(){return Y()},className:"jse-transform-modal",get fullscreen(){return c(P)},children:(_A,pA)=>{var Rt=ZDA();QR(cA(Rt),{children:(Et,Qe)=>{var _t=WDA(),Ue=$e(_t);(function(L,gt){kt(gt,!1);var gi,sn=N(gt,"queryLanguages",9),gn=N(gt,"queryLanguageId",9),Kn=N(gt,"fullscreen",13),ko=N(gt,"onChangeQueryLanguage",9),eo=N(gt,"onClose",9),fo=CA(void 0,!0),{openAbsolutePopup:Go,closeAbsolutePopup:co}=cI("absolute-popup");function ta(){var Ko={queryLanguages:sn(),queryLanguageId:gn(),onChangeQueryLanguage:qo=>{co(gi),ko()(qo)}};gi=Go(W8A,Ko,{offsetTop:-2,offsetLeft:0,anchor:c(fo),closeOnOuterClick:!0})}$t(!0),zD(L,{title:"Transform",fullScreenButton:!0,get onClose(){return eo()},get fullscreen(){return Kn()},set fullscreen(Ko){Kn(Ko)},$$slots:{actions:(Ko,qo)=>{var Co,se=$8A();Pi(cA(se),{get data(){return ZO}}),Mo(se,Ci=>x(fo,Ci),()=>c(fo)),ve(()=>Co=Xt(se,1,"jse-config svelte-5gkegr",null,Co,{hide:sn().length<=1})),ue("click",se,ta),lA(Ko,se)}},$$legacy:!0}),St()})(Ue,{get queryLanguages(){return f()},get queryLanguageId(){return b()},onChangeQueryLanguage:MA,get onClose(){return Y()},get fullscreen(){return c(P)},set fullscreen(L){x(P,L)},$$legacy:!0});var Te=cA(bA(Ue,2)),ht=cA(Te),Me=bA(cA(ht),2);cX(cA(Me),()=>(_(b()),QA(()=>KA(b()).description)));var Ai=bA(Me,4),J=bA(Ai,2),O=cA(J),tA=cA(O),oA=cA(tA),NA=et(()=>c(dA)?qc:qB);Pi(oA,{get data(){return c(NA)}});var de=bA(J,2),Ee=L=>{var gt=yi(),gi=$e(gt),sn=Kn=>{var ko=qDA(),eo=$e(ko);j8A(eo,{get queryOptions(){return c(aA)},get json(){return c(z)},onChange:ze});var fo=bA(eo,2),Go=co=>{var ta=jDA(),Ko=cA(ta);ve(()=>xt(Ko,c(ee))),lA(co,ta)};YA(fo,co=>{c(ee)&&co(Go)}),lA(Kn,ko)},gn=Kn=>{lA(Kn,tr("(Only available for arrays, not for objects)"))};YA(gi,Kn=>{c(z),QA(()=>Array.isArray(c(z)))?Kn(sn):Kn(gn,!1)}),lA(L,gt)};YA(de,L=>{c(dA)&&L(Ee)});var xA=bA(de,4);Mo(xA,L=>x(j,L),()=>c(j));var LA,dt,At=bA(ht,2),Je=cA(At),Ge=cA(Je),ri=cA(Ge),en=cA(ri),rn=cA(en),Le=et(()=>c(iA)?qc:qB);Pi(rn,{get data(){return c(Le)}});var ji=bA(Ge,2),Bi=L=>{LR(L,{get externalContent(){return c(yA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return g()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return M()},get onRenderMenu(){return v()},get onRenderContextMenu(){return F()},onError:QA(()=>console.error),get onChange(){return ra},get onChangeMode(){return ra},get onSelect(){return ra},get onUndo(){return ra},get onRedo(){return ra},get onFocus(){return ra},get onBlur(){return ra},get onSortModal(){return ra},get onTransformModal(){return ra},get onJSONEditorModal(){return ra},get onClassName(){return G()},validator:void 0,get validationParser(){return Q()},get pathParser(){return E()}})};YA(ji,L=>{c(iA)&&L(Bi)});var vi=bA(Je,2),Ji=bA(cA(vi),2),Dt=L=>{LR(L,{get externalContent(){return c(mA)},externalSelection:void 0,get history(){return c(AA)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return g()},get escapeControlCharacters(){return C()},get escapeUnicodeCharacters(){return I()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return M()},get onRenderMenu(){return v()},get onRenderContextMenu(){return F()},onError:QA(()=>console.error),get onChange(){return ra},get onChangeMode(){return ra},get onSelect(){return ra},get onUndo(){return ra},get onRedo(){return ra},get onFocus(){return ra},get onBlur(){return ra},get onSortModal(){return ra},get onTransformModal(){return ra},get onJSONEditorModal(){return ra},get onClassName(){return G()},validator:void 0,get validationParser(){return Q()},get pathParser(){return E()}})},qi=L=>{var gt=VDA(),gi=cA(gt);ve(()=>xt(gi,c(UA))),lA(L,gt)};YA(Ji,L=>{c(UA)?L(qi,!1):L(Dt)});var Nt=cA(bA(Te,2));Er(()=>ue("click",Nt,uA)),as(Nt,L=>ZA?.(L)),ve(L=>{Z1(Ai,L),Z1(xA,c(hA)),LA=Xt(At,1,"jse-data-contents svelte-lta8xm",null,LA,{"jse-hide-original-data":!c(iA)}),dt=Xt(Je,1,"jse-original-data svelte-lta8xm",null,dt,{"jse-hide":!c(iA)}),Nt.disabled=!!c(UA)},[()=>(_(zi),_(s()),_($s),QA(()=>zi(s())?"(document root)":$s(s())))]),ue("click",tA,XA),ue("input",xA,Ke),ue("click",en,EA),lA(Et,_t)},$$slots:{default:!0}}),as(Rt,(Et,Qe)=>PD?.(Et,Qe),()=>be),lA(_A,Rt)},$$slots:{default:!0}}),St()}function ol(){}var $DA=0,er=class{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=$DA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Iu.match(e)),A=>{var i=e(A);return i===void 0?null:[this,i]}}};er.closedBy=new er({deserialize:t=>t.split(" ")}),er.openedBy=new er({deserialize:t=>t.split(" ")}),er.group=new er({deserialize:t=>t.split(" ")}),er.isolate=new er({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),er.contextHash=new er({perNode:!0}),er.lookAhead=new er({perNode:!0}),er.mounted=new er({perNode:!0});var cZ,AwA=Object.create(null),Iu=class t{constructor(e,A,i){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){var A=e.props&&e.props.length?Object.create(null):AwA,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(var o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;var A=this.prop(er.group);return!!A&&A.indexOf(e)>-1}return this.id==e}static match(e){var A=Object.create(null);for(var i in e)for(var n of i.split(" "))A[n]=e[i];return o=>{for(var a=o.prop(er.group),r=-1;r<(a?a.length:0);r++){var s=A[r<0?o.name:a[r]];if(s)return s}}}};Iu.none=new Iu("",Object.create(null),0,8),(function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"})(cZ||(cZ={})),new er({perNode:!0});Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-status-bar.svelte-1pmgv9j { background: var(--jse-panel-background, #ebebeb); color: var(--jse-panel-color-readonly, #b2b2b2); font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); margin: 0; border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); display: flex; gap: var(--jse-padding, 10px); } .jse-status-bar.svelte-1pmgv9j:last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-status-bar.svelte-1pmgv9j .jse-status-bar-info:where(.svelte-1pmgv9j) { padding: 2px; }`);var ewA=FA('
      '),twA=FA('
      '),iwA=FA('
      '),nwA=FA('
      '),cN=mQ.define([{tag:xe.propertyName,color:"var(--internal-key-color)"},{tag:xe.number,color:"var(--internal-value-color-number)"},{tag:xe.bool,color:"var(--internal-value-color-boolean)"},{tag:xe.string,color:"var(--internal-value-color-string)"},{tag:xe.keyword,color:"var(--internal-value-color-null)"}]),owA=_S(cN),awA=cN.style;cN.style=t=>awA(t||[]);var rwA=[ho.fromClass(class{constructor(t){this.view=t,this.indentUnit=Xl(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(t.state)}update(t){var e=Xl(t.state);(e!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=e,this.generate(t.state))}generate(t){var e=new Nr;this.initialPaddingLeft?this.addStyleToBuilder(e,t,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var i=A.contentDOM.querySelector(".cm-line");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(t,e,A){var i=this.getVisibleLines(e);for(var n of i){var{numColumns:o,containsTab:a}=this.numColumns(n.text,e.tabSize),r="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),s=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(a?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");t.add(n.from,n.from,vt.line({attributes:{style:"padding-left: ".concat(r,"; text-indent: ").concat(s,";")}}))}}getVisibleLines(t){var e=new Set,A=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var a=t.doc.lineAt(o);A!==a&&(e.add(a),A=a),o=a.to+1}return e}numColumns(t,e){var A=0,i=!1;A:for(var n=0;nt.decorations})];Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-text-mode.svelte-k2b9e6 { --internal-key-color: var(--jse-key-color, #1a1a1a); --internal-value-color-number: var(--jse-value-color-number, #ee422e); --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); --internal-value-color-string: var(--jse-value-color-string, #008000); --internal-value-color-null: var(--jse-value-color-null, #004ed0); flex: 1; box-sizing: border-box; display: flex; flex-direction: column; background: var(--jse-background-color, #fff); } .jse-text-mode.no-main-menu.svelte-k2b9e6 { border-top: var(--jse-main-border, 1px solid #d7d7d7); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) { flex: 1; display: flex; position: relative; flex-direction: column; overflow: hidden; min-width: 0; min-height: 0; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6):last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-text-mode.svelte-k2b9e6 .jse-contents.jse-hidden:where(.svelte-k2b9e6) { visibility: hidden; position: absolute; top: 0; left: 0; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor { flex: 1; overflow: hidden; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-scroller { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); line-height: var(--jse-line-height, calc(1em + 4px)); color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-gutters { background: var(--jse-panel-background, #ebebeb); color: var(--jse-panel-color-readonly, #b2b2b2); border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLine, .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-activeLineGutter { background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionBackground { background: var(--jse-selection-background-color, #d3d3d3); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch { background-color: var(--jse-search-match-color, #ffe665); outline: var(--jse-search-match-outline, none); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-searchMatch.cm-searchMatch-selected { background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); outline: var(--jse-search-match-outline, 2px solid #e0be00); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-selectionMatch { background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-foldPlaceholder { background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); border: none; padding: 0 var(--jse-padding, 10px); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-tooltip { font-size: var(--jse-font-size, 16px); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-diagnosticAction { background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); background: var(--jse-tooltip-action-button-background, #4d4d4d); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-panels { border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search { background: var(--jse-panel-background, #ebebeb); color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search input { font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size-text-mode-search, 80%); color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); border: var(--jse-input-border, 1px solid #d8dbdf); background: var(--jse-input-background, var(--jse-background-color, #fff)); margin-right: 2px; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button { font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size-text-mode-search, 80%); color: var(--jse-panel-button-color, inherit); background: var(--jse-panel-button-background, transparent); border: none; cursor: pointer; text-transform: capitalize; padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); margin: 0; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button:hover { color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); background: var(--jse-panel-button-background-highlight, #e0e0e0); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label { font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size-text-mode-search, 80%); padding-left: var(--jse-padding, 10px); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search label input { margin-right: 2px; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-search button[name='close'] { width: 32px; height: 32px; font-size: 24px; line-height: 24px; padding: 0; right: 0; top: -4px; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .cm-editor .cm-cursor-primary { border-color: var(--jse-text-color, #4d4d4d); } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading-space:where(.svelte-k2b9e6) { flex: 1; } .jse-text-mode.svelte-k2b9e6 .jse-contents:where(.svelte-k2b9e6) .jse-loading:where(.svelte-k2b9e6) { flex: 2; text-align: center; color: var(--jse-panel-color-readonly, #b2b2b2); box-sizing: border-box; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); } .jse-text-mode.svelte-k2b9e6 .jse-contents.jse-preview:where(.svelte-k2b9e6) { flex: 1; font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: var(--jse-panel-color-readonly, #b2b2b2); overflow: auto; white-space: pre-wrap; word-break: break-word; padding: 2px; } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--jse-background-color, #fff); border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-tip:where(.svelte-k2b9e6) { font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size-mono, 14px); color: var(--jse-panel-color-readonly, #b2b2b2); } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-track:where(.svelte-k2b9e6) { flex: 1; height: 6px; background: var(--jse-panel-background, #ebebeb); border-radius: 3px; overflow: hidden; border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-progress-fill:where(.svelte-k2b9e6) { height: 100%; background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); border-radius: 2px; transition: width 0.1s ease; min-width: 2px; } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6) { padding: 4px 12px; font-size: 12px; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); background: var(--jse-theme-color, #3883fa); color: #fff; border-radius: 3px; cursor: pointer; transition: background-color 0.2s ease; flex-shrink: 0; border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); } .jse-text-mode.svelte-k2b9e6 .jse-fold-progress:where(.svelte-k2b9e6) .jse-fold-cancel-button:where(.svelte-k2b9e6):hover { background: var(--jse-theme-color-highlight, #5f9dff); color: #fff; }`);var swA=FA('
      Collapsing
      '),gwA=FA('
      ',1),lwA=FA(" ",1),cwA=FA("
      ",1),CwA=FA('
      loading...
      '),IwA=FA("
      ");function dwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=N(e,"readOnly",9),o=N(e,"mainMenuBar",9),a=N(e,"statusBar",9),r=N(e,"askToFormat",9),s=N(e,"externalContent",9),g=N(e,"externalSelection",9),l=N(e,"history",9),C=N(e,"indentation",9),I=N(e,"tabSize",9),d=N(e,"escapeUnicodeCharacters",9),B=N(e,"parser",9),Q=N(e,"validator",9),E=N(e,"validationParser",9),f=N(e,"onChange",9),b=N(e,"onChangeMode",9),R=N(e,"onSelect",9),M=N(e,"onUndo",9),v=N(e,"onRedo",9),F=N(e,"onError",9),G=N(e,"onFocus",9),U=N(e,"onBlur",9),Y=N(e,"onRenderMenu",9),j=N(e,"onSortModal",9),AA=N(e,"onTransformModal",9),z=qa("jsoneditor:TextMode"),yA={key:"Mod-i",run:Ee,shift:xA,preventDefault:!0},P=typeof window>"u";z("isSSR:",P);var nA,eA=CA(void 0,!0),dA=CA(void 0,!0),iA=CA(void 0,!0),aA=CA(!1,!0),hA=CA(r(),!0),JA=CA([],!0),ee=CA(!1,!0),UA=CA(0,!0),mA=CA(0,!0),KA=null,ze=new Zc,Ke=new Zc,HA=new Zc,uA=new Zc,XA=new Zc,EA=s(),ZA=CA(BR(EA,C(),B()),!0),MA=Os.define(),be=null;function _A(){if(!be||be.length===0)return!1;var vA=be[0].startState,VA=be[be.length-1].state,me=be.map(SA=>SA.changes).reduce((SA,re)=>SA.compose(re)),IA={type:"text",undo:{changes:me.invert(vA.doc).toJSON(),selection:qo(vA.selection)},redo:{changes:me.toJSON(),selection:qo(VA.selection)}};return z("add history item",IA),l().add(IA),be=null,!0}var pA=CA(d(),!0);Jr(Ut(function*(){if(!P)try{nA=(function(vA){var{target:VA,initialText:me,readOnly:IA,indentation:SA}=vA;z("Create CodeMirror editor",{readOnly:IA,indentation:SA});var re=(function(tt,at){return qx(tt)?tt.ranges.every(bt=>bt.anchor{x(iA,tt.state),tt.docChanged&&(tt.transactions.some(at=>!!at.annotation(MA))||(be=[...be??[],tt]),Go()),tt.selectionSet&&Ko()}),fV(),bV({top:!0}),ai.lineWrapping,Ke.of(Ga.readOnly.of(IA)),uA.of(Ga.tabSize.of(I())),HA.of(fo(SA)),XA.of(ai.theme({},{dark:qi()}))]});return nA=new ai({state:Se,parent:VA}),re&&nA.dispatch(nA.state.update({selection:re.main,scrollIntoView:!0})),nA})({target:c(eA),initialText:Co(c(ZA),c(aA))?"":c(A).escapeValue(c(ZA)),readOnly:n(),indentation:C()})}catch(vA){console.error(vA)}})),cl(()=>{co(),nA&&(z("Destroy CodeMirror editor"),nA.destroy()),Ai()});var Rt=w2(),Et=w2();function Qe(){nA&&(z("focus"),nA.focus())}function _t(vA,VA){if(nA)try{(function(){var me=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],IA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],SA=nA.state,re=SA.doc.length,Se=kS(SA,re,1/0);if(Se){var tt=[];if(me.length===0)tt=ht(Se,SA,void 0,IA);else{var{from:at}=Ux(c(A).escapeValue(c(ZA)),me);at!==void 0&&at!==0&&(tt=ht(Se,SA,at,IA))}tt.length>0&&(function(bt){Me.apply(this,arguments)})(tt)}})(vA,VA)}catch(me){F()(me)}}function Ue(){return RS.of((vA,VA,me)=>{var IA=kS(vA,vA.doc.length,1/0);if(!IA||IA.lengthme)){if(SA&&Se.from=VA&&at.to>me&&(SA=at)}}}return SA})}function Te(vA){var VA=vA.lastChild;return VA&&VA.to==vA.to&&VA.type.isError}function ht(vA,VA,me){var IA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],SA=[],re=new Set;return vA.iterate({enter(Se){if(me===void 0||Se.from>=me){var tt=fQ(VA,Se.from,Se.to);if(tt){var at="".concat(tt.from,"-").concat(tt.to);if(!re.has(at))if(IA)SA.push({from:tt.from,to:tt.to}),re.add(at);else{var bt=SA.some(Sn=>Sn.from<=tt.from&&Sn.to>=tt.to);bt||(SA.push({from:tt.from,to:tt.to}),re.add(at))}}}}}),SA}function Me(){return Me=Ut(function*(vA){if(vA.length!==0){var VA=vA.length>5e3;VA&&(x(ee,!0),x(UA,0),x(mA,vA.length),KA=new AbortController);var me=IA=>new Promise(SA=>{var re;VA&&(re=KA)!==null&&re!==void 0&&re.signal.aborted?SA():requestAnimationFrame(()=>{var Se=Math.min(IA+100,vA.length),tt=vA.slice(IA,Se);nA.dispatch({effects:tt.map(at=>DQ.of({from:at.from,to:at.to}))}),VA&&x(UA,Se),Se1&&arguments[1]!==void 0?arguments[1]:fR;if(nA)try{if(vA&&vA.length>0){var{from:me}=Ux(c(A).escapeValue(c(ZA)),vA);me!==void 0&&(nA.dispatch({selection:{anchor:me,head:me}}),NS(nA))}else FS(nA);VA?.(vA)}catch(IA){F()(IA)}}function O(){J([],()=>!0)}function tA(){_t([],!0)}var oA=!1;function NA(vA){return de(vA,!1)}function de(vA,VA){z("handlePatch",vA,VA);var me=B().parse(c(ZA)),IA=Js(me,vA),SA=D6(me,vA);return gi({text:B().stringify(IA,null,C())},VA,!1),{json:IA,previousJson:me,undo:SA,redo:vA}}function Ee(){if(z("format"),n())return!1;try{var vA=B().parse(c(ZA));return gi({text:B().stringify(vA,null,C())},!0,!1),x(hA,r()),!0}catch(VA){F()(VA)}return!1}function xA(){if(z("compact"),n())return!1;try{var vA=B().parse(c(ZA));return gi({text:B().stringify(vA)},!0,!1),x(hA,!1),!0}catch(VA){F()(VA)}return!1}function LA(){if(z("repair"),!n())try{gi({text:jg(c(ZA))},!0,!1),x(se,zx),x(Ci,void 0)}catch(vA){F()(vA)}}function dt(){var vA;if(!n())try{var VA=B().parse(c(ZA));oA=!0,j()({id:Rt,json:VA,rootPath:[],onSort:(vA=Ut(function*(me){var{operations:IA}=me;z("onSort",IA),de(IA,!0)}),function(me){return vA.apply(this,arguments)}),onClose:()=>{oA=!1,Qe()}})}catch(me){F()(me)}}function At(vA){var{id:VA,rootPath:me,onTransform:IA,onClose:SA}=vA;try{var re=B().parse(c(ZA));oA=!0,AA()({id:VA||Et,json:re,rootPath:me||[],onTransform:Se=>{IA?IA({operations:Se,json:re,transformedJson:Js(re,Se)}):(z("onTransform",Se),de(Se,!0))},onClose:()=>{oA=!1,Qe(),SA&&SA()}})}catch(Se){F()(Se)}}function Je(){n()||At({rootPath:[]})}function Ge(){nA&&(c(eA)&&c(eA).querySelector(".cm-search")?z5(nA):O5(nA))}function ri(){if(n())return!1;co();var vA=l().undo();return z("undo",vA),NW(vA)?(nA.dispatch({annotations:MA.of("undo"),changes:Rr.fromJSON(vA.undo.changes),selection:ce.fromJSON(vA.undo.selection),scrollIntoView:!0}),!0):(M()(vA),!1)}function en(){if(n())return!1;co();var vA=l().redo();return z("redo",vA),NW(vA)?(nA.dispatch({annotations:MA.of("redo"),changes:Rr.fromJSON(vA.redo.changes),selection:ce.fromJSON(vA.redo.selection),scrollIntoView:!0}),!0):(v()(vA),!1)}function rn(){x(aA,!0),gi(s(),!0,!0)}function Le(){b()(ga.tree)}function ji(){ko()}function Bi(vA){z("select validation error",vA);var{from:VA,to:me}=Nt(vA);VA!==void 0&&me!==void 0&&(vi(VA,me),Qe())}function vi(vA,VA){z("setSelection",{anchor:vA,head:VA}),nA&&nA.dispatch(nA.state.update({selection:{anchor:vA,head:VA},scrollIntoView:!0}))}function Ji(vA,VA){if(VA.state.selection.ranges.length===1){var me=VA.state.selection.ranges[0],IA=c(ZA).slice(me.from,me.to);if(IA==="{"||IA==="["){var SA=_R.default.parse(c(ZA)),re=Object.keys(SA.pointers).find(tt=>{var at;return((at=SA.pointers[tt].value)===null||at===void 0?void 0:at.pos)===me.from}),Se=SA.pointers[re];re&&Se&&Se.value&&Se.valueEnd&&(z("pointer found, selecting inner contents of path:",re,Se),vi(Se.value.pos+1,Se.valueEnd.pos-1))}}}function Dt(){return aV(tn,{delay:300})}function qi(){return!!c(eA)&&getComputedStyle(c(eA)).getPropertyValue("--jse-theme").includes("dark")}function Nt(vA){var{path:VA,message:me,severity:IA}=vA,{line:SA,column:re,from:Se,to:tt}=Ux(c(A).escapeValue(c(ZA)),VA);return{path:VA,line:SA,column:re,from:Se,to:tt,message:me,severity:IA,actions:[]}}function L(vA,VA){var{line:me,column:IA,position:SA,message:re}=vA;return{path:[],line:me,column:IA,from:SA,to:SA,severity:ic.error,message:re,actions:VA&&!n()?[{name:"Auto repair",apply:()=>LA()}]:void 0}}function gt(vA){return{from:vA.from||0,to:vA.to||0,message:vA.message||"",actions:vA.actions,severity:vA.severity}}function gi(vA,VA,me){var IA=BR(vA,C(),B()),SA=!di(vA,EA),re=EA;z("setCodeMirrorContent",{isChanged:SA,emitChange:VA,forceUpdate:me}),nA&&(SA||me)&&(EA=vA,x(ZA,IA),Co(c(ZA),c(aA))||nA.dispatch({changes:{from:0,to:nA.state.doc.length,insert:c(A).escapeValue(c(ZA))}}),_A(),SA&&VA&&ta(EA,re))}function sn(vA){return qx(vA)?ce.fromJSON(vA):void 0}function gn(){return Kn.apply(this,arguments)}function Kn(){return Kn=Ut(function*(){z("refresh"),yield(function(){return eo.apply(this,arguments)})()}),Kn.apply(this,arguments)}function ko(){if(nA){var vA=nA?c(A).unescapeValue(nA.state.doc.toString()):"",VA=vA!==c(ZA);if(z("onChangeCodeMirrorValue",{isChanged:VA}),VA){var me=EA;x(ZA,vA),EA={text:c(ZA)},_A(),ta(EA,me),uo(),Ko()}}}function eo(){return(eo=Ut(function*(){if(uo(),nA){var vA=qi();return z("updateTheme",{dark:vA}),nA.dispatch({effects:[XA.reconfigure(ai.theme({},{dark:vA}))]}),new Promise(VA=>setTimeout(VA))}return Promise.resolve()})).apply(this,arguments)}function fo(vA){var VA=M1.of(typeof vA=="number"?" ".repeat(vA):vA);return vA===" "?[VA]:[VA,rwA]}sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(dA)),hasFocus:()=>oA&&document.hasFocus()||jR(c(dA)),onFocus:G(),onBlur:()=>{co(),U()()}});var Go=PB(ko,300);function co(){Go.flush()}function ta(vA,VA){f()&&f()(vA,VA,{contentErrors:ln(),patchResult:void 0})}function Ko(){R()(qo(c(iA).selection))}function qo(vA){return ye({type:jn.text},vA.toJSON())}function Co(vA,VA){return!!vA&&vA.length>Tx&&!VA}var se=CA(zx,!0),Ci=CA(void 0,!0);function tn(){if(Co(c(ZA),c(aA)))return[];var vA=ln();if(RW(vA)){var{parseError:VA,isRepairable:me}=vA;return[gt(L(VA,me))]}return F6A(vA)?vA.validationErrors.map(Nt).map(gt):[]}function ln(){z("validate:start"),co();var vA=So(c(A).escapeValue(c(ZA)),Q(),B(),E());return RW(vA)?(x(se,vA.isRepairable?bW:"invalid"),x(Ci,vA.parseError),x(JA,[])):(x(se,zx),x(Ci,void 0),x(JA,vA?.validationErrors||[])),z("validate:end"),vA}var So=VB(t5A);function la(){c(Ci)&&(function(vA){z("select parse error",vA);var VA=L(vA,!1);vi(VA.from!=null?VA.from:0,VA.to!=null?VA.to:0),Qe()})(c(Ci))}var pi={icon:zO,text:"Show me",title:"Move to the parse error location",onClick:la};RA(()=>_(d()),()=>{x(A,zR({escapeControlCharacters:!1,escapeUnicodeCharacters:d()}))}),RA(()=>_(s()),()=>{gi(s(),!1,!1)}),RA(()=>_(g()),()=>{(function(vA){if(qx(vA)){var VA=sn(vA);!nA||!VA||c(iA)&&c(iA).selection.eq(VA)||(z("applyExternalSelection",VA),nA.dispatch({selection:VA}))}})(g())}),RA(()=>_(Q()),()=>{(function(vA){z("updateLinter",vA),nA&&nA.dispatch({effects:ze.reconfigure(Dt())})})(Q())}),RA(()=>_(C()),()=>{(function(vA){nA&&(z("updateIndentation",vA),nA.dispatch({effects:HA.reconfigure(fo(vA))}))})(C())}),RA(()=>_(I()),()=>{(function(vA){nA&&(z("updateTabSize",vA),nA.dispatch({effects:uA.reconfigure(Ga.tabSize.of(vA))}))})(I())}),RA(()=>_(n()),()=>{(function(vA){nA&&(z("updateReadOnly",vA),nA.dispatch({effects:[Ke.reconfigure(Ga.readOnly.of(vA))]}))})(n())}),RA(()=>(c(pA),_(d())),()=>{c(pA)!==d()&&(x(pA,d()),z("forceUpdateText",{escapeUnicodeCharacters:d()}),nA&&nA.dispatch({changes:{from:0,to:nA.state.doc.length,insert:c(A).escapeValue(c(ZA))}}))}),RA(()=>(c(se),_(n()),P0),()=>{x(i,c(se)!==bW||n()?[pi]:[{icon:P0,text:"Auto repair",title:"Automatically repair JSON",onClick:LA},pi])}),mn();var to={focus:Qe,collapse:_t,expand:J,patch:NA,handlePatch:de,openTransformModal:At,refresh:gn,flush:co,validate:ln};$t(!0);var Ja,Io=IwA(),Sa=cA(Io),kn=vA=>{var VA=et(()=>(c(ZA),QA(()=>c(ZA).length===0))),me=et(()=>!c(VA)),IA=et(()=>!c(VA)),SA=et(()=>!c(VA)),re=et(()=>!c(VA)),Se=et(()=>!c(VA)),tt=et(()=>!c(VA));(function(at,bt){kt(bt,!1);var Sn=CA(void 0,!0),ki=N(bt,"readOnly",9,!1),Gi=N(bt,"onExpandAll",9),jt=N(bt,"onCollapseAll",9),Si=N(bt,"onFormat",9),ca=N(bt,"onCompact",9),Ft=N(bt,"onSort",9),rt=N(bt,"onTransform",9),xi=N(bt,"onToggleSearch",9),Yi=N(bt,"onUndo",9),Un=N(bt,"onRedo",9),cn=N(bt,"canExpandAll",9),Mt=N(bt,"canCollapseAll",9),Vo=N(bt,"canUndo",9),xo=N(bt,"canRedo",9),u=N(bt,"canFormat",9),w=N(bt,"canCompact",9),S=N(bt,"canSort",9),T=N(bt,"canTransform",9),k=N(bt,"onRenderMenu",9),H=CA(void 0,!0),Z=CA(void 0,!0),gA={type:"button",icon:P4,title:"Search (Ctrl+F)",className:"jse-search",onClick:xi()},DA=CA(void 0,!0);RA(()=>(_(Gi()),_(cn())),()=>{x(H,{type:"button",icon:c$,title:"Expand all",className:"jse-expand-all",onClick:Gi(),disabled:!cn()})}),RA(()=>(_(jt()),_(Mt())),()=>{x(Z,{type:"button",icon:C$,title:"Collapse all",className:"jse-collapse-all",onClick:jt(),disabled:!Mt()})}),RA(()=>(_(ki()),c(H),c(Z),_(Si()),_(u()),_(ca()),_(w()),_(Ft()),_(S()),_(rt()),_(T()),_(Yi()),_(Vo()),_(Un()),_(xo())),()=>{x(DA,ki()?[c(H),c(Z),{type:"separator"},gA,{type:"space"}]:[c(H),c(Z),{type:"separator"},{type:"button",icon:sZ,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Si(),disabled:ki()||!u()},{type:"button",icon:nDA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:ca(),disabled:ki()||!w()},{type:"separator"},{type:"button",icon:V4,title:"Sort",className:"jse-sort",onClick:Ft(),disabled:ki()||!S()},{type:"button",icon:z4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:rt(),disabled:ki()||!T()},gA,{type:"separator"},{type:"button",icon:c8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Yi(),disabled:!Vo()},{type:"button",icon:l8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Un(),disabled:!xo()},{type:"space"}])}),RA(()=>(_(k()),c(DA)),()=>{x(Sn,k()(c(DA))||c(DA))}),mn(),$t(!0),aw(at,{get items(){return c(Sn)}}),St()})(vA,{get readOnly(){return n()},onExpandAll:O,onCollapseAll:tA,onFormat:Ee,onCompact:xA,onSort:dt,onTransform:Je,onToggleSearch:Ge,onUndo:ri,onRedo:en,get canExpandAll(){return c(me)},get canCollapseAll(){return c(IA)},get canFormat(){return c(SA)},get canCompact(){return c(re)},get canSort(){return c(Se)},get canTransform(){return c(tt)},get canUndo(){return _(l()),QA(()=>l().canUndo)},get canRedo(){return _(l()),QA(()=>l().canRedo)},get onRenderMenu(){return Y()}})};YA(Sa,vA=>{o()&&vA(kn)});var Mi=bA(Sa,2),Ot=vA=>{var VA=swA(),me=bA(cA(VA),2),IA=cA(me),SA=bA(me,2);ve(()=>gl(IA,"width: ".concat(c(mA)>0?c(UA)/c(mA)*100:0,"%"))),ue("click",SA,Ai),lA(vA,VA)};YA(Mi,vA=>{c(ee)&&vA(Ot)});var pn=bA(Mi,2),io=vA=>{var VA,me=et(()=>(c(ZA),c(aA),QA(()=>Co(c(ZA),c(aA))))),IA=cwA(),SA=$e(IA);Mo(SA,bt=>x(eA,bt),()=>c(eA));var re=bA(SA,2),Se=bt=>{var Sn=gwA(),ki=$e(Sn),Gi=et(()=>(_(yD),_(Tx),c(ZA),QA(()=>"The JSON document is larger than ".concat(yD(Tx),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(yD(c(ZA).length),"."))));Mg(ki,{get icon(){return v2},type:"error",get message(){return c(Gi)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:rn},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:Le},{text:"Cancel",title:"Cancel opening this large document.",onClick:ji}],onClose:Qe});var jt=cA(bA(ki,2));ve(Si=>xt(jt,Si),[()=>(_(gC),c(ZA),_(ND),QA(()=>gC(c(ZA)||"",ND)))]),lA(bt,Sn)};YA(re,bt=>{c(me)&&bt(Se)});var tt=bA(re,2),at=bt=>{var Sn=lwA(),ki=$e(Sn),Gi=rt=>{(function(xi,Yi){kt(Yi,!1);var Un=N(Yi,"editorState",8),cn=CA(),Mt=CA(),Vo=CA(),xo=CA(),u=CA();RA(()=>_(Un()),()=>{var DA;x(cn,(DA=Un())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.main)===null||DA===void 0?void 0:DA.head)}),RA(()=>(c(cn),_(Un())),()=>{var DA;x(Mt,c(cn)!==void 0?(DA=Un())===null||DA===void 0||(DA=DA.doc)===null||DA===void 0?void 0:DA.lineAt(c(cn)):void 0)}),RA(()=>c(Mt),()=>{x(Vo,c(Mt)!==void 0?c(Mt).number:void 0)}),RA(()=>(c(Mt),c(cn)),()=>{x(xo,c(Mt)!==void 0&&c(cn)!==void 0?c(cn)-c(Mt).from+1:void 0)}),RA(()=>_(Un()),()=>{var DA;x(u,(DA=Un())===null||DA===void 0||(DA=DA.selection)===null||DA===void 0||(DA=DA.ranges)===null||DA===void 0?void 0:DA.reduce((Ae,ne)=>Ae+ne.to-ne.from,0))}),mn(),$t();var w=nwA(),S=cA(w),T=DA=>{var Ae=ewA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,"Line: ".concat((Be=c(Vo))!==null&&Be!==void 0?Be:""))}),lA(DA,Ae)};YA(S,DA=>{c(Vo)!==void 0&&DA(T)});var k=bA(S,2),H=DA=>{var Ae=twA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,"Column: ".concat((Be=c(xo))!==null&&Be!==void 0?Be:""))}),lA(DA,Ae)};YA(k,DA=>{c(xo)!==void 0&&DA(H)});var Z=bA(k,2),gA=DA=>{var Ae=iwA(),ne=cA(Ae);ve(()=>{var Be;return xt(ne,"Selection: ".concat((Be=c(u))!==null&&Be!==void 0?Be:""," characters"))}),lA(DA,Ae)};YA(Z,DA=>{c(u)!==void 0&&c(u)>0&&DA(gA)}),lA(xi,w),St()})(rt,{get editorState(){return c(iA)}})};YA(ki,rt=>{a()&&rt(Gi)});var jt=bA(ki,2),Si=rt=>{Mg(rt,{type:"error",get icon(){return v2},get message(){return c(Ci),QA(()=>c(Ci).message)},get actions(){return c(i)},onClick:la,onClose:Qe})};YA(jt,rt=>{c(Ci)&&rt(Si)});var ca=bA(jt,2),Ft=rt=>{var xi=et(()=>[{icon:sZ,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:Ee},{icon:q4,text:"No thanks",title:"Close this message",onClick:()=>x(hA,!1)}]);Mg(rt,{type:"success",message:"Do you want to format the JSON?",get actions(){return c(xi)},onClose:Qe})};YA(ca,rt=>{c(Ci),c(hA),_(yW),c(ZA),QA(()=>!c(Ci)&&c(hA)&&yW(c(ZA)))&&rt(Ft)}),gN(bA(ca,2),{get validationErrors(){return c(JA)},selectError:Bi}),lA(bt,Sn)};YA(tt,bt=>{c(me)||bt(at)}),ve(()=>VA=Xt(SA,1,"jse-contents svelte-k2b9e6",null,VA,{"jse-hidden":c(me)})),lA(vA,IA)},mo=vA=>{lA(vA,CwA())};return YA(pn,vA=>{P?vA(mo,!1):vA(io)}),Mo(Io,vA=>x(dA,vA),()=>c(dA)),ve(()=>Ja=Xt(Io,1,"jse-text-mode svelte-k2b9e6",null,Ja,{"no-main-menu":!o()})),lA(t,Io),Tt(e,"focus",Qe),Tt(e,"collapse",_t),Tt(e,"expand",J),Tt(e,"patch",NA),Tt(e,"handlePatch",de),Tt(e,"openTransformModal",At),Tt(e,"refresh",gn),Tt(e,"flush",co),Tt(e,"validate",ln),St(to)}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-inline-value.svelte-1jv89ui { font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); line-height: var(--jse-line-height, calc(1em + 4px)); border: none; padding: 0 calc(0.5 * var(--jse-padding, 10px)); background: transparent; color: inherit; cursor: inherit; } .jse-inline-value.jse-highlight.svelte-1jv89ui { background-color: var(--jse-search-match-color, #ffe665); outline: var(--jse-search-match-outline, none); } .jse-inline-value.jse-highlight.jse-active.svelte-1jv89ui { background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); outline: var(--jse-search-match-outline, 2px solid #e0be00); }`);var BwA=FA('');Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-column-header.svelte-5pxwfq { background: none; border: none; font-family: inherit; font-size: inherit; color: inherit; display: flex; gap: var(--jse-padding, 10px); padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); width: 100%; } .jse-column-header.svelte-5pxwfq:hover { background: var(--jse-table-header-background-highlight, #e8e8e8); } .jse-column-header.svelte-5pxwfq:not(.jse-column-header.jse-readonly) { cursor: pointer; } .jse-column-header.svelte-5pxwfq span.jse-column-sort-icon:where(.svelte-5pxwfq) { height: 1em; }`);var QwA=FA(''),EwA=FA('');Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-table-mode-welcome.svelte-1b9gnk8 { flex: 1; display: flex; flex-direction: column; overflow: auto; align-items: center; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-table-mode-welcome.svelte-1b9gnk8:last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-before:where(.svelte-1b9gnk8) { flex: 1; } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) { display: flex; flex-direction: column; gap: var(--jse-padding, 10px); max-width: 400px; margin: 2em var(--jse-padding, 10px); font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-arrays-info:where(.svelte-1b9gnk8) { color: var(--jse-panel-color-readonly, #b2b2b2); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) { display: flex; align-items: center; gap: var(--jse-padding, 10px); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) { flex: 1; } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) .jse-nested-property:where(.svelte-1b9gnk8) .jse-nested-property-path:where(.svelte-1b9gnk8) .jse-nested-property-count:where(.svelte-1b9gnk8) { opacity: 0.5; white-space: nowrap; } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8) { text-align: left; border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-nested-arrays:where(.svelte-1b9gnk8) button.jse-nested-array-action:where(.svelte-1b9gnk8):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); } .jse-table-mode-welcome.svelte-1b9gnk8 .jse-space.jse-after:where(.svelte-1b9gnk8) { flex: 2; }`);var hwA=FA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste a JSON Array using Ctrl+V.`,1),uwA=FA(''),fwA=FA('
      '),mwA=FA('
      ');function pwA(t,e){kt(e,!0);var A=Zs(()=>e.json?(function(Q){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,f=[];return(function b(R,M){Oo(R)&&M.length{b(R[v],M.concat(v))}),Lo(R)&&f.push(M)})(Q,[]),f})(e.json).slice(0,99).filter(Q=>Q.length>0):[]),i=Zs(()=>!zi(c(A))),n=Zs(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=Zs(()=>c(i)?"Object with nested arrays":c(n)?"An empty document":Oo(e.json)?"An object":Lo(e.json)?"An empty array":"A ".concat(OR(e.json,e.parser))),a=mwA();a.__click=()=>e.onClick();var r=bA(cA(a),2),s=cA(r),g=cA(s),l=bA(s,2),C=cA(l),I=Q=>{lA(Q,tr(`An object cannot be opened in table mode. You can open a nested array instead, or open the document in tree mode.`))},d=Q=>{var E=yi(),f=$e(E),b=M=>{lA(M,hwA())},R=M=>{var v=tr();ve(()=>{var F;return xt(v,"".concat((F=c(o))!==null&&F!==void 0?F:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),lA(M,v)};YA(f,M=>{c(n)&&!e.readOnly?M(b):M(R,!1)},!0),lA(Q,E)};YA(C,Q=>{c(i)?Q(I):Q(d,!1)});var B=bA(l,2);ea(B,17,()=>c(A),ha,(Q,E)=>{var f=Zs(()=>(function(j){return Pe(e.json,j).length})(c(E))),b=fwA(),R=cA(b),M=cA(R),v=cA(bA(M)),F=bA(R,2);F.__click=()=>e.openJSONEditorModal(c(E));var G=cA(F),U=bA(F,2),Y=j=>{var AA=uwA();AA.__click=()=>e.extractPath(c(E)),lA(j,AA)};YA(U,j=>{e.readOnly||j(Y)}),ve(j=>{var AA;xt(M,'"'.concat(j??"",'" ')),xt(v,"(".concat((AA=c(f))!==null&&AA!==void 0?AA:""," ").concat(c(f)!==1?"items":"item",")")),xt(G,e.readOnly?"View":"Edit")},[()=>$s(c(E))]),lA(Q,b)}),bA(B,2).__click=()=>e.onChangeMode(ga.tree),ve(()=>xt(g,c(o))),lA(t,a),St()}hu(["click"]);Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-column-header.svelte-1wgrwv3 { background: none; border: none; font-family: inherit; font-size: inherit; color: inherit; display: flex; gap: var(--jse-padding, 10px); padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); width: 100%; } .jse-column-header.svelte-1wgrwv3:hover { background: var(--jse-table-header-background-highlight, #e8e8e8); } .jse-column-header.svelte-1wgrwv3:not(.jse-column-header.jse-readonly) { cursor: pointer; }`);var DwA=FA('');Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-table-mode.svelte-1p86y3c { flex: 1; display: flex; flex-direction: column; position: relative; background: var(--jse-background-color, #fff); min-width: 0; min-height: 0; font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: var(--jse-text-color, #4d4d4d); line-height: var(--jse-line-height, calc(1em + 4px)); } .jse-table-mode.no-main-menu.svelte-1p86y3c { border-top: var(--jse-main-border, 1px solid #d7d7d7); } .jse-table-mode.svelte-1p86y3c .jse-search-box-container:where(.svelte-1p86y3c) { position: relative; height: 0; top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); margin-right: calc(var(--jse-padding, 10px) + 20px); margin-left: var(--jse-padding, 10px); text-align: right; z-index: 3; } .jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) { position: fixed; right: 0; top: 0; width: 0; height: 0; } .jse-table-mode.svelte-1p86y3c .jse-hidden-input-label:where(.svelte-1p86y3c) .jse-hidden-input:where(.svelte-1p86y3c) { width: 0; height: 0; padding: 0; border: 0; outline: none; } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) { flex: 1; align-items: flex-start; flex-direction: column; display: flex; overflow: auto; overflow-anchor: none; scrollbar-gutter: stable; border-left: var(--jse-main-border, 1px solid #d7d7d7); border-right: var(--jse-main-border, 1px solid #d7d7d7); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c):last-child { border-bottom: var(--jse-main-border, 1px solid #d7d7d7); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) { border-collapse: collapse; border-spacing: 0; } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-start-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { margin: 0; padding: 0; } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-search-box-background:where(.svelte-1p86y3c) { background: var(--jse-table-header-background, #f5f5f5); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-invisible-end-section:where(.svelte-1p86y3c) td:where(.svelte-1p86y3c) { padding-bottom: var(--jse-padding, 10px); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c):hover { background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) { padding: 0 var(--jse-padding, 10px) 0 0; vertical-align: top; white-space: nowrap; height: var(--jse-line-height, calc(1em + 4px)); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c), .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { font-weight: normal; text-align: left; color: var(--jse-text-readonly, #8d8d8d); background: var(--jse-table-header-background, #f5f5f5); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) { padding: 0; position: sticky; top: 0; } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-header:where(.svelte-1p86y3c) .jse-table-root-error:where(.svelte-1p86y3c) { padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell.jse-table-cell-gutter:where(.svelte-1p86y3c) { padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c) { display: inline-block; cursor: var(--jse-contents-cursor, pointer); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer:where(.svelte-1p86y3c):hover { background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-value-outer.jse-selected-value:where(.svelte-1p86y3c) { background: var(--jse-selection-background-color, #d3d3d3); } .jse-table-mode.svelte-1p86y3c .jse-contents:where(.svelte-1p86y3c) table.jse-table-main:where(.svelte-1p86y3c) .jse-table-row:where(.svelte-1p86y3c) .jse-table-cell:where(.svelte-1p86y3c) .jse-context-menu-anchor:where(.svelte-1p86y3c) { display: inline-flex; position: relative; vertical-align: top; } .jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) { align-items: unset; } .jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading-space:where(.svelte-1p86y3c) { flex: 1; } .jse-table-mode.svelte-1p86y3c .jse-contents.jse-contents-loading:where(.svelte-1p86y3c) .jse-loading:where(.svelte-1p86y3c) { flex: 2; text-align: center; color: var(--jse-panel-color-readonly, #b2b2b2); box-sizing: border-box; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); }`);var wwA=FA('
      '),ywA=FA(''),vwA=FA(''),bwA=FA(' '),MwA=FA('
      '),kwA=FA('
      '),SwA=FA(''),xwA=FA(''),RwA=FA('
      ',1),NwA=FA(" ",1),FwA=FA(' ',1),LwA=FA('
      loading...
      '),_wA=FA('
      ',1);function GwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=CA(void 0,!0),n=CA(void 0,!0),o=qa("jsoneditor:TableMode"),{openAbsolutePopup:a,closeAbsolutePopup:r}=cI("absolute-popup"),s=a$(),g=w2(),l=w2(),C=typeof window>"u";o("isSSR:",C);var I=N(e,"readOnly",9),d=N(e,"externalContent",9),B=N(e,"externalSelection",9),Q=N(e,"history",9),E=N(e,"truncateTextSize",9),f=N(e,"mainMenuBar",9),b=N(e,"escapeControlCharacters",9),R=N(e,"escapeUnicodeCharacters",9),M=N(e,"flattenColumns",9),v=N(e,"parser",9),F=N(e,"parseMemoizeOne",9),G=N(e,"validator",9),U=N(e,"validationParser",9),Y=N(e,"indentation",9),j=N(e,"onChange",9),AA=N(e,"onChangeMode",9),z=N(e,"onSelect",9),yA=N(e,"onUndo",9),P=N(e,"onRedo",9),nA=N(e,"onRenderValue",9),eA=N(e,"onRenderMenu",9),dA=N(e,"onRenderContextMenu",9),iA=N(e,"onFocus",9),aA=N(e,"onBlur",9),hA=N(e,"onSortModal",9),JA=N(e,"onTransformModal",9),ee=N(e,"onJSONEditorModal",9),UA=CA(void 0,!0),mA=CA(void 0,!0),KA=CA(void 0,!0),ze=CA(void 0,!0),Ke=CA(void 0,!0);sN({onMount:Jr,onDestroy:cl,getWindow:()=>mu(c(mA)),hasFocus:()=>Me&&document.hasFocus()||jR(c(mA)),onFocus:()=>{Ai=!0,iA()&&iA()()},onBlur:()=>{Ai=!1,aA()&&aA()()}});var HA,uA=CA(void 0,!0),XA=CA(void 0,!0),EA=CA(void 0,!0),ZA=CA(void 0,!0),MA=CA(void 0,!0),be=CA(void 0,!0),_A=CA(!1,!0),pA=CA(!1,!0);function Rt(k){x(be,(HA=k)?jX(c(uA),HA.items):void 0)}function Et(k){return Qe.apply(this,arguments)}function Qe(){return(Qe=Ut(function*(k){x(LA,void 0),yield gn(k)})).apply(this,arguments)}function _t(){x(_A,!1),x(pA,!1),L()}var Ue=CA(1e4,!0),Te=CA([],!0),ht=CA(void 0,!0),Me=!1,Ai=!1,J=CA(!1,!0),O=CA({},!0),tA=CA(600,!0),oA=CA(0,!0),NA=18;function de(k){x(LA,k)}function Ee(k){c(LA)&&k!==void 0&&(cr(k,O1(c(LA)))&&cr(k,st(c(LA)))||(o("clearing selection: path does not exist anymore",c(LA)),x(LA,void 0)))}var xA=CA(c(uA)!==void 0?uR({json:c(uA)}):void 0,!0),LA=CA(ru(B())?B():void 0,!0),dt=CA(void 0,!0),At=CA(!1,!0);function Je(k){if(!I()){o("onSortByHeader",k);var H=k.sortDirection===al.desc?-1:1;vi(I$(c(uA),[],k.path,H),(Z,gA)=>({state:gA,sortedColumn:k}))}}Jr(()=>{c(LA)&&ko(st(c(LA)))});var Ge=CA(void 0,!0);function ri(k){if(k.json!==void 0||k.text!==void 0){var H=c(uA)!==void 0&&k.json!==void 0;Q().add({type:"tree",undo:{patch:H?[{op:"replace",path:"",value:k.json}]:void 0,json:k.json,text:k.text,documentState:k.documentState,textIsRepaired:k.textIsRepaired,selection:r0(k.selection),sortedColumn:k.sortedColumn},redo:{patch:H?[{op:"replace",path:"",value:c(uA)}]:void 0,json:c(uA),text:c(XA),documentState:c(xA),textIsRepaired:c(At),selection:r0(c(LA)),sortedColumn:c(dt)}})}}var en=CA([],!0),rn=VB(r$);function Le(k,H,Z,gA){OQ(()=>{var DA;try{DA=rn(k,H,Z,gA)}catch(Ae){DA=[{path:[],message:"Failed to validate: "+Ae.message,severity:ic.warning}]}di(DA,c(en))||(o("validationErrors changed:",DA),x(en,DA))},DA=>o("validationErrors updated in ".concat(DA," ms")))}function ji(){return o("validate"),c(EA)?{parseError:c(EA),isRepairable:!1}:(Le(c(uA),G(),v(),U()),zi(c(en))?void 0:{validationErrors:c(en)})}function Bi(k,H){if(o("patch",k,H),c(uA)===void 0)throw new Error("Cannot apply patch: no JSON");var Z=c(uA),gA={json:void 0,text:c(XA),documentState:c(xA),selection:r0(c(LA)),sortedColumn:c(dt),textIsRepaired:c(At)},DA=PX(c(uA),k),Ae=FX(c(uA),c(xA),k),ne=bDA(c(dt),k,c(Te)),Be=typeof H=="function"?H(Ae.json,Ae.documentState,c(LA)):void 0;return x(uA,Be?.json!==void 0?Be.json:Ae.json),x(xA,Be?.state!==void 0?Be.state:Ae.documentState),x(LA,Be?.selection!==void 0?Be.selection:c(LA)),x(dt,Be?.sortedColumn!==void 0?Be.sortedColumn:ne),x(XA,void 0),x(At,!1),x(ZA,void 0),x(MA,void 0),x(EA,void 0),Q().add({type:"tree",undo:ye({patch:DA},gA),redo:{patch:k,json:void 0,text:void 0,documentState:c(xA),selection:r0(c(LA)),sortedColumn:c(dt),textIsRepaired:c(At)}}),{json:c(uA),previousJson:Z,undo:DA,redo:k}}function vi(k,H){o("handlePatch",k,H);var Z={json:c(uA),text:c(XA)},gA=Bi(k,H);return Ji(Z,gA),gA}function Ji(k,H){if((k.json!==void 0||k?.text!==void 0)&&j()){if(c(XA)!==void 0){var Z={text:c(XA),json:void 0};j()(Z,k,{contentErrors:ji(),patchResult:H})}else if(c(uA)!==void 0){var gA={text:void 0,json:c(uA)};j()(gA,k,{contentErrors:ji(),patchResult:H})}}}function Dt(k){o("pasted json as text",k),x(ZA,k)}function qi(k){o("pasted multiline text",{pastedText:k}),x(MA,k)}function Nt(k){var H=parseInt(k[0],10),Z=[String(H+1),...k.slice(1)];return cr(c(uA),Z)?_i(Z):_i(k)}function L(){o("focus"),c(ze)&&(c(ze).focus(),c(ze).select())}function gt(k){x(oA,k.target.scrollTop)}function gi(){c(LA)||x(LA,(function(){if(Lo(c(uA))&&!zi(c(uA))&&!zi(c(Te)))return _i(["0",...c(Te)[0]])})())}function sn(){if(c(At)&&c(uA)!==void 0){var k={json:c(uA),text:c(XA)},H={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};x(XA,void 0),x(At,!1),Ee(c(uA)),ri(H),Ji(k,void 0)}return{json:c(uA),text:c(XA)}}function gn(k){var{scrollToWhenVisible:H=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Z=c(_A)?V3:0,gA=lZ(k,c(Te),O,NA),DA=gA-c(oA)+Z+NA,Ae=eo(k);if(o("scrollTo",{path:k,top:gA,scrollTop:c(oA),elem:Ae}),!c(KA))return Promise.resolve();var ne=c(KA).getBoundingClientRect();if(Ae&&!H){var Be=Ae.getBoundingClientRect();if(Be.bottom>ne.top&&Be.top{s(Ae,{container:c(KA),offset:Ye,duration:300,callback:()=>{Kn(k),ke()}})}:ke=>{s(DA,{container:c(KA),offset:Ye,duration:300,callback:()=>{uo(),Kn(k),ke()}})})}function Kn(k){var H=eo(k);if(H&&c(KA)){var Z=c(KA).getBoundingClientRect(),gA=H.getBoundingClientRect();if(gA.right>Z.right){var DA=gA.right-Z.right;yg(KA,c(KA).scrollLeft+=DA)}if(gA.leftYe){var ke=DA-Ye;yg(KA,c(KA).scrollTop+=ke)}if(gAI0(k.slice(1),Ae)),DA=gA?k.slice(0,1).concat(gA):k;return(H=(Z=c(KA))===null||Z===void 0?void 0:Z.querySelector('td[data-path="'.concat(DD(DA),'"]')))!==null&&H!==void 0?H:void 0}function fo(k){var H,{anchor:Z,left:gA,top:DA,width:Ae,height:ne,offsetTop:Be,offsetLeft:Ye,showTip:ke}=k,Re=(function(fA){var{json:PA,documentState:Ne,selection:pe,readOnly:we,onEditValue:it,onEditRow:zt,onToggleEnforceString:bi,onCut:Dn,onCopy:Hi,onPaste:no,onRemove:qt,onDuplicateRow:Uo,onInsertBeforeRow:Jn,onInsertAfterRow:Jo,onRemoveRow:Cn}=fA,Lt=PA!==void 0,Vi=!!pe,Vt=PA!==void 0&&pe?Pe(PA,st(pe)):void 0,mt=Lt&&($n(pe)||ja(pe)||an(pe)),si=!we&&Lt&&pe!==void 0&&_D(pe),Wo=si&&!jo(Vt),Yn=!we&&mt,Yo=pe!==void 0&&g0(PA,Ne,st(pe));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>it(),icon:s1,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!si},width:"11em",items:[{type:"button",icon:s1,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>it(),disabled:!si},{type:"button",icon:Yo?CM:BM,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>bi(),disabled:!Wo}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Dn(!0),icon:g1,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Yn},width:"10em",items:[{type:"button",icon:g1,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Dn(!0),disabled:we||!mt},{type:"button",icon:g1,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Dn(!1),disabled:we||!mt}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Hi(!0),icon:j0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!mt},width:"12em",items:[{type:"button",icon:j0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Hi(!1),disabled:!mt},{type:"button",icon:j0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Hi(!1),disabled:!mt}]},{type:"button",onClick:()=>no(),icon:gM,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:we||!Vi},{type:"button",onClick:()=>qt(),icon:s8,text:"Remove",title:"Remove selected contents (Delete)",disabled:we||!mt}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>zt(),icon:s1,text:"Edit row",title:"Edit the current row",disabled:we||!Vi||!Lt},{type:"button",onClick:()=>Uo(),icon:cM,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:we||!Vi||!Lt},{type:"button",onClick:()=>Jn(),icon:l1,text:"Insert before",title:"Insert a row before the current row",disabled:we||!Vi||!Lt},{type:"button",onClick:()=>Jo(),icon:l1,text:"Insert after",title:"Insert a row after the current row",disabled:we||!Vi||!Lt},{type:"button",onClick:()=>Cn(),icon:s8,text:"Remove row",title:"Remove current row",disabled:we||!Vi||!Lt}]}]}]})({json:c(uA),documentState:c(xA),selection:c(LA),readOnly:I(),onEditValue:ta,onEditRow:Ko,onToggleEnforceString:qo,onCut:Ja,onCopy:Sa,onPaste:Ci,onRemove:Mi,onDuplicateRow:pn,onInsertBeforeRow:io,onInsertAfterRow:mo,onRemoveRow:vA}),ii=(H=dA()(Re))!==null&&H!==void 0?H:Re;if(ii!==!1){var xn={left:gA,top:DA,offsetTop:Be,offsetLeft:Ye,width:Ae,height:ne,anchor:Z,closeOnOuterClick:!0,onClose:()=>{Me=!1,L()}};Me=!0;var q=a(D$,{tip:ke?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:ii,onRequestClose(){r(q),L()}},xn)}}function Go(k){if(!za(c(LA)))if(k&&(k.stopPropagation(),k.preventDefault()),k&&k.type==="contextmenu"&&k.target!==c(ze))fo({left:k.clientX,top:k.clientY,width:cC,height:lC,showTip:!1});else{var H,Z=(H=c(KA))===null||H===void 0?void 0:H.querySelector(".jse-table-cell.jse-selected-value");if(Z)fo({anchor:Z,offsetTop:2,width:cC,height:lC,showTip:!1});else{var gA,DA=(gA=c(KA))===null||gA===void 0?void 0:gA.getBoundingClientRect();DA&&fo({top:DA.top+2,left:DA.left+2,width:cC,height:lC,showTip:!1})}}}function co(k){fo({anchor:kX(k.target,"BUTTON"),offsetTop:0,width:cC,height:lC,showTip:!0})}function ta(){if(!I()&&c(LA)){var k=st(c(LA));jo(Pe(c(uA),k))?at(k):x(LA,_i(k))}}function Ko(){!I()&&c(LA)&&at(st(c(LA)).slice(0,1))}function qo(){if(!I()&&an(c(LA))){var k=c(LA).path,H=pt(k),Z=Pe(c(uA),k),gA=!g0(c(uA),c(xA),k),DA=gA?String(Z):EE(String(Z),v());o("handleToggleEnforceString",{enforceString:gA,value:Z,updatedValue:DA}),vi([{op:"replace",path:H,value:DA}],(Ae,ne)=>({state:Aw(c(uA),ne,k,{type:"value",enforceString:gA})}))}}function Co(){return se.apply(this,arguments)}function se(){return(se=Ut(function*(){if(o("apply pasted json",c(ZA)),c(ZA)){var{onPasteAsJson:k}=c(ZA);k(),setTimeout(L)}})).apply(this,arguments)}function Ci(){return tn.apply(this,arguments)}function tn(){return(tn=Ut(function*(){try{IA(yield navigator.clipboard.readText())}catch(k){console.error(k),x(J,!0)}})).apply(this,arguments)}function ln(){return So.apply(this,arguments)}function So(){return(So=Ut(function*(){o("apply pasted multiline text",c(MA)),c(MA)&&(IA(JSON.stringify(c(MA))),setTimeout(L))})).apply(this,arguments)}function la(){o("clear pasted json"),x(ZA,void 0),L()}function pi(){o("clear pasted multiline text"),x(MA,void 0),L()}function to(){AA()(ga.text)}function Ja(k){return Io.apply(this,arguments)}function Io(){return(Io=Ut(function*(k){yield E$({json:c(uA),selection:c(LA),indentation:k?Y():void 0,readOnly:I(),parser:v(),onPatch:vi})})).apply(this,arguments)}function Sa(){return kn.apply(this,arguments)}function kn(){return kn=Ut(function*(){var k=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];c(uA)!==void 0&&(yield h$({json:c(uA),selection:c(LA),indentation:k?Y():void 0,parser:v()}))}),kn.apply(this,arguments)}function Mi(){f$({json:c(uA),text:c(XA),selection:c(LA),keepSelection:!0,readOnly:I(),onChange:j(),onPatch:vi})}function Ot(k){I()||(o("extract",{path:k}),vi(TX(c(uA),_i(k))))}function pn(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne,columnIndex:Be}=nl(st(Z),gA);os("duplicate row",{rowIndex:ne});var Ye=[String(ne)];Ae(HX(H,[Ye]),(ke,Re)=>({state:Re,selection:_i(L1({rowIndex:ne({state:xn,selection:_i(L1({rowIndex:Ye,columnIndex:Be},gA))}))}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function vA(){(function(k){var{json:H,selection:Z,columns:gA,readOnly:DA,onPatch:Ae}=k;if(!DA&&H!==void 0&&Z&&HQ(Z)){var{rowIndex:ne,columnIndex:Be}=nl(st(Z),gA);os("remove row",{rowIndex:ne}),Ae(KD([[String(ne)]]),(Ye,ke)=>{var Re=ne0?ne-1:void 0,ii=Re!==void 0?_i(L1({rowIndex:Re,columnIndex:Be},gA)):void 0;return os("remove row new selection",{rowIndex:ne,newRowIndex:Re,newSelection:ii}),{state:ke,selection:ii}})}})({json:c(uA),selection:c(LA),columns:c(Te),readOnly:I(),onPatch:vi})}function VA(){return(VA=Ut(function*(k){yield m$({char:k,selectInside:!1,json:c(uA),selection:c(LA),readOnly:I(),parser:v(),onPatch:vi,onReplaceJson:SA,onSelect:de})})).apply(this,arguments)}function me(k){var H;k.preventDefault(),IA((H=k.clipboardData)===null||H===void 0?void 0:H.getData("text/plain"))}function IA(k){k!==void 0&&u$({clipboardText:k,json:c(uA),selection:c(LA),readOnly:I(),parser:v(),onPatch:vi,onChangeText:re,onPasteMultilineText:qi,openRepairModal:bt})}function SA(k,H){var Z={json:c(uA),text:c(XA)},gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)},DA=wg(k,c(xA)),Ae=typeof H=="function"?H(k,DA,c(LA)):void 0;x(uA,Ae?.json!==void 0?Ae.json:k),x(xA,Ae?.state!==void 0?Ae.state:DA),x(LA,Ae?.selection!==void 0?Ae.selection:c(LA)),x(dt,void 0),x(XA,void 0),x(At,!1),x(EA,void 0),Ee(c(uA)),ri(gA),Ji(Z,void 0)}function re(k,H){o("handleChangeText");var Z={json:c(uA),text:c(XA)},gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};try{x(uA,F()(k)),x(xA,wg(c(uA),c(xA))),x(XA,void 0),x(At,!1),x(EA,void 0)}catch(Ae){try{x(uA,F()(jg(k))),x(xA,wg(c(uA),c(xA))),x(XA,k),x(At,!0),x(EA,void 0)}catch(ne){x(uA,void 0),x(xA,void 0),x(XA,k),x(At,!1),x(EA,c(XA)!==""?nE(c(XA),Ae.message||String(Ae)):void 0)}}if(typeof H=="function"){var DA=H(c(uA),c(xA),c(LA));x(uA,DA?.json!==void 0?DA.json:c(uA)),x(xA,DA?.state!==void 0?DA.state:c(xA)),x(LA,DA?.selection!==void 0?DA.selection:c(LA))}Ee(c(uA)),ri(gA),Ji(Z,void 0)}function Se(k){o("select validation error",k),x(LA,_i(k.path)),gn(k.path)}function tt(k){if(c(uA)!==void 0){var{id:H,onTransform:Z,onClose:gA}=k,DA=k.rootPath||[];Me=!0,JA()({id:H||l,json:c(uA),rootPath:DA||[],onTransform:Ae=>{Z?Z({operations:Ae,json:c(uA),transformedJson:Js(c(uA),Ae)}):(o("onTransform",DA,Ae),vi(Ae))},onClose:()=>{Me=!1,setTimeout(L),gA&&gA()}})}}function at(k){o("openJSONEditorModal",{path:k}),Me=!0,ee()({content:{json:Pe(c(uA),k)},path:k,onPatch:vi,onClose:()=>{Me=!1,setTimeout(L)}})}function bt(k,H){x(Ke,{text:k,onParse:Z=>fu(Z,gA=>uu(gA,v())),onRepair:fX,onApply:H,onClose:L})}function Sn(){(function(k){I()||c(uA)===void 0||(Me=!0,hA()({id:g,json:c(uA),rootPath:k,onSort:H=>{var{operations:Z,itemPath:gA,direction:DA}=H;o("onSort",Z,k,gA,DA),vi(Z,(Ae,ne)=>({state:ne,sortedColumn:{path:gA,sortDirection:DA===-1?al.desc:al.asc}}))},onClose:()=>{Me=!1,setTimeout(L)}}))})([])}function ki(){tt({rootPath:[]})}function Gi(k){o("openFind",{findAndReplace:k}),x(_A,!1),x(pA,!1),uo(),x(_A,!0),x(pA,k)}function jt(){if(!I()&&Q().canUndo){var k=Q().undo();if(LD(k)){var H={json:c(uA),text:c(XA)};x(uA,k.undo.patch?Js(c(uA),k.undo.patch):k.undo.json),x(xA,k.undo.documentState),x(LA,k.undo.selection),x(dt,k.undo.sortedColumn),x(XA,k.undo.text),x(At,k.undo.textIsRepaired),x(EA,void 0),o("undo",{item:k,json:c(uA)}),Ji(H,k.undo.patch&&k.redo.patch?{json:c(uA),previousJson:H.json,redo:k.undo.patch,undo:k.redo.patch}:void 0),L(),c(LA)&&gn(st(c(LA)),{scrollToWhenVisible:!1})}else yA()(k)}}function Si(){if(!I()&&Q().canRedo){var k=Q().redo();if(LD(k)){var H={json:c(uA),text:c(XA)};x(uA,k.redo.patch?Js(c(uA),k.redo.patch):k.redo.json),x(xA,k.redo.documentState),x(LA,k.redo.selection),x(dt,k.redo.sortedColumn),x(XA,k.redo.text),x(At,k.redo.textIsRepaired),x(EA,void 0),o("redo",{item:k,json:c(uA)}),Ji(H,k.undo.patch&&k.redo.patch?{json:c(uA),previousJson:H.json,redo:k.redo.patch,undo:k.undo.patch}:void 0),L(),c(LA)&&gn(st(c(LA)),{scrollToWhenVisible:!1})}else P()(k)}}function ca(k){x(tA,k.getBoundingClientRect().height)}RA(()=>(_(b()),_(R())),()=>{x(UA,zR({escapeControlCharacters:b(),escapeUnicodeCharacters:R()}))}),RA(()=>c(_A),()=>{(function(k){if(c(KA)){var H=k?V3:-100;c(KA).scrollTo({top:yg(KA,c(KA).scrollTop+=H),left:c(KA).scrollLeft})}})(c(_A))}),RA(()=>_(d()),()=>{(function(k){var H={json:c(uA)},Z=tu(k)?k.text!==c(XA):!di(H.json,k.json);if(o("update external content",{isChanged:Z}),Z){var gA={json:c(uA),documentState:c(xA),selection:c(LA),sortedColumn:c(dt),text:c(XA),textIsRepaired:c(At)};if(tu(k))try{x(uA,F()(k.text)),x(xA,wg(c(uA),c(xA))),x(XA,k.text),x(At,!1),x(EA,void 0)}catch(DA){try{x(uA,F()(jg(k.text))),x(xA,wg(c(uA),c(xA))),x(XA,k.text),x(At,!0),x(EA,void 0)}catch(Ae){x(uA,void 0),x(xA,void 0),x(XA,k.text),x(At,!1),x(EA,c(XA)!==""?nE(c(XA),DA.message||String(DA)):void 0)}}else x(uA,k.json),x(xA,wg(c(uA),c(xA))),x(XA,void 0),x(At,!1),x(EA,void 0);Ee(c(uA)),x(dt,void 0),ri(gA)}})(d())}),RA(()=>_(B()),()=>{(function(k){di(c(LA),k)||(o("applyExternalSelection",{selection:c(LA),externalSelection:k}),ru(k)&&x(LA,k))})(B())}),RA(()=>(c(Te),c(uA),_(M()),c(Ue)),()=>{x(Te,Lo(c(uA))?(function(k,H){var Z=new Set(H.map(pt)),gA=new Set(k.map(pt));for(var DA of Z)gA.has(DA)||Z.delete(DA);for(var Ae of gA)Z.has(Ae)||Z.add(Ae);return[...Z].map(As)})(DDA(c(uA),M(),c(Ue)),c(Te)):[])}),RA(()=>(c(uA),c(Te)),()=>{x(ht,!(!c(uA)||zi(c(Te))))}),RA(()=>(c(uA),c(Ue)),()=>{x(A,Array.isArray(c(uA))&&c(uA).length>c(Ue))}),RA(()=>(c(oA),c(tA),c(uA),c(_A),V3),()=>{x(i,wDA(c(oA),c(tA),c(uA),O,NA,c(_A)?V3:0))}),RA(()=>c(uA),()=>{c(uA),c(KA)&&c(KA).scrollTo({top:c(KA).scrollTop,left:c(KA).scrollLeft})}),RA(()=>c(LA),()=>{var k;k=c(LA),di(k,B())||(o("onSelect",k),z()(k))}),RA(()=>(_(I()),_(E()),_(v()),c(UA),c(uA),c(xA),_(nA())),()=>{x(Ge,{mode:ga.table,readOnly:I(),truncateTextSize:E(),parser:v(),normalization:c(UA),getJson:()=>c(uA),getDocumentState:()=>c(xA),findElement:eo,findNextInside:Nt,focus:L,onPatch:(k,H)=>vi((function(Z,gA){return Z.flatMap(DA=>{if(m6(DA)){var Ae=As(DA.path);if(Ae.length>0){for(var ne=[DA],Be=Li(Ae);Be.length>0&&!cr(gA,Be);)ne.unshift({op:"add",path:pt(Be),value:{}}),Be=Li(Be);return ne}}return DA})})(k,c(uA)),H),onSelect:de,onFind:Gi,onPasteJson:Dt,onRenderValue:nA()})}),RA(()=>(c(uA),_(G()),_(v()),_(U())),()=>{Le(c(uA),G(),v(),U())}),RA(()=>(c(en),c(Te)),()=>{x(n,yDA(c(en),c(Te)))}),mn();var Ft={validate:ji,patch:Bi,focus:L,acceptAutoRepair:sn,scrollTo:gn,findElement:eo,openTransformModal:tt};$t(!0);var rt=_wA();ue("mousedown",dC,function(k){!hE(k.target,H=>H===c(mA))&&za(c(LA))&&(o("click outside the editor, exit edit mode"),x(LA,r0(c(LA))),Ai&&c(ze)&&(c(ze).focus(),c(ze).blur()),o("blur (outside editor)"),c(ze)&&c(ze).blur())});var xi,Yi=$e(rt),Un=cA(Yi),cn=k=>{(function(H,Z){kt(Z,!1);var gA=N(Z,"containsValidArray",9),DA=N(Z,"readOnly",9),Ae=N(Z,"showSearch",13,!1),ne=N(Z,"history",9),Be=N(Z,"onSort",9),Ye=N(Z,"onTransform",9),ke=N(Z,"onContextMenu",9),Re=N(Z,"onUndo",9),ii=N(Z,"onRedo",9),xn=N(Z,"onRenderMenu",9);function q(){Ae(!Ae())}var fA=CA(void 0,!0),PA=CA(void 0,!0);RA(()=>(_(DA()),_(Be()),_(gA()),_(Ye()),_(ke()),_(Re()),_(ne()),_(ii())),()=>{x(fA,DA()?[{type:"space"}]:[{type:"button",icon:V4,title:"Sort",className:"jse-sort",onClick:Be(),disabled:DA()||!gA()},{type:"button",icon:z4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Ye(),disabled:DA()||!gA()},{type:"button",icon:P4,title:"Search (Ctrl+F)",className:"jse-search",onClick:q,disabled:!gA()},{type:"button",icon:lM,title:WR,className:"jse-contextmenu",onClick:ke()},{type:"separator"},{type:"button",icon:c8,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Re(),disabled:!ne().canUndo},{type:"button",icon:l8,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:ii(),disabled:!ne().canRedo},{type:"space"}])}),RA(()=>(_(xn()),c(fA)),()=>{x(PA,xn()(c(fA))||c(fA))}),mn(),$t(!0),aw(H,{get items(){return c(PA)}}),St()})(k,{get containsValidArray(){return c(ht)},get readOnly(){return I()},get history(){return Q()},onSort:Sn,onTransform:ki,onUndo:jt,onRedo:Si,onContextMenu:co,get onRenderMenu(){return eA()},get showSearch(){return c(_A)},set showSearch(H){x(_A,H)},$$legacy:!0})};YA(Un,k=>{f()&&k(cn)});var Mt=bA(Un,2),Vo=k=>{var H=FwA(),Z=$e(H),gA=cA(Z);gA.readOnly=!0,Mo(gA,Be=>x(ze,Be),()=>c(ze));var DA=bA(Z,2),Ae=Be=>{var Ye=RwA(),ke=$e(Ye);d$(cA(ke),{get json(){return c(uA)},get documentState(){return c(xA)},get parser(){return v()},get showSearch(){return c(_A)},get showReplace(){return c(pA)},get readOnly(){return I()},get columns(){return c(Te)},onSearch:Rt,onFocus:Et,onPatch:vi,onClose:_t});var Re=bA(ke,2),ii=cA(Re),xn=cA(ii),q=cA(xn),fA=cA(q),PA=cA(fA),Ne=mt=>{var si=et(()=>(_(FQ),c(n),QA(()=>{var ia;return FQ([],(ia=c(n))===null||ia===void 0?void 0:ia.root)}))),Wo=yi(),Yn=$e(Wo),Yo=ia=>{var nr=wwA();ZQ(cA(nr),{get validationError(){return c(si)},get onExpand(){return ol}}),lA(ia,nr)};YA(Yn,ia=>{c(si)&&ia(Yo)}),lA(mt,Wo)};YA(PA,mt=>{_(zi),c(n),QA(()=>{var si;return!zi((si=c(n))===null||si===void 0?void 0:si.root)})&&mt(Ne)});var pe=bA(fA);ea(pe,1,()=>c(Te),ha,(mt,si)=>{var Wo=ywA();(function(Yn,Yo){kt(Yo,!1);var ia=CA(void 0,!0),nr=CA(void 0,!0),u0=CA(void 0,!0),ng=N(Yo,"path",9),dl=N(Yo,"sortedColumn",9),Ec=N(Yo,"readOnly",9),Bl=N(Yo,"onSort",9);RA(()=>(_(ng()),$s),()=>{x(ia,zi(ng())?"values":$s(ng()))}),RA(()=>(_(dl()),_(ng())),()=>{var ua;x(nr,dl()&&di(ng(),(ua=dl())===null||ua===void 0?void 0:ua.path)?dl().sortDirection:void 0)}),RA(()=>(c(nr),MW),()=>{x(u0,c(nr)?MW[c(nr)]:void 0)}),mn(),$t(!0);var Hr,or=EwA(),og=cA(or),f0=cA(og),ag=bA(og,2),wn=ua=>{var fa=QwA(),mI=cA(fa),dd=et(()=>(c(nr),_(al),_(qc),_(dM),QA(()=>c(nr)===al.asc?qc:dM)));Pi(mI,{get data(){return c(dd)}}),ve(()=>fn(fa,"title","Currently sorted in ".concat(c(u0)," order"))),lA(ua,fa)};YA(ag,ua=>{c(nr)!==void 0&&ua(wn)}),ve(ua=>{Hr=Xt(or,1,"jse-column-header svelte-5pxwfq",null,Hr,{"jse-readonly":Ec()}),fn(or,"title",Ec()?c(ia):c(ia)+" (Click to sort the data by this column)"),xt(f0,ua)},[()=>(_(gC),c(ia),_(50),QA(()=>gC(c(ia),50)))]),ue("click",or,function(){Ec()||Bl()({path:ng(),sortDirection:c(nr)===al.asc?al.desc:al.asc})}),lA(Yn,or),St()})(cA(Wo),{get path(){return c(si)},get sortedColumn(){return c(dt)},get readOnly(){return I()},onSort:Je}),lA(mt,Wo)});var we=bA(pe),it=mt=>{var si=vwA(),Wo=cA(si),Yn=et(()=>(c(uA),QA(()=>Array.isArray(c(uA))?c(uA).length:0)));(function(Yo,ia){kt(ia,!1);var nr=N(ia,"count",9),u0=N(ia,"maxSampleCount",9),ng=N(ia,"readOnly",9),dl=N(ia,"onRefresh",9);$t(!0);var Ec,Bl=DwA();Pi(cA(Bl),{get data(){return HO}}),ve(()=>{Ec=Xt(Bl,1,"jse-column-header svelte-1wgrwv3",null,Ec,{"jse-readonly":ng()}),fn(Bl,"title","The Columns are created by sampling ".concat(u0()," items out of ").concat(nr(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")}),ue("click",Bl,()=>dl()()),lA(Yo,Bl),St()})(Wo,{get count(){return c(Yn)},get maxSampleCount(){return c(Ue)},get readOnly(){return I()},onRefresh:()=>x(Ue,1/0)}),lA(mt,si)};YA(we,mt=>{c(A)&&mt(it)});var zt,bi,Dn=bA(q),Hi=cA(Dn),no=bA(Dn);ea(no,1,()=>(c(i),QA(()=>c(i).visibleItems)),ha,(mt,si,Wo)=>{var Yn=et(()=>(c(i),QA(()=>c(i).startIndex+Wo))),Yo=et(()=>(c(n),_(c(Yn)),QA(()=>c(n).rows[c(Yn)]))),ia=et(()=>(_(FQ),_(c(Yn)),_(c(Yo)),QA(()=>{var Hr;return FQ([String(c(Yn))],(Hr=c(Yo))===null||Hr===void 0?void 0:Hr.row)}))),nr=et(()=>(_(o0),c(uA),c(be),_(c(Yn)),QA(()=>o0(c(uA),c(be),[String(c(Yn))])))),u0=xwA(),ng=cA(u0);lX(ng,()=>c(Yn),Hr=>{var or=bwA(),og=cA(or),f0=bA(og),ag=wn=>{ZQ(wn,{get validationError(){return c(ia)},get onExpand(){return ol}})};YA(f0,wn=>{c(ia)&&wn(ag)}),as(or,(wn,ua)=>QD?.(wn,ua),()=>wn=>(function(ua,fa){O[fa]=ua.getBoundingClientRect().height})(wn,c(Yn))),ve(()=>{var wn;return xt(og,"".concat((wn=c(Yn))!==null&&wn!==void 0?wn:""," "))}),lA(Hr,or)});var dl=bA(ng);ea(dl,1,()=>c(Te),ha,(Hr,or,og,f0)=>{var ag,wn=et(()=>(_(c(Yn)),c(or),QA(()=>[String(c(Yn))].concat(c(or))))),ua=et(()=>(_(Pe),c(si),c(or),QA(()=>Pe(c(si),c(or))))),fa=et(()=>(_(an),c(LA),_(I0),_(c(wn)),QA(()=>an(c(LA))&&I0(c(LA).path,c(wn))))),mI=et(()=>(_(c(Yo)),QA(()=>{var ma;return(ma=c(Yo))===null||ma===void 0?void 0:ma.columns[og]}))),dd=et(()=>(_(FQ),_(c(wn)),_(c(mI)),QA(()=>FQ(c(wn),c(mI))))),pI=kwA(),YE=cA(pI),Bd=cA(YE),HE=ma=>{var kg=et(()=>(_(UD),_(o0),c(si),_(c(nr)),c(or),QA(()=>UD(o0(c(si),c(nr),c(or)))))),TE=et(()=>(_(c(kg)),QA(()=>!!c(kg)&&c(kg).some(wI=>wI.active)))),OE=et(()=>(_(zi),_(c(kg)),QA(()=>!zi(c(kg)))));(function(wI,fr){kt(fr,!1);var zE=N(fr,"path",9),jF=N(fr,"value",9),qF=N(fr,"parser",9),vnA=N(fr,"isSelected",9),bnA=N(fr,"containsSearchResult",9),MnA=N(fr,"containsActiveSearchResult",9),knA=N(fr,"onEdit",9);$t(!0);var VF,af=BwA(),SnA=cA(af);ve(PE=>{VF=Xt(af,1,"jse-inline-value svelte-1jv89ui",null,VF,{"jse-selected":vnA(),"jse-highlight":bnA(),"jse-active":MnA()}),xt(SnA,PE)},[()=>(_(gC),_(qF()),_(jF()),_(50),QA(()=>{var PE;return gC((PE=qF().stringify(jF()))!==null&&PE!==void 0?PE:"",50)}))]),ue("dblclick",af,()=>knA()(zE())),lA(wI,af),St()})(ma,{get path(){return c(wn)},get value(){return c(ua)},get parser(){return v()},get isSelected(){return c(fa)},get containsSearchResult(){return c(OE)},get containsActiveSearchResult(){return c(TE)},onEdit:at})},lv=ma=>{var kg=et(()=>(_(o0),c(uA),c(be),_(c(wn)),QA(()=>{var fr;return(fr=o0(c(uA),c(be),c(wn)))===null||fr===void 0?void 0:fr.searchResults}))),TE=et(()=>c(ua)!==void 0?c(ua):""),OE=et(()=>(_(g0),c(uA),c(xA),_(c(wn)),QA(()=>g0(c(uA),c(xA),c(wn))))),wI=et(()=>c(fa)?c(LA):void 0);l$(ma,{get path(){return c(wn)},get value(){return c(TE)},get enforceString(){return c(OE)},get selection(){return c(wI)},get searchResultItems(){return c(kg)},get context(){return c(Ge)}})};YA(Bd,ma=>{_(jo),_(c(ua)),QA(()=>jo(c(ua)))?ma(HE):ma(lv,!1)});var cv=bA(Bd),Cv=ma=>{var kg=MwA();P2(cA(kg),{selected:!0,onContextMenu:fo}),lA(ma,kg)};YA(cv,ma=>{_(I()),_(c(fa)),_(za),c(LA),QA(()=>!I()&&c(fa)&&!za(c(LA)))&&ma(Cv)});var hc=bA(YE,2),DI=ma=>{ZQ(ma,{get validationError(){return c(dd)},get onExpand(){return ol}})};YA(hc,ma=>{c(dd)&&ma(DI)}),ve(ma=>{fn(pI,"data-path",ma),ag=Xt(YE,1,"jse-value-outer svelte-1p86y3c",null,ag,{"jse-selected-value":c(fa)})},[()=>(_(DD),_(c(wn)),QA(()=>DD(c(wn))))]),lA(Hr,pI)});var Ec=bA(dl),Bl=Hr=>{lA(Hr,SwA())};YA(Ec,Hr=>{c(A)&&Hr(Bl)}),lA(mt,u0)});var qt,Uo=cA(bA(no));Mo(Re,mt=>x(KA,mt),()=>c(KA)),as(Re,(mt,si)=>QD?.(mt,si),()=>ca),Er(()=>ue("scroll",Re,gt));var Jn=bA(Re,2),Jo=mt=>{var si=et(()=>(c(ZA),QA(()=>"You pasted a JSON ".concat(Array.isArray(c(ZA).contents)?"array":"object"," as text")))),Wo=et(()=>[{icon:P0,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:Co},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:la}]);Mg(mt,{type:"info",get message(){return c(si)},get actions(){return c(Wo)}})};YA(Jn,mt=>{c(ZA)&&mt(Jo)});var Cn=bA(Jn,2),Lt=mt=>{var si=et(()=>[{icon:P0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:ln},{text:"Leave as is",title:"Keep the pasted array",onClick:pi}]);Mg(mt,{type:"info",message:"Multiline text was pasted as array",get actions(){return c(si)}})};YA(Cn,mt=>{c(MA)&&mt(Lt)});var Vi=bA(Cn,2),Vt=mt=>{var si=et(()=>I()?[]:[{icon:g8,text:"Ok",title:"Accept the repaired document",onClick:sn},{icon:j4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:to}]);Mg(mt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return c(si)},onClose:L})};YA(Vi,mt=>{c(At)&&mt(Vt)}),gN(bA(Vi,2),{get validationErrors(){return c(en)},selectError:Se}),ve(()=>{zt=Xt(Dn,1,"jse-table-invisible-start-section svelte-1p86y3c",null,zt,{"jse-search-box-background":c(_A)}),fn(Hi,"colspan",(c(Te),QA(()=>c(Te).length))),bi=gl(Hi,"",bi,{height:(c(i),QA(()=>c(i).startHeight+"px"))}),fn(Uo,"colspan",(c(Te),QA(()=>c(Te).length))),qt=gl(Uo,"",qt,{height:(c(i),QA(()=>c(i).endHeight+"px"))})}),lA(Be,Ye)},ne=Be=>{var Ye=yi(),ke=$e(Ye),Re=xn=>{var q=NwA(),fA=$e(q),PA=et(()=>I()?[]:[{icon:j4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:to}]);Mg(fA,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return c(PA)}}),p$(bA(fA,2),{get text(){return c(XA)},get json(){return c(uA)},get indentation(){return Y()},get parser(){return v()}}),lA(xn,q)},ii=xn=>{pwA(xn,{get text(){return c(XA)},get json(){return c(uA)},get readOnly(){return I()},get parser(){return v()},openJSONEditorModal:at,extractPath:Ot,get onChangeMode(){return AA()},onClick:()=>{L()}})};YA(ke,xn=>{c(EA)&&c(XA)!==void 0&&c(XA)!==""?xn(Re):xn(ii,!1)},!0),lA(Be,Ye)};YA(DA,Be=>{c(ht)?Be(Ae):Be(ne,!1)}),ue("paste",gA,me),lA(k,H)},xo=k=>{lA(k,LwA())};YA(Mt,k=>{C?k(xo,!1):k(Vo)}),Mo(Yi,k=>x(mA,k),()=>c(mA));var u=bA(Yi,2),w=k=>{s$(k,{onClose:()=>x(J,!1)})};YA(u,k=>{c(J)&&k(w)});var S=bA(u,2),T=k=>{g$(k,oI(()=>c(Ke),{onClose:()=>{var H;(H=c(Ke))===null||H===void 0||H.onClose(),x(Ke,void 0)}}))};return YA(S,k=>{c(Ke)&&k(T)}),ve(()=>xi=Xt(Yi,1,"jse-table-mode svelte-1p86y3c",null,xi,{"no-main-menu":!f()})),ue("mousedown",Yi,function(k){if(k.buttons===1||k.buttons===2){var H=k.target;H.isContentEditable||L();var Z=SX(H);if(Z){if(za(c(LA))&&su(c(uA),c(LA),Z))return;x(LA,_i(Z)),k.preventDefault()}}}),ue("keydown",Yi,function(k){var H=fC(k);if(o("keydown",{combo:H,key:k.key}),H==="Ctrl+X"&&(k.preventDefault(),Ja(!0)),H==="Ctrl+Shift+X"&&(k.preventDefault(),Ja(!1)),H==="Ctrl+C"&&(k.preventDefault(),Sa(!0)),H==="Ctrl+Shift+C"&&(k.preventDefault(),Sa(!1)),H==="Ctrl+D"&&(k.preventDefault(),pn()),H!=="Delete"&&H!=="Backspace"||(k.preventDefault(),Mi()),H==="Insert"&&k.preventDefault(),H==="Ctrl+A"&&k.preventDefault(),H==="Ctrl+Q"&&Go(k),H==="ArrowLeft"&&(k.preventDefault(),gi(),c(LA))){var Z=(function(Ye,ke){var{rowIndex:Re,columnIndex:ii}=nl(st(ke),Ye);return ii>0?_i(L1({rowIndex:Re,columnIndex:ii-1},Ye)):ke})(c(Te),c(LA));x(LA,Z),ko(st(Z))}if(H==="ArrowRight"&&(k.preventDefault(),gi(),c(LA))){var gA=(function(Ye,ke){var{rowIndex:Re,columnIndex:ii}=nl(st(ke),Ye);return ii0?_i(L1({rowIndex:Re-1,columnIndex:ii},Ye)):ke})(c(Te),c(LA));x(LA,DA),ko(st(DA))}if(H==="ArrowDown"&&(k.preventDefault(),gi(),c(LA))){var Ae=(function(Ye,ke,Re){var{rowIndex:ii,columnIndex:xn}=nl(st(Re),ke);return iix(UA,O)}).get()),mA=CA(s());function KA(O){if(FW(O)){x(mA,O.undo.mode);var tA=c(UA).items(),oA=tA.findIndex(de=>de===O),NA=oA!==-1?tA[oA-1]:void 0;ee("handleUndo",{index:oA,item:O,items:tA,prevItem:NA}),NA&&i(NA.redo.selection),G()(c(mA))}}function ze(O){if(FW(O)){x(mA,O.redo.mode);var tA=c(UA).items(),oA=tA.findIndex(de=>de===O),NA=oA!==-1?tA[oA+1]:void 0;ee("handleRedo",{index:oA,item:O,items:tA,nextItem:NA}),NA&&i(NA.undo.selection),G()(c(mA))}}var Ke=CA(),HA={type:"separator"},uA=CA(),XA=CA();function EA(O){if(c(aA))return c(aA).patch(O);if(c(hA))return c(hA).patch(O);if(c(JA))return c(JA).patch(O);throw new Error('Method patch is not available in mode "'.concat(c(mA),'"'))}function ZA(O,tA){if(c(aA))return c(aA).expand(O,tA);if(c(JA))return c(JA).expand(O,tA);throw new Error('Method expand is not available in mode "'.concat(c(mA),'"'))}function MA(O,tA){if(c(aA))return c(aA).collapse(O,tA);if(c(JA))return c(JA).collapse(O,tA);throw new Error('Method collapse is not available in mode "'.concat(c(mA),'"'))}function be(O){if(c(JA))c(JA).openTransformModal(O);else if(c(aA))c(aA).openTransformModal(O);else{if(!c(hA))throw new Error('Method transform is not available in mode "'.concat(c(mA),'"'));c(hA).openTransformModal(O)}}function _A(){if(c(JA))return c(JA).validate();if(c(aA))return c(aA).validate();if(c(hA))return c(hA).validate();throw new Error('Method validate is not available in mode "'.concat(c(mA),'"'))}function pA(){return c(aA)?c(aA).acceptAutoRepair():A()}function Rt(O){if(c(aA))return c(aA).scrollTo(O);if(c(hA))return c(hA).scrollTo(O);throw new Error('Method scrollTo is not available in mode "'.concat(c(mA),'"'))}function Et(O){if(c(aA))return c(aA).findElement(O);if(c(hA))return c(hA).findElement(O);throw new Error('Method findElement is not available in mode "'.concat(c(mA),'"'))}function Qe(){c(JA)?c(JA).focus():c(aA)?c(aA).focus():c(hA)&&c(hA).focus()}function _t(){return Ue.apply(this,arguments)}function Ue(){return(Ue=Ut(function*(){c(JA)&&(yield c(JA).refresh())})).apply(this,arguments)}RA(()=>_(s()),()=>{(function(O){if(O!==c(mA)){var tA={type:"mode",undo:{mode:c(mA),selection:void 0},redo:{mode:O,selection:void 0}};c(mA)==="text"&&c(JA)&&c(JA).flush(),ee("add history item",tA),c(UA).add(tA),x(mA,O)}})(s())}),RA(()=>(c(mA),_(G())),()=>{x(Ke,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(c(mA),")"),className:"jse-group-button jse-first"+(c(mA)===ga.text?" jse-selected":""),onClick:()=>G()(ga.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(c(mA),")"),className:"jse-group-button "+(c(mA)===ga.tree?" jse-selected":""),onClick:()=>G()(ga.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(c(mA),")"),className:"jse-group-button jse-last"+(c(mA)===ga.table?" jse-selected":""),onClick:()=>G()(ga.table)}])}),RA(()=>(c(Ke),_(AA()),c(mA),_(v()),_(n())),()=>{x(uA,O=>{var tA=hR(O[0])?c(Ke).concat(O):c(Ke).concat(HA,O),oA=Y4(tA);return AA()(tA,{mode:c(mA),modal:v(),readOnly:n()})||oA})}),RA(()=>(_(z()),c(mA),_(v()),_(n()),_(i())),()=>{x(XA,O=>{var tA,oA=Y4(O);return(tA=z()(O,{mode:c(mA),modal:v(),readOnly:n(),selection:i()}))!==null&&tA!==void 0?tA:!n()&&oA})}),mn();var Te={patch:EA,expand:ZA,collapse:MA,transform:be,validate:_A,acceptAutoRepair:pA,scrollTo:Rt,findElement:Et,focus:Qe,refresh:_t};$t();var ht=yi(),Me=$e(ht),Ai=O=>{Mo(dwA(O,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return a()},get mainMenuBar(){return g()},get statusBar(){return C()},get askToFormat(){return I()},get escapeUnicodeCharacters(){return B()},get parser(){return E()},get validator(){return b()},get validationParser(){return R()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onError(){return yA()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},$$legacy:!0}),tA=>x(JA,tA),()=>c(JA))},J=O=>{var tA=yi(),oA=$e(tA),NA=Ee=>{Mo(GwA(Ee,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get truncateTextSize(){return r()},get mainMenuBar(){return g()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get flattenColumns(){return Q()},get parser(){return E()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return R()},get indentation(){return o()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onRenderValue(){return Y()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},get onJSONEditorModal(){return iA()},$$legacy:!0}),xA=>x(hA,xA),()=>c(hA))},de=Ee=>{Mo(LR(Ee,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return c(UA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return r()},get mainMenuBar(){return g()},get navigationBar(){return l()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get parser(){return E()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return R()},get pathParser(){return M()},get onError(){return yA()},get onChange(){return F()},get onChangeMode(){return G()},get onSelect(){return U()},onUndo:KA,onRedo:ze,get onRenderValue(){return Y()},get onClassName(){return j()},get onFocus(){return P()},get onBlur(){return nA()},get onRenderMenu(){return c(uA)},get onRenderContextMenu(){return c(XA)},get onSortModal(){return eA()},get onTransformModal(){return dA()},get onJSONEditorModal(){return iA()},$$legacy:!0}),xA=>x(aA,xA),()=>c(aA))};YA(oA,Ee=>{c(mA),_(ga),QA(()=>c(mA)===ga.table)?Ee(NA):Ee(de,!1)},!0),lA(O,tA)};return YA(Me,O=>{c(mA),_(ga),QA(()=>c(mA)===ga.text||String(c(mA))==="code")?O(Ai):O(J,!1)}),lA(t,ht),Tt(e,"patch",EA),Tt(e,"expand",ZA),Tt(e,"collapse",MA),Tt(e,"transform",be),Tt(e,"validate",_A),Tt(e,"acceptAutoRepair",pA),Tt(e,"scrollTo",Rt),Tt(e,"findElement",Et),Tt(e,"focus",Qe),Tt(e,"refresh",_t),St(Te)}Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-modal-wrapper.svelte-t4zsk3 { flex: 1; display: flex; min-width: 0; min-height: 0; flex-direction: column; } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) { flex: 1; display: flex; flex-direction: column; padding: 20px; overflow: auto; min-width: 0; min-height: 0; } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) { display: flex; flex-direction: row; justify-content: flex-end; padding-top: var(--jse-padding, 10px); } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-actions:where(.svelte-t4zsk3) button.jse-primary:where(.svelte-t4zsk3):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) { font-weight: bold; display: block; box-sizing: border-box; } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-label:where(.svelte-t4zsk3) .jse-label-inner:where(.svelte-t4zsk3) { margin-top: calc(2 * var(--jse-padding, 10px)); margin-bottom: calc(0.5 * var(--jse-padding, 10px)); box-sizing: border-box; } .jse-modal-wrapper.svelte-t4zsk3 .jse-modal-contents:where(.svelte-t4zsk3) .jse-modal-inline-editor:where(.svelte-t4zsk3) { flex: 1; min-height: 150px; min-width: 0; max-width: 100%; display: flex; --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); } .jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) { gap: var(--jse-padding, 10px); align-items: center; } .jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) .jse-error:where(.svelte-t4zsk3) { flex: 1; color: var(--jse-error-color, #ee5341); } .jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-secondary-background, #d3d3d3); color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):hover { background: var(--jse-button-secondary-background-highlight, #e1e1e1); } .jse-modal-wrapper.svelte-t4zsk3 .jse-actions:where(.svelte-t4zsk3) button.jse-secondary:where(.svelte-t4zsk3):disabled { background: var(--jse-button-secondary-background-disabled, #9d9d9d); } .jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3) { border: var(--jse-input-border, 1px solid #d8dbdf); outline: none; box-sizing: border-box; padding: calc(0.5 * var(--jse-padding, 10px)); font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); font-size: var(--jse-font-size-mono, 14px); color: inherit; background: var(--jse-input-background, var(--jse-background-color, #fff)); } .jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):focus { border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); } .jse-modal-wrapper.svelte-t4zsk3 input:where(.svelte-t4zsk3):read-only { background: var(--jse-input-background-readonly, transparent); }`);var KwA=FA('
      '),UwA=FA(''),JwA=FA(''),YwA=FA(''),HwA=FA('
      Path
      Contents
      ',1),TwA=FA('
      '),OwA={};Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-modal-contents.svelte-lwzlls { flex: 1; display: flex; flex-direction: column; padding: 20px; overflow: auto; min-width: 0; min-height: 0; } .jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) { display: flex; flex-direction: row; justify-content: flex-end; padding-top: var(--jse-padding, 10px); } .jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls) { border: none; background: transparent; color: inherit; cursor: pointer; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); padding: 5px; margin: 0; background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); color: var(--jse-button-primary-color, #fff); padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); border-radius: 3px; } .jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):hover { background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); } .jse-modal-contents.svelte-lwzlls .jse-actions:where(.svelte-lwzlls) button.jse-primary:where(.svelte-lwzlls):disabled { background: var(--jse-button-primary-background-disabled, #9d9d9d); } .jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) { width: 100%; border-collapse: collapse; border-spacing: 0; } .jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) th:where(.svelte-lwzlls), .jse-modal-contents.svelte-lwzlls table:where(.svelte-lwzlls) td:where(.svelte-lwzlls) { text-align: left; vertical-align: middle; font-weight: normal; padding-bottom: var(--jse-padding, 10px); } .jse-modal-contents.svelte-lwzlls input.jse-path:where(.svelte-lwzlls) { width: 100%; box-sizing: border-box; padding: 5px 10px; border: var(--jse-input-border, 1px solid #d8dbdf); border-radius: var(--jse-input-radius, 3px); font-family: inherit; font-size: inherit; background: inherit; background: var(--jse-input-background-readonly, transparent); color: inherit; outline: none; } .jse-modal-contents.svelte-lwzlls .svelte-select input { box-sizing: border-box; } .jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) { height: 200px; } .jse-modal-contents.svelte-lwzlls .jse-space:where(.svelte-lwzlls) .jse-error:where(.svelte-lwzlls) { color: var(--jse-error-color, #ee5341); }`);var _Q=XD(()=>OwA),zwA=FA('Property'),PwA=FA('
      '),jwA=FA('
      Path
      Direction
      ',1);Pt(`/* over all fonts, sizes, and colors */ /* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ /* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ /* main, menu, modal */ /* jsoneditor modal */ /* tooltip in text mode */ /* panels: navigation bar, gutter, search box */ /* navigation-bar */ /* context menu */ /* contents: json key and values */ /* contents: selected or hovered */ /* contents: section of collapsed items in an array */ /* contents: highlighting of search matches */ /* contents: inline tags inside the JSON document */ /* contents: table */ /* controls in modals: inputs, buttons, and \`a\` */ /* messages */ /* svelte-select */ /* color picker */ .jse-main.svelte-1l55585 { width: 100%; height: 100%; min-width: 0; min-height: 150px; font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); font-size: var(--jse-font-size, 16px); line-height: normal; position: relative; display: flex; flex-direction: row; } .jse-main.svelte-1l55585:not(.jse-focus) { --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); }`);var qwA=FA('
      ',1);function VwA(t,e){kt(e,!1);var A=CA(void 0,!0),i=qa("jsoneditor:JSONEditor"),n={text:""},o=void 0,a=!1,r=ga.tree,s=!0,g=!0,l=!0,C=!0,I=!1,d=!1,B=!0,Q=JSON,E=void 0,f=JSON,b={parse:X6A,stringify:$s},R=[u6A],M=R[0].id,v=ol,F=void 0,G=void 0,U=Z6A,Y=ol,j=ol,AA=ol,z=ol,yA=se=>{console.error(se),alert(se.toString())},P=ol,nA=ol,eA=N(e,"content",13,n),dA=N(e,"selection",13,o),iA=N(e,"readOnly",13,a),aA=N(e,"indentation",13,2),hA=N(e,"tabSize",13,4),JA=N(e,"truncateTextSize",13,1e3),ee=N(e,"mode",13,r),UA=N(e,"mainMenuBar",13,s),mA=N(e,"navigationBar",13,g),KA=N(e,"statusBar",13,l),ze=N(e,"askToFormat",13,C),Ke=N(e,"escapeControlCharacters",13,I),HA=N(e,"escapeUnicodeCharacters",13,d),uA=N(e,"flattenColumns",13,B),XA=N(e,"parser",13,Q),EA=N(e,"validator",13,E),ZA=N(e,"validationParser",13,f),MA=N(e,"pathParser",13,b),be=N(e,"queryLanguages",13,R),_A=N(e,"queryLanguageId",13,M),pA=N(e,"onChangeQueryLanguage",13,v),Rt=N(e,"onChange",13,F),Et=N(e,"onSelect",13,G),Qe=N(e,"onRenderValue",13,U),_t=N(e,"onClassName",13,Y),Ue=N(e,"onRenderMenu",13,j),Te=N(e,"onRenderContextMenu",13,AA),ht=N(e,"onChangeMode",13,z),Me=N(e,"onError",13,yA),Ai=N(e,"onFocus",13,P),J=N(e,"onBlur",13,nA),O=CA(YQ(),!0),tA=CA(!1,!0),oA=CA(void 0,!0),NA=CA(void 0,!0),de=CA(void 0,!0),Ee=CA(void 0,!0),xA=CA(XA(),!0);function LA(){return eA()}function dt(se){i("set");var Ci=Jx(se);if(Ci)throw new Error(Ci);x(O,YQ()),eA(se),uo()}function At(se){i("update");var Ci=Jx(se);if(Ci)throw new Error(Ci);eA(se),uo()}function Je(se){var Ci=c(oA).patch(se);return uo(),Ci}function Ge(se){dA(se),uo()}function ri(se,Ci){c(oA).expand(se,Ci),uo()}function en(se){var Ci=arguments.length>1&&arguments[1]!==void 0&&arguments[1];c(oA).collapse(se,Ci),uo()}function rn(){var se=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};c(oA).transform(se),uo()}function Le(){return c(oA).validate()}function ji(){var se=c(oA).acceptAutoRepair();return uo(),se}function Bi(se){return vi.apply(this,arguments)}function vi(){return(vi=Ut(function*(se){yield c(oA).scrollTo(se)})).apply(this,arguments)}function Ji(se){return c(oA).findElement(se)}function Dt(){c(oA).focus(),uo()}function qi(){return Nt.apply(this,arguments)}function Nt(){return(Nt=Ut(function*(){yield c(oA).refresh()})).apply(this,arguments)}function L(se){var Ci,tn,ln,So,la,pi,to,Ja,Io,Sa,kn,Mi,Ot,pn,io,mo,vA,VA,me,IA,SA,re,Se,tt,at,bt,Sn,ki,Gi,jt,Si,ca=Object.keys(se);for(var Ft of ca)switch(Ft){case"content":eA((Ci=se[Ft])!==null&&Ci!==void 0?Ci:n);break;case"selection":dA((tn=se[Ft])!==null&&tn!==void 0?tn:o);break;case"readOnly":iA((ln=se[Ft])!==null&&ln!==void 0?ln:a);break;case"indentation":aA((So=se[Ft])!==null&&So!==void 0?So:2);break;case"tabSize":hA((la=se[Ft])!==null&&la!==void 0?la:4);break;case"truncateTextSize":JA((pi=se[Ft])!==null&&pi!==void 0?pi:1e3);break;case"mode":ee((to=se[Ft])!==null&&to!==void 0?to:r);break;case"mainMenuBar":UA((Ja=se[Ft])!==null&&Ja!==void 0?Ja:s);break;case"navigationBar":mA((Io=se[Ft])!==null&&Io!==void 0?Io:g);break;case"statusBar":KA((Sa=se[Ft])!==null&&Sa!==void 0?Sa:l);break;case"askToFormat":ze((kn=se[Ft])!==null&&kn!==void 0?kn:C);break;case"escapeControlCharacters":Ke((Mi=se[Ft])!==null&&Mi!==void 0?Mi:I);break;case"escapeUnicodeCharacters":HA((Ot=se[Ft])!==null&&Ot!==void 0?Ot:d);break;case"flattenColumns":uA((pn=se[Ft])!==null&&pn!==void 0?pn:B);break;case"parser":XA((io=se[Ft])!==null&&io!==void 0?io:Q);break;case"validator":EA((mo=se[Ft])!==null&&mo!==void 0?mo:E);break;case"validationParser":ZA((vA=se[Ft])!==null&&vA!==void 0?vA:f);break;case"pathParser":MA((VA=se[Ft])!==null&&VA!==void 0?VA:b);break;case"queryLanguages":be((me=se[Ft])!==null&&me!==void 0?me:R);break;case"queryLanguageId":_A((IA=se[Ft])!==null&&IA!==void 0?IA:M);break;case"onChangeQueryLanguage":pA((SA=se[Ft])!==null&&SA!==void 0?SA:v);break;case"onChange":Rt((re=se[Ft])!==null&&re!==void 0?re:F);break;case"onRenderValue":Qe((Se=se[Ft])!==null&&Se!==void 0?Se:U);break;case"onClassName":_t((tt=se[Ft])!==null&&tt!==void 0?tt:Y);break;case"onRenderMenu":Ue((at=se[Ft])!==null&&at!==void 0?at:j);break;case"onRenderContextMenu":Te((bt=se[Ft])!==null&&bt!==void 0?bt:AA);break;case"onChangeMode":ht((Sn=se[Ft])!==null&&Sn!==void 0?Sn:z);break;case"onSelect":Et((ki=se[Ft])!==null&&ki!==void 0?ki:G);break;case"onError":Me((Gi=se[Ft])!==null&&Gi!==void 0?Gi:yA);break;case"onFocus":Ai((jt=se[Ft])!==null&&jt!==void 0?jt:P);break;case"onBlur":J((Si=se[Ft])!==null&&Si!==void 0?Si:nA);break;default:rt(Ft)}function rt(xi){i('Unknown property "'.concat(xi,'"'))}be().some(xi=>xi.id===_A())||_A(be()[0].id),uo()}function gt(){return gi.apply(this,arguments)}function gi(){return(gi=Ut(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function sn(se,Ci,tn){eA(se),Rt()&&Rt()(se,Ci,tn)}function gn(se){dA(se),Et()&&Et()(Y4(se))}function Kn(){x(tA,!0),Ai()&&Ai()()}function ko(){x(tA,!1),J()&&J()()}function eo(se){return fo.apply(this,arguments)}function fo(){return(fo=Ut(function*(se){ee()!==se&&(ee(se),uo(),Dt(),ht()(se))})).apply(this,arguments)}function Go(se){i("handleChangeQueryLanguage",se),_A(se),pA()(se)}function co(se){var{id:Ci,json:tn,rootPath:ln,onTransform:So,onClose:la}=se;iA()||x(Ee,{id:Ci,json:tn,rootPath:ln,indentation:aA(),truncateTextSize:JA(),escapeControlCharacters:Ke(),escapeUnicodeCharacters:HA(),parser:XA(),parseMemoizeOne:c(A),validationParser:ZA(),pathParser:MA(),queryLanguages:be(),queryLanguageId:_A(),onChangeQueryLanguage:Go,onRenderValue:Qe(),onRenderMenu:pi=>Ue()(pi,{mode:ee(),modal:!0,readOnly:iA()}),onRenderContextMenu:pi=>Te()(pi,{mode:ee(),modal:!0,readOnly:iA(),selection:dA()}),onClassName:_t(),onTransform:So,onClose:la})}function ta(se){iA()||x(de,se)}function Ko(se){var{content:Ci,path:tn,onPatch:ln,onClose:So}=se;i("onJSONEditorModal",{content:Ci,path:tn}),x(NA,{content:Ci,path:tn,onPatch:ln,readOnly:iA(),indentation:aA(),tabSize:hA(),truncateTextSize:JA(),mainMenuBar:UA(),navigationBar:mA(),statusBar:KA(),askToFormat:ze(),escapeControlCharacters:Ke(),escapeUnicodeCharacters:HA(),flattenColumns:uA(),parser:XA(),validator:void 0,validationParser:ZA(),pathParser:MA(),onRenderValue:Qe(),onClassName:_t(),onRenderMenu:Ue(),onRenderContextMenu:Te(),onSortModal:ta,onTransformModal:co,onClose:So})}function qo(se){se.stopPropagation()}RA(()=>(_(XA()),c(xA),_(eA()),YQ),()=>{if(!pX(XA(),c(xA))){if(i("parser changed, recreate editor"),iu(eA())){var se=c(xA).stringify(eA().json);eA({json:se!==void 0?XA().parse(se):void 0})}x(xA,XA()),x(O,YQ())}}),RA(()=>_(eA()),()=>{var se=Jx(eA());se&&console.error("Error: "+se)}),RA(()=>_(dA()),()=>{dA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),RA(()=>_(XA()),()=>{x(A,VB(XA().parse))}),RA(()=>_(ee()),()=>{i("mode changed to",ee())}),mn();var Co={get:LA,set:dt,update:At,patch:Je,select:Ge,expand:ri,collapse:en,transform:rn,validate:Le,acceptAutoRepair:ji,scrollTo:Bi,findElement:Ji,focus:Dt,refresh:qi,updateProps:L,destroy:gt};return $t(!0),QR(t,{children:(se,Ci)=>{var tn,ln=qwA(),So=$e(ln);lX(cA(So),()=>c(O),kn=>{Mo(CZ(kn,{get externalMode(){return ee()},get content(){return eA()},get selection(){return dA()},get readOnly(){return iA()},get indentation(){return aA()},get tabSize(){return hA()},get truncateTextSize(){return JA()},get statusBar(){return KA()},get askToFormat(){return ze()},get mainMenuBar(){return UA()},get navigationBar(){return mA()},get escapeControlCharacters(){return Ke()},get escapeUnicodeCharacters(){return HA()},get flattenColumns(){return uA()},get parser(){return XA()},get parseMemoizeOne(){return c(A)},get validator(){return EA()},get validationParser(){return ZA()},get pathParser(){return MA()},insideModal:!1,get onError(){return Me()},onChange:sn,onChangeMode:eo,onSelect:gn,get onRenderValue(){return Qe()},get onClassName(){return _t()},onFocus:Kn,onBlur:ko,get onRenderMenu(){return Ue()},get onRenderContextMenu(){return Te()},onSortModal:ta,onTransformModal:co,onJSONEditorModal:Ko,$$legacy:!0}),Mi=>x(oA,Mi),()=>c(oA))});var la=bA(So,2),pi=kn=>{(function(Mi,Ot){var pn,io;kt(Ot,!1);var mo=CA(void 0,!0),vA=CA(void 0,!0),VA=CA(void 0,!0),me=CA(void 0,!0),IA=qa("jsoneditor:SortModal"),SA=N(Ot,"id",9),re=N(Ot,"json",9),Se=N(Ot,"rootPath",9),tt=N(Ot,"onSort",9),at=N(Ot,"onClose",9),bt={value:1,label:"ascending"},Sn=[bt,{value:-1,label:"descending"}],ki="".concat(SA(),":").concat(pt(Se())),Gi=CA((pn=_Q()[ki])===null||pn===void 0?void 0:pn.selectedProperty,!0),jt=CA(((io=_Q()[ki])===null||io===void 0?void 0:io.selectedDirection)||bt,!0),Si=CA(void 0,!0);function ca(){try{var rt,xi,Yi;x(Si,void 0);var Un=((rt=c(Gi))===null||rt===void 0?void 0:rt.value)||((xi=c(me))===null||xi===void 0||(xi=xi[0])===null||xi===void 0?void 0:xi.value)||[],cn=(Yi=c(jt))===null||Yi===void 0?void 0:Yi.value,Mt=I$(re(),Se(),Un,cn);tt()!==void 0&&Se()!==void 0&&tt()({operations:Mt,rootPath:Se(),itemPath:Un,direction:cn}),at()()}catch(Vo){x(Si,String(Vo))}}function Ft(rt){rt.focus()}RA(()=>(_(re()),_(Se())),()=>{x(mo,Pe(re(),Se()))}),RA(()=>c(mo),()=>{x(vA,Array.isArray(c(mo)))}),RA(()=>(c(vA),c(mo)),()=>{x(VA,c(vA)?dR(c(mo)):void 0)}),RA(()=>(c(VA),W2),()=>{x(me,c(VA)?c(VA).map(W2):void 0)}),RA(()=>(_Q(),c(Gi),c(jt)),()=>{_Q(_Q()[ki]={selectedProperty:c(Gi),selectedDirection:c(jt)}),IA("store state in memory",ki,_Q()[ki])}),mn(),$t(!0),cu(Mi,{get onClose(){return at()},className:"jse-sort-modal",children:(rt,xi)=>{var Yi=jwA(),Un=$e(Yi),cn=et(()=>c(vA)?"Sort array items":"Sort object keys");zD(Un,{get title(){return c(cn)},get onClose(){return at()}});var Mt=cA(bA(Un,2)),Vo=bA(cA(Mt)),xo=cA(Vo),u=bA(cA(xo)),w=cA(u),S=bA(xo),T=ne=>{var Be=zwA(),Ye=bA(cA(Be));U1(cA(Ye),{showChevron:!0,get items(){return c(me)},get value(){return c(Gi)},set value(ke){x(Gi,ke)},$$legacy:!0}),lA(ne,Be)};YA(S,ne=>{c(vA),c(me),QA(()=>{var Be;return c(vA)&&c(me)&&((Be=c(me))===null||Be===void 0?void 0:Be.length)>1})&&ne(T)});var k=bA(S),H=bA(cA(k));U1(cA(H),{showChevron:!0,clearable:!1,get items(){return Sn},get value(){return c(jt)},set value(ne){x(jt,ne)},$$legacy:!0});var Z=bA(Mt,2),gA=cA(Z),DA=ne=>{var Be=PwA(),Ye=cA(Be);ve(()=>xt(Ye,c(Si))),lA(ne,Be)};YA(gA,ne=>{c(Si)&&ne(DA)});var Ae=cA(bA(Z,2));Er(()=>ue("click",Ae,ca)),as(Ae,ne=>Ft?.(ne)),ve(ne=>{Z1(w,ne),Ae.disabled=(c(vA),c(me),c(Gi),QA(()=>{var Be;return!!(c(vA)&&c(me)&&((Be=c(me))===null||Be===void 0?void 0:Be.length)>1)&&!c(Gi)}))},[()=>(_(Se()),_(zi),_($s),QA(()=>Se()&&!zi(Se())?$s(Se()):"(document root)"))]),lA(rt,Yi)},$$slots:{default:!0}}),St()})(kn,oI(()=>c(de),{onClose:()=>{var Mi;(Mi=c(de))===null||Mi===void 0||Mi.onClose(),x(de,void 0)}}))};YA(la,kn=>{c(de)&&kn(pi)});var to=bA(la,2),Ja=kn=>{XDA(kn,oI(()=>c(Ee),{onClose:()=>{var Mi;(Mi=c(Ee))===null||Mi===void 0||Mi.onClose(),x(Ee,void 0)}}))};YA(to,kn=>{c(Ee)&&kn(Ja)});var Io=bA(to,2),Sa=kn=>{(function(Mi,Ot){kt(Ot,!1);var pn=CA(void 0,!0),io=CA(void 0,!0),mo=CA(void 0,!0),vA=CA(void 0,!0),VA=qa("jsoneditor:JSONEditorModal"),me=N(Ot,"content",9),IA=N(Ot,"path",9),SA=N(Ot,"onPatch",9),re=N(Ot,"readOnly",9),Se=N(Ot,"indentation",9),tt=N(Ot,"tabSize",9),at=N(Ot,"truncateTextSize",9),bt=N(Ot,"mainMenuBar",9),Sn=N(Ot,"navigationBar",9),ki=N(Ot,"statusBar",9),Gi=N(Ot,"askToFormat",9),jt=N(Ot,"escapeControlCharacters",9),Si=N(Ot,"escapeUnicodeCharacters",9),ca=N(Ot,"flattenColumns",9),Ft=N(Ot,"parser",9),rt=N(Ot,"validator",9),xi=N(Ot,"validationParser",9),Yi=N(Ot,"pathParser",9),Un=N(Ot,"onRenderValue",9),cn=N(Ot,"onClassName",9),Mt=N(Ot,"onRenderMenu",9),Vo=N(Ot,"onRenderContextMenu",9),xo=N(Ot,"onSortModal",9),u=N(Ot,"onTransformModal",9),w=N(Ot,"onClose",9),S=CA(void 0,!0),T=CA(void 0,!0),k={mode:gA(me()),content:me(),selection:void 0,relativePath:IA()},H=CA([k],!0),Z=CA(void 0,!0);function gA(fA){return iu(fA)&&Lo(fA.json)?ga.table:ga.tree}function DA(){var fA,PA=(fA=fi(c(H)))===null||fA===void 0?void 0:fA.selection;ru(PA)&&c(S).scrollTo(st(PA))}function Ae(){if(VA("handleApply"),!re())try{x(Z,void 0);var fA=c(pn).relativePath,PA=c(pn).content,Ne=[{op:"replace",path:pt(fA),value:DW(PA,Ft()).json}];if(c(H).length>1){var pe=DW(c(H)[c(H).length-2].content,Ft()).json,we={json:Js(pe,Ne)},it=ye(ye({},c(H)[c(H).length-2]||k),{},{content:we});x(H,[...c(H).slice(0,c(H).length-2),it]),uo(),DA()}else SA()(Ne),w()()}catch(zt){x(Z,String(zt))}}function ne(){if(VA("handleClose"),c(T))x(T,!1);else if(c(H).length>1){var fA;x(H,Li(c(H))),uo(),(fA=c(S))===null||fA===void 0||fA.focus(),DA(),x(Z,void 0)}else w()()}function Be(fA){VA("handleChange",fA),Re(PA=>ye(ye({},PA),{},{content:fA}))}function Ye(fA){VA("handleChangeSelection",fA),Re(PA=>ye(ye({},PA),{},{selection:fA}))}function ke(fA){VA("handleChangeMode",fA),Re(PA=>ye(ye({},PA),{},{mode:fA}))}function Re(fA){var PA=fA(fi(c(H)));x(H,[...Li(c(H)),PA])}function ii(fA){x(Z,fA.toString()),console.error(fA)}function xn(fA){var PA,{content:Ne,path:pe}=fA;VA("handleJSONEditorModal",{content:Ne,path:pe});var we={mode:gA(Ne),content:Ne,selection:void 0,relativePath:pe};x(H,[...c(H),we]),uo(),(PA=c(S))===null||PA===void 0||PA.focus()}function q(fA){fA.focus()}Jr(()=>{var fA;(fA=c(S))===null||fA===void 0||fA.focus()}),RA(()=>c(H),()=>{x(pn,fi(c(H))||k)}),RA(()=>c(H),()=>{x(io,c(H).flatMap(fA=>fA.relativePath))}),RA(()=>(c(io),$s),()=>{x(mo,zi(c(io))?"(document root)":$s(c(io)))}),RA(()=>_(Ft()),()=>{x(vA,VB(Ft().parse))}),mn(),$t(!0),cu(Mi,{onClose:ne,className:"jse-jsoneditor-modal",get fullscreen(){return c(T)},children:(fA,PA)=>{var Ne=TwA();QR(cA(Ne),{children:(pe,we)=>{var it=HwA(),zt=$e(it),bi=et(()=>(c(H),QA(()=>c(H).length>1?" (".concat(c(H).length,")"):"")));zD(zt,{get title(){var Vt;return"Edit nested content ".concat((Vt=c(bi))!==null&&Vt!==void 0?Vt:"")},fullScreenButton:!0,onClose:ne,get fullscreen(){return c(T)},set fullscreen(Vt){x(T,Vt)},$$legacy:!0});var Dn=bA(zt,2),Hi=bA(cA(Dn),2),no=bA(Hi,4);Mo(CZ(cA(no),{get externalMode(){return c(pn),QA(()=>c(pn).mode)},get content(){return c(pn),QA(()=>c(pn).content)},get selection(){return c(pn),QA(()=>c(pn).selection)},get readOnly(){return re()},get indentation(){return Se()},get tabSize(){return tt()},get truncateTextSize(){return at()},get statusBar(){return ki()},get askToFormat(){return Gi()},get mainMenuBar(){return bt()},get navigationBar(){return Sn()},get escapeControlCharacters(){return jt()},get escapeUnicodeCharacters(){return Si()},get flattenColumns(){return ca()},get parser(){return Ft()},get parseMemoizeOne(){return c(vA)},get validator(){return rt()},get validationParser(){return xi()},get pathParser(){return Yi()},insideModal:!0,onError:ii,onChange:Be,onChangeMode:ke,onSelect:Ye,get onRenderValue(){return Un()},get onClassName(){return cn()},get onFocus(){return ol},get onBlur(){return ol},get onRenderMenu(){return Mt()},get onRenderContextMenu(){return Vo()},get onSortModal(){return xo()},get onTransformModal(){return u()},onJSONEditorModal:xn,$$legacy:!0}),Vt=>x(S,Vt),()=>c(S));var qt=cA(bA(no,2)),Uo=Vt=>{var mt=KwA(),si=cA(mt);ve(()=>xt(si,c(Z))),lA(Vt,mt)};YA(qt,Vt=>{c(Z)&&Vt(Uo)});var Jn=bA(qt,2),Jo=Vt=>{var mt=UwA();Pi(cA(mt),{get data(){return PO}}),ue("click",mt,ne),lA(Vt,mt)};YA(Jn,Vt=>{c(H),QA(()=>c(H).length>1)&&Vt(Jo)});var Cn=bA(Jn,2),Lt=Vt=>{var mt=JwA();Er(()=>ue("click",mt,Ae)),as(mt,si=>q?.(si)),lA(Vt,mt)},Vi=Vt=>{var mt=YwA();ue("click",mt,ne),lA(Vt,mt)};YA(Cn,Vt=>{re()?Vt(Vi,!1):Vt(Lt)}),ve(()=>Z1(Hi,c(mo))),lA(pe,it)},$$slots:{default:!0}}),lA(fA,Ne)},$$slots:{default:!0}}),St()})(kn,oI(()=>c(NA),{onClose:()=>{var Mi;(Mi=c(NA))===null||Mi===void 0||Mi.onClose(),x(NA,void 0)}}))};YA(Io,kn=>{c(NA)&&kn(Sa)}),ve(()=>tn=Xt(So,1,"jse-main svelte-1l55585",null,tn,{"jse-focus":c(tA)})),ue("keydown",So,qo),lA(se,ln)},$$slots:{default:!0}}),Tt(e,"get",LA),Tt(e,"set",dt),Tt(e,"update",At),Tt(e,"patch",Je),Tt(e,"select",Ge),Tt(e,"expand",ri),Tt(e,"collapse",en),Tt(e,"transform",rn),Tt(e,"validate",Le),Tt(e,"acceptAutoRepair",ji),Tt(e,"scrollTo",Bi),Tt(e,"findElement",Ji),Tt(e,"focus",Dt),Tt(e,"refresh",qi),Tt(e,"updateProps",L),Tt(e,"destroy",gt),St(Co)}function v$(t){var{target:e,props:A}=t,i=GpA(VwA,{target:e,props:A});return i.destroy=Ut(function*(){return(function(n,o){var a=cR.get(n);return a?(cR.delete(n),a(o)):Promise.resolve()})(i)}),uo(),i}var cc=class t{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};setTimeout(()=>{this.editor=v$({target:document.getElementById("json-editor"),props:{content:e,mode:ga.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||t)(lt(ge))};static \u0275cmp=kA({type:t,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,i){A&1&&Ni(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var WwA=(t,e)=>e.name;function ZwA(t,e){if(t&1&&K(0),t&2){let A=y();Fe(" Configure ",A.selectedBuiltInTool," ")}}function XwA(t,e){if(t&1&&K(0),t&2){let A=y();Fe(" ",A.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function $wA(t,e){if(t&1){let A=zA();m(0,"div",8),$("click",function(){let n=rA(A).$implicit,o=y(3);return sA(o.onToolSelected(n))}),m(1,"mat-icon",9),K(2),D(),m(3,"span",10),K(4),D()()}if(t&2){let A=e.$implicit,i=y(3);ae("selected",i.selectedBuiltInTool===A),p(2),qA(i.getToolIcon(A)),p(2),qA(A)}}function AyA(t,e){if(t&1&&(m(0,"div",4)(1,"h3",5),K(2),D(),m(3,"div",6),Gt(4,$wA,5,4,"div",7,Ri),D()()),t&2){let A=e.$implicit;p(2),qA(A.name),p(2),Kt(A.tools)}}function eyA(t,e){if(t&1&&(m(0,"div",1),Gt(1,AyA,6,1,"div",4,WwA),D()),t&2){let A=y();p(),Kt(A.toolCategories)}}function tyA(t,e){if(t&1&&(m(0,"div",2)(1,"h3",11),K(2,"Configure Tool Arguments"),D(),GA(3,"app-json-editor",12),D()),t&2){let A=y();p(3),X("jsonString",A.toolArgsString)}}function iyA(t,e){if(t&1){let A=zA();m(0,"button",14),$("click",function(){rA(A);let n=y(2);return sA(n.backToToolSelection())}),K(1,"Back"),D()}}function nyA(t,e){if(t&1){let A=zA();V(0,iyA,2,0,"button",13),m(1,"button",14),$("click",function(){rA(A);let n=y();return sA(n.saveArgs())}),K(2),D()}if(t&2){let A=y();W(A.isEditMode?-1:0),p(2),qA(A.isEditMode?"Save":"Create")}}function oyA(t,e){if(t&1){let A=zA();m(0,"button",14),$("click",function(){rA(A);let n=y();return sA(n.cancel())}),K(1,"Cancel"),D(),m(2,"button",15),$("click",function(){rA(A);let n=y();return sA(n.addTool())}),K(3),D()}if(t&2){let A=y();p(3),Fe(" ",A.isEditMode?"Save":"Create"," ")}}var id=class t{constructor(e,A){this.data=e;this.dialogRef=A}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let e=this.builtInToolArgs.get(this.data.toolName);if(e&&e.length>0){if(this.data.toolArgs)this.toolArgs=BA({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let A of e)this.toolArgs[A]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(e){this.selectedBuiltInTool=e;let A=this.builtInToolArgs.get(e);A&&A.length>0&&(this.initializeToolArgs(e,A),this.showArgsEditor=!0)}initializeToolArgs(e,A){this.toolArgs={};for(let i of A)this.toolArgs[i]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(e){alert("Invalid JSON: "+e);return}this.addTool()}addTool(){let e={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(e.args=this.toolArgs),this.dialogRef.close(e)}cancel(){this.dialogRef.close()}getToolIcon(e){return vB(e,"Built-in tool")}static \u0275fac=function(A){return new(A||t)(lt(da),lt(Fo))};static \u0275cmp=kA({type:t,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(A,i){if(A&1&&ni(cc,5),A&2){let n;Ce(n=Ie())&&(i.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(m(0,"h2",0),V(1,ZwA,1,1)(2,XwA,1,1),D(),m(3,"mat-dialog-content"),V(4,eyA,3,0,"div",1)(5,tyA,4,1,"div",2),D(),m(6,"mat-dialog-actions",3),V(7,nyA,3,2)(8,oyA,4,1),D()),A&2&&(p(),W(i.showArgsEditor?1:2),p(3),W(i.showArgsEditor?5:4),p(3),W(i.showArgsEditor?7:8))},dependencies:[oa,yn,ya,gr,In,Ta,vn,cc],styles:[".dialog-title[_ngcontent-%COMP%]{color:var(--mdc-dialog-subhead-color)!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;background-color:var(--builder-tool-item-background-color);border:1px solid var(--builder-tool-item-border-color);min-width:0}.tool-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-tool-item-hover-background-color)}.tool-item.selected[_ngcontent-%COMP%]{background-color:#8ab4f833;border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:var(--mdc-dialog-supporting-text-color)!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:var(--mdc-dialog-supporting-text-color);margin:0 0 16px}"]})};function ayA(t,e){if(t&1){let A=zA();ws(0),m(1,"div",6)(2,"div",7),$("click",function(){rA(A);let n=y();return sA(n.toggleToolInfo())}),m(3,"mat-icon",8),K(4,"info"),D(),m(5,"div",9)(6,"span"),K(7,"Tool Information"),D()(),m(8,"button",10)(9,"mat-icon"),K(10),D()()(),m(11,"div",11)(12,"div",12)(13,"div",13),K(14),D(),m(15,"div",14),K(16),D()(),m(17,"div",15)(18,"a",16)(19,"mat-icon"),K(20,"open_in_new"),D(),m(21,"span"),K(22,"View Official Documentation"),D()()()()(),ys()}if(t&2){let A,i,n,o=y();p(10),qA(o.isToolInfoExpanded?"expand_less":"expand_more"),p(),ae("expanded",o.isToolInfoExpanded),p(3),qA((A=o.getToolInfo())==null?null:A.shortDescription),p(2),qA((i=o.getToolInfo())==null?null:i.detailedDescription),p(2),X("href",(n=o.getToolInfo())==null?null:n.docLink,Da)}}function ryA(t,e){t&1&&(m(0,"mat-hint",19),K(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),D())}function syA(t,e){if(t&1){let A=zA();m(0,"mat-form-field",2)(1,"mat-label"),K(2),D(),m(3,"input",17),ao("ngModelChange",function(n){rA(A);let o=y();return Vn(o.inputValue,n)||(o.inputValue=n),sA(n)}),$("keydown",function(n){rA(A);let o=y();return sA(o.onKeyDown(n))}),D(),yt(4,ryA,2,0,"mat-hint",18),D()}if(t&2){let A=y();p(2),qA(A.data.inputLabel||"Input"),p(),oo("ngModel",A.inputValue),X("placeholder",A.data.inputPlaceholder||"Enter value"),p(),X("ngIf",!A.isInputValid())}}var Cc=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.inputValue=A.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let e=this.inputValue.trim();return!(!e||!/^[a-zA-Z_]/.test(e)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let e=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(e)}else this.dialogRef.close("confirm")}onKeyDown(e){e.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return Hl.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \u0275cmp=kA({type:t,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(A,i){A&1&&(m(0,"h2",0),K(1),D(),m(2,"mat-dialog-content"),yt(3,ayA,23,6,"ng-container",1),m(4,"p"),K(5),D(),V(6,syA,5,4,"mat-form-field",2),D(),m(7,"mat-dialog-actions",3)(8,"button",4),$("click",function(){return i.onCancel()}),K(9,"Cancel"),D(),m(10,"button",5),$("click",function(){return i.onConfirm()}),K(11),D()()),A&2&&(p(),qA(i.data.title),p(2),X("ngIf",i.data.showToolInfo&&i.getToolInfo()),p(2),qA(i.data.message),p(),W(i.data.showInput?6:-1),p(4),X("disabled",i.data.showInput&&!i.isInputValid()),p(),Fe(" ",i.data.confirmButtonText||"Confirm"," "))},dependencies:[oa,yc,Cs,vn,Ia,In,ya,gr,Ta,vr,To,pl,_I,Fg,wa,yn,ro,so,Ca],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px;color:var(--mdc-dialog-supporting-text-color)}mat-dialog-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)}[_nghost-%COMP%] .mat-mdc-form-field{--mat-form-field-filled-container-color: var(--builder-form-field-background-color);--mat-form-field-filled-label-text-color: var(--mdc-dialog-supporting-text-color);--mat-form-field-filled-focus-label-text-color: var(--builder-text-link-color);--mat-form-field-filled-hover-label-text-color: var(--mdc-dialog-supporting-text-color)}[_nghost-%COMP%] .mat-mdc-input-element{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important}[_nghost-%COMP%] .mat-mdc-input-element::placeholder{color:var(--builder-text-muted-color)!important;opacity:0!important}[_nghost-%COMP%] .mat-mdc-input-element:focus::placeholder{opacity:.6!important}[_nghost-%COMP%] .mat-mdc-form-field-hint{color:var(--builder-text-muted-color)!important}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:var(--mdc-dialog-supporting-text-color)!important;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var gyA=["mat-menu-item",""],lyA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],cyA=["mat-icon, [matMenuItemIcon]","*"];function CyA(t,e){t&1&&(Qt(),m(0,"svg",2),GA(1,"polygon",3),D())}var IyA=["*"];function dyA(t,e){if(t&1){let A=zA();ti(0,"div",0),pc("click",function(){rA(A);let n=y();return sA(n.closed.emit("click"))})("animationstart",function(n){rA(A);let o=y();return sA(o._onAnimationStart(n.animationName))})("animationend",function(n){rA(A);let o=y();return sA(o._onAnimationDone(n.animationName))})("animationcancel",function(n){rA(A);let o=y();return sA(o._onAnimationDone(n.animationName))}),ti(1,"div",1),He(2),Ii()()}if(t&2){let A=y();Qo(A._classList),ae("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating()),Bo("id",A.panelId),ie("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var IN=new wA("MAT_MENU_PANEL"),DC=(()=>{class t{_elementRef=h(ge);_document=h(Zt);_focusMonitor=h(Ha);_parentMenu=h(IN,{optional:!0});_changeDetectorRef=h(ft);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new $A;_focused=new $A;_highlighted=!1;_triggersSubmenu=!1;constructor(){h(Hn).load(Za),this._parentMenu?.addItem?.(this)}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),i=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n({overlapTrigger:!1,xPosition:"after",yPosition:"below",backdropClass:"cdk-overlay-transparent-backdrop"})}),CN="_mat-menu-enter",rw="_mat-menu-exit",E0=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_injector=h(ut);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled=Oi();_allItems;_directDescendantItems=new Sg;_classList={};_panelAnimationState="void";_animationDone=new $A;_isAnimating=jA(!1);parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger=!1;hasBackdrop;set panelClass(A){let i=this._previousPanelClass,n=BA({},this._classList);i&&i.length&&i.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new WA;close=this.closed;panelId=h(An).getId("mat-menu-panel-");constructor(){let A=h(QyA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new Mc(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(nn(this._directDescendantItems),Ei(A=>Qi(...A.map(i=>i._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let i=this._keyManager;if(this._panelAnimationState==="enter"&&i.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(nn(this._directDescendantItems),Ei(i=>Qi(...i.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let i=A.keyCode,n=this._keyManager;switch(i){case 27:aa(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(i===38||i===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=Nn(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,i=this.yPosition){this._classList=Ve(BA({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":i==="above","mat-menu-below":i==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let i=A===rw;(i||A===CN)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?"void":"enter"),this._isAnimating.set(!1))}_onAnimationStart(A){(A===CN||A===rw)&&this._isAnimating.set(!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(rw),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?CN:rw)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(nn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-menu"]],contentQueries:function(i,n,o){if(i&1&&na(o,ByA,5)(o,DC,5)(o,DC,4),i&2){let a;Ce(a=Ie())&&(n.lazyContent=a.first),Ce(a=Ie())&&(n._allItems=a),Ce(a=Ie())&&(n.items=a)}},viewQuery:function(i,n){if(i&1&&ni(Fn,5),i&2){let o;Ce(o=Ie())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&ie("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",he],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:he(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[It([{provide:IN,useExisting:t}])],ngContentSelectors:IyA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(i,n){i&1&&(Yt(),mf(0,dyA,3,12,"ng-template"))},styles:[`mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{border-top-color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none} `],encapsulation:2,changeDetection:0})}return t})(),EyA=new wA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let t=h(ut);return()=>R0(t)}});var uE=new WeakMap,hyA=(()=>{class t{_canHaveBackdrop;_element=h(ge);_viewContainerRef=h(Ro);_menuItemInstance=h(DC,{optional:!0,self:!0});_dir=h(wo,{optional:!0});_focusMonitor=h(Ha);_ngZone=h(Oe);_injector=h(ut);_scrollStrategy=h(EyA);_changeDetectorRef=h(ft);_animationsDisabled=Oi();_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Rn.EMPTY;_menuCloseSubscription=Rn.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_openedBy=void 0;get _menu(){return this._menuInternal}set _menu(A){A!==this._menuInternal&&(this._menuInternal=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(i=>{this._destroyMenu(i),(i==="click"||i==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this._triggersSubmenu()))}_menuInternal=null;constructor(A){this._canHaveBackdrop=A;let i=h(IN,{optional:!0});this._parentMaterialMenu=i instanceof E0?i:void 0}ngOnDestroy(){this._menu&&this._ownsMenu(this._menu)&&uE.delete(this._menu),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this._menu)}_closeMenu(){this._menu?.close.emit()}_openMenu(A){if(this._triggerIsAriaDisabled())return;let i=this._menu;if(this._menuOpen||!i)return;this._pendingRemoval?.unsubscribe();let n=uE.get(i);uE.set(i,this),n&&n!==this&&n._closeMenu();let o=this._createOverlay(i),a=o.getConfig(),r=a.positionStrategy;this._setPosition(i,r),this._canHaveBackdrop?a.hasBackdrop=i.hasBackdrop==null?!this._triggersSubmenu():i.hasBackdrop:a.hasBackdrop=i.hasBackdrop??!1,o.hasAttached()||(o.attach(this._getPortal(i)),i.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this._closeMenu()),i.parentMenu=this._triggersSubmenu()?this._parentMaterialMenu:void 0,i.direction=this.dir,A&&i.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),i instanceof E0&&(i._setIsOpen(!0),i._directDescendantItems.changes.pipe(Bt(i.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}_destroyMenu(A){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof E0&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(qn(1)).subscribe(()=>{i.detach(),uE.has(n)||n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&uE.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this._triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this._triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let i=this._getOverlayConfig(A);this._subscribeToPositions(A,i.positionStrategy),this._overlayRef=Rl(this._injector,i),this._overlayRef.keydownEvents().subscribe(n=>{this._menu instanceof E0&&this._menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Sl({positionStrategy:XI(this._injector,this._getOverlayOrigin()).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr",disableAnimations:this._animationsDisabled})}_subscribeToPositions(A,i){A.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",a=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,a)})})}_setPosition(A,i){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[a,r]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[s,g]=[a,r],[l,C]=[n,o],I=0;if(this._triggersSubmenu()){if(C=n=A.xPosition==="before"?"start":"end",o=l=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let d=this._parentMaterialMenu.items.first;this._parentInnerPadding=d?d._getHostElement().offsetTop:0}I=a==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(s=a==="top"?"bottom":"top",g=r==="top"?"bottom":"top");i.withPositions([{originX:n,originY:s,overlayX:l,overlayY:a,offsetY:I},{originX:o,originY:s,overlayX:C,overlayY:a,offsetY:I},{originX:n,originY:g,overlayX:l,overlayY:r,offsetY:-I},{originX:o,originY:g,overlayX:C,overlayY:r,offsetY:-I}])}_menuClosingActions(){let A=this._getOutsideClickStream(this._overlayRef),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:oe(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(We(a=>this._menuOpen&&a!==this._menuItemInstance)):oe();return Qi(A,n,o,i)}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new Vr(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return uE.get(A)===this}_triggerIsAriaDisabled(){return he(this._element.nativeElement.getAttribute("aria-disabled"))}static \u0275fac=function(i){hf()};static \u0275dir=OA({type:t})}return t})(),fE=(()=>{class t extends hyA{_cleanupTouchstart;_hoverSubscription=Rn.EMPTY;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){this._menu=A}menuData;restoreFocus=!0;menuOpened=new WA;onMenuOpen=this.menuOpened;menuClosed=new WA;onMenuClose=this.menuClosed;constructor(){super(!0);let A=h(ui);this._cleanupTouchstart=A.listen(this._element.nativeElement,"touchstart",i=>{RI(i)||(this._openedBy="touch")},{passive:!0})}triggersSubmenu(){return super._triggersSubmenu()}toggleMenu(){return this.menuOpen?this.closeMenu():this.openMenu()}openMenu(){this._openMenu(!0)}closeMenu(){this._closeMenu()}updatePosition(){this._overlayRef?.updatePosition()}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTouchstart(),this._hoverSubscription.unsubscribe()}_getOverlayOrigin(){return this._element}_getOutsideClickStream(A){return A.backdropClick()}_handleMousedown(A){xI(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let i=A.keyCode;(i===13||i===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(i===39&&this.dir==="ltr"||i===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&this._parentMaterialMenu?._panelAnimationState!=="void"&&(this._openedBy="mouse",this._openMenu(!1))}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(i,n){i&1&&$("click",function(a){return n._handleClick(a)})("mousedown",function(a){return n._handleMousedown(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&ie("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu==null?null:n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"],features:[Ct]})}return t})();var b$=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[YC,Kg,Fi,Fc]})}return t})();var S$=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],x$=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function fyA(t,e){t&1&&(m(0,"span",3),He(1,1),D())}function myA(t,e){t&1&&(m(0,"span",6),He(1,2),D())}function pyA(t,e){t&1&&(m(0,"span",3),He(1,1),m(2,"span",7),Qt(),m(3,"svg",8),GA(4,"path",9),D()()())}function DyA(t,e){t&1&&(m(0,"span",6),He(1,2),D())}var wyA=`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} `;var R$=["*"],yyA=`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} `,EN=new wA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),dN=new wA("MatChipAvatar"),M$=new wA("MatChipTrailingIcon"),k$=new wA("MatChipEdit"),BN=new wA("MatChipRemove"),hN=new wA("MatChip"),N$=(()=>{class t{_elementRef=h(ge);_parentChip=h(hN);_isPrimary=!0;_isLeading=!1;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(A){this._disabled=A}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}constructor(){h(Hn).load(Za),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matChipContent",""]],hostAttrs:[1,"mat-mdc-chip-action","mdc-evolution-chip__action","mdc-evolution-chip__action--presentational"],hostVars:8,hostBindings:function(i,n){i&2&&(ie("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),ae("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--secondary",!n._isPrimary)("mdc-evolution-chip__action--trailing",!n._isPrimary&&!n._isLeading))},inputs:{disabled:[2,"disabled","disabled",he],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?-1:Zi(A)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return t})(),uN=(()=>{class t extends N${_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled?null:this.tabIndex.toString()}_handleClick(A){!this.disabled&&this._isPrimary&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&this._isPrimary&&!this._parentChip._isEditing&&(A.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matChipAction",""]],hostVars:3,hostBindings:function(i,n){i&1&&$("click",function(a){return n._handleClick(a)})("keydown",function(a){return n._handleKeydown(a)}),i&2&&(ie("tabindex",n._getTabindex()),ae("mdc-evolution-chip__action--presentational",!1))},features:[Ct]})}return t})(),F$=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[It([{provide:dN,useExisting:t}])]})}return t})();var L$=(()=>{class t extends uN{_isPrimary=!1;_handleClick(A){this.disabled||(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!this.disabled&&(A.stopPropagation(),A.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(i,n){i&2&&ie("aria-hidden",null)},features:[It([{provide:BN,useExisting:t}]),Ct]})}return t})(),yu=(()=>{class t{_changeDetectorRef=h(ft);_elementRef=h(ge);_tagName=h(DL);_ngZone=h(Oe);_focusMonitor=h(Ha);_globalRippleOptions=h(JC,{optional:!0});_document=h(Zt);_onFocus=new $A;_onBlur=new $A;_isBasicChip=!1;role=null;_hasFocusInternal=!1;_pendingFocus=!1;_actionChanges;_animationsDisabled=Oi();_allLeadingIcons;_allTrailingIcons;_allEditIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=h(An).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_chipListDisabled=!1;_hadFocusOnRemove=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(A){this._value=A}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(A){this._disabled=A}_disabled=!1;removed=new WA;destroyed=new WA;basicChipAttrName="mat-basic-chip";leadingIcon;editIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=h($f);_injector=h(ut);constructor(){let A=h(Hn);A.load(Za),A.load(KC),this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){this._isBasicChip=this._elementRef.nativeElement.hasAttribute(this.basicChipAttrName)||this._tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Qi(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allEditIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&(this._hadFocusOnRemove=this._hasFocus(),this.removed.emit({chip:this}))}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!this._hasInteractiveActions()||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(A){(A.keyCode===8&&!A.repeat||A.keyCode===46)&&(A.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(A){return this._getActions().find(i=>{let n=i._elementRef.nativeElement;return n===A||n.contains(A)})}_getActions(){let A=[];return this.editIcon&&A.push(this.editIcon),this.primaryAction&&A.push(this.primaryAction),this.removeIcon&&A.push(this.removeIcon),A}_handlePrimaryActionInteraction(){}_hasInteractiveActions(){return this._getActions().length>0}_edit(A){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{let i=A!==null;i!==this._hasFocusInternal&&(this._hasFocusInternal=i,i?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(i,n,o){if(i&1&&na(o,dN,5)(o,k$,5)(o,M$,5)(o,BN,5)(o,dN,5)(o,M$,5)(o,k$,5)(o,BN,5),i&2){let a;Ce(a=Ie())&&(n.leadingIcon=a.first),Ce(a=Ie())&&(n.editIcon=a.first),Ce(a=Ie())&&(n.trailingIcon=a.first),Ce(a=Ie())&&(n.removeIcon=a.first),Ce(a=Ie())&&(n._allLeadingIcons=a),Ce(a=Ie())&&(n._allTrailingIcons=a),Ce(a=Ie())&&(n._allEditIcons=a),Ce(a=Ie())&&(n._allRemoveIcons=a)}},viewQuery:function(i,n){if(i&1&&ni(uN,5),i&2){let o;Ce(o=Ie())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(i,n){i&1&&$("keydown",function(a){return n._handleKeydown(a)}),i&2&&(Bo("id",n.id),ie("role",n.role)("aria-label",n.ariaLabel),Qo("mat-"+(n.color||"primary")),ae("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",he],highlighted:[2,"highlighted","highlighted",he],disableRipple:[2,"disableRipple","disableRipple",he],disabled:[2,"disabled","disabled",he]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[It([{provide:hN,useExisting:t}])],ngContentSelectors:x$,decls:8,vars:2,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipContent",""],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(i,n){i&1&&(Yt(S$),GA(0,"span",0),m(1,"span",1)(2,"span",2),V(3,fyA,2,0,"span",3),m(4,"span",4),He(5),GA(6,"span",5),D()()(),V(7,myA,2,0,"span",6)),i&2&&(p(3),W(n.leadingIcon?3:-1),p(4),W(n._hasTrailingIcon()?7:-1))},dependencies:[N$],styles:[`.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}@media(forced-colors: active){.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{forced-color-adjust:none}}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-outline-width, 1px);border-radius:var(--mat-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mat-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mat-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-leading-action.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--secondary{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--secondary{color:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--secondary{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mat-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mat-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mat-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mat-chip-with-avatar-avatar-size, 24px);height:var(--mat-chip-with-avatar-avatar-size, 24px);font-size:var(--mat-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-leading-action .mdc-evolution-chip__graphic{padding-left:0}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mat-chip-container-shape-radius, 8px);height:var(--mat-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mat-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mat-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mat-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mat-chip-with-icon-icon-size, 18px);height:var(--mat-chip-with-icon-icon-size, 18px);font-size:var(--mat-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mat-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mat-chip-with-icon-icon-color: var(--mat-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mat-chip-elevated-container-color: var(--mat-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mat-chip-label-text-color: var(--mat-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mat-chip-outline-width: var(--mat-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mat-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mat-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mat-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mat-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mat-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-edit,.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-edit:focus,.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-edit:hover::after,.mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-chip-edit:focus::after,.mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:focus::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:focus::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-edit:hover::after,.mat-mdc-chip.cdk-focused .mat-mdc-chip-remove:hover::after{opacity:calc(var(--mat-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity)) + var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity)))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mat-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-edit::before,.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-edit::after,.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus-visible .mat-focus-indicator::before{content:""}.mdc-evolution-chip__icon,.mat-mdc-chip-edit .mat-icon,.mat-mdc-chip-remove .mat-icon{min-height:fit-content}img.mdc-evolution-chip__icon{min-height:0} `],encapsulation:2,changeDetection:0})}return t})();var fN=(()=>{class t extends yu{_defaultOptions=h(EN,{optional:!0});chipListSelectable=!0;_chipListMultiple=!1;_chipListHideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get selectable(){return this._selectable&&this.chipListSelectable}set selectable(A){this._selectable=A,this._changeDetectorRef.markForCheck()}_selectable=!0;get selected(){return this._selected}set selected(A){this._setSelectedState(A,!1,!0)}_selected=!1;get ariaSelected(){return this.selectable?this.selected.toString():null}basicChipAttrName="mat-basic-chip-option";selectionChange=new WA;ngOnInit(){super.ngOnInit(),this.role="presentation"}select(){this._setSelectedState(!0,!1,!0)}deselect(){this._setSelectedState(!1,!1,!0)}selectViaInteraction(){this._setSelectedState(!0,!0,!0)}toggleSelected(A=!1){return this._setSelectedState(!this.selected,A,!0),this.selected}_handlePrimaryActionInteraction(){this.disabled||(this.focus(),this.selectable&&this.toggleSelected(!0))}_hasLeadingGraphic(){return this.leadingIcon?!0:!this._chipListHideSingleSelectionIndicator||this._chipListMultiple}_setSelectedState(A,i,n){A!==this.selected&&(this._selected=A,n&&this.selectionChange.emit({source:this,isUserInput:i,selected:this.selected}),this._changeDetectorRef.markForCheck())}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-basic-chip-option"],["","mat-basic-chip-option",""],["mat-chip-option"],["","mat-chip-option",""]],hostAttrs:[1,"mat-mdc-chip","mat-mdc-chip-option"],hostVars:37,hostBindings:function(i,n){i&2&&(Bo("id",n.id),ie("tabindex",null)("aria-label",null)("aria-description",null)("role",n.role),ae("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--filter",!n._isBasicChip)("mdc-evolution-chip--selectable",!n._isBasicChip)("mat-mdc-chip-selected",n.selected)("mat-mdc-chip-multiple",n._chipListMultiple)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-chip-with-avatar",n.leadingIcon)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--selected",n.selected)("mdc-evolution-chip--selecting",!n._animationsDisabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-primary-graphic",n._hasLeadingGraphic())("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon()))},inputs:{selectable:[2,"selectable","selectable",he],selected:[2,"selected","selected",he]},outputs:{selectionChange:"selectionChange"},features:[It([{provide:yu,useExisting:t},{provide:hN,useExisting:t}]),Ct],ngContentSelectors:x$,decls:8,vars:6,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","","role","option",3,"_allowFocusWhenDisabled"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"],[1,"mdc-evolution-chip__checkmark"],["viewBox","-2 -3 30 30","focusable","false","aria-hidden","true",1,"mdc-evolution-chip__checkmark-svg"],["fill","none","stroke","currentColor","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-evolution-chip__checkmark-path"]],template:function(i,n){i&1&&(Yt(S$),GA(0,"span",0),m(1,"span",1)(2,"button",2),V(3,pyA,5,0,"span",3),m(4,"span",4),He(5),GA(6,"span",5),D()()(),V(7,DyA,2,0,"span",6)),i&2&&(p(2),X("_allowFocusWhenDisabled",!0),ie("aria-description",n.ariaDescription)("aria-label",n.ariaLabel)("aria-selected",n.ariaSelected),p(),W(n._hasLeadingGraphic()?3:-1),p(4),W(n._hasTrailingIcon()?7:-1))},dependencies:[uN],styles:[wyA],encapsulation:2,changeDetection:0})}return t})();var mN=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_dir=h(wo,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new $A;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(A=>A._onFocus)}get chipDestroyedChanges(){return this._getChipStream(A=>A.destroyed)}get chipRemovedChanges(){return this._getChipStream(A=>A.removed)}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(A){this._explicitRole=A}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new Sg;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(A=>A._hasFocus())}_syncChipsState(){this._chips?.forEach(A=>{A._chipListDisabled=this._disabled,A._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(A){this._originatesFromChip(A)&&this._keyManager.onKeydown(A)}_isValidIndex(A){return A>=0&&Athis._elementRef.nativeElement.tabIndex=A))}_getChipStream(A){return this._chips.changes.pipe(nn(null),Ei(()=>Qi(...this._chips.map(A))))}_originatesFromChip(A){let i=A.target;for(;i&&i!==this._elementRef.nativeElement;){if(i.classList.contains("mat-mdc-chip"))return!0;i=i.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(nn(this._chips)).subscribe(A=>{let i=[];A.forEach(n=>n._getActions().forEach(o=>i.push(o))),this._chipActions.reset(i),this._chipActions.notifyOnChanges()}),this._keyManager=new Mc(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(A=>this._skipPredicate(A)),this.chipFocusChanges.pipe(Bt(this._destroyed)).subscribe(({chip:A})=>{let i=A._getSourceAction(document.activeElement);i&&this._keyManager.updateActiveItem(i)}),this._dir?.change.pipe(Bt(this._destroyed)).subscribe(A=>this._keyManager.withHorizontalOrientation(A))}_skipPredicate(A){return A.disabled}_trackChipSetChanges(){this._chips.changes.pipe(nn(null),Bt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(Bt(this._destroyed)).subscribe(A=>{let n=this._chips.toArray().indexOf(A.chip),o=A.chip._hasFocus(),a=A.chip._hadFocusOnRemove&&this._keyManager.activeItem&&A.chip._getActions().includes(this._keyManager.activeItem),r=o||a;this._isValidIndex(n)&&r&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let A=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),i=this._chips.toArray()[A];i.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():i.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-chip-set"]],contentQueries:function(i,n,o){if(i&1&&na(o,yu,5),i&2){let a;Ce(a=Ie())&&(n._chips=a)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(i,n){i&1&&$("keydown",function(a){return n._handleKeydown(a)}),i&2&&ie("role",n.role)},inputs:{disabled:[2,"disabled","disabled",he],role:"role",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:Zi(A)]},ngContentSelectors:R$,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Yt(),ti(0,"div",0),He(1),Ii())},styles:[`.mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-moz-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input::-webkit-input-placeholder{opacity:1}.mat-mdc-form-field:not(.mat-form-field-hide-placeholder) input.mat-mdc-chip-input:-ms-input-placeholder{opacity:1}.mat-mdc-chip-set+input.mat-mdc-chip-input{margin-left:0;margin-right:0} `],encapsulation:2,changeDetection:0})}return t})(),QN=class{source;value;constructor(e,A){this.source=e,this.value=A}},vyA={provide:gg,useExisting:ar(()=>pN),multi:!0},pN=(()=>{class t extends mN{_onTouched=()=>{};_onChange=()=>{};_defaultRole="listbox";_defaultOptions=h(EN,{optional:!0});get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._syncListboxProperties()}_multiple=!1;get selected(){let A=this._chips.toArray().filter(i=>i.selected);return this.multiple?A:A[0]}ariaOrientation="horizontal";get selectable(){return this._selectable}set selectable(A){this._selectable=A,this._syncListboxProperties()}_selectable=!0;compareWith=(A,i)=>A===i;required=!1;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncListboxProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get chipSelectionChanges(){return this._getChipStream(A=>A.selectionChange)}get chipBlurChanges(){return this._getChipStream(A=>A._onBlur)}get value(){return this._value}set value(A){this._chips&&this._chips.length&&this._setSelectionByValue(A,!1),this._value=A}_value;change=new WA;_chips=void 0;ngAfterContentInit(){this._chips.changes.pipe(nn(null),Bt(this._destroyed)).subscribe(()=>{this.value!==void 0&&Promise.resolve().then(()=>{this._setSelectionByValue(this.value,!1)}),this._syncListboxProperties()}),this.chipBlurChanges.pipe(Bt(this._destroyed)).subscribe(()=>this._blur()),this.chipSelectionChanges.pipe(Bt(this._destroyed)).subscribe(A=>{this.multiple||this._chips.forEach(i=>{i!==A.source&&i._setSelectedState(!1,!1,!1)}),A.isUserInput&&this._propagateChanges()})}focus(){if(this.disabled)return;let A=this._getFirstSelectedChip();A&&!A.disabled?A.focus():this._chips.length>0?this._keyManager.setFirstItemActive():this._elementRef.nativeElement.focus()}writeValue(A){A!=null?this.value=A:this.value=void 0}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_setSelectionByValue(A,i=!0){this._clearSelection(),Array.isArray(A)?A.forEach(n=>this._selectValue(n,i)):this._selectValue(A,i)}_blur(){this.disabled||setTimeout(()=>{this.focused||this._markAsTouched()})}_keydown(A){A.keyCode===9&&super._allowFocusEscape()}_markAsTouched(){this._onTouched(),this._changeDetectorRef.markForCheck()}_propagateChanges(){let A=null;Array.isArray(this.selected)?A=this.selected.map(i=>i.value):A=this.selected?this.selected.value:void 0,this._value=A,this.change.emit(new QN(this,A)),this._onChange(A),this._changeDetectorRef.markForCheck()}_clearSelection(A){this._chips.forEach(i=>{i!==A&&i.deselect()})}_selectValue(A,i){let n=this._chips.find(o=>o.value!=null&&this.compareWith(o.value,A));return n&&(i?n.selectViaInteraction():n.select()),n}_syncListboxProperties(){this._chips&&Promise.resolve().then(()=>{this._chips.forEach(A=>{A._chipListMultiple=this.multiple,A.chipListSelectable=this._selectable,A._chipListHideSingleSelectionIndicator=this.hideSingleSelectionIndicator,A._changeDetectorRef.markForCheck()})})}_getFirstSelectedChip(){return Array.isArray(this.selected)?this.selected.length?this.selected[0]:void 0:this.selected}_skipPredicate(A){return!1}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-chip-listbox"]],contentQueries:function(i,n,o){if(i&1&&na(o,fN,5),i&2){let a;Ce(a=Ie())&&(n._chips=a)}},hostAttrs:[1,"mdc-evolution-chip-set","mat-mdc-chip-listbox"],hostVars:10,hostBindings:function(i,n){i&1&&$("focus",function(){return n.focus()})("blur",function(){return n._blur()})("keydown",function(a){return n._keydown(a)}),i&2&&(Bo("tabIndex",n.disabled||n.empty?-1:n.tabIndex),ie("role",n.role)("aria-required",n.role?n.required:null)("aria-disabled",n.disabled.toString())("aria-multiselectable",n.multiple)("aria-orientation",n.ariaOrientation),ae("mat-mdc-chip-list-disabled",n.disabled)("mat-mdc-chip-list-required",n.required))},inputs:{multiple:[2,"multiple","multiple",he],ariaOrientation:[0,"aria-orientation","ariaOrientation"],selectable:[2,"selectable","selectable",he],compareWith:"compareWith",required:[2,"required","required",he],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",he],value:"value"},outputs:{change:"change"},features:[It([vyA]),Ct],ngContentSelectors:R$,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Yt(),ti(0,"div",0),He(1),Ii())},styles:[yyA],encapsulation:2,changeDetection:0})}return t})();var sw=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({providers:[Gd,{provide:EN,useValue:{separatorKeyCodes:[13]}}],imports:[YC,Fi]})}return t})();var gw=new wA("ThemeService");var mE=class t{themeService=h(gw);get currentTheme(){return this.themeService.currentTheme()}get themeIcon(){return this.currentTheme==="light"?"dark_mode":"light_mode"}get themeTooltip(){return this.currentTheme==="light"?"Switch to dark mode":"Switch to light mode"}toggleTheme(){this.themeService.toggleTheme()}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-theme-toggle"]],decls:3,vars:2,consts:[["mat-icon-button","","aria-label","Toggle theme",1,"theme-toggle-button",3,"click","matTooltip"]],template:function(A,i){A&1&&(m(0,"button",0),$("click",function(){return i.toggleTheme()}),m(1,"mat-icon"),K(2),D()()),A&2&&(X("matTooltip",i.themeTooltip),p(2),qA(i.themeIcon))},dependencies:[Ug,In,Cs,Ia,WC,Ba],styles:[".theme-toggle-button[_ngcontent-%COMP%]{color:var(--side-panel-mat-icon-color)}.theme-toggle-button[_ngcontent-%COMP%]:hover{opacity:.8}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color);color:var(--builder-text-tertiary-color);border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-hover-background-color);color:var(--builder-text-primary-color);opacity:1}.builder-mode-action-button[_nghost-%COMP%] .theme-toggle-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}"]})};var G$=(t,e)=>e.name;function byA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;Fe(" AgentTool: ",A.name," ")}}function MyA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;Fe(" ",A.name," ")}}function kyA(t,e){t&1&&(m(0,"mat-icon",28),K(1,"chevron_right"),D())}function SyA(t,e){if(t&1){let A=zA();m(0,"div",27),$("click",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectAgentFromBreadcrumb(n))}),V(1,byA,1,1)(2,MyA,1,1),D(),V(3,kyA,2,0,"mat-icon",28)}if(t&2){let A=e.$implicit,i=e.$index,n=y(2);ae("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===A.name),p(),W(i===0&&n.isInAgentToolContext()?1:2),p(2),W(i0?0:-1)}}function HyA(t,e){if(t&1){let A=zA();m(0,"div",15)(1,"div",16)(2,"div"),K(3," Tools "),D(),m(4,"div")(5,"button",40,2)(7,"mat-icon"),K(8,"add"),D()(),m(9,"mat-menu",null,3)(11,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addTool("Function tool"))}),m(12,"span"),K(13,"Function tool"),D()(),m(14,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addTool("Built-in tool"))}),m(15,"span"),K(16,"Built-in tool"),D()(),m(17,"button",23),$("click",function(){rA(A);let n=y();return sA(n.createAgentTool())}),m(18,"span"),K(19,"Agent tool"),D()()()()(),V(20,YyA,1,1),oi(21,"async"),D()}if(t&2){let A,i=Wi(10),n=y();p(5),X("matMenuTriggerFor",i),p(6),X("matTooltip",n.toolMenuTooltips("Function tool")),p(3),X("matTooltip",n.toolMenuTooltips("Built-in tool")),p(3),X("matTooltip",n.toolMenuTooltips("Agent tool")),p(3),W((A=li(21,5,n.toolsMap$))?20:-1,A)}}function TyA(t,e){if(t&1){let A=zA();m(0,"mat-chip",43),$("click",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectAgent(n))}),m(1,"mat-icon",44),K(2),D(),m(3,"span",45),K(4),D(),m(5,"button",48),$("click",function(n){let o=rA(A).$implicit;return y(2).deleteSubAgent(o.name),sA(n.stopPropagation())}),m(6,"mat-icon"),K(7,"cancel"),D()()()}if(t&2){let A=e.$implicit,i=y(2);p(2),qA(i.getAgentIcon(A.agent_class)),p(2),qA(A.name)}}function OyA(t,e){if(t&1&&(m(0,"div",20)(1,"mat-chip-set",47),Gt(2,TyA,8,2,"mat-chip",42,G$),D()()),t&2){let A=y();p(2),Kt(A.agentConfig.sub_agents)}}function zyA(t,e){if(t&1){let A=zA();GA(0,"mat-divider"),m(1,"div",22),K(2,"Model (LLM) Interaction"),D(),m(3,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addCallback("before_model"))}),m(4,"span"),K(5,"Before Model"),D()(),m(6,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addCallback("after_model"))}),m(7,"span"),K(8,"After Model"),D()(),GA(9,"mat-divider"),m(10,"div",22),K(11,"Tool Execution"),D(),m(12,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addCallback("before_tool"))}),m(13,"span"),K(14,"Before Tool"),D()(),m(15,"button",23),$("click",function(){rA(A);let n=y();return sA(n.addCallback("after_tool"))}),m(16,"span"),K(17,"After Tool"),D()()}if(t&2){let A=y();p(3),X("matTooltip",A.callbackMenuTooltips("before_model")),p(3),X("matTooltip",A.callbackMenuTooltips("after_model")),p(6),X("matTooltip",A.callbackMenuTooltips("before_tool")),p(3),X("matTooltip",A.callbackMenuTooltips("after_tool"))}}function PyA(t,e){if(t&1){let A=zA();m(0,"div",52),$("click",function(){let n=rA(A).$implicit,o=y(3);return sA(o.editCallback(n))}),m(1,"mat-chip",53)(2,"span",54)(3,"span",55),K(4),D(),m(5,"span",56),K(6),D()()(),m(7,"button",57),$("click",function(n){let o=rA(A).$implicit,a=y(3);return a.deleteCallback(a.agentConfig.name,o),sA(n.stopPropagation())}),m(8,"mat-icon"),K(9,"remove"),D()()()}if(t&2){let A=e.$implicit;p(4),qA(A.type),p(2),qA(A.name)}}function jyA(t,e){if(t&1&&(m(0,"div",49)(1,"mat-chip-set",50),Gt(2,PyA,10,2,"div",51,Ri),D()()),t&2){let A=y(),i=y();p(2),Kt(A.get(i.agentConfig.name))}}function qyA(t,e){if(t&1&&V(0,jyA,4,0,"div",49),t&2){let A=e,i=y();W(i.agentConfig&&A.get(i.agentConfig.name)&&A.get(i.agentConfig.name).length>0?0:-1)}}var lw=class t{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new WA;closePanel=new WA;featureFlagService=h(lr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=jA("");editingToolArgs=jA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=h(Kc);dialog=h(Qs);agentService=h(Ks);snackBar=h(ZC);router=h(qr);cdr=h(ft);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(e){if(!e)return"{}";let A=BA({},e);return delete A.skip_summarization,JSON.stringify(A,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.agentConfig=e,this.currentSelectedAgent=e,e&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(e)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(e=>{this.selectedTool=e,!(e&&e.toolType==="Agent Tool")&&(e?(this.editingTool=e,this.editingToolArgs.set(!1),setTimeout(()=>{let A=e.toolType=="Function tool"?"Function tool":e.name;if(e.toolType=="Function tool"&&!e.name&&(e.name="Function tool"),e.toolType==="Custom tool")e.args||(e.args={}),this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0);else{let i=this.builtInToolArgs.get(A);if(i){e.args||(e.args={});for(let n of i)e.args&&(e.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e,e?(this.selectCallback(e),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{this.agentConfig&&e&&this.agentConfig.name===e.agentName&&(this.agentConfig=Ve(BA({},this.agentConfig),{callbacks:e.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(e=>{e==="tools"?this.selectedTabIndex=2:e==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(e){return e?Object.keys(e).filter(A=>A!=="skip_summarization"):[]}getCallbacksByType(){let e=new Map;return this.callbackTypes.forEach(A=>{e.set(A,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(A=>{let i=e.get(A.type);i&&i.push(A)}),e}updateBreadcrumb(e){this.hierarchyPath=this.buildHierarchyPath(e)}buildHierarchyPath(e){let A=[],i=this.findContextualRoot(e);return i?e.name===i.name?[i]:this.findPathToAgent(i,e,[i])||[e]:[e]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(e){if(e.isAgentTool)return e;let A=this.agentBuilderService.getNodes();for(let n of A)if(n.isAgentTool&&this.findPathToAgent(n,e,[n]))return n;let i=this.agentBuilderService.getRootNode();if(i&&this.findPathToAgent(i,e,[i]))return i;if(e.isRoot)return e;for(let n of A)if(n.isRoot&&this.findPathToAgent(n,e,[n]))return n;return i}findPathToAgent(e,A,i){if(e.name===A.name)return i;for(let n of e.sub_agents){let o=[...i,n],a=this.findPathToAgent(n,A,o);if(a)return a}return null}selectAgentFromBreadcrumb(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectAgent(e){this.agentBuilderService.setSelectedNode(e),this.selectedTabIndex=0}selectTool(e){if(e.toolType==="Agent Tool"){let A=e.name;this.agentBuilderService.requestNewTab(A);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){this.editTool(e);return}this.agentBuilderService.setSelectedTool(e)}editTool(e){if(!this.agentConfig)return;let A;e.toolType==="Built-in tool"?A=this.dialog.open(id,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):A=this.dialog.open(r2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),A.afterClosed().subscribe(i=>{if(i&&i.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===e.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=i.name,i.args&&(this.agentConfig.tools[n].args=i.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(e){if(this.agentConfig){let A;e==="Built-in tool"?A=this.dialog.open(id,{width:"700px",maxWidth:"90vw",data:{}}):A=this.dialog.open(r2,{width:"500px",data:{toolType:e}}),A.afterClosed().subscribe(i=>{if(i){let n={toolType:i.toolType,name:i.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(e){if(this.agentConfig){let A=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(k4,{width:"500px",data:{callbackType:e,existingCallbackNames:A}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(e){if(!this.agentConfig)return;let A=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(k4,{width:"500px",data:{callbackType:e.type,existingCallbackNames:A,isEditMode:!0,callback:e,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,e.name,Ve(BA({},e),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(e){e&&this.agentBuilderService.setAddSubAgentSubject(e)}deleteSubAgent(e){this.agentBuilderService.setDeleteSubAgentSubject(e)}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{if(a==="confirm")if(A.toolType==="Agent Tool"){let r=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,r)}else this.agentBuilderService.deleteTool(e,A)})}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(e){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(e?.args))}saveToolArgs(e){if(this.jsonEditorComponent&&e)try{let A=JSON.parse(this.jsonEditorComponent.getJsonString()),i=e.args?e.args.skip_summarization:!1;e.args=A,e.args.skip_summarization=i,this.toolArgsString.set(JSON.stringify(e.args,null,2)),this.editingToolArgs.set(!1)}catch(A){console.error("Error parsing tool arguments JSON",A)}}onToolTypeSelectionChange(e){e?.toolType==="Built-in tool"?(e.name="google_search",this.onBuiltInToolSelectionChange(e)):e?.toolType==="Custom tool"?(e.args={},this.toolArgsString.set(this.getJsonStringForEditor(e.args)),this.editingToolArgs.set(!0)):e&&(e.name="",e.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(e){e&&(this.editingToolArgs.set(!1),setTimeout(()=>{e.args={skip_summarization:!1};let A=this.builtInToolArgs.get(e.name);if(A)for(let i of A)e.args&&(e.args[i]="");this.toolArgsString.set(this.getJsonStringForEditor(e.args)),e.args&&this.getObjectKeys(e.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(e){this.editingCallback=e}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(e){}createAgentTool(){this.dialog.open(Cc,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(A=>{if(A&&typeof A=="string"){let i=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(A,i)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(A=>{A?this.saveAgent(A):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(e=>{}),this.exitBuilderMode.emit()}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this.snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o&&this.agentService.agentBuild(i).subscribe(a=>{a?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(e){return vB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}addSubAgentWithType(e){if(!this.agentConfig?.name)return;let A=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,e,A)}callbackMenuTooltips(e){return Hl.getCallbackMenuTooltips(e)}toolMenuTooltips(e){return Hl.getToolMenuTooltips(e)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-builder-tabs"]],viewQuery:function(A,i){if(A&1&&ni(cc,5),A&2){let n;Ce(n=Ie())&&(i.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:77,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[2,"display","flex","align-items","center","gap","8px","margin-right","15px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(A,i){if(A&1&&(m(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),GA(4,"img",8),K(5," Agent Development Kit "),D(),m(6,"div",9),GA(7,"app-theme-toggle"),m(8,"span",10),$("click",function(){return i.closePanel.emit()}),K(9,"left_panel_close"),D()()()()(),m(10,"div",11)(11,"div",12),V(12,xyA,3,0,"div",13),m(13,"div",14)(14,"div",15)(15,"div",16),K(16," Configuration "),D(),m(17,"div"),V(18,KyA,16,7,"div",17),D()(),V(19,HyA,22,7,"div",15),m(20,"div",15)(21,"div",16)(22,"div"),K(23," Sub Agents "),D(),m(24,"div")(25,"button",18)(26,"mat-icon"),K(27,"add"),D()(),m(28,"mat-menu",null,0)(30,"button",19),$("click",function(){return i.addSubAgentWithType("LlmAgent")}),m(31,"mat-icon"),K(32,"psychology"),D(),m(33,"span"),K(34,"LLM Agent"),D()(),m(35,"button",19),$("click",function(){return i.addSubAgentWithType("SequentialAgent")}),m(36,"mat-icon"),K(37,"more_horiz"),D(),m(38,"span"),K(39,"Sequential Agent"),D()(),m(40,"button",19),$("click",function(){return i.addSubAgentWithType("LoopAgent")}),m(41,"mat-icon"),K(42,"sync"),D(),m(43,"span"),K(44,"Loop Agent"),D()(),m(45,"button",19),$("click",function(){return i.addSubAgentWithType("ParallelAgent")}),m(46,"mat-icon"),K(47,"density_medium"),D(),m(48,"span"),K(49,"Parallel Agent"),D()()()()(),V(50,OyA,4,0,"div",20),D(),m(51,"div",15)(52,"div",16)(53,"div"),K(54," Callbacks "),D(),m(55,"div")(56,"button",21)(57,"mat-icon"),K(58,"add"),D()(),m(59,"mat-menu",null,1)(61,"div",22),K(62,"Agent Lifecycle"),D(),m(63,"button",23),$("click",function(){return i.addCallback("before_agent")}),m(64,"span"),K(65,"Before Agent"),D()(),m(66,"button",23),$("click",function(){return i.addCallback("after_agent")}),m(67,"span"),K(68,"After Agent"),D()(),V(69,zyA,18,4),D()()(),V(70,qyA,1,1),oi(71,"async"),D()(),m(72,"div",24)(73,"button",25),$("click",function(){return i.saveChanges()}),K(74," Save "),D(),m(75,"button",26),$("click",function(){return i.cancelChanges()}),K(76," Cancel "),D()()()()),A&2){let n,o=Wi(29),a=Wi(60);p(12),W(i.hierarchyPath.length>0?12:-1),p(6),W(i.agentConfig?18:-1),p(),W((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?19:-1),p(6),X("matMenuTriggerFor",o),p(25),W(i.agentConfig&&i.agentConfig.sub_agents&&i.agentConfig.sub_agents.length>0?50:-1),p(6),X("matMenuTriggerFor",a),p(7),X("matTooltip",i.callbackMenuTooltips("before_agent")),p(3),X("matTooltip",i.callbackMenuTooltips("after_agent")),p(3),W((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?69:-1),p(),W((n=li(71,10,i.callbacksMap$))?70:-1,n)}},dependencies:[oa,yn,ro,Fv,so,Gv,Ca,vn,yB,kY,To,In,wa,Ia,pl,Mr,Yg,Ba,E0,fE,DC,sw,yu,F$,L$,mN,CJ,up,mE,Pr],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid var(--builder-border-color)}.breadcrumb-chip[_ngcontent-%COMP%]{background-color:transparent;color:var(--builder-text-muted-color);font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:var(--builder-text-link-color)}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:var(--builder-breadcrumb-separator-color);font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.builder-tab-content[_ngcontent-%COMP%]{--mat-form-field-filled-container-color: var(--builder-form-field-background-color);--mat-form-field-filled-focus-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-hover-active-indicator-color: var(--builder-form-field-background-color);--mat-form-field-filled-label-text-color: var(--builder-text-secondary-color);--mat-form-field-filled-focus-label-text-color: var(--builder-text-link-color);--mat-form-field-filled-hover-label-text-color: var(--builder-text-secondary-color)}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{border:none!important}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] mat-tree[_ngcontent-%COMP%]{background-color:inherit!important}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{background-color:transparent;border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:var(--builder-card-background-color);color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover{background-color:var(--builder-hover-background-color)}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px} .tools-chips-container .mat-mdc-chip-set{width:100%} .tools-chips-container.callbacks-list .mat-mdc-chip-set{display:flex;flex-direction:column;gap:8px;width:100%} .tools-chips-container .mat-mdc-chip.tool-chip{background-color:var(--builder-tool-chip-background-color);color:var(--builder-text-primary-color);font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;cursor:pointer;margin:4px} .tools-chips-container .mat-mdc-chip.tool-chip:hover{background-color:var(--builder-tool-chip-hover-color)} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-action-label{display:flex;align-items:center;gap:6px} .tools-chips-container .mat-mdc-chip.tool-chip .tool-chip-name{display:inline-flex;align-items:center} .tools-chips-container .mat-mdc-chip.tool-chip .tool-icon{font-size:18px;width:18px;height:18px} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove{opacity:1;color:var(--builder-text-secondary-color)} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove mat-icon{font-size:18px;width:18px;height:18px} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove:hover{color:var(--builder-text-primary-color)} .tools-chips-container .mat-mdc-chip.callback-chip{background:var(--builder-callback-chip-background-color);background-color:var(--builder-callback-chip-background-color);color:var(--builder-callback-chip-text-color);font-family:Google Sans,sans-serif;font-size:14px;display:flex;flex-direction:row;align-items:center;gap:12px;width:auto;height:40px;border-radius:8px;border:none;box-shadow:none;outline:none;--mdc-chip-outline-width: 0;--mdc-chip-outline-color: transparent;--mdc-chip-elevated-container-color: var(--builder-callback-chip-background-color);--mdc-chip-flat-container-color: var(--builder-callback-chip-background-color);flex:1 1 auto;min-width:0} .tools-chips-container .mat-mdc-chip.callback-chip:before, .tools-chips-container .mat-mdc-chip.callback-chip:after, .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-focus-overlay{border:none;box-shadow:none} .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-action-label{display:flex;flex:1;align-items:center;width:100%;gap:12px} .tools-chips-container .mat-mdc-chip.callback-chip .chip-content{display:flex;flex-direction:row;align-items:center;gap:12px;flex:1;min-width:0} .tools-chips-container .mat-mdc-chip.callback-chip .chip-type{color:var(--builder-callback-chip-type-color);font-size:13px;font-weight:500;white-space:nowrap} .tools-chips-container .mat-mdc-chip.callback-chip .chip-name{color:var(--builder-callback-chip-name-color);font-size:15px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:var(--builder-icon-color);cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,var(--builder-add-button-background-color) 0%,var(--builder-add-button-background-color) 100%),var(--builder-panel-background-color);border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--builder-add-button-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid var(--builder-border-color);border-radius:8px;background-color:var(--builder-secondary-background-color)}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color);color:var(--builder-button-primary-text-color);font-weight:500}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-primary-hover-color)}.no-callbacks-message[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:var(--builder-text-secondary-color);font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px;--mat-expansion-container-background-color: var(--builder-expansion-background-color);--mat-expansion-header-focus-state-layer-color: red;--mat-expansion-header-description-color: var(--builder-expansion-header-description-color);--mat-expansion-header-text-size: 15}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:var(--builder-card-background-color);color:var(--builder-text-primary-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-expansion-hover-color)}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:var(--builder-button-primary-background-color)}.add-callback-icon[_ngcontent-%COMP%]:hover{background-color:var(--builder-add-button-background-color)} .callback-group .mat-expansion-panel-header.mat-expanded:focus{background-color:var(--builder-expansion-hover-color)!important} .callback-group .mat-expansion-panel-header.mat-expanded{background-color:var(--builder-expansion-hover-color)!important} .callback-group .mat-expansion-panel-header.mat-expanded:hover{background-color:var(--builder-expansion-hover-color)!important} .callback-group .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0} .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden;min-height:0} .mat-mdc-tab-body-content{flex:1;overflow:hidden;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden} .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden} .mat-mdc-tab-body-content{height:100%;overflow:hidden} .mat-drawer-inner-container{overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid var(--builder-border-color);flex-shrink:0;margin-top:auto;background-color:var(--builder-panel-background-color)}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color);color:var(--builder-button-primary-text-color);font-weight:500}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-primary-hover-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:var(--builder-button-secondary-text-color);border:1px solid var(--builder-button-secondary-border-color)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-button-secondary-hover-background-color);color:var(--builder-button-secondary-hover-text-color)}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid var(--builder-border-color);padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color);font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:var(--builder-icon-color);width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: var(--side-panel-button-filled-container-color);--mat-button-filled-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center} .mat-mdc-menu-panel{background-color:var(--builder-menu-background-color)!important} .mat-mdc-menu-panel .menu-header{color:var(--builder-text-secondary-color);font-size:12px;padding:8px 16px;font-weight:500;text-transform:uppercase;pointer-events:none} .mat-mdc-menu-panel .mat-mdc-menu-item{color:var(--builder-text-primary-color)} .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:var(--builder-menu-item-hover-color)} .mat-mdc-menu-panel mat-divider{border-top-color:var(--builder-menu-divider-color);margin:4px 0}"],changeDetection:0})};var pE=new wA("MARKDOWN_COMPONENT");var VyA=["chatMessages"],WyA=(t,e)=>({"user-message":t,"bot-message":e}),ZyA=t=>({text:t,thought:!1});function XyA(t,e){t&1&&(m(0,"div",7)(1,"mat-icon",12),K(2,"smart_toy"),D(),m(3,"h3"),K(4,"Assistant Ready"),D(),m(5,"p"),K(6,"Your builder assistant is ready to help you build agents."),D()())}function $yA(t,e){t&1&&(m(0,"div",15)(1,"span",16),K(2,"\u30FB\u30FB\u30FB"),D()())}function AvA(t,e){if(t&1&&(m(0,"div",18),K(1,"Assistant"),D(),$i(2,19)),t&2){let A=y(2).$implicit,i=y(2);p(2),X("ngComponentOutlet",i.markdownComponent)("ngComponentOutletInputs",zr(2,ZyA,A.text))}}function evA(t,e){if(t&1&&(m(0,"div",17),K(1),D()),t&2){let A=y(2).$implicit;p(),qA(A.text)}}function tvA(t,e){if(t&1&&V(0,AvA,3,4)(1,evA,2,1,"div",17),t&2){let A=y().$implicit;W(A.role==="bot"?0:1)}}function ivA(t,e){if(t&1&&(m(0,"div",13)(1,"mat-card",14),V(2,$yA,3,0,"div",15)(3,tvA,2,1),D()()),t&2){let A=e.$implicit;X("ngClass",fl(2,WyA,A.role==="user",A.role==="bot")),p(2),W(A.isLoading?2:3)}}function nvA(t,e){if(t&1&&Gt(0,ivA,4,5,"div",13,Ri),t&2){let A=y();Kt(A.messages)}}var cw=class t{isVisible=!0;appName="";closePanel=new WA;reloadCanvas=new WA;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;markdownComponent=h(pE);agentService=h(Ks);sessionService=h(Hg);agentBuilderService=h(Kc);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(e=>{this.currentSession=e.id;let A={appName:this.assistantAppName,userId:this.userId,sessionId:e.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(A).subscribe({next:i=>ct(this,null,function*(){if(i.content){let n="";for(let o of i.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:i=>{console.error("SSE error:",i);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(e){if(e.trim()){this.saveAgent(this.appName),e!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:e});let A=e;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let i={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:A}]},streaming:!1};this.agentService.runSse(i).subscribe({next:n=>ct(this,null,function*(){if(n.errorCode&&(n.errorCode=="MALFORMED_FUNCTION_CALL"||n.errorCode=="STOP")){this.sendMessage("____Something went wrong, please try again");return}if(n.content){let o="";for(let a of n.content.parts)a.text&&(o+=a.text);if(o){let a=this.messages[this.messages.length-1];a.role==="bot"&&a.isLoading&&(a.text=o,a.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(e){console.error("Error scrolling to bottom:",e)}}onKeyDown(e){if(e.key==="Enter"){if(e.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(e.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A)return;let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuildTmp(i).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-builder-assistant"]],viewQuery:function(A,i){if(A&1&&ni(VyA,5),A&2){let n;Ce(n=Ie())&&(i.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[3,"ngComponentOutlet","ngComponentOutletInputs"]],template:function(A,i){if(A&1){let n=zA();m(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),K(4,"auto_awesome"),D(),m(5,"span"),K(6,"Assistant"),D()(),m(7,"button",4),$("click",function(){return i.onClosePanel()}),m(8,"mat-icon"),K(9,"close"),D()()(),m(10,"div",5)(11,"div",6,0),V(13,XyA,7,0,"div",7)(14,nvA,2,0),D(),m(15,"div",8)(16,"div",9)(17,"textarea",10),ao("ngModelChange",function(a){return rA(n),Vn(i.userMessage,a)||(i.userMessage=a),sA(a)}),$("keydown",function(a){return i.onKeyDown(a)}),D(),m(18,"button",11),$("click",function(){return i.sendMessage(i.userMessage.trim())}),m(19,"mat-icon"),K(20,"send"),D()()()()()()}A&2&&(ae("hidden",!i.isVisible),p(13),W(i.messages.length===0?13:14),p(4),oo("ngModel",i.userMessage),X("disabled",i.isGenerating),p(),X("disabled",!i.userMessage.trim()||i.isGenerating))},dependencies:[oa,Rg,FC,yn,ro,so,Ca,In,Ia,Ba,nB,_d,nm],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:72px;width:400px;height:calc(100vh - 72px);background:var(--builder-assistant-panel-background-color);border-left:1px solid var(--builder-assistant-panel-border-color);box-shadow:-2px 0 10px #0006;z-index:999;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--builder-assistant-panel-border-color);background:var(--builder-assistant-panel-header-background-color)}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:var(--builder-text-primary-color);font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:var(--builder-text-tertiary-color)}.close-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-add-button-background-color)}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background:var(--builder-assistant-panel-background-color);overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:var(--builder-text-secondary-color)}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--builder-button-primary-background-color)}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:var(--builder-text-primary-color);font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:var(--builder-text-secondary-color)}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none;background:var(--builder-assistant-panel-background-color)}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:var(--builder-assistant-input-background-color);border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:var(--builder-assistant-input-text-color);border:none;padding:0;background:transparent;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:var(--builder-assistant-input-placeholder-color);font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:var(--builder-border-color);border-radius:4px}.send-button[_ngcontent-%COMP%]{background-color:transparent;color:var(--builder-assistant-send-button-color);width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%] .mat-mdc-button-touch-target{display:none}.send-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{display:none}.send-button[_ngcontent-%COMP%]:disabled{background-color:transparent;color:var(--builder-assistant-send-button-disabled-color)}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){background-color:var(--builder-add-button-background-color);color:var(--builder-assistant-send-button-hover-color);border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--builder-assistant-user-message-background-color);border:1px solid var(--builder-assistant-user-message-border-color);border-radius:4px;color:var(--builder-assistant-user-message-text-color);padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:transparent;border:none;border-radius:0;color:var(--builder-assistant-bot-message-text-color);padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:var(--builder-text-secondary-color);margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{background-color:#ffffff1a;padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{background-color:#ffffff0d;padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{background:none;padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid var(--builder-button-primary-background-color);padding-left:12px;margin:.5em 0;font-style:italic;color:var(--builder-text-tertiary-color)}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:var(--builder-text-secondary-color);font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var DE=class t{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=kr.getApiServerBaseUrl();_currentApp=new Jt("");currentApp=this._currentApp.asObservable();isLoading=new Jt(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new Ti(i=>{let n=this;fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e)}).then(o=>{let a=o.body?.getReader(),r=new TextDecoder("utf-8"),s="",g=()=>{a?.read().then(({done:l,value:C})=>{if(this.isLoading.next(!0),l)return this.isLoading.next(!1),i.complete();let I=r.decode(C,{stream:!0});s+=I;try{s.split(/\r?\n/).filter(B=>B.startsWith("data:")).forEach(B=>{let Q=B.replace(/^data:\s*/,""),E=JSON.parse(Q);n.zone.run(()=>i.next(E))}),s=""}catch(d){d instanceof SyntaxError&&g()}g()}).catch(l=>{n.zone.run(()=>i.error(l))})};g()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new Ti}agentBuild(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save";return this.http.post(A,e)}return new Ti}agentBuildTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/builder/save?tmp=true";return this.http.post(A,e)}return new Ti}getAgentBuilder(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}`;return this.http.get(A,{responseType:"text"})}return new Ti}getAgentBuilderTmp(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&tmp=true`;return this.http.get(A,{responseType:"text"})}return new Ti}getSubAgentBuilder(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/builder/app/${e}?ts=${Date.now()}&file_path=${A}&tmp=true`;return this.http.get(i,{responseType:"text"})}return new Ti}agentChangeCancel(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/builder/app/${e}/cancel`;return this.http.post(A,{})}return new Ti}getAppInfo(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/dev/build_graph/${e}`;return this.http.get(A)}return new Ti}static \u0275fac=function(A){return new(A||t)(Do(ks),Do(Oe))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Cw="http://www.w3.org/1999/xhtml",DN={svg:"http://www.w3.org/2000/svg",xhtml:Cw,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function wC(t){var e=t+="",A=e.indexOf(":");return A>=0&&(e=t.slice(0,A))!=="xmlns"&&(t=t.slice(A+1)),DN.hasOwnProperty(e)?{space:DN[e],local:t}:t}function avA(t){return function(){var e=this.ownerDocument,A=this.namespaceURI;return A===Cw&&e.documentElement.namespaceURI===Cw?e.createElement(t):e.createElementNS(A,t)}}function rvA(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Iw(t){var e=wC(t);return(e.local?rvA:avA)(e)}function svA(){}function nd(t){return t==null?svA:function(){return this.querySelector(t)}}function K$(t){typeof t!="function"&&(t=nd(t));for(var e=this._groups,A=e.length,i=new Array(A),n=0;n=R&&(R=b+1);!(v=E[R])&&++R=0;)(a=i[n])&&(o&&a.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(a,o),o=a);return this}function W$(t){t||(t=mvA);function e(C,I){return C&&I?t(C.__data__,I.__data__):!C-!I}for(var A=this._groups,i=A.length,n=new Array(i),o=0;oe?1:t>=e?0:NaN}function Z$(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function X$(){return Array.from(this)}function $$(){for(var t=this._groups,e=0,A=t.length;e1?this.each((e==null?MvA:typeof e=="function"?SvA:kvA)(t,e,A??"")):II(this.node(),t)}function II(t,e){return t.style.getPropertyValue(e)||Qw(t).getComputedStyle(t,null).getPropertyValue(e)}function xvA(t){return function(){delete this[t]}}function RvA(t,e){return function(){this[t]=e}}function NvA(t,e){return function(){var A=e.apply(this,arguments);A==null?delete this[t]:this[t]=A}}function oAA(t,e){return arguments.length>1?this.each((e==null?xvA:typeof e=="function"?NvA:RvA)(t,e)):this.node()[t]}function aAA(t){return t.trim().split(/^|\s+/)}function yN(t){return t.classList||new rAA(t)}function rAA(t){this._node=t,this._names=aAA(t.getAttribute("class")||"")}rAA.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function sAA(t,e){for(var A=yN(t),i=-1,n=e.length;++i=0&&(A=e.slice(i+1),e=e.slice(0,i)),{type:e,name:A}})}function ZvA(t){return function(){var e=this.__on;if(e){for(var A=0,i=-1,n=e.length,o;A{}};function bAA(){for(var t=0,e=arguments.length,A={},i;t=0&&(i=A.slice(n+1),A=A.slice(0,n)),A&&!e.hasOwnProperty(A))throw new Error("unknown type: "+A);return{type:A,name:i}})}Ew.prototype=bAA.prototype={constructor:Ew,on:function(t,e){var A=this._,i=i7A(t+"",A),n,o=-1,a=i.length;if(arguments.length<2){for(;++o0)for(var A=new Array(n),i=0,n,o;i()=>t;function Ru(t,{sourceEvent:e,subject:A,target:i,identifier:n,active:o,x:a,y:r,dx:s,dy:g,dispatch:l}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:A,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:r,enumerable:!0,configurable:!0},dx:{value:s,enumerable:!0,configurable:!0},dy:{value:g,enumerable:!0,configurable:!0},_:{value:l}})}Ru.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function o7A(t){return!t.ctrlKey&&!t.button}function a7A(){return this.parentNode}function r7A(t,e){return e??{x:t.x,y:t.y}}function s7A(){return navigator.maxTouchPoints||"ontouchstart"in this}function uw(){var t=o7A,e=a7A,A=r7A,i=s7A,n={},o=od("start","drag","end"),a=0,r,s,g,l,C=0;function I(M){M.on("mousedown.drag",d).filter(i).on("touchstart.drag",E).on("touchmove.drag",f,MAA).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(M,v){if(!(l||!t.call(this,M,v))){var F=R(this,e.call(this,M,v),M,v,"mouse");F&&(ur(M.view).on("mousemove.drag",B,ad).on("mouseup.drag",Q,ad),ku(M.view),hw(M),g=!1,r=M.clientX,s=M.clientY,F("start",M))}}function B(M){if(dI(M),!g){var v=M.clientX-r,F=M.clientY-s;g=v*v+F*F>C}n.mouse("drag",M)}function Q(M){ur(M.view).on("mousemove.drag mouseup.drag",null),Su(M.view,g),dI(M),n.mouse("end",M)}function E(M,v){if(t.call(this,M,v)){var F=M.changedTouches,G=e.call(this,M,v),U=F.length,Y,j;for(Y=0;Y>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):A===8?mw(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):A===4?mw(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=l7A.exec(t))?new eg(e[1],e[2],e[3],1):(e=c7A.exec(t))?new eg(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=C7A.exec(t))?mw(e[1],e[2],e[3],e[4]):(e=I7A.exec(t))?mw(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=d7A.exec(t))?LAA(e[1],e[2]/100,e[3]/100,1):(e=B7A.exec(t))?LAA(e[1],e[2]/100,e[3]/100,e[4]):kAA.hasOwnProperty(t)?RAA(kAA[t]):t==="transparent"?new eg(NaN,NaN,NaN,0):null}function RAA(t){return new eg(t>>16&255,t>>8&255,t&255,1)}function mw(t,e,A,i){return i<=0&&(t=e=A=NaN),new eg(t,e,A,i)}function h7A(t){return t instanceof Lu||(t=BI(t)),t?(t=t.rgb(),new eg(t.r,t.g,t.b,t.opacity)):new eg}function yE(t,e,A,i){return arguments.length===1?h7A(t):new eg(t,e,A,i??1)}function eg(t,e,A,i){this.r=+t,this.g=+e,this.b=+A,this.opacity=+i}fw(eg,yE,bN(Lu,{brighter(t){return t=t==null?Dw:Math.pow(Dw,t),new eg(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?Nu:Math.pow(Nu,t),new eg(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new eg(sd(this.r),sd(this.g),sd(this.b),ww(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:NAA,formatHex:NAA,formatHex8:u7A,formatRgb:FAA,toString:FAA}));function NAA(){return`#${rd(this.r)}${rd(this.g)}${rd(this.b)}`}function u7A(){return`#${rd(this.r)}${rd(this.g)}${rd(this.b)}${rd((isNaN(this.opacity)?1:this.opacity)*255)}`}function FAA(){let t=ww(this.opacity);return`${t===1?"rgb(":"rgba("}${sd(this.r)}, ${sd(this.g)}, ${sd(this.b)}${t===1?")":`, ${t})`}`}function ww(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function sd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function rd(t){return t=sd(t),(t<16?"0":"")+t.toString(16)}function LAA(t,e,A,i){return i<=0?t=e=A=NaN:A<=0||A>=1?t=e=NaN:e<=0&&(t=NaN),new Ic(t,e,A,i)}function GAA(t){if(t instanceof Ic)return new Ic(t.h,t.s,t.l,t.opacity);if(t instanceof Lu||(t=BI(t)),!t)return new Ic;if(t instanceof Ic)return t;t=t.rgb();var e=t.r/255,A=t.g/255,i=t.b/255,n=Math.min(e,A,i),o=Math.max(e,A,i),a=NaN,r=o-n,s=(o+n)/2;return r?(e===o?a=(A-i)/r+(A0&&s<1?0:a,new Ic(a,r,s,t.opacity)}function KAA(t,e,A,i){return arguments.length===1?GAA(t):new Ic(t,e,A,i??1)}function Ic(t,e,A,i){this.h=+t,this.s=+e,this.l=+A,this.opacity=+i}fw(Ic,KAA,bN(Lu,{brighter(t){return t=t==null?Dw:Math.pow(Dw,t),new Ic(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?Nu:Math.pow(Nu,t),new Ic(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,A=this.l,i=A+(A<.5?A:1-A)*e,n=2*A-i;return new eg(MN(t>=240?t-240:t+120,n,i),MN(t,n,i),MN(t<120?t+240:t-120,n,i),this.opacity)},clamp(){return new Ic(_AA(this.h),pw(this.s),pw(this.l),ww(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=ww(this.opacity);return`${t===1?"hsl(":"hsla("}${_AA(this.h)}, ${pw(this.s)*100}%, ${pw(this.l)*100}%${t===1?")":`, ${t})`}`}}));function _AA(t){return t=(t||0)%360,t<0?t+360:t}function pw(t){return Math.max(0,Math.min(1,t||0))}function MN(t,e,A){return(t<60?e+(A-e)*t/60:t<180?A:t<240?e+(A-e)*(240-t)/60:e)*255}function kN(t,e,A,i,n){var o=t*t,a=o*t;return((1-3*t+3*o-a)*e+(4-6*o+3*a)*A+(1+3*t+3*o-3*a)*i+a*n)/6}function UAA(t){var e=t.length-1;return function(A){var i=A<=0?A=0:A>=1?(A=1,e-1):Math.floor(A*e),n=t[i],o=t[i+1],a=i>0?t[i-1]:2*n-o,r=i()=>t;function f7A(t,e){return function(A){return t+A*e}}function m7A(t,e,A){return t=Math.pow(t,A),e=Math.pow(e,A)-t,A=1/A,function(i){return Math.pow(t+i*e,A)}}function YAA(t){return(t=+t)==1?yw:function(e,A){return A-e?m7A(e,A,t):SN(isNaN(e)?A:e)}}function yw(t,e){var A=e-t;return A?f7A(t,A):SN(isNaN(t)?e:t)}var vw=(function t(e){var A=YAA(e);function i(n,o){var a=A((n=yE(n)).r,(o=yE(o)).r),r=A(n.g,o.g),s=A(n.b,o.b),g=yw(n.opacity,o.opacity);return function(l){return n.r=a(l),n.g=r(l),n.b=s(l),n.opacity=g(l),n+""}}return i.gamma=t,i})(1);function HAA(t){return function(e){var A=e.length,i=new Array(A),n=new Array(A),o=new Array(A),a,r;for(a=0;aA&&(o=e.slice(A,o),r[a]?r[a]+=o:r[++a]=o),(i=i[0])===(n=n[0])?r[a]?r[a]+=n:r[++a]=n:(r[++a]=null,s.push({i:a,x:Il(i,n)})),A=xN.lastIndex;return A180?l+=360:l-g>180&&(g+=360),I.push({i:C.push(n(C)+"rotate(",null,i)-2,x:Il(g,l)})):l&&C.push(n(C)+"rotate("+l+i)}function r(g,l,C,I){g!==l?I.push({i:C.push(n(C)+"skewX(",null,i)-2,x:Il(g,l)}):l&&C.push(n(C)+"skewX("+l+i)}function s(g,l,C,I,d,B){if(g!==C||l!==I){var Q=d.push(n(d)+"scale(",null,",",null,")");B.push({i:Q-4,x:Il(g,C)},{i:Q-2,x:Il(l,I)})}else(C!==1||I!==1)&&d.push(n(d)+"scale("+C+","+I+")")}return function(g,l){var C=[],I=[];return g=t(g),l=t(l),o(g.translateX,g.translateY,l.translateX,l.translateY,C,I),a(g.rotate,l.rotate,C,I),r(g.skewX,l.skewX,C,I),s(g.scaleX,g.scaleY,l.scaleX,l.scaleY,C,I),g=l=null,function(d){for(var B=-1,Q=I.length,E;++B=0&&t._call.call(void 0,e),t=t._next;--vE}function qAA(){gd=(Sw=Uu.now())+xw,vE=Gu=0;try{ZAA()}finally{vE=0,x7A(),gd=0}}function S7A(){var t=Uu.now(),e=t-Sw;e>VAA&&(xw-=e,Sw=t)}function x7A(){for(var t,e=kw,A,i=1/0;e;)e._call?(i>e._time&&(i=e._time),t=e,e=e._next):(A=e._next,e._next=null,e=t?t._next=A:kw=A);Ku=t,KN(i)}function KN(t){if(!vE){Gu&&(Gu=clearTimeout(Gu));var e=t-gd;e>24?(t<1/0&&(Gu=setTimeout(qAA,t-Uu.now()-xw)),_u&&(_u=clearInterval(_u))):(_u||(Sw=Uu.now(),_u=setInterval(S7A,VAA)),vE=1,WAA(qAA))}}function Nw(t,e,A){var i=new Ju;return e=e==null?0:+e,i.restart(n=>{i.stop(),t(n+e)},e,A),i}var R7A=od("start","end","cancel","interrupt"),N7A=[],AeA=0,XAA=1,Lw=2,Fw=3,$AA=4,_w=5,Hu=6;function QI(t,e,A,i,n,o){var a=t.__transition;if(!a)t.__transition={};else if(A in a)return;F7A(t,A,{name:e,index:i,group:n,on:R7A,tween:N7A,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:AeA})}function Tu(t,e){var A=ir(t,e);if(A.state>AeA)throw new Error("too late; already scheduled");return A}function Yr(t,e){var A=ir(t,e);if(A.state>Fw)throw new Error("too late; already running");return A}function ir(t,e){var A=t.__transition;if(!A||!(A=A[e]))throw new Error("transition not found");return A}function F7A(t,e,A){var i=t.__transition,n;i[e]=A,A.timer=Rw(o,0,A.time);function o(g){A.state=XAA,A.timer.restart(a,A.delay,A.time),A.delay<=g&&a(g-A.delay)}function a(g){var l,C,I,d;if(A.state!==XAA)return s();for(l in i)if(d=i[l],d.name===A.name){if(d.state===Fw)return Nw(a);d.state===$AA?(d.state=Hu,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete i[l]):+lLw&&i.state<_w,i.state=Hu,i.timer.stop(),i.on.call(n?"interrupt":"cancel",t,t.__data__,i.index,i.group),delete A[a]}o&&delete t.__transition}}function eeA(t){return this.each(function(){ld(this,t)})}function L7A(t,e){var A,i;return function(){var n=Yr(this,t),o=n.tween;if(o!==A){i=A=o;for(var a=0,r=i.length;a=0&&(e=e.slice(0,A)),!e||e==="start"})}function AbA(t,e,A){var i,n,o=$7A(e)?Tu:Yr;return function(){var a=o(this,t),r=a.on;r!==i&&(n=(i=r).copy()).on(e,A),a.on=n}}function ceA(t,e){var A=this._id;return arguments.length<2?ir(this.node(),A).on.on(t):this.each(AbA(A,t,e))}function ebA(t){return function(){var e=this.parentNode;for(var A in this.__transition)if(+A!==t)return;e&&e.removeChild(this)}}function CeA(){return this.on("end.remove",ebA(this._id))}function IeA(t){var e=this._name,A=this._id;typeof t!="function"&&(t=nd(t));for(var i=this._groups,n=i.length,o=new Array(n),a=0;a()=>t;function UN(t,{sourceEvent:e,target:A,transform:i,dispatch:n}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:A,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:n}})}function dc(t,e,A){this.k=t,this.x=e,this.y=A}dc.prototype={constructor:dc,scale:function(t){return t===1?this:new dc(this.k*t,this.x,this.y)},translate:function(t,e){return t===0&e===0?this:new dc(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var EI=new dc(1,0,0);JN.prototype=dc.prototype;function JN(t){for(;!t.__zoom;)if(!(t=t.parentNode))return EI;return t.__zoom}function Jw(t){t.stopImmediatePropagation()}function ME(t){t.preventDefault(),t.stopImmediatePropagation()}function QbA(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function EbA(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function yeA(){return this.__zoom||EI}function hbA(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function ubA(){return navigator.maxTouchPoints||"ontouchstart"in this}function fbA(t,e,A){var i=t.invertX(e[0][0])-A[0][0],n=t.invertX(e[1][0])-A[1][0],o=t.invertY(e[0][1])-A[0][1],a=t.invertY(e[1][1])-A[1][1];return t.translate(n>i?(i+n)/2:Math.min(0,i)||Math.max(0,n),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}function YN(){var t=QbA,e=EbA,A=fbA,i=hbA,n=ubA,o=[0,1/0],a=[[-1/0,-1/0],[1/0,1/0]],r=250,s=GN,g=od("start","zoom","end"),l,C,I,d=500,B=150,Q=0,E=10;function f(P){P.property("__zoom",yeA).on("wheel.zoom",U,{passive:!1}).on("mousedown.zoom",Y).on("dblclick.zoom",j).filter(n).on("touchstart.zoom",AA).on("touchmove.zoom",z).on("touchend.zoom touchcancel.zoom",yA).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}f.transform=function(P,nA,eA,dA){var iA=P.selection?P.selection():P;iA.property("__zoom",yeA),P!==iA?v(P,nA,eA,dA):iA.interrupt().each(function(){F(this,arguments).event(dA).start().zoom(null,typeof nA=="function"?nA.apply(this,arguments):nA).end()})},f.scaleBy=function(P,nA,eA,dA){f.scaleTo(P,function(){var iA=this.__zoom.k,aA=typeof nA=="function"?nA.apply(this,arguments):nA;return iA*aA},eA,dA)},f.scaleTo=function(P,nA,eA,dA){f.transform(P,function(){var iA=e.apply(this,arguments),aA=this.__zoom,hA=eA==null?M(iA):typeof eA=="function"?eA.apply(this,arguments):eA,JA=aA.invert(hA),ee=typeof nA=="function"?nA.apply(this,arguments):nA;return A(R(b(aA,ee),hA,JA),iA,a)},eA,dA)},f.translateBy=function(P,nA,eA,dA){f.transform(P,function(){return A(this.__zoom.translate(typeof nA=="function"?nA.apply(this,arguments):nA,typeof eA=="function"?eA.apply(this,arguments):eA),e.apply(this,arguments),a)},null,dA)},f.translateTo=function(P,nA,eA,dA,iA){f.transform(P,function(){var aA=e.apply(this,arguments),hA=this.__zoom,JA=dA==null?M(aA):typeof dA=="function"?dA.apply(this,arguments):dA;return A(EI.translate(JA[0],JA[1]).scale(hA.k).translate(typeof nA=="function"?-nA.apply(this,arguments):-nA,typeof eA=="function"?-eA.apply(this,arguments):-eA),aA,a)},dA,iA)};function b(P,nA){return nA=Math.max(o[0],Math.min(o[1],nA)),nA===P.k?P:new dc(nA,P.x,P.y)}function R(P,nA,eA){var dA=nA[0]-eA[0]*P.k,iA=nA[1]-eA[1]*P.k;return dA===P.x&&iA===P.y?P:new dc(P.k,dA,iA)}function M(P){return[(+P[0][0]+ +P[1][0])/2,(+P[0][1]+ +P[1][1])/2]}function v(P,nA,eA,dA){P.on("start.zoom",function(){F(this,arguments).event(dA).start()}).on("interrupt.zoom end.zoom",function(){F(this,arguments).event(dA).end()}).tween("zoom",function(){var iA=this,aA=arguments,hA=F(iA,aA).event(dA),JA=e.apply(iA,aA),ee=eA==null?M(JA):typeof eA=="function"?eA.apply(iA,aA):eA,UA=Math.max(JA[1][0]-JA[0][0],JA[1][1]-JA[0][1]),mA=iA.__zoom,KA=typeof nA=="function"?nA.apply(iA,aA):nA,ze=s(mA.invert(ee).concat(UA/mA.k),KA.invert(ee).concat(UA/KA.k));return function(Ke){if(Ke===1)Ke=KA;else{var HA=ze(Ke),uA=UA/HA[2];Ke=new dc(uA,ee[0]-HA[0]*uA,ee[1]-HA[1]*uA)}hA.zoom(null,Ke)}})}function F(P,nA,eA){return!eA&&P.__zooming||new G(P,nA)}function G(P,nA){this.that=P,this.args=nA,this.active=0,this.sourceEvent=null,this.extent=e.apply(P,nA),this.taps=0}G.prototype={event:function(P){return P&&(this.sourceEvent=P),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(P,nA){return this.mouse&&P!=="mouse"&&(this.mouse[1]=nA.invert(this.mouse[0])),this.touch0&&P!=="touch"&&(this.touch0[1]=nA.invert(this.touch0[0])),this.touch1&&P!=="touch"&&(this.touch1[1]=nA.invert(this.touch1[0])),this.that.__zoom=nA,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(P){var nA=ur(this.that).datum();g.call(P,this.that,new UN(P,{sourceEvent:this.sourceEvent,target:f,type:P,transform:this.that.__zoom,dispatch:g}),nA)}};function U(P,...nA){if(!t.apply(this,arguments))return;var eA=F(this,nA).event(P),dA=this.__zoom,iA=Math.max(o[0],Math.min(o[1],dA.k*Math.pow(2,i.apply(this,arguments)))),aA=Cl(P);if(eA.wheel)(eA.mouse[0][0]!==aA[0]||eA.mouse[0][1]!==aA[1])&&(eA.mouse[1]=dA.invert(eA.mouse[0]=aA)),clearTimeout(eA.wheel);else{if(dA.k===iA)return;eA.mouse=[aA,dA.invert(aA)],ld(this),eA.start()}ME(P),eA.wheel=setTimeout(hA,B),eA.zoom("mouse",A(R(b(dA,iA),eA.mouse[0],eA.mouse[1]),eA.extent,a));function hA(){eA.wheel=null,eA.end()}}function Y(P,...nA){if(I||!t.apply(this,arguments))return;var eA=P.currentTarget,dA=F(this,nA,!0).event(P),iA=ur(P.view).on("mousemove.zoom",ee,!0).on("mouseup.zoom",UA,!0),aA=Cl(P,eA),hA=P.clientX,JA=P.clientY;ku(P.view),Jw(P),dA.mouse=[aA,this.__zoom.invert(aA)],ld(this),dA.start();function ee(mA){if(ME(mA),!dA.moved){var KA=mA.clientX-hA,ze=mA.clientY-JA;dA.moved=KA*KA+ze*ze>Q}dA.event(mA).zoom("mouse",A(R(dA.that.__zoom,dA.mouse[0]=Cl(mA,eA),dA.mouse[1]),dA.extent,a))}function UA(mA){iA.on("mousemove.zoom mouseup.zoom",null),Su(mA.view,dA.moved),ME(mA),dA.event(mA).end()}}function j(P,...nA){if(t.apply(this,arguments)){var eA=this.__zoom,dA=Cl(P.changedTouches?P.changedTouches[0]:P,this),iA=eA.invert(dA),aA=eA.k*(P.shiftKey?.5:2),hA=A(R(b(eA,aA),dA,iA),e.apply(this,nA),a);ME(P),r>0?ur(this).transition().duration(r).call(v,hA,dA,P):ur(this).call(f.transform,hA,dA,P)}}function AA(P,...nA){if(t.apply(this,arguments)){var eA=P.touches,dA=eA.length,iA=F(this,nA,P.changedTouches.length===dA).event(P),aA,hA,JA,ee;for(Jw(P),hA=0;hA{let A=Math.max(0,Math.min(t.x+t.width,e.x+e.width)-Math.max(t.x,e.x)),i=Math.max(0,Math.min(t.y+t.height,e.y+e.height)-Math.max(t.y,e.y));return Math.ceil(A*i)};function HeA(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let e={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return t.forEach(A=>{let i=H9A(A);e=O9A(e,i)}),T9A(e)}function Y9A(t,e,A){let i=e.find(o=>o.rawNode.id===t);if(!i)return[];let n=Hw(i);return e.filter(o=>{if(o.rawNode.id===t)return!1;let a=J9A(Hw(o),n);return A?.partially?a>0:a>=n.width*n.height})}function H9A(t){return{x:t.point().x,y:t.point().y,x2:t.point().x+t.size().width,y2:t.point().y+t.size().height}}function Hw(t){return{x:t.globalPoint().x,y:t.globalPoint().y,width:t.width(),height:t.height()}}function T9A({x:t,y:e,x2:A,y2:i}){return{x:t,y:e,width:A-t,height:i-e}}function O9A(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y),x2:Math.max(t.x2,e.x2),y2:Math.max(t.y2,e.y2)}}var Tw=class{constructor(e){this.settings=e,this.curve=e.curve??"bezier",this.type=e.type??"default",this.mode=e.mode??"strict";let A=this.getValidators(e);this.validator=i=>A.every(n=>n(i))}getValidators(e){let A=[];return A.push(z9A),this.mode==="loose"&&A.push(P9A),e.validator&&A.push(e.validator),A}},z9A=t=>t.source!==t.target,P9A=t=>t.sourceHandle!==void 0&&t.targetHandle!==void 0;function SE(t){return t.split("").reduce((e,A)=>(e=(e<<5)-e+A.charCodeAt(0),e&e),0)}var ig=(()=>{class t{constructor(){this.nodes=jA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawNodes=_e(()=>this.nodes().map(A=>A.rawNode)),this.edges=jA([],{equal:(A,i)=>!A.length&&!i.length?!0:A===i}),this.rawEdges=_e(()=>this.edges().map(A=>A.edge)),this.validEdges=_e(()=>{let A=this.nodes();return this.edges().filter(i=>A.includes(i.source())&&A.includes(i.target()))}),this.connection=jA(new Tw({})),this.markers=_e(()=>{let A=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=SE(JSON.stringify(n.edge.markers.start));A.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=SE(JSON.stringify(n.edge.markers.end));A.set(o,n.edge.markers.end)}});let i=this.connection().settings.marker;if(i){let n=SE(JSON.stringify(i));A.set(n,i)}return A}),this.entities=_e(()=>[...this.nodes(),...this.edges()]),this.minimap=jA(null)}getNode(A){return this.nodes().find(({rawNode:i})=>i.id===A)}getDetachedEdges(){return this.edges().filter(A=>A.detached())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function j9A(t,e,A,i,n,o){let a=e/(t.width*(1+o)),r=A/(t.height*(1+o)),s=Math.min(a,r),g=q9A(s,i,n),l=t.x+t.width/2,C=t.y+t.height/2,I=e/2-l*g,d=A/2-C*g;return{x:I,y:d,zoom:g}}function q9A(t,e=0,A=1){return Math.min(Math.max(t,e),A)}function V9A(t,e,A){let i=t.zoom;return{x:-t.x/i,y:-t.y/i,width:e/i,height:A/i}}function W9A(t,e,A,i){let n=V9A(e,A,i);return!(t.x+t.widthn.x+n.width||t.y+t.heightn.y+n.height)}var Z9A={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},rs=(()=>{class t{constructor(){this.entitiesSelectable=jA(!0),this.elevateNodesOnSelect=jA(!0),this.elevateEdgesOnSelect=jA(!0),this.view=jA([400,400]),this.computedFlowWidth=jA(0),this.computedFlowHeight=jA(0),this.minZoom=jA(.5),this.maxZoom=jA(3),this.background=jA({type:"solid",color:"#fff"}),this.snapGrid=jA([1,1]),this.optimization=jA(Z9A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),cd=(()=>{class t{constructor(){this.entitiesService=h(ig),this.flowSettingsService=h(rs),this.writableViewport=jA({changeType:"initial",state:t.getDefaultViewport(),duration:0}),this.readableViewport=jA(t.getDefaultViewport()),this.viewportChangeEnd$=new $A}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(A={padding:.1,duration:0,nodes:[]}){let i=this.getBoundsNodes(A.nodes??[]),n=j9A(HeA(i),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),A.padding??.1),o=A.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(A){A==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(A){return A?.length?A.map(i=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===i)).filter(i=>!!i):this.entitiesService.nodes()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function bC(t){return t!==void 0}var Xw=(()=>{class t{constructor(){this.element=h(ge).nativeElement}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["svg","rootSvgRef",""]]})}}return t})();function veA(){let t=window.navigator.userAgent.toLowerCase(),e=/(macintosh|macintel|macppc|mac68k|macos)/i,A=/(win32|win64|windows|wince)/i,i=/(iphone|ipad|ipod)/i,n=null;return e.test(t)?n="macos":i.test(t)?n="ios":A.test(t)?n="windows":/android/.test(t)?n="android":!n&&/linux/.test(t)&&(n="linux"),n}var zN=(()=>{class t{constructor(){this.actions=jA({multiSelection:[veA()==="macos"?"MetaLeft":"ControlLeft",veA()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},Tn(this.actions).pipe(Ei(()=>Qi(mc(document,"keydown").pipe(Wt(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!0)})),mc(document,"keyup").pipe(Wt(A=>{for(let i in this.actions())(this.actions()[i]??[]).includes(A.code)&&(this.actionsActive[i]=!1)})))),br()).subscribe()}setShortcuts(A){this.actions.update(i=>BA(BA({},i),A))}isActiveAction(A){return this.actionsActive[A]}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),Vu=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.keyboardService=h(zN),this.viewport$=new $A,this.resetSelection=this.viewport$.pipe(Wt(({start:A,end:i,target:n})=>{if(A&&i&&n){let o=t.delta,a=Math.abs(i.x-A.x),r=Math.abs(i.y-A.y),s=ai.selected.set(!1)),A&&A.selected.set(!0))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),HN=(()=>{class t{constructor(){this.rootSvg=h(Xw).element,this.host=h(ge).nativeElement,this.selectionService=h(Vu),this.viewportService=h(cd),this.flowSettingsService=h(rs),this.zone=h(Oe),this.rootSvgSelection=ur(this.rootSvg),this.transform=jA(""),this.viewportForSelection={},this.manualViewportChangeEffect=pa(()=>{let A=this.viewportService.writableViewport(),i=A.state;if(A.changeType!=="initial"){if(bC(i.zoom)&&!bC(i.x)&&!bC(i.y)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.scaleTo,i.zoom);return}if(bC(i.x)&&bC(i.y)&&!bC(i.zoom)){let n=Zo(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,EI.translate(i.x,i.y).scale(n));return}if(bC(i.x)&&bC(i.y)&&bC(i.zoom)){this.rootSvgSelection.transition().duration(A.duration).call(this.zoomBehavior.transform,EI.translate(i.x,i.y).scale(i.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:A})=>{this.viewportService.readableViewport.set(TN(A)),this.transform.set(A.toString())},this.handleZoomStart=({transform:A})=>{this.viewportForSelection={start:TN(A)}},this.handleZoomEnd=({transform:A,sourceEvent:i})=>{this.zone.run(()=>{this.viewportForSelection=Ve(BA({},this.viewportForSelection),{end:TN(A),target:X9A(i)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=A=>A.type==="mousedown"||A.type==="touchstart"?A.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=YN().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(i,n){i&2&&ie("transform",n.transform())}})}}return t})(),TN=t=>({zoom:t.k,x:t.x,y:t.y}),X9A=t=>{if(t instanceof Event&&t.target instanceof Element)return t.target},Ow=t=>Math.round(t*100)/100;function tg(t,e){return Math.ceil(t/e)*e}var hI=(()=>{class t{constructor(){this.status=jA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(A,i){this.status.set({state:"connection-start",payload:{source:A,sourceHandle:i}})}setReconnectionStartStatus(A,i,n){this.status.set({state:"reconnection-start",payload:{source:A,sourceHandle:i,oldEdge:n}})}setConnectionValidationStatus(A,i,n,o,a){this.status.set({state:"connection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A}})}setReconnectionValidationStatus(A,i,n,o,a,r){this.status.set({state:"reconnection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:a,valid:A,oldEdge:r}})}setConnectionEndStatus(A,i,n,o){this.status.set({state:"connection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(A,i,n,o,a){this.status.set({state:"reconnection-end",payload:{source:A,target:i,sourceHandle:n,targetHandle:o,oldEdge:a}})}setNodeDragStartStatus(A){this.status.set({state:"node-drag-start",payload:{node:A}})}setNodeDragEndStatus(A){this.status.set({state:"node-drag-end",payload:{node:A}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function beA(t){return t.state==="node-drag-start"}function $9A(t){return t.state==="node-drag-end"}var TeA=(()=>{class t{constructor(){this.entitiesService=h(ig),this.settingsService=h(rs),this.flowStatusService=h(hI)}enable(A,i){ur(A).call(this.getDragBehavior(i))}disable(A){ur(A).call(uw().on("drag",null))}destroy(A){ur(A).on(".drag",null)}getDragBehavior(A){let i=[],n=[],o=a=>A.dragHandlesCount()?!!a.target.closest(".vflow-drag-handle"):!0;return uw().filter(o).on("start",a=>{i=this.getDragNodes(A),this.flowStatusService.setNodeDragStartStatus(A),n=i.map(r=>({x:r.point().x-a.x,y:r.point().y-a.y}))}).on("drag",a=>{i.forEach((r,s)=>{let g={x:Ow(a.x+n[s].x),y:Ow(a.y+n[s].y)};this.moveNode(r,g)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(A)})}getDragNodes(A){return A.selected()?this.entitiesService.nodes().filter(i=>i.selected()&&i.draggable()):[A]}moveNode(A,i){i=this.alignToGrid(i);let n=A.parent();n&&(i.x=Math.min(n.width()-A.width(),i.x),i.x=Math.max(0,i.x),i.y=Math.min(n.height()-A.height(),i.y),i.y=Math.max(0,i.y)),A.setPoint(i)}alignToGrid(A){let[i,n]=this.settingsService.snapGrid();return i>1&&(A.x=tg(A.x,i)),n>1&&(A.y=tg(A.y,n)),A}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),MeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","edge",""]]})}}return t})(),keA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","connection",""]]})}}return t})(),SeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","edgeLabelHtml",""]]})}}return t})(),zw=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","nodeHtml",""]]})}}return t})(),xeA=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","nodeSvg",""]]})}}return t})(),Pw=(()=>{class t{constructor(){this.templateRef=h(Fn)}static ngTemplateContextGuard(A,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["ng-template","groupNode",""]]})}}return t})();function ReA(t,e){let A=t.reduce((i,n)=>(i[n.rawNode.id]=n,i),{});e.forEach(i=>{i.source.set(A[i.edge.source]),i.target.set(A[i.edge.target])})}function ju(t){try{return new Proxy(t,{apply:()=>{}})(),!0}catch(e){return!1}}var PN=(()=>{class t{constructor(){this._event$=new $A,this.event$=this._event$.asObservable()}pushEvent(A){this._event$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),xE=(()=>{class t{constructor(){this.model=jA(null)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),OeA=(()=>{class t{constructor(){this.eventBus=h(PN),this.nodeService=h(xE),this.destroyRef=h(Wa),this.selected=this.nodeService.model().selected,this.data=jA(void 0)}ngOnInit(){this.trackEvents().pipe(br(this.destroyRef)).subscribe()}trackEvents(){let A=Object.getOwnPropertyNames(this),i=new Map;for(let n of A){let o=this[n];o instanceof WA&&i.set(o,n),o instanceof fL&&i.set(AMA(o),n)}return Qi(...Array.from(i.keys()).map(n=>n.pipe(Wt(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:i.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,standalone:!1})}}return t})();function AMA(t){return new Ti(e=>{let A=t.subscribe(i=>{e.next(i)});return()=>{A.unsubscribe()}})}var eMA=(()=>{class t extends OeA{constructor(){super(...arguments),this.node=nt.required()}ngOnInit(){let A=this.node().data;A&&(this.data=A),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\u0275dir=OA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[Ct]})}}return t})(),tMA=(()=>{class t extends OeA{constructor(){super(...arguments),this.node=nt.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\u0275dir=OA({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[Ct]})}}return t})();function zeA(t){return Object.prototype.isPrototypeOf.call(tMA,t)}function PeA(t){return Object.prototype.isPrototypeOf.call(eMA,t)}function iMA(t){return typeof t.point=="function"}function nMA(t){return zeA(t.type)?!0:ju(t.type)&&!ju(t.point)}function oMA(t){return PeA(t.type)?!0:ju(t.type)&&ju(t.point)}var jw=2;function aMA(t){return iMA(t)?t:Ve(BA({},rMA(t)),{id:t.id,type:t.type})}function rMA(t){let e={};for(let A in t)Object.prototype.hasOwnProperty.call(t,A)&&(e[A]=jA(t[A]));return e}function sMA(t,e,A){!e&&gL(t);let i=e??h(ut);return A?Ya(i,A):i}function qu(t,e){let A=sMA(qu,e?.injector),i;return _e(()=>(i||(i=Zo(()=>Is(t,Ve(BA({},e),{injector:A})))),i()))}function gMA(t){return t.rawNode.type==="default-group"||t.rawNode.type==="template-group"}var Cd=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.flowSettingsService=h(rs),this.viewportService=h(cd),this.nodes=_e(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.nodes()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.groups=_e(()=>this.nodes().filter(A=>!!A.children().length||gMA(A))),this.nonGroups=_e(()=>this.nodes().filter(A=>!this.groups().includes(A))),this.viewportNodes=_e(()=>{let A=this.flowEntitiesService.nodes(),i=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return A.filter(a=>{let{x:r,y:s}=a.globalPoint(),g=a.width(),l=a.height();return W9A({x:r,y:s,width:g,height:l},i,n,o)})}),this.viewportNodesAfterInteraction=qu(Qi(Tn(this.flowEntitiesService.nodes).pipe(Ed(sf),We(A=>!!A.length)),this.viewportService.viewportChangeEnd$.pipe(ps(300))).pipe(fe(()=>{let A=this.viewportService.readableViewport(),i=this.flowSettingsService.optimization().virtualizationZoomThreshold;return A.zoomMath.max(...this.flowEntitiesService.nodes().map(A=>A.renderOrder())))}pullNode(A){A.renderOrder.set(this.maxOrder()+1),A.children().forEach(i=>this.pullNode(i))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function qw(t,e){e||(e={equal:Object.is});let A;return _e(()=>A=t(A),e)}var lMA=(()=>{class t{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(A){this.rawNode=A,this.entitiesService=h(ig),this.settingsService=h(rs),this.nodeRenderingService=h(Cd),this.isVisible=jA(!1),this.point=jA({x:0,y:0}),this.width=jA(t.defaultWidth),this.height=jA(t.defaultHeight),this.size=_e(()=>({width:this.width(),height:this.height()})),this.styleWidth=_e(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=_e(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=_e(()=>this.width()+jw),this.foHeight=_e(()=>this.height()+jw),this.renderOrder=jA(0),this.selected=jA(!1),this.preview=jA({style:{}}),this.globalPoint=_e(()=>{let n=this.parent(),o=this.point().x,a=this.point().y;for(;n!==null;)o+=n.point().x,a+=n.point().y,n=n.parent();return{x:o,y:a}}),this.pointTransform=_e(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=jA([]),this.draggable=jA(!0),this.dragHandlesCount=jA(0),this.magnetRadius=20,this.isComponentType=nMA(this.rawNode)||oMA(this.rawNode),this.shouldLoad=qw(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(zeA(this.rawNode.type)||PeA(this.rawNode.type))return!0;if(ju(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=Tn(this.shouldLoad).pipe(We(Boolean),Ei(()=>this.rawNode.type()),Ho(()=>oe(this.rawNode.type)),Ds(1)),this.text=jA(""),this.componentTypeInputs={node:this.rawNode},this.parent=_e(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=_e(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=jA(t.defaultColor),this.controlledByResizer=jA(!1),this.resizable=jA(!1),this.resizing=jA(!1),this.resizerTemplate=jA(null),this.context={$implicit:{}},this.parentId=jA(null);let i=aMA(A);i.point&&(this.point=i.point),i.width&&(this.width=i.width),i.height&&(this.height=i.height),i.draggable&&(this.draggable=i.draggable),i.parentId&&(this.parentId=i.parentId),i.preview&&(this.preview=i.preview),i.type==="default-group"&&i.color&&(this.color=i.color),i.type==="default-group"&&i.resizable&&(this.resizable=i.resizable),i.type==="default"&&i.text&&(this.text=i.text),i.type==="html-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="svg-template"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="template-group"&&(this.context={$implicit:{node:A,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=Tn(this.point),this.width$=Tn(this.width),this.height$=Tn(this.height),this.size$=Tn(this.size),this.selected$=Tn(this.selected),this.handles$=Tn(this.handles)}setPoint(A){this.point.set(A)}}return t})(),zu=class{constructor(e){this.edgeLabel=e,this.size=jA({width:0,height:0})}};function MC(t,e,A){return{x:(1-A)*t.x+A*e.x,y:(1-A)*t.y+A*e.y}}function jN({sourcePoint:t,targetPoint:e}){return{path:`M ${t.x},${t.y}L ${e.x},${e.y}`,labelPoints:{start:MC(t,e,.15),center:MC(t,e,.5),end:MC(t,e,.85)}}}function qN({sourcePoint:t,targetPoint:e,sourcePosition:A,targetPosition:i}){let n={x:t.x-e.x,y:t.y-e.y},o=NeA(t,A,n),a=NeA(e,i,n),r=`M${t.x},${t.y} C${o.x},${o.y} ${a.x},${a.y} ${e.x},${e.y}`;return cMA(r,t,e,o,a)}function NeA(t,e,A){let i={x:0,y:0};switch(e){case"top":i.y=1;break;case"bottom":i.y=-1;break;case"right":i.x=1;break;case"left":i.x=-1;break}let n={x:A.x*Math.abs(i.x),y:A.y*Math.abs(i.y)},a=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:t.x+i.x*a,y:t.y-i.y*a}}function cMA(t,e,A,i,n){return{path:t,labelPoints:{start:ON(e,A,i,n,.1),center:ON(e,A,i,n,.5),end:ON(e,A,i,n,.9)}}}function ON(t,e,A,i,n){let o=MC(t,A,n),a=MC(A,i,n),r=MC(i,e,n);return MC(MC(o,a,n),MC(a,r,n),n)}var FeA={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function CMA(t,e){let A=Math.abs(e.x-t.x)/2,i=e.xe==="left"||e==="right"?t.xMath.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2));function dMA({source:t,sourcePosition:e="bottom",target:A,targetPosition:i="top",offset:n}){let o=FeA[e],a=FeA[i],r={x:t.x+o.x*n,y:t.y+o.y*n},s={x:A.x+a.x*n,y:A.y+a.y*n},g=IMA({source:r,sourcePosition:e,target:s}),l=g.x!==0?"x":"y",C=g[l],I=[],d,B,Q={x:0,y:0},E={x:0,y:0},[f,b]=CMA(t,A);if(o[l]*a[l]===-1){d=f,B=b;let M=[{x:d,y:r.y},{x:d,y:s.y}],v=[{x:r.x,y:B},{x:s.x,y:B}];o[l]===C?I=l==="x"?M:v:I=l==="x"?v:M}else{let M=[{x:r.x,y:s.y}],v=[{x:s.x,y:r.y}];if(l==="x"?I=o.x===C?v:M:I=o.y===C?M:v,e===i){let j=Math.abs(t[l]-A[l]);if(j<=n){let AA=Math.min(n-1,n-j);o[l]===C?Q[l]=(r[l]>t[l]?-1:1)*AA:E[l]=(s[l]>A[l]?-1:1)*AA}}if(e!==i){let j=l==="x"?"y":"x",AA=o[l]===a[j],z=r[j]>s[j],yA=r[j]=Y?(d=(F.x+G.x)/2,B=I[0].y):(d=I[0].x,B=(F.y+G.y)/2)}return[[t,{x:r.x+Q.x,y:r.y+Q.y},...I,{x:s.x+E.x,y:s.y+E.y},A],d,B]}function BMA(t,e,A,i){let n=Math.min(LeA(t,e)/2,LeA(e,A)/2,i),{x:o,y:a}=e;if(t.x===o&&o===A.x||t.y===a&&a===A.y)return`L${o} ${a}`;if(t.y===a){let g=t.x{let f="";return E>0&&E{let Q=I*B;if(Q<=0)return o[0];if(Q>=I)return o[g-1];let E=0,f=g-1;for(;E>>1;C[G](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=jA(0),this.detached=_e(()=>{let A=this.source(),i=this.target();if(!A||!i)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!A.handles().find(a=>a.rawHandle.id===this.edge.sourceHandle):n=!!A.handles().find(a=>a.rawHandle.type==="source"),this.edge.targetHandle?o=!!i.handles().find(a=>a.rawHandle.id===this.edge.targetHandle):o=!!i.handles().find(a=>a.rawHandle.type==="target"),!n||!o}),this.detached$=Tn(this.detached),this.path=_e(()=>{let A=this.sourceHandle(),i=this.targetHandle();if(!A||!i)return{path:""};let n=this.getPathFactoryParams(A,i);switch(this.curve){case"straight":return jN(n);case"bezier":return qN(n);case"smooth-step":return kE(n);case"step":return kE(n,0);default:return this.curve(n)}}),this.sourceHandle=qw(A=>{let i=null;return this.floating?i=this.closestHandles().sourceHandle:this.edge.sourceHandle?i=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:i=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,i===null?A:i}),this.targetHandle=qw(A=>{let i=null;return this.floating?i=this.closestHandles().targetHandle:this.edge.targetHandle?i=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:i=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,i===null?A:i}),this.closestHandles=_e(()=>{let A=this.source(),i=this.target();if(!A||!i)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?A.handles().filter(g=>g.rawHandle.type==="source"):A.handles(),o=this.flowEntitiesService.connection().mode==="strict"?i.handles().filter(g=>g.rawHandle.type==="target"):i.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let a=1/0,r=null,s=null;for(let g of n)for(let l of o){let C=g.pointAbsolute(),I=l.pointAbsolute(),d=Math.sqrt(Math.pow(C.x-I.x,2)+Math.pow(C.y-I.y,2));d{let A=this.edge.markers?.start;return A?`url(#${SE(JSON.stringify(A))})`:""}),this.markerEndUrl=_e(()=>{let A=this.edge.markers?.end;return A?`url(#${SE(JSON.stringify(A))})`:""}),this.context={$implicit:{edge:this.edge,path:_e(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=e.type??"default",this.curve=e.curve??"bezier",this.reconnectable=e.reconnectable??!1,this.floating=e.floating??!1,e.edgeLabels?.start&&(this.edgeLabels.start=new zu(e.edgeLabels.start)),e.edgeLabels?.center&&(this.edgeLabels.center=new zu(e.edgeLabels.center)),e.edgeLabels?.end&&(this.edgeLabels.end=new zu(e.edgeLabels.end))}getPathFactoryParams(e,A){return{mode:"edge",edge:this.edge,sourcePoint:e.pointAbsolute(),targetPoint:A.pointAbsolute(),sourcePosition:e.rawHandle.position,targetPosition:A.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},Vw=class{static nodes(e,A){let i=new Map;return A.forEach(n=>i.set(n.rawNode,n)),e.map(n=>i.get(n)??new lMA(n))}static edges(e,A){let i=new Map;return A.forEach(n=>i.set(n.edge,n)),e.map(n=>i.has(n)?i.get(n):new VN(n))}},QMA=25,WN=(()=>{class t{constructor(){this.entitiesService=h(ig),this.nodesPositionChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.point$.pipe(rg(1),fe(()=>i))))),fe(A=>[{type:"position",id:A.rawNode.id,point:A.point()},...this.entitiesService.nodes().filter(i=>i!==A&&i.selected()).map(i=>({type:"position",id:i.rawNode.id,point:i.point()}))])),this.nodeSizeChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.size$.pipe(rg(1),fe(()=>i))))),fe(A=>[{type:"size",id:A.rawNode.id,size:A.size()}])),this.nodeAddChange$=Tn(this.entitiesService.nodes).pipe(kC(),fe(([A,i])=>i.filter(n=>!A.includes(n))),We(A=>!!A.length),fe(A=>A.map(i=>({type:"add",id:i.rawNode.id})))),this.nodeRemoveChange$=Tn(this.entitiesService.nodes).pipe(kC(),fe(([A,i])=>A.filter(n=>!i.includes(n))),We(A=>!!A.length),fe(A=>A.map(i=>({type:"remove",id:i.rawNode.id})))),this.nodeSelectedChange$=Tn(this.entitiesService.nodes).pipe(Ei(A=>Qi(...A.map(i=>i.selected$.pipe(hl(),rg(1),fe(()=>i))))),fe(A=>[{type:"select",id:A.rawNode.id,selected:A.selected()}])),this.changes$=Qi(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(Ed(sf,QMA))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),EMA=(t,e)=>t.length===e.length&&[...new Set([...t,...e])].every(A=>t.filter(i=>i===A).length===e.filter(i=>i===A).length),ZN=(()=>{class t{constructor(){this.entitiesService=h(ig),this.edgeDetachedChange$=Qi(Tn(_e(()=>{let A=this.entitiesService.nodes();return Zo(this.entitiesService.edges).filter(({source:n,target:o})=>!A.includes(n())||!A.includes(o()))})),Tn(this.entitiesService.edges).pipe(Ei(A=>nL(...A.map(i=>i.detached$.pipe(fe(()=>i))))),fe(A=>A.filter(i=>i.detached())),rg(2))).pipe(hl(EMA),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:"detached",id:i.id})))),this.edgeAddChange$=Tn(this.entitiesService.edges).pipe(kC(),fe(([A,i])=>i.filter(n=>!A.includes(n))),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:"add",id:i.id})))),this.edgeRemoveChange$=Tn(this.entitiesService.edges).pipe(kC(),fe(([A,i])=>A.filter(n=>!i.includes(n))),We(A=>!!A.length),fe(A=>A.map(({edge:i})=>({type:"remove",id:i.id})))),this.edgeSelectChange$=Tn(this.entitiesService.edges).pipe(Ei(A=>Qi(...A.map(i=>i.selected$.pipe(hl(),rg(1),fe(()=>i))))),fe(A=>[{type:"select",id:A.edge.id,selected:A.selected()}])),this.changes$=Qi(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(Ed(sf))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),hMA=(()=>{class t{constructor(){this.nodesChangeService=h(WN),this.edgesChangeService=h(ZN),this.onNodesChange=hn(this.nodesChangeService.changes$),this.onNodesChangePosition=hn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=hn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=hn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=hn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=hn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=hn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=hn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=hn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=hn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=hn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=hn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=hn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=hn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=hn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=hn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=hn(this.edgesChangeService.changes$),this.onNodesChangeDetached=hn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=hn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=hn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=hn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=hn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=hn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=hn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=hn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=hn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=hn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=hn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=hn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(A){return this.nodesChangeService.changes$.pipe(fe(i=>i.filter(n=>n.type===A)),We(i=>!!i.length))}edgeChangesOfType(A){return this.edgesChangeService.changes$.pipe(fe(i=>i.filter(n=>n.type===A)),We(i=>!!i.length))}singleChange(A){return A.pipe(We(i=>i.length===1),fe(([i])=>i))}manyChanges(A){return A.pipe(We(i=>i.length>1))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return t})(),$w=(()=>{class t{constructor(){this.host=h(ge).nativeElement,this.initialTouch$=new $A,this.prevTouchEvent=null,this.mouseMovement$=mc(this.host,"mousemove").pipe(fe(A=>({x:A.clientX,y:A.clientY,movementX:A.movementX,movementY:A.movementY,target:A.target,originalEvent:A})),Ed(Qd),SC()),this.touchMovement$=Qi(this.initialTouch$,mc(this.host,"touchmove")).pipe(Wt(A=>A.preventDefault()),fe(A=>{let i=A.touches[0]?.clientX??0,n=A.touches[0]?.clientY??0,o=this.prevTouchEvent?A.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,a=this.prevTouchEvent?A.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,r=document.elementFromPoint(i,n);return{x:i,y:n,movementX:o,movementY:a,target:r,originalEvent:A}}),Wt(A=>this.prevTouchEvent=A.originalEvent),Ed(Qd),SC()),this.pointerMovement$=Qi(this.mouseMovement$,this.touchMovement$),this.touchEnd$=mc(this.host,"touchend").pipe(fe(A=>{let i=A.changedTouches[0]?.clientX??0,n=A.changedTouches[0]?.clientY??0,o=document.elementFromPoint(i,n);return{x:i,y:n,target:o,originalEvent:A}}),Wt(()=>this.prevTouchEvent=null),SC()),this.mouseUp$=mc(this.host,"mouseup").pipe(fe(A=>{let i=A.clientX,n=A.clientY,o=A.target;return{x:i,y:n,target:o,originalEvent:A}}),SC()),this.documentPointerEnd$=Qi(mc(document,"mouseup"),mc(document,"touchend")).pipe(SC())}setInitialTouch(A){this.initialTouch$.next(A)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["svg","rootPointer",""]]})}}return t})(),Pu=(()=>{class t{constructor(){this.pointerMovementDirective=h($w),this.rootSvg=h(Xw).element,this.host=h(ge).nativeElement,this.svgCurrentSpacePoint=_e(()=>{let A=this.pointerMovement();return A?this.documentPointToFlowPoint({x:A.x,y:A.y}):{x:0,y:0}}),this.pointerMovement=Is(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(A){let i=this.rootSvg.createSVGPoint();return i.x=A.x,i.y=A.y,i.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["g","spacePointContext",""]]})}}return t})();function uMA(t){return typeof t=="string"?{type:"solid",color:t}:t}function Ww(t,e,A){let i=A.value;return A.value=function(...n){queueMicrotask(()=>{i?.apply(this,n)})},A}var jeA=(()=>{class t{constructor(){this.toolbars=jA([]),this.nodeToolbarsMap=_e(()=>{let A=new Map;return this.toolbars().forEach(i=>{let n=A.get(i.node)??[];A.set(i.node,[...n,i])}),A})}addToolbar(A){this.toolbars.update(i=>[...i,A])}removeToolbar(A){this.toolbars.update(i=>i.filter(n=>n!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return jE([Ww],t.prototype,"addToolbar",null),jE([Ww],t.prototype,"removeToolbar",null),t})();function Ay(t,e){return new Ti(A=>{let i=new ResizeObserver(n=>{e.run(()=>A.next(n))});return t.forEach(n=>i.observe(n)),()=>i.disconnect()})}var fMA=(()=>{class t{constructor(){this.zone=h(Oe),this.destroyRef=h(Wa),this.settingsService=h(rs),this.model=nt.required(),this.edgeModel=nt.required(),this.point=nt({x:0,y:0}),this.htmlTemplate=nt(),this.edgeLabelWrapperRef=Xo.required("edgeLabelWrapper"),this.edgeLabelPoint=_e(()=>{let A=this.point(),{width:i,height:n}=this.model().size();return{x:A.x-i/2,y:A.y-n/2}}),this.edgeLabelStyle=_e(()=>{let A=this.model().edgeLabel;if(A.type==="default"&&A.style){let i=this.settingsService.background(),n="transparent";return i.type==="dots"&&(n=i.backgroundColor??"#fff"),i.type==="solid"&&(n=i.color),A.style.backgroundColor=A.style.backgroundColor??n,A.style}return null})}ngAfterViewInit(){let A=this.edgeLabelWrapperRef().nativeElement;Ay([A],this.zone).pipe(nn(null),Wt(()=>{let i=A.clientWidth+jw,n=A.clientHeight+jw;this.model().size.set({width:i,height:n})}),br(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","edgeLabel",""]],viewQuery:function(i,n){i&1&&Or(n.edgeLabelWrapperRef,mbA,5),i&2&&rr()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:pbA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){if(i&1&&V(0,bbA,2,2),i&2){let o;W((o=n.model())?0:-1,o)}},dependencies:[Ng],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return t})();function qeA(t){let e={};return t.sourceHandle.rawHandle.type==="source"?(e.source=t.source,e.sourceHandle=t.sourceHandle):(e.source=t.target,e.sourceHandle=t.targetHandle),t.targetHandle.rawHandle.type==="target"?(e.target=t.target,e.targetHandle=t.targetHandle):(e.target=t.source,e.targetHandle=t.sourceHandle),e}var VeA=(()=>{class t{constructor(){this.statusService=h(hI),this.flowEntitiesService=h(ig),this.onConnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state==="connection-end"),fe(A=>Yw(A,this.isStrictMode())),Wt(()=>this.statusService.setIdleStatus()),We(A=>this.flowEntitiesService.connection().validator(A)))),this.connect=hn(Tn(this.statusService.status).pipe(We(A=>A.state==="connection-end"),fe(A=>Yw(A,this.isStrictMode())),Wt(()=>this.statusService.setIdleStatus()),We(A=>this.flowEntitiesService.connection().validator(A)))),this.onReconnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state==="reconnection-end"),fe(A=>{let i=Yw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),Wt(()=>this.statusService.setIdleStatus()),We(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.reconnect=hn(Tn(this.statusService.status).pipe(We(A=>A.state==="reconnection-end"),fe(A=>{let i=Yw(A,this.isStrictMode()),n=A.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),Wt(()=>this.statusService.setIdleStatus()),We(({connection:A})=>this.flowEntitiesService.connection().validator(A)))),this.isStrictMode=_e(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(A){this.statusService.setConnectionStartStatus(A.parentNode,A)}startReconnection(A,i){this.statusService.setReconnectionStartStatus(A.parentNode,A,i)}validateConnection(A){let i=this.statusService.status();if(i.state==="connection-start"||i.state==="reconnection-start"){let n=i.state==="reconnection-start",o=i.payload.source,a=A.parentNode,r=i.payload.sourceHandle,s=A;if(this.isStrictMode()){let l=qeA({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:A.parentNode,targetHandle:A});o=l.source,a=l.target,r=l.sourceHandle,s=l.targetHandle}let g=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:a.rawNode.id,sourceHandle:r.rawHandle.id,targetHandle:s.rawHandle.id});A.state.set(g?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(g,i.payload.source,A.parentNode,i.payload.sourceHandle,A,i.payload.oldEdge):this.statusService.setConnectionValidationStatus(g,i.payload.source,A.parentNode,i.payload.sourceHandle,A)}}resetValidateConnection(A){A.state.set("idle");let i=this.statusService.status();(i.state==="connection-validation"||i.state==="reconnection-validation")&&(i.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(i.payload.source,i.payload.sourceHandle,i.payload.oldEdge):this.statusService.setConnectionStartStatus(i.payload.source,i.payload.sourceHandle))}endConnection(){let A=this.statusService.status();if(A.state==="connection-validation"||A.state==="reconnection-validation"){let i=A.state==="reconnection-validation",n=A.payload.source,o=A.payload.sourceHandle,a=A.payload.target,r=A.payload.targetHandle;i?this.statusService.setReconnectionEndStatus(n,a,o,r,A.payload.oldEdge):this.statusService.setConnectionEndStatus(n,a,o,r)}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","onConnect",""],["","onReconnect",""],["","connect",""],["","reconnect",""]],outputs:{onConnect:"onConnect",connect:"connect",onReconnect:"onReconnect",reconnect:"reconnect"}})}}return t})();function Yw(t,e){let A=t.payload.source,i=t.payload.target,n=t.payload.sourceHandle,o=t.payload.targetHandle;if(e){let l=qeA({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:t.payload.target,targetHandle:t.payload.targetHandle});A=l.source,i=l.target,n=l.sourceHandle,o=l.targetHandle}let a=A.rawNode.id,r=i.rawNode.id,s=n.rawHandle.id,g=o.rawHandle.id;return{source:a,target:r,sourceHandle:s,targetHandle:g}}var Zw=(()=>{class t{constructor(){this.flowEntitiesService=h(ig),this.flowSettingsService=h(rs),this.edges=_e(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((A,i)=>A.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((A,i)=>A.renderOrder()-i.renderOrder())),this.viewportEdges=_e(()=>this.flowEntitiesService.validEdges().filter(A=>{let i=A.sourceHandle(),n=A.targetHandle();return i&&n})),this.maxOrder=_e(()=>Math.max(...this.flowEntitiesService.validEdges().map(A=>A.renderOrder())))}pull(A){A.renderOrder()!==0&&this.maxOrder()===A.renderOrder()||A.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function mMA(t){return window.TouchEvent&&t instanceof TouchEvent}var eF=(()=>{class t{constructor(){this.hostElement=h(ge).nativeElement,this.pointerMovementDirective=h($w),this.pointerOver=No(),this.pointerOut=No(),this.pointerStart=No(),this.pointerEnd=No(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe(We(({target:A})=>A===this.hostElement),Wt(({originalEvent:A})=>this.pointerEnd.emit(A)),br()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(Wt(({target:A,originalEvent:i})=>{this.handleTouchOverAndOut(A,i)}),br()).subscribe()}onPointerStart(A){this.pointerStart.emit(A),mMA(A)&&this.pointerMovementDirective.setInitialTouch(A)}onPointerEnd(A){this.pointerEnd.emit(A)}onMouseOver(A){this.pointerOver.emit(A)}onMouseOut(A){this.pointerOut.emit(A)}handleTouchOverAndOut(A,i){A===this.hostElement?(this.pointerOver.emit(i),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(i),this.wasPointerOver=!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(i,n){i&1&&$("mousedown",function(a){return n.onPointerStart(a)})("touchstart",function(a){return n.onPointerStart(a)})("mouseup",function(a){return n.onPointerEnd(a)})("mouseover",function(a){return n.onMouseOver(a)})("mouseout",function(a){return n.onMouseOut(a)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return t})(),WeA=(()=>{class t{constructor(){this.injector=h(ut),this.selectionService=h(Vu),this.flowSettingsService=h(rs),this.flowStatusService=h(hI),this.edgeRenderingService=h(Zw),this.connectionController=h(VeA,{optional:!0}),this.model=nt.required(),this.edgeTemplate=nt(),this.edgeLabelHtmlTemplate=nt(),this.isReconnecting=_e(()=>{let A=this.flowStatusService.status();return(A.state==="reconnection-start"||A.state==="reconnection-validation")&&A.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(A,i){A.stopPropagation(),this.connectionController?.startReconnection(i,this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(i,n){i&2&&En("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:MbA,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(i,n){if(i&1&&(V(0,kbA,2,6),V(1,xbA,1,1),V(2,NbA,1,1),V(3,LbA,1,1),V(4,GbA,1,1),V(5,JbA,2,2)),i&2){let o,a,r;W(n.model().type==="default"?0:-1),p(),W(n.model().type==="template"&&n.edgeTemplate()?1:-1),p(),W((o=n.model().edgeLabels.start)?2:-1,o),p(),W((a=n.model().edgeLabels.center)?3:-1,a),p(),W((r=n.model().edgeLabels.end)?4:-1,r),p(),W(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[Ng,fMA,eF],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return t})(),XN=(()=>{class t{constructor(){this.node=jA(null)}createHandle(A){let i=this.node();i&&i.handles.update(n=>[...n,A])}destroyHandle(A){let i=this.node();i&&i.handles.update(n=>n.filter(o=>o!==A))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return jE([Ww],t.prototype,"createHandle",null),t})(),pMA=(()=>{class t{constructor(){this.handleModel=nt.required({alias:"handleSizeController"}),this.handleWrapper=h(ge)}ngAfterViewInit(){let A=this.handleWrapper.nativeElement,i=A.getBBox(),n=DMA(A);this.handleModel().size.set({width:i.width+n,height:i.height+n})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return t})();function DMA(t){let e=t.firstElementChild;if(e){let A=getComputedStyle(e).strokeWidth,i=Number(A.replace("px",""));return isNaN(i)?0:i}return 0}var wMA=(()=>{class t{constructor(){this.selected=nt(!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["default-node"]],hostVars:2,hostBindings:function(i,n){i&2&&ae("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:YeA,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),He(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return t})(),yMA=(()=>{class t{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=h(xE),this.rootPointer=h($w),this.viewportService=h(cd),this.spacePointContext=h(Pu),this.settingsService=h(rs),this.hostRef=h(ge),this.resizable=nt(),this.resizerColor=nt("#2e414c"),this.gap=nt(1.5),this.resizer=Xo.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=_e(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe(We(()=>this.resizeSide!==null),We(A=>A.movementX!==0||A.movementY!==0),Wt(A=>this.resize(A)),br()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(Wt(()=>this.endResize()),br()).subscribe(),pa(()=>{let A=this.resizable();typeof A=="boolean"?this.model.resizable.set(A):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(A,i){i.stopPropagation(),this.resizeSide=A,this.model.resizing.set(!0)}resize(A){if(!this.resizeSide)return;let i=vMA(A.movementX,A.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,i,this.getDistanceToEdge(A)),{x:o,y:a,width:r,height:s}=bMA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:a}),this.model.width.set(r),this.model.height.set(s)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(A){let i=this.spacePointContext.documentPointToFlowPoint({x:A.x,y:A.y}),{x:n,y:o}=this.model.globalPoint();return{left:i.x-n,right:i.x-(n+this.model.width()),top:i.y-o,bottom:i.y-(o+this.model.height())}}applyResize(A,i,n,o){let{x:a,y:r}=i.point(),s=i.width(),g=i.height(),[l,C]=this.settingsService.snapGrid();switch(A){case"left":{let I=n.x+o.left,d=tg(a+I,l),B=d-a;return{x:d,y:r,width:s-B,height:g}}case"right":{let I=n.x+o.right,d=tg(s+I,l);return{x:a,y:r,width:d,height:g}}case"top":{let I=n.y+o.top,d=tg(r+I,C),B=d-r;return{x:a,y:d,width:s,height:g-B}}case"bottom":{let I=n.y+o.bottom,d=tg(g+I,C);return{x:a,y:r,width:s,height:d}}case"top-left":{let I=n.x+o.left,d=n.y+o.top,B=tg(a+I,l),Q=tg(r+d,C),E=B-a,f=Q-r;return{x:B,y:Q,width:s-E,height:g-f}}case"top-right":{let I=n.x+o.right,d=n.y+o.top,B=tg(r+d,C),Q=B-r;return{x:a,y:B,width:tg(s+I,l),height:g-Q}}case"bottom-left":{let I=n.x+o.left,d=n.y+o.bottom,B=tg(a+I,l),Q=B-a;return{x:B,y:r,width:s-Q,height:tg(g+d,C)}}case"bottom-right":{let I=n.x+o.right,d=n.y+o.bottom;return{x:a,y:r,width:tg(s+I,l),height:tg(g+d,C)}}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["","resizable",""]],viewQuery:function(i,n){i&1&&Or(n.resizer,YbA,5),i&2&&rr()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:HbA,ngContentSelectors:YeA,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(i,n){i&1&&(Yt(),yt(0,TbA,9,40,"ng-template",null,0,NC),He(2))},dependencies:[eF],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return jE([Ww],t.prototype,"ngAfterViewInit",null),t})();function vMA(t,e,A){return{x:Ow(t/A),y:Ow(e/A)}}function bMA(t,e,A,i,n,o,a){let{x:r,y:s,width:g,height:l}=t;g=Math.max(g,0),l=Math.max(l,0),g=Math.max(i,g),l=Math.max(n,l),g=Math.min(o,g),l=Math.min(a,l),r=Math.min(r,e.point().x+e.width()-i),s=Math.min(s,e.point().y+e.height()-n),r=Math.max(r,e.point().x+e.width()-o),s=Math.max(s,e.point().y+e.height()-a);let C=e.parent();if(C){let d=C.width(),B=C.height(),Q=e.point().x,E=e.point().y;r=Math.max(r,0),s=Math.max(s,0),A.includes("left")&&r===0&&(g=Math.min(g,Q+e.width())),A.includes("top")&&s===0&&(l=Math.min(l,E+e.height())),g=Math.min(g,d-r),l=Math.min(l,B-s)}let I=HeA(e.children());return I&&(A.includes("left")&&(r=Math.min(r,e.point().x+e.width()-(I.x+I.width)),g=Math.max(g,I.x+I.width)),A.includes("right")&&(g=Math.max(g,I.x+I.width)),A.includes("bottom")&&(l=Math.max(l,I.y+I.height)),A.includes("top")&&(s=Math.min(s,e.point().y+e.height()-(I.y+I.height)),l=Math.max(l,I.y+I.height))),{x:r,y:s,width:g,height:l}}var $N=class{constructor(e,A){this.rawHandle=e,this.parentNode=A,this.strokeWidth=2,this.size=jA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=_e(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=jA("idle"),this.updateHostSizeAndPosition$=new $A,this.hostSize=Is(this.updateHostSizeAndPosition$.pipe(fe(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=Is(this.updateHostSizeAndPosition$.pipe(fe(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=_e(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=_e(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},tF=(()=>{class t{constructor(){this.injector=h(ut),this.handleService=h(XN),this.element=h(ge).nativeElement,this.destroyRef=h(Wa),this.position=nt.required(),this.type=nt.required(),this.id=nt(),this.template=nt(),this.offsetX=nt(0),this.offsetY=nt(0)}ngOnInit(){Ya(this.injector,()=>{let A=this.handleService.node();if(A){let i=new $N({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},A);this.handleService.createHandle(i),requestAnimationFrame(()=>i.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(i))}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),MMA=(()=>{class t{constructor(){this.nodeAccessor=h(xE),this.zone=h(Oe),this.destroyRef=h(Wa),this.hostElementRef=h(ge)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(Ei(i=>Ay([...i.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(fe(()=>i))),Wt(i=>{i.forEach(n=>n.updateHost())}),br(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","nodeHandlesController",""]]})}}return t})(),kMA=(()=>{class t{constructor(){this.nodeAccessor=h(xE),this.zone=h(Oe),this.destroyRef=h(Wa),this.hostElementRef=h(ge)}ngOnInit(){let A=this.nodeAccessor.model(),i=this.hostElementRef.nativeElement;Qi(Ay([i],this.zone)).pipe(nn(null),We(()=>!A.resizing()),Wt(()=>{A.width.set(i.clientWidth),A.height.set(i.clientHeight)}),br(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","nodeResizeController",""]]})}}return t})(),ZeA=(()=>{class t{constructor(){this.injector=h(ut),this.handleService=h(XN),this.draggableService=h(TeA),this.flowStatusService=h(hI),this.nodeRenderingService=h(Cd),this.flowSettingsService=h(rs),this.selectionService=h(Vu),this.hostRef=h(ge),this.nodeAccessor=h(xE),this.overlaysService=h(jeA),this.connectionController=h(VeA,{optional:!0}),this.model=nt.required(),this.nodeTemplate=nt(),this.nodeSvgTemplate=nt(),this.groupNodeTemplate=nt(),this.showMagnet=_e(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=_e(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),pa(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(A,i){A.stopPropagation(),this.connectionController?.startConnection(i)}validateConnection(A){this.connectionController?.validateConnection(A)}resetValidateConnection(A){this.connectionController?.resetValidateConnection(A)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[It([XN,xE])],attrs:ObA,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(i,n){if(i&1&&(V(0,zbA,5,12,":svg:foreignObject",0),V(1,PbA,3,9,":svg:foreignObject",0),V(2,jbA,2,3,":svg:g",1),V(3,VbA,2,3),V(4,WbA,1,11,":svg:rect",2),V(5,ZbA,2,3,":svg:g",1),V(6,A9A,1,1),Gt(7,a9A,4,4,null,null,Ri),Gt(9,r9A,2,4,":svg:foreignObject",null,Ri)),i&2){let o;W(n.model().rawNode.type==="default"?0:-1),p(),W(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),p(),W(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),p(),W(n.model().isComponentType?3:-1),p(),W(n.model().rawNode.type==="default-group"?4:-1),p(),W(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),p(),W((o=n.model().resizerTemplate())?6:-1,o),p(),Kt(n.model().handles()),p(2),Kt(n.toolbars())}},dependencies:[eF,wMA,tF,Ng,FC,yMA,pMA,MMA,kMA,Pr],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return t})(),SMA=(()=>{class t{constructor(){this.flowStatusService=h(hI),this.spacePointContext=h(Pu),this.flowEntitiesService=h(ig),this.model=nt.required(),this.template=nt(),this.path=_e(()=>{let A=this.flowStatusService.status(),i=this.model().curve;if(A.state==="connection-start"||A.state==="reconnection-start"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=this.spacePointContext.svgCurrentSpacePoint(),s=_eA(n.rawHandle.position),g=this.getPathFactoryParams(o,r,a,s);switch(i){case"straight":return jN(g).path;case"bezier":return qN(g).path;case"smooth-step":return kE(g).path;case"step":return kE(g,0).path;default:return i(g).path}}if(A.state==="connection-validation"||A.state==="reconnection-validation"){let n=A.payload.sourceHandle,o=n.pointAbsolute(),a=n.rawHandle.position,r=A.payload.targetHandle,s=A.payload.valid?r.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),g=A.payload.valid?r.rawHandle.position:_eA(n.rawHandle.position),l=this.getPathFactoryParams(o,s,a,g);switch(i){case"straight":return jN(l).path;case"bezier":return qN(l).path;case"smooth-step":return kE(l).path;case"step":return kE(l,0).path;default:return i(l).path}}return null}),this.markerUrl=_e(()=>{let A=this.model().settings.marker;return A?`url(#${SE(JSON.stringify(A))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(A,i,n,o){return{mode:"connection",sourcePoint:A,targetPoint:i,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:s9A,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){i&1&&(V(0,l9A,1,1),V(1,I9A,1,1)),i&2&&(W(n.model().type==="default"?0:-1),p(),W(n.model().type==="template"?1:-1))},dependencies:[Ng],encapsulation:2,changeDetection:0})}}return t})();function _eA(t){switch(t){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function xMA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var RMA="#fff",NMA=20,FMA=2,GeA="rgb(177, 177, 183)",KeA=.1,LMA=!0,_MA=(()=>{class t{constructor(){this.viewportService=h(cd),this.rootSvg=h(Xw).element,this.settingsService=h(rs),this.backgroundSignal=this.settingsService.background,this.scaledGap=_e(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.gap??NMA):0}),this.x=_e(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=_e(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=_e(()=>{let A=this.backgroundSignal();return A.type==="dots"?A.color??GeA:GeA}),this.patternSize=_e(()=>{let A=this.backgroundSignal();return A.type==="dots"?this.viewportService.readableViewport().zoom*(A.size??FMA)/2:0}),this.bgImageSrc=_e(()=>{let A=this.backgroundSignal();return A.type==="image"?A.src:""}),this.imageSize=qu(Tn(this.backgroundSignal).pipe(Ei(()=>GMA(this.bgImageSrc())),fe(A=>({width:A.naturalWidth,height:A.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=_e(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*i*(A.scale??KeA)}return 0}),this.scaledImageHeight=_e(()=>{let A=this.backgroundSignal();if(A.type==="image"){let i=A.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*i*(A.scale??KeA)}return 0}),this.imageX=_e(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():A.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=_e(()=>{let A=this.backgroundSignal();return A.type==="image"?A.repeat?A.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():A.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=_e(()=>{let A=this.backgroundSignal();return A.type==="image"&&(A.repeat??LMA)}),this.patternId=xMA(),this.patternUrl=`url(#${this.patternId})`,pa(()=>{let A=this.backgroundSignal();A.type==="dots"&&(this.rootSvg.style.backgroundColor=A.backgroundColor??RMA),A.type==="solid"&&(this.rootSvg.style.backgroundColor=A.color)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","background",""]],attrs:d9A,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(i,n){i&1&&(V(0,B9A,3,10),V(1,h9A,2,2)),i&2&&(W(n.backgroundSignal().type==="dots"?0:-1),p(),W(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return t})();function GMA(t){let e=new Image;return e.src=t,new Promise(A=>{e.onload=()=>A(e)})}var KMA=(()=>{class t{constructor(){this.markers=nt.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:u9A,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(i,n){i&1&&(Gt(0,p9A,3,7,":svg:marker",0,Ri),oi(2,"keyvalue")),i&2&&Kt(li(2,0,n.markers()))},dependencies:[bf],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return t})(),UMA=(()=>{class t{constructor(){this.host=h(ge),this.flowSettingsService=h(rs),this.flowWidth=_e(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[0]}),this.flowHeight=_e(()=>{let A=this.flowSettingsService.view();return A==="auto"?"100%":A[1]}),Ay([this.host.nativeElement],h(Oe)).pipe(Wt(([A])=>{this.flowSettingsService.computedFlowWidth.set(A.contentRect.width),this.flowSettingsService.computedFlowHeight.set(A.contentRect.height)}),br()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(i,n){i&2&&ie("width",n.flowWidth())("height",n.flowHeight())}})}}return t})(),JMA=(()=>{class t{constructor(){this.flowStatusService=h(hI)}resetConnection(){let A=this.flowStatusService.status();(A.state==="connection-start"||A.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["svg","rootSvgContext",""]],hostBindings:function(i,n){i&1&&$("mouseup",function(){return n.resetConnection()},m0)("touchend",function(){return n.resetConnection()},m0)("contextmenu",function(){return n.resetConnection()})}})}}return t})();function AF(t,e){let A=[];for(let i of e){let{x:n,y:o}=i.globalPoint();t.x>=n&&t.x<=n+i.width()&&t.y>=o&&t.y<=o+i.height()&&A.push({x:t.x-n,y:t.y-o,spaceNodeId:i.rawNode.id})}return A.reverse(),A.push({spaceNodeId:null,x:t.x,y:t.y}),A}var iF=(()=>{class t{static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})(),YMA=(()=>{class t extends iF{shouldRenderNode(A){return!A.isVisible()}static{this.\u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})()}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function HMA(t,e){if(Object.keys(e.preview().style).length){zMA(t,e);return}if(e.rawNode.type==="default"){TMA(t,e);return}if(e.rawNode.type==="default-group"){OMA(t,e);return}PMA(t,e)}function TMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();XeA(t,e,5),t.fillStyle="white",t.fill(),t.strokeStyle="#1b262c",t.lineWidth=1.5,t.stroke(),t.fillStyle="black",t.font="14px Arial",t.textAlign="center",t.textBaseline="middle";let o=A.x+i/2,a=A.y+n/2;t.fillText(e.text(),o,a)}function OMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.globalAlpha=.05,t.fillStyle=e.color(),t.fillRect(A.x,A.y,i,n),t.globalAlpha=1,t.strokeStyle=e.color(),t.lineWidth=1.5,t.strokeRect(A.x,A.y,i,n)}function zMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height(),o=e.preview().style;if(o.borderRadius){let a=parseFloat(o.borderRadius);XeA(t,e,a)}else t.beginPath(),t.rect(A.x,A.y,i,n),t.closePath();o.backgroundColor&&(t.fillStyle=o.backgroundColor),o.borderColor&&(t.strokeStyle=o.borderColor),o.borderWidth&&(t.lineWidth=parseFloat(o.borderWidth)),t.fill(),t.stroke()}function PMA(t,e){let A=e.globalPoint(),i=e.width(),n=e.height();t.fillStyle="rgb(0 0 0 / 10%)",t.fillRect(A.x,A.y,i,n)}function XeA(t,e,A){let i=e.globalPoint(),n=e.width(),o=e.height();t.beginPath(),t.moveTo(i.x+A,i.y),t.lineTo(i.x+n-A,i.y),t.quadraticCurveTo(i.x+n,i.y,i.x+n,i.y+A),t.lineTo(i.x+n,i.y+o-A),t.quadraticCurveTo(i.x+n,i.y+o,i.x+n-A,i.y+o),t.lineTo(i.x+A,i.y+o),t.quadraticCurveTo(i.x,i.y+o,i.x,i.y+o-A),t.lineTo(i.x,i.y+A),t.quadraticCurveTo(i.x,i.y,i.x+A,i.y),t.closePath()}var jMA=(()=>{class t{constructor(){this.viewportService=h(cd),this.renderStrategy=h(iF),this.nodeRenderingService=h(Cd),this.renderer2=h(ui),this.element=h(ge).nativeElement,this.ctx=this.element.getContext("2d"),this.width=nt(0),this.height=nt(0),this.dpr=window.devicePixelRatio,pa(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),pa(()=>{let A=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(A.zoom*this.dpr,0,0,A.zoom*this.dpr,A.x*this.dpr,A.y*this.dpr);for(let i=0;i{class t{constructor(){this.nodeRenderingService=h(Cd),this.edgeRenderingService=h(Zw),this.flowEntitiesService=h(ig),this.settingsService=h(rs),this.flowInitialized=jA(!1),h(Oe).runOutsideAngular(()=>ct(this,null,function*(){yield qMA(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=TA({token:t,factory:t.\u0275fac})}}return t})();function qMA(t){return new Promise(e=>{let A=0;function i(){A++,A{class t{constructor(){this.nodeRenderingService=h(Cd),this.flowStatus=h(hI),this.tolerance=nt(10),this.lineColor=nt("#1b262c"),this.isNodeDragging=_e(()=>beA(this.flowStatus.status())),this.intersections=qw(A=>{let i=this.flowStatus.status();if(beA(i)){let n=i.payload.node,o=JeA(Hw(n)),a=this.nodeRenderingService.viewportNodes().filter(I=>I!==n).filter(I=>!n.children().includes(I)).map(I=>JeA(Hw(I))),r=[],s=o.x,g=o.y,l=1/0,C=1/0;return a.forEach(I=>{let d=o.left+o.width/2,B=I.left+I.width/2;for(let[f,b,R,M]of[[d,B,B-o.width/2,!0],[o.left,I.left,I.left,!1],[o.left,I.right,I.right,!1],[o.right,I.left,I.left-o.width,!1],[o.right,I.right,I.right-o.width,!1]]){let v=Math.abs(f-b);if(v<=this.tolerance()){let F=Math.min(o.top,I.top),G=Math.max(o.bottom,I.bottom);if(r.push({x:b,y:F,x2:b,y2:G,isCenter:M}),vA.payload.node),fe(A=>[A,this.intersections()]),Wt(([A,i])=>{if(i){let n={x:i.snappedX,y:i.snappedY},o=A.parent()?[A.parent()]:[];A.setPoint(AF(n,o)[0])}}),br()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:w9A,decls:1,vars:1,template:function(i,n){i&1&&V(0,b9A,1,1),i&2&&W(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return t})();var $eA=(()=>{class t{constructor(){this.viewportService=h(cd),this.flowEntitiesService=h(ig),this.nodesChangeService=h(WN),this.edgesChangeService=h(ZN),this.nodeRenderingService=h(Cd),this.edgeRenderingService=h(Zw),this.flowSettingsService=h(rs),this.componentEventBusService=h(PN),this.keyboardService=h(zN),this.injector=h(ut),this.flowRenderingService=h(UeA),this.alignmentHelper=nt(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=hn(this.componentEventBusService.event$),this.nodeTemplateDirective=w0(zw),this.nodeSvgTemplateDirective=w0(xeA),this.groupNodeTemplateDirective=w0(Pw),this.edgeTemplateDirective=w0(MeA),this.edgeLabelHtmlDirective=w0(SeA),this.connectionTemplateDirective=w0(keA),this.mapContext=Xo(HN),this.spacePointContext=Xo.required(Pu),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=qu(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=qu(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=Tn(this.viewportService.readableViewport).pipe(rg(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=Tn(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(A){this.flowSettingsService.view.set(A)}set minZoom(A){this.flowSettingsService.minZoom.set(A)}set maxZoom(A){this.flowSettingsService.maxZoom.set(A)}set background(A){this.flowSettingsService.background.set(uMA(A))}set optimization(A){this.flowSettingsService.optimization.update(i=>BA(BA({},i),A))}set entitiesSelectable(A){this.flowSettingsService.entitiesSelectable.set(A)}set keyboardShortcuts(A){this.keyboardService.setShortcuts(A)}set connection(A){this.flowEntitiesService.connection.set(A)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(A){this.flowSettingsService.snapGrid.set(A)}set elevateNodesOnSelect(A){this.flowSettingsService.elevateNodesOnSelect.set(A)}set elevateEdgesOnSelect(A){this.flowSettingsService.elevateEdgesOnSelect.set(A)}set nodes(A){let i=Ya(this.injector,()=>Vw.nodes(A,this.flowEntitiesService.nodes()));ReA(i,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(i),i.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(A){let i=Ya(this.injector,()=>Vw.edges(A,this.flowEntitiesService.edges()));ReA(this.flowEntitiesService.nodes(),i),this.flowEntitiesService.edges.set(i)}viewportTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}zoomTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:A},duration:0})}panTo(A){this.viewportService.writableViewport.set({changeType:"absolute",state:A,duration:0})}fitView(A){this.viewportService.fitView(A)}getNode(A){return this.flowEntitiesService.getNode(A)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(A=>A.edge)}documentPointToFlowPoint(A,i){let n=this.spacePointContext().documentPointToFlowPoint(A);return i?.spaces?AF(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(A,i={partially:!0}){return Y9A(A,this.nodeModels(),i).map(n=>n.rawNode)}toNodeSpace(A,i){let n=this.nodeModels().find(a=>a.rawNode.id===A);if(!n)return{x:1/0,y:1/0};if(i===null)return n.globalPoint();let o=this.nodeModels().find(a=>a.rawNode.id===i);return o?AF(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(A,{rawNode:i}){return i}trackEdges(A,{edge:i}){return i}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=kA({type:t,selectors:[["vflow"]],contentQueries:function(i,n,o){i&1&&wf(o,n.nodeTemplateDirective,zw,5)(o,n.nodeSvgTemplateDirective,xeA,5)(o,n.groupNodeTemplateDirective,Pw,5)(o,n.edgeTemplateDirective,MeA,5)(o,n.edgeLabelHtmlDirective,SeA,5)(o,n.connectionTemplateDirective,keA,5),i&2&&rr(6)},viewQuery:function(i,n){i&1&&Or(n.mapContext,HN,5)(n.spacePointContext,Pu,5),i&2&&rr(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",A=>new Tw(A)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[It([TeA,cd,hI,ig,WN,ZN,Cd,Zw,Vu,rs,PN,zN,jeA,{provide:iF,useClass:YMA},UeA]),ff([{directive:hMA,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(i,n){if(i&1&&(Qt(),m(0,"svg",1,0),GA(2,"defs",2)(3,"g",3),m(4,"g",4),V(5,S9A,2,1),GA(6,"g",5),V(7,F9A,6,0),V(8,G9A,4,0),D(),V(9,K9A,1,1,":svg:ng-container",6),D(),V(10,U9A,1,2,"canvas",7)),i&2){let o,a,r;p(2),X("markers",n.markers()),p(3),W((o=n.alignmentHelper())?5:-1,o),p(),X("model",n.connection)("template",(a=n.connectionTemplateDirective())==null?null:a.templateRef),p(),W(n.flowOptimization().detachedGroupsLayer?7:-1),p(),W(n.flowOptimization().detachedGroupsLayer?-1:8),p(),W((r=n.minimap())?9:-1,r),p(),W(n.flowOptimization().virtualization?10:-1)}},dependencies:[Xw,JMA,$w,UMA,KMA,_MA,HN,Pu,SMA,ZeA,WeA,Ng,jMA,VMA],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return t})();var AtA=(()=>{class t{constructor(){this.flowSettingsService=h(rs),this.selectionService=h(Vu),this.parentEdge=h(WeA,{optional:!0}),this.parentNode=h(ZeA,{optional:!0}),this.host=h(ge),this.selectOnEvent=this.getEvent$().pipe(Wt(()=>this.select()),br()).subscribe()}select(){let A=this.entity();A&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(A)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return mc(this.host.nativeElement,"click")}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=OA({type:t,selectors:[["","selectable",""]]})}}return t})();var ZMA=["canvas"],XMA=["svgCanvas"],$MA=()=>({type:"dots",color:"#424242",size:1,gap:12}),AkA=()=>[12,12],ekA=(t,e)=>e.name;function tkA(t,e){if(t&1){let A=zA();m(0,"div",6)(1,"div",11)(2,"button",12),$("click",function(){rA(A);let n=y();return sA(n.backToMainCanvas())}),m(3,"mat-icon"),K(4,"arrow_back"),D()(),m(5,"div",13)(6,"span",14),K(7,"smart_toy"),D(),m(8,"div",15)(9,"h3",16),K(10),D(),m(11,"p",17),K(12,"Agent Tool"),D()()()()()}if(t&2){let A=y();p(2),X("matTooltip",A.getBackButtonTooltip()),p(8),qA(A.currentAgentTool())}}function ikA(t,e){if(t&1){let A=zA();m(0,"span",18),$("click",function(){rA(A);let n=y();return sA(n.toggleSidePanelRequest.emit())}),K(1,"left_panel_open"),D()}}function nkA(t,e){if(t&1){let A=zA();Qt(),m(0,"foreignObject"),Tr(),m(1,"div",27),$("click",function(n){return n.stopPropagation()}),m(2,"button",28,0),$("click",function(n){return n.stopPropagation()}),m(4,"mat-icon"),K(5,"add"),D()(),m(6,"span",29),K(7,"Add sub-agent"),D(),m(8,"mat-menu",null,1)(10,"button",30),$("click",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("LlmAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(11,"mat-icon"),K(12,"psychology"),D(),m(13,"span"),K(14,"LLM Agent"),D()(),m(15,"button",30),$("click",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("SequentialAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(16,"mat-icon"),K(17,"more_horiz"),D(),m(18,"span"),K(19,"Sequential Agent"),D()(),m(20,"button",30),$("click",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("LoopAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(21,"mat-icon"),K(22,"sync"),D(),m(23,"span"),K(24,"Loop Agent"),D()(),m(25,"button",30),$("click",function(n){let o;rA(A);let a=Wi(3),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("ParallelAgent",r.node.data==null||(o=r.node.data())==null?null:o.name,a,n,!0))}),m(26,"mat-icon"),K(27,"density_medium"),D(),m(28,"span"),K(29,"Parallel Agent"),D()()()()()}if(t&2){let A=Wi(9),i=y().$implicit;ie("width",200)("height",100)("x",i.width()/2-100)("y",i.height()/2-40),p(2),X("matMenuTriggerFor",A)}}function okA(t,e){t&1&&(Qt(),GA(0,"handle",26))}function akA(t,e){if(t&1){let A=zA();Qt(),m(0,"g")(1,"rect",21),$("click",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onGroupClick(o.node,n))})("pointerdown",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onGroupPointerDown(o.node,n))}),D(),m(2,"foreignObject",22),Tr(),m(3,"div",23)(4,"mat-icon",24),K(5),D(),m(6,"span",25),K(7),D()()(),V(8,nkA,30,5,":svg:foreignObject"),V(9,okA,1,0,":svg:handle",26),D()}if(t&2){let A,i,n=e.$implicit,o=y(2);p(),En("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),ie("width",n.width())("height",n.height()),p(),ie("width",200)("height",32),p(3),qA(o.getAgentIcon(n.node.data==null||(A=n.node.data())==null?null:A.agent_class)),p(2),qA(n.node.data==null||(i=n.node.data())==null?null:i.agent_class),p(),W(o.isGroupEmpty(n.node.id)?8:-1),p(),W(o.shouldShowTopHandle(n.node)?9:-1)}}function rkA(t,e){t&1&&(m(0,"span",35),K(1,"Root"),D())}function skA(t,e){if(t&1){let A=zA();m(0,"button",43),$("click",function(n){rA(A),y();let o=vs(0);return y(2).openDeleteSubAgentDialog(o),sA(n.stopPropagation())}),m(1,"mat-icon"),K(2,"delete"),D()()}}function gkA(t,e){if(t&1){let A=zA();m(0,"div",46),$("click",function(n){let o=rA(A).$implicit,a=y(2).$implicit;return y(2).selectTool(o,a.node),sA(n.stopPropagation())}),m(1,"mat-icon",47),K(2),D(),m(3,"span",48),K(4),D()()}if(t&2){let A=e.$implicit,i=y(4);p(2),qA(i.getToolIcon(A)),p(2),qA(A.name)}}function lkA(t,e){if(t&1&&(m(0,"div",38)(1,"div",44),Gt(2,gkA,5,2,"div",45,ekA),D()()),t&2){y();let A=vs(3);p(2),Kt(A)}}function ckA(t,e){if(t&1){let A=zA();m(0,"div",39)(1,"button",49,2),$("click",function(n){return n.stopPropagation()}),m(3,"span",50),K(4,"+"),D()(),m(5,"mat-menu",null,3)(7,"button",30),$("click",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("LlmAgent",(o=r.node.data())==null?null:o.name,a,n))}),m(8,"mat-icon"),K(9,"psychology"),D(),m(10,"span"),K(11,"LLM Agent"),D()(),m(12,"button",30),$("click",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("SequentialAgent",(o=r.node.data())==null?null:o.name,a,n))}),m(13,"mat-icon"),K(14,"more_horiz"),D(),m(15,"span"),K(16,"Sequential Agent"),D()(),m(17,"button",30),$("click",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("LoopAgent",(o=r.node.data())==null?null:o.name,a,n))}),m(18,"mat-icon"),K(19,"sync"),D(),m(20,"span"),K(21,"Loop Agent"),D()(),m(22,"button",30),$("click",function(n){let o;rA(A);let a=Wi(2),r=y().$implicit,s=y(2);return sA(s.handleAgentTypeSelection("ParallelAgent",(o=r.node.data())==null?null:o.name,a,n))}),m(23,"mat-icon"),K(24,"density_medium"),D(),m(25,"span"),K(26,"Parallel Agent"),D()()()()}if(t&2){let A=Wi(6);p(),X("matMenuTriggerFor",A)}}function CkA(t,e){t&1&&GA(0,"handle",40)}function IkA(t,e){t&1&&GA(0,"handle",26)}function dkA(t,e){t&1&&GA(0,"handle",41)}function BkA(t,e){t&1&&GA(0,"handle",42)}function QkA(t,e){if(t&1){let A=zA();wr(0)(1),oi(2,"async"),wr(3),m(4,"div",31),$("click",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=rA(A).$implicit,a=y(2);return sA(a.onNodePointerDown(o.node,n))}),m(5,"div",32)(6,"div",33)(7,"mat-icon",34),K(8),D(),K(9),V(10,rkA,2,0,"span",35),D(),m(11,"div",36),V(12,skA,3,0,"button",37),D()(),V(13,lkA,4,0,"div",38),V(14,ckA,27,1,"div",39),V(15,CkA,1,0,"handle",40),V(16,IkA,1,0,"handle",26),V(17,dkA,1,0,"handle",41),V(18,BkA,1,0,"handle",42),D()}if(t&2){let A=e.$implicit,i=y(2),n=A.node.data==null?null:A.node.data(),o=sg((n==null?null:n.name)||"root_agent"),a=li(2,17,i.toolsMap$);p(3);let s=sg(i.getToolsForNode(o,a)).length>0;p(),ae("custom-node_selected",i.isNodeSelected(A.node))("custom-node_has-tools",s)("in-group",A.node.parentId&&A.node.parentId()),p(4),qA(i.getAgentIcon(n==null?null:n.agent_class)),p(),Fe(" ",o," "),p(),W(i.isRootAgent(o)?10:-1),p(2),W(i.isRootAgentForCurrentTab(o)?-1:12),p(),W(s?13:-1),p(),W(i.shouldShowAddButton(A.node)?14:-1),p(),W(i.shouldShowLeftHandle(A.node)?15:-1),p(),W(i.shouldShowTopHandle(A.node)?16:-1),p(),W(i.shouldShowRightHandle(A.node)?17:-1),p(),W(i.shouldShowBottomHandle(A.node)?18:-1)}}function EkA(t,e){if(t&1&&(m(0,"vflow",8),yt(1,akA,10,14,"ng-template",19)(2,QkA,19,20,"ng-template",20),D()),t&2){let A=y();X("nodes",A.vflowNodes())("edges",A.edges())("background",WE(4,$MA))("snapGrid",WE(5,AkA))}}function hkA(t,e){t&1&&(m(0,"div",9)(1,"div",51)(2,"mat-icon",52),K(3,"touch_app"),D(),m(4,"h4"),K(5,"Start Building Your ADK"),D(),m(6,"p"),K(7,"Drag components from the left panel to create your workflow"),D(),m(8,"div",53)(9,"div",54)(10,"mat-icon"),K(11,"drag_indicator"),D(),m(12,"span"),K(13,"Drag to move nodes"),D()(),m(14,"div",54)(15,"mat-icon"),K(16,"link"),D(),m(17,"span"),K(18,"Shift + Click to connect nodes"),D()()()()())}var RE=class t{constructor(e,A,i){this.dialog=e;this.agentService=A;this.router=i;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackBar=h(ZC);canvasRef;svgCanvasRef;agentBuilderService=h(Kc);cdr=h(ft);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new WA;builderAssistantCloseRequest=new WA;ctx;connections=jA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=jA([]);edges=jA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=jA([]);vflowNodes=_e(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=jA(null);agentToolBoards=jA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(e=>{e&&(this.appName=e)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(e=>{if(e){let{tabName:A,currentAgentName:i}=e;this.switchToAgentToolBoard(A,i)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(e=>{e&&this.deleteAgentToolBoard(e)}),this.agentBuilderService.getSelectedCallback().subscribe(e=>{this.selectedCallback=e}),this.agentBuilderService.getAgentCallbacks().subscribe(e=>{if(e){let A=this.nodes().find(i=>i.data?i.data().name===e.agentName:void 0);if(A&&A.data){let i=A.data();i.callbacks=e.callbacks,A.data.set(i)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(e=>{e&&this.openDeleteSubAgentDialog(e)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(e=>{e.parentAgentName&&this.addSubAgent(e.parentAgentName,e.agentClass,e.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(e=>{this.selectedAgents=this.nodes().filter(A=>A.data&&A.data().name===e?.name)}),this.toolsMap$.subscribe(e=>{this.nodes().some(i=>i.parentId&&i.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(e){e.appNameInput&&e.appNameInput.currentValue&&(this.appName=e.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!0})}onNodePointerDown(e,A){this.shouldIgnoreNodeInteraction(A.target)||this.selectAgentNode(e,{openConfig:!1})}onGroupClick(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(e,A){if(A.stopPropagation(),!e?.data)return;let i=e.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(e){let A=e.target;if(!A)return;let i=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];A.closest(i.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(e){return e?!!e.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(e,A={}){if(!e?.data)return;let i=this.agentBuilderService.getNode(e.data().name);i&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(i),this.nodePositions.set(i.name,BA({},e.point())),A.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(e,A,i,n,o=!1){n.stopPropagation(),i?.closeMenu(),this.onAgentTypeSelected(e,A,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(e){}onAgentTypeSelected(e,A,i=!1){A&&this.addSubAgent(A,e,i)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(e,A,i){let n=jA(e),a={id:this.generateNodeId(),point:jA(BA({},A)),type:"html-template",data:n};return i&&(a.parentId=jA(i)),this.nodePositions.set(e.name,BA({},a.point())),a}createWorkflowGroup(e,A,i,n,o,a){let r,s=null;if(n){let d=(o||this.groupNodes()).find(B=>B.id===n);if(d){let B=d.point(),Q=d.height?d.height():this.workflowGroupHeight;if(a&&o){let E=a.filter(f=>f.parentId&&f.parentId()===d.id);if(E.length>0){let U=0;for(let Y of E){let j=Y.data?Y.data():void 0,AA=120;j&&j.tools&&j.tools.length>0&&(AA+=20+j.tools.length*36),U=Math.max(U,AA)}Q=Math.max(220,80+U+40)}}r={x:B.x,y:B.y+Q+60},s=null}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset}}else r={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset};let g=this.generateNodeId(),l={id:g,point:jA(r),type:"template-group",data:jA(e),parentId:jA(s),width:jA(this.workflowGroupWidth),height:jA(this.workflowGroupHeight)},C=e.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:A.id,sourceHandle:"source-bottom",target:g,targetHandle:"target-top"}:null;return{groupNode:l,edge:C}}calculateWorkflowChildPosition(e,A){let r=(A-20)/2;return{x:45+e*428,y:r}}createAgentNodeWithGroup(e,A,i,n,o){let a=this.createNode(e,A,i),r=null,s=null;if(this.isWorkflowAgent(e.agent_class)){let g=this.createWorkflowGroup(e,a,A,i,n,o);r=g.groupNode,s=g.edge}return{shellNode:a,groupNode:r,groupEdge:s}}createWorkflowChildEdge(e,A){return this.createWorkflowChildEdgeFromArrays(e,A,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(e,A,i,n){if(!A)return null;let o=n.find(r=>r.id===A);if(!o||!o.data)return null;let a=o.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent"){let r=i.find(s=>s.data&&s.data().name===o.data().name);if(r)return{id:this.generateEdgeId(),source:r.id,sourceHandle:"source-bottom",target:e.id,targetHandle:"target-top"}}if(a==="SequentialAgent"){let r=i.filter(l=>l.parentId&&l.parentId()===A);if(r.length===0)return null;r.sort((l,C)=>l.point().x-C.point().x);let s=r.findIndex(l=>l.id===e.id);if(s<=0)return null;let g=r[s-1];return{id:this.generateEdgeId(),source:g.id,sourceHandle:"source-right",target:e.id,targetHandle:"target-left"}}return null}isWorkflowAgent(e){return e?e==="SequentialAgent"||e==="ParallelAgent"||e==="LoopAgent":!1}addSubAgent(e,A="LlmAgent",i=!1){let n=this.nodes().find(C=>C.data&&C.data().name===e);if(!n||!n.data)return;let a={name:this.agentBuilderService.getNextSubAgentName(),agent_class:A,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},r=this.isWorkflowAgent(n.data().agent_class),s=n.parentId&&n.parentId()&&this.groupNodes().some(C=>C.id===n.parentId()),g,l=null;if(i&&r){let C=n.data();if(!C)return;let I=this.groupNodes().find(b=>b.data&&b.data()?.name===C.name);if(!I){console.error("Could not find group for workflow node");return}let d=this.agentBuilderService.getNode(n.data().name);if(!d){console.error("Could not find clicked agent data");return}let B=d.sub_agents.length,Q=I.height?I.height():this.workflowGroupHeight,E=this.calculateWorkflowChildPosition(B,Q),f=this.createAgentNodeWithGroup(a,E,I.id);g=f.shellNode,l=f.groupNode,d.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),f.groupEdge&&this.edges.set([...this.edges(),f.groupEdge])}else if(s){let C=n.parentId()??void 0,I=this.groupNodes().find(R=>R.id===C);if(!I||!I.data){console.error("Could not find parent group node");return}let d=I.data().name,B=this.agentBuilderService.getNode(d);if(!B){console.error("Could not find workflow parent agent");return}let Q=B.sub_agents.length,E=I.height?I.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(Q,E),b=this.createAgentNodeWithGroup(a,f,C);g=b.shellNode,l=b.groupNode,B.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),b.groupEdge&&this.edges.set([...this.edges(),b.groupEdge])}else{let C=n.data().sub_agents.length,I={x:n.point().x+C*400,y:n.point().y+300},d=this.createAgentNodeWithGroup(a,I);g=d.shellNode,l=d.groupNode;let B=this.agentBuilderService.getNode(n.data().name);B&&B.sub_agents.push(a),l&&this.groupNodes.set([...this.groupNodes(),l]),d.groupEdge&&this.edges.set([...this.edges(),d.groupEdge])}if(this.agentBuilderService.addNode(a),this.nodes.set([...this.nodes(),g]),this.selectedAgents=[g],(s||r)&&this.updateGroupDimensions(),r||s){let C=g.parentId?g.parentId()??void 0:void 0,I=this.createWorkflowChildEdge(g,C);I&&this.edges.set([...this.edges(),I])}else{let C={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:g.id,targetHandle:"target-top"};this.edges.set([...this.edges(),C])}this.agentBuilderService.setSelectedNode(a),this.agentBuilderService.requestSideTabChange("config")}addTool(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i=A.data();if(!i)return;this.dialog.open(r2,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(i.name);else{let a={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(i.name,a),this.agentBuilderService.setSelectedTool(a)}})}addCallback(e){let A=this.nodes().find(o=>o.id===e);if(!A||!A.data)return;let i={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): # Add your callback logic here return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(A.data().name,i);n.success||this._snackBar.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(e){this.dialog.open(Cc,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(i=>{i&&typeof i=="string"&&this.agentBuilderService.requestNewTab(i,e)})}deleteTool(e,A){let i=A.toolType==="Agent Tool",n=i&&A.toolAgentName||A.name;this.dialog.open(Cc,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(a=>{a==="confirm"&&this.deleteToolWithoutDialog(e,A)})}deleteToolWithoutDialog(e,A){if(A.toolType==="Agent Tool"){let i=A.toolAgentName||A.name;this.deleteAgentToolAndBoard(e,A,i)}else this.agentBuilderService.deleteTool(e,A)}deleteAgentToolAndBoard(e,A,i){this.agentBuilderService.deleteTool(e,A),this.agentBuilderService.requestTabDeletion(i)}deleteCallback(e,A){this.dialog.open(Cc,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${A.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(e,A);o.success||this._snackBar.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(e){this.dialog.open(Cc,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${e}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(i=>{i==="confirm"&&this.deleteSubAgent(e)})}deleteSubAgent(e){let A=this.agentBuilderService.getNode(e);if(!A)return;let i=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),A,void 0,this.agentToolBoards());i&&(this.deleteSubAgentHelper(A,i),this.agentBuilderService.getSelectedNode().pipe(qn(1),We(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(i)}))}isNodeInSequentialWorkflow(e){if(!e.parentId||!e.parentId())return!1;let A=e.parentId(),i=this.groupNodes().find(n=>n.id===A);return!i||!i.data?!1:i.data().agent_class==="SequentialAgent"}getSequentialSiblings(e){if(!e.parentId||!e.parentId())return{previous:void 0,next:void 0};let A=e.parentId(),i=this.nodes().filter(o=>o.parentId&&o.parentId()===A);i.sort((o,a)=>o.point().x-a.point().x);let n=i.findIndex(o=>o.id===e.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?i[n-1]:void 0,next:nn.data&&n.data().name===e.name);if(i){let n=this.isNodeInSequentialWorkflow(i),o,a;if(n){let s=this.getSequentialSiblings(i);o=s.previous,a=s.next}this.nodes.set(this.nodes().filter(s=>s.id!==i.id));let r=this.groupNodes().find(s=>s.data&&s.data().name===e.name);if(r){this.groupNodes.set(this.groupNodes().filter(g=>g.id!==r.id));let s=this.edges().filter(g=>g.target!==i.id&&g.source!==i.id&&g.target!==r.id&&g.source!==r.id);this.edges.set(s)}else{let s=this.edges().filter(g=>g.target!==i.id&&g.source!==i.id);this.edges.set(s)}if(n&&o&&a){let s={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:a.id,targetHandle:"target-left"};this.edges.set([...this.edges(),s])}}this.nodePositions.delete(e.name),A.sub_agents=A.sub_agents.filter(n=>n.name!==e.name),this.agentBuilderService.deleteNode(e),i&&i.parentId&&i.parentId()&&this.updateGroupDimensions()}selectTool(e,A){if(e.toolType==="Agent Tool"){let i=e.name;this.switchToAgentToolBoard(i);return}if(e.toolType==="Function tool"||e.toolType==="Built-in tool"){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.editTool(e,i)}return}if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedTool(e)}editTool(e,A){let i;e.toolType==="Built-in tool"?i=this.dialog.open(id,{width:"700px",maxWidth:"90vw",data:{toolName:e.name,isEditMode:!0,toolArgs:e.args}}):i=this.dialog.open(r2,{width:"500px",data:{toolType:e.toolType,toolName:e.name,isEditMode:!0}}),i.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=A.tools?.findIndex(a=>a.name===e.name);o!==void 0&&o!==-1&&A.tools&&(A.tools[o].name=n.name,n.args&&(A.tools[o].args=n.args),this.agentBuilderService.setAgentTools(A.name,A.tools))}})}selectCallback(e,A){if(A.data){let i=this.agentBuilderService.getNode(A.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedCallback(e)}openToolsTab(e){if(e.data){let A=this.agentBuilderService.getNode(e.data().name);A&&this.agentBuilderService.setSelectedNode(A)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(e){let A=this.agentBuilderService.getRootNode();if(!A){this._snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentToolBoards();zc.generateYamlFile(A,i,e,n),this.agentService.agentBuild(i).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:e}}).then(()=>{window.location.reload()}):this._snackBar.open("Something went wrong, please try again","OK")})}isRootAgent(e){let A=this.agentBuilderService.getRootNode();return A?A.name===e:!1}isRootAgentForCurrentTab(e){return this.isAgentToolMode&&this.currentAgentTool()?e===this.currentAgentTool():this.isRootAgent(e)}shouldShowHorizontalHandle(e,A){if(!e.parentId||!e.parentId())return!1;let i=e.parentId(),n=this.groupNodes().find(s=>s.id===i);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let a=this.nodes().filter(s=>s.parentId&&s.parentId()===i);if(a.length<=1)return!1;a.sort((s,g)=>s.point().x-g.point().x);let r=a.findIndex(s=>s.id===e.id);return A==="left"?r>0:r0):!1}shouldShowTopHandle(e){let A=e.data?e.data():void 0,i=A?.name,n=i?this.isRootAgent(i):!1;if(e.type==="template-group")return A?.agent_class==="SequentialAgent";if(n)return!1;if(e.parentId&&e.parentId()){let a=e.parentId(),r=this.groupNodes().find(s=>s.id===a);if(r&&r.data){let s=r.data().agent_class;if(s==="LoopAgent"||s==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(e,A){return!e||!A?[]:A.get(e)??[]}loadFromYaml(e,A){try{let i=DB(e);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=Ve(BA({name:i.name||"root_agent",agent_class:i.agent_class||"LlmAgent",model:i.model||"gemini-2.5-flash",instruction:i.instruction||"",description:i.description||""},i.max_iterations&&{max_iterations:i.max_iterations}),{isRoot:!0,sub_agents:i.sub_agents||[],tools:this.parseToolsFromYaml(i.tools||[]),callbacks:this.parseCallbacksFromYaml(i)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],A),this.loadAgentBoard(n)}catch(i){console.error("Error parsing YAML:",i)}}parseToolsFromYaml(e){return e.map(A=>{let i={name:A.name,toolType:this.determineToolType(A),toolAgentName:A.name};if(A.name==="AgentTool"&&A.args&&A.args.agent&&A.args.agent.config_path){i.toolType="Agent Tool";let o=A.args.agent.config_path.replace("./","").replace(".yaml","");i.name=o,i.toolAgentName=o,i.args=A.args}else A.args&&(i.args=A.args);return i})}parseCallbacksFromYaml(e){let A=[];return Object.keys(e).forEach(i=>{if(i.endsWith("_callback")&&Array.isArray(e[i])){let n=i.replace("_callback","");e[i].forEach(o=>{o.name&&A.push({name:o.name,type:n})})}}),A}determineToolType(e){return e.name==="AgentTool"&&e.args&&e.args.agent?"Agent Tool":e.name&&e.name.includes(".")&&e.args?"Custom tool":e.name&&e.name.includes(".")&&!e.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(e,A){let i=e.filter(n=>n.toolType==="Agent Tool");for(let n of i)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,A)}loadAgentToolConfiguration(e,A){let i=e.name;this.agentService.getSubAgentBuilder(A,`${i}.yaml`).subscribe({next:n=>{if(n)try{let o=DB(n),a=Ve(BA({name:o.name||i,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${i} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization}),r=this.agentToolBoards();if(r.set(i,a),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),this.agentBuilderService.addNode(a),this.processAgentToolsFromYaml(a.tools||[],A),a.sub_agents&&a.sub_agents.length>0)for(let s of a.sub_agents)s.config_path&&this.agentService.getSubAgentBuilder(A,s.config_path).subscribe(g=>{if(g){let l=DB(g);this.processAgentToolsFromYaml(this.parseToolsFromYaml(l.tools||[]),A)}})}catch(o){console.error(`Error parsing YAML for agent tool ${i}:`,o),this.createDefaultAgentToolConfiguration(e)}else this.createDefaultAgentToolConfiguration(e)},error:n=>{console.error(`Error loading agent tool configuration for ${i}:`,n),this.createDefaultAgentToolConfiguration(e)}})}createDefaultAgentToolConfiguration(e){let A=e.name,i={name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!e.args?.skip_summarization},n=this.agentToolBoards();n.set(A,i),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(i)}loadAgentTools(e){e.tools?(e.tools=e.tools.filter(A=>A.name&&A.name.trim()!==""),e.tools.forEach(A=>{A.toolType!=="Agent Tool"&&(A.name.includes(".")&&A.args?A.toolType="Custom tool":A.name.includes(".")&&!A.args?A.toolType="Function tool":A.toolType="Built-in tool")})):e.tools=[]}isNodeSelected(e){return this.selectedAgents.includes(e)}isGroupSelected(e){if(!e.data)return!1;let A=e.data().name,i=this.nodes().find(n=>n.data&&n.data().name===A);return i?this.isNodeSelected(i):!1}loadSubAgents(e,A){return ct(this,null,function*(){let i=[{node:A,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],a=[];for(;i.length>0;){let{node:r,depth:s,index:g,parentShellId:l,parentAgent:C,parentGroupId:I}=i.shift(),d=r;if(r.config_path)try{let M=yield tL(this.agentService.getSubAgentBuilder(e,r.config_path));d=DB(M),d.tools&&(d.tools=this.parseToolsFromYaml(d.tools||[])),this.processAgentToolsFromYaml(d.tools||[],e)}catch(M){console.error(`Failed to load agent from ${r.config_path}`,M);continue}if(C&&C.sub_agents){let M=C.sub_agents.indexOf(r);M!==-1&&(C.sub_agents[M]=d,this.agentBuilderService.addNode(C))}this.agentBuilderService.addNode(d);let B=this.nodePositions.get(d.name),Q=this.isWorkflowAgent(d.agent_class),E=C?this.isWorkflowAgent(C.agent_class):!1,f,b,R=null;if(E&&!d.isRoot){let M=C?.sub_agents.indexOf(d)??g,v=o.find(U=>U.id===I),F=v?.height?v.height():this.workflowGroupHeight;f=B??this.calculateWorkflowChildPosition(M,F);let G=this.createAgentNodeWithGroup(d,f,I??void 0,o,n);b=G.shellNode,R=G.groupNode,n.push(b),R&&o.push(R),G.groupEdge&&a.push(G.groupEdge)}else{if(B)f=B;else if(!l)f={x:100,y:150};else{let v=n.find(F=>F.id===l);v?f={x:v.point().x+(g-1)*400,y:v.point().y+300}:f={x:100,y:s*150+50}}let M=this.createAgentNodeWithGroup(d,f,void 0,o,n);b=M.shellNode,R=M.groupNode,n.push(b),Q&&!d.isRoot&&(R&&o.push(R),M.groupEdge&&a.push(M.groupEdge))}if(l)if(I){let M=this.createWorkflowChildEdgeFromArrays(b,I,n,o);M&&a.push(M)}else{let M={id:this.generateEdgeId(),source:l,sourceHandle:"source-bottom",target:b.id,targetHandle:"target-top"};a.push(M)}if(d.sub_agents&&d.sub_agents.length>0){let M=1,v=Q&&R?R.id:I;for(let F of d.sub_agents)i.push({node:F,parentShellId:b.id,depth:s+1,index:M,parentAgent:d,parentGroupId:v}),M++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(a),this.updateGroupDimensions()})}switchToAgentToolBoard(e,A){let i=this.currentAgentTool()||"main";i!==e&&this.navigationStack.push(i);let n=this.agentToolBoards(),o=n.get(e);if(!o){o={isRoot:!1,name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let a=new Map(n);a.set(e,o),this.agentToolBoards.set(a),this.agentBuilderService.setAgentToolBoards(a),A?this.addAgentToolToAgent(e,A):this.addAgentToolToRoot(e)}this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let e=this.navigationStack.pop();if(e==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}else{let i=this.agentToolBoards().get(e);i&&(this.currentAgentTool.set(e),this.isAgentToolMode=!0,this.loadAgentBoard(i),this.agentBuilderService.setSelectedNode(i),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(e){return ct(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(e),this.agentBuilderService.addNode(e),e.tools&&e.tools.length>0?this.agentBuilderService.setAgentTools(e.name,e.tools):this.agentBuilderService.setAgentTools(e.name,[]),e.sub_agents&&e.sub_agents.length>0)yield this.loadSubAgents(this.appName,e);else{let A=this.nodePositions.get(e.name)??{x:100,y:150},i=this.createNode(e,A);if(this.nodes.set([i]),this.isWorkflowAgent(e.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(e,i,A);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(e)})}addAgentToolToAgent(e,A){let i=this.agentBuilderService.getNode(A);if(i){if(i.tools&&i.tools.some(o=>o.name===e))return;let n={name:e,toolType:"Agent Tool",toolAgentName:e};i.tools||(i.tools=[]),i.tools.push(n),i.tools=i.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(A,i.tools)}}addAgentToolToRoot(e){let A=this.agentBuilderService.getRootNode();if(A){if(A.tools&&A.tools.some(n=>n.name===e))return;let i={name:e,toolType:"Agent Tool",toolAgentName:e};A.tools||(A.tools=[]),A.tools.push(i),this.agentBuilderService.setAgentTools("root_agent",A.tools)}}deleteAgentToolBoard(e){let A=this.agentToolBoards(),i=new Map(A);i.delete(e),this.agentToolBoards.set(i),this.agentBuilderService.setAgentToolBoards(i);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(a=>!(a.toolType==="Agent Tool"&&(a.toolAgentName===e||a.name===e))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==e),this.currentAgentTool()===e&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let e=this.navigationStack[this.navigationStack.length-1];return e==="main"?"Back to Main Canvas":`Back to ${e}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:e=>{e&&this.loadFromYaml(e,this.appNameInput)},error:e=>{console.error("Error reloading canvas:",e)}})}captureCurrentNodePositions(){for(let e of this.nodes()){if(!e?.data)continue;let A=e.data();A&&this.nodePositions.set(A.name,BA({},e.point()))}}updateGroupDimensions(){for(let s of this.groupNodes()){if(!s.data)continue;let g=s.data().name,l=this.nodes().filter(f=>f.parentId&&f.parentId()===s.id);if(l.length===0){s.width&&s.width.set(480),s.height&&s.height.set(220);continue}l.sort((f,b)=>f.point().x-b.point().x),l.forEach((f,b)=>{let G={x:45+b*428,y:80};if(f.point.set(G),f.data){let U=f.data();U&&this.nodePositions.set(U.name,G)}});let C=1/0,I=1/0,d=-1/0,B=-1/0;for(let f of l){let b=f.point(),R=f.data?f.data():void 0,M=120;R&&R.tools&&R.tools.length>0&&(M+=20+R.tools.length*36),C=Math.min(C,b.x),I=Math.min(I,b.y),d=Math.max(d,b.x+340+68),B=Math.max(B,b.y+M)}let Q=d-C+80,E=B-I+80;s.width&&s.width.set(Math.max(480,Q)),s.height&&s.height.set(Math.max(220,E))}}getToolIcon(e){return vB(e.name,e.toolType)}getAgentIcon(e){switch(e){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";default:return"psychology"}}isGroupEmpty(e){return!this.nodes().some(i=>i.parentId&&i.parentId()===e)}shouldShowAddButton(e){let A=e.data?e.data():void 0;if(!A)return!1;let i=this.isWorkflowAgent(A.agent_class),n=e.parentId&&e.parentId();if(i&&!n||!this.isNodeSelected(e))return!1;if(n&&e.parentId){let o=e.parentId(),a=this.nodes().filter(s=>s.parentId&&s.parentId()===o);if(a.length===0)return!0;let r=a.reduce((s,g)=>g.point().x>s.point().x?g:s,a[0]);return e.id===r.id}return!0}static \u0275fac=function(A){return new(A||t)(lt(Qs),lt(DE),lt(qr))};static \u0275cmp=kA({type:t,selectors:[["app-canvas"]],viewQuery:function(A,i){if(A&1&&ni(ZMA,5)(XMA,5),A&2){let n;Ce(n=Ie())&&(i.canvasRef=n.first),Ce(n=Ie())&&(i.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[ei],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(A,i){A&1&&(m(0,"div",4)(1,"div",5),$("click",function(o){return i.onCanvasClick(o)}),V(2,tkA,13,2,"div",6),V(3,ikA,2,0,"span",7),V(4,EkA,3,6,"vflow",8),V(5,hkA,19,0,"div",9),D(),m(6,"app-builder-assistant",10),$("closePanel",function(){return i.onBuilderAssistantClose()})("reloadCanvas",function(){return i.reloadCanvasFromYaml()}),D()()),A&2&&(p(),ae("has-banner",i.currentAgentTool()),p(),W(i.currentAgentTool()?2:-1),p(),W(i.showSidePanel?-1:3),p(),W(i.vflowNodes().length>0?4:-1),p(),W(i.vflowNodes().length===0?5:-1),p(),X("isVisible",i.showBuilderAssistant)("appName",i.appName))},dependencies:[$eA,tF,AtA,zw,Pw,In,Ba,E0,DC,fE,cw,Pr],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;background:var(--builder-canvas-container-background);display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:var(--builder-canvas-shadow);flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{background:var(--builder-canvas-header-background);padding:16px 24px;border-bottom:2px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;background:var(--builder-canvas-header-title-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background:var(--builder-button-background-color);border:1px solid var(--builder-button-border-color);color:var(--builder-button-text-color);transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:var(--builder-button-hover-background-color);border-color:var(--builder-button-hover-border-color);transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:var(--builder-canvas-workspace-background);min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;z-index:1000;background:linear-gradient(135deg,#1e3a8a,#3b82f6);border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{background:#fff3;transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{background-color:var(--builder-canvas-workspace-background)!important;color:var(--builder-text-primary-color)!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:1}.instruction-content[_ngcontent-%COMP%]{background:var(--builder-canvas-instruction-background);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:2px solid var(--builder-canvas-instruction-border);border-radius:16px;padding:32px;box-shadow:var(--builder-canvas-shadow)}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:var(--builder-button-text-color);margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:var(--builder-text-primary-color);font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:var(--builder-accent-color);font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);z-index:10;animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{background:linear-gradient(135deg,#1b73e8,#4285f4);color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background:#fff3;color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:#ffffff4d;transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{background:var(--builder-canvas-header-background);padding:12px 24px;border-top:1px solid var(--builder-border-color);display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:var(--builder-text-secondary-color);font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:var(--builder-accent-color)}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]{background:radial-gradient(circle at 20% 50%,rgba(66,133,244,.1) 0%,transparent 50%),radial-gradient(circle at 80% 20%,rgba(52,168,83,.1) 0%,transparent 50%),radial-gradient(circle at 40% 80%,rgba(251,188,4,.1) 0%,transparent 50%),#131314}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00bbea;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media(max-width:768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;background:var(--builder-canvas-node-background);border:1px solid var(--builder-canvas-node-border);border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:var(--builder-canvas-node-hover-border)}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:var(--builder-accent-color)}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:var(--builder-accent-color)}[_nghost-%COMP%] .default-group-node{background-color:var(--builder-canvas-group-background)!important;border:2px solid var(--builder-canvas-group-border)!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:var(--builder-text-primary-color);font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;background:var(--builder-canvas-node-badge-background);color:var(--builder-accent-color);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid var(--builder-border-color)}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:var(--builder-text-primary-color)}.tool-item[_ngcontent-%COMP%]:hover{background-color:var(--builder-item-hover-color)}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:var(--builder-text-primary-color);flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:var(--builder-canvas-node-chip-outline)}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:var(--builder-accent-color)}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;background:var(--builder-chip-background-color);color:var(--builder-accent-color);padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:var(--builder-text-muted-color);margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:var(--builder-text-secondary-color);margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{background:none;color:var(--builder-text-secondary-color);border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color)}.add-tool-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:var(--builder-text-primary-color);background-color:var(--builder-item-hover-color);transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid var(--builder-accent-color);background:var(--builder-canvas-add-btn-background);color:var(--builder-accent-color);display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:var(--builder-canvas-add-btn-shadow);background:var(--builder-canvas-add-btn-hover-background)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:var(--builder-canvas-add-btn-shadow)}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:var(--builder-text-tertiary-color);cursor:pointer;margin-left:20px;margin-top:20px;z-index:9999}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:var(--builder-accent-color)!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:var(--builder-accent-color)!important;stroke-width:1!important;fill:var(--builder-canvas-handle-fill)!important}[_nghost-%COMP%] .reconnect-handle{stroke:var(--builder-accent-color)!important;stroke-width:2!important;fill:var(--builder-canvas-reconnect-handle-fill)!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:var(--builder-canvas-workflow-chip-background);border:1px solid var(--builder-canvas-workflow-chip-border);border-radius:16px;color:var(--builder-accent-color);font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:var(--builder-text-primary-color);font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;background:var(--builder-canvas-empty-group-background);border:2px dashed var(--builder-canvas-empty-group-border);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{background:var(--builder-canvas-empty-group-hover-background);border-color:var(--builder-canvas-empty-group-hover-border)}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid var(--builder-accent-color);background-color:var(--builder-canvas-empty-group-btn-background);color:var(--builder-accent-color);width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{background-color:var(--builder-canvas-empty-group-btn-hover-background);transform:scale(1.1);box-shadow:var(--builder-canvas-add-btn-shadow)}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:var(--builder-text-secondary-color);font-family:Google Sans,sans-serif}']})};function ukA(t,e){t&1&&Ni(0,"div",2)}var fkA=new wA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var ey=(()=>{class t{_elementRef=h(ge);_ngZone=h(Oe);_changeDetectorRef=h(ft);_renderer=h(ui);_cleanupTransitionEnd;constructor(){let A=Eh(),i=h(fkA,{optional:!0});this._isNoopAnimation=A==="di-disabled",A==="reduced-motion"&&this._elementRef.nativeElement.classList.add("mat-progress-bar-reduced-motion"),i&&(i.color&&(this.color=this._defaultColor=i.color),this.mode=i.mode||this.mode)}_isNoopAnimation;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=etA(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=etA(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new WA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(i,n){i&2&&(ie("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),Qo("mat-"+n.color),ae("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",Zi],bufferValue:[2,"bufferValue","bufferValue",Zi],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(i,n){i&1&&(ti(0,"div",0),Ni(1,"div",1),V(2,ukA,1,0,"div",2),Ii(),ti(3,"div",3),Ni(4,"span",4),Ii(),ti(5,"div",5),Ni(6,"span",4),Ii()),i&2&&(p(),En("flex-basis",n._getBufferBarFlexBasis()),p(),W(n.mode==="buffer"?2:-1),p(),En("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{--mat-progress-bar-animation-multiplier: 1;display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mat-progress-bar-reduced-motion{--mat-progress-bar-animation-multiplier: 2}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mat-progress-bar-track-height, 4px),var(--mat-progress-bar-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mat-progress-bar-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-progress-bar-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mat-progress-bar-track-height, 4px);border-radius:var(--mat-progress-bar-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle, var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2), transparent 0);background-repeat:repeat-x;background-size:calc(calc(var(--mat-progress-bar-track-height, 4px) / 2)*5);background-position:left;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse calc(250ms*var(--mat-progress-bar-animation-multiplier)) infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mat-progress-bar-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale calc(2s*var(--mat-progress-bar-animation-multiplier)) infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mat-progress-bar-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}} `],encapsulation:2,changeDetection:0})}return t})();function etA(t,e=0,A=100){return Math.max(e,Math.min(A,t))}var ttA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();var pkA=["determinateSpinner"];function DkA(t,e){if(t&1&&(Qt(),m(0,"svg",11),GA(1,"circle",12),D()),t&2){let A=y();ie("viewBox",A._viewBox()),p(),En("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),ie("r",A._circleRadius())}}var wkA=new wA("mat-progress-spinner-default-options",{providedIn:"root",factory:()=>({diameter:itA})}),itA=100,ykA=10,uI=(()=>{class t{_elementRef=h(ge);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=h(wkA),i=Eh(),n=this._elementRef.nativeElement;this._noopAnimations=i==="di-disabled"&&!!A&&!A._forceAnimations,this.mode=n.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",!this._noopAnimations&&i==="reduced-motion"&&n.classList.add("mat-progress-spinner-reduced-motion"),A&&(A.color&&(this.color=this._defaultColor=A.color),A.diameter&&(this.diameter=A.diameter),A.strokeWidth&&(this.strokeWidth=A.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=itA;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-ykA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(i,n){if(i&1&&ni(pkA,5),i&2){let o;Ce(o=Ie())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(i,n){i&2&&(ie("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),Qo("mat-"+n.color),En("width",n.diameter,"px")("height",n.diameter,"px")("--mat-progress-spinner-size",n.diameter+"px")("--mat-progress-spinner-active-indicator-width",n.diameter+"px"),ae("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",Zi],diameter:[2,"diameter","diameter",Zi],strokeWidth:[2,"strokeWidth","strokeWidth",Zi]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(i,n){if(i&1&&(yt(0,DkA,2,8,"ng-template",null,0,NC),m(2,"div",2,1),Qt(),m(4,"svg",3),GA(5,"circle",4),D()(),Tr(),m(6,"div",5)(7,"div",6)(8,"div",7),$i(9,8),D(),m(10,"div",9),$i(11,8),D(),m(12,"div",10),$i(13,8),D()()()),i&2){let o=Wi(1);p(4),ie("viewBox",n._viewBox()),p(),En("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),ie("r",n._circleRadius()),p(4),X("ngTemplateOutlet",o),p(2),X("ngTemplateOutlet",o),p(2),X("ngTemplateOutlet",o)}},dependencies:[Ng],styles:[`.mat-mdc-progress-spinner{--mat-progress-spinner-animation-multiplier: 1;display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mat-progress-spinner-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mat-progress-spinner-reduced-motion{--mat-progress-spinner-animation-multiplier: 1.25}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate calc(1568.2352941176ms*var(--mat-progress-spinner-animation-multiplier)) linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mat-progress-spinner-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin calc(1333ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate calc(5332ms*var(--mat-progress-spinner-animation-multiplier)) cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}} `],encapsulation:2,changeDetection:0})}return t})();var ntA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[Fi]})}return t})();function ty(t){if(!t)return!1;if(t.name==="computer"){let i=t.args?.action,n=t.args?.coordinate;return["left_click","right_click","middle_click","double_click"].includes(i)&&Array.isArray(n)&&n.length===2}let e=["click_at","hover_at","type_text_at","scroll_at","drag_and_drop","mouse_move","scroll_document"].includes(t.name),A=t.args?.x!=null&&t.args?.y!=null||Array.isArray(t.args?.coordinate)&&t.args?.coordinate.length===2;return e&&A}function NE(t){return t?!!t.response?.image?.data:!1}var iy=class t{set json(e){this.formattedJson=this.syntaxHighlight(e)}formattedJson="";sanitizer=h(Wr);syntaxHighlight(e){if(!e)return"";try{let A=JSON.parse(e);e=JSON.stringify(A,null,0)}catch(A){return this.sanitizer.bypassSecurityTrustHtml(this.escapeHtml(e))}return e=e.replace(/&/g,"&").replace(//g,">"),e=e.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,A=>{let i="json-number";return/^"/.test(A)?/:$/.test(A)?i="json-key":i="json-string":/true|false/.test(A)?i="json-boolean":/null/.test(A)&&(i="json-null"),''+A+""}),this.sanitizer.bypassSecurityTrustHtml(e)}escapeHtml(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-json-tooltip"]],inputs:{json:"json"},decls:1,vars:1,consts:[[3,"innerHTML"]],template:function(A,i){A&1&&Ni(0,"div",0),A&2&&Bo("innerHTML",i.formattedJson,xg)},styles:["[_nghost-%COMP%]{display:block;font-family:Courier New,monospace;font-size:12px;line-height:1.4;white-space:pre-wrap;max-width:800px}"]})};var ny=class t{json="";overlayRef=null;overlay=h(Bp);elementRef=h(ge);show(){if(!this.json)return;let e=this.overlay.position().flexibleConnectedTo(this.elementRef).withPositions([{originX:"center",originY:"top",overlayX:"center",overlayY:"bottom",offsetY:-8}]);this.overlayRef=this.overlay.create({positionStrategy:e,scrollStrategy:this.overlay.scrollStrategies.close(),panelClass:"json-tooltip-panel"});let A=new Cg(iy),i=this.overlayRef.attach(A);i.instance.json=this.json}hide(){this.overlayRef&&(this.overlayRef.dispose(),this.overlayRef=null)}ngOnDestroy(){this.hide()}static \u0275fac=function(A){return new(A||t)};static \u0275dir=OA({type:t,selectors:[["","appJsonTooltip",""]],hostBindings:function(A,i){A&1&&$("mouseenter",function(){return i.show()})("mouseleave",function(){return i.hide()})},inputs:{json:[0,"appJsonTooltip","json"]}})};function bkA(t,e){if(t&1&&GA(0,"a2ui-surface",0),t&2){let A=y();X("surfaceId",A.surfaceId())("surface",A.surface())}}var oy=class t{processor=h(_L);beginRendering=null;surfaceUpdate=null;dataModelUpdate=null;surfaceId=jA(null);activeSurface=jA(null);surface=_e(()=>this.activeSurface());constructor(){}ngOnChanges(e){let A=[],i=null;e.beginRendering&&this.beginRendering&&Object.keys(this.beginRendering).length>0&&(A.push(this.beginRendering),i=this.beginRendering?.beginRendering?.surfaceId??i),e.surfaceUpdate&&this.surfaceUpdate&&Object.keys(this.surfaceUpdate).length>0&&(A.push(this.surfaceUpdate),i=this.surfaceUpdate?.surfaceUpdate?.surfaceId??i),e.dataModelUpdate&&this.dataModelUpdate&&Object.keys(this.dataModelUpdate).length>0&&(A.push(this.dataModelUpdate),i=this.dataModelUpdate?.dataModelUpdate?.surfaceId??i),A.length>0&&this.processor.processMessages(A),i&&this.surfaceId.set(i);let n=this.surfaceId();if(n){let o=this.processor.getSurfaces();o.has(n)&&this.activeSurface.set(o.get(n))}}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-a2ui-canvas"]],inputs:{beginRendering:"beginRendering",surfaceUpdate:"surfaceUpdate",dataModelUpdate:"dataModelUpdate"},features:[ei],decls:1,vars:1,consts:[[3,"surfaceId","surface"]],template:function(A,i){A&1&&V(0,bkA,1,2,"a2ui-surface",0),A&2&&W(i.surface()?0:-1)},dependencies:[oa,UL],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%;overflow:auto}[_nghost-%COMP%] *{box-sizing:border-box}.canvas[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:16px;box-sizing:border-box;min-height:100%}"],changeDetection:0})};function MkA(t,e){if(t&1&&K(0),t&2){let A=y(3);Fe(" (",A.functionCall.args.action,") ")}}function kkA(t,e){if(t&1&&(m(0,"span",5),K(1),D()),t&2){y();let A=vs(5);X("matTooltip",A.isVirtual?"Virtual (1000x1000)":"Hardware Mapping"),p(),EL(" [@ ",A.x,"",A.isVirtual?"v":"px",", ",A.y,"",A.isVirtual?"v":"px","] ")}}function SkA(t,e){if(t&1){let A=zA();m(0,"div",2),$("click",function(){rA(A);let n=y(2);return sA(n.clickEvent.emit(n.index))}),m(1,"div",3)(2,"span",4),K(3),V(4,MkA,1,1),wr(5),V(6,kkA,2,5,"span",5),D()(),m(7,"div",6)(8,"img",7),$("load",function(n){rA(A);let o=y(2);return sA(o.onImageLoad(n))}),D(),GA(9,"div",8),D()()}if(t&2){y();let A=vs(0),i=y();p(3),Fe(" ",i.functionCall.name," "),p(),W(i.functionCall.args&&i.functionCall.args.action?4:-1),p();let n=sg(i.getActualPixelCoordinates());p(),W(n?6:-1),p(2),X("src",A,Da),p(),X("ngStyle",i.getClickBoxStyle())}}function xkA(t,e){if(t&1&&(wr(0),V(1,SkA,10,6,"div",1)),t&2){let A=sg(y().getPreviousComputerUseScreenshot());p(),W(A?1:-1)}}function RkA(t,e){if(t&1){let A=zA();m(0,"div",9),$("click",function(){rA(A);let n=y();return sA(n.clickEvent.emit(n.index))}),m(1,"div",3)(2,"span",4),K(3),D()(),GA(4,"img",10),m(5,"div",11)(6,"mat-icon",12),K(7,"computer"),D(),m(8,"span",13),K(9),D()()()}if(t&2){let A=y();p(3),qA(A.functionResponse.name),p(),X("src",A.getComputerUseScreenshot(),Da),p(5),qA(A.getComputerUseUrl())}}var ay=class t{functionCall;functionResponse;allMessages=[];index=0;clickEvent=new WA;imageDimensions=new Map;VIRTUAL_WIDTH=1e3;VIRTUAL_HEIGHT=1e3;isComputerUseResponse(){return!!this.functionResponse&&NE(this.functionResponse)}isComputerUseClick(){return!!this.functionCall&&ty(this.functionCall)}getComputerUseScreenshot(){return this.getScreenshotFromPayload(this.functionResponse?.response)}getComputerUseUrl(){return this.isComputerUseResponse()&&(this.functionResponse?.response).url||""}getPreviousComputerUseScreenshot(){for(let e=this.index-1;e>=0;e--){let A=this.allMessages[e];if(this.isMsgComputerUseResponse(A)&&A.functionResponses&&A.functionResponses.length>0)for(let i=A.functionResponses.length-1;i>=0;i--){let n=A.functionResponses[i];if(NE(n)){let o=n.response;return this.getScreenshotFromPayload(o)}}}return""}getClickCoordinates(){if(!this.isComputerUseClick())return null;let e=this.functionCall.args;return e?e.coordinate?{x:Number(e.coordinate[0]),y:Number(e.coordinate[1])}:e.x!=null&&e.y!=null?{x:Number(e.x),y:Number(e.y)}:null:null}getActualPixelCoordinates(){let e=this.getClickCoordinates();if(!e)return null;let A=this.imageDimensions.get(this.index);return A?{x:Math.round(e.x/this.VIRTUAL_WIDTH*A.width),y:Math.round(e.y/this.VIRTUAL_HEIGHT*A.height),isVirtual:!1}:Ve(BA({},e),{isVirtual:!0})}getClickBoxStyle(){let e=this.getClickCoordinates();if(!e)return{display:"none"};let A=e.x/this.VIRTUAL_WIDTH*100,i=e.y/this.VIRTUAL_HEIGHT*100;return{left:`${A}%`,top:`${i}%`}}onImageLoad(e){let A=e.target;A.naturalWidth&&A.naturalHeight&&this.imageDimensions.set(this.index,{width:A.naturalWidth,height:A.naturalHeight})}isMsgComputerUseResponse(e){return e.functionResponses&&e.functionResponses.length>0?e.functionResponses.some(A=>NE(A)):!1}getScreenshotFromPayload(e){let A=e?.image;if(!A?.data)return"";let i=A.data;return i.startsWith("data:")?i:`data:${A.mimetype||"image/png"};base64,${i}`}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-computer-action"]],inputs:{functionCall:"functionCall",functionResponse:"functionResponse",allMessages:"allMessages",index:"index"},outputs:{clickEvent:"clickEvent"},decls:2,vars:1,consts:[[1,"computer-use-container"],[1,"computer-use-container","click-visualization-container"],[1,"computer-use-container","click-visualization-container",3,"click"],[1,"computer-use-header"],[1,"computer-use-tool-name"],[1,"actual-pixels",3,"matTooltip"],[1,"image-wrapper"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"load","src"],[1,"click-overlay-box",3,"ngStyle"],[1,"computer-use-container",3,"click"],["alt","Computer Use Screenshot",1,"computer-use-screenshot",3,"src"],[1,"computer-use-footprint"],[1,"computer-icon"],[1,"url-text"]],template:function(A,i){A&1&&V(0,xkA,2,2)(1,RkA,10,3,"div",0),A&2&&W(i.isComputerUseClick()?0:i.isComputerUseResponse()?1:-1)},dependencies:[oa,vf,Ug,In,WC,Ba],styles:['[_nghost-%COMP%]{display:block}.computer-use-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;max-width:600px;border-radius:12px;border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);overflow:hidden;cursor:pointer;margin:5px 5px 10px;background-color:var(--chat-panel-bot-message-message-card-background-color);transition:opacity .2s}.computer-use-container[_ngcontent-%COMP%]:hover{opacity:.9}.computer-use-tool-name[_ngcontent-%COMP%]{font-size:12px;font-family:monospace;font-weight:600;color:var(--chat-panel-input-field-textarea-color);opacity:.9;padding:12px}.computer-use-tool-name[_ngcontent-%COMP%] .actual-pixels[_ngcontent-%COMP%]{opacity:.6;margin-left:8px;font-weight:400}.computer-use-screenshot[_ngcontent-%COMP%]{width:100%;height:auto;display:block;border-bottom:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color)}.computer-use-footprint[_ngcontent-%COMP%]{display:flex;align-items:center;padding:8px 12px;gap:8px;background-color:var(--chat-panel-thought-chip-background-color)}.computer-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;flex-shrink:0}.url-text[_ngcontent-%COMP%]{font-size:11px;font-family:monospace;white-space:normal;word-break:break-all;color:var(--chat-panel-input-field-textarea-color);opacity:.8;min-width:0}.image-wrapper[_ngcontent-%COMP%]{position:relative;width:100%}.click-overlay-box[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;border:1px solid rgba(255,255,255,.8);border-radius:50%;transform:translate(-50%,-50%);background-color:#ff00004d;box-shadow:0 0 4px #00000080;pointer-events:none;z-index:10;display:flex;align-items:center;justify-content:center}.click-overlay-box[_ngcontent-%COMP%]:before{content:"";width:2px;height:2px;background-color:red;border-radius:50%;box-shadow:0 0 2px #fff;z-index:11}.click-overlay-box[_ngcontent-%COMP%]:after{content:"";position:absolute;width:100%;height:100%;background:linear-gradient(to right,transparent 48%,rgba(255,255,255,.6) 48%,rgba(255,255,255,.6) 52%,transparent 52%),linear-gradient(to bottom,transparent 48%,rgba(255,255,255,.6) 48%,rgba(255,255,255,.6) 52%,transparent 52%);border-radius:50%}']})};function NkA(t,e){t&1&&(m(0,"div",1)(1,"mat-icon"),K(2,"check_circle"),D(),m(3,"span"),K(4,"Response sent"),D()())}function FkA(t,e){t&1&&(m(0,"div",2)(1,"mat-icon"),K(2,"hourglass_empty"),D(),m(3,"span"),K(4,"Sending..."),D()())}function LkA(t,e){if(t&1){let A=zA();m(0,"div",3)(1,"mat-icon",4),K(2,"rate_review"),D(),m(3,"input",5),ao("ngModelChange",function(n){rA(A);let o=y();return Vn(o.functionCall.userResponse,n)||(o.functionCall.userResponse=n),sA(n)}),$("keydown.enter",function(){rA(A);let n=y();return sA(n.onSend())}),D(),m(4,"button",6),$("click",function(){rA(A);let n=y();return sA(n.onSend())}),m(5,"mat-icon"),K(6,"send"),D()()()}if(t&2){let A=y();p(3),oo("ngModel",A.functionCall.userResponse),p(),X("disabled",!A.functionCall.userResponse)}}var ry=class t{functionCall;appName;userId;sessionId;responseComplete=new WA;agentService=h(Ks);cdr=h(ft);responseChunks=[];onSend(){if(!this.functionCall.userResponse||!this.functionCall.userResponse.trim())return;this.functionCall.responseStatus="sending",this.cdr.detectChanges();let e={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[{functionResponse:{id:this.functionCall.id,name:this.functionCall.name,response:{response:this.functionCall.userResponse}}}]},functionCallEventId:this.functionCall.functionCallEventId};this.responseChunks=[],this.agentService.runSse(e).subscribe({next:A=>ct(this,null,function*(){this.responseChunks.push(A)}),error:A=>{console.error("SSE error:",A),this.functionCall.responseStatus="pending",this.responseChunks=[],this.cdr.detectChanges()},complete:()=>{console.log("Long-running response complete for:",this.functionCall.name),this.functionCall.responseStatus="sent",this.responseComplete.emit(this.responseChunks),this.cdr.detectChanges()}})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-long-running-response"]],inputs:{functionCall:"functionCall",appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{responseComplete:"responseComplete"},decls:4,vars:1,consts:[[1,"response-chip-container",3,"click"],[1,"status-chip","sent"],[1,"status-chip","sending"],[1,"input-chip"],[1,"input-icon"],["placeholder","Enter response...",1,"response-input",3,"ngModelChange","keydown.enter","ngModel"],["mat-icon-button","",1,"send-icon-btn",3,"click","disabled"]],template:function(A,i){A&1&&(m(0,"div",0),$("click",function(o){return o.stopPropagation()}),V(1,NkA,5,0,"div",1)(2,FkA,5,0,"div",2)(3,LkA,7,2,"div",3),D()),A&2&&(p(),W(i.functionCall.responseStatus==="sent"?1:i.functionCall.responseStatus==="sending"?2:3))},dependencies:[yn,ro,so,Ca,Ia,In],styles:[".response-chip-container[_ngcontent-%COMP%]{display:inline-block;margin:5px}.input-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--mat-standard-button-toggle-divider-color);border-radius:16px;padding:0 4px 0 12px;background-color:var(--chat-panel-function-event-button-background-color);height:30px;box-sizing:border-box;max-width:300px}.input-chip[_ngcontent-%COMP%] .input-icon[_ngcontent-%COMP%]{color:var(--long-running-response-icon-color);font-size:18px;width:18px;height:18px}.input-chip[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]{border:none;outline:none;background:transparent;font-size:13px;flex:1;min-width:120px;padding:0;color:var(--long-running-response-input-text-color);caret-color:var(--long-running-response-input-caret-color)}.input-chip[_ngcontent-%COMP%] .response-input[_ngcontent-%COMP%]::placeholder{color:var(--long-running-response-input-placeholder-color)}.input-chip[_ngcontent-%COMP%] .send-icon-btn[_ngcontent-%COMP%]{width:24px;height:24px;padding:0;min-width:unset;color:var(--long-running-response-send-button-color)}.input-chip[_ngcontent-%COMP%] .send-icon-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.status-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;border-radius:16px;padding:0 12px;font-size:13px;font-weight:500;height:32px;box-sizing:border-box;border:1px solid;line-height:32px}.status-chip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.status-chip.sending[_ngcontent-%COMP%]{background-color:#2196f31a;border-color:#2196f34d;color:#2196f3}.status-chip.sent[_ngcontent-%COMP%]{background-color:#4caf501a;border-color:#4caf504d;color:#4caf50}"]})};var sy=new wA("FeedbackService");var _kA={goodResponseTooltip:"Good response",badResponseTooltip:"Bad response",feedbackAdditionalLabel:"Additional feedback (Optional)",feedbackCommentPlaceholderDown:"Share what could be improved in the response",feedbackCommentPlaceholderUp:"Share what you liked about the response",feedbackCancelButton:"Cancel",feedbackSubmitButton:"Submit",feedbackDialogTitle:"Reasons for feedback (Select all that apply)",feedbackReasonHallucination:"Hallucinated libraries / APIs etc",feedbackReasonIncomplete:"Incomplete answer",feedbackReasonFollowup:"Didn't understand followup",feedbackReasonFactual:"Factual errors",feedbackReasonLinks:"Broken/incorrect links",feedbackReasonIrrelevant:"Irrelevant information",feedbackReasonRepetitive:"Repetitive",feedbackReasonAccurate:"Accurate info",feedbackReasonHelpful:"Helpful",feedbackReasonConcise:"Concise",feedbackReasonUnderstanding:"Good understanding",feedbackReasonClear:"Clear and easy to follow"},otA=new wA("Message Feedback Messages",{factory:()=>_kA});function GkA(t,e){t&1&&(m(0,"mat-icon"),K(1,"thumb_up_filled"),D())}function KkA(t,e){t&1&&(m(0,"mat-icon"),K(1,"thumb_up"),D())}function UkA(t,e){t&1&&(m(0,"mat-icon"),K(1,"thumb_down_filled"),D())}function JkA(t,e){t&1&&(m(0,"mat-icon"),K(1,"thumb_down"),D())}function YkA(t,e){if(t&1&&(m(0,"mat-chip-option",7),K(1),D()),t&2){let A=e.$implicit;X("value",A),p(),Fe(" ",A," ")}}function HkA(t,e){if(t&1){let A=zA();m(0,"div",4)(1,"div",5)(2,"h3"),K(3),D(),m(4,"mat-chip-listbox",6),Gt(5,YkA,2,2,"mat-chip-option",7,Ri),D()(),m(7,"div",8)(8,"h3"),K(9),D(),m(10,"mat-form-field",9)(11,"textarea",10),K(12," "),D()()(),m(13,"div",11)(14,"button",12),$("click",function(){rA(A);let n=y();return sA(n.onDetailedFeedbackCancelled())}),K(15),D(),m(16,"button",13),$("click",function(){rA(A);let n=y();return sA(n.onDetailedFeedbackSubmitted())}),K(17),D()()()}if(t&2){let A=y();p(3),qA(A.i18n.feedbackDialogTitle),p(),X("formControl",A.selectedReasons),p(),Kt(A.reasons()),p(4),qA(A.i18n.feedbackAdditionalLabel),p(2),X("formControl",A.comment)("placeholder",A.feedbackPlaceholder()),p(4),Fe(" ",A.i18n.feedbackCancelButton," "),p(2),Fe(" ",A.i18n.feedbackSubmitButton," ")}}var gy=class t{sessionName=nt.required();eventId=nt.required();i18n=h(otA);feedbackService=h(sy);existingFeedback=ym({params:()=>({sessionName:this.sessionName(),eventId:this.eventId()}),stream:({params:e})=>this.feedbackService.getFeedback(e.sessionName,e.eventId)});selectedFeedbackDirection=jA(void 0);feedbackDirection=_e(()=>this.selectedFeedbackDirection()??this.existingFeedback.value()?.direction);isDetailedFeedbackVisible=jA(!1);feedbackPlaceholder=_e(()=>this.feedbackDirection()==="up"?this.i18n.feedbackCommentPlaceholderUp:this.i18n.feedbackCommentPlaceholderDown);positiveReasonsResource=ym({stream:()=>this.feedbackService.getPositiveFeedbackReasons()});negativeReasonsResource=ym({stream:()=>this.feedbackService.getNegativeFeedbackReasons()});reasons=_e(()=>this.feedbackDirection()==="up"?this.positiveReasonsResource.value():this.negativeReasonsResource.value());selectedReasons=new ss([]);comment=new ss("");isLoading=jA(!1);sendFeedback(e){this.feedbackDirection()===e?(this.isLoading.set(!0),this.feedbackService.deleteFeedback(this.sessionName(),this.eventId()).subscribe(()=>{this.isLoading.set(!1),this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()})):(this.selectedReasons.reset(),this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e}).subscribe(()=>{this.isLoading.set(!1),this.isDetailedFeedbackVisible.set(!0),this.selectedFeedbackDirection.set(e)}))}onDetailedFeedbackSubmitted(){let e=this.feedbackDirection();e&&(this.isLoading.set(!0),this.feedbackService.sendFeedback(this.sessionName(),this.eventId(),{direction:e,reasons:this.selectedReasons.value??[],comment:this.comment.value??void 0}).subscribe(()=>{this.isLoading.set(!1),this.resetDetailedFeedback()}))}onDetailedFeedbackCancelled(){this.selectedFeedbackDirection.set(void 0),this.resetDetailedFeedback()}resetDetailedFeedback(){this.isDetailedFeedbackVisible.set(!1),this.comment.reset(),this.selectedReasons.reset([])}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-message-feedback"]],inputs:{sessionName:[1,"sessionName"],eventId:[1,"eventId"]},decls:9,vars:7,consts:[[1,"message-feedback-container"],[1,"feedback-buttons"],["mat-icon-button","",3,"click","matTooltip","disabled"],["class","feedback-details-container",4,"ngIf"],[1,"feedback-details-container"],[1,"reasons-chips"],["multiple","",3,"formControl"],[3,"value"],[1,"additional-feedback"],["appearance","outline"],["matInput","",3,"formControl","placeholder"],[1,"actions"],["mat-stroked-button","",3,"click"],["mat-flat-button","","color","primary",3,"click"]],template:function(A,i){A&1&&(m(0,"div",0)(1,"div",1)(2,"button",2),$("click",function(){return i.sendFeedback("up")}),V(3,GkA,2,0,"mat-icon")(4,KkA,2,0,"mat-icon"),D(),m(5,"button",2),$("click",function(){return i.sendFeedback("down")}),V(6,UkA,2,0,"mat-icon")(7,JkA,2,0,"mat-icon"),D()(),yt(8,HkA,18,7,"div",3),D()),A&2&&(p(2),X("matTooltip",i.i18n.goodResponseTooltip)("disabled",i.isLoading()),p(),W(i.feedbackDirection()==="up"?3:4),p(2),X("matTooltip",i.i18n.badResponseTooltip)("disabled",i.isLoading()),p(),W(i.feedbackDirection()==="down"?6:7),p(2),X("ngIf",i.isDetailedFeedbackVisible()))},dependencies:[oa,yc,bc,ro,so,SI,Cs,vn,Ia,sw,pN,fN,vr,To,Ug,In,Fg,wa,WC,Ba],styles:[".message-feedback-container[_ngcontent-%COMP%]{display:block}.feedback-buttons[_ngcontent-%COMP%]{--mat-icon-button-touch-target-size: 32px;--button-size: 32px;--icon-size: 12px;margin-left:96px;display:flex}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:var(--button-size);height:var(--button-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:var(--icon-size);height:var(--icon-size);width:var(--icon-size);transition:all .2s ease}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%]{background-color:var(--side-panel-button-filled-container-color, var(--mat-sys-primary));color:var(--side-panel-button-filled-label-text-color, white)}.feedback-buttons[_ngcontent-%COMP%] button.selected[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.reasons-chips[_ngcontent-%COMP%]{margin-bottom:20px}.feedback-details-container[_ngcontent-%COMP%]{margin-left:54px;max-width:500px;padding:16px;background-color:var(--builder-card-background-color);border-radius:8px;margin-top:8px;border:1px solid var(--builder-border-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:500;margin-bottom:8px;margin-top:0;color:var(--builder-text-secondary-color)}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.feedback-details-container[_ngcontent-%COMP%] .additional-feedback[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{min-height:60px;resize:vertical}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.feedback-details-container[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border-radius:18px;padding:0 16px;height:32px;line-height:32px;font-weight:500}"]})};var TkA={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"Pass",evalFailLabel:"Fail",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a Message...",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Turn off microphone",useMicTooltip:"Use microphone",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state"},atA=new wA("Chat Panel Messages",{factory:()=>TkA});var OkA=["videoContainer"],zkA=["autoScroll"],PkA=["messageTextarea"],jkA=t=>({selected:t}),qkA=(t,e)=>({"user-message":t,"bot-message":e}),VkA=(t,e)=>({"eval-pass":t,"eval-fail":e}),WkA=t=>({hidden:t}),ZkA=(t,e)=>({"eval-fail":t,"message-card--highlighted":e}),XkA=(t,e)=>({text:t,thought:e}),ly=t=>({"function-event-button-highlight":t}),nF=t=>({hidden:t});function $kA(t,e){t&1&&(m(0,"div",8),GA(1,"mat-progress-bar",10),D())}function ASA(t,e){if(t&1&&(m(0,"div",22),K(1),D()),t&2){let A=y(2).$index,i=y(2);p(),Fe(" #",i.getOverallEventNumber(A)," ")}}function eSA(t,e){t&1&&GA(0,"div",23)}function tSA(t,e){if(t&1&&(m(0,"div",12),V(1,ASA,2,1,"div",22)(2,eSA,1,0,"div",23),D()),t&2){let A=y().$index,i=y(2);p(),W(i.isFirstUserMessageInGroup(A)?1:2)}}function iSA(t,e){if(t&1&&(m(0,"div",22),K(1),D()),t&2){let A=y(2).$index,i=y(2);p(),Fe(" #",i.getOverallEventNumber(A)," ")}}function nSA(t,e){t&1&&GA(0,"div",23)}function oSA(t,e){if(t&1&&(m(0,"div",14),V(1,iSA,2,1,"div",22)(2,nSA,1,0,"div",23),D()),t&2){let A=y().$index,i=y(2);p(),W(i.isFirstMessageInEventGroup(A)?1:2)}}function aSA(t,e){if(t&1&&(m(0,"button",24)(1,"mat-icon",25),K(2,"robot_2"),D()()),t&2){let A=y(),i=A.$implicit,n=A.$index,o=y(2);Qo(o.customIconColorClass(n)),X("disabled",!i.eventId)("matTooltip",o.getAgentNameFromEvent(n))("ngClass",zr(5,WkA,!o.getAgentNameFromEvent(n)))}}function rSA(t,e){t&1&&GA(0,"mat-progress-bar",27)}function sSA(t,e){if(t&1&&GA(0,"img",33),t&2){let A=y().$implicit;X("src",A.url,Da)}}function gSA(t,e){if(t&1&&(m(0,"a",34),K(1),D()),t&2){let A=y(2).$implicit;X("href",A.url,Da),p(),qA(A.file.name)}}function lSA(t,e){if(t&1&&K(0),t&2){let A=y(2).$implicit;Fe(" ",A.file.name," ")}}function cSA(t,e){if(t&1&&(m(0,"mat-icon"),K(1,"insert_drive_file"),D(),V(2,gSA,2,2,"a",34)(3,lSA,1,1)),t&2){let A=y().$implicit;p(2),W(A.url?2:3)}}function CSA(t,e){if(t&1&&(m(0,"div",32),V(1,sSA,1,1,"img",33),V(2,cSA,4,1),D()),t&2){let A=e.$implicit;p(),W(A.file.type.startsWith("image/")?1:-1),p(),W(A.file.type.startsWith("image/")?-1:2)}}function ISA(t,e){if(t&1&&(m(0,"div",28),Gt(1,CSA,3,2,"div",32,Ri),D()),t&2){let A=y(2).$implicit;p(),Kt(A.attachments)}}function dSA(t,e){if(t&1&&(m(0,"div",29),K(1),D()),t&2){let A=y(4);p(),qA(A.i18n.thoughtChipLabel)}}function BSA(t,e){if(t&1){let A=zA();m(0,"div",35)(1,"textarea",37,2),$("ngModelChange",function(n){rA(A);let o=y(5);return sA(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){rA(A);let o=y(3).$implicit,a=y(2);return sA(a.handleKeydown.emit({event:n,message:o}))}),D(),m(3,"div",38)(4,"span",39),$("click",function(){rA(A);let n=y(3).$implicit,o=y(2);return sA(o.cancelEditMessage.emit(n))}),K(5," close "),D(),m(6,"span",40),$("click",function(){rA(A);let n=y(3).$implicit,o=y(2);return sA(o.saveEditMessage.emit(n))}),K(7," check "),D()()()}if(t&2){let A=y(5);p(),X("ngModel",A.userEditEvalCaseMessage),p(3),X("matTooltip",A.i18n.cancelEditingTooltip),p(2),X("matTooltip",A.i18n.saveEvalMessageTooltip)}}function QSA(t,e){if(t&1&&$i(0,36),t&2){let A=y(3).$implicit,i=y(2);X("ngComponentOutlet",i.markdownComponent)("ngComponentOutletInputs",fl(2,XkA,A.text,A.thought))}}function ESA(t,e){if(t&1&&V(0,BSA,8,3,"div",35)(1,QSA,1,5,"ng-container",36),t&2){let A=y(2).$implicit;W(A.isEditing?0:1)}}function hSA(t,e){if(t&1&&(m(0,"div"),GA(1,"div",41),D()),t&2){let A=y(2).$implicit,i=y(2);p(),X("innerHTML",i.renderGooglerSearch(A.renderedContent),xg)}}function uSA(t,e){if(t&1&&GA(0,"app-a2ui-canvas",30),t&2){let A=y(2).$implicit;X("beginRendering",A.a2uiData.beginRendering)("surfaceUpdate",A.a2uiData.surfaceUpdate)("dataModelUpdate",A.a2uiData.dataModelUpdate)}}function fSA(t,e){if(t&1&&(m(0,"code"),K(1),D()),t&2){let A=y(2).$implicit;p(),Fe(" ",A.executableCode.code," ")}}function mSA(t,e){if(t&1&&(m(0,"div")(1,"div"),K(2),D(),m(3,"div"),K(4),D()()),t&2){let A=y(2).$implicit,i=y(2);p(2),Dc("",i.i18n.outcomeLabel,": ",A.codeExecutionResult.outcome),p(2),Dc("",i.i18n.outputLabel,": ",A.codeExecutionResult.output)}}function pSA(t,e){if(t&1){let A=zA();m(0,"div",42)(1,"img",43),$("click",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openViewImageDialog.emit(n.inlineData.data))}),D()()}if(t&2){let A=y(4).$implicit;p(),X("src",A.inlineData.data,Da)}}function DSA(t,e){if(t&1&&(m(0,"div"),GA(1,"app-audio-player",44),D()),t&2){let A=y(4).$implicit;p(),X("base64data",A.inlineData.data)}}function wSA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",45)(2,"mat-icon"),K(3,"description"),D(),m(4,"button",46),$("click",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),K(5),D()()()}if(t&2){let A=y(4).$implicit;p(5),Fe(" ",A.inlineData.name," ")}}function ySA(t,e){if(t&1){let A=zA();m(0,"div")(1,"button",46),$("click",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),K(2),D()()}if(t&2){let A=y(4).$implicit;p(2),Fe(" ",A.inlineData.name," ")}}function vSA(t,e){if(t&1&&(m(0,"div")(1,"div"),V(2,pSA,2,1,"div",42)(3,DSA,2,1,"div")(4,wSA,6,1,"div")(5,ySA,3,1,"div"),D()()),t&2){let A,i=y(3).$implicit,n=y(2);p(2),W((A=i.inlineData.mediaType)===n.MediaType.IMAGE?2:A===n.MediaType.AUDIO?3:A===n.MediaType.TEXT?4:5)}}function bSA(t,e){if(t&1){let A=zA();m(0,"div")(1,"img",47),$("click",function(){rA(A);let n=y(4).$implicit,o=y(2);return sA(o.openViewImageDialog.emit(n.inlineData.data))}),D()()}if(t&2){let A=y(4).$implicit;p(),X("src",A.inlineData.data,Da)}}function MSA(t,e){if(t&1&&(m(0,"div",32)(1,"mat-icon"),K(2,"insert_drive_file"),D(),m(3,"a",34),K(4),D()()),t&2){let A=y(4).$implicit;p(3),X("href",A.inlineData.data,Da),p(),qA(A.inlineData.displayName)}}function kSA(t,e){if(t&1&&(m(0,"div"),V(1,bSA,2,1,"div")(2,MSA,5,2,"div",32),D()),t&2){let A=y(3).$implicit;p(),W(A.inlineData.mimeType.startsWith("image/")?1:2)}}function SSA(t,e){if(t&1&&V(0,vSA,6,1,"div")(1,kSA,3,1,"div"),t&2){let A=y(2).$implicit;W(A.role==="bot"?0:1)}}function xSA(t,e){if(t&1&&(m(0,"div",50)(1,"div",51),K(2),D(),GA(3,"ngx-json-viewer",52),D(),m(4,"div",53)(5,"div",54),K(6),D(),GA(7,"ngx-json-viewer",52),D()),t&2){let A=y(3).$implicit,i=y(2);p(2),qA(i.i18n.actualToolUsesLabel),p(),X("json",A.actualInvocationToolUses),p(3),qA(i.i18n.expectedToolUsesLabel),p(),X("json",A.expectedInvocationToolUses)}}function RSA(t,e){if(t&1&&(m(0,"div",50)(1,"div",51),K(2),D(),m(3,"div"),K(4),D()(),m(5,"div",53)(6,"div",54),K(7),D(),m(8,"div"),K(9),D()()),t&2){let A=y(3).$implicit,i=y(2);p(2),qA(i.i18n.actualResponseLabel),p(2),qA(A.actualFinalResponse),p(3),qA(i.i18n.expectedResponseLabel),p(2),qA(A.expectedFinalResponse)}}function NSA(t,e){if(t&1&&(m(0,"div",49)(1,"span",55),K(2),D(),m(3,"span",56),K(4),D()()),t&2){let A=y(3).$implicit,i=y(2);p(2),Dc("",i.i18n.matchScoreLabel,": ",A.evalScore),p(2),Dc("",i.i18n.thresholdLabel,": ",A.evalThreshold)}}function FSA(t,e){if(t&1&&(m(0,"div",31)(1,"div",48),V(2,xSA,8,4)(3,RSA,10,4),D(),V(4,NSA,5,4,"div",49),D()),t&2){let A=y(2).$implicit;p(2),W(A.actualInvocationToolUses?2:A.actualFinalResponse?3:-1),p(2),W(A.evalScore!==void 0&&A.evalThreshold!==void 0?4:-1)}}function LSA(t,e){if(t&1&&(m(0,"mat-card",26),V(1,rSA,1,0,"mat-progress-bar",27),V(2,ISA,3,0,"div",28),m(3,"div"),V(4,dSA,2,1,"div",29),m(5,"div"),V(6,ESA,2,1),D(),V(7,hSA,2,1,"div"),V(8,uSA,1,3,"app-a2ui-canvas",30),D(),V(9,fSA,2,1,"code"),V(10,mSA,5,4,"div"),V(11,SSA,2,1),V(12,FSA,5,2,"div",31),D()),t&2){let A=y(),i=A.$implicit,n=A.$index,o=y(2);ae("landing-message",i.isLanding),X("ngClass",fl(13,ZkA,i.evalStatus===2,o.shouldMessageHighlighted(n))),p(),W(i.isLoading?1:-1),p(),W(i.attachments?2:-1),p(2),W(i.thought?4:-1),p(2),W(i.text?6:-1),p(),W(i.renderedContent?7:-1),p(),W(i.a2uiData?8:-1),p(),W(i.executableCode?9:-1),p(),W(i.codeExecutionResult?10:-1),p(),W(i.inlineData?11:-1),p(),W(i.failedMetric&&i.evalStatus===2?12:-1)}}function _SA(t,e){if(t&1){let A=zA();m(0,"app-computer-action",60),$("clickEvent",function(n){rA(A);let o=y(5);return sA(o.clickEvent.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X("functionCall",A)("allMessages",n.messages)("index",i)}}function GSA(t,e){if(t&1&&(m(0,"button",58)(1,"mat-icon"),K(2,"bolt"),D(),K(3),D()),t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X("ngClass",zr(3,ly,n.shouldMessageHighlighted(i)))("appJsonTooltip",A.args?n.JSON.stringify(A.args):""),p(3),Fe(" ",A.name," ")}}function KSA(t,e){if(t&1){let A=zA();m(0,"app-long-running-response",61),$("responseComplete",function(n){rA(A);let o=y(5);return sA(o.longRunningResponseComplete.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(4);X("functionCall",A)("appName",i.appName)("userId",i.userId)("sessionId",i.sessionId)}}function USA(t,e){if(t&1&&(V(0,_SA,1,3,"app-computer-action",57)(1,GSA,4,5,"button",58),V(2,KSA,1,4,"app-long-running-response",59)),t&2){let A=e.$implicit,i=y(4);W(i.isComputerUseClick(A)?0:1),p(2),W(A.needsResponse?2:-1)}}function JSA(t,e){if(t&1&&Gt(0,USA,3,2,null,null,Ri),t&2){let A=y().$implicit;Kt(A.functionCalls)}}function YSA(t,e){if(t&1){let A=zA();m(0,"app-computer-action",63),$("clickEvent",function(n){rA(A);let o=y(5);return sA(o.clickEvent.emit(n))}),D()}if(t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X("functionResponse",A)("allMessages",n.messages)("index",i)}}function HSA(t,e){if(t&1&&(m(0,"button",58)(1,"mat-icon"),K(2,"check"),D(),K(3),D()),t&2){let A=y().$implicit,i=y(2).$index,n=y(2);X("ngClass",zr(3,ly,n.shouldMessageHighlighted(i)))("appJsonTooltip",A.response?n.JSON.stringify(A.response):""),p(3),Fe(" ",A.name," ")}}function TSA(t,e){if(t&1&&V(0,YSA,1,3,"app-computer-action",62)(1,HSA,4,5,"button",58),t&2){let A=e.$implicit,i=y(4);W(i.isComputerUseResponse(A)?0:1)}}function OSA(t,e){if(t&1&&Gt(0,TSA,2,1,null,null,Ri),t&2){let A=y().$implicit;Kt(A.functionResponses)}}function zSA(t,e){if(t&1&&(m(0,"button",17)(1,"mat-icon"),K(2,"data_object"),D(),K(3," State "),D()),t&2){let A=y().$index,i=y(2);X("ngClass",zr(2,ly,i.shouldMessageHighlighted(A)))("appJsonTooltip",i.getStateDeltaTooltip(A))}}function PSA(t,e){if(t&1&&(m(0,"button",18)(1,"mat-icon"),K(2,"attachment"),D(),K(3," Artifact "),D()),t&2){let A=y().$index,i=y(2);X("ngClass",zr(2,ly,i.shouldMessageHighlighted(A)))("appJsonTooltip",i.getArtifactDeltaTooltip(A))}}function jSA(t,e){if(t&1){let A=zA();m(0,"div")(1,"span",64),$("click",function(){rA(A);let n=y(2).$implicit,o=y(2);return sA(o.editEvalCaseMessage.emit(n))}),K(2," edit "),D(),m(3,"span",64),$("click",function(){rA(A);let n=y(2),o=n.$implicit,a=n.$index,r=y(2);return sA(r.deleteEvalCaseMessage.emit({message:o,index:a}))}),K(4," delete "),D()()}if(t&2){let A=y(4);p(),X("ngClass",zr(4,nF,A.isEvalCaseEditing))("matTooltip",A.i18n.editEvalMessageTooltip),p(2),X("ngClass",zr(6,nF,A.isEvalCaseEditing))("matTooltip",A.i18n.deleteEvalMessageTooltip)}}function qSA(t,e){if(t&1){let A=zA();m(0,"div")(1,"span",64),$("click",function(){rA(A);let n=y(2).$implicit,o=y(2);return sA(o.editFunctionArgs.emit(n))}),K(2," edit "),D()()}if(t&2){let A=y(4);p(),X("ngClass",zr(2,nF,A.isEvalCaseEditing))("matTooltip",A.i18n.editFunctionArgsTooltip)}}function VSA(t,e){if(t&1&&V(0,jSA,5,8,"div")(1,qSA,3,4,"div"),t&2){let A=y().$implicit,i=y(2);W(A.text?0:i.isEditFunctionArgsEnabled&&A.functionCalls&&A.functionCalls.length>0?1:-1)}}function WSA(t,e){t&1&&(m(0,"button",20)(1,"mat-icon"),K(2,"person"),D()())}function ZSA(t,e){if(t&1&&GA(0,"app-message-feedback",21),t&2){let A=y().$implicit,i=y(2);X("sessionName",i.sessionName())("eventId",A.eventId)}}function XSA(t,e){if(t&1){let A=zA();m(0,"div",9)(1,"div",11),$("click",function(n){let o=rA(A),a=o.$implicit,r=o.$index,s=y(2);return sA(s.handleRowClick(n,a,r))}),V(2,tSA,3,1,"div",12),m(3,"div",13),V(4,oSA,3,1,"div",14),V(5,aSA,3,7,"button",15),V(6,LSA,13,16,"mat-card",16),V(7,JSA,2,0),V(8,OSA,2,0),V(9,zSA,4,4,"button",17),V(10,PSA,4,4,"button",18),m(11,"div",13)(12,"span",19),K(13),D(),m(14,"span"),K(15),D()(),V(16,VSA,2,1),V(17,WSA,3,0,"button",20),D()(),V(18,ZSA,1,2,"app-message-feedback",21),D()}if(t&2){let A=e.$implicit,i=e.$index,n=y(2);p(),X("ngClass",zr(16,jkA,n.isMessageEventSelected(i))),p(),W(A.role==="user"?2:-1),p(),X("ngClass",fl(18,qkA,A.role==="user",A.role==="bot")),p(),W(A.role==="bot"&&!A.isLoading?4:-1),p(),W(A.role==="bot"?5:-1),p(),W(n.shouldShowMessageCard(A)?6:-1),p(),W(A.functionCalls&&A.functionCalls.length>0?7:-1),p(),W(A.functionResponses&&A.functionResponses.length>0?8:-1),p(),W(A.role==="bot"&&n.hasStateDelta(i)?9:-1),p(),W(A.role==="bot"&&n.hasArtifactDelta(i)?10:-1),p(),X("ngClass",fl(21,VkA,A.evalStatus===1,A.evalStatus===2)),p(2),qA(A.evalStatus===1?"check":A.evalStatus===2?"close":""),p(2),qA(A.evalStatus===1?n.i18n.evalPassLabel:A.evalStatus===2?n.i18n.evalFailLabel:""),p(),W(n.evalCase&&A.role==="bot"&&n.isEvalEditMode?16:-1),p(),W(A.role==="user"?17:-1),p(),W(n.isUserFeedbackEnabled()&&!n.isLoadingAgentResponse()&&A.role==="bot"?18:-1)}}function $SA(t,e){if(t&1){let A=zA();m(0,"div",7,0),$("scroll",function(n){rA(A);let o=y();return sA(o.onScroll.next(n))}),V(2,$kA,2,0,"div",8),oi(3,"async"),oi(4,"async"),GA(5,"div",null,1),Gt(7,XSA,19,24,"div",9,Ri),D()}if(t&2){let A=y();p(2),W(li(3,1,A.uiStateService.isMessagesLoading())&&li(4,3,A.featureFlagService.isInfinityMessageScrollingEnabled())?2:-1),p(5),Kt(A.messages)}}function AxA(t,e){if(t&1){let A=zA();m(0,"div",77),GA(1,"img",78),m(2,"button",79),$("click",function(){rA(A);let n=y().$index,o=y(4);return sA(o.removeFile.emit(n))}),m(3,"mat-icon",80),K(4,"close"),D()()()}if(t&2){let A=y().$implicit;p(),X("src",A.url,Da)}}function exA(t,e){if(t&1){let A=zA();m(0,"div",76)(1,"button",79),$("click",function(){rA(A);let n=y().$index,o=y(4);return sA(o.removeFile.emit(n))}),m(2,"mat-icon",80),K(3,"close"),D()(),m(4,"div",81)(5,"mat-icon"),K(6,"insert_drive_file"),D(),m(7,"span"),K(8),D()()()}if(t&2){let A=y().$implicit;p(8),qA(A.file.name)}}function txA(t,e){if(t&1&&(m(0,"div"),V(1,AxA,5,1,"div",77)(2,exA,9,1,"div",76),D()),t&2){let A=e.$implicit;p(),W(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function ixA(t,e){if(t&1){let A=zA();m(0,"div",76)(1,"button",79),$("click",function(){rA(A);let n=y(4);return sA(n.removeStateUpdate.emit())}),m(2,"mat-icon",80),K(3,"close"),D()(),m(4,"div",81)(5,"span"),K(6),D()()()}if(t&2){let A=y(4);p(6),qA(A.i18n.updatedSessionStateChipLabel)}}function nxA(t,e){if(t&1&&(m(0,"div",68),Gt(1,txA,3,1,"div",null,Ri),V(3,ixA,7,1,"div",76),D()),t&2){let A=y(3);p(),Kt(A.selectedFiles),p(2),W(A.updatedSessionState?3:-1)}}function oxA(t,e){if(t&1){let A=zA();m(0,"div",65)(1,"input",66,3),$("change",function(n){rA(A);let o=y(2);return sA(o.fileSelect.emit(n))}),D(),m(3,"mat-form-field",67),V(4,nxA,4,1,"div",68),m(5,"textarea",69),$("ngModelChange",function(n){rA(A);let o=y(2);return sA(o.userInputChange.emit(n))})("keydown.enter",function(n){rA(A);let o=y(2);return sA(o.sendMessage.emit(n))}),D(),m(6,"div",70)(7,"div")(8,"button",71),oi(9,"async"),$("click",function(){rA(A);let n=Wi(2);return sA(n.click())}),m(10,"mat-icon"),K(11,"attach_file"),D()(),m(12,"button",72),oi(13,"async"),m(14,"mat-icon"),K(15,"more_vert"),D()(),m(16,"mat-menu",null,4)(18,"span",73),$("click",function(){rA(A);let n=y(2);return sA(n.updateState.emit())}),K(19),D()()(),m(20,"div")(21,"button",74),oi(22,"async"),$("click",function(){rA(A);let n=y(2);return sA(n.toggleAudioRecording.emit())}),m(23,"mat-icon"),K(24,"mic"),D()(),m(25,"button",75),oi(26,"async"),$("click",function(){rA(A);let n=y(2);return sA(n.toggleVideoRecording.emit())}),m(27,"mat-icon"),K(28,"videocam"),D()()()()()()}if(t&2){let A=Wi(17),i=y(2);p(4),W(i.selectedFiles.length&&i.appName!=""||i.updatedSessionState?4:-1),p(),X("ngModel",i.userInput)("placeholder",i.i18n.typeMessagePlaceholder),p(3),X("matTooltip",i.i18n.uploadFileTooltip)("disabled",!li(9,18,i.isMessageFileUploadEnabledObs)),p(4),X("matMenuTriggerFor",A)("matTooltip",i.i18n.moreOptionsTooltip)("disabled",!li(13,20,i.isManualStateUpdateEnabledObs)),p(6),X("matTooltip",i.i18n.updateStateMenuTooltip),p(),Fe(" ",i.i18n.updateStateMenuLabel," "),p(2),ae("recording",i.isAudioRecording),X("matTooltip",i.isAudioRecording?i.i18n.turnOffMicTooltip:i.i18n.useMicTooltip)("disabled",!li(22,22,i.isBidiStreamingEnabledObs)),p(4),ae("recording",i.isVideoRecording),X("matTooltip",i.isVideoRecording?i.i18n.turnOffCamTooltip:i.i18n.useCamTooltip)("disabled",!li(26,24,i.isBidiStreamingEnabledObs))}}function axA(t,e){if(t&1&&V(0,oxA,29,26,"div",65),t&2){let A=y();W(A.canEditSession()?0:-1)}}function rxA(t,e){t&1&&(m(0,"div",6),GA(1,"mat-progress-spinner",82),D())}var rtA="root_agent",FE=class t{appName="";sessionName=nt("");messages=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;eventData=new Map;selectedEvent=void 0;isAudioRecording=!1;isVideoRecording=!1;hoveredEventMessageIndices=[];userId="";sessionId="";userInputChange=new WA;userEditEvalCaseMessageChange=new WA;clickEvent=new WA;handleKeydown=new WA;cancelEditMessage=new WA;saveEditMessage=new WA;openViewImageDialog=new WA;openBase64InNewTab=new WA;editEvalCaseMessage=new WA;deleteEvalCaseMessage=new WA;editFunctionArgs=new WA;fileSelect=new WA;removeFile=new WA;removeStateUpdate=new WA;sendMessage=new WA;updateState=new WA;toggleAudioRecording=new WA;toggleVideoRecording=new WA;longRunningResponseComplete=new WA;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;scrollHeight=0;lastMessageRef=null;nextPageToken="";i18n=h(atA);uiStateService=h(Tg);stringToColorService=h(CB);markdownComponent=h(pE);featureFlagService=h(lr);agentService=h(Ks);sessionService=h(Hg);destroyRef=h(Wa);MediaType=i1;JSON=JSON;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=jA(!0);isUserFeedbackEnabled=Is(this.featureFlagService.isFeedbackServiceEnabled());isLoadingAgentResponse=Is(this.agentService.getLoadingState());onScroll=new $A;sanitizer=h(Wr);constructor(){pa(()=>{let e=this.sessionName();e&&(this.nextPageToken="",this.uiStateService.lazyLoadMessages(e,{pageSize:100,pageToken:this.nextPageToken}).pipe(po()).subscribe())})}ngOnInit(){this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po(),We(e=>e),Ei(()=>Qi(this.uiStateService.onNewMessagesLoaded().pipe(Wt(e=>{this.nextPageToken=e.nextPageToken??"",e.isBackground||this.restoreScrollPosition()})),this.onScroll.pipe(Ei(e=>{let A=e.target;return A.scrollTop!==0?xa:this.nextPageToken?(this.scrollHeight=A.scrollHeight,this.uiStateService.lazyLoadMessages(this.sessionName(),{pageSize:100,pageToken:this.nextPageToken}).pipe(po(),Ho(()=>iL))):xa})))),br(this.destroyRef)).subscribe()}ngAfterViewInit(){this.scrollContainer?.nativeElement&&(this.scrollContainer.nativeElement.addEventListener("wheel",()=>{this.scrollInterrupted=!0}),this.scrollContainer.nativeElement.addEventListener("touchmove",()=>{this.scrollInterrupted=!0}))}ngOnChanges(e){if(e.messages){let A=this.messages[this.messages.length-1];A!==this.lastMessageRef&&((A?.role==="user"||A?.isLoading===!0)&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.lastMessageRef=A}}scrollToBottom(){this.scrollInterrupted||setTimeout(()=>{this.scrollContainer?.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"})},50)}getAgentNameFromEvent(e){let A=this.messages[e].eventId;return this.eventData.get(A)?.author??rtA}customIconColorClass(e){let A=this.getAgentNameFromEvent(e);return A!==rtA?`custom-icon-color-${this.stringToColorService.stc(A).replace("#","")}`:""}shouldMessageHighlighted(e){return this.hoveredEventMessageIndices.includes(e)}isMessageEventSelected(e){let A=this.messages[e];return A.eventId&&this.selectedEvent&&A.eventId===this.selectedEvent.id}shouldShowMessageCard(e){return!!(e.text||e.attachments||e.inlineData||e.executableCode||e.codeExecutionResult||e.a2uiData||e.renderedContent||e.isLoading||e.failedMetric&&e.evalStatus===2)}getBotEventNumber(e){let A=this.messages[e];if(A.role!=="bot"||!A.eventId)return-1;let i=[];for(let n=0;n<=e;n++){let o=this.messages[n];o.role==="bot"&&o.eventId&&!i.includes(o.eventId)&&i.push(o.eventId)}return i.indexOf(A.eventId)+1}getOverallEventNumber(e){let A=0,i=null,n=null;for(let o=0;o<=e;o++){let a=this.messages[o];if(a.role==="user"){if(i!=="user"&&(A++,i="user"),o===e)return A}else if(a.role==="bot"&&a.eventId&&(a.eventId!==n&&(A++,n=a.eventId,i="bot"),o===e))return A}return-1}isFirstUserMessageInGroup(e){return this.messages[e].role!=="user"?!1:e===0?!0:this.messages[e-1].role!=="user"}isFirstMessageInEventGroup(e){let A=this.messages[e];return A.role!=="bot"||!A.eventId?!1:e===0?!0:this.messages[e-1].eventId!==A.eventId}hasStateDelta(e){let A=this.messages[e];if(!A.eventId)return!1;let n=this.eventData.get(A.eventId)?.actions?.stateDelta;return n&&Object.keys(n).length>0}hasArtifactDelta(e){let A=this.messages[e];if(!A.eventId)return!1;let n=this.eventData.get(A.eventId)?.actions?.artifactDelta;return n&&Object.keys(n).length>0}renderGooglerSearch(e){return this.sanitizer.bypassSecurityTrustHtml(e)}restoreScrollPosition(){if(!this.scrollHeight){this.scrollInterrupted=!1,this.scrollToBottom();return}let e=this.scrollContainer?.nativeElement;e&&(e.scrollTop=e.scrollHeight-this.scrollHeight,this.scrollHeight=0)}isComputerUseClick(e){return ty(e)}isComputerUseResponse(e){return NE(e)}getFunctionCallArgsTooltip(e){if(!e.functionCall||!e.functionCall.args)return"";try{return JSON.stringify(e.functionCall.args)}catch(A){return String(e.functionCall.args)}}getFunctionResponseTooltip(e){if(!e.functionResponse||!e.functionResponse.response)return"";try{return JSON.stringify(e.functionResponse.response)}catch(A){return String(e.functionResponse.response)}}getStateDeltaTooltip(e){let A=this.messages[e];if(!A.eventId)return"";let n=this.eventData.get(A.eventId)?.actions?.stateDelta;if(!n)return"";try{return JSON.stringify(n)}catch(o){return String(n)}}getArtifactDeltaTooltip(e){let A=this.messages[e];if(!A.eventId)return"";let n=this.eventData.get(A.eventId)?.actions?.artifactDelta;if(!n)return"";try{return JSON.stringify(n)}catch(o){return String(n)}}handleRowClick(e,A,i){let n=window.getSelection();n&&n.toString().length>0||this.clickEvent.emit(i)}handleKeyboardNavigation(e){if(!this.selectedEvent||e.key!=="ArrowUp"&&e.key!=="ArrowDown")return;e.preventDefault();let A=new Map;for(let a=0;athis.messages[a].eventId===this.selectedEvent.id);if(n===-1)return;let o;e.key==="ArrowDown"?o=n+1>=i.length?0:n+1:o=n-1<0?i.length-1:n-1,this.clickEvent.emit(i[o]),setTimeout(()=>{if(!this.scrollContainer?.nativeElement)return;let a=this.scrollContainer.nativeElement.querySelectorAll(".message-column-container");a&&a[i[o]]&&a[i[o]].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})},0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-chat-panel"]],viewQuery:function(A,i){if(A&1&&ni(OkA,5,ge)(zkA,5)(PkA,5),A&2){let n;Ce(n=Ie())&&(i.videoContainer=n.first),Ce(n=Ie())&&(i.scrollContainer=n.first),Ce(n=Ie())&&(i.textarea=n.first)}},hostBindings:function(A,i){A&1&&$("keydown",function(o){return i.handleKeyboardNavigation(o)},RC)},inputs:{appName:"appName",sessionName:[1,"sessionName"],messages:"messages",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",eventData:"eventData",selectedEvent:"selectedEvent",isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",hoveredEventMessageIndices:"hoveredEventMessageIndices",userId:"userId",sessionId:"sessionId"},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording",longRunningResponseComplete:"longRunningResponseComplete"},features:[ei],decls:5,vars:5,consts:[["autoScroll",""],["videoContainer",""],["messageTextarea",""],["fileInput",""],["moreMenu","matMenu"],[1,"chat-messages"],[1,"loading-spinner-container"],[1,"chat-messages",3,"scroll"],[1,"messages-loading-container"],[1,"message-row-container"],["mode","indeterminate"],[1,"message-column-container",3,"click","ngClass"],[1,"event-number-container","user-event-number"],[3,"ngClass"],[1,"event-number-container"],["mat-mini-fab","",3,"disabled","matTooltip","class","ngClass"],[1,"message-card",3,"landing-message","ngClass"],["mat-stroked-button","",1,"function-event-button","state-delta-button",3,"ngClass","appJsonTooltip"],["mat-stroked-button","",1,"function-event-button","artifact-delta-button",3,"ngClass","appJsonTooltip"],[1,"material-symbols-outlined"],["mat-mini-fab",""],[3,"sessionName","eventId"],[1,"event-number-label"],[1,"event-number-placeholder"],["mat-mini-fab","",3,"disabled","matTooltip","ngClass"],["fontSet","material-symbols-outlined"],[1,"message-card",3,"ngClass"],["mode","buffer",1,"loading-bar"],[1,"attachments"],[1,"thought-chip"],[3,"beginRendering","surfaceUpdate","dataModelUpdate"],[1,"eval-compare-container"],[1,"attachment"],["alt","attachment",1,"image-preview-chat",3,"src"],["download","",3,"href"],[1,"edit-message-container"],[3,"ngComponentOutlet","ngComponentOutletInputs"],["rows","4","cols","80",1,"message-textarea",3,"ngModelChange","keydown","ngModel"],[1,"edit-message-buttons-container"],[1,"material-symbols-outlined","cancel-edit-button",3,"click","matTooltip"],[1,"material-symbols-outlined","save-edit-button",3,"click","matTooltip"],[3,"innerHTML"],[1,"generated-image-container"],["alt","image",1,"generated-image",3,"click","src"],[3,"base64data"],[1,"html-artifact-container"],[1,"link-style-button",3,"click"],["alt","image",1,"image-preview-chat",3,"click","src"],[1,"actual-expected-compare-container"],[1,"score-threshold-container"],[1,"actual-result"],[1,"eval-response-header","header-actual"],[3,"json"],[1,"expected-result"],[1,"eval-response-header","header-expected"],[1,"header-actual"],[1,"header-expected"],[3,"functionCall","allMessages","index"],["mat-stroked-button","",1,"function-event-button",3,"ngClass","appJsonTooltip"],[3,"functionCall","appName","userId","sessionId"],[3,"clickEvent","functionCall","allMessages","index"],[3,"responseComplete","functionCall","appName","userId","sessionId"],[3,"functionResponse","allMessages","index"],[3,"clickEvent","functionResponse","allMessages","index"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"],[1,"chat-input"],["type","file","multiple","","hidden","",3,"change"],["appearance","outline",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder"],[1,"chat-input-actions"],["mat-icon-button","",1,"function-event-button",3,"click","matTooltip","disabled"],["mat-icon-button","",1,"function-event-button",3,"matMenuTriggerFor","matTooltip","disabled"],["mat-menu-item","",3,"click","matTooltip"],["mat-icon-button","","matSuffix","",1,"audio-rec-btn",3,"click","matTooltip","disabled"],["mat-icon-button","","matSuffix","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mode","indeterminate","diameter","50"]],template:function(A,i){if(A&1&&(wr(0),oi(1,"async"),V(2,$SA,9,5,"div",5),V(3,axA,1,1),V(4,rxA,2,0,"div",6)),A&2){let n=li(1,3,i.uiStateService.isSessionLoading());p(2),W(i.appName!=""&&!n?2:-1),p(),W(i.appName!=""&&i.isChatMode&&!n?3:-1),p(),W(n?4:-1)}},dependencies:[oa,Rg,FC,yn,ro,so,Ca,Ug,In,UU,nB,ttA,ey,Cs,vn,em,Ia,Fg,wa,To,n7,nm,_d,vr,b$,E0,DC,fE,ntA,uI,Gc,XC,oy,wB,gy,WC,Ba,ny,ay,ry,Pr],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.message-card.message-card--highlighted[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color)}.message-card.landing-message[_ngcontent-%COMP%]{border:2px solid var(--chat-panel-landing-message-border-color, #4285f4);background-color:var(--chat-panel-landing-message-background-color, #e8f0fe)}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-background-color);margin:5px;font-size:13px!important;padding:6px 12px!important;min-height:32px!important;height:32px!important}.function-event-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px!important;width:18px!important;height:18px!important}.state-delta-button[_ngcontent-%COMP%], .artifact-delta-button[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-background-color)!important}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color);border-color:var(--chat-panel-function-event-button-highlight-border-color)!important;color:var(--chat-panel-function-event-button-highlight-color)!important}.message-column-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;margin-left:-20px;margin-right:-20px;padding:8px 20px;border:2px solid transparent;border-radius:4px;background-color:transparent;transition:background-color .2s ease;cursor:pointer}.message-column-container[_ngcontent-%COMP%]:hover{background-color:#4285f414}.message-column-container.selected[_ngcontent-%COMP%]{background-color:#4285f433!important;border:2px solid rgba(66,133,244,.6);border-radius:4px}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center;flex-grow:1}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-panel-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;flex-grow:1}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-panel-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-panel-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-panel-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-panel-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-panel-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-panel-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-panel-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-panel-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-panel-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-fail-color)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.chat-input[_ngcontent-%COMP%]{display:flex;padding:10px;width:60%;margin:0 auto;position:relative;z-index:1}.input-field[_ngcontent-%COMP%]{flex-grow:1;position:relative;z-index:1}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-textarea-color);border:none;padding:10px;box-sizing:content-box;caret-color:var(--chat-panel-input-field-textarea-caret-color)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--chat-panel-input-field-textarea-placeholder-color)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-button-color);background-color:var(--chat-panel-input-field-button-background-color)}.chat-input-actions[_ngcontent-%COMP%]{width:106%;margin-top:10px;display:flex;justify-content:space-between;align-items:center;max-width:100%}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-left:10px;margin-right:10px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .mat-mdc-mini-fab{background-color:var(--chat-panel-mat-mdc-mini-fab-background-color, #4285f4)}[_nghost-%COMP%] .mat-mdc-mini-fab mat-icon{color:var(--chat-panel-mat-mdc-mini-fab-mat-icon-color, white)}[_nghost-%COMP%] .mat-mdc-mini-fab.mat-mdc-button-disabled{background-color:#fff3!important}[_nghost-%COMP%] .mat-mdc-mini-fab.mat-mdc-button-disabled mat-icon{color:#fff9!important}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}[_nghost-%COMP%] .input-field .mat-mdc-text-field-wrapper{border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);border-radius:16px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;background-color:var(--chat-panel-delete-button-background-color);border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--chat-panel-delete-button-color);display:flex;align-items:center;justify-content:center;margin-right:0;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;background-color:var(--chat-panel-file-container-background-color);border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.thought-chip[_ngcontent-%COMP%]{border-radius:5px;background-color:var(--chat-panel-thought-chip-background-color);width:80px;text-align:center;margin-top:5px}.event-number-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-self:center;min-width:30px}.bot-message[_ngcontent-%COMP%] .event-number-container[_ngcontent-%COMP%]{margin-right:8px}.user-event-number[_ngcontent-%COMP%]{margin-right:8px;align-self:center}.event-number-label[_ngcontent-%COMP%], .event-number-placeholder[_ngcontent-%COMP%]{font-size:14px;font-weight:600;text-align:center;display:inline-block}.event-number-label[_ngcontent-%COMP%]{color:var(--chat-panel-event-number-label-color, #5f6368)}.event-number-placeholder[_ngcontent-%COMP%]{visibility:hidden}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--chat-panel-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-mat-mdc-text-field-wrapper-border-color);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}button.audio-rec-btn[_ngcontent-%COMP%], button.video-rec-btn[_ngcontent-%COMP%]{background-color:var(--chat-card-background-color)}button.audio-rec-btn.recording[_ngcontent-%COMP%], button.video-rec-btn.recording[_ngcontent-%COMP%]{background-color:var(--chat-panel-eval-fail-color)}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.messages-loading-container[_ngcontent-%COMP%]{margin-top:1em;margin-bottom:1em}"]})};var sxA={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},stA=new wA("Edit Json Dialog Messages",{factory:()=>sxA});var Wu=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent=Xo(cc);jsonString="";functionName="";i18n=h(stA);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert(this.i18n.invalidJsonAlert+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \u0275cmp=kA({type:t,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,i){A&1&&Or(i.jsonEditorComponent,cc,5),A&2&&rr()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(m(0,"div",0)(1,"h2",1),K(2),D(),m(3,"mat-dialog-content",2),K(4),GA(5,"app-json-editor",3),D(),m(6,"mat-dialog-actions",4)(7,"button",5),K(8),D(),m(9,"button",6),$("click",function(){return i.onSave()}),K(10),D()()()),A&2&&(p(2),qA(i.data.dialogHeader),p(2),Fe(" ",i.functionName," "),p(),X("jsonString",i.jsonString),p(3),qA(i.i18n.cancelButton),p(2),qA(i.i18n.saveButton))},dependencies:[ya,gr,cc,Ta,vn,VC],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};var gxA=[[["caption"]],[["colgroup"],["col"]],"*"],lxA=["caption","colgroup, col","*"];function cxA(t,e){t&1&&He(0,2)}function CxA(t,e){t&1&&(m(0,"thead",0),$i(1,1),D(),m(2,"tbody",0),$i(3,2)(4,3),D(),m(5,"tfoot",0),$i(6,4),D())}function IxA(t,e){t&1&&$i(0,1)(1,2)(2,3)(3,4)}var Bc=new wA("CDK_TABLE");var Iy=(()=>{class t{template=h(Fn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkCellDef",""]]})}return t})(),dy=(()=>{class t{template=h(Fn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkHeaderCellDef",""]]})}return t})(),ctA=(()=>{class t{template=h(Fn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkFooterCellDef",""]]})}return t})(),LE=(()=>{class t{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkColumnDef",""]],contentQueries:function(i,n,o){if(i&1&&na(o,Iy,5)(o,dy,5)(o,ctA,5),i&2){let a;Ce(a=Ie())&&(n.cell=a.first),Ce(a=Ie())&&(n.headerCell=a.first),Ce(a=Ie())&&(n.footerCell=a.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",he],stickyEnd:[2,"stickyEnd","stickyEnd",he]}})}return t})(),Cy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},CtA=(()=>{class t extends Cy{constructor(){super(h(LE),h(ge))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[Ct]})}return t})();var ItA=(()=>{class t extends Cy{constructor(){let A=h(LE),i=h(ge);super(A,i);let n=A._table?._getCellRole();n&&i.nativeElement.setAttribute("role",n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[Ct]})}return t})();var aF=(()=>{class t{template=h(Fn);_differs=h(kI);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let i=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof Xu?A.headerCell.template:this instanceof rF?A.footerCell.template:A.cell.template}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,features:[ei]})}return t})(),Xu=(()=>{class t extends aF{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(h(Fn),h(kI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",he]},features:[Ct,ei]})}return t})(),rF=(()=>{class t extends aF{_table=h(Bc,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(h(Fn),h(kI))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",he]},features:[Ct,ei]})}return t})(),By=(()=>{class t extends aF{_table=h(Bc,{optional:!0});when;constructor(){super(h(Fn),h(kI))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[Ct]})}return t})(),Id=(()=>{class t{_viewContainer=h(Ro);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","cdkCellOutlet",""]]})}return t})(),sF=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["cdk-header-row"],["tr","cdk-header-row",""]],hostAttrs:["role","row",1,"cdk-header-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var gF=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})(),dtA=(()=>{class t{templateRef=h(Fn);_contentClassNames=["cdk-no-data-row","cdk-row"];_cellClassNames=["cdk-cell","cdk-no-data-cell"];_cellSelector="td, cdk-cell, [cdk-cell], .cdk-cell";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["ng-template","cdkNoDataRow",""]]})}return t})(),gtA=["top","bottom","left","right"],oF=class{_isNativeHtmlTable;_stickCellCss;_isBrowser;_needsPositionStickyOnElement;direction;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,i=!0,n=!0,o,a,r){this._isNativeHtmlTable=e,this._stickCellCss=A,this._isBrowser=i,this._needsPositionStickyOnElement=n,this.direction=o,this._positionListener=a,this._tableInjector=r,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let i=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));Nn({write:()=>{for(let n of i)this._removeStickyStyle(n,A)}},{injector:this._tableInjector})}updateStickyColumns(e,A,i,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(E=>E)||i.some(E=>E))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let a=e[0],r=a.children.length,s=this.direction==="rtl",g=s?"right":"left",l=s?"left":"right",C=A.lastIndexOf(!0),I=i.indexOf(!0),d,B,Q;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...i]}),Nn({earlyRead:()=>{d=this._getCellWidths(a,n),B=this._getStickyStartColumnPositions(d,A),Q=this._getStickyEndColumnPositions(d,i)},write:()=>{for(let E of e)for(let f=0;f!!E)&&(this._positionListener.stickyColumnsUpdated({sizes:C===-1?[]:d.slice(0,C+1).map((E,f)=>A[f]?E:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:I===-1?[]:d.slice(I).map((E,f)=>i[f+I]?E:null).reverse()}))}},{injector:this._tableInjector})}stickRows(e,A,i){if(!this._isBrowser)return;let n=i==="bottom"?e.slice().reverse():e,o=i==="bottom"?A.slice().reverse():A,a=[],r=[],s=[];Nn({earlyRead:()=>{for(let g=0,l=0;g{let g=o.lastIndexOf(!0);for(let l=0;l{let i=e.querySelector("tfoot");i&&(A.some(n=>!n)?this._removeStickyStyle(i,["bottom"]):this._addStickyStyle(i,"bottom",0,!1))}},{injector:this._tableInjector})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){if(!e.classList.contains(this._stickCellCss))return;for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);gtA.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,i,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${i}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},i=0;for(let n of gtA)e.style[n]&&(i+=A[n]);return i?`${i}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=e.children;for(let o=0;o0;o--)A[o]&&(i[o]=n,n+=e[o]);return i}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let i=e.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(e){let A=!1;for(let i of e){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&dxA(i.target)&&(A=!0),this._elemSizeCache.set(i.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}};function dxA(t){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>t.classList.contains(e))}var Zu=new wA("STICKY_POSITIONING_LISTENER");var lF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","rowOutlet",""]]})}return t})(),cF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","headerRowOutlet",""]]})}return t})(),CF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","footerRowOutlet",""]]})}return t})(),IF=(()=>{class t{viewContainer=h(Ro);elementRef=h(ge);constructor(){let A=h(Bc);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","noDataRowOutlet",""]]})}return t})(),dF=(()=>{class t{_differs=h(kI);_changeDetectorRef=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_platform=h(ci);_viewRepeater;_viewportRuler=h(Bs);_injector=h(ut);_virtualScrollViewport=h(JU,{optional:!0,host:!0});_positionListener=h(Zu,{optional:!0})||h(Zu,{optional:!0,skipSelf:!0});_document=h(Zt);_data;_renderedRange;_onDestroy=new $A;_renderRows;_renderChangeSubscription=null;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef=null;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow=null;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_headerRowStickyUpdates=new $A;_footerRowStickyUpdates=new $A;_disableVirtualScrolling=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&(this._switchDataSource(A),this._changeDetectorRef.markForCheck())}_dataSource;_dataSourceChanges=new $A;_dataStream=new $A;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._virtualScrollEnabled()?!0:this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;recycleRows=!1;contentChanged=new WA;viewChange=new Jt({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;constructor(){h(new bs("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE",this._dataDiffer=this._differs.find([]).create((i,n)=>this.trackBy?this.trackBy(n.dataIndex,n.data):n)}ngOnInit(){this._setupStickyStyler(),this._viewportRuler.change().pipe(Bt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._viewRepeater=this.recycleRows||this._virtualScrollEnabled()?new ap:new yp,this._virtualScrollEnabled()&&this._setupVirtualScrolling(this._virtualScrollViewport),this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._headerRowStickyUpdates.complete(),this._footerRowStickyUpdates.complete(),this._onDestroy.next(),this._onDestroy.complete(),A4(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,i,(n,o,a)=>this._getEmbeddedViewArgs(n.item,a),n=>n.item.data,n=>{n.operation===kl.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=ltA(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,i,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=ltA(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,i,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this.fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...i,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,a)=>{this._addStickyColumnStyles([o],this._headerRowDefs[a])}),this._rowDefs.forEach(o=>{let a=[];for(let r=0;r{this._addStickyColumnStyles([o],this._footerRowDefs[a])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}stickyColumnsUpdated(A){this._positionListener?.stickyColumnsUpdated(A)}stickyEndColumnsUpdated(A){this._positionListener?.stickyEndColumnsUpdated(A)}stickyHeaderRowsUpdated(A){this._headerRowStickyUpdates.next(A),this._positionListener?.stickyHeaderRowsUpdated(A)}stickyFooterRowsUpdated(A){this._footerRowStickyUpdates.next(A),this._positionListener?.stickyFooterRowsUpdated(A)}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){if(!Array.isArray(this._data)||!this._renderedRange)return[];let A=[],i=Math.min(this._data.length,this._renderedRange.end),n=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let o=this._renderedRange.start;o{let r=n&&n.has(a)?n.get(a):[];if(r.length){let s=r.shift();return s.dataIndex=i,s}else return{data:A,rowDef:a,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),cy(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=cy(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=cy(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=cy(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(i=>!i.when);this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(a,r)=>{let s=!!r.getColumnsDiff();return a||s},i=this._rowDefs.reduce(A,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(A){this._data=[],A4(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;A4(this.dataSource)?A=this.dataSource.connect(this):hd(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=oe(this.dataSource)),this._renderChangeSubscription=Va([A,this.viewChange]).pipe(Bt(this._onDestroy)).subscribe(([i,n])=>{this._data=i||[],this._renderedRange=n,this._dataStream.next(i),this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,i)=>this._renderRow(this._headerRowOutlet,A,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,i)=>this._renderRow(this._footerRowOutlet,A,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,i){let n=Array.from(i?.columns||[]).map(r=>{let s=this._columnDefsByName.get(r);return s}),o=n.map(r=>r.sticky),a=n.map(r=>r.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,a,!this.fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let i=[];for(let n=0;n!o.when||o.when(i,A));else{let o=this._rowDefs.find(a=>a.when&&a.when(i,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,i){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:i}}_renderRow(A,i,n,o={}){let a=A.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),a}_renderCellTemplateForItem(A,i){for(let n of this._getCellTemplates(A))Id.mostRecentCellOutlet&&Id.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let i=0,n=A.length;i{let n=this._columnDefsByName.get(i);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr",i=this._injector;this._stickyStyler=new oF(this._isNativeHtmlTable,this.stickyCssClass,this._platform.isBrowser,this.needsPositionStickyOnElement,A,this,i),(this._dir?this._dir.change:oe()).pipe(Bt(this._onDestroy)).subscribe(n=>{this._stickyStyler.direction=n,this.updateStickyColumnStyles()})}_setupVirtualScrolling(A){let i=typeof requestAnimationFrame<"u"?Qd:Iv;this.viewChange.next({start:0,end:0}),A.renderedRangeStream.pipe(yI(0,i),Bt(this._onDestroy)).subscribe(this.viewChange),A.attach({dataStream:this._dataStream,measureRangeSize:(n,o)=>this._measureRangeSize(n,o)}),Va([A.renderedContentOffset,this._headerRowStickyUpdates]).pipe(Bt(this._onDestroy)).subscribe(([n,o])=>{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a{if(!(!o.sizes||!o.offsets||!o.elements))for(let a=0;a!i._table||i._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(A.templateRef),a=o.rootNodes[0];if(o.rootNodes.length===1&&a?.nodeType===this._document.ELEMENT_NODE){a.setAttribute("role","row"),a.classList.add(...A._contentClassNames);let r=a.querySelectorAll(A._cellSelector);for(let s=0;s=A.end||i!=="vertical")return 0;let n=this.viewChange.value,o=this._rowOutlet.viewContainer;A.startn.end;let a=A.start-n.start,r=A.end-A.start,s,g;for(let I=0;I-1;I--){let d=o.get(I+a);if(d&&d.rootNodes.length){g=d.rootNodes[d.rootNodes.length-1];break}}let l=s?.getBoundingClientRect?.(),C=g?.getBoundingClientRect?.();return l&&C?C.bottom-l.top:0}_virtualScrollEnabled(){return!this._disableVirtualScrolling&&this._virtualScrollViewport!=null}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(i,n,o){if(i&1&&na(o,dtA,5)(o,LE,5)(o,By,5)(o,Xu,5)(o,rF,5),i&2){let a;Ce(a=Ie())&&(n._noDataRow=a.first),Ce(a=Ie())&&(n._contentColumnDefs=a),Ce(a=Ie())&&(n._contentRowDefs=a),Ce(a=Ie())&&(n._contentHeaderRowDefs=a),Ce(a=Ie())&&(n._contentFooterRowDefs=a)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(i,n){i&2&&ae("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",he],fixedLayout:[2,"fixedLayout","fixedLayout",he],recycleRows:[2,"recycleRows","recycleRows",he]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[It([{provide:Bc,useExisting:t},{provide:Zu,useValue:null}])],ngContentSelectors:lxA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Yt(gxA),He(0),He(1,1),V(2,cxA,1,0),V(3,CxA,7,0)(4,IxA,4,0)),i&2&&(p(2),W(n._isServer?2:-1),p(),W(n._isNativeHtmlTable?3:4))},dependencies:[cF,lF,IF,CF],styles:[`.cdk-table-fixed-layout{table-layout:fixed} `],encapsulation:2})}return t})();function cy(t,e){return t.concat(Array.from(e))}function ltA(t,e){let A=e.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===A)return i;if(n==="TABLE")break;i=i.parentNode}return null}var BxA=[[["caption"]],[["colgroup"],["col"]],"*"],QxA=["caption","colgroup, col","*"];function ExA(t,e){t&1&&He(0,2)}function hxA(t,e){t&1&&(m(0,"thead",0),$i(1,1),D(),m(2,"tbody",2),$i(3,3)(4,4),D(),m(5,"tfoot",0),$i(6,5),D())}function uxA(t,e){t&1&&$i(0,1)(1,3)(2,4)(3,5)}var BtA=(()=>{class t extends dF{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(i,n){i&2&&ae("mat-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[It([{provide:dF,useExisting:t},{provide:Bc,useExisting:t},{provide:Zu,useValue:null}]),Ct],ngContentSelectors:QxA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Yt(BxA),He(0),He(1,1),V(2,ExA,1,0),V(3,hxA,7,0)(4,uxA,4,0)),i&2&&(p(2),W(n._isServer?2:-1),p(),W(n._isNativeHtmlTable?3:4))},dependencies:[cF,lF,IF,CF],styles:[`.mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:var(--mat-table-header-container-height, 56px)}mat-row{min-height:var(--mat-table-row-item-container-height, 52px)}mat-footer-row{min-height:var(--mat-table-footer-container-height, 52px)}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mat-table-fixed-layout{table-layout:fixed}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:start;text-overflow:ellipsis}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:start}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch} `],encapsulation:2})}return t})(),QtA=(()=>{class t extends Iy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matCellDef",""]],features:[It([{provide:Iy,useExisting:t}]),Ct]})}return t})(),EtA=(()=>{class t extends dy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matHeaderCellDef",""]],features:[It([{provide:dy,useExisting:t}]),Ct]})}return t})();var htA=(()=>{class t extends LE{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[It([{provide:LE,useExisting:t}]),Ct]})}return t})(),utA=(()=>{class t extends CtA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[Ct]})}return t})();var ftA=(()=>{class t extends ItA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[Ct]})}return t})();var mtA=(()=>{class t extends Xu{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matHeaderRowDef",""]],inputs:{columns:[0,"matHeaderRowDef","columns"],sticky:[2,"matHeaderRowDefSticky","sticky",he]},features:[It([{provide:Xu,useExisting:t}]),Ct]})}return t})();var ptA=(()=>{class t extends By{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[It([{provide:By,useExisting:t}]),Ct]})}return t})(),DtA=(()=>{class t extends sF{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-header-row"],["tr","mat-header-row",""]],hostAttrs:["role","row",1,"mat-mdc-header-row","mdc-data-table__header-row"],exportAs:["matHeaderRow"],features:[It([{provide:sF,useExisting:t}]),Ct],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var wtA=(()=>{class t extends gF{static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[It([{provide:gF,useExisting:t}]),Ct],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&$i(0,0)},dependencies:[Id],encapsulation:2})}return t})();var fxA=9007199254740991,$u=class extends $h{_data;_renderData=new Jt([]);_filter=new Jt("");_internalPageChanges=new $A;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let i=e[A];if(Jf(i)){let n=Number(i);return n{let i=A.active,n=A.direction;return!i||n==""?e:e.sort((o,a)=>{let r=this.sortingDataAccessor(o,i),s=this.sortingDataAccessor(a,i),g=typeof r,l=typeof s;g!==l&&(g==="number"&&(r+=""),l==="number"&&(s+=""));let C=0;return r!=null&&s!=null?r>s?C=1:r{let i=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(i))};constructor(e=[]){super(),this._data=new Jt(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?Qi(this._sort.sortChange,this._sort.initialized):oe(null),A=this._paginator?Qi(this._paginator.page,this._internalPageChanges,this._paginator.initialized):oe(null),i=this._data,n=Va([i,this._filter]).pipe(fe(([r])=>this._filterData(r))),o=Va([n,e]).pipe(fe(([r])=>this._orderData(r))),a=Va([o,A]).pipe(fe(([r])=>this._pageData(r)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=a.subscribe(r=>this._renderData.next(r))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let i=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,i);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var ytA=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var Qy="0123456789abcdef",Ey=class t{constructor(e){this.bytes=e}static ofInner(e){if(e.length!==16)throw new TypeError("not 128-bit length");return new t(e)}static fromFieldsV7(e,A,i,n){if(!Number.isInteger(e)||!Number.isInteger(A)||!Number.isInteger(i)||!Number.isInteger(n)||e<0||A<0||i<0||n<0||e>0xffffffffffff||A>4095||i>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=e/2**40,o[1]=e/2**32,o[2]=e/2**24,o[3]=e/2**16,o[4]=e/2**8,o[5]=e,o[6]=112|A>>>8,o[7]=A,o[8]=128|i>>>24,o[9]=i>>>16,o[10]=i>>>8,o[11]=i,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new t(o)}static parse(e){var A,i,n,o;let a;switch(e.length){case 32:a=(A=/^[0-9a-f]{32}$/i.exec(e))===null||A===void 0?void 0:A[0];break;case 36:a=(i=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||i===void 0?void 0:i.slice(1,6).join("");break;case 38:a=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(e))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:a=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(e))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(a){let r=new Uint8Array(16);for(let s=0;s<16;s+=4){let g=parseInt(a.substring(2*s,2*s+8),16);r[s+0]=g>>>24,r[s+1]=g>>>16,r[s+2]=g>>>8,r[s+3]=g}return new t(r)}else throw new SyntaxError("could not parse UUID string")}toString(){let e="";for(let A=0;A>>4),e+=Qy.charAt(this.bytes[A]&15),(A===3||A===5||A===7||A===9)&&(e+="-");return e}toHex(){let e="";for(let A=0;A>>4),e+=Qy.charAt(this.bytes[A]&15);return e}toJSON(){return this.toString()}getVariant(){let e=this.bytes[8]>>>4;if(e<0)throw new Error("unreachable");if(e<=7)return this.bytes.every(A=>A===0)?"NIL":"VAR_0";if(e<=11)return"VAR_10";if(e<=13)return"VAR_110";if(e<=15)return this.bytes.every(A=>A===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new t(this.bytes.slice(0))}equals(e){return this.compareTo(e)===0}compareTo(e){for(let A=0;A<16;A++){let i=this.bytes[A]-e.bytes[A];if(i!==0)return Math.sign(i)}return 0}},BF=class{constructor(e){this.timestamp_biased=0,this.counter=0,this.random=e??mxA()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(e,A){let i=this.generateOrAbortCore(e,A);return i===void 0&&(this.timestamp_biased=0,i=this.generateOrAbortCore(e,A)),i}generateOrAbortCore(e,A){if(!Number.isInteger(e)||e<0||e>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit unsigned integer");if(A<0||A>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(e++,e>this.timestamp_biased)this.timestamp_biased=e,this.resetCounter();else if(e+A>=this.timestamp_biased)this.counter++,this.counter>4398046511103&&(this.timestamp_biased++,this.resetCounter());else return;return Ey.fromFieldsV7(this.timestamp_biased-1,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let e=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return e[6]=64|e[6]>>>4,e[8]=128|e[8]>>>2,Ey.ofInner(e)}},mxA=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new QF;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},QF=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},vtA;var hy=()=>pxA().toString(),pxA=()=>(vtA||(vtA=new BF)).generateV4();var uy=class t{evalService=h(Uc);data=h(da);dialogRef=h(Fo);newCaseId="case"+hy().slice(0,6);constructor(){}createNewEvalCase(){!this.newCaseId||this.newCaseId==""?alert("Cannot create eval set with empty id!"):this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe(e=>{this.dialogRef.close(!0)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(m(0,"h2",0),K(1,"Add Current Session To Eval Set"),D(),m(2,"mat-dialog-content"),K(3,` Please enter the eval case name `),D(),m(4,"mat-form-field",1)(5,"input",2),ao("ngModelChange",function(o){return Vn(i.newCaseId,o)||(i.newCaseId=o),o}),$("keydown.enter",function(){return i.createNewEvalCase()}),D()(),m(6,"mat-dialog-actions",3)(7,"button",4),K(8,"Cancel"),D(),m(9,"button",5),$("click",function(){return i.createNewEvalCase()}),K(10,"Create"),D()()),A&2&&(p(5),oo("ngModel",i.newCaseId))},dependencies:[ya,gr,To,wa,yn,ro,so,Ca,Ta,vn,VC],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important;background-color:transparent!important}html.darkmode [_nghost-%COMP%] .mat-mdc-text-field-wrapper{background-color:#3f3f42}"]})};var DxA={allEvalSetsHeader:"All eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run Evaluation",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"Add current session to"},btA=new wA("Eval Tab Messages",{factory:()=>DxA});var fy=class t{evalService=h(Uc);data=h(da);dialogRef=h(Fo);newSetId="evalset"+hy().slice(0,6);constructor(){}createNewEvalSet(){!this.newSetId||this.newSetId==""?alert("Cannot create eval set with empty id!"):this.evalService.createNewEvalSet(this.data.appName,this.newSetId).subscribe(e=>{this.dialogRef.close(!0)})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-new-eval-set-dialog-component"]],decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(m(0,"h2",0),K(1,"Create New Eval Set"),D(),m(2,"mat-dialog-content"),K(3,` Please enter the eval set name `),D(),m(4,"mat-form-field",1)(5,"input",2),ao("ngModelChange",function(o){return Vn(i.newSetId,o)||(i.newSetId=o),o}),$("keydown.enter",function(){return i.createNewEvalSet()}),D()(),m(6,"mat-dialog-actions",3)(7,"button",4),K(8,"Cancel"),D(),m(9,"button",5),$("click",function(){return i.createNewEvalSet()}),K(10,"Create"),D()()),A&2&&(p(5),oo("ngModel",i.newSetId))},dependencies:[ya,gr,To,wa,yn,ro,so,Ca,Ta,vn,VC],styles:["h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important;caret-color:var(--mdc-dialog-supporting-text-color)!important;background-color:transparent!important}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{background-color:#3f3f42}"]})};var wxA=["knob"],yxA=["valueIndicatorContainer"];function vxA(t,e){if(t&1&&(m(0,"div",2,1)(2,"div",5)(3,"span",6),K(4),D()()()),t&2){let A=y();p(4),qA(A.valueIndicatorText)}}var bxA=["trackActive"],MxA=["*"];function kxA(t,e){if(t&1&&GA(0,"div"),t&2){let A=e.$implicit,i=e.$index,n=y(3);Qo(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),En("transform",n._calcTickMarkTransform(i))}}function SxA(t,e){if(t&1&&Gt(0,kxA,1,4,"div",8,fd),t&2){let A=y(2);Kt(A._tickMarks)}}function xxA(t,e){if(t&1&&(m(0,"div",6,1),V(2,SxA,2,0),D()),t&2){let A=y();p(2),W(A._cachedWidth?2:-1)}}function RxA(t,e){if(t&1&&GA(0,"mat-slider-visual-thumb",7),t&2){let A=y();X("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var mi=(function(t){return t[t.START=1]="START",t[t.END=2]="END",t})(mi||{}),_E=(function(t){return t[t.ACTIVE=0]="ACTIVE",t[t.INACTIVE=1]="INACTIVE",t})(_E||{}),EF=new wA("_MatSlider"),MtA=new wA("_MatSliderThumb"),NxA=new wA("_MatSliderRangeThumb"),ktA=new wA("_MatSliderVisualThumb");var FxA=(()=>{class t{_cdr=h(ft);_ngZone=h(Oe);_slider=h(EF);_renderer=h(ui);_listenerCleanups;discrete=!1;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=h(ge).nativeElement;_platform=h(ci);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,"pointermove",this._onPointerMove),n.listen(i,"pointerdown",this._onDragStart),n.listen(i,"pointerup",this._onDragEnd),n.listen(i,"pointerleave",this._onMouseLeave),n.listen(i,"focus",this._onFocus),n.listen(i,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===cs.FADING_IN||A?.state===cs.VISIBLE}_showRipple(A,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===mi.START?mi.END:mi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===mi.START?mi.END:mi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(i,n){if(i&1&&ni(Ns,5)(wxA,5)(yxA,5),i&2){let o;Ce(o=Ie())&&(n._ripple=o.first),Ce(o=Ie())&&(n._knob=o.first),Ce(o=Ie())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[It([{provide:ktA,useExisting:t}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(i,n){i&1&&(V(0,vxA,5,1,"div",2),GA(1,"div",3,0)(3,"div",4)),i&2&&(W(n.discrete?0:-1),p(3),X("matRippleDisabled",!0))},dependencies:[Ns],styles:[`.mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px} `],encapsulation:2,changeDetection:0})}return t})(),StA=(()=>{class t{_ngZone=h(Oe);_cdr=h(ft);_elementRef=h(ge);_dir=h(wo,{optional:!0});_globalRippleOptions=h(JC,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let i=this._getInput(mi.END),n=this._getInput(mi.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;get showTickMarks(){return this._showTickMarks}set showTickMarks(A){this._showTickMarks=A,this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI())}_showTickMarks=!1;get min(){return this._min}set min(A){let i=A==null||isNaN(A)?this._min:A;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(A){let i=this._min;this._min=A,this._isRange?this._updateMinRange({old:i,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let i=this._getInput(mi.END),n=this._getInput(mi.START),o=i.value,a=n.value;n.min=A.new,i.min=Math.max(A.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),a!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let i=this._getInput(mi.END);if(i){let n=i.value;i.max=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(A){let i=isNaN(A)?this._step:A;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(mi.END),i=this._getInput(mi.START),n=A.value,o=i.value,a=i.value;A.min=this._min,i.max=this._max,A.step=this._step,i.step=this._step,this._platform.SAFARI&&(A.value=A.value,i.value=i.value),A.min=Math.max(this._min,i.value),i.max=Math.min(this._max,A.value),i._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations=Oi();_dirChangeSubscription;_resizeObserver=null;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=h(ci);constructor(){h(Hn).load(Za),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(mi.END),i=this._getInput(mi.START);this._isRange=!!A&&!!i,this._cdr.detectChanges();let n=this._getThumb(mi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,i):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,i){A.initProps(),A.initUI(),i.initProps(),i.initUI(),A._updateMinMax(),i._updateMinMax(),A._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription?.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(mi.END),i=this._getInput(mi.START);A._setIsLeftThumb(),i._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateWidthInactive(),i._updateWidthInactive(),A._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(mi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(mi.START)._isActive||this._getThumb(mi.END)._isActive}_getValue(A=mi.END){let i=this._getInput(A);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(mi.START)?._skipUIUpdate||this._getInput(mi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let i=this._trackActive.nativeElement.style;i.left=A.left,i.right=A.right,i.transformOrigin=A.transformOrigin,i.transform=A.transform}_calcTickMarkTransform(A){let i=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px)`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,i){this._hasViewInitialized&&(A._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(mi.END),i=this._getInput(mi.START);A._updateThumbUIByValue(),i._updateThumbUIByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateMinMax(),i._updateMinMax(),A._updateWidthInactive(),i._updateWidthInactive()}else{let A=this._getInput(mi.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(mi.START),i=this._getInput(mi.END);return!A||!i?!1:i.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let i=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let i=this._getThumb(A.thumbPosition===mi.END?mi.END:mi.START);i._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let i=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(i):A._hostElement.setAttribute("aria-valuetext",i),this.discrete){A.thumbPosition===mi.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(A.thumbPosition);i.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(mi.END),i=this._getInput(mi.START);A&&this._updateValueIndicatorUI(A),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let i=A.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/A),0)+1,o=Math.max(Math.round((this.max-i)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(_E.ACTIVE).concat(Array(o).fill(_E.INACTIVE))}_updateTickMarkUIRange(A){let i=this._getValue(),n=this._getValue(mi.START),o=Math.max(Math.round((n-this.min)/A),0),a=Math.max(Math.round((i-n)/A)+1,0),r=Math.max(Math.round((this.max-i)/A),0);this._tickMarks=Array(o).fill(_E.INACTIVE).concat(Array(a).fill(_E.ACTIVE),Array(r).fill(_E.INACTIVE))}_getInput(A){if(A===mi.END&&this._input)return this._input;if(this._inputs?.length)return A===mi.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===mi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,i){let n=i.width/2,o=i.x+n,a=i.y+n,r=A.clientX-o,s=A.clientY-a;return Math.pow(r,2)+Math.pow(s,2)hF),multi:!0};var hF=(()=>{class t{_ngZone=h(Oe);_elementRef=h(ge);_cdr=h(ft);_slider=h(EF);_platform=h(ci);_listenerCleanups;get value(){return Zi(this._hostElement.value,0)}set value(A){A===null&&(A=this._getDefaultValue()),A=isNaN(A)?0:A;let i=A+"";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new WA;dragStart=new WA;dragEnd=new WA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=mi.END;get min(){return Zi(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return Zi(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return Zi(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return he(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=jA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new $A;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=h(ui);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let i=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,a=Math.floor((this._slider.max-this._slider.min)/o),r=this._slider._isRtl?1-i/n:i/n,g=Math.round(r*a)/a*(this._slider.max-this._slider.min)+this._slider.min,l=Math.round(g/o)*o,C=this.value;if(l===C){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=l,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(i)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(i,n){i&1&&$("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),i&2&&ie("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",Zi]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[It([LxA,{provide:MtA,useExisting:t}])]})}return t})();var my=class t{constructor(e,A,i){this.dialogRef=e;this.fb=A;this.data=i;this.evalMetrics=this.data.evalMetrics,this.evalForm=this.fb.group({tool_trajectory_avg_score_threshold:[this.getEvalMetricThresholdFromData("tool_trajectory_avg_score"),[Ss.required,Ss.min(0),Ss.max(1)]],response_match_score_threshold:[this.getEvalMetricThresholdFromData("response_match_score"),[Ss.required,Ss.min(0),Ss.max(1)]]})}evalForm;evalMetrics=[];getEvalMetricThresholdFromData(e){return this.evalMetrics.find(A=>A.metricName===e)?.threshold??0}onStart(){if(this.evalForm.valid){let{tool_trajectory_avg_score_threshold:e,response_match_score_threshold:A}=this.evalForm.value;for(let i of this.evalMetrics)i.metricName==="tool_trajectory_avg_score"?i.threshold=e:i.metricName==="response_match_score"&&(i.threshold=A);this.dialogRef.close(this.evalMetrics)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(lt(Fo),lt(d_),lt(da))};static \u0275cmp=kA({type:t,selectors:[["app-run-eval-config-dialog"]],decls:26,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[1,"metric-row"],[1,"metric-name"],[1,"flex-1","pl-4"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],[1,"threshold-value"],["matSliderThumb","","formControlName","response_match_score_threshold"],["align","end",1,"dialog-actions"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"]],template:function(A,i){A&1&&(m(0,"div",0)(1,"h2",1),K(2,"EVALUATION METRIC"),D(),m(3,"mat-dialog-content")(4,"form",2)(5,"div",3)(6,"div",4),K(7,"Tool trajectory avg score: "),D(),m(8,"div",5)(9,"mat-slider",6),GA(10,"input",7),D(),m(11,"span",8),K(12),D()()(),m(13,"div",3)(14,"div",4),K(15,"Response match score: "),D(),m(16,"div",5)(17,"mat-slider",6),GA(18,"input",9),D(),m(19,"span",8),K(20),D()()()()(),m(21,"mat-dialog-actions",10)(22,"button",11),$("click",function(){return i.onCancel()}),K(23,"Cancel"),D(),m(24,"button",12),$("click",function(){return i.onStart()}),K(25,"Start"),D()()()),A&2&&(p(4),X("formGroup",i.evalForm),p(8),Fe(" ",i.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),p(8),Fe(" ",i.evalForm.controls.response_match_score_threshold.value," "))},dependencies:[ya,gr,yn,C_,ro,so,o_,bc,GC,_v,StA,hF,Ta,vn],styles:["build.dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.threshold-slider[_ngcontent-%COMP%]{--mdc-slider-active-track-color: var(--run-eval-config-dialog-threshold-slider-active-track-color);--mdc-slider-inactive-track-color: var(--run-eval-config-dialog-threshold-slider-inactive-track-color);--mdc-slider-handle-color: var(--run-eval-config-dialog-threshold-slider-handle-color);--mdc-slider-ripple-color: var(--run-eval-config-dialog-threshold-slider-ripple-color);width:100px}.metric-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.metric-name[_ngcontent-%COMP%]{width:250px}.threshold-value[_ngcontent-%COMP%]{margin-left:20px}.mdc-slider__thumb--with-indicator[_ngcontent-%COMP%]{background-color:var(--mdc-slider-handle-color, var(--run-eval-config-dialog-mdc-slider-thumb-background-color));border:none!important;box-shadow:none!important}h2[mat-dialog-title][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}mat-dialog-content[_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}button[mat-button][_ngcontent-%COMP%]{color:var(--mdc-dialog-supporting-text-color)!important}"]})};function _xA(t,e){if(t&1){let A=zA();m(0,"div",1)(1,"div"),K(2),D(),m(3,"mat-icon",2),$("click",function(){rA(A);let n=y();return sA(n.openNewEvalSetDialog())}),K(4,"add"),D()()}if(t&2){let A=y();p(2),qA(A.i18n.allEvalSetsHeader),p(),X("matTooltip",A.i18n.createNewEvalSetTooltip)}}function GxA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",3)(2,"div",4),K(3),D(),m(4,"div",5),K(5),D(),m(6,"div",6),$("click",function(){rA(A);let n=y();return sA(n.openNewEvalSetDialog())}),K(7),D()()()}if(t&2){let A=y();p(3),Fe(" ",A.i18n.createNewEvalSetTitle," "),p(2),Fe(" ",A.i18n.evalSetDescription," "),p(2),Fe(" ",A.i18n.createEvalSetButton," ")}}function KxA(t,e){if(t&1){let A=zA();m(0,"div",8),$("click",function(){let n=rA(A).$implicit,o=y(2);return sA(o.selectEvalSet(n))}),m(1,"div",9)(2,"span",10),K(3,"folder"),D(),m(4,"div",11),K(5),D()(),m(6,"div")(7,"mat-icon",12),K(8,"chevron_right"),D()()()}if(t&2){let A=e.$implicit;p(5),qA(A)}}function UxA(t,e){if(t&1&&(m(0,"div"),Gt(1,KxA,9,1,"div",7,Ri),D()),t&2){let A=y();p(),Kt(A.evalsets)}}function JxA(t,e){if(t&1){let A=zA();m(0,"th",29)(1,"mat-checkbox",30),$("change",function(n){rA(A);let o=y(4);return sA(n?o.toggleAllRows():null)}),D()()}if(t&2){let A=y(4);p(),X("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected())}}function YxA(t,e){if(t&1){let A=zA();m(0,"td",31)(1,"mat-checkbox",32),$("click",function(n){return n.stopPropagation()})("change",function(n){let o=rA(A).$implicit,a=y(4);return sA(n?a.selection.toggle(o):null)}),D()()}if(t&2){let A=e.$implicit,i=y(4);p(),X("checked",i.selection.isSelected(A))}}function HxA(t,e){if(t&1&&(m(0,"th",29),K(1),D()),t&2){let A=y(4);p(),Fe(" ",A.i18n.caseIdHeader," ")}}function TxA(t,e){if(t&1){let A=zA();m(0,"td",33),$("click",function(){let n=rA(A).$implicit,o=y(4);return sA(o.getEvalCase(n))}),K(1),D()}if(t&2){let A,i=e.$implicit,n=y(4);ae("selected-eval-case",i===((A=n.selectedEvalCase())==null?null:A.evalId)),p(),Fe(" ",i," ")}}function OxA(t,e){if(t&1&&(m(0,"th",29),K(1),D()),t&2){let A=y(4);p(),Fe(" ",A.i18n.resultHeader," ")}}function zxA(t,e){if(t&1){let A=zA();m(0,"button",35),$("click",function(){rA(A);let n=y().$implicit,o=y(4);return sA(o.getSession(n))}),m(1,"span",36),K(2),D(),m(3,"div",37),K(4),D()()}if(t&2){let A=y().$implicit,i=y(4);X("ngClass",i.getEvalResultForCase(A)==1?"result-btn pass":"result-btn fail")("matTooltip",i.i18n.viewEvalRunResultTooltip),p(2),Fe(" ",i.getEvalResultForCase(A)==1?"check":"close"," "),p(2),Fe("",i.getEvalResultForCase(A)==1?i.i18n.passStatus:i.i18n.failStatus," ")}}function PxA(t,e){if(t&1&&(m(0,"td",31),V(1,zxA,5,4,"button",34),D()),t&2){let A=e.$implicit,i=y(4);p(),W(i.getEvalResultForCase(A)?1:-1)}}function jxA(t,e){t&1&&GA(0,"tr",38)}function qxA(t,e){t&1&&GA(0,"tr",39)}function VxA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",16)(2,"button",17),$("click",function(){rA(A);let n=y(3);return sA(n.openEvalConfigDialog())}),K(3),D(),m(4,"mat-icon",18),$("click",function(){rA(A);let n=y(3);return sA(n.toggleEvalHistoryButton())}),K(5,"history"),D()(),m(6,"div",19)(7,"table",20),ws(8,21),yt(9,JxA,2,2,"th",22)(10,YxA,2,1,"td",23),ys(),ws(11,24),yt(12,HxA,2,1,"th",22)(13,TxA,2,3,"td",25),ys(),ws(14,26),yt(15,OxA,2,1,"th",22)(16,PxA,2,1,"td",23),ys(),yt(17,jxA,1,0,"tr",27)(18,qxA,1,0,"tr",28),D()()()}if(t&2){let A=y(3);p(3),qA(A.i18n.runEvaluationButton),p(),X("matTooltip",A.i18n.viewEvalRunHistoryTooltip),p(3),X("dataSource",A.dataSource),p(10),X("matHeaderRowDef",A.displayedColumns),p(),X("matRowDefColumns",A.displayedColumns)}}function WxA(t,e){if(t&1&&(m(0,"div")(1,"span",50),K(2,"|"),D(),m(3,"span",51),K(4),D()()),t&2){let A=y().$implicit,i=y(4);p(4),Dc("",i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," ",i.i18n.failedSuffix)}}function ZxA(t,e){if(t&1&&(m(0,"span",52),K(1),D()),t&2){let A=e.$implicit;p(),Dc(" ",A.metricName,": ",A.threshold," ")}}function XxA(t,e){if(t&1&&(m(0,"div",46),Gt(1,ZxA,2,2,"span",52,Ri),D()),t&2){let A=y().$implicit,i=y(4);p(),Kt(i.getEvalMetrics(A))}}function $xA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",53)(2,"span"),K(3),D(),m(4,"button",54),$("click",function(){let n=rA(A).$implicit,o=y(6);return sA(o.getHistorySession(n))}),m(5,"span",36),K(6),D(),m(7,"div",37),K(8),D()()()()}if(t&2){let A=e.$implicit,i=y(6);p(3),Fe(" ",A.evalId," "),p(),X("ngClass",A.finalEvalStatus==1?"result-btn pass":"result-btn fail"),p(2),Fe(" ",A.finalEvalStatus==1?"check":"close"," "),p(2),Fe("",A.finalEvalStatus==1?i.i18n.passStatusCaps:i.i18n.failStatusCaps," ")}}function ARA(t,e){if(t&1&&(m(0,"div",49),Gt(1,$xA,9,4,"div",null,Ri),D()),t&2){let A=y().$implicit,i=y(4);p(),Kt(i.generateHistoryEvaluationDatasource(A.timestamp))}}function eRA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",40)(2,"div",41)(3,"div",42)(4,"div",43),K(5),D(),m(6,"div",44)(7,"span",45),K(8),D(),V(9,WxA,5,2,"div"),D(),V(10,XxA,3,0,"div",46),D(),m(11,"div",47)(12,"mat-icon",48),$("click",function(){let n=rA(A).$implicit,o=y(4);return sA(o.toggleHistoryStatusCard(n.timestamp))}),K(13),D()()(),V(14,ARA,3,0,"div",49),D()()}if(t&2){let A=e.$implicit,i=y(4);p(5),qA(i.formatTimestamp(A.timestamp)),p(3),Dc("",i.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," ",i.i18n.passedSuffix),p(),W(i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)>0?9:-1),p(),W(i.getEvalMetrics(A)?10:-1),p(3),qA(i.getEvaluationStatusCardActionButtonIcon(A.timestamp)),p(),W(i.isEvaluationStatusCardToggled(A.timestamp)?14:-1)}}function tRA(t,e){if(t&1&&(m(0,"div"),Gt(1,eRA,15,7,"div",null,Ri),D()),t&2){let A=y(3);p(),Kt(A.getEvalHistoryOfCurrentSetSorted())}}function iRA(t,e){if(t&1&&(m(0,"div"),V(1,VxA,19,5,"div"),V(2,tRA,3,0,"div"),D()),t&2){let A=y(2);p(),W(A.showEvalHistory()?-1:1),p(),W(A.showEvalHistory()?2:-1)}}function nRA(t,e){if(t&1){let A=zA();m(0,"button",55),$("click",function(){rA(A);let n=y(2);return sA(n.openNewEvalCaseDialog())}),m(1,"div",56)(2,"mat-icon"),K(3,"add"),D(),m(4,"div",57),K(5),D()()()}if(t&2){let A=y(2);p(5),Dc(" ",A.i18n.addSessionToSetButtonPrefix," ",A.selectedEvalSet," ")}}function oRA(t,e){t&1&&(m(0,"div"),GA(1,"mat-spinner",58),D()),t&2&&(p(),X("diameter",28)("strokeWidth",3))}function aRA(t,e){if(t&1){let A=zA();m(0,"div")(1,"div",9)(2,"mat-icon",13),$("click",function(){rA(A);let n=y();return sA(n.clearSelectedEvalSet())}),K(3,"chevron_left"),D(),m(4,"div",14),$("click",function(){rA(A);let n=y();return sA(n.clearSelectedEvalSet())}),K(5),D()(),V(6,iRA,3,2,"div"),V(7,nRA,6,2,"button",15),V(8,oRA,2,2,"div"),D()}if(t&2){let A=y();p(5),Fe(" ",A.selectedEvalSet," "),p(),W(A.evalCases.length>0&&!A.evalRunning()?6:-1),p(),W(!A.evalRunning()&&!A.showEvalHistory()?7:-1),p(),W(A.evalRunning()?8:-1)}}var py=new wA("EVAL_TAB_COMPONENT"),Qc=class t{checkboxes=wL(yB);appName=nt("");userId=nt("");sessionId=nt("");sessionSelected=No();shouldShowTab=No();evalNotInstalledMsg=No();evalCaseSelected=No();evalSetIdSelected=No();shouldReturnToSession=No();evalCasesSubject=new Jt([]);changeDetectorRef=h(ft);flagService=h(lr);i18n=h(btA);displayedColumns=["select","evalId","finalEvalStatus"];evalsets=[];selectedEvalSet="";evalCases=[];selectedEvalCase=jA(null);deletedEvalCaseIndex=-1;dataSource=new $u(this.evalCases);selection=new $I(!0,[]);showEvalHistory=jA(!1);evalRunning=jA(!1);evalMetrics=ytA;currentEvalResultBySet=new Map;dialog=h(Qs);appEvaluationResults={};evalService=h(Uc);sessionService=h(Hg);constructor(){this.evalCasesSubject.subscribe(e=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&e.length>0?(this.selectNewEvalCase(e),this.deletedEvalCaseIndex=-1):e.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(e){e.appName&&(this.selectedEvalSet="",this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(Ho(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),oe(null)):oe([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e,this.changeDetectorRef.detectChanges())})}openNewEvalSetDialog(){this.dialog.open(fy,{width:"600px",data:{appName:this.appName()}}).afterClosed().subscribe(A=>{A&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.dialog.open(uy,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet}}).afterClosed().subscribe(A=>{A&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet).subscribe(e=>{this.evalCases=e,this.dataSource=new $u(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){if(this.evalRunning.set(!0),this.selection.selected.length==0){alert("No case selected!"),this.evalRunning.set(!1);return}this.evalService.runEval(this.appName(),this.selectedEvalSet,this.selection.selected,this.evalMetrics).pipe(Ho(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),oe([])))).subscribe(e=>{this.evalRunning.set(!1),this.currentEvalResultBySet.set(this.selectedEvalSet,e),this.getEvaluationResult(),this.changeDetectorRef.detectChanges()})}selectEvalSet(e){this.selectedEvalSet=e,this.listEvalCases()}clearSelectedEvalSet(){if(this.showEvalHistory()){this.toggleEvalHistoryButton();return}this.selectedEvalSet=""}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet)?.filter(i=>i.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;on.evalId==e)[0],i=A.sessionId;this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()][this.selectedEvalSet]}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]}))}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let i=new Date(A*1e3);if(isNaN(i.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(i)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e){this.addEvalCaseResultToEvents(e.sessionDetails,e);let A=this.fromApiResultToSession(e.sessionDetails);this.sessionSelected.emit(A)}getEvalCase(e){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet,e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet)})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet,e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(){this.evalService.listEvalResults(this.appName()).pipe(Ho(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),oe(null)):oe([]))).subscribe(e=>{for(let A of e)this.evalService.getEvalResult(this.appName(),A).subscribe(i=>{this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][i.evalSetId]||(this.appEvaluationResults[this.appName()][i.evalSetId]={});let n=i.creationTimestamp;this.appEvaluationResults[this.appName()][i.evalSetId][n]||(this.appEvaluationResults[this.appName()][i.evalSetId][n]={isToggled:!1,evaluationResults:[]});let o={isToggled:!1,evaluationResults:i.evalCaseResults.map(a=>({setId:a.id,evalId:a.evalId,finalEvalStatus:a.finalEvalStatus,evalMetricResults:a.evalMetricResults,evalMetricResultPerInvocation:a.evalMetricResultPerInvocation,sessionId:a.sessionId,sessionDetails:a.sessionDetails,overallEvalMetricResults:a.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][i.evalSetId][n]=o,this.changeDetectorRef.detectChanges()})})}openEvalConfigDialog(){if(this.selection.selected.length==0){alert("No case selected!");return}this.dialog.open(my,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics}}).afterClosed().subscribe(A=>{A&&(this.evalMetrics=A,this.runEval())})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-eval-tab"]],viewQuery:function(A,i){A&1&&Or(i.checkboxes,yB,5),A&2&&rr()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession"},features:[ei],decls:5,vars:4,consts:[[1,"eval-container"],[1,"eval-set-actions"],[2,"cursor","pointer",3,"click","matTooltip"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[2,"display","flex"],[1,"material-symbols-outlined",2,"margin-right","10px","padding-top","16px"],[2,"font-family","Roboto","font-size","14px","padding","16px","padding-top","20px"],[2,"padding-top","20px","color","#9AA0A6"],[2,"color","white","cursor","pointer",3,"click"],[2,"color","#9AA0A6","padding-top","2px","cursor","pointer",3,"click"],[1,"save-session-btn"],[1,"evaluation-tab-header"],[1,"run-eval-btn",3,"click"],[1,"evaluation-history-icon",3,"click","matTooltip"],[1,"mat-table-container",2,"margin-top","16px"],["mat-table","",3,"dataSource"],["matColumnDef","select"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","evalId"],["mat-cell","","class","eval-case-id",3,"selected-eval-case","click",4,"matCellDef"],["matColumnDef","finalEvalStatus"],["mat-header-row","",4,"matHeaderRowDef"],["mat-row","",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],[3,"change","checked","indeterminate"],["mat-cell",""],[3,"click","change","checked"],["mat-cell","",1,"eval-case-id",3,"click"],[3,"ngClass","matTooltip"],[3,"click","ngClass","matTooltip"],[1,"material-symbols-outlined"],[2,"padding-top","4px"],["mat-header-row",""],["mat-row",""],[1,"status-card"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__timestamp"],[1,"status-card__summary"],[1,"status-card__passed"],[1,"status-card__metrics"],[1,"status-card__action"],[3,"click"],[1,"status-card__history-cases"],[1,"status-card__separator"],[1,"status-card__failed"],[1,"status-card__metric"],[1,"status-card__history-case"],[3,"click","ngClass"],[1,"save-session-btn",3,"click"],[1,"save-session-btn-detail"],[1,"save-session-btn-text"],[1,"eval-spinner",3,"diameter","strokeWidth"]],template:function(A,i){A&1&&(m(0,"div",0),V(1,_xA,5,2,"div",1),V(2,GxA,8,3,"div"),V(3,UxA,3,0,"div"),V(4,aRA,9,4,"div"),D()),A&2&&(p(),W(i.selectedEvalSet==""?1:-1),p(),W(i.evalsets.length==0?2:-1),p(),W(i.evalsets.length>0&&i.selectedEvalSet==""?3:-1),p(),W(i.selectedEvalSet!=""?4:-1))},dependencies:[In,Ba,BtA,htA,EtA,utA,yB,QtA,ftA,Rg,mtA,DtA,ptA,wtA,uI],styles:[".eval-container[_ngcontent-%COMP%]{margin-top:20px;padding-left:25px;padding-right:25px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--eval-tab-eval-set-actions-color);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px;background-color:var(--eval-tab-empty-eval-info-background-color);border-radius:8px;box-shadow:0 2px 6px 2px var(--eval-tab-empty-eval-info-box-shadow-color1),0 1px 2px 0 var(--eval-tab-empty-eval-info-box-shadow-color2)}.info-title[_ngcontent-%COMP%]{color:var(--eval-tab-info-title-color);font-family:Roboto;font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--eval-tab-info-detail-color);font-family:Roboto;font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--eval-tab-info-create-color);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;cursor:pointer}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--eval-tab-selected-eval-case-color)}.save-session-btn[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,var(--eval-tab-save-session-btn-background-color1) 0%,var(--eval-tab-save-session-btn-background-color1) 100%),var(--eval-tab-save-session-btn-background-color2);border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--eval-tab-save-session-btn-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--eval-tab-run-eval-btn-border-color);background-color:transparent;padding:8px 24px;margin-top:16px;color:var(--eval-tab-run-eval-btn-color);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-run-eval-btn-hover-background-color)}.result-btn[_ngcontent-%COMP%]{display:flex;background-color:transparent;border-radius:4px;border:1px solid var(--eval-tab-result-btn-border-color);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-result-btn-hover-background-color)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-pass-color)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-fail-color)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;background-color:var(--eval-tab-status-card-background-color);padding:12px 16px;margin-top:12px}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--eval-tab-status-card-timestamp-color);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.75em;font-weight:300;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:180px;color:var(--eval-tab-status-card-metric-color)}.status-card__failed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-failed-color)}.status-card__separator[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-separator-color);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-passed-color)}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-action-mat-icon-color);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-icon-color);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:15px}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}"]})};var Af=class t{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||t)(lt(Fo),lt(da))};static \u0275cmp=kA({type:t,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(m(0,"div",0)(1,"h2",1),K(2),D(),m(3,"mat-dialog-content")(4,"p"),K(5),D()(),m(6,"mat-dialog-actions",2)(7,"button",3),$("click",function(){return i.onCancel()}),K(8),D(),m(9,"button",4),$("click",function(){return i.onConfirm()}),K(10),D()()()),A&2&&(p(2),qA(i.data.title),p(3),qA(i.data.message),p(3),qA(i.data.cancelButtonText),p(2),qA(i.data.confirmButtonText))},dependencies:[ya,gr,Ta,vn],encapsulation:2})};var DF=["*"];function rRA(t,e){t&1&&He(0)}var sRA=["tabListContainer"],gRA=["tabList"],lRA=["tabListInner"],cRA=["nextPaginator"],CRA=["previousPaginator"],IRA=["content"];function dRA(t,e){}var BRA=["tabBodyWrapper"],QRA=["tabHeader"];function ERA(t,e){}function hRA(t,e){if(t&1&&yt(0,ERA,0,0,"ng-template",12),t&2){let A=y().$implicit;X("cdkPortalOutlet",A.templateLabel)}}function uRA(t,e){if(t&1&&K(0),t&2){let A=y().$implicit;qA(A.textLabel)}}function fRA(t,e){if(t&1){let A=zA();m(0,"div",7,2),$("click",function(){let n=rA(A),o=n.$implicit,a=n.$index,r=y(),s=Wi(1);return sA(r._handleClick(o,s,a))})("cdkFocusChange",function(n){let o=rA(A).$index,a=y();return sA(a._tabFocusChanged(n,o))}),GA(2,"span",8)(3,"div",9),m(4,"span",10)(5,"span",11),V(6,hRA,1,1,null,12)(7,uRA,1,1),D()()()}if(t&2){let A=e.$implicit,i=e.$index,n=Wi(1),o=y();Qo(A.labelClass),ae("mdc-tab--active",o.selectedIndex===i),X("id",o._getTabLabelId(A,i))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),ie("tabIndex",o._getTabIndex(i))("aria-posinset",i+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(i))("aria-selected",o.selectedIndex===i)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),p(3),X("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),p(3),W(A.templateLabel?6:7)}}function mRA(t,e){t&1&&He(0)}function pRA(t,e){if(t&1){let A=zA();m(0,"mat-tab-body",13),$("_onCentered",function(){rA(A);let n=y();return sA(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){rA(A);let o=y();return sA(o._setTabBodyWrapperHeight(n))})("_beforeCentering",function(n){rA(A);let o=y();return sA(o._bodyCentered(n))}),D()}if(t&2){let A=e.$implicit,i=e.$index,n=y();Qo(A.bodyClass),X("id",n._getTabContentId(i))("content",A.content)("position",A.position)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),ie("tabindex",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(A,i))("aria-hidden",n.selectedIndex!==i)}}var DRA=new wA("MatTabContent"),wRA=(()=>{class t{template=h(Fn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matTabContent",""]],features:[It([{provide:DRA,useExisting:t}])]})}return t})(),yRA=new wA("MatTabLabel"),FtA=new wA("MAT_TAB"),wF=(()=>{class t extends YU{_closestTab=h(FtA,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[It([{provide:yRA,useExisting:t}]),Ct]})}return t})(),LtA=new wA("MAT_TAB_GROUP"),ef=(()=>{class t{_viewContainerRef=h(Ro);_closestTabGroup=h(LtA,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;id=null;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new $A;position=null;origin=null;isActive=!1;constructor(){h(Hn).load(Za)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new Vr(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-tab"]],contentQueries:function(i,n,o){if(i&1&&na(o,wF,5)(o,wRA,7,Fn),i&2){let a;Ce(a=Ie())&&(n.templateLabel=a.first),Ce(a=Ie())&&(n._explicitContent=a.first)}},viewQuery:function(i,n){if(i&1&&ni(Fn,7),i&2){let o;Ce(o=Ie())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],hostVars:1,hostBindings:function(i,n){i&2&&ie("id",null)},inputs:{disabled:[2,"disabled","disabled",he],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass",id:"id"},exportAs:["matTab"],features:[It([{provide:FtA,useExisting:t}]),ei],ngContentSelectors:DF,decls:1,vars:0,template:function(i,n){i&1&&(Yt(),mf(0,rRA,1,0,"ng-template"))},encapsulation:2})}return t})(),uF="mdc-tab-indicator--active",xtA="mdc-tab-indicator--no-transition",fF=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),i=this._currentItem;if(A!==i&&(i?.deactivateInkBar(),A)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},vRA=(()=>{class t{_elementRef=h(ge);_inkBarElement=null;_inkBarContentElement=null;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let i=this._elementRef.nativeElement;if(!A||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(uF);return}let n=i.getBoundingClientRect(),o=A.width/n.width,a=A.left-n.left;i.classList.add(xtA),this._inkBarContentElement.style.setProperty("transform",`translateX(${a}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(xtA),i.classList.add(uF),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(uF)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");i.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",he]}})}return t})();var _tA=(()=>{class t extends vRA{elementRef=h(ge);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275dir=OA({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(i,n){i&2&&(ie("aria-disabled",!!n.disabled),ae("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",he]},features:[Ct]})}return t})(),RtA={passive:!0},bRA=650,MRA=100,kRA=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_viewportRuler=h(Bs);_dir=h(wo,{optional:!0});_ngZone=h(Oe);_platform=h(ci);_sharedResizeObserver=h(tm);_injector=h(ut);_renderer=h(ui);_animationsDisabled=Oi();_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new $A;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged=!1;_keyManager;_currentTextContent;_stopScrolling=new $A;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let i=isNaN(A)?0:A;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new WA;indexFocused=new WA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(this._renderer.listen(this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),RtA),this._renderer.listen(this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),RtA))}ngAfterContentInit(){let A=this._dir?this._dir.change:oe("ltr"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(ps(32),Bt(this._destroyed)),n=this._viewportRuler.change(150).pipe(Bt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new Mc(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(Math.max(this._selectedIndex,0)),Nn(o,{injector:this._injector}),Qi(A,n,i,this._items.changes,this._itemsResized()).pipe(Bt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager?.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(a=>{this.indexFocused.emit(a),this._setTabFocus(a)})}_itemsResized(){return typeof ResizeObserver!="function"?xa:this._items.changes.pipe(nn(this._items),Ei(A=>new Ti(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),rg(1),We(A=>A.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!aa(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager?.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,i=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let i=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let i=this._items?this._items.toArray()[A]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:a}=i.elementRef.nativeElement,r,s;this._getLayoutDirection()=="ltr"?(r=o,s=r+a):(s=this._tabListInner.nativeElement.offsetWidth-o,r=s-a);let g=this.scrollDistance,l=this.scrollDistance+n;rl&&(this.scrollDistance+=Math.min(s-l,r-g))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=A-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return A-i||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=A?A.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),Cf(bRA,MRA).pipe(Bt(Qi(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,inputs:{disablePagination:[2,"disablePagination","disablePagination",he],selectedIndex:[2,"selectedIndex","selectedIndex",Zi]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return t})(),SRA=(()=>{class t extends kRA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new fF(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=hi(t)))(n||t)}})();static \u0275cmp=kA({type:t,selectors:[["mat-tab-header"]],contentQueries:function(i,n,o){if(i&1&&na(o,_tA,4),i&2){let a;Ce(a=Ie())&&(n._items=a)}},viewQuery:function(i,n){if(i&1&&ni(sRA,7)(gRA,7)(lRA,7)(cRA,5)(CRA,5),i&2){let o;Ce(o=Ie())&&(n._tabListContainer=o.first),Ce(o=Ie())&&(n._tabList=o.first),Ce(o=Ie())&&(n._tabListInner=o.first),Ce(o=Ie())&&(n._nextPaginator=o.first),Ce(o=Ie())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(i,n){i&2&&ae("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",he]},features:[Ct],ngContentSelectors:DF,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(i,n){i&1&&(Yt(),m(0,"div",5,0),$("click",function(){return n._handlePaginatorClick("before")})("mousedown",function(a){return n._handlePaginatorPress("before",a)})("touchend",function(){return n._stopInterval()}),GA(2,"div",6),D(),m(3,"div",7,1),$("keydown",function(a){return n._handleKeydown(a)}),m(5,"div",8,2),$("cdkObserveContent",function(){return n._onContentChanges()}),m(7,"div",9,3),He(9),D()()(),m(10,"div",10,4),$("mousedown",function(a){return n._handlePaginatorPress("after",a)})("click",function(){return n._handlePaginatorClick("after")})("touchend",function(){return n._stopInterval()}),GA(12,"div",6),D()),i&2&&(ae("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),X("matRippleDisabled",n._disableScrollBefore||n.disableRipple),p(3),ae("_mat-animation-noopable",n._animationsDisabled),p(2),ie("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),p(5),ae("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),X("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[Ns,b_],styles:[`.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-divider-height, 1px);border-bottom-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-divider-height, 1px);border-top-color:var(--mat-tab-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mat-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}} `],encapsulation:2})}return t})(),xRA=new wA("MAT_TABS_CONFIG"),NtA=(()=>{class t extends Ig{_host=h(mF);_ngZone=h(Oe);_centeringSub=Rn.EMPTY;_leavingSub=Rn.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(nn(this._host._isCenterPosition())).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this._ngZone.run(()=>{Promise.resolve().then(),this.attach(this._host._content)})}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this._ngZone.run(()=>this.detach())})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=OA({type:t,selectors:[["","matTabBodyHost",""]],features:[Ct]})}return t})(),mF=(()=>{class t{_elementRef=h(ge);_dir=h(wo,{optional:!0});_ngZone=h(Oe);_injector=h(ut);_renderer=h(ui);_diAnimationsDisabled=Oi();_eventCleanups;_initialized=!1;_fallbackTimer;_positionIndex;_dirChangeSubscription=Rn.EMPTY;_position;_previousPosition;_onCentering=new WA;_beforeCentering=new WA;_afterLeavingCenter=new WA;_onCentered=new WA(!0);_portalHost;_contentElement;_content;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=h(ft);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),A.markForCheck()})}}ngOnInit(){this._bindTransitionEvents(),this._position==="center"&&(this._setActiveClass(!0),Nn(()=>this._onCentering.emit(this._elementRef.nativeElement.clientHeight),{injector:this._injector})),this._initialized=!0}ngOnDestroy(){clearTimeout(this._fallbackTimer),this._eventCleanups?.forEach(A=>A()),this._dirChangeSubscription.unsubscribe()}_bindTransitionEvents(){this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement,i=n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.remove("mat-tab-body-animating"),n.type==="transitionend"&&this._transitionDone())};this._eventCleanups=[this._renderer.listen(A,"transitionstart",n=>{n.target===this._contentElement?.nativeElement&&(this._elementRef.nativeElement.classList.add("mat-tab-body-animating"),this._transitionStarted())}),this._renderer.listen(A,"transitionend",i),this._renderer.listen(A,"transitioncancel",i)]})}_transitionStarted(){clearTimeout(this._fallbackTimer);let A=this._position==="center";this._beforeCentering.emit(A),A&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_transitionDone(){this._position==="center"?this._onCentered.emit():this._previousPosition==="center"&&this._afterLeavingCenter.emit()}_setActiveClass(A){this._elementRef.nativeElement.classList.toggle("mat-mdc-tab-body-active",A)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(){return this._positionIndex===0}_computePositionAnimationState(A=this._getLayoutDirection()){this._previousPosition=this._position,this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center",this._animationsDisabled()?this._simulateTransitionEvents():this._initialized&&(this._position==="center"||this._previousPosition==="center")&&(clearTimeout(this._fallbackTimer),this._fallbackTimer=this._ngZone.runOutsideAngular(()=>setTimeout(()=>this._simulateTransitionEvents(),100)))}_simulateTransitionEvents(){this._transitionStarted(),Nn(()=>this._transitionDone(),{injector:this._injector})}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0ms"||this.animationDuration==="0s"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-tab-body"]],viewQuery:function(i,n){if(i&1&&ni(NtA,5)(IRA,5),i&2){let o;Ce(o=Ie())&&(n._portalHost=o.first),Ce(o=Ie())&&(n._contentElement=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],hostVars:1,hostBindings:function(i,n){i&2&&ie("inert",n._position==="center"?null:"")},inputs:{_content:[0,"content","_content"],animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(i,n){i&1&&(m(0,"div",1,0),yt(2,dRA,0,0,"ng-template",2),D()),i&2&&ae("mat-tab-body-content-left",n._position==="left")("mat-tab-body-content-right",n._position==="right")("mat-tab-body-content-can-animate",n._position==="center"||n._previousPosition==="center")},dependencies:[NtA,x0],styles:[`.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto;transform:none;visibility:hidden}.mat-tab-body-animating>.mat-mdc-tab-body-content,.mat-mdc-tab-body-active>.mat-mdc-tab-body-content{visibility:visible}.mat-tab-body-animating>.mat-mdc-tab-body-content{min-height:1px}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-tab-body-content-can-animate{transition:transform var(--mat-tab-animation-duration) 1ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable .mat-tab-body-content-can-animate{transition:none}.mat-tab-body-content-left{transform:translate3d(-100%, 0, 0)}.mat-tab-body-content-right{transform:translate3d(100%, 0, 0)} `],encapsulation:2})}return t})(),Dy=(()=>{class t{_elementRef=h(ge);_changeDetectorRef=h(ft);_ngZone=h(Oe);_tabsSubscription=Rn.EMPTY;_tabLabelSubscription=Rn.EMPTY;_tabBodySubscription=Rn.EMPTY;_diAnimationsDisabled=Oi();_allTabs;_tabBodies;_tabBodyWrapper;_tabHeader;_tabs=new Sg;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let i=A+"";this._animationDuration=/^\d+$/.test(i)?A+"ms":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex=null;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){let i=this._elementRef.nativeElement.classList;i.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&i.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new WA;focusChange=new WA;animationDone=new WA;selectedTabChange=new WA(!0);_groupId;_isServer=!h(ci).isBrowser;constructor(){let A=h(xRA,{optional:!0});this._groupId=h(An).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),i||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((i,n)=>{i.position=n-A,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o{i[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}ngAfterViewInit(){this._tabBodySubscription=this._tabBodies.changes.subscribe(()=>this._bodyCentered(!0))}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(nn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe(),this._tabBodySubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let i=this._tabHeader;i&&(i.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let i=new pF;return i.index=A,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[A]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Qi(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A,i){return A.id||`${this._groupId}-label-${i}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight){this._tabBodyWrapperHeight=A;return}let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this._ngZone.run(()=>this.animationDone.emit())}_handleClick(A,i,n){i.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let i=this._lastFocusedTabIndex??this.selectedIndex;return A===i?0:-1}_tabFocusChanged(A,i){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=i)}_bodyCentered(A){A&&this._tabBodies?.forEach((i,n)=>i._setActiveClass(n===this._selectedIndex))}_animationsDisabled(){return this._diAnimationsDisabled||this.animationDuration==="0"||this.animationDuration==="0ms"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=kA({type:t,selectors:[["mat-tab-group"]],contentQueries:function(i,n,o){if(i&1&&na(o,ef,5),i&2){let a;Ce(a=Ie())&&(n._allTabs=a)}},viewQuery:function(i,n){if(i&1&&ni(BRA,5)(QRA,5)(mF,5),i&2){let o;Ce(o=Ie())&&(n._tabBodyWrapper=o.first),Ce(o=Ie())&&(n._tabHeader=o.first),Ce(o=Ie())&&(n._tabBodies=o)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(i,n){i&2&&(ie("mat-align-tabs",n.alignTabs),Qo("mat-"+(n.color||"primary")),En("--mat-tab-animation-duration",n.animationDuration),ae("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",he],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",he],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",he],selectedIndex:[2,"selectedIndex","selectedIndex",Zi],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",Zi],disablePagination:[2,"disablePagination","disablePagination",he],disableRipple:[2,"disableRipple","disableRipple",he],preserveContent:[2,"preserveContent","preserveContent",he],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[It([{provide:LtA,useExisting:t}])],ngContentSelectors:DF,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","class","content","position","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","_beforeCentering","id","content","position","animationDuration","preserveContent"]],template:function(i,n){i&1&&(Yt(),m(0,"mat-tab-header",3,0),$("indexFocused",function(a){return n._focusChanged(a)})("selectFocusedIndex",function(a){return n.selectedIndex=a}),Gt(2,fRA,8,17,"div",4,Ri),D(),V(4,mRA,1,0),m(5,"div",5,1),Gt(7,pRA,1,10,"mat-tab-body",6,Ri),D()),i&2&&(X("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination),Df("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),p(2),Kt(n._tabs),p(2),W(n._isServer?4:-1),p(),ae("_mat-animation-noopable",n._animationsDisabled()),p(2),Kt(n._tabs))},dependencies:[SRA,_tA,Hv,Ns,Ig,mF],styles:[`.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1;touch-action:manipulation}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mat-tab-container-height, 48px);font-family:var(--mat-tab-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mat-tab-active-indicator-height, 2px);border-radius:var(--mat-tab-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-disabled-ripple-color, var(--mat-sys-on-surface-variant))}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important} `],encapsulation:2})}return t})(),pF=class{index;tab};var wy=new wA("LOGO_COMPONENT");var RRA={noSessionsFound:"No sessions found",readonlyChip:"Read-only",filterSessionsLabel:"Search using session ID"},GtA=new wA("Session Tab Messages",{factory:()=>RRA});function NRA(t,e){if(t&1&&(m(0,"div",1)(1,"mat-form-field",4)(2,"mat-label"),K(3),D(),m(4,"mat-icon",5),K(5,"filter_list"),D(),GA(6,"input",6),D()()),t&2){let A=y();p(3),qA(A.i18n.filterSessionsLabel),p(3),X("formControl",A.filterControl)}}function FRA(t,e){t&1&&(m(0,"div",2),GA(1,"mat-progress-bar",7),D())}function LRA(t,e){if(t&1&&(m(0,"div",3),K(1),D()),t&2){let A=y();p(),qA(A.i18n.noSessionsFound)}}function _RA(t,e){if(t&1&&(m(0,"div",14)(1,"mat-icon"),K(2,"visibility"),D(),K(3),D()),t&2){let A=y(3);p(3),Fe(" ",A.i18n.readonlyChip," ")}}function GRA(t,e){if(t&1){let A=zA();m(0,"div",10),$("click",function(){let n=rA(A).$implicit,o=y(2);return sA(o.getSession(n.id))}),m(1,"div",11)(2,"div",12),K(3),D(),m(4,"div",13),K(5),D()(),V(6,_RA,4,1,"div",14),oi(7,"async"),D()}if(t&2){let A=e.$implicit,i=y(2);X("ngClass",A.id===i.sessionId?"session-item current":"session-item"),p(3),qA(A.id),p(2),qA(i.getDate(A)),p(),W(li(7,4,i.sessionService.canEdit(i.userId,A))===!1?6:-1)}}function KRA(t,e){t&1&&(m(0,"div",2),GA(1,"mat-progress-bar",7),D())}function URA(t,e){if(t&1){let A=zA();V(0,KRA,2,0,"div",2),m(1,"div",15)(2,"button",16),$("click",function(){rA(A);let n=y(2);return sA(n.loadMoreSessions())}),K(3,"Load more"),D()()}if(t&2){y(2);let A=vs(3);W(A?0:-1)}}function JRA(t,e){if(t&1&&(m(0,"div",8),Gt(1,GRA,8,6,"div",9,Ri),D(),V(3,URA,4,1),oi(4,"async")),t&2){let A=y();p(),Kt(A.sessionList),p(2),W(li(4,1,A.isSessionFilteringEnabled)&&A.canLoadMoreSessions?3:-1)}}var GE=class t{userId="";appName="";sessionId="";sessionSelected=new WA;sessionReloaded=new WA;SESSIONS_PAGE_LIMIT=100;sessionList=[];canLoadMoreSessions=!1;pageToken="";filterControl=new ss("");refreshSessionsSubject=new $A;getSessionSubject=new $A;reloadSessionSubject=new $A;route=h(_s);changeDetectorRef=h(ft);sessionService=h(Hg);uiStateService=h(Tg);i18n=h(GtA);featureFlagService=h(lr);isSessionFilteringEnabled=this.featureFlagService.isSessionFilteringEnabled();isLoadingMoreInProgress=jA(!1);constructor(){this.filterControl.valueChanges.pipe(ps(300)).subscribe(()=>{this.pageToken="",this.sessionList=[],this.refreshSessionsSubject.next()}),this.refreshSessionsSubject.pipe(Wt(()=>{this.uiStateService.setIsSessionListLoading(!0)}),Ei(()=>{let e=this.filterControl.value||void 0;return this.isSessionFilteringEnabled?this.sessionService.listSessions(this.userId,this.appName,{filter:e,pageToken:this.pageToken,pageSize:this.SESSIONS_PAGE_LIMIT}).pipe(Ho(()=>oe({items:[],nextPageToken:""}))):this.sessionService.listSessions(this.userId,this.appName).pipe(Ho(()=>oe({items:[],nextPageToken:""})))}),Wt(({items:e,nextPageToken:A})=>{this.sessionList=Array.from(new Map([...this.sessionList,...e].map(i=>[i.id,i])).values()).sort((i,n)=>Number(n.lastUpdateTime)-Number(i.lastUpdateTime)),this.pageToken=A??"",this.canLoadMoreSessions=!!A,this.changeDetectorRef.markForCheck()})).subscribe(()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)},()=>{this.isLoadingMoreInProgress.set(!1),this.uiStateService.setIsSessionListLoading(!1)}),this.getSessionSubject.pipe(Wt(()=>{this.uiStateService.setIsSessionLoading(!0)}),xC(this.featureFlagService.isInfinityMessageScrollingEnabled()),Ei(([e,A])=>this.sessionService.getSession(this.userId,this.appName,e).pipe(fe(i=>({response:i,isInfinityScrollingEnabled:A}))).pipe(Ho(()=>oe(null)))),Wt(e=>{if(!e)return;let A=this.fromApiResultToSession(e.response);e.isInfinityScrollingEnabled&&A.id&&this.uiStateService.lazyLoadMessages(A.id,{pageSize:100,pageToken:""}).pipe(po()).subscribe(),this.sessionSelected.emit(A),this.changeDetectorRef.markForCheck()})).subscribe(e=>{this.uiStateService.setIsSessionLoading(!1)},e=>{this.uiStateService.setIsSessionLoading(!1)}),this.reloadSessionSubject.pipe(xC(this.featureFlagService.isInfinityMessageScrollingEnabled()),Ei(([e,A])=>this.sessionService.getSession(this.userId,this.appName,e).pipe(fe(i=>({response:i,isInfinityScrollingEnabled:A}))).pipe(Ho(()=>oe(null)))),Wt(e=>{if(!e)return;let A=this.fromApiResultToSession(e.response);e.isInfinityScrollingEnabled&&A.id&&this.uiStateService.lazyLoadMessages(A.id,{pageSize:100,pageToken:""},!0).pipe(po()).subscribe(),this.sessionReloaded.emit(A),this.changeDetectorRef.markForCheck()})).subscribe()}ngOnInit(){this.featureFlagService.isSessionFilteringEnabled().subscribe(e=>{if(e){let A=this.route.snapshot.queryParams.session;A&&this.filterControl.setValue(A)}}),setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){e&&this.getSessionSubject.next(e)}loadMoreSessions(){this.isLoadingMoreInProgress.set(!0),this.refreshSessionsSubject.next()}getDate(e){let A=e.lastUpdateTime||0;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e.id??"",appName:e.appName??"",userId:e.userId??"",state:e.state??{},events:e.events??[]}}reloadSession(e){this.reloadSessionSubject.next(e)}refreshSession(e){let A=null;if(this.sessionList.length>0){let i=this.sessionList.findIndex(n=>n.id===e);i===this.sessionList.length-1&&(i=-1),A=this.sessionList[i+1]}return this.isSessionFilteringEnabled?this.filterControl.setValue(""):(this.sessionList=[],this.refreshSessionsSubject.next()),A}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:8,vars:7,consts:[[1,"session-wrapper"],[1,"session-filter-container"],[1,"loading-spinner-container"],[1,"empty-state"],["appearance","outline",1,"session-filter"],["matPrefix",""],["matInput","",3,"formControl"],["mode","indeterminate"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-id"],[1,"session-date"],[1,"readonly-badge"],[1,"load-more"],["mat-button","","color","primary",3,"click"]],template:function(A,i){if(A&1&&(m(0,"div",0),V(1,NRA,7,2,"div",1),oi(2,"async"),wr(3),oi(4,"async"),V(5,FRA,2,0,"div",2)(6,LRA,2,1,"div",3)(7,JRA,5,3),D()),A&2){p(),W(li(2,2,i.isSessionFilteringEnabled)?1:-1),p(2);let n=sg(li(4,4,i.uiStateService.isSessionListLoading()));p(2),W(n&&!i.isLoadingMoreInProgress()?5:!n&&i.sessionList.length===0?6:7)}},dependencies:[Rg,ey,In,vr,To,pl,i7,Fg,wa,yn,ro,so,bc,SI,Cs,vn,Ug,Pr],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color);display:flex;flex-direction:column;overflow:hidden;height:100%}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-wrapper[_ngcontent-%COMP%] .session-filter-container[_ngcontent-%COMP%]{background-color:var(--session-tab-session-filter-container-background-color);border-radius:8px;padding:16px;margin-bottom:16px;margin-top:16px}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%]{width:100%}.session-wrapper[_ngcontent-%COMP%] .session-filter[_ngcontent-%COMP%] .mdc-floating-label--float-above{background-color:var(--session-tab-session-filter-container-background-color)}.session-tab-container[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;border:none;background-color:var(--session-tab-session-item-background-color);border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--session-tab-session-item-hover-background-color)}.session-item.current[_ngcontent-%COMP%]{background-color:var(--session-tab-session-item-current-background-color)}.session-item[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{margin-right:11px}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px}.session-info[_ngcontent-%COMP%]{padding:11px}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em;width:100%}.load-more[_ngcontent-%COMP%]{display:flex;justify-content:center;margin-top:1em}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);background-color:var(--chat-readonly-badge-background-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-right:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}"]})};var YRA={stateIsEmpty:"State is empty"},KtA=new wA("State Tab Messages",{factory:()=>YRA});function HRA(t,e){if(t&1&&(m(0,"div",1),K(1),D()),t&2){let A=y();p(),qA(A.i18n.stateIsEmpty)}}function TRA(t,e){if(t&1&&(m(0,"div"),GA(1,"ngx-json-viewer",2),D()),t&2){let A=y();p(),X("json",A.sessionState)}}var yy=class t{sessionState;i18n=h(KtA);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(A,i){A&1&&(m(0,"div",0),V(1,HRA,2,1,"div",1)(2,TRA,2,1,"div"),D()),A&2&&(p(),W(i.isEmptyState?1:2))},dependencies:[Gc,XC],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var ORA={noInvocationsFound:"No invocations found",invocationsTitle:"Invocations"},UtA=new wA("Trace Tab Messages",{factory:()=>ORA});function zRA(t,e){t&1&&Ni(0,"div",8)}function PRA(t,e){if(t&1&&(ti(0,"span",14),K(1),Ii()),t&2){let A=y().$implicit,i=y();En("left",i.getRelativeStart(A.span)+5,"%"),p(),Fe("",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms")}}function jRA(t,e){if(t&1){let A=zA();ti(0,"div",5),pc("click",function(){let n=rA(A).$implicit,o=y();return sA(o.selectRow(n))})("mouseenter",function(){let n=rA(A).$implicit,o=y();return sA(o.onHover(n))})("mouseleave",function(){rA(A);let n=y();return sA(n.onHoverOut())}),ti(1,"div",6)(2,"div",7),Gt(3,zRA,1,0,"div",8,fd),Ii(),ti(5,"span",9),K(6),Ii(),ti(7,"div",10),K(8),Ii()(),ti(9,"div",11)(10,"div",12),K(11),Ii(),V(12,PRA,2,3,"span",13),Ii()()}if(t&2){let A=e.$implicit,i=y();ae("selected",i.rowSelected(A)),p(3),Kt(i.getArray(A.level)),p(2),ae("is-event-row",i.isEventRow(A)),p(),Fe(" ",i.getSpanIcon(A.span.name)," "),p(),En("width",400-A.level*20,"px"),ae("is-event-row",i.isEventRow(A)),p(),Fe(" ",A.span.name," "),p(2),En("left",i.getRelativeStart(A.span),"%")("width",i.getRelativeWidth(A.span),"%"),p(),Fe(" ",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms "),p(),W(i.getRelativeWidth(A.span)<10?12:-1)}}var vy=class t{spans=[];invocationId="";tree=[];eventData;baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([["Invocation","start"],["agent_run","robot"],["invoke_agent","robot_2"],["tool","build"],["execute_tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=h($C);constructor(){}ngOnInit(){this.tree=this.buildSpanTree(this.spans),this.flatTree=this.flattenTree(this.tree);let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.traceService.selectedTraceRow$.subscribe(A=>this.selectedRow=A),this.traceService.eventData$.subscribe(A=>this.eventData=A)}buildSpanTree(e){let A=e.map(o=>BA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let a=i.get(o.parent_span_id);a.children=a.children||[],a.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return"start"}getArray(e){return Array.from({length:e})}selectRow(e){if(this.selectedRow&&this.selectedRow.span_id==e.span.span_id){this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,this.invocationId);return}this.traceService.selectedRow(e.span),this.traceService.setHoveredMessages(e.span,this.invocationId)}rowSelected(e){return this.selectedRow==e.span}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes["gcp.vertex.agent.event_id"];return!!(A&&this.eventData&&this.eventData.has(A))}onHover(e){this.traceService.setHoveredMessages(e.span,this.invocationId)}onHoverOut(){this.traceService.setHoveredMessages(void 0,this.invocationId),this.selectedRow&&this.traceService.setHoveredMessages(this.selectedRow,this.invocationId)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId"},decls:8,vars:1,consts:[[2,"margin-top","15px"],[1,"invocation-id-container"],[1,"invocation-id"],[1,"trace-container"],[1,"trace-row",3,"selected"],[1,"trace-row",3,"click","mouseenter","mouseleave"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"left"],[1,"short-trace-bar-duration"]],template:function(A,i){A&1&&(ti(0,"div",0)(1,"div",1),K(2,"Invocation ID: "),ti(3,"div",2),K(4),Ii()(),ti(5,"div",3),Gt(6,jRA,13,16,"div",4,Ri),Ii()()),A&2&&(p(4),qA(i.invocationId),p(2),Kt(i.flatTree))},styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tree-trace-label-color);font-family:Google Sans Mono,monospace;font-size:13px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.trace-bar-container[_ngcontent-%COMP%]{width:100%;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tree-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tree-trace-bar-color);font-family:Google Sans}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color)}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tree-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px;align-items:center;cursor:pointer}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--trace-tree-trace-row-hover-background-color)}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--trace-tree-trace-row-selected-background-color)}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tree-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tree-horizontal-line-background-color)}.trace-row-left[_ngcontent-%COMP%]{display:flex;width:50%}.invocation-id-container[_ngcontent-%COMP%]{color:var(--trace-tree-invocation-id-container-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px;margin-bottom:5px}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}"]})};function qRA(t,e){if(t&1&&(m(0,"div",1),K(1),D()),t&2){let A=y();p(),qA(A.i18n.noInvocationsFound)}}function VRA(t,e){if(t&1&&(m(0,"div",4)(1,"mat-expansion-panel")(2,"mat-expansion-panel-header")(3,"mat-panel-title"),K(4),D()(),GA(5,"app-trace-tree",5),D()()),t&2){let A=e.$implicit,i=y(2);p(4),Fe(" ",i.invocToUserMsg.get(A.key)," "),p(),X("spans",A.value)("invocationId",i.findInvocIdFromTraceId(A.key))}}function WRA(t,e){if(t&1&&(m(0,"h2",2),K(1),D(),m(2,"div",3),Gt(3,VRA,6,3,"div",4,Ri),oi(5,"keyvalue"),D()),t&2){let A=y();p(),qA(A.i18n.invocationsTitle),p(2),Kt(hL(5,1,A.invocTraces,A.mapOrderPreservingSort))}}var by=class t{traceData=[];invocTraces=new Map;invocToUserMsg=new Map;i18n=h(UtA);constructor(){}ngOnInit(){}ngOnChanges(e){"traceData"in e&&this.rebuildTrace()}rebuildTrace(){this.invocTraces=this.traceData.reduce((e,A)=>{let i=A.trace_id,n=e.get(i);return n?(n.push(A),n.sort((o,a)=>o.start_time-a.start_time)):e.set(i,[A]),e},new Map);for(let[e,A]of this.invocTraces)this.invocToUserMsg.set(e,this.findUserMsgFromInvocGroup(A))}getArray(e){return Array.from({length:e})}findUserMsgFromInvocGroup(e){let A=e?.find(i=>i.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in i.attributes&&"gcp.vertex.agent.llm_request"in i.attributes);if(!A)return"[no invocation id found]";try{return JSON.parse(A.attributes["gcp.vertex.agent.llm_request"]).contents.filter(o=>o.role=="user").at(-1)?.parts[0]?.text??"[attachment]"}catch(i){return"[error parsing request]"}}findInvocIdFromTraceId(e){return this.invocTraces.get(e)?.find(i=>i.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in i.attributes).attributes["gcp.vertex.agent.invocation_id"]}mapOrderPreservingSort=(e,A)=>0;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-trace-tab"]],inputs:{traceData:"traceData"},features:[ei],decls:3,vars:1,consts:[[1,"trace-wrapper"],[1,"empty-state"],["mat-dialog-title","",1,"trace-title"],[1,"trace-list-wrapper"],[1,"trace-item"],[3,"spans","invocationId"]],template:function(A,i){A&1&&(m(0,"div",0),V(1,qRA,2,1,"div",1)(2,WRA,6,4),D()),A&2&&(p(),W(i.invocTraces.size===0?1:2))},dependencies:[ya,y9,bY,MY,vy,bf],styles:[".trace-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px}.trace-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{padding-top:1em;text-align:center;font-style:italic}.trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-title[_ngcontent-%COMP%]{color:var(--trace-tab-trace-title-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tab-trace-label-color);text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tab-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tab-trace-bar-color);font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tab-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tab-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tab-horizontal-line-background-color)}.trace-item[_ngcontent-%COMP%]{margin-top:5px;--mat-expansion-container-background-color: var(--trace-tab-trace-item-container-background-color);--mat-expansion-header-focus-state-layer-color: var(--trace-tab-trace-item-header-focus-state-layer-color);--mat-expansion-header-description-color: var(--trace-tab-trace-item-header-description-color);--mat-expansion-header-text-size: 15}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded:focus{background-color:var(--trace-tab-mat-expansion-panel-header-focus-background-color)}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded{background-color:var(--trace-tab-mat-expansion-panel-header-background-color)}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded:hover{background-color:var(--trace-tab-mat-expansion-panel-header-hover-background-color)} .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden} .mat-expansion-panel-header-description{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}"]})};var ZRA={agentDevelopmentKitLabel:"Agent Development Kit",collapsePanelTooltip:"Collapse panel",traceTabLabel:"Trace",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Eval",selectEventAriaLabel:"Select event",eventDetailsTabLabel:"Event",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available"},JtA=new wA("Side Panel Messages",{factory:()=>ZRA});var XRA=["evalTabContainer"];function $RA(t,e){t&1&&$i(0)}function ANA(t,e){if(t&1&&(m(0,"div"),yt(1,$RA,1,0,"ng-container",13),m(2,"div",14),K(3,"Powered by Agent Development Kit"),D()()),t&2){let A=y(2);p(),X("ngComponentOutlet",A.logoComponent)}}function eNA(t,e){if(t&1&&(GA(0,"img",15),K(1)),t&2){let A=y(2);p(),Fe(" ",A.i18n.agentDevelopmentKitLabel," ")}}function tNA(t,e){if(t&1&&(m(0,"mat-option",21),K(1),D()),t&2){let A=e.$implicit;X("value",A),p(),qA(A)}}function iNA(t,e){t&1&&Gt(0,tNA,2,2,"mat-option",21,Ri),t&2&&Kt(e)}function nNA(t,e){if(t&1&&(m(0,"mat-option",21),K(1),D()),t&2){let A=y(3);X("value",A.selectedAppControl().value),p(),qA(A.selectedAppControl().value)}}function oNA(t,e){if(t&1){let A=zA();m(0,"div",22)(1,"mat-icon",23),$("click",function(){rA(A);let n=y(3);return sA(n.openAddItemDialog.emit(!0))}),K(2,"add"),D(),m(3,"mat-icon",24),$("click",function(){rA(A);let n=y(3);return sA(!n.disableBuilderIcon()&&n.enterBuilderMode.emit(!0))}),K(4,"edit"),D()()}if(t&2){let A=y(3);p(3),En("cursor",A.disableBuilderIcon()?"not-allowed":"pointer")("opacity",A.disableBuilderIcon()?"0.5":"1")("margin-right",32,"px"),X("matTooltip",A.disableBuilderIcon()?"This agent was not built by builder":"Edit in Builder Mode")}}function aNA(t,e){if(t&1){let A=zA();m(0,"div",12)(1,"div",16)(2,"mat-select",17),$("selectionChange",function(n){rA(A);let o=y(2);return sA(o.appSelectionChange.emit(n))})("openedChange",function(){rA(A);let n=y(2);return sA(n.agentSearchControl.setValue(""))}),m(3,"mat-option",18),$("click",function(n){return n.stopPropagation()}),m(4,"mat-form-field",19),$("click",function(n){return n.stopPropagation()}),m(5,"input",20),$("click",function(n){return n.stopPropagation()})("keydown",function(n){return n.stopPropagation()}),D()()(),V(6,iNA,2,0),oi(7,"async"),V(8,nNA,2,2,"mat-option",21),D()(),V(9,oNA,5,7,"div",22),D()}if(t&2){let A,i=y(2);p(2),X("placeholder",i.isLoadingApps()()?"Loading...":"Select an agent")("formControl",i.selectedAppControl()),p(),X("value",null),p(2),X("formControl",i.agentSearchControl),p(),W((A=li(7,7,i.filteredApps$))?6:-1,A),p(2),W(i.selectedAppControl().value&&i.isLoadingApps()()?8:-1),p(),W(i.isBuilderMode()?-1:9)}}function rNA(t,e){if(t&1){let A=zA();m(0,"div",6)(1,"div",7)(2,"div",8)(3,"div",9),V(4,ANA,4,1,"div")(5,eNA,2,1),D(),m(6,"div",10),GA(7,"app-theme-toggle"),m(8,"span",11),$("click",function(){rA(A);let n=y();return sA(n.closePanel.emit())}),K(9,"left_panel_close"),D()()()()(),V(10,aNA,10,9,"div",12),oi(11,"async")}if(t&2){let A=y();p(4),W(A.logoComponent?4:5),p(4),X("matTooltip",MI(A.i18n.collapsePanelTooltip)),p(2),W(li(11,4,A.isApplicationSelectorEnabledObs())?10:-1)}}function sNA(t,e){t&1&&(m(0,"div",2),GA(1,"mat-progress-spinner",25),D())}function gNA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.sessionsTabLabel)}}function lNA(t,e){t&1&&$i(0)}function cNA(t,e){if(t&1&&(m(0,"mat-tab",27),yt(1,gNA,2,1,"ng-template",28)(2,lNA,1,0,"ng-container",30),D()),t&2){y();let A=Wi(16);p(2),X("ngTemplateOutlet",A)}}function CNA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.traceTabLabel)}}function INA(t,e){if(t&1&&(m(0,"mat-tab",27),yt(1,CNA,2,1,"ng-template",28),GA(2,"app-trace-tab",32),D()),t&2){let A=y(2);p(2),X("traceData",A.traceData())}}function dNA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(2);p(),qA(A.i18n.stateTabLabel)}}function BNA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.artifactsTabLabel)}}function QNA(t,e){if(t&1&&(m(0,"mat-tab"),yt(1,BNA,2,1,"ng-template",28),GA(2,"app-artifact-tab",33),D()),t&2){let A=y(2);p(2),X("artifacts",A.artifacts())}}function ENA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.sessionsTabLabel)}}function hNA(t,e){t&1&&$i(0)}function uNA(t,e){if(t&1&&(m(0,"mat-tab",27),yt(1,ENA,2,1,"ng-template",28)(2,hNA,1,0,"ng-container",30),D()),t&2){y();let A=Wi(16);p(2),X("ngTemplateOutlet",A)}}function fNA(t,e){if(t&1&&(m(0,"span",31),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.evalTabLabel)}}function mNA(t,e){t&1&&(m(0,"mat-tab"),yt(1,fNA,2,1,"ng-template",28),$i(2,null,1),D())}function pNA(t,e){if(t&1){let A=zA();m(0,"app-session-tab",34),$("sessionSelected",function(n){rA(A);let o=y(2);return sA(o.sessionSelected.emit(n))})("sessionReloaded",function(n){rA(A);let o=y(2);return sA(o.sessionReloaded.emit(n))}),D()}if(t&2){let A=y(2);X("userId",A.userId())("appName",A.appName())("sessionId",A.sessionId())}}function DNA(t,e){if(t&1){let A=zA();m(0,"div",3)(1,"mat-tab-group",26),$("selectedTabChange",function(n){rA(A);let o=y();return sA(o.tabChange.emit(n))}),wr(2),oi(3,"async"),V(4,cNA,3,1,"mat-tab",27),V(5,INA,3,1,"mat-tab",27),oi(6,"async"),m(7,"mat-tab"),yt(8,dNA,2,1,"ng-template",28),GA(9,"app-state-tab",29),D(),V(10,QNA,3,1,"mat-tab"),oi(11,"async"),V(12,uNA,3,1,"mat-tab",27),V(13,mNA,4,0,"mat-tab"),oi(14,"async"),D(),yt(15,pNA,1,3,"ng-template",null,0,NC),D()}if(t&2){let A=y(),i=vs(2);X("hidden",i);let n=li(3,7,A.isSessionsTabReorderingEnabledObs);p(4),W(n?4:-1),p(),W(li(6,9,A.isTraceEnabledObs)?5:-1),p(4),X("sessionState",A.currentSessionState()),p(),W(li(11,11,A.isArtifactsTabEnabledObs)?10:-1),p(2),W(n?-1:12),p(),W(li(14,13,A.isEvalEnabledObs)?13:-1)}}function wNA(t,e){if(t&1){let A=zA();m(0,"div",47),$("click",function(){rA(A);let n=y(3);return sA(n.openImageDialog.emit(n.rawSvgString()))}),D()}if(t&2){let A=y(3);X("innerHtml",A.renderedEventGraph(),xg)}}function yNA(t,e){if(t&1&&(m(0,"div",41),V(1,wNA,1,1,"div",46),D()),t&2){let A=y(2);p(),W(A.renderedEventGraph()?1:-1)}}function vNA(t,e){t&1&&(m(0,"div",48),GA(1,"mat-progress-spinner",25),D())}function bNA(t,e){if(t&1&&(m(0,"div",49),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.requestIsNotAvailable)}}function MNA(t,e){if(t&1&&(m(0,"div",42),GA(1,"ngx-json-viewer",43),D()),t&2){let A=y(3);p(),X("json",A.llmRequest())}}function kNA(t,e){if(t&1&&(m(0,"mat-tab",40),V(1,vNA,2,0,"div",48),oi(2,"async"),D0(3,bNA,2,1,"div",49)(4,MNA,2,1,"div",42),D()),t&2){let A=y(2);X("label",MI(A.i18n.requestDetailsTabLabel)),p(),W(li(2,3,A.uiStateService.isEventRequestResponseLoading())===!0?1:A.llmRequest()?4:3)}}function SNA(t,e){t&1&&(m(0,"div",48),GA(1,"mat-progress-spinner",25),D())}function xNA(t,e){if(t&1&&(m(0,"div",49),K(1),D()),t&2){let A=y(3);p(),qA(A.i18n.responseIsNotAvailable)}}function RNA(t,e){if(t&1&&(m(0,"div",42),GA(1,"ngx-json-viewer",43),D()),t&2){let A=y(3);p(),X("json",A.llmResponse())}}function NNA(t,e){if(t&1&&(m(0,"mat-tab",40),V(1,SNA,2,0,"div",48),oi(2,"async"),D0(3,xNA,2,1,"div",49)(4,RNA,2,1,"div",42),D()),t&2){let A=y(2);X("label",MI(A.i18n.responseDetailsTabLabel)),p(),W(li(2,3,A.uiStateService.isEventRequestResponseLoading())===!0?1:A.llmResponse()?4:3)}}function FNA(t,e){if(t&1&&(m(0,"mat-tab",44)(1,"div",42),GA(2,"ngx-json-viewer",43),D()()),t&2){let A,i=y(2);p(2),X("json",(A=i.selectedEvent())==null||A.actions==null?null:A.actions.stateDelta)}}function LNA(t,e){if(t&1&&(m(0,"mat-tab",45),GA(1,"app-artifact-tab",33),D()),t&2){let A=y(2);p(),X("artifacts",A.artifactDeltaArray())}}function _NA(t,e){if(t&1){let A=zA();m(0,"div",4)(1,"div",35)(2,"div",36)(3,"mat-paginator",37),$("page",function(n){rA(A);let o=y();return sA(o.page.emit(n))}),D(),m(4,"button",38)(5,"mat-icon",39),$("click",function(){rA(A);let n=y();return sA(n.closeSelectedEvent.emit())}),K(6,"close"),D()()()(),m(7,"div")(8,"mat-tab-group")(9,"mat-tab",40),V(10,yNA,2,1,"div",41),m(11,"div",42),GA(12,"ngx-json-viewer",43),D()(),V(13,kNA,5,5,"mat-tab",40),oi(14,"async"),V(15,NNA,5,5,"mat-tab",40),oi(16,"async"),V(17,FNA,3,1,"mat-tab",44),V(18,LNA,2,1,"mat-tab",45),D()()()}if(t&2){let A,i,n,o=y(),a=vs(2);X("hidden",a),p(3),X("length",o.eventData().size)("pageSize",1)("pageIndex",o.selectedEventIndex()),ie("aria-label",o.i18n.selectEventAriaLabel),p(6),X("label",MI(o.i18n.eventDetailsTabLabel)),p(),W(((A=o.selectedEvent())==null?null:A.author)!=="user"?10:-1),p(2),X("json",o.selectedEvent()),p(),W(li(14,13,o.uiStateService.isEventRequestResponseLoading())===!0||o.llmRequest()&&o.Object.keys(o.llmRequest()).length>0?13:-1),p(2),W(li(16,15,o.uiStateService.isEventRequestResponseLoading())===!0||o.llmResponse()&&o.Object.keys(o.llmResponse()).length>0?15:-1),p(2),W(!((i=o.selectedEvent())==null||i.actions==null)&&i.actions.stateDelta&&o.Object.keys((i=o.selectedEvent())==null||i.actions==null?null:i.actions.stateDelta).length>0?17:-1),p(),W(!((n=o.selectedEvent())==null||n.actions==null)&&n.actions.artifactDelta&&o.Object.keys((n=o.selectedEvent())==null||n.actions==null?null:n.actions.artifactDelta).length>0?18:-1)}}var KE=class t{Object=Object;appName=nt("");userId=nt("");sessionId=nt("");traceData=nt([]);eventData=nt(new Map);currentSessionState=nt();artifacts=nt([]);selectedEvent=nt();selectedEventIndex=nt();renderedEventGraph=nt();rawSvgString=nt(null);llmRequest=nt();llmResponse=nt();showSidePanel=nt(!1);isApplicationSelectorEnabledObs=nt(oe(!1));apps$=nt(oe([]));isLoadingApps=nt(jA(!1));selectedAppControl=nt(new ss("",{nonNullable:!0}));isBuilderMode=nt(!1);disableBuilderIcon=nt(!1);closePanel=No();appSelectionChange=No();tabChange=No();sessionSelected=No();sessionReloaded=No();evalCaseSelected=No();evalSetIdSelected=No();returnToSession=No();evalNotInstalled=No();page=No();closeSelectedEvent=No();openImageDialog=No();openAddItemDialog=No();enterBuilderMode=No();sessionTabComponent=Xo(GE);evalTabComponent=Xo(Qc);evalTabContainer=Xo("evalTabContainer",{read:Ro});logoComponent=h(wy,{optional:!0});i18n=h(JtA);featureFlagService=h(lr);evalTabComponentClass=h(py,{optional:!0});environmentInjector=h(pr);uiStateService=h(Tg);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;isSessionsTabReorderingEnabledObs=this.featureFlagService.isSessionsTabReorderingEnabled();agentSearchControl=new ss("",{nonNullable:!0});filteredApps$=Tn(this.apps$).pipe(Ei(e=>Va([e,this.agentSearchControl.valueChanges.pipe(nn(""))])),fe(([e,A])=>{if(!e||!A||A.trim()==="")return e;let i=A.toLowerCase().trim();return e.filter(n=>n.toLowerCase().startsWith(i))}));artifactDeltaArray=_e(()=>{let e=this.selectedEvent()?.actions?.artifactDelta;if(!e||Object.keys(e).length===0)return[];let A=[];for(let[i,n]of Object.entries(e)){let o=n;A.push({id:i,versionId:1,data:o.data||"",mimeType:o.mimeType||"",mediaType:M4(o.mimeType||"")})}return A});ngAfterViewInit(){setTimeout(()=>{this.initEvalTab()},500)}initEvalTab(){this.isEvalEnabledObs.pipe(po()).subscribe(e=>{if(e){let A=this.evalTabContainer()?.createComponent(this.evalTabComponentClass??Qc,{environmentInjector:this.environmentInjector});if(!A)return;Ya(this.environmentInjector,()=>{pa(()=>{A.setInput("appName",this.appName()),A.setInput("userId",this.userId()),A.setInput("sessionId",this.sessionId())})}),A.instance.sessionSelected.subscribe(i=>{this.sessionSelected.emit(i)}),A.instance.evalCaseSelected.subscribe(i=>{this.evalCaseSelected.emit(i)}),A.instance.evalSetIdSelected.subscribe(i=>{this.evalSetIdSelected.emit(i)}),A.instance.shouldReturnToSession.subscribe(i=>{this.returnToSession.emit(i)}),A.instance.evalNotInstalledMsg.subscribe(i=>{this.evalNotInstalled.emit(i)})}})}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-side-panel"]],viewQuery:function(A,i){A&1&&Or(i.sessionTabComponent,GE,5)(i.evalTabComponent,Qc,5)(i.evalTabContainer,XRA,5,Ro),A&2&&rr(3)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],apps$:[1,"apps$"],isLoadingApps:[1,"isLoadingApps"],selectedAppControl:[1,"selectedAppControl"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"]},outputs:{closePanel:"closePanel",appSelectionChange:"appSelectionChange",tabChange:"tabChange",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode"},decls:8,vars:9,consts:[["sessionsTabBody",""],["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"details-panel-container",3,"hidden"],[1,"resize-handler"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],[2,"display","flex","align-items","center","gap","8px"],[1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer","margin-right","15px",3,"click","matTooltip"],[1,"app-actions"],[4,"ngComponentOutlet"],[1,"powered-by-adk"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[1,"app-select-container"],["panelClass","wide-agent-dropdown-panel",1,"app-select",3,"selectionChange","openedChange","placeholder","formControl"],[1,"search-option",3,"click","value"],["subscriptSizing","dynamic",1,"agent-search-field",3,"click"],["matInput","","placeholder","Search agents...",3,"click","keydown","formControl"],[1,"app-name-option",3,"value"],[1,"mode-toggle-container"],["matTooltip","Create new agent","matTooltipPosition","below",2,"cursor","pointer","margin-right","16px",3,"click"],[3,"click","matTooltip"],["mode","indeterminate","diameter","50"],[3,"selectedTabChange"],[1,"tabs-header"],["mat-tab-label",""],[3,"sessionState"],[4,"ngTemplateOutlet"],[1,"tab-label"],[3,"traceData"],[3,"artifacts"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"details-content"],[2,"display","flex","justify-content","flex-end","margin-top","10px"],[1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-mini-fab",""],[3,"click"],[3,"label"],[1,"event-graph-container"],[1,"json-viewer-container"],[3,"json"],["label","State"],["label","Artifact"],[3,"innerHtml"],[3,"click","innerHtml"],[1,"request-response-loading-spinner-container"],[1,"request-response-empty-state"]],template:function(A,i){if(A&1&&(V(0,rNA,12,6),oi(1,"async"),wr(2),oi(3,"async"),V(4,sNA,2,0,"div",2),V(5,DNA,17,15,"div",3),V(6,_NA,19,17,"div",4),GA(7,"div",5)),A&2){W(li(1,4,i.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),p(2);let n=sg(li(3,6,i.uiStateService.isSessionLoading()));p(2),W(n?4:-1),p(),W(i.appName()!=""&&i.showSidePanel()?5:-1),p(),W(i.selectedEvent()&&i.showSidePanel()?6:-1)}},dependencies:[yn,ro,so,FC,Ng,Ba,Dy,ef,wF,mE,by,yy,f6,GE,DJ,em,In,Gc,XC,Mr,Yg,bc,SI,uI,To,wa,Pr],styles:[".drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: var(--side-panel-button-filled-container-color);--mat-button-filled-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center}.tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:20px}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{background:var(--side-panel-resize-handler-background-color);width:4px;border-radius:4px;position:absolute;display:block;height:20%;top:40%;right:0;z-index:9999;cursor:ew-resize}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-top:-8px;margin-right:auto;background-color:inherit;display:flex;justify-content:center}[_nghost-%COMP%] .mat-mdc-paginator-page-size{display:none}.details-panel-container[_ngcontent-%COMP%]{position:absolute;width:100%;height:98%;left:0;right:0;bottom:0;background:var(--side-panel-details-panel-container-background-color);display:inline-block;justify-content:center;align-items:center;z-index:10}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-container[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:16px;display:flex;justify-content:center;max-height:33%;cursor:pointer}.event-graph-container[_ngcontent-%COMP%] svg{width:100%;height:100%;display:block;object-fit:contain}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.app-select[_ngcontent-%COMP%]{width:100%}.app-select-container[_ngcontent-%COMP%]{width:60%;margin-top:12px;background-color:var(--side-panel-app-select-container-background-color);margin-left:10px;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: var(--side-panel-select-placeholder-text-color);--mat-select-enabled-trigger-text-color: var(--side-panel-select-enabled-trigger-text-color);--mat-select-enabled-arrow-color: var(--side-panel-select-enabled-arrow-color)}.app-name-option[_ngcontent-%COMP%]{color:var(--side-panel-app-name-option-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:12px;padding-right:12px}.app-select[_ngcontent-%COMP%]{color:var(--side-panel-app-name-option-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-right:20px}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.build-mode-button.mat-mdc-unelevated-button[_ngcontent-%COMP%]{height:30px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-top:12px;margin-left:10px}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}[_nghost-%COMP%] .mat-mdc-tooltip .mdc-tooltip__surface{max-width:250px;white-space:wrap;font-size:11px}[_nghost-%COMP%] .wide-agent-dropdown-panel{min-width:300px;max-width:600px;max-height:400px}[_nghost-%COMP%] .wide-agent-dropdown-panel .mat-mdc-option{white-space:normal;line-height:1.4;height:auto;min-height:48px;padding:8px 16px}[_nghost-%COMP%] .wide-agent-dropdown-panel .search-option{position:sticky!important;top:0!important;z-index:1000!important;background-color:var(--mat-select-panel-background-color, white)!important;padding:8px 16px!important;border-bottom:1px solid var(--mat-divider-color, rgba(0, 0, 0, .12));min-height:auto!important;height:auto!important;box-shadow:0 2px 4px #0000001a;opacity:1!important}[_nghost-%COMP%] .wide-agent-dropdown-panel .search-option:hover{background-color:var(--mat-select-panel-background-color, white)!important}[_nghost-%COMP%] .wide-agent-dropdown-panel .search-option.mat-mdc-option.mat-mdc-option-active{background-color:var(--mat-select-panel-background-color, white)!important}.agent-search-field[_ngcontent-%COMP%]{width:100%}.agent-search-field[_ngcontent-%COMP%] .mat-mdc-form-field-subscript-wrapper[_ngcontent-%COMP%]{display:none}"]})};function GNA(t,e){t&1&&GA(0,"mat-progress-spinner",6)}function KNA(t,e){t&1&&(m(0,"div"),K(1,"Request is not available."),D())}function UNA(t,e){if(t&1&&(m(0,"div",3),GA(1,"ngx-json-viewer",4),D()),t&2){let A=y();p(),X("json",A.llmRequest)}}function JNA(t,e){t&1&&GA(0,"mat-progress-spinner",6)}function YNA(t,e){t&1&&(m(0,"div"),K(1,"Response is not available."),D())}function HNA(t,e){if(t&1&&(m(0,"div",3),GA(1,"ngx-json-viewer",4),D()),t&2){let A=y();p(),X("json",A.llmResponse)}}function TNA(t,e){if(t&1){let A=zA();m(0,"div",12),$("click",function(){rA(A);let n=y();return sA(n.openViewImageDialog(n.rawSvgString))}),D()}if(t&2){let A=y();X("innerHtml",A.renderedEventGraph,xg)}}var My=class t{userId="";sessionId="";appName="";panelClosed=new WA;renderedEventGraph;eventData;selectedRow=void 0;rawSvgString=null;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";dialog=h(Qs);traceService=h($C);eventService=h(lB);graphService=h(cB);featureFlagService=h(lr);sanitizer=h(Wr);uiStateService=h(Tg);isEventFilteringEnabled=Is(this.featureFlagService.isEventFilteringEnabled());constructor(){}ngOnInit(){this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e;let A=this.getEventIdFromSpan();if(A){let i;this.isEventFilteringEnabled()&&this.selectedRow?.invoc_id&&this.selectedRow?.start_time&&(i={invocationId:this.selectedRow.invoc_id,timestamp:this.selectedRow.start_time/1e6});let n=BA({id:A},i);this.eventService.getEventTrace(n).pipe(Wt(()=>{this.uiStateService.setIsEventRequestResponseLoading(!0)})).subscribe(o=>{this.llmRequest=JSON.parse(o[this.llmRequestKey]),this.llmResponse=JSON.parse(o[this.llmResponseKey]),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.getEventGraph(A)}}),this.traceService.eventData$.subscribe(e=>this.eventData=e)}openViewImageDialog(e){let A=this.dialog.open(a2,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}getEventDetails(){if(this.eventData&&this.selectedRow)return this.eventData.get(this.getEventIdFromSpan())}getEventIdFromSpan(){if(this.selectedRow)return this.selectedRow.attributes["gcp.vertex.agent.event_id"]}getEventGraph(e){this.eventService.getEvent(this.userId,this.appName,this.sessionId,e).subscribe(A=>ct(this,null,function*(){if(!A.dotSrc){this.renderedEventGraph=void 0;return}let i=A.dotSrc,n=yield this.graphService.render(i);this.rawSvgString=n,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(n)}))}closePanel(){this.panelClosed.emit(!0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-trace-event"]],inputs:{userId:"userId",sessionId:"sessionId",appName:"appName"},outputs:{panelClosed:"panelClosed"},decls:21,vars:8,consts:[[1,"wrapper"],["mat-stretch-tabs","false","mat-align-tabs","start"],["label","Event"],[1,"json-viewer-container"],[3,"json"],["label","Request"],["mode","indeterminate"],["label","Response"],["label","Graph"],[1,"event-graph-container"],[3,"innerHtml"],["mat-icon-button","",1,"tab-header-action",3,"click"],[3,"click","innerHtml"]],template:function(A,i){A&1&&(m(0,"div",0)(1,"mat-tab-group",1)(2,"mat-tab",2)(3,"div",3),GA(4,"ngx-json-viewer",4),D()(),m(5,"mat-tab",5),V(6,GNA,1,0,"mat-progress-spinner",6),oi(7,"async"),D0(8,KNA,2,0,"div")(9,UNA,2,1,"div",3),D(),m(10,"mat-tab",7),V(11,JNA,1,0,"mat-progress-spinner",6),oi(12,"async"),D0(13,YNA,2,0,"div")(14,HNA,2,1,"div",3),D(),m(15,"mat-tab",8)(16,"div",9),V(17,TNA,1,1,"div",10),D()()(),m(18,"button",11),$("click",function(){return i.closePanel()}),m(19,"mat-icon"),K(20,"close"),D()()()),A&2&&(p(4),X("json",i.getEventDetails()),p(2),W(li(7,4,i.uiStateService.isEventRequestResponseLoading())===!0?6:i.llmRequest?9:8),p(5),W(li(12,6,i.uiStateService.isEventRequestResponseLoading())===!0?11:i.llmResponse?14:13),p(6),W(i.renderedEventGraph?17:-1))},dependencies:[Dy,ef,Gc,XC,Ia,In,uI,Pr],styles:[".json-viewer-container[_ngcontent-%COMP%]{padding-top:8px;padding-left:12px;padding-right:12px;background-color:var(--trace-event-json-viewer-container-background-color)}.event-graph-container[_ngcontent-%COMP%]{text-align:center;padding-top:20px}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}.wrapper[_ngcontent-%COMP%]{position:relative}.tab-header-action[_ngcontent-%COMP%]{position:absolute;top:0;right:0;height:48px;z-index:2;margin-right:10px}"]})};var ONA={openPanelTooltip:"Open panel",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session ID",userIdLabel:"User ID",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete current session",exportSessionTooltip:"Export current session",importSessionTooltip:"Import session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent on the left to begin with.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder.",cannotEditSessionMessage:"Chat is disabled to prevent changes to the end user's session.",readOnlyBadgeLabel:"Read-only",disclosureTooltip:"ADK Web is for development purposes. It has access to all the data and should not be used in production.",adkWebDeveloperUiMessage:"ADK Web Developer UI"},YtA=new wA("Chat Messages",{factory:()=>ONA});var zNA=["sideDrawer"],PNA=["bottomPanel"],jNA=[[["","adk-web-chat-container-top",""]]],qNA=["[adk-web-chat-container-top]"],VNA=t=>({"edit-mode":t}),WNA=()=>[];function ZNA(t,e){if(t&1){let A=zA();m(0,"span",8),$("click",function(){rA(A);let n=y();return sA(n.toggleSidePanel())}),K(1,"left_panel_open"),D()}if(t&2){let A=y();X("matTooltip",A.i18n.openPanelTooltip)}}function XNA(t,e){if(t&1){let A=zA();m(0,"app-side-panel",9),$("closePanel",function(){rA(A);let n=y();return sA(n.toggleSidePanel())})("tabChange",function(n){rA(A);let o=y();return sA(o.handleTabChange(n))})("sessionSelected",function(n){rA(A);let o=y();return sA(o.updateWithSelectedSession(n))})("sessionReloaded",function(n){rA(A);let o=y();return sA(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){rA(A);let o=y();return sA(o.updateWithSelectedEvalCase(n))})("evalSetIdSelected",function(n){rA(A);let o=y();return sA(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){rA(A);let o=y();return sA(o.handleReturnToSession(n))})("evalNotInstalled",function(n){rA(A);let o=y();return sA(o.handleEvalNotInstalled(n))})("page",function(n){rA(A);let o=y();return sA(o.handlePageEvent(n))})("closeSelectedEvent",function(){rA(A);let n=y();return sA(n.closeSelectedEvent())})("openImageDialog",function(n){rA(A);let o=y();return sA(o.openViewImageDialog(n))})("appSelectionChange",function(n){rA(A);let o=y();return sA(o.onAppSelection(n))})("openAddItemDialog",function(){rA(A);let n=y();return sA(n.openAddItemDialog())})("enterBuilderMode",function(){rA(A);let n=y();return sA(n.enterBuilderMode())}),D()}if(t&2){let A=y();X("isApplicationSelectorEnabledObs",A.isApplicationSelectorEnabledObs)("apps$",A.apps$)("isLoadingApps",A.isLoadingApps)("selectedAppControl",A.selectedAppControl)("showSidePanel",A.showSidePanel)("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)("traceData",A.traceData)("eventData",A.eventData)("currentSessionState",A.currentSessionState)("artifacts",A.artifacts)("selectedEvent",A.selectedEvent)("selectedEventIndex",A.selectedEventIndex)("renderedEventGraph",A.renderedEventGraph)("rawSvgString",A.rawSvgString)("llmRequest",A.llmRequest)("llmResponse",A.llmResponse)("disableBuilderIcon",A.disableBuilderSwitch)}}function $NA(t,e){if(t&1){let A=zA();m(0,"app-builder-tabs",10),$("exitBuilderMode",function(){rA(A);let n=y();return sA(n.exitBuilderMode())})("closePanel",function(){rA(A);let n=y();return sA(n.toggleSidePanel())}),D(),GA(1,"div",11)}if(t&2){let A=y();X("appNameInput",A.appName)}}function AFA(t,e){if(t&1){let A=zA();m(0,"div",6)(1,"div",12)(2,"button",13),$("click",function(){rA(A);let n=y();return sA(n.saveAgentBuilder())}),m(3,"mat-icon"),K(4,"check"),D()(),m(5,"button",14),$("click",function(){rA(A);let n=y();return sA(n.exitBuilderMode())}),m(6,"mat-icon"),K(7,"close"),D()(),m(8,"button",15),$("click",function(){rA(A);let n=y();return sA(n.toggleBuilderAssistant())}),m(9,"mat-icon"),K(10,"assistant"),D()()(),m(11,"app-canvas",16),$("toggleSidePanelRequest",function(){rA(A);let n=y();return sA(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){rA(A);let n=y();return sA(n.toggleBuilderAssistant())}),D()()}if(t&2){let A=y();p(8),ae("active",A.showBuilderAssistant),p(3),X("showSidePanel",A.showSidePanel)("showBuilderAssistant",A.showBuilderAssistant)("appNameInput",A.appName)}}function eFA(t,e){if(t&1){let A=zA();m(0,"span",23),$("click",function(){rA(A);let n=y(3);return sA(n.toggleSidePanel())}),K(1,"left_panel_open"),D()}if(t&2){let A=y(3);X("matTooltip",A.i18n.openPanelTooltip)}}function tFA(t,e){if(t&1){let A=zA();m(0,"button",28),$("click",function(){rA(A);let n=y(4);return sA(n.cancelEditEvalCase())}),K(1),D(),m(2,"button",29),$("click",function(){rA(A);let n=y(4);return sA(n.saveEvalCase())}),K(3),D()}if(t&2){let A=y(4);p(),Fe(" ",A.i18n.cancelButton," "),p(),X("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing()),p(),Fe(" ",A.i18n.saveButton," ")}}function iFA(t,e){if(t&1){let A=zA();m(0,"span",30),$("click",function(){rA(A);let n=y(4);return sA(n.editEvalCase())}),K(1," edit "),D(),m(2,"span",30),$("click",function(){rA(A);let n=y(4);return sA(n.deleteEvalCase())}),K(3," delete "),D()}if(t&2){let A=y(4);X("matTooltip",A.i18n.editEvalCaseTooltip),p(2),X("matTooltip",A.i18n.deleteEvalCaseTooltip)}}function nFA(t,e){if(t&1&&(m(0,"div",24)(1,"div",25),K(2),D(),m(3,"div",26),K(4),D()(),m(5,"div",27),V(6,tFA,4,3)(7,iFA,4,2),D()),t&2){let A=y(3);p(2),qA(A.i18n.evalCaseIdLabel),p(2),qA(A.evalCase.evalId),p(2),W(A.isEvalEditMode()?6:7)}}function oFA(t,e){if(t&1&&(m(0,"div",32),K(1),D(),m(2,"div",26),K(3),D()),t&2){let A=y(5);p(),qA(A.i18n.userIdLabel),p(2),qA(A.userId)}}function aFA(t,e){if(t&1&&(m(0,"div",33)(1,"mat-icon"),K(2,"visibility"),D(),K(3),D(),m(4,"div",34),K(5),D()),t&2){let A=y(5);p(3),Fe(" ",A.i18n.readOnlyBadgeLabel," "),p(2),qA(A.i18n.cannotEditSessionMessage)}}function rFA(t,e){if(t&1&&(m(0,"div",25),K(1),D(),m(2,"div",26),K(3),D(),V(4,oFA,4,2),oi(5,"async"),V(6,aFA,6,2)),t&2){let A=y(4);p(),qA(A.i18n.sessionIdLabel),p(2),qA(A.sessionId),p(),W(li(5,4,A.isUserIdOnToolbarEnabledObs)?4:-1),p(2),W(A.canEditSession()?-1:6)}}function sFA(t,e){if(t&1&&(m(0,"div",25),K(1),D()),t&2){let A=y(4);p(),qA(A.i18n.loadingSessionLabel)}}function gFA(t,e){if(t&1){let A=zA();m(0,"span",42),$("click",function(){rA(A);let n=y(5);return sA(n.deleteSession(n.sessionId))}),K(1," delete "),D()}if(t&2){let A=y(5);X("matTooltip",A.i18n.deleteSessionTooltip)}}function lFA(t,e){if(t&1){let A=zA();m(0,"span",43),$("click",function(){rA(A);let n=y(5);return sA(n.exportSession())}),K(1," download "),D()}if(t&2){let A=y(5);X("matTooltip",A.i18n.exportSessionTooltip)}}function cFA(t,e){if(t&1){let A=zA();m(0,"span",44),$("click",function(){rA(A);let n=y(5);return sA(n.importSession())}),K(1," upload "),D()}if(t&2){let A=y(5);X("matTooltip",A.i18n.importSessionTooltip)}}function CFA(t,e){if(t&1){let A=zA();m(0,"div",27)(1,"div",35)(2,"mat-slide-toggle",36),oi(3,"async"),$("change",function(){rA(A);let n=y(4);return sA(n.toggleSse())}),K(4),D()(),GA(5,"mat-divider",37),m(6,"div",31)(7,"div",38),$("click",function(){rA(A);let n=y(4);return sA(n.onNewSessionClick())}),m(8,"mat-icon"),K(9,"add"),D(),K(10),D(),V(11,gFA,2,1,"span",39),oi(12,"async"),V(13,lFA,2,1,"span",40),oi(14,"async"),V(15,cFA,2,1,"span",41),oi(16,"async"),D()()}if(t&2){let A=y(4);p(2),X("checked",A.enableSseIndicator())("disabled",!li(3,9,A.isTokenStreamingEnabledObs)),p(2),Fe(" ",A.i18n.tokenStreamingLabel," "),p(),X("vertical",!0),p(2),X("matTooltip",A.i18n.createNewSessionTooltip),p(3),Fe(" ",A.i18n.newSessionButton," "),p(),W(li(12,11,A.isDeleteSessionEnabledObs)?11:-1),p(2),W(li(14,13,A.isExportSessionEnabledObs)?13:-1),p(2),W(li(16,15,A.importSessionEnabledObs)?15:-1)}}function IFA(t,e){if(t&1&&(m(0,"div",31),wr(1),oi(2,"async"),V(3,rFA,7,6)(4,sFA,2,1,"div",25),D(),V(5,CFA,17,17,"div",27)),t&2){let A=li(2,2,y(3).uiStateService.isSessionLoading());p(3),W(A===!1?3:4),p(2),W(A===!1?5:-1)}}function dFA(t,e){if(t&1&&(m(0,"div",17),V(1,eFA,2,1,"span",22),V(2,nFA,8,3)(3,IFA,6,4),D()),t&2){let A=y(2);X("ngClass",zr(3,VNA,A.isEvalEditMode())),p(),W(A.showSidePanel?-1:1),p(),W(A.evalCase?2:3)}}function BFA(t,e){if(t&1&&(m(0,"div",45)(1,"span"),K(2),D()()),t&2){let A=y(3);p(2),qA(A.i18n.loadingAgentsLabel)}}function QFA(t,e){if(t&1&&(m(0,"span"),K(1),GA(2,"br"),K(3),D()),t&2){let A=y(4);p(),qA(A.i18n.welcomeMessage),p(2),Fe(" ",A.i18n.selectAgentMessage)}}function EFA(t,e){if(t&1&&(K(0),GA(1,"br"),m(2,"pre",47),K(3),D()),t&2){let A=y(5);Fe(" ",A.i18n.errorMessageLabel," "),p(3),qA(A.loadingError())}}function hFA(t,e){if(t&1&&(m(0,"pre",46),K(1),D()),t&2){let A=y(5);p(),qA(A.i18n.noAgentsFoundWarning)}}function uFA(t,e){if(t&1&&(m(0,"div"),K(1),m(2,"pre"),K(3,"adk web"),D(),K(4," in the folder that contains the agents."),GA(5,"br"),V(6,EFA,4,2)(7,hFA,2,1,"pre",46),D()),t&2){let A=y(4);p(),Fe(" ",A.i18n.failedToLoadAgentsMessage," "),p(5),W(A.loadingError()?6:7)}}function fFA(t,e){if(t&1&&(m(0,"div",45),V(1,QFA,4,2,"span"),oi(2,"async"),D0(3,uFA,8,2,"div"),D()),t&2){let A=y(3);p(),W((li(2,1,A.apps$)||WE(3,WNA)).length>0?1:3)}}function mFA(t,e){if(t&1&&(V(0,BFA,3,1,"div",45),oi(1,"async"),D0(2,fFA,4,4,"div",45)),t&2){let A=y(2);W(A.isLoadingApps()?0:li(1,1,A.isApplicationSelectorEnabledObs)?2:-1)}}function pFA(t,e){if(t&1){let A=zA();m(0,"app-chat-panel",48),oi(1,"async"),ao("userInputChange",function(n){rA(A);let o=y(2);return Vn(o.userInput,n)||(o.userInput=n),sA(n)})("userEditEvalCaseMessageChange",function(n){rA(A);let o=y(2);return Vn(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),sA(n)}),$("clickEvent",function(n){rA(A);let o=y(2);return sA(o.clickEvent(n))})("handleKeydown",function(n){rA(A);let o=y(2);return sA(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){rA(A);let o=y(2);return sA(o.cancelEditMessage(n))})("saveEditMessage",function(n){rA(A);let o=y(2);return sA(o.saveEditMessage(n))})("openViewImageDialog",function(n){rA(A);let o=y(2);return sA(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){rA(A);let o=y(2);return sA(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){rA(A);let o=y(2);return sA(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){rA(A);let o=y(2);return sA(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){rA(A);let o=y(2);return sA(o.editFunctionArgs(n))})("fileSelect",function(n){rA(A);let o=y(2);return sA(o.onFileSelect(n))})("removeFile",function(n){rA(A);let o=y(2);return sA(o.removeFile(n))})("removeStateUpdate",function(){rA(A);let n=y(2);return sA(n.removeStateUpdate())})("sendMessage",function(n){rA(A);let o=y(2);return sA(o.sendMessage(n))})("updateState",function(){rA(A);let n=y(2);return sA(n.updateState())})("toggleAudioRecording",function(){rA(A);let n=y(2);return sA(n.toggleAudioRecording())})("toggleVideoRecording",function(){rA(A);let n=y(2);return sA(n.toggleVideoRecording())})("longRunningResponseComplete",function(n){rA(A);let o=y(2);return sA(o.processRunSseResponse(n))}),D()}if(t&2){let A=y(2);X("appName",A.appName)("messages",A.messages())("isChatMode",A.isChatMode())("evalCase",A.evalCase)("isEvalEditMode",A.isEvalEditMode())("isEvalCaseEditing",A.isEvalCaseEditing())("isEditFunctionArgsEnabled",li(1,19,A.isEditFunctionArgsEnabledObs)??!1),oo("userInput",A.userInput)("userEditEvalCaseMessage",A.userEditEvalCaseMessage),X("selectedFiles",A.selectedFiles)("updatedSessionState",A.updatedSessionState())("eventData",A.eventData)("selectedEvent",A.selectedEvent)("isAudioRecording",A.isAudioRecording)("isVideoRecording",A.isVideoRecording)("hoveredEventMessageIndices",A.hoveredEventMessageIndices)("userId",A.userId)("sessionId",A.sessionId)("sessionName",A.sessionId)}}function DFA(t,e){if(t&1){let A=zA();m(0,"div",20,1),GA(2,"div",49),m(3,"app-trace-event",50),$("panelClosed",function(){rA(A);let n=y(2);return sA(n.closeTraceEventDetailPanel())}),D()()}if(t&2){let A=y(2);p(3),X("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}function wFA(t,e){if(t&1&&(m(0,"div",21),K(1),D()),t&2){let A=y(2);X("matTooltip",A.i18n.disclosureTooltip),p(),Fe(" ",A.i18n.adkWebDeveloperUiMessage," ")}}function yFA(t,e){if(t&1&&(m(0,"div",7),He(1),V(2,dFA,4,5,"div",17),m(3,"mat-card",18),V(4,mFA,3,3),V(5,pFA,2,21,"app-chat-panel",19),D(),V(6,DFA,4,3,"div",20),V(7,wFA,2,2,"div",21),oi(8,"async"),D()),t&2){let A=y();p(2),W(A.appName!=""?2:-1),p(2),W(A.selectedAppControl.value?-1:4),p(),W(A.appName!=""?5:-1),p(),W(A.bottomPanelVisible?6:-1),p(),W(li(8,5,A.isDeveloperUiDisclaimerEnabledObs)?7:-1)}}var vFA="root_agent",ky="q",bFA="hideSidePanel",MFA="landing",yF="",vF="",bF="application/json+a2ui";function MF(t){for(t=t.replace(/-/g,"+").replace(/_/g,"/");t.length%4!==0;)t+="=";return t}var kF=class t extends bp{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${e*A+1} of ${i}`);static \u0275fac=(()=>{let e;return function(i){return(e||(e=hi(t)))(i||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac})},HtA="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",Sy=class t{i18n=h(YtA);_snackBar=h(ZC);activatedRoute=h(_s);agentService=h(Ks);artifactService=h(xp);changeDetectorRef=h(ft);dialog=h(Qs);document=h(Zt);downloadService=h(gB);evalService=h(Uc);eventService=h(lB);featureFlagService=h(lr);graphService=h(cB);localFileService=h(Rp);location=h(Lp);renderer=h(ui);router=h(qr);safeValuesService=h(Wr);sessionService=h(Hg);streamChatService=h(Fp);stringToColorService=h(CB);traceService=h($C);uiStateService=h(Tg);agentBuilderService=h(Kc);chatPanel=Xo.required(FE);canvasComponent=Xo.required(RE);sideDrawer=Xo.required("sideDrawer");sidePanel=Xo.required(KE);evalTab=Xo(Qc);bottomPanelRef=Xo.required("bottomPanel");enableSseIndicator=jA(!1);isChatMode=jA(!0);isEvalCaseEditing=jA(!1);hasEvalCaseChanged=jA(!1);isEvalEditMode=jA(!1);isBuilderMode=jA(!1);videoElement;currentMessage="";messages=jA([]);lastTextChunk="";streamingTextMessage=null;latestThought="";artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";sessionIdOfLoadedMessages="";evalCase=null;updatedEvalCase=null;evalSetId="";isAudioRecording=!1;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=kr.getBaseUrlWithoutPath();showSidePanel=!0;showBuilderAssistant=!0;useSse=!1;currentSessionState={};root_agent=vFA;updatedSessionState=jA(null);isModelThinkingSubject=new Jt(!1);canEditSession=jA(!0);sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;selectedEvent=void 0;selectedEventIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=M4;selectedFiles=[];MediaType=i1;selectedAppControl=new ss("",{nonNullable:!0});openBase64InNewTab(e,A){this.safeValuesService.openBase64InNewTab(e,A)}isLoadingApps=jA(!1);loadingError=jA("");apps$=oe([]).pipe(Wt(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),Ei(()=>this.agentService.listApps().pipe(Ho(e=>(this.loadingError.set(e.message),oe(void 0))))),qn(1),Wt(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:e[0]},queryParamsHandling:"merge"})}),Ds());importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=Is(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=Is(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();isUserIdOnToolbarEnabledObs=this.featureFlagService.isUserIdOnToolbarEnabled();isDeveloperUiDisclaimerEnabledObs=this.featureFlagService.isDeveloperUiDisclaimerEnabled();bottomPanelVisible=!1;hoveredEventMessageIndices=[];disableBuilderSwitch=!1;constructor(){}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.hideSidePanelIfNeeded(),Va([this.agentService.getApp(),this.activatedRoute.queryParams]).pipe(We(([i,n])=>!!i&&!!n[ky]),po(),fe(([,i])=>i[ky])).subscribe(i=>{setTimeout(()=>{this.userInput=i})}),this.streamChatService.onStreamClose().subscribe(i=>{let n=`Please check server log for full details: `+i;this.openSnackBar(n,"OK")}),new URL(window.location.href).searchParams.has("code")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i}),Va([this.agentService.getLoadingState(),this.isModelThinkingSubject]).subscribe(([i,n])=>{let o=this.messages()[this.messages().length-1];i?!o?.isLoading&&!this.streamingTextMessage&&this.messages.update(a=>[...a,{role:"bot",isLoading:!0}]):o?.isLoading&&!n&&(this.messages.update(a=>a.slice(0,-1)),this.changeDetectorRef.detectChanges())}),this.traceService.selectedTraceRow$.subscribe(i=>{let n=i?.attributes["gcp.vertex.agent.event_id"];n&&this.eventData.has(n)?this.bottomPanelVisible=!0:this.bottomPanelVisible=!1}),this.traceService.hoveredMessageIndices$.subscribe(i=>this.hoveredEventMessageIndices=i),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po()).subscribe(i=>{i&&(this.uiStateService.onNewMessagesLoaded().subscribe(n=>{this.populateMessages(n.items,!0,!n.isBackground),this.loadTraceData()}),this.uiStateService.onNewMessagesLoadingFailed().subscribe(n=>{this.openSnackBar(n.message,"OK")}))})}get sessionTab(){return this.sidePanel().sessionTabComponent()}ngAfterViewInit(){this.showSidePanel&&this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(e){e!=this.appName&&(this.agentService.setApp(e),this.loadSessionByUrlOrReset())}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(e=>{let A=this.activatedRoute.snapshot.queryParams,i=A.session,n=A.userId;if(n&&(this.userId=n),!e||!i){this.createSessionAndReset();return}i&&this.sessionService.getSession(this.userId,this.appName,i).pipe(qn(1),Ho(o=>(this.openSnackBar("Cannot find specified session. Creating a new one.","OK"),this.createSessionAndReset(),oe(null)))).subscribe(o=>{o&&this.updateWithSelectedSession(o)})})}displayLandingPageContent(){this.activatedRoute.queryParams.pipe(po()).subscribe(e=>{let A=e[MFA];if(A)try{let i=decodeURIComponent(A);this.messages().some(n=>n.isLanding)||this.messages.update(n=>[{role:"bot",text:i,isLanding:!0},...n])}catch(i){console.error("Error decoding landing page content:",i)}})}hideSidePanelIfNeeded(){this.activatedRoute.queryParams.pipe(We(e=>e[bFA]==="true"),qn(1)).subscribe(()=>{this.showSidePanel=!1,this.sideDrawer()?.close()})}createSessionAndReset(){this.createSession(),this.eventData=new Map,this.messages.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[],this.displayLandingPageContent()}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}sendMessage(e){return ct(this,null,function*(){if(e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;let A=`user_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,i=[],n={role:"user",eventId:A};if(this.userInput.trim()&&(i.push({text:this.userInput}),n.text=this.userInput),this.selectedFiles.length>0){let s=this.selectedFiles.map(g=>({file:g.file,url:g.url}));for(let g of this.selectedFiles){let l=yield this.localFileService.createMessagePartFromFile(g.file);i.push(l)}n.attachments=s}this.messages.update(s=>[...s,n]);let o={id:A,author:"user",content:{parts:i}};this.eventData.set(A,o),this.eventData=new Map(this.eventData);let a={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:yield this.getUserMessageParts()},streaming:this.useSse,stateDelta:this.updatedSessionState()};this.selectedFiles=[],this.streamingTextMessage=null,this.agentService.runSse(a).subscribe({next:s=>ct(this,null,function*(){if(s.error){this.openSnackBar(s.error,"OK");return}if(s.content){let g=this.combineTextParts(s.content.parts);this.isEventA2aResponse(s)&&(g=this.combineA2uiDataParts(g));for(let l of g)this.processPart(s,l),this.traceService.setEventData(this.eventData)}else s.errorMessage&&this.processErrorMessage(s);s.actions&&(this.processActionArtifact(s),this.processActionStateDelta(s)),this.changeDetectorRef.detectChanges()}),error:s=>{console.error("Send message error:",s),this.openSnackBar(s,"OK")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.streamingTextMessage=null,this.featureFlagService.isSessionReloadOnNewMessageEnabled().pipe(po()).subscribe(s=>{s&&this.sessionTab?.reloadSession(this.sessionId)}),this.eventService.getTrace(this.sessionId).pipe(po(),Ho(s=>oe([]))).subscribe(s=>{this.traceData=s,this.changeDetectorRef.detectChanges()}),this.traceService.setMessages(this.messages()),this.changeDetectorRef.detectChanges()}}),this.userInput="";let r=this.router.parseUrl(this.location.path());r.queryParams[ky]&&(delete r.queryParams[ky],this.location.replaceState(r.toString())),this.changeDetectorRef.detectChanges()})}processErrorMessage(e){this.storeEvents(e,e),this.insertMessageBeforeLoadingMessage({text:e.errorMessage,role:"bot"})}processPart(e,A){let i=e.groundingMetadata?.searchEntryPoint?.renderedContent;if(A.text){this.isModelThinkingSubject.next(!1);let n=A.text;if(A.thought){if(n!==this.latestThought){this.storeEvents(A,e);let o={role:"bot",text:this.processThoughtText(n),thought:!0,eventId:e.id};this.insertMessageBeforeLoadingMessage(o)}this.latestThought=n}else if(this.streamingTextMessage){if(i&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),n==this.streamingTextMessage.text){let o=this.streamingTextMessage.eventId;this.messages.update(a=>a.map(r=>r.eventId===o&&r.role==="bot"?Ve(BA({},r),{eventId:e.id}):r)),this.storeEvents(A,e),this.streamingTextMessage=null;return}this.streamingTextMessage.text+=n,this.insertMessageBeforeLoadingMessage(this.streamingTextMessage)}else if(this.streamingTextMessage={role:"bot",text:this.processThoughtText(n),thought:!!A.thought,eventId:e.id},i&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),this.useSse)this.insertMessageBeforeLoadingMessage(this.streamingTextMessage);else{this.insertMessageBeforeLoadingMessage(this.streamingTextMessage),this.storeEvents(A,e),this.streamingTextMessage=null;return}}else if(A.thought)this.isModelThinkingSubject.next(!0);else{if(this.useSse&&e.partial)return;if(this.isA2aDataPart(A)){let a=this.extractA2aDataPartJson(A),s=a&&a.kind==="data"&&a.metadata?.mimeType===bF?{a2ui:a.data}:{text:a};this.isModelThinkingSubject.next(!1),this.storeEvents(A,e),this.storeMessage(s,e,e.author==="user"?"user":"bot");return}this.isModelThinkingSubject.next(!1),this.storeEvents(A,e);let o=this.messages().findIndex(a=>a.eventId===e.id&&a.role==="bot");o!==-1?this.messages.update(a=>{let r=[...a];return this.processPartIntoMessage(A,e,r[o]),r}):this.storeMessage(A,e,e.author==="user"?"user":"bot")}}getUserMessageParts(){return ct(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push(yield this.localFileService.createMessagePartFromFile(A.file));return e})}processActionArtifact(e){e.actions&&e.actions.artifactDelta&&Object.keys(e.actions.artifactDelta).length>0&&(this.storeEvents(null,e),this.storeMessage(null,e,"bot"))}processActionStateDelta(e){e.actions&&e.actions.stateDelta&&Object.keys(e.actions.stateDelta).length>0&&(this.currentSessionState=e.actions.stateDelta)}combineTextParts(e){let A=[],i;for(let n of e)n.text&&!n.thought?i?i.text+=n.text:(i={text:n.text},A.push(i)):(i=void 0,A.push(n));return A}isEventA2aResponse(e){return!!e?.customMetadata?.["a2a:response"]}isA2aDataPart(e){if(!e.inlineData||e.inlineData.mimeType!=="text/plain")return!1;let A=atob(MF(e.inlineData.data));return A.startsWith(yF)&&A.endsWith(vF)}isA2uiDataPart(e){let A=this.extractA2aDataPartJson(e);return A&&A.kind==="data"&&A.metadata?.mimeType===bF}extractA2aDataPartJson(e){if(!this.isA2aDataPart(e))return null;let A=atob(MF(e.inlineData.data)),i=A.substring(yF.length,A.length-vF.length),n;try{n=JSON.parse(i)}catch(o){return null}return n}combineA2uiDataParts(e){let A=[],i=[],n;for(let o of e)this.isA2uiDataPart(o)?(i.push(this.extractA2aDataPartJson(o)),n||(n={inlineData:{mimeType:"text/plain",data:o.inlineData.data}},A.push(n))):A.push(o);if(n?.inlineData){let a=yF+JSON.stringify({kind:"data",metadata:{mimeType:bF},data:i})+vF;n.inlineData.data=btoa(a)}return A}processA2uiPartIntoMessage(e){let A={};return e.a2ui.forEach(i=>{i.data.beginRendering?A.beginRendering=i.data:i.data.surfaceUpdate?A.surfaceUpdate=i.data:i.data.dataModelUpdate&&(A.dataModelUpdate=i.data)}),A}updateRedirectUri(e,A){try{let i=new URL(e);return i.searchParams.set("redirect_uri",A),i.toString()}catch(i){return console.warn("Failed to update redirect URI: ",i),e}}storeMessage(e,A,i,n,o,a=!1){if(A?.author&&this.createAgentIconColorClass(A.author),A?.longRunningToolIds&&A.longRunningToolIds.length>0){let s=this.longRunningEvents.length;this.getAsyncFunctionsFromParts(A.longRunningToolIds,A.content.parts,A.invocationId),this.functionCallEventId=A.id;for(let g=s;g{this.sendOAuthResponse(l,d,this.redirectUri)}).catch(d=>{console.error("OAuth Error:",d)});break}}}if(A?.actions&&A.actions.artifactDelta)for(let s in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifactDelta[s],a);A?.evalStatus&&this.isChatMode.set(!1);let r={role:i,evalStatus:A?.evalStatus,failedMetric:A?.failedMetric,evalScore:A?.evalScore,evalThreshold:A?.evalThreshold,actualInvocationToolUses:A?.actualInvocationToolUses,expectedInvocationToolUses:A?.expectedInvocationToolUses,actualFinalResponse:A?.actualFinalResponse,expectedFinalResponse:A?.expectedFinalResponse,invocationIndex:n!==void 0?n:void 0,finalResponsePartIndex:o?.finalResponsePartIndex!==void 0?o.finalResponsePartIndex:void 0,toolUseIndex:o?.toolUseIndex!==void 0?o.toolUseIndex:void 0};if(e){if(e.inlineData){let s=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);r.inlineData={displayName:e.inlineData.displayName,data:s,mimeType:e.inlineData.mimeType}}else if(e.a2ui)r.a2uiData=this.processA2uiPartIntoMessage(e);else if(e.text)r.text=e.text,r.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(r.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),r.eventId=A?.id;else if(e.functionCall){let s=A?.longRunningToolIds?.includes(e.functionCall.id),g=BA(BA({},e.functionCall),s&&{isLongRunning:!0,invocationId:A.invocationId,functionCallEventId:A.id,needsResponse:!0,responseStatus:"pending",userResponse:""});r.functionCalls=[g],r.eventId=A?.id}else if(e.functionResponse)r.functionResponses=[e.functionResponse],r.eventId=A?.id;else if(e.executableCode)r.executableCode=e.executableCode;else if(e.codeExecutionResult&&(r.codeExecutionResult=e.codeExecutionResult,A.actions&&A.actions.artifact_delta))for(let s in A.actions.artifact_delta)A.actions.artifact_delta.hasOwnProperty(s)&&this.renderArtifact(s,A.actions.artifact_delta[s],a)}e&&Object.keys(e).length>0&&(a?this.messages.update(s=>[r,...s]):this.insertMessageBeforeLoadingMessage(r))}insertMessageBeforeLoadingMessage(e){this.messages.update(A=>{if(this.useSse&&e.text&&e.eventId&&e.role==="bot"){let n=A.findIndex(o=>o.eventId===e.eventId&&o.role==="bot"&&!o.isLoading);if(n!==-1){let o=[...A];return o[n]=Ve(BA({},o[n]),{text:e.text,renderedContent:e.renderedContent||o[n].renderedContent}),o}}let i=A[A.length-1];return i?.isLoading?[...A.slice(0,-1),e,i]:[...A,e]})}formatBase64Data(e,A){let i=MF(e);return`data:${A};base64,${i}`}processPartIntoMessage(e,A,i){if(e)if(e.text)i.text=e.text,i.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(i.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),A?.id&&(i.eventId=A.id);else if(e.inlineData){let n=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);i.inlineData={displayName:e.inlineData.displayName,data:n,mimeType:e.inlineData.mimeType},i.role==="user"&&A?.id&&(i.eventId=A.id)}else e.functionCall?(i.functionCalls||(i.functionCalls=[]),i.functionCalls.push(e.functionCall),A?.id&&(i.eventId=A.id)):e.functionResponse?(i.functionResponses||(i.functionResponses=[]),i.functionResponses.push(e.functionResponse),A?.id&&(i.eventId=A.id)):e.executableCode?i.executableCode=e.executableCode:e.codeExecutionResult?i.codeExecutionResult=e.codeExecutionResult:e.a2ui&&(i.a2uiData=this.processA2uiPartIntoMessage(e))}handleArtifactFetchFailure(e,A,i){this.openSnackBar("Failed to fetch artifact data","OK"),this.messages.update(n=>n.filter(o=>o!==e)),this.artifacts=this.artifacts.filter(n=>n.id!==A||n.versionId!==i)}renderArtifact(e,A,i=!1){if(this.artifacts.some(r=>r.id===e&&r.versionId===A))return;let o={role:"bot",inlineData:{data:"",mimeType:"image/png"}};i?this.messages.update(r=>[o,...r]):this.insertMessageBeforeLoadingMessage(o);let a={id:e,versionId:A,data:"",mimeType:"image/png",mediaType:"image"};this.artifacts=[...this.artifacts,a],this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe({next:r=>{let{mimeType:s,data:g}=r.inlineData??{};if(!s||!g){this.handleArtifactFetchFailure(o,e,A);return}let l=this.formatBase64Data(g,s),C=M4(s),I={name:this.createDefaultArtifactName(s),data:l,mimeType:s,mediaType:C};this.messages.update(d=>d.map(B=>B===o?{role:"bot",inlineData:I}:B)),this.artifacts=this.artifacts.map(d=>d.id===e&&d.versionId===A?{id:e,versionId:A,data:l,mimeType:s,mediaType:C}:d)},error:r=>{this.handleArtifactFetchFailure(o,e,A)}})}storeEvents(e,A){let i="";e==null&&A.actions.artifactDelta?i+="eventAction: artifact":e&&(e.text?i+="text:"+e.text:e.functionCall?i+="functionCall:"+e.functionCall.name:e.functionResponse?i+="functionResponse:"+e.functionResponse.name:e.executableCode?i+="executableCode:"+e.executableCode.code.slice(0,10):e.codeExecutionResult?i+="codeExecutionResult:"+e.codeExecutionResult.outcome:e.errorMessage&&(i+="errorMessage:"+e.errorMessage)),A.title=i,this.eventData.set(A.id,A),this.eventData=new Map(this.eventData)}sendOAuthResponse(e,A,i){this.longRunningEvents.pop();let n={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[]}};var o=structuredClone(e.args.authConfig);o.exchangedAuthCredential.oauth2.authResponseUri=A,o.exchangedAuthCredential.oauth2.redirectUri=i,n.functionCallEventId=this.functionCallEventId,n.newMessage.parts.push({functionResponse:{id:e.id,name:e.name,response:o}});let a=[];this.agentService.runSse(n).subscribe({next:r=>ct(this,null,function*(){a.push(r)}),error:r=>console.error("SSE error:",r),complete:()=>{this.processRunSseResponse(a)}})}processRunSseResponse(e){for(let A of e)if(A.content)for(let i of A.content.parts)this.processPart(A,i)}createAgentIconColorClass(e){let A=this.stringToColorService.stc(e),i=`custom-icon-color-${A.replace("#","")}`;this.injectCustomIconColorStyle(i,A)}clickEvent(e){let A=this.messages()[e],i=A.eventId;if(i){if(this.selectedEvent&&this.selectedEvent.id===i){this.selectedEvent=void 0,this.selectedEventIndex=void 0;return}if(A.role==="user"){this.selectedEvent=this.eventData.get(i),this.selectedEventIndex=this.getIndexOfKeyInMap(i),this.llmRequest=void 0,this.llmResponse=void 0,this.sideDrawer()?.open(),this.showSidePanel=!0;return}this.sideDrawer()?.open(),this.showSidePanel=!0,this.selectEvent(i)}}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[],this.bottomPanelVisible=!1}toggleAudioRecording(){this.isAudioRecording?this.stopAudioRecording():this.startAudioRecording()}startAudioRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(HtA,"OK");return}this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId}),this.messages.update(e=>[...e,{role:"user",text:"Speaking..."},{role:"bot",text:"Speaking..."}]),this.sessionHasUsedBidi.add(this.sessionId)}stopAudioRecording(){this.streamChatService.stopAudioChat(),this.isAudioRecording=!1}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(HtA,"OK");return}let e=this.chatPanel()?.videoContainer;e&&(this.isVideoRecording=!0,this.streamChatService.startVideoChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,videoContainer:e}),this.messages.update(A=>[...A,{role:"user",text:"Speaking..."}]),this.sessionHasUsedBidi.add(this.sessionId))}stopVideoRecording(){let e=this.chatPanel()?.videoContainer;e&&(this.streamChatService.stopVideoChat(e),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(e,A,i){for(let n of A)n.functionCall&&e.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:i})}openOAuthPopup(e){return new Promise((A,i)=>{if(!this.safeValuesService.windowOpen(window,e,"oauthPopup","width=600,height=700")){i("Popup blocked!");return}let o=a=>{if(a.origin!==window.location.origin)return;let{authResponseUrl:r}=a.data;r?(A(r),window.removeEventListener("message",o)):console.log("OAuth failed",a)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?(this.sideDrawer()?.close(),this.selectedEvent=void 0,this.selectedEventIndex=void 0):this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel}handleTabChange(e){this.isChatMode()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(e){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.isChatMode.set(!0)}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages({keepMessages:e}={}){e||(this.eventData.clear(),this.messages.set([])),this.artifacts=[]}loadTraceData(){this.eventService.getTrace(this.sessionId).pipe(po(),Ho(()=>oe([]))).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages())}),this.bottomPanelVisible=!1,this.changeDetectorRef.detectChanges()}populateMessages(e,A=!1,i=!1){this.resetEventsAndMessages({keepMessages:i&&this.sessionIdOfLoadedMessages===this.sessionId}),e.forEach(n=>{let o=this.isEventA2aResponse(n),a=o?this.combineA2uiDataParts(n.content?.parts):n.content?.parts||[],r=A?[...a].reverse():a;if(n.author==="user"){let s={role:"user",eventId:n.id};r.forEach(g=>{this.processPartIntoMessage(g,n,s)}),A?this.messages.update(g=>[s,...g]):this.messages.update(g=>[...g,s]),this.eventData.has(n.id)||(this.eventData.set(n.id,n),this.eventData=new Map(this.eventData))}else{let s={role:"bot",eventId:n.id};if(r.forEach(g=>{o&&this.isA2uiDataPart(g)&&(g={a2ui:this.extractA2aDataPartJson(g).data}),this.processPartIntoMessage(g,n,s)}),A?this.messages.update(g=>[s,...g]):this.messages.update(g=>[...g,s]),n.actions?.artifactDelta)for(let g in n.actions.artifactDelta)n.actions.artifactDelta.hasOwnProperty(g)&&this.renderArtifact(g,n.actions.artifactDelta[g],A);this.eventData.has(n.id)||(this.eventData.set(n.id,n),this.eventData=new Map(this.eventData))}}),this.sessionIdOfLoadedMessages=this.sessionId}updateWithSelectedSession(e){!e||!e.id||!e.events||!e.state||(this.traceService.resetTraceService(),this.sessionId=e.id,this.currentSessionState=e.state,this.evalCase=null,this.isChatMode.set(!0),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),e.events.forEach(A=>{if(A.author==="user"){let i={role:"user",eventId:A.id};A.content?.parts?.forEach(n=>{this.processPartIntoMessage(n,A,i)}),this.messages.update(n=>[...n,i]),this.eventData.has(A.id)||(this.eventData.set(A.id,A),this.eventData=new Map(this.eventData))}else{let i={role:"bot",eventId:A.id};if(A.content?.parts?.forEach(n=>{this.processPartIntoMessage(n,A,i)}),this.messages.update(n=>[...n,i]),A.actions?.artifactDelta)for(let n in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(n)&&this.renderArtifact(n,A.actions.artifactDelta[n]);this.eventData.has(A.id)||(this.eventData.set(A.id,A),this.eventData=new Map(this.eventData))}}),this.eventService.getTrace(this.sessionId).pipe(po(),Ho(()=>oe([]))).subscribe(A=>{this.traceData=A,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages())}),this.sessionService.canEdit(this.userId,e).pipe(po(),Ho(()=>oe(!0))).subscribe(A=>{this.chatPanel()?.canEditSession.set(A),this.canEditSession.set(A)}),this.featureFlagService.isInfinityMessageScrollingEnabled().pipe(po()).subscribe(A=>{A||this.populateMessages(e.events||[]),this.loadTraceData()}),this.displayLandingPageContent())}updateWithSelectedEvalCase(e){this.evalCase=e,this.isChatMode.set(!1),this.resetEventsAndMessages();let A=0;for(let i of e.conversation){if(i.userContent?.parts)for(let n of i.userContent.parts)this.storeMessage(n,null,"user");if(i.intermediateData?.toolUses){let n=0;for(let o of i.intermediateData.toolUses){let a={functionCall:{name:o.name,args:o.args}};this.storeMessage(a,null,"bot",A,{toolUseIndex:n}),n++;let r={functionResponse:{name:o.name}};this.storeMessage(r,null,"bot")}}if(i.finalResponse?.parts){let n=0;for(let o of i.finalResponse.parts)this.storeMessage(o,null,"bot",A,{finalResponsePartIndex:n}),n++}A++}}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{let A=this.chatPanel()?.textarea?.nativeElement;if(!A)return;A.focus();let i=A.value.length;e.text.charAt(i-1)===` `&&i--,A.setSelectionRange(i,i)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(Wu,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.messages.update(i=>i.filter((n,o)=>o!==A)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Af,{width:"600px",data:e}).afterClosed().subscribe(i=>{i&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.createSession(),this.eventData.clear(),this.messages.set([]),this.artifacts=[],this.traceData=[],this.bottomPanelVisible=!1,this.selectedEvent=void 0,this.selectedEventIndex=void 0,this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}onFileSelect(e){let A=e.target;if(A.files)for(let i=0;i{e&&this.canvasComponent()?.loadFromYaml(e,this.appName)},error:e=>{console.error("Error loading agent configuration:",e),this._snackBar.open("Error loading agent configuration","OK")}})}exitBuilderMode(){let e=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(e),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(qn(1)).subscribe(e=>{let A=this.dialog.open(u6,{width:"600px",data:{existingAppNames:e??[]}})})}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}selectEvent(e){this.selectedEvent=this.eventData.get(e),this.selectedEventIndex=this.getIndexOfKeyInMap(e);let A;this.isEventFilteringEnabled()&&this.selectedEvent.invocationId&&(this.selectedEvent.timestamp||this.selectedEvent.timestampInMillis)&&(A={invocationId:this.selectedEvent.invocationId,timestamp:this.selectedEvent.timestamp??this.selectedEvent.timestampInMillis});let i=BA({id:this.selectedEvent.id},A);this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getEventTrace(i).subscribe(n=>{n[this.llmRequestKey]&&(this.llmRequest=JSON.parse(n[this.llmRequestKey])),n[this.llmResponseKey]&&(this.llmResponse=JSON.parse(n[this.llmResponseKey])),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.eventService.getEvent(this.userId,this.appName,this.sessionId,this.selectedEvent.id).subscribe(n=>ct(this,null,function*(){if(!n.dotSrc){this.renderedEventGraph=void 0;return}let o=yield this.graphService.render(n.dotSrc);this.rawSvgString=o,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(o)}))}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(Af,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let a=this.sessionTab?.refreshSession(e);a?this.sessionTab?.getSession(a.id):window.location.reload()})})}syncSelectedAppFromUrl(){Va([this.activatedRoute.queryParams,this.apps$]).subscribe(([e,A])=>{let i=e.app;if(A&&A.length&&i){if(!A.includes(i)){this.openSnackBar(`Agent '${i}' not found`,"OK");return}this.selectedAppControl.setValue(i,{emitEvent:!1}),this.selectApp(i),this.agentService.getAgentBuilder(i).subscribe(n=>{!n||n==""?(this.disableBuilderSwitch=!0,this.agentBuilderService.setLoadedAgentData(void 0)):(this.disableBuilderSwitch=!1,this.agentBuilderService.setLoadedAgentData(n))}),this.isBuilderMode.set(!1)}e.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(hl(),We(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.router.createUrlTree([],{queryParams:{session:this.sessionId,userId:this.userId},queryParamsHandling:"merge"}).toString();this.location.replaceState(e)}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&(this.selectEvent(A),setTimeout(()=>{let i=this.messages().findIndex(n=>n.eventId===A);if(i!==-1){let n=this.chatPanel()?.scrollContainer?.nativeElement;if(!n)return;let o=n.querySelectorAll(".message-column-container");o&&o[i]&&o[i].scrollIntoView({behavior:"smooth",block:"nearest",inline:"nearest"})}},0))}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0}handleEscapeKey(e){e.key==="Escape"&&this.selectedEvent&&(e.preventDefault(),this.selectedEvent=void 0,this.selectedEventIndex=void 0)}getIndexOfKeyInMap(e){let A=0,i=(o,a)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e),this.downloadService.downloadObjectAsJson(e,`session-${this.sessionId}.json`)})}updateState(){this.dialog.open(Wu,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}closeTraceEventDetailPanel(){this.bottomPanelVisible=!1,this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,"")}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.userId||!o.appName||!o.events){this.openSnackBar("Invalid session file format","OK");return}this.sessionService.importSession(o.userId,o.appName,o.events).subscribe(a=>{this.openSnackBar("Session imported","OK"),this.sessionTab?.refreshSession()})}catch(o){this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}injectCustomIconColorStyle(e,A){if(this.document.getElementById(e))return;let i=this.renderer.createElement("style");this.renderer.setAttribute(i,"id",e),this.renderer.setAttribute(i,"type","text/css");let n=` .${e} { background-color: ${A} !important; } `;this.renderer.appendChild(i,this.renderer.createText(n)),this.renderer.appendChild(this.document.head,i)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-chat"]],viewQuery:function(A,i){A&1&&Or(i.chatPanel,FE,5)(i.canvasComponent,RE,5)(i.sideDrawer,zNA,5)(i.sidePanel,KE,5)(i.evalTab,Qc,5)(i.bottomPanelRef,PNA,5),A&2&&rr(6)},hostBindings:function(A,i){A&1&&$("keydown",function(o){return i.handleEscapeKey(o)},RC)},features:[It([{provide:bp,useClass:kF}])],ngContentSelectors:qNA,decls:8,vars:3,consts:[["sideDrawer",""],["bottomPanel",""],["autosize","",1,"drawer-container"],[1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999",3,"matTooltip"],["mode","side","appResizableDrawer","",1,"side-drawer"],[3,"isApplicationSelectorEnabledObs","apps$","isLoadingApps","selectedAppControl","showSidePanel","appName","userId","sessionId","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","llmRequest","llmResponse","disableBuilderIcon"],[1,"builder-mode-container"],[1,"chat-container"],[1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999",3,"click","matTooltip"],[3,"closePanel","tabChange","sessionSelected","sessionReloaded","evalCaseSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","appSelectionChange","openAddItemDialog","enterBuilderMode","isApplicationSelectorEnabledObs","apps$","isLoadingApps","selectedAppControl","showSidePanel","appName","userId","sessionId","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","llmRequest","llmResponse","disableBuilderIcon"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-toolbar",3,"ngClass"],[1,"chat-card"],[3,"appName","messages","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","eventData","selectedEvent","isAudioRecording","isVideoRecording","hoveredEventMessageIndices","userId","sessionId","sessionName"],["appResizableBottomPanel","",1,"trace-detail-container"],["matTooltipPosition","left",1,"adk-web-developer-ui-disclaimer",2,"align-self","flex-end",3,"matTooltip"],[1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999",3,"matTooltip"],[1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999",3,"click","matTooltip"],[2,"display","flex"],[1,"toolbar-session-text"],[1,"toolbar-session-id"],[1,"toolbar-actions"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],[2,"display","flex","align-items","center"],[1,"toolbar-session-text",2,"margin-left","16px"],[1,"readonly-badge"],[1,"readonly-session-message"],[1,"toolbar-sse-toggle"],[1,"example-margin",3,"change","checked","disabled"],[2,"margin-left","8px","margin-right","8px","height","22px",3,"vertical"],["id","toolbar-new-session-button",3,"click","matTooltip"],["id","toolbar-delete-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-export-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-import-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-delete-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],["id","toolbar-export-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],["id","toolbar-import-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],[1,"empty-state-container"],[1,"warning"],[1,"error"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","longRunningResponseComplete","appName","messages","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","eventData","selectedEvent","isAudioRecording","isVideoRecording","hoveredEventMessageIndices","userId","sessionId","sessionName"],[1,"bottom-resize-handler"],[3,"panelClosed","userId","appName","sessionId"]],template:function(A,i){A&1&&(Yt(jNA),m(0,"mat-drawer-container",2),V(1,ZNA,2,1,"span",3),m(2,"mat-drawer",4,0),V(4,XNA,1,19,"app-side-panel",5)(5,$NA,2,1),D(),V(6,AFA,12,5,"div",6)(7,yFA,9,7,"div",7),D()),A&2&&(p(),W(!i.showSidePanel&&i.appName===""?1:-1),p(3),W(i.isBuilderMode()?5:4),p(2),W(i.isBuilderMode()?6:7))},dependencies:[Hb,Ba,Yb,Gp,yn,bc,In,Gc,Rg,vn,vJ,up,nB,_p,My,FE,KE,RE,lw,Pr],styles:[".expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.drawer-container[_ngcontent-%COMP%]{height:100%;background-color:var(--chat-drawer-container-background-color)}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center;--mat-button-filled-container-color: #89b4f8;--mat-button-filled-label-text-color: black}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:#bdc1c6;cursor:pointer;display:flex;align-items:center;justify-content:center}.drawer-header[_ngcontent-%COMP%] .drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center}.drawer-header[_ngcontent-%COMP%] .drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-header[_ngcontent-%COMP%] .drawer-logo[_ngcontent-%COMP%]{font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.event-container[_ngcontent-%COMP%]{color:var(--chat-event-container-color)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;box-shadow:none;background-color:var(--chat-card-background-color)}.function-event-button[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-background-color);margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-highlight-background-color);border-color:var(--chat-function-event-button-highlight-border-color)!important;color:var(--chat-function-event-button-highlight-color)!important}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;align-items:center}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-fail-color)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px;z-index:1000}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px;z-index:1000}.side-drawer[_ngcontent-%COMP%]{background-color:var(--chat-side-drawer-background-color);color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;background:var(--chat-file-item-background-color);padding:5px;border-radius:4px}button[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}[_nghost-%COMP%] .mat-mdc-unelevated-button:not(:disabled){color:var(--chat-mat-mdc-unelevated-button-color);background-color:var(--chat-mat-mdc-unelevated-button-background-color)}[_nghost-%COMP%] .mdc-linear-progress__buffer-dots{background-image:radial-gradient(circle,var(--chat-mdc-linear-progress-buffer-dots-background-color, var(--mat-sys-surface-variant)) calc(var(--mat-progress-bar-track-height, 4px) / 2),transparent 0)}[_nghost-%COMP%] .mat-mdc-select-arrow-wrapper{margin-left:4px}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{border:1px solid var(--chat-mat-mdc-text-field-wrapper-border-color)}[_nghost-%COMP%] .mdc-notched-outline__leading, [_nghost-%COMP%] .mdc-notched-outline__notch, [_nghost-%COMP%] .mdc-notched-outline__trailing{border:none}[_nghost-%COMP%] .mat-mdc-form-field-icon-suffix{padding:0 10px 0 40px}[_nghost-%COMP%] .segment-key{color:var(--chat-segment-key-color)!important}.mat-mdc-select-placeholder[_ngcontent-%COMP%]{margin-left:20px}.bottom-resize-handler[_ngcontent-%COMP%]{background:var(--chat-bottom-resize-handler-background-color);height:5px;border-radius:4px;position:absolute;display:block;width:20%;left:40%;top:0;right:0;z-index:9999;cursor:ns-resize}.trace-detail-container[_ngcontent-%COMP%]{position:relative;background-color:var(--chat-trace-detail-container-background-color)}.trace-detail-container[_ngcontent-%COMP%] app-trace-event[_ngcontent-%COMP%]{padding-top:8px}.new-session-button[_ngcontent-%COMP%]{margin-top:0;margin-left:50px;width:130px;height:28px;font-size:14px}.app-select-container[_ngcontent-%COMP%]{width:35%;background-color:#212123;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: #8ab4f8;--mat-select-enabled-trigger-text-color: #8ab4f8;--mat-select-enabled-arrow-color: #8ab4f8}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.chat-toolbar[_ngcontent-%COMP%]{position:sticky;top:0;height:48px;background:var(--chat-toolbar-background-color);display:flex;align-items:center;z-index:10}.chat-toolbar.edit-mode[_ngcontent-%COMP%]{background:var(--chat-toolbar-edit-mode-background-color)}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center;flex-shrink:0}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:500;line-height:12px;letter-spacing:.8px;text-transform:uppercase;margin-left:20px;padding-top:4px;flex-shrink:0}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;margin-left:5px;flex-shrink:0}.toolbar-icon[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-toolbar-icon-color);cursor:pointer;margin-right:16px}#toolbar-new-session-button[_ngcontent-%COMP%]{font-size:14px;margin-right:16px;color:var(--chat-toolbar-new-session-color);cursor:pointer;display:flex;align-items:center}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-slide-toggle-label-text-size: 14px;--mat-slide-toggle-label-text-color: var(--chat-toolbar-sse-toggle-label-text-color);--mat-slide-toggle-unselected-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-focus-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-hover-track-color: var(--chat-toolbar-sse-toggle-unselected-track-color);--mat-slide-toggle-unselected-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-unselected-focus-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-unselected-hover-handle-color: var(--chat-toolbar-sse-toggle-unselected-handle-color);--mat-slide-toggle-selected-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-focus-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-hover-track-color: var(--chat-toolbar-sse-toggle-selected-track-color);--mat-slide-toggle-selected-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-selected-focus-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-selected-hover-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color);--mat-slide-toggle-track-height: 24px;--mat-slide-toggle-track-width: 46px;--mat-slide-toggle-track-outline-color: var(--chat-toolbar-sse-toggle-track-outline-color);--mat-slide-toggle-with-icon-handle-size: 20px}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.readonly-badge[_ngcontent-%COMP%]{color:var(--chat-readonly-badge-color);background-color:var(--chat-readonly-badge-background-color);border-radius:4px;padding:1px 6px;display:flex;align-items:center;margin-left:8px;font-size:12px;line-height:16px;gap:4px;white-space:nowrap}.readonly-badge[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;padding-top:1px;flex-shrink:0}.readonly-session-message[_ngcontent-%COMP%]{display:block;color:var(--chat-toolbar-session-text-color);margin-left:1em;font-weight:400;line-height:16px;letter-spacing:.3px;flex-shrink:1} .mat-drawer-content{display:flex!important} .mat-drawer{border-right:1px solid var(--chat-mat-drawer-border-right-color)!important}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column;background-color:var(--builder-container-background-color)}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;z-index:1000;display:flex;gap:8px}.builder-mode-action-button[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color)!important;color:var(--builder-text-tertiary-color)!important;border-radius:50%!important;transition:all .2s ease!important;margin:0!important;padding:0!important;width:40px!important;height:40px!important;min-width:40px!important;min-height:40px!important;border:1px solid var(--builder-tool-item-border-color)!important;box-shadow:0 2px 4px #0000001a!important;display:flex!important;align-items:center!important;justify-content:center!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{background-color:var(--builder-tool-item-hover-background-color)!important;box-shadow:0 4px 8px #00000026!important}.builder-mode-action-button.active[_ngcontent-%COMP%]{background-color:var(--builder-button-primary-background-color)!important;color:#fff!important;border-color:var(--builder-button-primary-background-color)!important}.builder-mode-action-button[_ngcontent-%COMP%] .mat-mdc-button-touch-target[_ngcontent-%COMP%]{display:none!important}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;background-color:var(--builder-container-background-color)}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background-color:var(--builder-tertiary-background-color);border:1px solid var(--builder-border-color);margin:10px;border-radius:8px}.build-panel-header[_ngcontent-%COMP%]{background-color:var(--builder-secondary-background-color);padding:16px 20px;border-bottom:1px solid var(--builder-border-color);border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--builder-text-primary-color);font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:var(--builder-text-secondary-color);overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--builder-text-secondary-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.adk-web-developer-ui-disclaimer[_ngcontent-%COMP%]{padding-left:4px;padding-bottom:4px;font-size:10px;color:var(--adk-web-text-color-light-gray)}"]})};var UE=class t{static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-root"]],decls:1,vars:0,template:function(A,i){A&1&&GA(0,"app-chat")},dependencies:[Sy],encapsulation:2})};var kFA=[{path:"",component:UE}],xy=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Xe({type:t});static \u0275inj=Ze({imports:[op.forRoot(kFA),op]})};var Ry=class{static getRuntimeConfig(){return window.runtimeConfig}};function SFA(t,e){if(t&1&&(ti(0,"a",0),Ni(1,"img",1),K(2),Ii()),t&2){y();let A=vs(0),i=vs(1);p(),Bo("src",MI(A),Da),p(),Fe(" ",i," ")}}function xFA(t,e){t&1&&(ti(0,"div"),K(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),Ii())}var Ny=class t{logoConfig=Ry.getRuntimeConfig().logo;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(A,i){if(A&1&&(wr(0)(1),V(2,SFA,3,3,"a",0)(3,xFA,2,0,"div")),A&2){let n=sg(i.logoConfig==null?null:i.logoConfig.imageUrl);p();let o=sg(i.logoConfig==null?null:i.logoConfig.text);p(),W(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} `]})};var RFA=(t,e)=>({"font-style":t,color:e}),Fy=class t{text=nt("");thought=nt(!1);static \u0275fac=function(A){return new(A||t)};static \u0275cmp=kA({type:t,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"]},features:[It([_h()])],decls:1,vars:5,consts:[[3,"data","ngStyle"]],template:function(A,i){A&1&&GA(0,"markdown",0),A&2&&X("data",i.text())("ngStyle",fl(2,RFA,i.thought()?"italic":"normal",i.thought()?"#9aa0a6":"inherit"))},dependencies:[oa,vf,LK,FK],encapsulation:2})};var NFA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-as-n":!0,"layout-dis-iflx":!0,"layout-al-c":!0},FFA={"layout-w-100":!0},LFA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-mt-0":!0,"layout-mb-2":!0,"typography-sz-bm":!0,"color-c-n10":!0},_FA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-pt-3":!0,"layout-pb-3":!0,"layout-pl-5":!0,"layout-pr-5":!0,"layout-mb-1":!0,"border-br-16":!0,"border-bw-0":!0,"border-c-n70":!0,"border-bs-s":!0,"color-bgc-s30":!0,"color-c-n100":!0,"behavior-ho-80":!0},SF={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mb-2":!0,"color-c-n10":!0},GFA=Ve(BA({},SF),{"typography-sz-tl":!0}),KFA=Ve(BA({},SF),{"typography-sz-tm":!0}),UFA=Ve(BA({},SF),{"typography-sz-ts":!0}),JFA={"behavior-sw-n":!0},qtA={"typography-f-sf":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-pl-4":!0,"layout-pr-4":!0,"layout-pt-2":!0,"layout-pb-2":!0,"border-br-6":!0,"border-bw-1":!0,"color-bc-s70":!0,"border-bs-s":!0,"layout-as-n":!0,"color-c-n10":!0},YFA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0,"color-c-n10":!0},HFA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},TFA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},OFA={"typography-f-s":!0,"typography-fs-n":!0,"typography-w-400":!0,"layout-m-0":!0,"typography-sz-bm":!0,"layout-as-n":!0},zFA={"typography-f-c":!0,"typography-fs-n":!0,"typography-w-400":!0,"typography-sz-bm":!0,"typography-ws-p":!0,"layout-as-n":!0},PFA=Ve(BA({},qtA),{"layout-r-none":!0,"layout-fs-c":!0}),jFA={"layout-el-cv":!0},TtA=Ms.merge(NFA,{"color-c-p30":!0}),qFA=Ms.merge(qtA,{"color-c-n5":!0}),VFA=Ms.merge(PFA,{"color-c-n5":!0}),WFA=Ms.merge(_FA,{"color-c-n100":!0}),OtA=Ms.merge(GFA,{"color-c-n5":!0}),ztA=Ms.merge(KFA,{"color-c-n5":!0}),PtA=Ms.merge(UFA,{"color-c-n5":!0}),ZFA=Ms.merge(LFA,{"color-c-n5":!0}),jtA=Ms.merge(YFA,{"color-c-n60":!0}),XFA=Ms.merge(zFA,{"color-c-n35":!0}),$FA=Ms.merge(HFA,{"color-c-n35":!0}),ALA=Ms.merge(TFA,{"color-c-n35":!0}),eLA=Ms.merge(OFA,{"color-c-n35":!0}),VtA={additionalStyles:{Card:{},Button:{"--n-60":"var(--n-100)"},Image:{"max-width":"120px","max-height":"120px",marginLeft:"auto",marginRight:"auto"}},components:{AudioPlayer:{},Button:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-5":!0,"layout-pr-5":!0,"border-br-2":!0,"border-bw-0":!0,"border-bs-s":!0,"color-bgc-p30":!0,"color-c-n100":!0,"behavior-ho-70":!0},Card:{"border-br-4":!0,"color-bgc-p100":!0,"color-bc-n90":!0,"border-bw-1":!0,"border-bs-s":!0,"layout-pt-4":!0,"layout-pb-4":!0,"layout-pl-4":!0,"layout-pr-4":!0},CheckBox:{element:{"layout-m-0":!0,"layout-mr-2":!0,"layout-p-2":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0},label:{"color-c-p30":!0,"typography-f-sf":!0,"typography-v-r":!0,"typography-w-400":!0,"layout-flx-1":!0,"typography-sz-ll":!0},container:{"layout-dsp-iflex":!0,"layout-al-c":!0}},Column:{},DateTimeInput:{container:{},label:{},element:{"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0}},Divider:{"color-bgc-n90":!0,"layout-mt-6":!0,"layout-mb-6":!0},Image:{all:{"border-br-50pc":!0,"layout-el-cv":!0,"layout-w-100":!0,"layout-h-100":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0,"layout-mb-3":!0},avatar:{},header:{},icon:{},largeFeature:{},mediumFeature:{},smallFeature:{}},Icon:{"border-br-1":!0,"layout-p-2":!0,"color-bgc-n98":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0,"layout-sp-c":!0},List:{"layout-g-4":!0,"layout-p-2":!0},Modal:{backdrop:{"color-bbgc-p60_20":!0},element:{"border-br-2":!0,"color-bgc-p100":!0,"layout-p-4":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bc-p80":!0}},MultipleChoice:{container:{},label:{},element:{}},Row:{"layout-g-4":!0},Slider:{container:{},label:{},element:{}},Tabs:{container:{},controls:{all:{},selected:{}},element:{}},Text:{all:{"layout-w-100":!0,"layout-g-2":!0,"color-c-p30":!0},h1:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h2:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-2":!0,"layout-p-0":!0,"typography-sz-tl":!0},h3:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-ts":!0},h4:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"typography-sz-bl":!0},h5:{"typography-f-sf":!0,"typography-ta-c":!0,"typography-v-r":!0,"typography-w-500":!0,"layout-mt-0":!0,"layout-mr-0":!0,"layout-ml-0":!0,"layout-mb-0":!0,"layout-p-0":!0,"color-c-n30":!0,"typography-sz-bm":!0,"layout-mb-1":!0},body:{},caption:{}},TextField:{container:{"typography-sz-bm":!0,"layout-w-100":!0,"layout-g-2":!0,"layout-dsp-flexhor":!0,"layout-al-c":!0},label:{"layout-flx-0":!0},element:{"typography-sz-bm":!0,"layout-pt-2":!0,"layout-pb-2":!0,"layout-pl-3":!0,"layout-pr-3":!0,"border-br-12":!0,"border-bw-1":!0,"border-bs-s":!0,"color-bgc-p100":!0,"color-bc-p60":!0,"color-c-n30":!0,"color-c-p30":!0}},Video:{"border-br-5":!0,"layout-el-cv":!0}},elements:{a:TtA,audio:FFA,body:ZFA,button:WFA,h1:OtA,h2:ztA,h3:PtA,h4:{},h5:{},iframe:JFA,input:qFA,p:jtA,pre:XFA,textarea:VFA,video:jFA},markdown:{p:[...Object.keys(jtA)],h1:[...Object.keys(OtA)],h2:[...Object.keys(ztA)],h3:[...Object.keys(PtA)],h4:[],h5:[],ul:[...Object.keys(ALA)],ol:[...Object.keys($FA)],li:[...Object.keys(eLA)],a:[...Object.keys(TtA)],strong:[],em:[]}};var Ly=class t{nodes=[];subAgentIdCounter=1;selectedToolSubject=new Jt(void 0);selectedNodeSubject=new Jt(void 0);selectedCallbackSubject=new Jt(void 0);loadedAgentDataSubject=new Jt(void 0);agentToolsMapSubject=new Jt(new Map);agentToolsSubject=new Jt(void 0);newAgentToolBoardSubject=new Jt(void 0);agentCallbacksMapSubject=new Jt(new Map);agentCallbacksSubject=new Jt(void 0);agentToolDeletionSubject=new Jt(void 0);deleteSubAgentSubject=new Jt("");addSubAgentSubject=new Jt({parentAgentName:""});tabChangeSubject=new Jt(void 0);agentToolBoardsSubject=new Jt(new Map);constructor(){}getNode(e){return this.nodes.find(i=>i.name===e)}getRootNode(){return this.nodes.find(A=>!!A.isRoot)}addNode(e){let A=this.nodes.findIndex(g=>g.name===e.name);A!==-1?this.nodes[A]=e:this.nodes.push(e);let i=/^sub_agent_(\d+)$/,n=e.name.match(i);if(n){let g=parseInt(n[1],10);g>=this.subAgentIdCounter&&(this.subAgentIdCounter=g+1)}let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e.name,e.tools||[]),this.agentToolsMapSubject.next(a);let r=this.agentCallbacksMapSubject.value,s=new Map(r);s.set(e.name,e.callbacks||[]),this.agentCallbacksMapSubject.next(s),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(e){this.selectedNodeSubject.next(e)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(e){this.selectedToolSubject.next(e)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(e){this.selectedCallbackSubject.next(e)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(e,A){let i=this.getNode(e);if(i){let n=i.tools||[];i.tools=[A,...n];let o=this.agentToolsMapSubject.value,a=new Map(o);a.set(e,i.tools),this.agentToolsMapSubject.next(a)}}deleteTool(e,A){let i=this.getNode(e);if(i&&i.tools){let n=i.tools.length;if(i.tools=i.tools.filter(o=>o.name!==A.name),i.tools.lengthr.name===A.name))return{success:!1,error:`Callback with name '${A.name}' already exists`};i.callbacks.push(A),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),{success:!0}}catch(i){return{success:!1,error:"Failed to add callback: "+i.message}}}updateCallback(e,A,i){try{let n=this.getNode(e);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(l=>l.name===A);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((l,C)=>C!==o&&l.name===i.name))return{success:!1,error:`Callback with name '${i.name}' already exists`};let r=BA(BA({},n.callbacks[o]),i);n.callbacks[o]=r,this.agentCallbacksSubject.next({agentName:e,callbacks:n.callbacks});let s=this.agentCallbacksMapSubject.value,g=new Map(s);return g.set(e,n.callbacks),this.agentCallbacksMapSubject.next(g),this.selectedCallbackSubject.value?.name===A&&this.setSelectedCallback(r),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(e,A){try{let i=this.getNode(e);if(!i)return{success:!1,error:"Agent not found"};if(!i.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=i.callbacks.findIndex(r=>r.name===A.name);if(n===-1)return{success:!1,error:"Callback not found"};i.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:e,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,a=new Map(o);return a.set(e,i.callbacks),this.agentCallbacksMapSubject.next(a),this.selectedCallbackSubject.value?.name===A.name&&this.setSelectedCallback(void 0),{success:!0}}catch(i){return{success:!1,error:"Failed to delete callback: "+i.message}}}setLoadedAgentData(e){this.loadedAgentDataSubject.next(e)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(e){this.tabChangeSubject.next(e)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(e,A){this.newAgentToolBoardSubject.next({toolName:e,currentAgentName:A})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(fe(A=>A?{tabName:A.toolName,currentAgentName:A.currentAgentName}:void 0))}requestTabDeletion(e){this.agentToolDeletionSubject.next(e)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(e){this.agentToolBoardsSubject.next(e)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(e){this.deleteSubAgentSubject.next(e)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(e,A,i){this.addSubAgentSubject.next({parentAgentName:e,agentClass:A,isFromEmptyGroup:i})}setAgentTools(e,A){if(e&&A){this.agentToolsSubject.next({agentName:e,tools:A});let i=this.agentToolsMapSubject.value,n=new Map(i);n.set(e,A),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(e,A){e&&A?this.agentCallbacksSubject.next({agentName:e,callbacks:A}):this.agentCallbacksSubject.next(void 0)}getParentNode(e,A,i,n){if(e){if(e.name===A.name)return i;for(let o of e.sub_agents){let a=this.getParentNode(o,A,e,n);if(a)return a}if(e.tools){for(let o of e.tools)if(o.toolType==="Agent Tool"){let a=n.get(o.toolAgentName||o.name);if(a){let r=this.getParentNode(a,A,e,n);if(r)return r}}}}}deleteNode(e){this.nodes=this.nodes.filter(A=>A.name!==e.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var _y=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();getLatestArtifact(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,i,n,o){let a=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(a)}static \u0275fac=function(A){return new(A||t)(Do(ks))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Gy=class t{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;scheduledAudioSources=new Set;playAudio(e){let A=this.combineAudioBuffer(e);A&&this.playPCM(A)}stopAudio(){for(let e of this.scheduledAudioSources)e.onended=null,e.stop();this.scheduledAudioSources.clear(),this.lastAudioTime=this.audioContext.currentTime}combineAudioBuffer(e){if(e.length===0)return;let A=e.reduce((o,a)=>o+a.length,0),i=new Uint8Array(A),n=0;for(let o of e)i.set(o,n),n+=o.length;return i}playPCM(e){let A=new Float32Array(e.length/2);for(let r=0;r=32768&&(s-=65536),A[r]=s/32768}let i=this.audioContext.createBuffer(1,A.length,22e3);i.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination),n.onended=()=>{this.scheduledAudioSources.delete(n)},this.scheduledAudioSources.add(n);let o=this.audioContext.currentTime,a=Math.max(this.lastAudioTime,o);n.start(a),this.lastAudioTime=a+i.duration}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Ky=new wA("AudioRecordingService"),Uy=new wA("AudioWorkletModulePath");var Jy=class t{audioWorkletModulePath=h(Uy);stream;audioContext;source;audioBuffer=[];startRecording(){return ct(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let i=A.data,n=this.float32ToPCM(i);this.audioBuffer.push(n)},this.source.connect(e),e.connect(this.audioContext.destination)}catch(e){console.error("Error accessing microphone:",e)}})}stopRecording(){this.source&&this.source.disconnect(),this.audioContext&&this.audioContext.close(),this.stream&&this.stream.getTracks().forEach(e=>e.stop())}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((n,o)=>n+o.length,0),A=new Uint8Array(e),i=0;for(let n of this.audioBuffer)A.set(n,i),i+=n.length;return A}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),i=new DataView(A);for(let n=0;n{let e=Ve(BA({},t),{attributes:BA({},t.attributes)}),A=t?.attributes?.[Ty]??oLA(t),i=t?.attributes?.[Oy]??gLA(t);return A!==void 0&&(e.attributes[Ty]=A),i!==void 0&&(e.attributes[Oy]=i),e},oLA=t=>t.name.startsWith(WtA)?t.attributes?.[xF]:t.name.startsWith(ZtA)?$tA(t.logs):void 0,aLA=t=>{let e=rLA(t),A=$tA(t);return JSON.stringify({system_message:e,user_message:NF(A)})},$tA=t=>{if(!t)return;let e=t.reverse().find(sLA);if(!e)return;let A=typeof e.body=="string"?NF(e.body):e.body;return typeof A=="string"?A:(A.content.role="user",A.contents=[A.content],delete A.content,JSON.stringify(A))},rLA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.system.message");if(e)return typeof e.body=="string"?NF(e.body):e.body},sLA=t=>{if(t.event_name!=="gen_ai.user.message")return!1;try{let A=(typeof t.body=="string"?JSON.parse(t.body):t.body)[tLA]?.[iLA];return Array.isArray(A)?A.every(i=>!i[nLA]):!1}catch(e){return!1}},gLA=t=>t.name.startsWith(WtA)?t.attributes?.[RF]:t.name.startsWith(ZtA)?AiA(t.logs):void 0,AiA=t=>{if(!t)return;let e=t.reverse().find(A=>A.event_name==="gen_ai.choice");if(e)return lLA(e)},NF=t=>{try{return JSON.parse(t)}catch(e){return t}},lLA=t=>typeof t.body=="string"?t.body:JSON.stringify(t.body),eiA=t=>{let e=t[Ty]??cLA(t),A=t[Oy]??CLA(t),i=BA({},t);return e!==void 0&&(i[Ty]=e),A!==void 0&&(i[Oy]=A),i},cLA=t=>{if(xF in t)return`${t[xF]}`;if(t.logs)return aLA(t.logs)},CLA=t=>{if(RF in t)return`${t[RF]}`;if(t.logs)return AiA(t.logs)};var zy=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();getEventTrace(e){let A=this.apiServerDomain+`/debug/trace/${e.id}`;return this.http.get(A).pipe(fe(n=>eiA(n)))}getTrace(e){let A=this.apiServerDomain+`/debug/trace/session/${e}`;return this.http.get(A).pipe(fe(n=>Array.isArray(n)?n.map(XtA):n))}getEvent(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||t)(Do(ks))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Py=class t{route=h(_s);constructor(){}isImportSessionEnabled(){return this.route.queryParams.pipe(fe(e=>e[MJ]==="true"))}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(fe(e=>e[kJ]==="true"))}isSessionUrlEnabled(){return oe(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(fe(e=>e[SJ]==="true"))}isApplicationSelectorEnabled(){return oe(!0)}isAlwaysOnSidePanelEnabled(){return oe(!1)}isTraceEnabled(){return oe(!0)}isArtifactsTabEnabled(){return oe(!0)}isEvalEnabled(){return oe(!0)}isTokenStreamingEnabled(){return oe(!0)}isMessageFileUploadEnabled(){return oe(!0)}isManualStateUpdateEnabled(){return oe(!0)}isBidiStreamingEnabled(){return oe(!0)}isExportSessionEnabled(){return oe(!0)}isEventFilteringEnabled(){return oe(!1)}isDeleteSessionEnabled(){return oe(!0)}isLoadingAnimationsEnabled(){return oe(!0)}isSessionsTabReorderingEnabled(){return oe(!1)}isSessionFilteringEnabled(){return oe(!1)}isSessionReloadOnNewMessageEnabled(){return oe(!1)}isUserIdOnToolbarEnabled(){return oe(!0)}isDeveloperUiDisclaimerEnabled(){return oe(!0)}isFeedbackServiceEnabled(){return oe(!1)}isInfinityMessageScrollingEnabled(){return oe(!1)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var jy=class t{sendFeedback(e,A,i){return oe(void 0)}getFeedback(e,A){return oe(void 0)}deleteFeedback(e,A){return oe(void 0)}getPositiveFeedbackReasons(){return oe([])}getNegativeFeedbackReasons(){return oe([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var ILA=(()=>{var t=import.meta.url;return function(e={}){var A,i=e,n,o,a=new Promise((u,w)=>{n=u,o=w});i.agerrMessages=[],i.stderrMessages=[],B=u=>i.stderrMessages.push(u);var r=Object.assign({},i),s="./this.program",g=(u,w)=>{throw w},l="",C,I;typeof document<"u"&&document.currentScript&&(l=document.currentScript.src),t&&(l=t),l.startsWith("blob:")?l="":l=l.substr(0,l.replace(/[?#].*/,"").lastIndexOf("/")+1),C=u=>fetch(u,{credentials:"same-origin"}).then(w=>w.ok?w.arrayBuffer():Promise.reject(new Error(w.status+" : "+w.url)));var d=console.log.bind(console),B=console.error.bind(console);Object.assign(i,r),r=null;var Q;function E(u){for(var w=atob(u),S=new Uint8Array(w.length),T=0;Tu.startsWith(ze);function HA(){var u="data:application/octet-stream;base64,AGFzbQEAAAABmAd0YAJ/fwF/YAF/AGABfwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAh/f39/f39/fwF/YAAAYAABf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgCX9/f39/f39/fwBgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gBX9/f39+AX9gA39/fgF/YAp/f39/f39/f39/AGAEf35+fwBgBH9/fH8AYAJ/fgBgAnx/AXxgBH9/f3wBf2ABfwF+YAJ/fgF/YAJ/fAF/YAN8fH8BfGADf3x/AGAIf39/f39/f38AYAV/f39/fAF/YAt/f39/f39/f39/fwF/YAN/f3wAYAV/f35/fwBgBH9/fH8Bf2AAAX5gB39/f398f38Bf2AFf39/f3wAYAN/f3wBf2ADf35/AX9gAn19AX1gBH9/fX8AYAZ/fHx8fHwBfGADf39/AX5gDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgBH9/f38BfmAGf3x/f39/AX9gB39/f39/fn4Bf2AGf39/f35+AX9gB39/f39+f38Bf2AGf39/f39+AX9gAn5/AGAEf35/fwF/YAR/f3x8AXxgBX9/fH9/AGAJf39/f39/f39/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGAGf39+fn5/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmAGf31/f39/AGADf3x8AX9gBX9/f3x/AGAFf398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAV/fHx8fAF/YAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBg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AgBB9ekDIAJBEGoQIBoQLwALFwBBAUF/IAAgASABEEAiABChAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQMAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOYBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQMAIgBFDQAgACgCECECCyACC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhCzCiIBQQBIBEAgA0H8gAsoAgAQswU2AgBBioAEIAMQNwwBCyAAIANBEGoiABCNBSABEKECGiAAEFwLIANBIGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALJAEBfyMAQRBrIgMkACADIAI2AgwgACABIAIQzQsgA0EQaiQAC6QBAQN/IwBBEGsiAiQAAkAgABAtIgMgACgCAEEDcSAAKQMIEOgJIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADESYAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQfDdCiEBQfDdCkEgQeAXIAIQtAEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ8QsLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsUACAAECgEQCAALQAPDwsgACgCBAsVACAAEKMBBEAgACgCBA8LIAAQpQMLowEBAn8CQAJAIAAEQCAAKAIIIgMgACgCDCICRgRAIAAgA0EBdEEBIAMbIAEQ/AEgACgCDCECCyACRQ0BIAAoAggiAyACTw0CIAAgACgCBCADaiACcCICIAEQ3wEaIAAgACgCCEEBajYCCCACDwtB0dMBQYm4AUE7QdbDARAAAAtBr5UDQYm4AUHDAEHWwwEQAAALQZoMQYm4AUHEAEHWwwEQAAALJgAgACABEK4HIgFFBEBBAA8LIAAQ7AEoAgwgASgCEEECdGooAgALLgAgAC0ADyIAQQFqQf8BcUERTwRAQbS7A0Gg/ABB3ABB6ZcBEAAACyAAQf8BRwtDACAAIAAgAaQgAb1C////////////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AkHYmQshASAAQdiZC0EYEM4BRQ0CQRgQTyIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkmwtBAToAAEHgmwsgATYCACABC60BAgF/An4CQAJAIAAEQCABBEAgAEEAEL8CIgMoAvQDDQIgAykDsAQiBCABQQhrIgEoAgBBCGqtIgVUDQMgAyAEIAV9IgQ3A7AEIAMoAsAEQQJPBEAgA0EtIAUgBCADKQO4BCACEJEECyABIAAoAhQRAQALDwtBsdQBQZ+9AUGKB0GonwEQAAALQbDSAUGfvQFBkQdBqJ8BEAAAC0HjqAFBn70BQZoHQaifARAAAAsJACAAQQAQ2AYLvwoCBX8PfiMAQeAAayIFJAAgBEL///////8/gyEMIAIgBIVCgICAgICAgICAf4MhCiACQv///////z+DIg1CIIghDiAEQjCIp0H//wFxIQcCQAJAIAJCMIinQf//AXEiCUH//wFrQYKAfk8EQCAHQf//AWtBgYB+Sw0BCyABUCACQv///////////wCDIgtCgICAgICAwP//AFQgC0KAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEKDAILIANQIARC////////////AIMiAkKAgICAgIDA//8AVCACQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQogAyEBDAILIAEgC0KAgICAgIDA//8AhYRQBEAgAiADhFAEQEKAgICAgIDg//8AIQpCACEBDAMLIApCgICAgICAwP//AIQhCkIAIQEMAgsgAyACQoCAgICAgMD//wCFhFAEQCABIAuEQgAhAVAEQEKAgICAgIDg//8AIQoMAwsgCkKAgICAgIDA//8AhCEKDAILIAEgC4RQBEBCACEBDAILIAIgA4RQBEBCACEBDAILIAtC////////P1gEQCAFQdAAaiABIA0gASANIA1QIgYbeSAGQQZ0rXynIgZBD2sQsQFBECAGayEGIAUpA1giDUIgiCEOIAUpA1AhAQsgAkL///////8/Vg0AIAVBQGsgAyAMIAMgDCAMUCIIG3kgCEEGdK18pyIIQQ9rELEBIAYgCGtBEGohBiAFKQNIIQwgBSkDQCEDCyADQg+GIgtCgID+/w+DIgIgAUIgiCIEfiIQIAtCIIgiEyABQv////8PgyIBfnwiD0IghiIRIAEgAn58IgsgEVStIAIgDUL/////D4MiDX4iFSAEIBN+fCIRIAxCD4YiEiADQjGIhEL/////D4MiAyABfnwiFCAPIBBUrUIghiAPQiCIhHwiDyACIA5CgIAEhCIMfiIWIA0gE358Ig4gEkIgiEKAgICACIQiAiABfnwiECADIAR+fCISQiCGfCIXfCEBIAcgCWogBmpB//8AayEGAkAgAiAEfiIYIAwgE358IgQgGFStIAQgBCADIA1+fCIEVq18IAIgDH58IAQgBCARIBVUrSARIBRWrXx8IgRWrXwgAyAMfiIDIAIgDX58IgIgA1StQiCGIAJCIIiEfCAEIAJCIIZ8IgIgBFStfCACIAIgECASVq0gDiAWVK0gDiAQVq18fEIghiASQiCIhHwiAlatfCACIAIgDyAUVK0gDyAXVq18fCICVq18IgRCgICAgICAwACDUEUEQCAGQQFqIQYMAQsgC0I/iCAEQgGGIAJCP4iEIQQgAkIBhiABQj+IhCECIAtCAYYhCyABQgGGhCEBCyAGQf//AU4EQCAKQoCAgICAgMD//wCEIQpCACEBDAELAn4gBkEATARAQQEgBmsiB0H/AE0EQCAFQTBqIAsgASAGQf8AaiIGELEBIAVBIGogAiAEIAYQsQEgBUEQaiALIAEgBxCnAyAFIAIgBCAHEKcDIAUpAzAgBSkDOIRCAFKtIAUpAyAgBSkDEISEIQsgBSkDKCAFKQMYhCEBIAUpAwAhAiAFKQMIDAILQgAhAQwCCyAEQv///////z+DIAatQjCGhAsgCoQhCiALUCABQgBZIAFCgICAgICAgICAf1EbRQRAIAogAkIBfCIBUK18IQoMAQsgCyABQoCAgICAgICAgH+FhFBFBEAgAiEBDAELIAogAiACQgGDfCIBIAJUrXwhCgsgACABNwMAIAAgCjcDCCAFQeAAaiQAC4sIAQt/IABFBEAgARBPDwsgAUFATwRAQfyAC0EwNgIAQQAPCwJ/QRAgAUELakF4cSABQQtJGyEGIABBCGsiBCgCBCIJQXhxIQgCQCAJQQNxRQRAIAZBgAJJDQEgBkEEaiAITQRAIAQhAiAIIAZrQbCZCygCAEEBdE0NAgtBAAwCCyAEIAhqIQcCQCAGIAhNBEAgCCAGayIDQRBJDQEgBCAGIAlBAXFyQQJyNgIEIAQgBmoiAiADQQNyNgIEIAcgBygCBEEBcjYCBCACIAMQrQUMAQtB6JULKAIAIAdGBEBB3JULKAIAIAhqIgggBk0NAiAEIAYgCUEBcXJBAnI2AgQgBCAGaiIDIAggBmsiAkEBcjYCBEHclQsgAjYCAEHolQsgAzYCAAwBC0HklQsoAgAgB0YEQEHYlQsoAgAgCGoiAyAGSQ0CAkAgAyAGayICQRBPBEAgBCAGIAlBAXFyQQJyNgIEIAQgBmoiCCACQQFyNgIEIAMgBGoiAyACNgIAIAMgAygCBEF+cTYCBAwBCyAEIAlBAXEgA3JBAnI2AgQgAyAEaiICIAIoAgRBAXI2AgRBACECQQAhCAtB5JULIAg2AgBB2JULIAI2AgAMAQsgBygCBCIDQQJxDQEgA0F4cSAIaiILIAZJDQEgCyAGayEMIAcoAgwhBQJAIANB/wFNBEAgBygCCCICIAVGBEBB0JULQdCVCygCAEF+IANBA3Z3cTYCAAwCCyACIAU2AgwgBSACNgIIDAELIAcoAhghCgJAIAUgB0cEQCAHKAIIIgIgBTYCDCAFIAI2AggMAQsCQCAHKAIUIgIEfyAHQRRqBSAHKAIQIgJFDQEgB0EQagshCANAIAghAyACIgVBFGohCCACKAIUIgINACAFQRBqIQggBSgCECICDQALIANBADYCAAwBC0EAIQULIApFDQACQCAHKAIcIgNBAnRBgJgLaiICKAIAIAdGBEAgAiAFNgIAIAUNAUHUlQtB1JULKAIAQX4gA3dxNgIADAILAkAgByAKKAIQRgRAIAogBTYCEAwBCyAKIAU2AhQLIAVFDQELIAUgCjYCGCAHKAIQIgIEQCAFIAI2AhAgAiAFNgIYCyAHKAIUIgJFDQAgBSACNgIUIAIgBTYCGAsgDEEPTQRAIAQgCUEBcSALckECcjYCBCAEIAtqIgIgAigCBEEBcjYCBAwBCyAEIAYgCUEBcXJBAnI2AgQgBCAGaiIDIAxBA3I2AgQgBCALaiICIAIoAgRBAXI2AgQgAyAMEK0FCyAEIQILIAILIgIEQCACQQhqDwsgARBPIgRFBEBBAA8LIAQgAEF8QXggAEEEaygCACICQQNxGyACQXhxaiICIAEgASACSxsQHxogABAYIAQLpAEBBH8gACgCECIEIQMCQAJAAkADQCADRQ0BIAFFDQIgAygCACIGRQ0DIAEgBhBNBEAgAygCBCIDIARHDQEMAgsLAkAgAC0AAEEEcQRAIAJFIAMgBEZyDQFB1A9BABA3DAELIAJFIAMgBEZxDQAgACADIAJBAEcQyAcLIAMhBQsgBQ8LQdTWAUHU+wBBDEHlOxAAAAtBlNYBQdT7AEENQeU7EAAACwYAIAAQGAsgACAABEAgACgCFBAYIAAoAhgQGCAAKAIcEBggABAYCwsZAQF/IAAgARAsIgIEfyACBSAAIAEQvQILC34BA38jAEEQayIBJAAgASAANgIMIwBBEGsiAiQAIAAoAgBBf0cEQCACQQhqIAJBDGogAUEMahCiAhCiAiEDA0AgACgCAEEBRg0ACyAAKAIARQRAIABBATYCACADENkKIABBfzYCAAsLIAJBEGokACAAKAIEIAFBEGokAEEBawsgACAAIAFBAWs2AgQgAEHQ5wk2AgAgAEGAvwk2AgAgAAs6AQF/AkACQCACRQ0AIAAQLSACEMsDIgMgAkcNACADEHZFDQAgACABIAIQqAQMAQsgACABIAIQuwsLC28AAkACQCABKAIAQQNxQQJGBEAgACABEDAiAQ0BQQAhAQNAAn8gAUUEQCAAIAIQvQIMAQsgACABEI8DCyIBRQ0DIAEoAiggAkYNAAsMAQsDQCAAIAEQjwMiAUUNAiABKAIoIAJGDQALCyABDwtBAAsfAQF/IAAQJCEBIAAQKARAIAAgAWoPCyAAKAIAIAFqC/ACAQR/IwBBMGsiAyQAIAMgAjYCDCADIAI2AiwgAyACNgIQAkACQAJAAkACQEEAQQAgASACEGAiAkEASA0AIAJBAWohBgJAIAAQSyAAECRrIgUgAksNACAGIAVrIQUgABAoBEBBASEEIAVBAUYNAQsgACAFEL0BQQAhBAsgA0IANwMYIANCADcDECAEIAJBEE9xDQEgA0EQaiEFIAIgBAR/IAUFIAAQcwsgBiABIAMoAiwQYCIBRyABQQBOcQ0CIAFBAEwNACAAECgEQCABQYACTw0EIAQEQCAAEHMgA0EQaiABEB8aCyAAIAAtAA8gAWo6AA8gABAkQRBJDQFBk7YDQaD8AEHqAUH4HhAAAAsgBA0EIAAgACgCBCABajYCBAsgA0EwaiQADwtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAvWCAENfyMAQRBrIgwkACABEN4KIwBBEGsiAyQAIAMgATYCDCAMQQxqIANBDGoQowMhCSADQRBqJAAgAEEIaiIBEMQCIAJNBEACQCACQQFqIgAgARDEAiIDSwRAIwBBIGsiDSQAAkAgACADayIGIAEQiwUoAgAgASgCBGtBAnVNBEAgASAGEOAKDAELIAEQnAMhByANQQxqIQACfyABEMQCIAZqIQUjAEEQayIEJAAgBCAFNgIMIAUgARDDCiIDTQRAIAEQvwoiBSADQQF2SQRAIAQgBUEBdDYCCCAEQQhqIARBDGoQ3wMoAgAhAwsgBEEQaiQAIAMMAQsQygEACyEFIAEQxAIhCEEAIQMjAEEQayIEJAAgBEEANgIMIABBDGoQxQpBBGogBxCiAhogBQR/IARBBGogACgCECAFEMIKIAQoAgQhAyAEKAIIBUEACyEFIAAgAzYCACAAIAMgCEECdGoiBzYCCCAAIAc2AgQgABD0BiADIAVBAnRqNgIAIARBEGokACMAQRBrIgMkACAAKAIIIQQgAyAAQQhqNgIMIAMgBDYCBCADIAQgBkECdGo2AgggAygCBCEEA0AgAygCCCAERwRAIAAoAhAaIAMoAgQQwQogAyADKAIEQQRqIgQ2AgQMAQsLIAMoAgwgAygCBDYCACADQRBqJAAjAEEQayIGJAAgARCcAxogBkEIaiABKAIEEKICIAZBBGogASgCABCiAiEEIAYgACgCBBCiAiEFKAIAIQcgBCgCACEIIAUoAgAhCiMAQRBrIgUkACAFQQhqIwBBIGsiAyQAIwBBEGsiBCQAIAQgBzYCDCAEIAg2AgggA0EYaiAEQQxqIARBCGoQogUgBEEQaiQAIANBDGogAygCGCEHIAMoAhwhCyADQRBqIwBBEGsiBCQAIAQgCzYCCCAEIAc2AgwgBCAKNgIEA0AgBEEMaiIHKAIAIAQoAghHBEAgBxC8CigCACEKIARBBGoiCxC8CiAKNgIAIAcQuwogCxC7CgwBCwsgBEEMaiAEQQRqEPsBIARBEGokACADIAMoAhA2AgwgAyADKAIUNgIIIANBCGoQ+wEgA0EgaiQAIAUoAgwhAyAFQRBqJAAgBiADNgIMIAAgBigCDDYCBCABIABBBGoQpgUgAUEEaiAAQQhqEKYFIAEQiwUgABD0BhCmBSAAIAAoAgQ2AgAgARDEAhogBkEQaiQAIAAoAgQhAwNAIAAoAgggA0cEQCAAKAIQGiAAIAAoAghBBGs2AggMAQsLIAAoAgAEQCAAKAIQIAAoAgAgABD0BigCABogACgCABoQvgoLCyANQSBqJAAMAQsgACADSQRAIAEoAgAgAEECdGohACABEMQCGiABIAAQwAoLCwsgASACEJ0DKAIABEAgASACEJ0DKAIAEJEFCyAJEOgDIQAgASACEJ0DIAA2AgAgCSgCACEAIAlBADYCACAABEAgABCRBQsgDEEQaiQACxcAIABFBEBBAA8LIABBCGspAwBCP4inCxwBAX8gABCjAQRAIAAoAgAgABD2AhoQnAQLIAALJQEBfyAAKAJEIgFFBEBBAA8LIAEoAjwiASAAQQggASgCABEDAAsWACAAKAI8IgBBAEGAASAAKAIAEQMACxUAIABFIAFFcgR/IAIFIAAgARBFCwvKAQEEfyMAQdAAayICJAACQAJAIAGZRHsUrkfhenQ/YwRAIABB9J4DQQEQoQIaDAELIAIgATkDACACQRBqIgNBMkGUhgEgAhC0ARogACACQRBqAn8CQCADQS4QzQEiAEUNACAALAABIgRBMGtBCUsNAyAALAACIgVBMGtBCUsNAyAALQADDQMgBUEwRw0AIAAgA2siACAAQQJqIARBMEYbDAELIAJBEGoQQAsQoQIaCyACQdAAaiQADwtB9KwDQaG+AUH0A0HaKhAAAAsJACAAQQAQkAELMgEBfyMAQRBrIgMkACADIAE2AgwgACADQQxqEKMDIgBBBGogAhCjAxogA0EQaiQAIAAL8AIBBH8jAEEwayIDJAAgAyACNgIMIAMgAjYCLCADIAI2AhACQAJAAkACQAJAQQBBACABIAIQYCICQQBIDQAgAkEBaiEGAkAgABBLIAAQJGsiBSACSw0AIAYgBWshBSAAECgEQEEBIQQgBUEBRg0BCyAAIAUQ3wRBACEECyADQgA3AxggA0IANwMQIAQgAkEQT3ENASADQRBqIQUgAiAEBH8gBQUgABBzCyAGIAEgAygCLBBgIgFHIAFBAE5xDQIgAUEATA0AIAAQKARAIAFBgAJPDQQgBARAIAAQcyADQRBqIAEQHxoLIAAgAC0ADyABajoADyAAECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAEDQQgACAAKAIEIAFqNgIECyADQTBqJAAPC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAAC3MBAX8gABAkIAAQS08EQCAAQQEQtwILIAAQJCECAkAgABAoBEAgACACaiABOgAAIAAgAC0AD0EBajoADyAAECRBEEkNAUGTtgNBoPwAQa8CQcSyARAAAAsgACgCACACaiABOgAAIAAgACgCBEEBajYCBAsLCwAgACABQQMQ6QYLCwAgACABQQEQ9ggLCgAgACgCABC2CwsLACAAKAIAEL8LwAvwAgEEfyMAQTBrIgMkACADIAI2AgwgAyACNgIsIAMgAjYCEAJAAkACQAJAAkBBAEEAIAEgAhBgIgJBAEgNACACQQFqIQYCQCAAEEsgABAkayIFIAJLDQAgBiAFayEFIAAQKARAQQEhBCAFQQFGDQELIAAgBRC3AkEAIQQLIANCADcDGCADQgA3AxAgBCACQRBPcQ0BIANBEGohBSACIAQEfyAFBSAAEHMLIAYgASADKAIsEGAiAUcgAUEATnENAiABQQBMDQAgABAoBEAgAUGAAk8NBCAEBEAgABBzIANBEGogARAfGgsgACAALQAPIAFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABB6gFB+B4QAAALIAQNBCAAIAAoAgQgAWo2AgQLIANBMGokAA8LQcamA0Gg/ABB3QFB+B4QAAALQa2eA0Gg/ABB4gFB+B4QAAALQfnNAUGg/ABB5QFB+B4QAAALQaOeAUGg/ABB7AFB+B4QAAALRQECfwJAIAAQOSABKAIYRw0AIAAgASkDCBC/AyIDIAJFcg0AQQAhAyAAKAJEIgRFDQAgACAEIAEgAhCFASIDEJEPCyADC00BAX8CQCAAIAEgAiADEOoERQ0AIAAoAgwiAyAAKAIIRgRAIAAQX0UNASAAKAIMIQMLIAAgA0EBajYCDCADQQA6AAAgACgCECEECyAEC8YBAQR/IwBBEGsiBCQAIAQgAjYCDAJAIAEtAERFBEACfyAAKAKcASABRgRAIABBqAJqIQUgAEGsAmoMAQsgACgCtAIiBUEEagshAgNAIAQgACgCODYCCCABIARBDGogAyAEQQhqIAAoAjwgASgCOBEIACACIAQoAgw2AgAgACgCBCAAKAI4IgcgBCgCCCAHayAAKAJcEQUAIAUgBCgCDDYCAEEBSw0ACwwBCyAAKAIEIAIgAyACayAAKAJcEQUACyAEQRBqJAALIgEBfyAAIAEgAkEAECIiAwR/IAMFIAAgASACQfH/BBAiCws8AQJ/QQEgACAAQQFNGyEBA0ACQCABEE8iAA0AQaypCygCACICRQ0AIAIRDQAMAQsLIABFBEAQygELIAALLgEBfyMAQRBrIgIkACACQcSWBSgCADYCDCABIAJBDGpBICAAEJ4EIAJBEGokAAsYAEF/QQAgAEEBIAAQQCIAIAEQOiAARxsL0gICB38CfiABRQRAQX8PCwJAIAAQvgMoAgAiACABIAIQlwQiAkUNACACQQhqIgQgAUcNACACIAIpAwAiCkIBfUL///////////8AgyILIApCgICAgICAgICAf4OENwMAIAtCAFINACAABEAgAkF/RwRAIAQgCkI/iKcQvgYhBkEAIQEgACgCACIHBEBBASAAKAIIdCEDCyADQQFrIQgDQCABIANGDQMCQAJAIAcgASAGaiAIcSIJQQJ0aigCACIFQQFqDgIBBQALIAQgAikDAEI/iKcgBRCQCUUNACAAKAIEBEAgBRAYIAAoAgAgCUECdGpBfzYCACAAIAAoAgRBAWs2AgQMBQtBg5cDQaK6AUGbAkGtiQEQAAALIAFBAWohAQwACwALQYfbAUGiugFBhgJBrYkBEAAAC0Hv0wFBoroBQYQCQa2JARAAAAtBAEF/IAIbC+ECAgN/An4jAEEQayIEJAAgABA5IQUCQAJAAkACQAJAIABBASABIARBCGpBABCVA0UNACAAIAQpAwgQvwMiAw0CIAJFIAAgBUZyDQAgBSAEKQMIEL8DIgJFDQEgACACQQEQhQEhAwwCC0EAIQMgAkUNAQsgAEEBIAEgBEEIakEBEJUDRQRAQQAhAwwBCyAEKQMIIQYgAEEBEMENIgdCgICAgAFaDQFBwAAQUiIDIAY3AwggAyADKAIAQQxxIAenQQR0ckEBcjYCACADIAAQOTYCGCAAEDktABhBIHEEQCADQZWWBUEQQQAQNhoLIAAhAQNAIAEgAxCRDyABKAJEIgENAAsgABA5LQAYQSBxBEAgACADEMEFCyAAIAMQ2AcgACADEOYBRQ0CIABBASADEO8ECyAEQRBqJAAgAw8LQYOuA0GMvgFBzQBBwZ8BEAAAC0H9owNBjL4BQaUBQdWfARAAAAsYABDvC0Gg4AooAgBrt0QAAAAAgIQuQaMLHAAgACABIAIQeiIABH8gACACIAAtAAAbBSACCwskAQF/IAAoAgAhAiAAIAE2AgAgAgRAIAIgABDTAygCABEBAAsLBQAQOwAL6gECAn8BfiMAQRBrIgMkAAJAAkACQCABRQ0AIABBACABIANBCGpBABCVA0UNACAAIAMpAwgQkA0iBA0BC0EAIQQgAkUNACAAQQAgASADQQhqQQEQlQNFDQAgACADKQMIIgUQkA0iBEUEQEEBQdAAEE4iAUUNAiABIAAoAkw2AkwgASAAKAIYIgI2AhggASAANgJEIAEgAkH3AXE6ABggACgCSCECIAEgBTcDCCABIAI2AkggARDFDSEECyAAQQAgBBDvBAsgA0EQaiQAIAQPCyADQdAANgIAQYj2CCgCAEH16QMgAxAgGhAvAAt7AQJ/AkAgAEUgAUVyDQBBNBBPIgJFDQAgAkEANgIgIAJCADcCACACIAAQ/QQaIAJCADcCLCACQgA3AiQgASgCBCEAIAJCADcCDCACIAA2AgggAkIANwIUIAJBADYCHCABKAIAIQAgAiABNgIgIAIgADYCACACIQMLIAML6BACCn8IfCMAQYABayIGJAAgAEEwQQAgACgCAEEDcUEDRxtqKAIoIgcQLSENIAAgAxDeBiEJIAAhBQNAIAUiCCgCECILKAJ4IgUEQCALLQBwDQELCwJAAkAgBC0ACA0AIAcoAhAiCigC9AEgASgCECIFKAL0AUcNACABIAcgCigC+AEgBSgC+AFKIgUbIQogByABIAUbIQEMAQsgByEKC0EAIQUgC0HQAEEoIAogCEEwQQAgCCgCAEEDcUEDRxtqKAIoRiIHG2ooAgAhDiALQdYAQS4gBxtqLQAAIQwCQCALQS5B1gAgBxtqLQAARQ0AIAooAhAoAggiCEUNACAIKAIEKAIMRQ0AIAtBKEHQACAHG2ooAgAhCCAGQThqQQBBwAAQOBogBiAINgI0IAYgCjYCMCADQQRrIQcDQAJAIAUgB08NACAGIAIgBUEEdGoiCCsDMCAKKAIQIgsrAxChOQMgIAYgCCsDOCALKwMYoTkDKCALKAIIKAIEKAIMIQggBiAGKQMoNwMYIAYgBikDIDcDECAGQTBqIAZBEGogCBEAAEUNACAFQQNqIQUMAQsLIAZBMGogCiACIAVBBHRqQQEQ3wYLAkACQCAMRQ0AIAEoAhAoAggiCEUNACAIKAIEKAIMRQ0AIAZBOGpBAEHAABA4GiAGIA42AjQgBiABNgIwIANBBGsiCiEHA0ACQCAHRQ0AIAYgAiAHQQR0aiIDKwMAIAEoAhAiCCsDEKE5AyAgBiADKwMIIAgrAxihOQMoIAgoAggoAgQoAgwhAyAGIAYpAyg3AwggBiAGKQMgNwMAIAZBMGogBiADEQAARQ0AIAdBA2shBwwBCwsgBkEwaiABIAIgB0EEdGpBABDfBgwBCyADQQRrIgohBwsDQCAKIAUiA0sEQCACIAVBBHRqIgwrAwAgAiAFQQNqIgVBBHRqIggrAwChIg8gD6IgDCsDCCAIKwMIoSIPIA+ioESN7bWg98awPmMNAQsLA0ACQCAHRQ0AIAIgB0EEdGoiBSsDACAFKwMwoSIPIA+iIAUrAwggBSsDOKEiDyAPoqBEje21oPfGsD5jRQ0AIAdBA2shBwwBCwsgACEFA0AgBSIIKAIQKAJ4IgUNAAtBACEFIAQtAAhFBEAgCCAEKAIAEQIAIQULIAggBkEwaiAGQSBqENwGIAEgBCgCBBECAARAIAZBADYCIAsgAEEwQQAgACgCAEEDcUEDRxtqKAIoIAQoAgQRAgAEQCAGQQA2AjALIAUEQCAGKAIwIQAgBiAGKAIgNgIwIAYgADYCIAsCQCAELQAJQQFGBEAgBigCICIBIAYoAjAiAHJFDQECQAJ/AkACQCABRSAARSADIAdHcnJFBEAgAiAHQQR0aiIFKwMIIRIgBSsDOCEVIAUrAwAhESAFKwMwIRMgCCAAEM0DIRYgESAToSIPIA+iIBIgFaEiDyAPoqCfIhREAAAAAAAACECjIhAgCCABEM0DIg8gFiAPoCAUZiIEGyEUIBAgFiAEGyEPIBIgFWEEQCARIBNjBEAgESAPoCEPIBMgFKEhFgwDCyARIA+hIQ8gEyAUoCEWDAILAnwgEiAVYwRAIBUgFKEhFCASIA+gDAELIBUgFKAhFCASIA+hCyEQIBEiDyEWDAILIAEEQCAIIAEQzQMhESACIAdBBHRqIgQrAwAiECAEKwMwIhKhIg8gD6IgBCsDCCIUIAQrAzgiE6EiDyAPoqCfRM3MzMzMzOw/oiIPIBEgDyARZRshESAEAnwgEyAUYQRAIBAgEmMEQCASIBGhIQ8gFAwCCyASIBGgIQ8gFAwBCyAQIQ8gEyARoSATIBGgIBMgFGQbCzkDOCAEIA85AzAgBCAUOQMYIAQgEDkDECAEIAQpAzA3AyAgBCAEKQM4NwMoIAkgEzkDKCAJIBI5AyAgCSABNgIMCyAARQ0DIAggABDNAyEQIAIgA0EEdGoiASsDACITIAErAzAiEaEiDyAPoiABKwMIIhUgASsDOCISoSIPIA+ioJ9EzczMzMzM7D+iIg8gECAPIBBlGyEQAnwgEiAVYQRAIBEgE2QEQCATIBCgIQ8gFQwCCyATIBChIQ8gFQwBCyATIQ8gFSAQoCAVIBChIBIgFWQbCyEQIAEgDzkDEEEYIQQgASAQOQMYIAEgEjkDKCABIBE5AyAgASABKQMQNwMAIAEgASkDGDcDCCAJIAA2AghBEAwCCyASIhAhFAsgBSAPOQMQIAUgEDkDGCAFIBQ5AzggBSAWOQMwIAUgBSkDEDcDACAFIAUpAxg3AwggBSAFKQMwNwMgQSghBCAFIAUpAzg3AyggCSASOQMYIAkgETkDECAJIAA2AgggCSABNgIMQSALIAlqIBM5AwAgBCAJaiAVOQMACwwBCyAGKAIwIgAEQCAIIAIgAyAHIAkgABDZBiEDCyAGKAIgIgBFDQAgCCACIAMgByAJIAAQ2gYhBwsgB0EEaiEIIAZBQGshBCADIQUDQAJAIAUgCE8NACAJKAIAIAUgA2tBBHRqIgAgAiAFQQR0aiIBKQMANwMAIAAgASkDCDcDCCAGIAEpAwg3AzggBiABKQMANwMwIAVBAWoiASAITw0AIAkoAgAgASADa0EEdGoiACACIAFBBHRqIgEpAwA3AwAgACABKQMINwMIIAQgASkDCDcDCCAEIAEpAwA3AwAgCSgCACAFQQJqIgEgA2tBBHRqIgAgAiABQQR0aiIBKQMANwMAIAAgASkDCDcDCCAGIAEpAwg3A1ggBiABKQMANwNQIAYgAiAFQQNqIgVBBHRqIgApAwg3A2ggBiAAKQMANwNgIA0oAhBBEGogBkEwahDcBAwBCwsgCSAHIANrQQRqNgIEIAZBgAFqJAALDQAgACgCABC1CxogAAsNACAAKAIAEL4LGiAAC4UGAQ5/AkACQAJAAkAgASgCCEUEQCADRQ0EIAFBwAA2AgggAUEGOgAEIAEgASgCEEGAAkGlPRCYASIENgIAIAQNASABQQA2AghBAA8LIAAgAhCxBiINQQAgASgCCCIJa3EhCiANIAlBAWsiBHEhBSAEQQJ2IQsgASgCACEMA0AgDCAFQQJ0aigCACIHBEAgBygCACEGIAIhBANAIAQtAAAiDiAGLQAARgRAIA5FDQYgBkEBaiEGIARBAWohBAwBCwsgCEH/AXFFBEAgCiABLQAEQQFrdiALcUEBciEICyAFIAhB/wFxIgRrIAlBACAEIAVLG2ohBQwBCwtBACEHIANFDQIgASgCDCABLQAEIgRBAWt2RQ0BIARBAWoiDkH/AXEiBEEfSyAEQR1Lcg0CIAEoAhBBBCAEdCIGQc09EJgBIgVFDQIgBUEAIAYQOCEIQQEgBHQiB0EBayIJQQJ2IQogBEEBayELQQAgB2shDEEAIQUDQCABKAIIIAVLBEAgBUECdCIQIAEoAgBqKAIAIgQEQCAAIAQoAgAQsQYiBCAJcSEGIAQgDHEgC3YgCnFBAXIhEUEAIQQDQCAIIAZBAnRqIg8oAgAEQCAGIAQgESAEQf8BcRsiBEH/AXEiD2sgB0EAIAYgD0kbaiEGDAELCyAPIAEoAgAgEGooAgA2AgALIAVBAWohBQwBCwsgASgCECABKAIAQd09EGcgASAHNgIIIAEgDjoABCABIAg2AgAgCSANcSEFIAwgDXEgC3YgCnFBAXIhAEEAIQYDQCAIIAVBAnRqKAIARQ0CIAUgBiAAIAZB/wFxGyIGQf8BcSIEayAHQQAgBCAFSxtqIQUMAAsACyAEQQBBgAIQOBogACACELEGIAEoAghBAWtxIQULIAEoAhAgA0HqPRCYASEEIAVBAnQiACABKAIAaiAENgIAIAEoAgAgAGooAgAiBEUNASAEQQAgAxA4GiABKAIAIABqIgAoAgAgAjYCACABIAEoAgxBAWo2AgwgACgCACEHCyAHDwtBAAu7AQIDfwJ+AkACQCABQXdLDQAgAEEAEL8CIgMoAvQDDQEgAUEIaiIFrSIGIAMpA7AEQn+FVg0AIAMgBiACELUJRQ0AIAUgACgCDBECACIARQ0AIAAgATYCACADIAMpA7AEIAZ8Igc3A7AEIAMoAsAEQQJPBEAgA0ErIAYgByADKQO4BCIGIAdUBH4gAyAHNwO4BCAHBSAGCyACEJEECyAAQQhqIQQLIAQPC0Gw0gFBn70BQdoGQaKzARAAAAtjAQF/QX8hAQJAIABFDQAgACgCJEEASg0AIAAoAigEQCAAQQAQ6AIaCyAAQQBBwAAgACgCICgCABEDABogABCaAUEASg0AIAAoAhRBAEoEQCAAKAIQEBgLIAAQGEEAIQELIAELQQEBfyAALQAJQRBxBEAgAEEAEOcBCwJAIAAoAhgiAUEATg0AIAAtAAhBDHFFDQAgACAAKAIMEPUJIgE2AhgLIAELEQAgACABIAAoAgAoAhwRAAALdQEBfiAAIAEgBH4gAiADfnwgA0IgiCICIAFCIIgiBH58IANC/////w+DIgMgAUL/////D4MiAX4iBUIgiCADIAR+fCIDQiCIfCABIAJ+IANC/////w+DfCIBQiCIfDcDCCAAIAVC/////w+DIAFCIIaENwMAC+0PAwd8CH8EfkQAAAAAAADwPyEDAkACQAJAIAG9IhFCIIgiE6ciEEH/////B3EiCSARpyIMckUNACAAvSISpyIPRSASQiCIIhRCgIDA/wNRcQ0AIBSnIgtB/////wdxIgpBgIDA/wdLIApBgIDA/wdGIA9BAEdxciAJQYCAwP8HS3JFIAxFIAlBgIDA/wdHcnFFBEAgACABoA8LAkACQAJAAkACQAJ/QQAgEkIAWQ0AGkECIAlB////mQRLDQAaQQAgCUGAgMD/A0kNABogCUEUdiENIAlBgICAigRJDQFBACAMQbMIIA1rIg52Ig0gDnQgDEcNABpBAiANQQFxawshDiAMDQIgCUGAgMD/B0cNASAKQYCAwP8DayAPckUNBSAKQYCAwP8DSQ0DIAFEAAAAAAAAAAAgEUIAWRsPCyAMDQEgCUGTCCANayIMdiINIAx0IAlHDQBBAiANQQFxayEOCyAJQYCAwP8DRgRAIBFCAFkEQCAADwtEAAAAAAAA8D8gAKMPCyATQoCAgIAEUQRAIAAgAKIPCyATQoCAgP8DUiASQgBTcg0AIACfDwsgAJkhAiAPDQECQCALQQBIBEAgC0GAgICAeEYgC0GAgMD/e0ZyIAtBgIBARnINAQwDCyALRSALQYCAwP8HRnINACALQYCAwP8DRw0CC0QAAAAAAADwPyACoyACIBFCAFMbIQMgEkIAWQ0CIA4gCkGAgMD/A2tyRQRAIAMgA6EiACAAow8LIAOaIAMgDkEBRhsPC0QAAAAAAAAAACABmiARQgBZGw8LAkAgEkIAWQ0AAkACQCAODgIAAQILIAAgAKEiACAAow8LRAAAAAAAAPC/IQMLAnwgCUGBgICPBE8EQCAJQYGAwJ8ETwRAIApB//+//wNNBEBEAAAAAAAA8H9EAAAAAAAAAAAgEUIAUxsPC0QAAAAAAADwf0QAAAAAAAAAACAQQQBKGw8LIApB/v+//wNNBEAgA0ScdQCIPOQ3fqJEnHUAiDzkN36iIANEWfP4wh9upQGiRFnz+MIfbqUBoiARQgBTGw8LIApBgYDA/wNPBEAgA0ScdQCIPOQ3fqJEnHUAiDzkN36iIANEWfP4wh9upQGiRFnz+MIfbqUBoiAQQQBKGw8LIAJEAAAAAAAA8L+gIgBERN9d+AuuVD6iIAAgAKJEAAAAAAAA4D8gACAARAAAAAAAANC/okRVVVVVVVXVP6CioaJE/oIrZUcV97+ioCICIAIgAEQAAABgRxX3P6IiAqC9QoCAgIBwg78iACACoaEMAQsgAkQAAAAAAABAQ6IiACACIApBgIDAAEkiCRshAiAAvUIgiKcgCiAJGyIMQf//P3EiCkGAgMD/A3IhCyAMQRR1Qcx3QYF4IAkbaiEMQQAhCQJAIApBj7EOSQ0AIApB+uwuSQRAQQEhCQwBCyAKQYCAgP8DciELIAxBAWohDAsgCUEDdCIKQYDMCGorAwAgAr1C/////w+DIAutQiCGhL8iBCAKQfDLCGorAwAiBaEiBkQAAAAAAADwPyAFIASgoyIHoiICvUKAgICAcIO/IgAgACAAoiIIRAAAAAAAAAhAoCAHIAYgACAJQRJ0IAtBAXZqQYCAoIACaq1CIIa/IgaioSAAIAUgBqEgBKCioaIiBCACIACgoiACIAKiIgAgAKIgACAAIAAgACAARO9ORUoofso/okRl28mTSobNP6CiRAFBHalgdNE/oKJETSaPUVVV1T+gokT/q2/btm3bP6CiRAMzMzMzM+M/oKKgIgWgvUKAgICAcIO/IgCiIgYgBCAAoiACIAUgAEQAAAAAAAAIwKAgCKGhoqAiAqC9QoCAgIBwg78iAET1AVsU4C8+vqIgAiAAIAahoUT9AzrcCcfuP6KgoCICIApBkMwIaisDACIEIAIgAEQAAADgCcfuP6IiAqCgIAy3IgWgvUKAgICAcIO/IgAgBaEgBKEgAqGhCyECIAEgEUKAgICAcIO/IgShIACiIAEgAqKgIgIgACAEoiIBoCIAvSIRpyEJAkAgEUIgiKciCkGAgMCEBE4EQCAKQYCAwIQEayAJcg0DIAJE/oIrZUcVlzygIAAgAaFkRQ0BDAMLIApBgPj//wdxQYCYw4QESQ0AIApBgOi8+wNqIAlyDQMgAiAAIAGhZUUNAAwDC0EAIQkgAwJ8IApB/////wdxIgtBgYCA/wNPBH5BAEGAgMAAIAtBFHZB/gdrdiAKaiIKQf//P3FBgIDAAHJBkwggCkEUdkH/D3EiC2t2IglrIAkgEUIAUxshCSACIAFBgIBAIAtB/wdrdSAKca1CIIa/oSIBoL0FIBELQoCAgIBwg78iAEQAAAAAQy7mP6IiAyACIAAgAaGhRO85+v5CLuY/oiAARDlsqAxhXCC+oqAiAqAiACAAIAAgACAAoiIBIAEgASABIAFE0KS+cmk3Zj6iRPFr0sVBvbu+oKJELN4lr2pWET+gokSTvb4WbMFmv6CiRD5VVVVVVcU/oKKhIgGiIAFEAAAAAAAAAMCgoyAAIAIgACADoaEiAKIgAKChoUQAAAAAAADwP6AiAL0iEUIgiKcgCUEUdGoiCkH//z9MBEAgACAJEPkCDAELIBFC/////w+DIAqtQiCGhL8LoiEDCyADDwsgA0ScdQCIPOQ3fqJEnHUAiDzkN36iDwsgA0RZ8/jCH26lAaJEWfP4wh9upQGiC2cBA38jAEEQayICJAAgACABKAIANgIAIAEoAgghAyABKAIEIQQgAUIANwIEIAIgACgCBDYCCCAAIAQ2AgQgAiAAKAIINgIMIAAgAzYCCCACQQhqENkBIAAgASsDEDkDECACQRBqJAAL6AECA38BfCMAQRBrIgUkAEHgABBSIgQgBCgCMEEDcjYCMCAEIAQoAgBBfHFBAnI2AgBBuAEQUiEGIAQgADYCWCAEIAY2AhAgBCABNgIoRAAAwP///99BIQcCQCACRAAAwP///99BZEUEQCACIQcMAQsgBUH/////BzYCCCAFIAI5AwBBgekEIAUQNwsgBiADNgKcASAGAn8gB0QAAAAAAADgP0QAAAAAAADgvyAHRAAAAAAAAAAAZhugIgKZRAAAAAAAAOBBYwRAIAKqDAELQYCAgIB4CzYCrAEgBBD1DhogBUEQaiQAIAQLBABBAAuZAwIHfwF8IwBBwARrIgckAANAIAVBBEYEQEQAAAAAAADwPyACoSEMQQMhBkEBIQEDQCABQQRGRQRAQQAhBSAHIAFBAWtB4ABsaiEIA0AgBSAGRkUEQCAFQQR0IgkgByABQeAAbGpqIgogDCAIIAlqIgkrAwCiIAIgCCAFQQFqIgVBBHRqIgsrAwCioDkDACAKIAwgCSsDCKIgAiALKwMIoqA5AwgMAQsLIAZBAWshBiABQQFqIQEMAQsLAkAgA0UNAEEAIQUDQCAFQQRGDQEgAyAFQQR0aiIBIAcgBUHgAGxqIgYpAwg3AwggASAGKQMANwMAIAVBAWohBQwACwALAkAgBEUNAEEAIQUDQCAFQQRGDQEgBCAFQQR0IgFqIgMgB0EDIAVrQeAAbGogAWoiASkDCDcDCCADIAEpAwA3AwAgBUEBaiEFDAALAAsgACAHKQOgAjcDACAAIAcpA6gCNwMIIAdBwARqJAAFIAcgBUEEdCIGaiIIIAEgBmoiBikDADcDACAIIAYpAwg3AwggBUEBaiEFDAELCws/AQJ/A0AgACgCECICKALwASIBRSAAIAFGckUEQCABIgAoAhAoAvABIgFFDQEgAiABNgLwASABIQAMAQsLIAALCgAgAC0AC0EHdgsYACAALQAAQSBxRQRAIAEgAiAAEKMHGgsLIAECfyAAEEBBAWoiARBPIgJFBEBBAA8LIAIgACABEB8LKQEBfkHogwtB6IMLKQMAQq3+1eTUhf2o2AB+QgF8IgA3AwAgAEIhiKcLxAEBA38CfwJAIAEoAkwiAkEATgRAIAJFDQFB/IILKAIAIAJB/////wNxRw0BCwJAIABB/wFxIgIgASgCUEYNACABKAIUIgMgASgCEEYNACABIANBAWo2AhQgAyAAOgAAIAIMAgsgASACEKUHDAELIAFBzABqIgQQ6wsaAkACQCAAQf8BcSICIAEoAlBGDQAgASgCFCIDIAEoAhBGDQAgASADQQFqNgIUIAMgADoAAAwBCyABIAIQpQchAgsgBBDoAxogAgsLqwMCBX8BfiAAvUL///////////8Ag0KBgICAgICA+P8AVCABvUL///////////8Ag0KAgICAgICA+P8AWHFFBEAgACABoA8LIAG9IgdCIIinIgJBgIDA/wNrIAenIgVyRQRAIAAQwAUPCyACQR52QQJxIgYgAL0iB0I/iKdyIQMCQCAHQiCIp0H/////B3EiBCAHp3JFBEACQAJAIANBAmsOAgABAwtEGC1EVPshCUAPC0QYLURU+yEJwA8LIAJB/////wdxIgIgBXJFBEBEGC1EVPsh+T8gAKYPCwJAIAJBgIDA/wdGBEAgBEGAgMD/B0cNASADQQN0QeDMCGorAwAPCyAEQYCAwP8HRyACQYCAgCBqIARPcUUEQEQYLURU+yH5PyAApg8LAnwgBgRARAAAAAAAAAAAIARBgICAIGogAkkNARoLIAAgAaOZEMAFCyEAAkACQAJAIANBAWsOAwABAgQLIACaDwtEGC1EVPshCUAgAEQHXBQzJqahvKChDwsgAEQHXBQzJqahvKBEGC1EVPshCcCgDwsgA0EDdEGAzQhqKwMAIQALIAALlgECAX8BfgJAIAAQOSABEDlHDQACQAJAAkAgASgCAEEDcQ4CAAECCwNAIAAgAUYiAg0DIAEoAkQiAQ0ACwwCCwJAIAAgASkDCCIDEL8DIgFBAXINAEEAIQEgACAAEDkiAkYNACACIAMQvwMiAkUNACAAIAJBARCFARogAiEBCyABQQBHDwsgACABQQAQ1gJBAEchAgsgAgtEAgJ/AXwgAEEAIABBAEobIQADQCAAIANGRQRAIAEgA0EDdCIEaisDACACIARqKwMAoiAFoCEFIANBAWohAwwBCwsgBQs7AQJ/IAAoAgQiAQRAIAEhAANAIAAiASgCACIADQALIAEPCwNAIAAgACgCCCIBKAIARyABIQANAAsgAAs6AQF/AkAgAUUNACAAEL4DKAIAIAFBARCXBCICRSACQQhqIAFHcg0AIAAgARDVAg8LIAAgAUEAEM8ICwwAQaDgChDvCzYCAAuZAgEGfyAAKAIIIgVBgCBxBEAgACgCDA8LAkAgBUEBcQRAIAAoAhAiAiAAKAIUQQJ0aiEGA0AgAiAGTw0CIAIoAgAiBARAAkAgAUUEQCAEIgMhAQwBCyABIAQ2AgALA0AgASIEKAIAIgENAAsgAiAENgIAIAQhAQsgAkEEaiECDAALAAsgACgCDCIDRQRAQQAhAwwBCwNAIAMoAgQiAQRAIAMgASgCADYCBCABIAM2AgAgASEDDAELCyADIQEDQCABIgQoAgAiAQRAIAEoAgQiAkUNAQNAIAEgAigCADYCBCACIAE2AgAgAiIBKAIEIgINAAsgBCABNgIADAELCyAAKAIIIQULIAAgAzYCDCAAIAVBgCByNgIIIAMLoQEBAn8CQCAAECVFIAIgAWtBBUhyDQAgASACEJYFIAJBBGshBCAAEEYiAiAAECVqIQUCQANAAkAgAiwAACEAIAEgBE8NACAAQQBMIABB/wBOckUEQCABKAIAIAIsAABHDQMLIAFBBGohASACIAUgAmtBAUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQowEEQCAAKAIAIAAQ9gIaEKEFCyABECUaIAEQowEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDTASACQQA6AA8gASACQQ9qENIBAkAgACABRiIBIANyRQ0ACyAAEKMBIAFyRQRAIAAQpQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4Mh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9ANFBEAgAykDsAQiIkKAgICAEH1CkHtaDQEgAyAiQvAEfCIiNwOwBCADKALABEECTwRAIANBK0LwBCAiIAMpA7gEIiMgIlQEfiADICI3A7gEICIFICMLQZ8LEJEECyACQRA2ApwDIAJBADYCKCACQQA2AhAgAiABQYACQakLEJgBIgM2AqgDIANFBEAgASABQasLEGdBAAwFCyACIAFBgAhBtgsQmAEiAzYCQCADRQRAIAEgAigCqANBuAsQZyABIAFBvAsQZwwECyACIANBgAhqNgJEQQAiBkUEQCABQbwBQcw6EJgBIgZFDQMgBkIANwJQIAZCADcCaCAGIAE2AmQgBiABNgJ8IAZCADcCCCAGQQA6AAQgBkIANwIcIAZBADoAGCAGIAE2AhAgBkEANgIAIAZCADcCMCAGQQA6ACwgBiABNgIkIAZBADYCFCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAE2AjggBkEANgIoIAZBADYCPCAGIAE2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiABNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAJBADYCmAMgAiAGNgKEAyACQQA2ApADIAJBADYC0AIgAkEANgLIAiACQQA2AsACIAJCADcD8AMgAkEhOgD4AyACQQA2AogCIAJBADYCkAEgAkEAOwH8ASACQgA3AsADIAJBADYC+AEgAkIANwKsAyACIAE2AtQDIAJCADcCyAMgAkEANgLQAyACQQA6ALQDIAJBADYC6AMgAkIANwLgAyACQgA3AtgDIAIgATYC7AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAFBEBBACEGA0AgBSAGaiAGQQFqIQYtAAANAAsgASAGQYjCABCYASIDBEAgAyAFIAYQHxoLIAEgAzYC8AELIAFBADYCgAMgAUGgAWogAUGcAWpBABDBBhogAUIANwMAIAFBQGtBAEHAABA4GiABQgA3AowBIAFBADYChAEgAUIANwKUASABQgA3A7ADIAFBADYCNCABQQE6ADAgAUEANgIsIAFCADcCJCABQQA2AsQCIAFBADYCvAIgAUIANwKkAiABQgA3AqwCIAFBADYCtAIg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akECED0MGgUgESADQQR0IhJqIhQgASASaiISKQMANwMAIBQgEikDCDcDCCADQQFqIQMMAQsACwALIAJBAmoiA0EQEBoiAiABKQMINwMIIAIgASkDADcDACACIBApAyA3AxAgAiAQKQMoNwMYIAIgECsDICAQKwMwIgYgECsDQKFEAAAAAAAACECjIgegOQMgIBArAyghCCAQKwNIIQkgECsDOCEFIAIgBiAHoDkDMCACIAUgBSAJoUQAAAAAAAAIQKMiBaA5AzggAiAIIAWgOQMoQQQgAyADQQRNGyERIAFBIGshE0EEIQEDQCABIBFGBEAgACACIAMgBBBIIAIQGCAPIBApAzg3AyggDyAQKQMwNwMgIA8gECkDKDcDOCAPIBApAyA3AzAgACAPQSBqQQIQPQwZBSACIAFBBHQiEmoiFCASIBNqIhIpAwA3AwAgFCASKQMINwMIIAFBAWohAQwBCwALAAsgAkEDaiIDQRAQGiICIAFBCGopAwA3AwggAiABKQMANwMAIAIgASsDACIFIAUgECsDEKEiBkQAAAAAAADQv6KgOQMQIAErAwghCCAQKwNIIQkgAiAQKwM4Igc5AzggAiAFIAZEAAAAAAAAAsCioDkDMCACIAUgBiAGoKE5AyAgAiAIIAcgCaFEAAAAAAAACECjoCIFOQMoIAIgBTkDGCAQKwMwIQUgAiAHOQNIIAIgBTkDQEEEIAMgA0EETRshESABQTBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQSCACEBgMGAUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBBEcNG0EGQRAQGiICIAEpAwg3AwggAiABKQMANwMAIAIgECkDKDcDGCACIBApAyA3AxAgAiAQKQNINwMoIAIgECkDQDcDICACIAEpAyg3AzggAiABKQMgNwMwIAIgECkDgAE3A0AgAiAQKQOIATcDSCACIBApA6ABNwNQIAIgECkDqAE3A1ggACACQQYgBBBIIAIQGCAPIBArAxAgECsDsAEgECsDAKGgOQMgIA8gECsDGCAQKwO4ASAQKwMIoaA5AyggDyAQKQNINwM4IA8gECkDQDcDMCAAIA9BIGoiAUECED0gDyAQKQOIATcDOCAPIBApA4ABNwMwIAAgAUECED0gDyAQ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AgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQfyACyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCxAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHExQQgAxA3CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQwQIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAcIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHSEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEMAMIABBARDKBSACQRBqJAALDwAgAUEBaiAAIAAQqgGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAoAgAiAARAIAAoAhAiBCsDCCIGIAIrAwgiB2MEQCAAQQRqIQAMAgUgACABIAAgAiAESyIEGyAGIAdkIgUbIQEgACAAIARBAnRqIAUbIQAMAgsACwsCQAJAIAEgA0YNACACKwMIIgYgASgCECIAKwMIIgdjDQAgACACTSAGIAdkcg0BCyADIQELIAELZAEBfyMAQRBrIgQkACAAQQA7ARwgAEEANgIYIAAgAzkDCCAAIAI2AgQgACABNgIAIAQgADYCDCABQTRqIARBDGoQwAEgACgCBCAEIAA2AghBKGogBEEIahDAASAEQRBqJAAgAAs8ACAAIAEQ0gIEQCAAEMMEDwsgABD9ByIBRQRAQQAPCyAAIAEQ/AchACABEG0gACAALQAkQQNyOgAkIAALrAEBAX8CQCAAECgE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IAUgBCsDCDkDECAFQShqIAMgFiAUIAsRHgBFBEAgBUIANwNYIAUgAzYCACAFIAc2AhggB0EBaiEHIAAgAxAdIQMMAQsLQZj/CigCABAYQZj/CkEANgIAENcMDAILQQAhByACQbADakEAQdAAEDgaIAUEQEGY/wooAgAhBET////////vfyEURP///////+//IRhE////////7/8hG0T////////vfyEZA0AgBSAHRgRARJqZmZmZmak/IRYCQCAAQdLkABAnIgBFDQAgAC0AAEUNACAAEK4CIRYLQbD/CiAbIBsgGaEgFqIiE6AiFzkDAEG4/wogGSAToSIVOQMAQaj/CiAUIBggFKEgFqIiE6EiFDkDAEGg/wogGCAToCITOQMAIAIgFTkD2AMgAiAXOQPoAyACIBU5A7gDIAIgEzkD0AMgAiAXOQPIAyACIBQ5A/ADIAIgEzkDwAMgAiAUOQPgAyABKAIAIQBBABDQByELAkACQCAAQQJGBEAgC0UNAiACQbADahDWDEEAIQMDQEGY/wooAgAhAUHk/gooAgAhAEEAIQQDQCAAIARHBEAgASAEQeAAbGoiCyALKwMIRM3MzMzMzPA/ojkDCCALIAsrAxBEzczMzMzM8D+iOQMQIARBAWohBAwBCwsgA0EBaiIDENAHDQALQezaCi0AAEUNASACIAM2AhBBiPYIKAIAQezdAyACQRBqECAaDAELIAtFDQEgAkGwA2oQ1gxBACEHQQAhBANAIAJBsANqIgEhACAHBEAgABDUDAtB+P4KQv////////93NwMAQfD+CkL/////////9/8ANwMAAkBB5P4KKAIAIgUEQCAAKAIAIQZE////////738hFET////////v/yEWQQAhAANAIAAgBUYNAkHw/gogFCAGIABBAnRqKAIAIgMrAwAQKSIUOQMAQfj+CiAWIAMrAwAQIyIWOQMAIABBAWohAAwACwALQeGVA0H8twFBzwFBzJIBEAAAC0GA/wogBigCACsDCDkDACAGIAVBAnRqQQRrKAIAKwMIIRNBkP8KIBYgFKE5AwBBiP8KIBM5AwBEAAAAAAAAAAAhFUQAAAAAAAAAACEUIwBBMGsiDiQAQQFBEBAaIg9B6P4KKAIAQQJ0IgA2AgQgDyAAQSgQGjYCAEHA/wogARDNBTYCACAOQgA3AyggDkIANwMgIA5CADcDGCMAQSBrIgUkAAJAAkACQCAOQRhqIgYEQCAGQgA3AgAgBkIANwIQIAZCADcCCCAGQej+CigCACIDQQF0IgA2AgggAEGAgICABE8NAUEAIAMgAEEEEE4iABsNAiAGIAA2AgwgBiAGQQBBABC3BDYCECAGIAZBAEEAELcEIgM2AhQgBigCECIAIAM2AgQgAEEANgIAIANBADYCBCADIAA2AgAgBigCDCAANgIAIAYoAgwgBigCCEECdGpBBGsgBigCFDYCACAFQSBqJAAMAwtB09MBQZK6AUEdQfaIARAAAAsgBUEENgIEIAUgADYCAEGI9ggoAgBBpuoDIAUQIBoQLwALIAUgA0EDdDYCEEGI9ggoAgBB9ekDIAVBEGoQIBoQLwALIAEQzQUhEANAIA8Q1AdFBEAgDygCDCEGIA8oAgAhAANAIAAgBkEobGooAiAiA0UEQCAPIAZBAWoiBjYCDAwBCwsgDiADKAIQKwMAOQMIIA4gAysDGDkDECAOKwMQIRUgDisDCCEUCwJAIBBFDQACQCAPENQHDQAgECsDCCITIBVjDQAgEyAVYg0BIBArAwAgFGNFDQELAn9BACEFAkAgDkEYaiIIBEAgCCgCCCIAQQBMDQECQCAQKwMAQfD+CisDAKFBkP8KKwMAoyAAt6IiE0QAAAAAAAAAAGMNACATIABBAWsiBbhkDQAgE5lEAAAAAAAA4EFjBEAgE6ohBQwBC0GAgICAeCEFCwJAIAggBRDSByIGDQBBASEDA0AgCCAFIANrENIHIgYNASADIAVqIQAgA0EBaiEDIAggABDSByIGRQ0ACwsgCCgCFCEDAkACQCAIKAIQIgAgBkcEQCADIAZGDQEgBiAQENEHRQ0BCwNAIAMgBigCBCIGRwRAIAYgEBDRBw0BCwsgBigCACEGDAELA0AgBigCACIGIABGDQEgBiAQENEHRQ0ACwsCQCAFQQBMDQAgBSAIKAIIQQFrTg0AIAgoAgwgBUECdGogBjYCAAsgBgwCC0HT0wFBkroBQbcBQZClARAAAAtBvTdBkroBQawBQdTZABAAAAsiDSgCBCEFIA0gCCANEN0MIBAgCBDjDCIDQQAQtwQiBhDTByANIAYgCBDOBSIABEAgDyANENUHIA8gDSAAIAAgEBDPBRDQBQsgBiAOQRhqIgAgA0EBELcEIgMQ0wcgAyAFIAAQzgUiAARAIA8gAyAAIAAgEBDPBRDQBQsgARDNBSEQDAELIA8Q1AdFBEAgDygCACAPKAIMQShsaiIAIAAoAiAiCCgCIDYCICAPIA8oAghBAWs2AgggCCgCACEKIAgoAgQiBSgCBCEDIAgoAggiAAR/IABBJEEgIAgtAAwbagVBwP8KCygCACENIAUQ3QwhACAIKAIIIAgsAAwgCCgCECIGIA5BGGoiBxDWByAFKAIIIAUsAAwgBiAHENYHIAgQ3wwgDyAFENUHIAUQ3wwgCiAHIAAgDSANKwMIIAArAwhkIggbIgUgDSAAIAgbIAcQ4wwiACAIELcEIg0Q0wcgACAIRSAGIAcQ1gcgCiANIAcQzgUiAARAIA8gChDVByAPIAogACAAIAUQzwUQ0AULIA0gAyAOQRhqEM4FIgBFDQEgDyANIAAgACAFEM8FENAFDAELCyAOKAIoKAIEIQADQCAOKAIsIABHBEAgACgCCBDiDCAAKAIEIQAMAQsLAkAgDkEYagRAIA4oAhghAQNAIAEEQCABKAIAIQAgARAYIA4gADYCGCAAIQEMAQsLIA5CADcCGAwBC0HQ1gFB4b4BQacBQckhEAAACyAOKAIkEBggDxCOCCAOQTBqJAAgAkGY/wooAgAiACkDEDcD+AIgAiAAKQMINwPwAiACIAIpA+ADNwPoAiACIAIpA9gDNwPgAiACQfACaiACQeACahD/AiEWIAIgACkDEDcD2AIgAiAAKQMINwPQAiACIAIpA8ADNwPIAiACIAIpA7gDNwPAAiACQdACaiACQcACahD/AiEUIAIgACkDEDcDuAIgAiAAKQMINwOwAiACIAIpA/ADNwOoAiACIAIpA+gDNwOgAiACQbACaiACQaACahD/AiEZIAIgACkDEDcDmAIgAiAAKQMINwOQAiACIAIpA9ADNwOIAiACIAIpA8gDNwOAAkEBIQcgAkGQAmogAkGAAmoQ/wIhGCAAIgMiCiEBA0BB5P4KKAIAIAdLBEAgAkGY/wooAgAgB0HgAGxqIgUpAxA3A5gBIAIgBSkDCDcDkAEgAiACKQPgAzcDiAEgAiACKQPYAzcDgAEgAkGQAWogAkGAAWoQ/wIhGiACIAUpAxA3A3ggAiAFKQMINwNwIAIgAikD8AM3A2ggAiACKQPoAzcDYCACQfAAaiACQeAAahD/AiEXIAIgBSkDEDcDWCACIAUpAwg3A1AgAiACKQPAAzcDSCACIAIpA7gDNwNAIAJB0ABqIAJBQGsQ/wIhFSACIAUpAxA3AzggAiAFKQMINwMwIAIgAikD0AM3AyggAiACKQPIAzcDICAFIAAgFiAaZCIIGyEAIAUgCiAXIBljIg0bIQogBSADIBQgFWQiBhshAyAFIAEgAkEwaiACQSBqEP8CIhMgGGMiBRshASAaIBYgCBshFiAXIBkgDRshGSAVIBQgBhshFCATIBggBRshGCAHQQFqIQcMAQsLIABBCGogAisD2AMgAisD4AMQ/gIgCkEIaiACKwPoAyACKwPwAxD+AiADQQhqIAIrA7gDIAIrA8ADEP4CIAFBCGogAisDyAMgAisD0AMQ/gJBACEBQZj/CigCACEIQeT+CigCACENIAQhAwNAIAEgDUcEQCAIIAFB4ABsaiEHAkAgA0UEQCAHLQAgQQFHDQELQQIgBygCXCIAIABBAk0bQQFrIQYgBygCWCIKKwMIIRkgCisDACEcQQEhBEQAAAAAAAAAACEWRAAAAAAAAAAAIRhEAAAAAAAAAAAhGwNAIAQgBkcEQCAbIAogBEEBaiIAQQR0aiIFKwMAIhQgGSAKIARBBHRqIgQrAwgiGqGiIBwgGiAFKwMIIhehoiAEKwMAIhMgFyAZoaKgoJlEAAAAAAAA4D+iIhWgIRsgFSAZIBqgIBegRAAAAAAAAAhAo6IgGKAhGCAVIBwgE6AgFKBEAAAAAAAACECjoiAWoCEWIAAhBAwBCwsgByAYIBujOQMQIAcgFiAbozkDCAsgAUEBaiEBDAELCyAMQQFqIgwQ0AciAARAIAAgC0khAUEBIQdBASEEIAAhC0EAIAlBAWogARsiCUUNAUG4/wpBuP8KKwMAIhNBsP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIho5AwBBsP8KIBQgE6AiFzkDAEGo/wpBqP8KKwMAIhNBoP8KKwMAIhQgE6FEmpmZmZmZqT+iIhOhIhU5AwBBoP8KIBQgE6AiEzkDACACIBo5A9gDIAIgFzkD6AMgAiAaOQO4AyACIBM5A9ADIAIgFzkDyAMgAiAVOQPwAyACIBM5A8ADIAIgFTkD4AMgEUEBaiERDAELC0Hs2gotAABFDQBBiPYIKAIAIgYQ1QEgAhDWATcDgAQgAkGABGoiCRDrASIFKAIUIQsgBSgCECEDIAUoAgwhBCAFKAIIIQEgBSgCBCEAIAIgBSgCADYC/AEgAiAANgL4ASACIAE2AvQBIAIgBDYC8AEgAkHIAzYC5AEgAkH8twE2AuABIAIgA0EBajYC7AEgAiALQewOajYC6AEgBkHGygMgAkHgAWoQIBogAiAMNgLQASAGQY8YIAJB0AFqECAaQQogBhCnARogBhDUAUHs2gotAABFDQAgBhDVASACENYBNwOABCAJEOsBIgkoAhQhCyAJKAIQIQMgCSgCDCEEIAkoAgghASAJKAIEIQAgAiAJKAIANgLMASACIAA2AsgBIAIgATYCxAEgAiAENgLAASACQckDNgK0ASACQfy3ATYCsAEgAiADQQFqNgK8ASACIAtB7A5qNgK4ASAGQcbKAyACQbABahAgGiACIBE2AqABIAZBqRggAkGgAWoQIBpBCiAGEKcBGiAGENQBC0EAIQRBmP8KKAIAIQNB5P4KKAIAIQFBASEKA0AgASAERg0BIAMgBEHgAGxqIgsoAgAoAhAoApQBIgAgCysDCDkDACAAIAsrAxA5AwggBEEBaiEEDAALAAsQ1wwgAigCsAMQGCAKIBJqIRIMBAUgBCAHQeAAbGoiAysDKCEaIAMrAwghHCADKwMwIRcgAysDOCEVIAdBAWohByAYIAMrAxAiEyADKwNAoBAjIRggGyAcIBWgECMhGyAUIBMgF6AQKSEUIBkgHCAaoBApIRkMAQsACwALQeGVA0H8twFB3gBBphIQAAALQYuaA0H8twFB/QBBj98AEAAACyACQaAEaiQAIBILsgMCB38BfSMAQSBrIgQkACACQQAgAkEAShshBwNAIAUgB0YEQCADIABBAnRqQQA2AgAgBEEANgIYIARCADcDECAEQgA3AwggBCAANgIcIARBCGpBBBAmIQAgBCgCCCAAQQJ0aiAEKAIcNgIAIARBHGohCEH/////ByEAA0ACQCAEKAIQRQRAIABBCmohAEEAIQUDQCAFIAdGDQIgAyAFQQJ0aiIBKAIAQQBIBEAgASAANgIACyAFQQFqIQUMAAsACyAEQQhqIAgQoQQgASAEKAIcIgBBFGxqIQIgAyAAQQJ0aigCACEAQQEhBQNAIAUgAigCAE8NAiADIAVBAnQiBiACKAIEaigCACIJQQJ0aiIKKAIAQQBIBEAgCgJ/QQEgASgCCEUNABogAigCCCAGaioCACILi0MAAABPXQRAIAuoDAELQYCAgIB4CyAAajYCACAEIAk2AhwgBEEIakEEECYhBiAEKAIIIAZBAnRqIAQoAhw2AgALIAVBAWohBQwACwALCyAEQQhqIgBBBBAxIAAQNCAEQSBqJAAFIAMgBUECdGpBfzYCACAFQQFqIQUMAQsLCzIBAX8gAEEAIABBAEobIQADQCAAIANGRQRAIAIgA0ECdGogATgCACADQQFqIQMMAQsLC0gBAn8gAEEAIABBAEobIQMDQCACIANGBEAgAQRAIAEQGAsPCyABIAJBAnRqKAIAIgAEQCAAELUNCyAAEBggAkEBaiECDAALAAsQAEEgEIkBIAAgASACEK8DCwoAIAAoAgQQvQQLhAIBBn8jAEEQayIEJAAjAEEQayIDJAAgASIHQQRqIQUCQCABKAIEIgZFBEAgBSEBDAELIAIoAgAhCANAIAYiASgCECIGIAhLBEAgASEFIAEoAgAiBg0BDAILIAYgCE8NASABQQRqIQUgASgCBCIGDQALCyADIAE2AgwgBCAFKAIAIgEEf0EABUEUEIkBIQEgAyAHQQRqNgIEIAEgAigCADYCECADQQE6AAggByADKAIMIAUgARDdBSADQQA2AgAgAygCACECIANBADYCACACBEAgAhAYC0EBCzoADCAEIAE2AgggA0EQaiQAIAAgBCgCCDYCACAAIAQtAAw6AAQgBEEQaiQAC5QQAQh/IwBBQGoiCyQAAkACQAJAAkACQCABQQBMIAJBAExyRQRAIAEgAiAAIAYgB0EAEL8NIgkoAhghDCAJKAIUIQggAUEBaiEKQQAhBwNAIAcgCkYEQAJAIAZBBGsOBQAFBQUGBAsFIAggB0ECdGpBADYCACAHQQFqIQcMAQsLIAhBBGohCiAJKAIcIQ1BACEHQQAhBgNAIAAgBkYEQANAIAEgB0YEQEEAIQcDQCAAIAdGBEADQCABQQBMDQwgCCABQQJ0aiICIAJBBGsoAgA2AgAgAUEBayEBDAALAAUgDSAIIAMgB0ECdCICaiIGKAIAQQJ0aigCAEECdGogAiAFaigCADYCACACIARqKAIAIQIgCCAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAMIAZBAnRqIAI2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtB1wM2AiQgC0GWtwE2AiBBiPYIKAIAQdi/BCALQSBqECAaEDsAC0HOlgNBlrcBQbQDQYXxABAAAAsgBkEBRg0CCyALQfMDNgIEIAtBlrcBNgIAQYj2CCgCAEHYvwQgCxAgGhA7AAsgCEEEaiEFQQAhB0EAIQYDQCAAIAZGBEADQCABIAdGBEBBACEHA0AgACAHRgRAA0AgAUEATA0IIAggAUECdGoiAiACQQRrKAIANgIAIAFBAWshAQwACwAFIAQgB0ECdCICaigCACEFIAggAiADaigCAEECdGoiAiACKAIAIgJBAWo2AgAgDCACQQJ0aiAFNgIAIAdBAWohBwwBCwALAAUgB0ECdCECIAggB0EBaiIHQQJ0aiIFIAUoAgAgAiAIaigCAGo2AgAMAQsACwALAkAgAyAGQQJ0IgpqKAIAIg0gAU8NACAEIApqKAIAIAJPDQAgBSANQQJ0aiIKIAooAgBBAWo2AgAgBkEBaiEGDAELCyALQecDNgI0IAtBlrcBNgIwQYj2CCgCAEHYvwQgC0EwahAgGhA7AAsgCEEEaiEKIAkoAhwhDUEAIQdBACEGA0AgACAGRgRAA0AgASAHRgRAQQAhBwNAIAAgB0YEQANAIAFBAEwNByAIIAFBAnRqIgIgAkEEaygCADYCACABQQFrIQEMAAsABSANIAggAyAHQQJ0IgZqKAIAQQJ0aiIKKAIAIgJBA3RqIAUgB0EDdGorAwA5AwAgBCAGaigCACEGIAogAkEBajYCACAMIAJBAnRqIAY2AgAgB0EBaiEHDAELAAsABSAHQQJ0IQIgCCAHQQFqIgdBAnRqIgYgBigCACACIAhqKAIAajYCAAwBCwALAAsCQCADIAZBAnQiDmooAgAiDyABTw0AIAQgDmooAgAgAk8NACAKIA9BAnRqIg4gDigCAEEBajYCACAGQQFqIQYMAQsLIAtBxQM2AhQgC0GWtwE2AhBBiPYIKAIAQdi/BCALQRBqECAaEDsACyAIQQA2AgAgCSAANgIIAn9BACEDQQAhBiAJIgEoAgQiAEEAIABBAEobIQkgASgCECECIAEoAhghBCABKAIUIQUgAEEEED8hBwJAAkACQAJAAkACQAJAA0AgAyAJRgRAAkBBACEDIAJBBGsOBQMGBgYEAAsFIAcgA0ECdGpBfzYCACADQQFqIQMMAQsLIAJBAUcNAyAFKAIAIQAgASgCHCEJA0AgBiABKAIATg0DIAUgBkECdGohCiAFIAZBAWoiBkECdGohCANAIAgoAgAiAiAASgRAAkAgByAEIABBAnRqIg0oAgAiAkECdGooAgAiDCAKKAIASARAIAQgA0ECdGogAjYCACAJIANBA3RqIAkgAEEDdGorAwA5AwAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAEIAxBAnRqKAIAIAJHDQggCSAMQQN0aiICIAkgAEEDdGorAwAgAisDAKA5AwALIABBAWohAAwBCwsgCCADNgIAIAIhAAwACwALIAUoAgAhACABKAIcIQkDQCAGIAEoAgBODQIgBSAGQQJ0aiEKIAUgBkEBaiIGQQJ0aiEIA0AgCCgCACICIABKBEACQCAHIAQgAEECdCICaiINKAIAIgxBAnRqKAIAIg4gCigCAEgEQCAEIANBAnQiDmogDDYCACAJIA5qIAIgCWooAgA2AgAgByANKAIAQQJ0aiADNgIAIANBAWohAwwBCyAMIAQgDkECdCINaigCAEcNCCAJIA1qIgwgDCgCACACIAlqKAIAajYCAAsgAEEBaiEADAELCyAIIAM2AgAgAiEADAALAAsgBSgCACEAA0AgBiABKAIATg0BIAUgBkECdGohCCAFIAZBAWoiBkECdGohCQNAIAkoAgAiAiAASgRAAkAgByAEIABBAnRqIgwoAgAiAkECdGooAgAiCiAIKAIASARAIAQgA0ECdGogAjYCACAHIAwoAgBBAnRqIAM2AgAgA0EBaiEDDAELIAQgCkECdGooAgAgAkcNCAsgAEEBaiEADAELCyAJIAM2AgAgAiEADAALAAsgASADNgIIIAEhAwsgBxAYIAMMAwtBtscBQZa3AUG4B0G8LxAAAAtBtscBQZa3AUHMB0G8LxAAAAtBtscBQZa3AUHeB0G8LxAAAAsgC0FAayQACzwBAn8jAEEQayIBJABBASAAEE4iAkUEQCABIAA2AgBBiPYIKAIAQfXpAyABECAaEC8ACyABQRBqJAAgAgt6AQF/IwBBEGsiBCQAIAMEQCADIAAgAiACEOoFIgI2AghB7NoKLQAABEAgBCACNgIAQYj2CCgCAEHf3QMgBBAgGgsgA0EANgIUIANBADoADCAAIAEgAxCFCBogAygCECAEQRBqJAAPC0HY3gBBo7wBQYYKQYPfABAAAAspAQF/A0AgACIBKAIQKAKwASIADQALA0AgASIAKAIQKAJ4IgENAAsgAAtJAQF8IAEoAhQgABC1AyEBRAAAAAAAAPA/IAAoAiy3IAEoACC4RAAAAAAAAPA/oKOhIAEoAjQiACsDQCAAKwMwIgKhoiACoBAyCz0BAXwgASgCGCAAELUDIQEgACgCLLcgASgAILhEAAAAAAAA8D+goyABKAI0IgArADggACsAKCICoaIgAqALdwECfyMAQRBrIgMkAAJAAkAgAkEATgRAIAIgASgACEkNAQsgAEIANwIAIABCADcCCAwBCyABKAIAIQQgAyABKQIINwMIIAMgASkCADcDACAAIAQgAyACEBlBBHRqIgEpAgA3AgAgACABKQIINwIICyADQRBqJAAL4AECCHwBfyABQSBBGEGE/gotAAAiDBtqKwMAIQQgAiABQRhBICAMG2orAwAiBTkDGCACIAQ5AxAgAiABKQM4NwMAIAIgAUFAaykDADcDCCACIAIrAwAgBEQAAAAAAADgP6KhIgY5AwAgAiACKwMIIAVEAAAAAAAA4D+ioSIHOQMIIAMrAwAhCCADKwMIIQkgAysDECEKIAAgAysDGCILIAUgB6AiBSAFIAtjGzkDGCAAIAogBCAGoCIEIAQgCmMbOQMQIAAgCSAHIAcgCWQbOQMIIAAgCCAGIAYgCGQbOQMAC3wBAXwgAEEATgRAIAFEAAAAAAAAAABjBEBBAA8LIAFEAAAAAAAA8D9kRSAAuCICRAAAwP///99BIAGjZEVyRQRAQf////8HDwsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4DwtBz5gDQYf8AEHNAEHO2QAQAAALUQECfEECQQFBAyAAKwMIIAErAwgiA6EgAisDACABKwMAIgShoiACKwMIIAOhIAArAwAgBKGioSIDRAAAAAAAAAAAYxsgA0QAAAAAAAAAAGQbCwsAIABBgdMEEBsaC3EBAX8jAEEQayIFJAAgAEG1xQMQGxogACABEIoBIAIEQCAAQd8AEGUgACACEIoBCyAFIAM2AgAgAEHbMyAFEB4CQCAEQf0oECciAUUNACABLQAARQ0AIABBIBBlIAAgARCKAQsgAEEiEGUgBUEQaiQAC9IBAQZ/IwBBIGsiAiQAIAAoAhAiASgCqAEhAyAAIAErA6ABEHsgAEH0kwQQGxoDQAJAIANFDQAgAygCACIFRQ0AIANBBGohAyAFIgFB8fcAEE1FDQEDQCABIgRBAWohASAELQAADQALA0AgBC0AAQRAIAIgBEEBaiIBNgIQIABBvMgDIAJBEGoQHgNAIAEtAAAgASIEQQFqIQENAAsMAQsLIAVBsy0QTUUEQCAAKAIQQgA3A6ABCyACIAU2AgAgAEGsgwQgAhAeDAELCyACQSBqJAALEABBASAAEEBBAXRBA2oQPwsxAQF/AkAgAUUNACABLQAARQ0AIAAoAjwiAkUNACACKAJwIgJFDQAgACABIAIRBAALC60BAgJ/AnwjAEEgayIDJAACQCAAKAI8IgRFDQAgBCgCYCIERQ0AIAAoAhAoApgBRQ0AIAErABghBSABKwAIIQYgAyABKwAQIAErAACgRAAAAAAAAOA/ojkDACADIAUgBqBEAAAAAAAA4D+iOQMIIAMgASkDGDcDGCADIAEpAxA3AxAgAC0AmQFBIHFFBEAgACADIANBAhCYAhoLIAAgAyACIAQRBQALIANBIGokAAsxAQF/AkAgACgCPCIBRQ0AIAEoAgQiAUUNACAAIAERAQALIAAoAgBBADYCGCAAELEKC68BAQN/An8gARA5IgEoAhAtAHNBAUYEQCAAEJoEDAELIAAgARDSBgsiACIDIQEDQEEAIQICQAJAA0AgAS0AACIERQ0BIAFBAWohASACQQFxBEBBCiECAkACQAJAIARB7ABrDgcCAQIBAQEAAQtBDSECDAELIAQhAgsgAyACOgAADAMLQQEhAiAEQdwARg0ACyADIAQ6AAAMAQsgA0EAOgAAIAAPCyADQQFqIQMMAAsACxgAIAAoAgAgACgCoAEgACgCnAEgARDfCAviawIZfw98IwBB4BVrIgIkACACQbgOaiAAKQCYAjcDACACQbAOaiAAKQCQAjcDACACQagOaiAAKQCIAjcDACACIAApAIACNwOgDgJAAkACQAJAIAEoAhAiBCgCCCIDRQ0AIAMrABggAisDoA5mRQ0AIAIrA7AOIAMrAAhmRQ0AIAMrACAgAisDqA5mRQ0AIAIrA7gOIAMrABBmDQELIAQoAmAiAwR/IAIgAkG4DmopAwA3A9AHIAIgAkGwDmopAwA3A8gHIAIgAkGoDmopAwA3A8AHIAIgAikDoA43A7gHIAMgAkG4B2oQ7wkNASABKAIQBSAECygCbCIDRQ0BIAMtAFFBAUcNASACIAJBuA5qKQMANwOwByACIAJBsA5qKQMANwOoByACIAJBqA5qKQMANwOgByACIAIpA6AONwOYByADIAJBmAdqEO8JRQ0BCwJAIAAoApwBQQJIDQAgACABQYDdCigCAEHx/wQQeiIDEIkEDQAgA0Hx/wQQPkUNASABQShqIQlBACEDA0BBMCEFQQMhCAJAAkAgAw4DAQAEAAtBUCEFQQIhCAsgCSAFQQAgASgCAEEDcSAIRxtqKAIAQajcCigCAEHx/wQQeiIEQfH/BBA+DQEgA0EBaiEDIAAgBBCJBEUNAAsLIAJCADcD4AcgAkIANwPYByACQdgHaiIEIAFBMEEAIAEoAgBBA3FBA0cbaigCKBAhEMUDIARByuABQbagAyABIAFBMGsiAyABKAIAQQNxQQJGGygCKBAtEIICGxDFAyAEIAEgAyABKAIAQQNxQQJGGygCKBAhEMUDIAAgBBDEAxCFBCAEEFwgAUGE3QooAgBB8f8EEHoiAy0AAARAIAAgAxCFBAsCQCABQezcCigCAEHx/wQQeiIDLQAAIhdFDQAgAxDDAxpBsOAKIQ1BsOAKIQMDQCADKAIAIgRFDQEgA0EEaiEDIARBsy0QPkUNAAsMAQsgAUGimAEQJxDsAiEaIAAoApgBIQ8gABCNBCIGQQk2AgwgBiABNgIIIAZBAzYCBAJAIAEoAhAoAmAiA0UNACADLQBSDQAgAUHerAEQJxBoRQ0AIAYgBi8BjAJBgARyOwGMAgsCQCAXRQ0AIAEoAhAoAghFDQAgACANEOUBCwJAQbjdCigCACIDRQ0AIAEgAxBFIgNFDQAgAy0AAEUNACAAIAFBuN0KKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwQhwILAkAgD0GAgIAIcUUNACABIAFBMGoiAyABKAIAQQNxQQNGGygCKBAtKAIQLwGyAUEDTwRAIAYCfyABIAMgASgCAEEDcUEDRhsoAigoAhAoApQBKwMQRAAAAAAAAFJAoiIbRAAAAAAAAOA/RAAAAAAAAOC/IBtEAAAAAAAAAABmG6AiG5lEAAAAAAAA4EFjBEAgG6oMAQtBgICAgHgLtzkDuAEgBgJ/IAFBUEEAIAEoAgBBA3FBAkcbaigCKCgCECgClAErAxBEAAAAAAAAUkCiIhtEAAAAAAAA4D9EAAAAAAAA4L8gG0QAAAAAAAAAAGYboCIbmUQAAAAAAADgQWMEQCAbqgwBC0GAgICAeAu3OQPAAQwBCyAGQgA3A7gBIAZCADcDwAELAkAgD0GAgAJxRQ0AAkAgASgCECIEKAJgIgNFBEAgBigCyAEhBQwBCyAGIAMoAgAiBTYCyAELIAYgBTYC1AEgBiAFNgLMASAGIAU2AtABIAQoAmwiAwRAIAYgAygCADYCzAELIAQoAmgiAwRAIAYgAygCADYC0AELIAQoAmQiA0UNACAGIAMoAgA2AtQBC0EAIQNBACEFAkAgD0GAgARxRQ0AIAJBqA5qQgA3AwAgAkIANwOgDiAGIAAgASACQaAOaiIEEKcGIAEQgQE2AtwBIAQQXAJAAkAgAUGuhQEQJyIIBEAgCC0AAA0BCyABQZ/SARAnIghFDQEgCC0AAEUNAQsgCCABEIEBIQULAkAgBgJ/AkACQCABQaGFARAnIggEQCAILQAADQELIAFBk9IBECciCEUNASAILQAARQ0BCyAIIAEQgQEMAQsgBUUNASAFEGQLNgLYAQsCQCAGAn8CQAJAIAFBl4UBECciCARAIAgtAAANAQsgAUGK0gEQJyIIRQ0BIAgtAABFDQELIAggARCBAQwBCyAFRQ0BIAUQZAs2AuABCwJAAkACQCABQY6FARAnIggEQCAILQAADQELIAFBgtIBECciCEUNASAILQAARQ0BCyAGIAggARCBATYC5AEgBiAGLwGMAkGAAXI7AYwCDAELIAVFDQAgBiAFEGQ2AuQBCwJAAkAgAUGqhQEQJyIIBEAgCC0AAA0BCyABQZvSARAnIghFDQEgCC0AAEUNAQsgBiAIIAEQgQE2AugBIAYgBi8BjAJBgAJyOwGMAgwBCyAFRQ0AIAYgBRBkNgLoAQsCQCAPQYCAgARxRQ0AAkAgAUHiIhAnIgRFDQAgBC0AAEUNACAEIAEQgQEhAwsCQCAGAn8CQCABQdMiECciBEUNACAELQAARQ0AIAYgBi8BjAJBwAByOwGMAiAEIAEQgQEMAQsgA0UNASADEGQLNgL8AQsCQCAGAn8CQCABQcciECciBEUNACAELQAARQ0AIAQgARCBAQwBCyADRQ0BIAMQZAs2AoACCwJAAkAgAUG8IhAnIgRFDQAgBC0AAEUNACAGIAQgARCBATYChAIgBiAGLwGMAkEQcjsBjAIMAQsgA0UNACAGIAMQZDYChAILIAYCfwJAIAFB3iIQJyIERQ0AIAQtAABFDQAgBiAGLwGMAkEgcjsBjAIgBCABEIEBDAELIANFBEBBACEDDAILIAMQZAs2AogCCwJAIA9BgICAAnFFDQACQAJAAkAgAUGh2gAQJyIIBEAgCC0AAA0BCyABQZHaABAnIghFDQEgCC0AAEUNAQsgBiAIIAEQiAQiBCABEIEBNgLsASAEEBggBiAGLwGMAkEBcjsBjAIMAQsgBigCyAEiBEUNACAGIAQQZDYC7AELAkACQCABQYTaABAnIgRFDQAgBC0AAEUNACAGIAQgARCIBCIEIAEQgQE2AvABIAQQGCAGIAYvAYwCQQhyOwGMAgwBCyAGKALIASIERQ0AIAYgBBBkNgLwAQsCQAJAIAFB+NkAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC9AEgBBAYIAYgBi8BjAJBAnI7AYwCDAELIAYoAtABIgRFDQAgBiAEEGQ2AvQBCwJAIAFBndoAECciBEUNACAELQAARQ0AIAYgBCABEIgEIgQgARCBATYC+AEgBBAYIAYgBi8BjAJBBHI7AYwCDAELIAYoAtQBIgRFDQAgBiAEEGQ2AvgBCyAFEBggAxAYAkAgD0GAgIQCcUUNACABKAIQKAIIIhFFDQACQCAGKALYAUUEQCAGKALsAUUNAiAPQYCAIHENAQwCCyAPQYCAIHFFDQELIBEoAgQhEiAAKAIQKwOgASACQYAVakEAQSgQOBogAkIANwP4ByACQgA3A/AHIAJCADcD6AcgAkGYFWohCkQAAAAAAADgP6JEAAAAAAAAAEAQIyElAkADQAJAIBAgEkYEQCAPQYDAAHENA0EAIQVBACEDDAELIBEoAgBBACEEIAJBsBVqQQBBKBA4GiAQQTBsaiIOKAIEQQFrQQNuIQhBACEMA0AgCCAMRgRAQQAhAwNAIAIoArgVIgggA00EQEEAIQMDQCADIAhJBEAgAiACQbgVaikDADcDkAcgAiACKQOwFTcDiAcgAkGIB2ogAxAZIQQCQAJAIAIoAsAVIgUOAgENAAsgAiACKAKwFSAEQQR0aiIEKQMINwOAByACIAQpAwA3A/gGIAJB+AZqIAURAQALIANBAWohAyACKAK4FSEIDAELCyACQbAVaiIDQRAQMSAQQQFqIRAgAxA0DAULQQAhByACKAKwFSELAkAgA0UEQEEAIQUMAQsgAiACQbgVaiIJKQMANwPwBiACIAIpA7AVNwPoBiALIAJB6AZqIANBAWsQGUEEdGohBSAJKAIAIQggAigCsBUhCwsgCCADQQFqIglLBEAgAiACQbgVaikDADcD4AYgAiACKQOwFTcD2AYgCyACQdgGaiAJEBlBBHRqIQcgAigCsBUhCwsgAiACQbgVaikDADcD0AYgAiACKQOwFTcDyAYgBEEEdCIIIAJBgAhqaiEOIAJBoA5qIAhqIQggCyACQcgGaiADEBlBBHRqIgMrAAghJCADKwAAISICQCAFBEAgBSsDCCEdIAUrAwAhISAHBEAgBysDCCEeIAcrAwAhIAwCCyAkIB2hIhsgG6AhHiAiICGhIhsgG6AhIAwBCyAkIAcrAwgiHqEiGyAboCEdICIgBysDACIgoSIbIBugISELIB4gJKEgICAioRCoASEcIAggJCAlIB0gJKEgISAioRCoASIbIBwgG6EiG0QYLURU+yEZwKAgGyAbRAAAAAAAAAAAZBtEAAAAAAAA4D+ioCIbEFeiIhygOQMIIAggIiAlIBsQSqIiG6A5AwAgDiAkIByhOQMIIA4gIiAboTkDACAEQQFqIQQgAigCuBUgCUcEQCAJIQMgBEEyRw0BCyACIARBAXQ2AvwHIAJB6AdqQQQQJiEDIAIoAugHIANBAnRqIAIoAvwHNgIAQQAhAwNAIAMgBEYEQCACQYAIaiAEQQR0aiEHQQAhAwNAIAMgBEcEQCAKIAcgA0F/c0EEdGoiBSkDADcDACAKIAUpAwg3AwggAkGAFWpBEBAmIQUgAigCgBUgBUEEdGoiBSAKKQMANwMAIAUgCikDCDcDCCADQQFqIQMMAQsLIAIgCCkDADcDoA4gAiAIKQMINwOoDiACIA4pAwA3A4AIIAIgDikDCDcDiAhBASEEIAkhAwwCBSAKIAJBoA5qIANBBHRqIgUpAwg3AwggCiAFKQMANwMAIAJBgBVqQRAQJiEFIAIoAoAVIAVBBHRqIgUgCikDADcDACAFIAopAwg3AwggA0EBaiEDDAELAAsACwALIA4oAgAgDEEwbGohB0EAIQMDQCADQQRGBEAgDEEBaiEMIAJBwBRqIAJBsBVqEKAGDAIFIANBBHQiBSACQcAUamoiCSAFIAdqIgUpAwA3AwAgCSAFKQMINwMIIANBAWohAwwBCwALAAsACwsDQCACKALwByADSwRAIAIgAikD8Ac3A4AGIAIgAikD6Ac3A/gFIAIoAugHIAJB+AVqIAMQGUECdGooAgAgBWohBSADQQFqIQMMAQsLIAIgAkGIFWoiCSkDADcDwAYgAiACKQOAFTcDuAYgAigCgBUhBCACQbgGakEAEBkhAyACIAkpAwA3A7AGIAIgAikDgBU3A6gGIAAgBCADQQR0aiACKAKAFSACQagGakEAEBlBBHRqIAUQmAIaCyACIAJBiBVqKQMANwOgBiACIAIpA4AVNwOYBiACKAKAFSEEIAJBmAZqQQAQGSEDIAZBAjYCkAIgBiAEIANBBHRqNgKkAiACQYAVaiAGQZgCakEAQRAQxwEgAiACKQPwBzcDkAYgAiACKQPoBzcDiAYgBiACKALoByACQYgGakEAEBlBAnRqKAIANgKUAiACQegHaiAGQaACaiAGQZwCakEEEMcBCwJAIAAoAjwiA0UNACADKAJAIgNFDQAgACADEQEACwJAIAYoAtgBIgNFBEAgBi0AjAJBAXFFDQELIAAgAyAGKALsASAGKAL8ASAGKALcARDEAQsgACgCECsDoAEhJSACQgA3A/AHIAJCADcD6AcCQCABKAIQKAIIRQ0AQQAhCCABQfjcCigCAEQAAAAAAADwP0QAAAAAAAAAABBMISggAUHM3AooAgBB8f8EEHohB0EAIQQCQCAXRQ0AIA0hAwNAIAMoAgAiBUEARyEEIAVFDQEgA0EEaiEDIAVB0asBED5FDQALCyAHIQNBACELAkACQAJAA0ACQAJAAkACQAJAIAMtAAAiBUE6aw4CAQIACyAFDQIgC0UgCEVyDQcgByACQYAVahDeBCIJQQJJDQMgASABQTBqIgUgASgCAEEDcUEDRhsoAigQLSABIAUgASgCAEEDcUEDRhsoAigQISEFEIICIQMgAiABQVBBACABKAIAQQNxQQJHG2ooAigQITYC6AUgAkHBywNBn80DIAMbNgLkBSACIAU2AuAFQfLvAyACQeAFahCAASAJQQJHDQUMBgsgCEEBaiEIDAELIAtBAWohCwsgA0EBaiEDDAELCyAJQQFGDQELIAJBwA5qIQ4gAkGwDmohCEEAIQdBACEFA0AgASgCECgCCCIDKAIEIAdNBEBBACEDA0AgAigCiBUgA0sEQCACIAJBiBVqKQMANwPYBSACIAIpA4AVNwPQBSACQdAFaiADEBkhBAJAAkAgAigCkBUiAQ4CAQoACyACIAIoAoAVIARBGGxqIgQpAwg3A8AFIAIgBCkDEDcDyAUgAiAEKQMANwO4BSACQbgFaiABEQEACyADQQFqIQMMAQsLIAJBgBVqIgFBGBAxIAEQNAwECyACQaAOaiADKAIAIAdBMGxqQTAQHxpEAAAAAAAA8D8hHEEBIQtBACEDIAUhBAJAAkADQCADIAIoAogVTw0BIAIgAkGIFWopAwA3A7AFIAIgAikDgBU3A6gFIAIoAoAVIAJBqAVqIAMQGUEYbGoiCSgCACIFRQ0BAkAgCSsDCCIbmUTxaOOItfjkPmNFBEAgACAFEEkgHCAboSEcAn8gCwRAIAJBoA5qIBsgAkHAFGogAkGwFWoQ4gggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQAgHJlE8WjjiLX45D5jRQ0BGiACKAKwFSEDDAMLIByZRPFo44i1+OQ+YwRAIAAgAigCsBUiAyACKAK0FUEAEPABDAMLIAJBgAhqIgkgAkGwFWoiBEEwEB8aIAkgGyAbIBygoyACQcAUaiAEEOIIIAIoAoAIEBggACACKALAFCIEIAIoAsQUQQAQ8AEgBBAYQQALIQsgBSEECyADQQFqIQMMAQsLIAMQGAwBCyAEIQULIAIoAqgOBEAgAiACQYgVaiIDKQMANwOgBSACIAIpA4AVNwOYBSAAIAIoAoAVIAJBmAVqQQAQGUEYbGooAgAQSSACIAMpAwA3A5AFIAIgAikDgBU3A4gFIAAgAigCgBUgAkGIBWpBABAZQRhsaigCABBdIAIgCCkDCDcDgAUgAiAIKQMANwP4BCACIAIoAqAOIgMpAwg3A/AEIAIgAykDADcD6AQgAEECIAJB+ARqIAJB6ARqICggJSACKAKoDhDqAgsgAigCrA4iBARAIAAgBRBJIAAgBRBdIAIgDikDCDcD4AQgAiAOKQMANwPYBCACIAIoAqAOIAIoAqQOQQR0akEQayIDKQMINwPQBCACIAMpAwA3A8gEIABBAyACQdgEaiACQcgEaiAoICUgBBDqAgsCQCAXRSABKAIQKAIIKAIEQQJJcg0AIAIoAqgOIAIoAqwOckUNACAAIA0Q5QELIAdBAWohBwwACwALQYX1ACEHCwJAAkACfyABKAIQLQB0IgNBAXEEQEHPkAMhC0GBtgEMAQsgA0ECcQRAQaSSAyELQZjpAQwBCyADQQhxBEBB2o8DIQtB0o8DDAELIANBBHFFDQFBzZIDIQtBkOkBCyEMIAJB6AdqIAsQxQMgByEDA0ACQCADLQAAIgVBOkcEQCAFDQEgAkHoB2oQxAMiCSAHRg0EIAAgCRBJDAQLIAIgCzYCwAQgAkHoB2pBnjMgAkHABGoQfgsgA0EBaiEDDAALAAsgAUHQ3AooAgAgBxCPASEMIAchCQsgByAMRwRAIAAgDBBdCwJAAkAgBARAIAwtAAAhEiAJLQAAIQMgAEG7HxBJIAAgCUGF9QAgAxsiERBdIAJBwBRqIgQgASgCECgCCCgCAEEwEB8aIAJBoA5qIQ8CfwJAQejcCigCACIDRQ0AIAEgAxBFIgMtAABFDQBBmAIgA0HLogEQPg0BGkGZAiADQZH1ABA+DQEaQZoCIANBmfcAED4NARogA0HAlgEQPkUNAEGbAgwBC0GYAkGbAiABQVBBACABKAIAQQNxQQJHG2ooAigQLRCCAhsLIQ5EAAAAAAAAAAAhHSMAQbABayIGJAAgBkIANwMYIAZCADcDECAGQgA3AwggBCgCBCEIIAQoAgAiCisAACEbIAYgCisACDkDKCAGIBs5AyAgBkEwakEAQTAQOBogBkEIakHAABAmIQEgBigCCCABQQZ0aiAGQSBqIg1BwAAQHxogBiAKKQMINwOoASAGIAopAwA3A6ABIAZBOGohB0EAIQMDQCAIIANBA2oiAUsEQCAGIAYpA6ABNwNwIAYgBikDqAE3A3ggCiADQQR0aiEJQQEhAwNAIANBBEYEQEEBIQMgBisDeCEbIAYrA3AhHgNAIANBFUYEQCABIQMMBQUgBkHgAGogBkHwAGogA7hEAAAAAAAANECjQQBBABChASAGKwNgISAgBiAGKwNoIhw5AyggBiAgOQMgIAYgHSAeICChIBsgHKEQR6AiHTkDMCAHQQBBKBA4GiAGQQhqQcAAECYhBCAGKAIIIARBBnRqIA1BwAAQHxogA0EBaiEDICAhHiAcIRsMAQsACwAFIANBBHQiBCAGQfAAamoiBSAEIAlqIgQpAwA3AwAgBSAEKQMINwMIIANBAWohAwwBCwALAAsLIAZBCGogBkHgAGogBkHwAGpBwAAQxwEgBigCYCIHIAYoAnAiDUEGdGpBMGsrAwAhJEQAAAAAAAAAACEeRAAAAAAAAAAAIRxBACEBRAAAAAAAAAAAIRsDQCANIAEiA00EQCAPQgA3AgBBACEHA0ACQCAHIA1PBEAgG0QYLURU+yEJQKAiIBBXIRsgDyAgEEogHKIgHqAgGyAcoiAmoBDhBCAGKAJwIgENAUHLlQNBvroBQacCQfo4EAAACyAGKAJgIAdBBnRqIgMrAyghHCADKwMgIhsQVyEdIAMrAwghJiAbEEohHiADKwM4ISAgAy0AMCAPIB4gHKIgAysDACIeoCAmIB0gHKKgEOEEQQFxBEAgHiAcQQEgGyAgIA8Q8QgLIAdBAWohByAGKAJwIQ0MAQsLIAFBAmshDQNAAkAgBigCYCEBIA1Bf0YNACABIA1BBnRqIgMrAyghIiADKwM4RBgtRFT7IQlAoCIdEFchHiADKwMIISAgHRBKIRsgAysDICEcIAMtADAgDyAbICKiIAMrAwAiG6AgICAeICKioBDhBEEBcQRAIBsgIkEAIBxEGC1EVPshCUCgIB0gDxDxCAsgDUEBayENDAELCyABEBggBkGwAWokAAUgByADQQFqIgFBACABIA1HG0EGdGoiBCsDCCAHIANBBnQiBWoiCSsDCCImoSAEKwMAIAkrAwAiHqEQ8AghGyAHIAMgDSADG0EGdGoiBEE4aysDACAmoSAEQUBqKwMAIB6hEPAIIScgCSsDECIiICQgJSAOER8AIRwCQAJ/AkACfCADBEAgAyAGKAJwQQFrRw0CICdEGC1EVPsh+b+gDAELIBtEGC1EVPsh+T+gCyEdQQAMAQsgG0QYLURU+yH5P6AhHUQAAAAAAAAAACAcIBsgJ6EiG0QYLURU+yEZQKAgGyAbRAAAAAAAAAAAYxtEAAAAAAAA4L+iRBgtRFT7Ifk/oCIgEEoiG6MgG0QAAAAAAAAAAGEbIhsgHEQAAAAAAAAkQKJkBEAgJ0QYLURU+yH5v6AiG0QAAAAAAAAAAGMgG0QYLURU+yEZQGZyBEAgGyAbRBgtRFT7IRlAo5xEGC1EVPshGUCioSEbC0EBIQ0gHUQAAAAAAAAAAGMgHUQYLURU+yEZQGZyRQ0CIB0gHUQYLURU+yEZQKOcRBgtRFT7IRlAoqEhHQwCCyAdICCgIR0gGyEcQQALIQ0gHSEbCyAGKAJgIgcgBWoiAyAdOQM4IAMgDToAMCADIBw5AyggAyAbOQMgIANB7AA6ABggAyAiOQMQIAMgJjkDCCADIB45AwAgBigCcCENDAELCyACKAKgDiIBQQBIDQEgACACKAKkDiABQQEQSCACKAKkDhAYIAAgERBJIBEgDEGF9QAgEhsiAUcEQCAAIAEQXQsgAigCyBQiAwRAIAIgAkHYFGopAwA3A2AgAiACKQPQFDcDWCACIAIoAsAUIgEpAwg3A1AgAiABKQMANwNIIABBAiACQdgAaiACQcgAaiAoICUgAxDqAgsgAigCzBQiA0UNAyACQUBrIAJB6BRqKQMANwMAIAIgAikD4BQ3AzggAiACKALAFCACKALEFEEEdGpBEGsiASkDCDcDMCACIAEpAwA3AyggAEEDIAJBOGogAkEoaiAoICUgAxDqAgwDCyABKAIQIQMgCEUNASAIuEQAAAAAAAAAQKBEAAAAAAAA4L+iIR9BACEMIAMoAggoAgQiFUEwED8hBiAVQTAQPyEPA0AgDCAVRgRAIAkQZCIIIQMgCSIFIRADQCADQfviARCxBSIDBEACQCADQYX1ACADLQAAGyIEIAlGDQAgBCEJIAEoAhAtAHRBA3ENACAAIAQQSSAAIAQQXQtBACEMA0AgDCAVRgRAIBAgBCAWGyEQIAQgBSAWQQJJGyEFIBZBAWohFkEAIQMMAwsgDyAMQTBsIgdqIgMoAgQhEiAGIAdqKAIAIQ0gAygCACEOQQAhAwNAIAMgEkYEQCAAIA4gEkEAEPABIAxBAWohDAwCBSAOIANBBHQiB2oiESAHIA1qIgcrAwAgESsDAKA5AwAgESAHKwMIIBErAwigOQMIIANBAWohAwwBCwALAAsACwsCQCACKALIFCIDRQRAQQAhBQwBCwJAIAVFDQAgASgCEC0AdEEDcQ0AIAAgBRBJIAAgBRBdIAIoAsgUIQMLIAIgAkHYFGopAwA3A6ABIAIgAikD0BQ3A5gBIAIgAigCwBQiBCkDCDcDkAEgAiAEKQMANwOIASAAQQIgAkGYAWogAkGIAWogKCAlIAMQ6gILIAIoAswUIgMEQAJAIAUgEEYNACABKAIQLQB0QQNxDQAgACAQEEkgACAQEF0gAigCzBQhAwsgAiACQegUaikDADcDgAEgAiACKQPgFDcDeCACIAIoAsAUIAIoAsQUQQR0akEQayIBKQMINwNwIAIgASkDADcDaCAAQQMgAkH4AGogAkHoAGogKCAlIAMQ6gILIAgQGEEAIQMDQCADIBVGBEAgBhAYIA8QGAwGBSAGIANBMGwiAWooAgAQGCABIA9qKAIAEBggA0EBaiEDDAELAAsABSACQcAUaiAMQTBsIgMgASgCECgCCCgCAGpBMBAfGiADIAZqIgQgAigCxBQiBTYCBCADIA9qIgMgBTYCBCAEIAVBEBA/IhA2AgAgAyACKALEFEEQED8iCjYCACACKALEFEEBayEHIAIoAsAUIhErAwghHiARKwMAISBBACEDA0AgAyAHSQRAIBEgA0EBakEEdCIIaiIEKwMIISMgBCsDACEpAkAgA0UEQCAQRAAAAAAAAABAICAgKaEiHSAdoiAeICOhIhwgHKKgRC1DHOviNho/oJ+jIhsgHZqiOQMIIBAgHCAbojkDAAwBCyAQIANBBHRqIgREAAAAAAAAAEAgJiApoSIdIB2iICcgI6EiHCAcoqBELUMc6+I2Gj+gn6MiGyAdmqI5AwggBCAcIBuiOQMACyARIANBA2oiBEEEdGoiBSsDCCEcIAUrAwAhGyAQIANBAmpBBHQiDWoiEkQAAAAAAAAAQCApIA0gEWoiBSsDACImoSIhICMgBSsDCCInoSIkEEciHUQtQxzr4jYaP2MEfCAgIBuhIiEgIaIgHiAcoSIkICSioEQtQxzr4jYaP6CfBSAdC6MiHSAhmqIiIjkDCCASIB0gJKIiHTkDACAIIBBqIg4gEikDCDcDCCAOIBIpAwA3AwAgCiADQQR0IgNqIgUgHyADIBBqIgMrAwCiICCgOQMAIAUgHyADKwMIoiAeoDkDCCAIIApqIgMgHyAOKwMAoiApoDkDACADIB8gDisDCKIgI6A5AwggCiANaiIDIB8gIqIgJ6A5AwggAyAfIB2iICagOQMAIBshICAcIR4gBCEDDAELCyAQIANBBHQiBGoiA0QAAAAAAAAAQCAmICChIhwgHKIgJyAeoSIdIB2ioEQtQxzr4jYaP6CfoyIbIByaoiIcOQMIIAMgHSAboiIbOQMAIAQgCmoiAyAfIByiIB6gOQMIIAMgHyAboiAgoDkDACAMQQFqIQwMAQsACwALQZ/LAUGEuQFB/BJB2TEQAAALIAMtAHRBA3FFBEACQCAJLQAABEAgACAJEEkMAQsgAEGF9QAQSSAMQYX1ACAMLQAAGyEMCyAAIAwQXQsgAUEoaiERIAJB4BRqIRAgAkHQFGohFSACQcgVaiEYIAJBqAhqIQYgAkGYCGohEyACQbgOaiESICVEAAAAAAAAIECiRAAAAAAAAChAECMhHQNAIBkgASgCECgCCCIDKAIETw0BIAJBwBRqIAMoAgAgGUEwbGpBMBAfGkEAIQhBACELIBFBUEEAIAEoAgBBA3FBAkcbaigCABAtQb4uECciAwRAIANBvt4AED4hCwsgDSEDAkAgF0UNAANAIAMoAgAiBEEARyEIIARFDQEgA0EEaiEDIARB2a4BED5FDQALC0QAAAAAAAAAACEbAkAgAUGoJhAnIgNFDQAgAy0AAEUNACADEK4CIhtEAAAAAAAAAABkIQgLAkACQAJAAkAgCCALcUEBRw0AIB0gGyAbRAAAAAAAAAAAYRsgGyAIGyIfRAAAAAAAAAAAZEUNAEEAIQQgAkGgDmoiA0EAQeAAEDgaIAMgAigCxBRByAAQ/AEgAigCxBQhDiACKALAFCEKA0AgBCAORwRAIAogBEEEdGohByAEIQUDQAJAIAVFBEBBfyEFDAELIAogBUEBayIFQQR0aiIDKwMAIAcrAwChIAMrAwggBysDCKEQR0R7FK5H4XqEP2RFDQELCyAEIQgCQANAIAhBAWoiCCAOTw0BIAogCEEEdGoiAysDACAHKwMAIiGhIikgAysDCCAHKwMIIiOhIiYQRyInRHsUrkfheoQ/ZEUNAAsgBUF/Rg0AQQAhAyApmSIeRJqZmZmZmbk/YyAmmSIgRJqZmZmZmbk/ZHEgIyAKIAVBBHRqIgUrAwihIiSZIhxEmpmZmZmZuT9jICEgBSsDAKEiIpkiG0SamZmZmZm5P2RxcSIIIBtEmpmZmZmZuT9jICBEmpmZmZmZuT9jcSAcRJqZmZmZmbk/ZHEgHkSamZmZmZm5P2RxckUNAANAIAIoAqgOIANLBEAgAiACQagOaikDADcDqAQgAiACKQOgDjcDoAQgAigCoA4hByACQaAEaiADEBkhBSADQQFqIQMgISAKIAcgBUHIAGxqKAIAQQR0aiIFKwMAoSAjIAUrAwihEEdEexSuR+F6hD9jRQ0BDAILCyASQQBByAAQOCEFIAJBoA5qQcgAECYhAyACKAKgDiADQcgAbGogBUHIABAfGiACIAJBqA5qIgMpAwA3A7gEIAIgAikDoA43A7AEIAIoAqAOIAJBsARqIAMoAgBBAWsQGUHIAGxqIgUgBDYCACAFICYgJ6MiICAfoiAjoDkDICAFICkgJ6MiHCAfoiAhoDkDGCAFICMgJCAiICQQRyIboyIeIB+ioTkDECAFICEgIiAboyIbIB+ioTkDCCAIBEAgIEQAAAAAAAAAAGMiA0UgG0QAAAAAAAAAAGRFckUEQCAFQpjakKK1v8j8PzcDQCAFQgA3AzggBSAjIB+hOQMwIAUgISAfoTkDKAwCCyAgRAAAAAAAAAAAZEUgG0QAAAAAAAAAAGRFckUEQCAFQgA3A0AgBUKY2pCitb/I/L9/NwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAgsgBSAfICGgOQMoIANFIBtEAAAAAAAAAABjRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgIyAfoTkDMAwCCyAFQtLDzPnHr7aJwAA3A0AgBUKY2pCitb/IhMAANwM4IAUgHyAjoDkDMAwBCyAcRAAAAAAAAAAAZCIDRSAeRAAAAAAAAAAAY0VyRQRAIAVC0sPM+cevtonAADcDQCAFQpjakKK1v8iEwAA3AzggBSAfICOgOQMwIAUgHyAhoDkDKAwBCyAcRAAAAAAAAAAAY0UgHkQAAAAAAAAAAGNFckUEQCAFQpjakKK1v8iMwAA3A0AgBULSw8z5x6+2icAANwM4IAUgHyAjoDkDMCAFICEgH6E5AygMAQsgIyAfoSEbIANFIB5EAAAAAAAAAABkRXJFBEAgBUKY2pCitb/IhMAANwNAIAVCmNqQorW/yPw/NwM4IAUgGzkDMCAFIB8gIaA5AygMAQsgBUKY2pCitb/I/D83A0AgBUIANwM4IAUgGzkDMCAFICEgH6E5AygLIARBAWohBAwBCwsgAigCqA5FDQEgAkGgDmpBnAJByAAQogMgAkGIFWoiDyACKALAFCIDKQMINwMAIAIgAykDADcDgBVBACEMQQAhBUEAIRQDQCACKAKoDiIDIBRJBEADQCADIAxNDQUgAiACQagOaikDADcDiAMgAiACKQOgDjcDgAMgAkGACGogAigCoA4gAkGAA2ogDBAZQcgAbGpByAAQHxogAiAGKQMINwP4AiACIAYpAwA3A/ACAkAgAkHwAmogHyAfIAIrA7gIIAIrA8AIEPQIIghFDQAgCCgCBCIDQQVJDQAgA0EGa0EAIANBB2tBfUkbIgVBAk8EQEEAIQMgAkGwFWoiBEEAQSgQOBogBCAFQRAQ/AEDQCADIAVGBEACQCAJBEAgCSIDLQAADQELQYX1ACEDCyAAIAMQSSACIAJBuBVqIgcpAwA3A+gCIAIgAikDsBU3A+ACQQAhAyAAIAIoArAVIAJB4AJqQQAQGUEEdGogBRA9A0AgAigCuBUgA0sEQCACIAcpAwA3A9gCIAIgAikDsBU3A9ACIAJB0AJqIAMQGSEEAkACQCACKALAFSIFDgIBEgALIAIgAigCsBUgBEEEdGoiBCkDCDcDyAIgAiAEKQMANwPAAiACQcACaiAFEQEACyADQQFqIQMMAQsLIAJBsBVqIgNBEBAxIAMQNAUgGCAIKAIAIANBBHRqIgQpAzg3AwggGCAEKQMwNwMAIAJBsBVqQRAQJiEEIAIoArAVIARBBHRqIgQgGCkDADcDACAEIBgpAwg3AwggA0EBaiEDDAELCwsgCCgCABAYIAgQGAsgDEEBaiEMIAIoAqgOIQMMAAsABSACQbgVaiIOAn8gAyAUSwRAIAIgAkGoDmoiAykDADcDmAQgAiACKQOgDjcDkAQgAigCoA4gAkGQBGogFBAZQcgAbGooAgAhFiACIAMpAwA3A4gEIAIgAikDoA43A4AEIAIoAqAOIAJBgARqIBQQGUHIAGxqQQhqDAELIAIoAsAUIAIoAsQUQQFrIhZBBHRqCyIDKQMINwMAIAIgAykDADcDsBUgAkGQCGpCADcDACACQYgIaiILQgA3AwAgAkIANwOACCATIA8pAwA3AwggEyACKQOAFTcDACACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAUhBANAIBYgBEEBaiIESwRAQQAhAyACKALAFCEIA0AgAigCqA4gA0sEQCACIAJBqA5qKQMANwOYAyACIAIpA6AONwOQAyAIIAIoAqAOIAJBkANqIAMQGUHIAGxqKAIAQQR0aiEKIANBAWohAyACKALAFCIHIQggByAEQQR0aiIHKwMAIAorAwChIAcrAwggCisDCKEQR0R7FK5H4XqEP2NFDQEMAwsLIBMgCCAEQQR0aiIDKQMANwMAIBMgAykDCDcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIDAELCyATIAIpA7AVNwMAIBMgDikDADcDCCACQYAIakEQECYhAyACKAKACCADQQR0aiIDIBMpAwA3AwAgAyATKQMINwMIIAIgCykDADcD+AMgAiACKQOACDcD8ANBACEDIAAgAigCgAggAkHwA2pBABAZQQR0aiALKAIAED0CQANAAkAgAigCiAggA00EQCACQYAIaiIDQRAQMSADEDQgFCACKAKoDk8NAyACIAJBqA5qIgopAwA3A+gDIAIgAikDoA43A+ADIAIoAqAOIAJB4ANqIBQQGUHIAGxqKAIAIQUDQEEAIQMgBUEBaiIFIAIoAsQUTw0CA0AgAyACKAKoDk8NAyACIAopAwA3A8gDIAIgAikDoA43A8ADIAIoAsAUIQ4gAigCoA4hCCACQcADaiADEBkhBCADQQFqIQMgAigCwBQgBUEEdGoiBysDACAOIAggBEHIAGxqKAIAQQR0aiIEKwMAoSAHKwMIIAQrAwihEEdEexSuR+F6hD9jRQ0ACwwACwALIAIgCykDADcDuAMgAiACKQOACDcDsAMgAkGwA2ogAxAZIQQCQAJAIAIoApAIIgcOAgEOAAsgAiACKAKACCAEQQR0aiIEKQMINwOoAyACIAQpAwA3A6ADIAJBoANqIAcRAQALIANBAWohAwwBCwsgAiAKKQMANwPYAyACIAIpA6AONwPQAyAPIAIoAqAOIAJB0ANqIBQQGUHIAGxqIgMpAyA3AwAgAiADKQMYNwOAFQsgFEEBaiEUDAELAAsACyAAIAIoAsAUIAIoAsQUQQAQ8AEMAgsgACACKALAFCACKALEFEEAEPABC0EAIQMDQCACKAKoDiADTQRAIAJBoA5qIgNByAAQMSADEDQFIAIgAkGoDmopAwA3A/gBIAIgAikDoA43A/ABIAJB8AFqIAMQGSEHAkACQCACKAKwDiIFDgIBCAALIAJBqAFqIgQgAigCoA4gB0HIAGxqQcgAEB8aIAQgBREBAAsgA0EBaiEDDAELCwsgAigCyBQiBARAIAIgFSkDCDcDuAIgAiAVKQMANwOwAiACIAIoAsAUIgMpAwg3A6gCIAIgAykDADcDoAIgAEECIAJBsAJqIAJBoAJqICggJSAEEOoCCyACKALMFCIEBEAgAiAQKQMINwOYAiACIBApAwA3A5ACIAIgAigCwBQgAigCxBRBBHRqQRBrIgMpAwg3A4gCIAIgAykDADcDgAIgAEEDIAJBkAJqIAJBgAJqICggJSAEEOoCCwJAIBdFIAEoAhAoAggoAgRBAklyDQAgAigCyBQgAigCzBRyRQ0AIAAgDRDlAQsgGUEBaiEZDAALAAsgAkHoB2oQXCAAKAIQIgcoAgghCQJAIAcoAtgBRQRAIActAIwCQQFxRQ0BCyAAEJcCIAcoApwCIgtFDQAgBygCoAIiBCgCACEIQQEhBQNAIAUgC08NASAHIAQgBUECdCIBaigCADYClAIgByAHKAKkAiAIQQR0ajYCmAIgACAHKALYASAHKALsASAHKAL8ASAHKALcARDEASAAEJcCIAVBAWohBSABIAcoAqACIgRqKAIAIAhqIQggBygCnAIhCwwACwALIAdCADcClAIgACAJKAIQIgMoAggiAQR/IAcoAuQBIQMgBy8BjAIhBCACIAEoAgAiAUEQaiABKAIAIAEoAggbIgEpAwg3AyAgAiABKQMANwMYIAAgAkEYaiAEQYABcUEHdiADIARBAnFBAXYQ4QggBygC6AEhAyAHLwGMAiEEIAIgCSgCECgCCCIBKAIAIAEoAgRBMGxqIgEgAUEwaygCACABQSxrKAIAQQR0aiABQSRrKAIAG0EQayIBKQMINwMQIAIgASkDADcDCCAAIAJBCGogBEGAAnFBCHYgAyAEQQRxQQJ2EOEIIAkoAhAFIAMLKAJgQQsgBy8BjAJBA3ZBAXEgBygC4AEgBygC8AEgBygCgAIgBygC3AEgCUHw3AooAgBB+pMBEHoQaAR/IAkoAhAoAggFQQALENoEIAAgCSgCECgCbEELIAcvAYwCQQN2QQFxIAcoAuABIAcoAvABIAcoAoACIAcoAtwBIAlB8NwKKAIAQfqTARB6EGgEfyAJKAIQKAIIBUEACxDaBCAAIAkoAhAoAmRBByAHLwGMAkECdkEBcSAHKALoASAHKAL4ASAHKAKIAiAHKALcAUEAENoEIAAgCSgCECgCaEEGIAcvAYwCQQF2QQFxIAcoAuQBIAcoAvQBIAcoAoQCIAcoAtwBQQAQ2gQCQCAAKAI8IgFFDQAgASgCRCIBRQ0AIAAgAREBAAsgABCMBCAaEOwCIBoQGBAYCyACQeAVaiQADwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC84GAQJ/IwBBgAJrIgMkACADQdABaiIEQYi/CEEwEB8aIAFCADcCAAJAAkACQAJAIAAgBBDeBA0AIAMoAtgBQQJJDQAgAyADKQPYATcDyAEgAyADKQPQATcDwAEgAygC0AEgA0HAAWpBABAZQRhsaigCAA0BC0EAIQBBACEBA0AgASADKALYAU8NAiADIAMpA9gBNwMgIAMgAykD0AE3AxggA0EYaiABEBkhAgJAAkAgAygC4AEiBA4CAQUACyADIAMoAtABIAJBGGxqIgIpAwg3AwggAyACKQMQNwMQIAMgAikDADcDACADIAQRAQALIAFBAWohAQwACwALIAMoAtgBQQNPBEBB95gEQQAQKgsgAyADKQPYATcDuAEgAyADKQPQATcDsAEgASADKALQASADQbABakEAEBlBGGxqKAIAEGQ2AgAgAyADKQPYATcDqAEgAyADKQPQATcDoAEgAygC0AEgA0GgAWpBARAZQRhsaigCAARAIAMgAykD2AE3A5gBIAMgAykD0AE3A5ABIAEgAygC0AEgA0GQAWpBARAZQRhsaigCABBkNgIECyADIAMpA9gBNwOIASADIAMpA9ABNwOAASADKALQASEBIANBgAFqQQAQGSEEIAMoAtABIQAgAgJ8IAEgBEEYbGotABBBAUYEQCADIAMpA9gBNwNYIAMgAykD0AE3A1AgACADQdAAakEAEBlBGGxqKwMIDAELIAMgAykD2AE3A3ggAyADKQPQATcDcEQAAAAAAAAAACAAIANB8ABqQQEQGUEYbGotABBBAUcNABogAyADKQPYATcDaCADIAMpA9ABNwNgRAAAAAAAAPA/IAMoAtABIANB4ABqQQEQGUEYbGorAwihCzkDAEEAIQFBASEAA0AgASADKALYAU8NASADIAMpA9gBNwNIIAMgAykD0AE3A0AgA0FAayABEBkhAgJAAkAgAygC4AEiBA4CAQQACyADIAMoAtABIAJBGGxqIgIpAwg3AzAgAyACKQMQNwM4IAMgAikDADcDKCADQShqIAQRAQALIAFBAWohAQwACwALIANB0AFqIgFBGBAxIAEQNCADQYACaiQAIAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALrwEBAX8gACgCECIBRQRAQaT1AEGEuQFBiAFB0pEBEAAACyABKALcARAYIAEoAtgBEBggASgC4AEQGCABKALkARAYIAEoAugBEBggASgC7AEQGCABKALwARAYIAEoAvQBEBggASgC+AEQGCABKAL8ARAYIAEoAoACEBggASgChAIQGCABKAKIAhAYIAEoApgCEBggASgCpAIQGCABKAKgAhAYIAAgASgCADYCECABEBgLngEBAn9BuAIQxgMiASAAKAIQIgI2AgAgACABNgIQIAIEQCABQRBqIAJBEGpBKBAfGiABQThqIAJBOGpBKBAfGiABIAIoApgBNgKYASABIAIoApwBNgKcASABIAIrA6ABOQOgASABIAIoAogBNgKIASABQeAAaiACQeAAakEoEB8aIAEPCyABQoCAgICAgID4PzcDoAEgAUIDNwOYASABC6AGAQV/IwBBMGsiAyQAA0BBgOAKKAIAIAJNBEACQEH43wpBEBAxQZDgCiAAKAIAIgQpAwA3AwBBmOAKIAQpAwg3AwBB+N8KQRAQJiECQfjfCigCACACQQR0aiICQZDgCikDADcDACACQZjgCikDADcDCEGQ4AogBCkDADcDAEGY4AogBCkDCDcDAEH43wpBEBAmIQJB+N8KKAIAIAJBBHRqIgJBkOAKKQMANwMAIAJBmOAKKQMANwMIQQIgACgCBCIAIABBAk0bQQFrIQZBASECA0AgAiAGRg0BQZDgCiAEIAJBBHRqIgApAwA3AwBBmOAKIAApAwg3AwBB+N8KQRAQJiEFQfjfCigCACAFQQR0aiIFQZDgCikDADcDACAFQZjgCikDADcDCEGQ4AogACkDADcDAEGY4AogACkDCDcDAEH43wpBEBAmIQVB+N8KKAIAIAVBBHRqIgVBkOAKKQMANwMAIAVBmOAKKQMANwMIQZDgCiAAKQMANwMAQZjgCiAAKQMINwMAQfjfCkEQECYhAEH43wooAgAgAEEEdGoiAEGQ4AopAwA3AwAgAEGY4AopAwA3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qgIgA0EAOgAHIAIgBGogA0EHahDSASADQRBqJAAMAQsQygEACyAFQRBqJAALFwAgACADNgIQIAAgAjYCDCAAIAE2AggLDQAgACABIAJBARCiBwsSACAAIAEgAkL/////DxCwBacLzAEBA38jAEEgayIDQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgAS0AACICRQRAQQAPCyABLQABRQRAIAAhAQNAIAEiA0EBaiEBIAMtAAAgAkYNAAsgAyAAaw8LA0AgAyACQQN2QRxxaiIEIAQoAgBBASACdHI2AgAgAS0AASECIAFBAWohASACDQALAkAgACIBLQAAIgJFDQADQCADIAJBA3ZBHHFqKAIAIAJ2QQFxRQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgASAAawuAAQEEfyAAIABBPRC0BSIBRgRAQQAPCwJAIAAgASAAayIEai0AAA0AQYiBCygCACIBRQ0AIAEoAgAiAkUNAANAAkAgACACIAQQ6gFFBEAgASgCACAEaiICLQAAQT1GDQELIAEoAgQhAiABQQRqIQEgAg0BDAILCyACQQFqIQMLIAMLTgEBf0EBQRwQGiIGIAU6ABQgBiAAIAEQrAE2AggCfyADBEAgACACENUCDAELIAAgAhCsAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGCwkAIAC9QjSIpwuZAQEDfCAAIACiIgMgAyADoqIgA0R81c9aOtnlPaJE65wriublWr6goiADIANEff6xV+Mdxz6iRNVhwRmgASq/oKJEpvgQERERgT+goCEFIAAgA6IhBCACRQRAIAQgAyAFokRJVVVVVVXFv6CiIACgDwsgACADIAFEAAAAAAAA4D+iIAQgBaKhoiABoSAERElVVVVVVcU/oqChC5IBAQN8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAuNAQAgACAAIAAgACAAIABECff9DeE9Aj+iRIiyAXXg70k/oKJEO49otSiCpL+gokRVRIgOVcHJP6CiRH1v6wMS1tS/oKJE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EC4BmgFsrHwhEAwBCwsgAkEBaiECDAALAAtBACEAA0AgDCAAQQJ0aigCACICBEAgCCACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoAvgBIgVBAnRqIgogCigCACACKAIQLgGaAWo2AgAgBSABIAEgBUgbIQEgAEEBaiEADAELCyADQQFqIQMMAQsACwALIAZBEGokACARDwsgECARfCERDAALAAuDAQECfyAAIAFBARCNASIBKAIQQQA2AsQBQQUQnwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFEJ8IIQIgASgCECIDIAI2AsgBQdz9CigCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUHc/QogATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqENoBIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABBp4cBECciAAR/IAAQkQIFQR4LEP8OC00AIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQUgABD4DgsLCz8BAn8gACgCECgCqAIhAANAIAAiASgCDCIARSAAIAFGckUEQCAAKAIMIgJFDQEgASACNgIMIAIhAAwBCwsgAQsLACAAIAFBARCFDwsLACAAIAFBABCFDwuGAQECfwJAIAAgASkDCBC/A0UNACAAEDkgAEYEQCAAIAEQbiECA0AgAgRAIAAgAiABEHIgACACEI0GIQIMAQsLIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQEgASkDCBC/BgsgACABQRJBAEEAEMgDDQAgABA5IABGBEAgARAYCwsLgwEBA38jAEEgayIBJAAgACgCECICKAIMIgNBDE8EQCABQeQANgIUIAFBibwBNgIQQYj2CCgCAEHYvwQgAUEQahAgGhA7AAsgASACKAIINgIIIAEgA0ECdCICQZjBCGooAgA2AgQgASACQcjBCGooAgA2AgAgAEGQCCABEB4gAUEgaiQACykBAX9Bor8BIQEgACAALQCQAUEBRgR/IAAoAowBKAIABUGivwELEBsaCyUAIAAgASgCABDnASAAIAJBASAAKAIAEQMAGiABIAAQ3AI2AgALEwAgAEGbywMgACgCEEEQahC+CAtzAQF/IAAQJCAAEEtPBEAgAEEBEN8ECyAAECQhAgJAIAAQKARAIAAgAmogAToAACAAIAAtAA9BAWo6AA8gABAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAAoAgAgAmogAToAACAAIAAoAgRBAWo2AgQLCzkAIAAgASgCABDnASAAIAJBAiAAKAIAEQMARQRAQd8TQeC9AUGiAUGd8AAQAAALIAEgABDcAjYCAAsvAQF/IADAIgFBAEggAUFfcUHBAGtBGkkgAUEwa0EKSXIgAEEta0H/AXFBAklycgvLAQEFfyAAKAIAIgJBAyABQQAQ0gMaIAIoAmAiAQRAIAAgASgCECIDKAIMIgU2AkwgACADKAIQIgQ2AlQgACADKAIAIgM2AlAgACABKAIENgJYIAAgACgCmAEgBCgCAHIiBDYCmAEgAigCVCIBBEAgACABKAIQIgIoAgw2AjwgACACKAIQIgY2AkQgACABKAIENgJIIAAgBigCACAEcjYCmAEgBQRAIAAgAigCADYCQEGsAg8LIAAgAzYCQEGsAg8LIABBADYCPAtB5wcLlwQCBH8DfCMAQfAAayIJJAAgACgCmAEhCyAJQgA3AzggCUIANwMwAkAgAUUNACABLQBRQQFHDQAgBwRAQcLwACEKAkACQAJAAkAgAkEGaw4GAAIBAQEDAQtBqPAAIQoMAgsgCUHXFjYCFCAJQYS5ATYCEEGI9ggoAgBB2L8EIAlBEGoQIBoQOwALQbLwACEKCyAJIAo2AiQgCSAHNgIgIAlBMGoiB0GpMyAJQSBqEH4gBxDEAyEKCyAAKAIQIgcoAgwhDCAHIAI2AgwgC0EEcSIHIAMgBHIiA0VyRQRAIAAgARDdCCAAIAQgBSAGIAoQxAELIANBAEcgACACIAEQkAMCQCAIRQ0AIAEoAgAhAgNAAkACQAJAIAItAAAiCw4OBAICAgICAgICAQEBAQEACyALQSBHDQELIAJBAWohAgwBCwsgASsDOCENIAErAxghDiAJIAFBQGsiAisDACABKwMgRAAAAAAAAOA/oqEiDzkDWCAJIA85A0ggCSANIA5EAAAAAAAA4D+ioCINOQNAIAkgDSAOoTkDUCAJIAIpAwA3AwggCSABKQM4NwMAIAlB4ABqIAggCRD8CSAAIAAoAgAoAsgCEOUBIAAgASgCCBBJIAAgCUFAa0EDED0LBEAgBwRAIAAgARDdCCAAIAQgBSAGIAoQxAELIAAQlwILIAlBMGoQXCAAKAIQIAw2AgwLIAlB8ABqJAALxA0BDn8jAEGAAmsiAyQAIAJBCHEhECACQQRxIQxBASENA0AgASgCECIEKAK0ASANTgRAIAQoArgBIA1BAnRqKAIAIQUCQAJAIAAoApwBQQJIDQAgACAFIAVBAEG3N0EAECJB8f8EEHoiBBCJBA0AIARB8f8EED5FDQEgBRAcIQQDQCAERQ0CIAAgBSAEEOMIDQEgBSAEEB0hBAwACwALIAwEQCAAIAUgAhDbBAtBASEOIAAQjQQiBEEBNgIMIAQgBTYCCCAEQQE2AgQgACAFKAIQKAIMIAUQowYCQCAAKAI8IgRFDQAgBCgCICIERQ0AIAAgBBEBAAsgACgCECIJKALYAUUEQCAJLQCMAkEBcSEOCyAFQaKYARAnEOwCIQ8gDCAORXJFBEAgAyAFKAIQIgQpAyg3A6ABIAMgBCkDIDcDmAEgAyAEKQMYNwOQASADIAQpAxA3A4gBIAAgA0GIAWoQ3QQgACAJKALYASAJKALsASAJKAL8ASAJKALcARDEAQtBACEKIANBADYCvAEgBSADQbwBahDkCCIEBH8gACAEEOUBIAMoArwBIgpBAXEFQQALIQdBASEEAkAgBSgCEC0AcCIGQQFxBEBBgbYBIQZBz5ADIQgMAQsgBkECcQRAQZjpASEGQaSSAyEIDAELIAZBCHEEQEHSjwMhBkHajwMhCAwBCyAGQQRxBEBBkOkBIQZBzZIDIQgMAQsgBUH1NhAnIgYEfyAGQQAgBi0AABsFQQALIgYhCCAFQeA2ECciCwRAIAsgBiALLQAAGyEICyAFQek2ECciCwRAIAsgBiALLQAAGyEGCyAKIAZBAEdxDQAgBUHzNhAnIgpFBEAgByEEDAELQQEgByAKLQAAIgcbIQQgCiAGIAcbIQYLIANCADcDsAEgBkHfDiAGGyEHAn9BACAERQ0AGiAHIANBsAFqIANBqAFqEIsEBEAgACADKAKwARBdIAAgAygCtAEiBEGF9QAgBBsgBUHI2wooAgBBAEEAEGIgAysDqAEQjgNBA0ECIAMtALwBQQJxGwwBCyAAIAcQXUEBCyEEAkBBxNsKKAIAIgZFDQAgBSAGEEUiBkUNACAGLQAARQ0AIAAgBUHE2wooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTBCHAgsgCEGF9QAgCBshBgJAIAMoArwBIghBBHEEQCAFQcDbCigCAEEBQQAQYiIIIARyRQ0BIAMgBSgCECIHKQMQNwPAASADIAcpAxg3A8gBIAMgBykDKDcD6AEgAyAHKQMgNwPgASADIAMrA+ABOQPQASADIAMrA8gBOQPYASADIAMrA8ABOQPwASADIAMrA+gBOQP4ASAAIAZBux8gCBsQSSADIAMoArwBNgKEASAAIANBwAFqQQQgA0GEAWogBBCWAwwBCyAIQcAAcQRAIAMgBSgCECIEKQMQNwPAASADIAQpAxg3A8gBIAMgBCkDKDcD6AEgAyAEKQMgNwPgASADIAMrA+ABOQPQASADIAMrA8gBOQPYASADIAMrA8ABOQPwASADIAMrA+gBOQP4ASAAIAZBux8gBUHA2wooAgBBAUEAEGIbEEkgACADQcABaiAHQQAQpQZBAk8EQCADIAUQITYCgAFB7vIDIANBgAFqEIABCyADIAUoAhAiBCkDKDcDeCADIAQpAyA3A3AgAyAEKQMYNwNoIAMgBCkDEDcDYCAAIANB4ABqQQAQiAIMAQsgBUHA2wooAgBBAUEAEGIEQCAAIAYQSSADIAUoAhAiBykDKDcDWCADIAcpAyA3A1AgAyAHKQMYNwNIIAMgBykDEDcDQCAAIANBQGsgBBCIAgwBCyAERQ0AIABBux8QSSADIAUoAhAiBykDKDcDOCADIAcpAyA3AzAgAyAHKQMYNwMoIAMgBykDEDcDICAAIANBIGogBBCIAgsgAygCsAEQGCADKAK0ARAYIAUoAhAoAgwiBARAIABBBSAEEJADCyAOBEAgDARAIAMgBSgCECIEKQMoNwMYIAMgBCkDIDcDECADIAQpAxg3AwggAyAEKQMQNwMAIAAgAxDdBCAAIAkoAtgBIAkoAuwBIAkoAvwBIAkoAtwBEMQBCyAAEJcCCwJAIBBFDQAgBRAcIQYDQCAGRQ0BIAAgBhDCAyAFIAYQLCEEA0AgBARAIAAgBBCKBCAFIAQQMCEEDAELCyAFIAYQHSEGDAALAAsCQCAAKAI8IgRFDQAgBCgCJCIERQ0AIAAgBBEBAAsgABCMBCAMRQRAIAAgBSACENsECyAPEOwCEBggDxAYCyANQQFqIQ0MAQsLIANBgAJqJAALgwMCBXwDfyMAQZABayIIJAACQAJAIAErAwAiBCAAKwMQIgJkDQAgBCAAKwMAIgVjDQAgASsDCCIDIAArAxgiBGQNACADIAArAwgiBmMNACABKwMQIgMgAmQgAyAFY3INACABKwMYIgMgBGQgAyAGY3INACABKwMgIgMgAmQgAyAFY3INACABKwMoIgMgBGQgAyAGY3INACACIAErAzAiAmMgAiAFY3INACABKwM4IgIgBGQNACACIAZjRQ0BCyABEOgIBEAgACsDGCEFIAArAxAhBANAIAdBBEYNAgJAIAQgASAHQQR0aiIJKwMAIgJjBEAgACACOQMQIAIhBAwBCyACIAArAwBjRQ0AIAAgAjkDAAsCQCAFIAkrAwgiAmMEQCAAIAI5AxggAiEFDAELIAIgACsDCGNFDQAgACACOQMICyAHQQFqIQcMAAsACyAIIAFEAAAAAAAA4D8gCEHQAGoiASAIQRBqIgcQoQEgACABENwEIAAgBxDcBAsgCEGQAWokAAuhAQEDfwJAIAAoApgBIgNBgICEAnFFDQAgACgCECICQQJBBCADQYCACHEiBBs2ApQCIAIgBEEQdkECczYCkAIgAigCmAIQGCACIAIoApQCQRAQPyICNgKYAiACIAEpAwg3AwggAiABKQMANwMAIAIgASkDEDcDECACIAEpAxg3AxggA0GAwABxRQRAIAAgAiACQQIQmAIaCyAEDQAgAhCDBQsL1goCB38DfCMAQfABayICJAAgAkG4AWpBiL8IQTAQHxoCQCAABEACQANAIARBAUYNASAEQfviAWogBEH84gFqIQMgBEEBaiEELQAAIQYDQCADLQAAIgVFDQEgA0EBaiEDIAUgBkcNAAsLQfqyA0G4/ABBNUH48gAQAAALIAJB0AFqIQhEAAAAAAAA8D8hCSAAQfviARDJAiEFIAAhAwJAAkADQAJAAkAgAwRAAkACQAJ/IANBOyAFEPoCIgZFBEBEAAAAAAAAAAAhCiAFDAELIAZBAWoiBCACQewBahDhASIKRAAAAAAAAAAAZkUgAigC7AEgBEZyDQEgBiADawshBAJAIAogCaEiC0QAAAAAAAAAAGRFDQAgC0TxaOOItfjkPmNFBEBBzOIKLQAAQcziCkEBOgAAIAkhCkEBcQ0BIAIgADYCgAFB+8oDIAJBgAFqECpBAyEHCyAJIQoLIARFBEBBACEGDAILIAMgBBCQAiIGDQEgAiAEQQFqNgJwQYj2CCgCAEH16QMgAkHwAGoQIBoQLwALQQAhA0HM4gotAABBzOIKQQE6AABBASEHQQFxRQRAIAIgADYCsAFBpfcEIAJBsAFqEDdBAiEHCwNAIAIoAsABIANNBEAgAkG4AWoiAEEYEDEgABA0DAgFIAIgAikDwAE3A6gBIAIgAikDuAE3A6ABIAJBoAFqIAMQGSEBAkACQCACKALIASIADgIBDAALIAIgAigCuAEgAUEYbGoiASkDCDcDkAEgAiABKQMQNwOYASACIAEpAwA3A4gBIAJBiAFqIAARAQALIANBAWohAwwBCwALAAsgAiAKRAAAAAAAAAAAZDoA4AEgAiAKOQPYASACQQA2AtQBIAIgBjYC0AEgAkEANgDkASACQQA2AOEBIAJBuAFqQRgQJiEEIAIoArgBIARBGGxqIgQgCCkDADcDACAEIAgpAxA3AxAgBCAIKQMINwMIIAkgCqEiCZlE8WjjiLX45D5jRQ0BRAAAAAAAAAAAIQkLIAlEAAAAAAAAAABkRQ0DQQAhBEEAIQMMAQsgAyAFaiEEQQAhA0EAIQUgBCAAEEAgAGpGDQEgBEH74gEQqgQgBGoiA0H74gEQyQIhBQwBCwsDQCADIAIoAsABIgVPRQRAIAIgAikDwAE3AxAgAiACKQO4ATcDCCAEIAIoArgBIAJBCGogAxAZQRhsaisDCEQAAAAAAAAAAGVqIQQgA0EBaiEDDAELCyAEBEAgCSAEuKMhCkEAIQMDQCADIAVPDQIgAiACKQPAATcDaCACIAIpA7gBNwNgIAIoArgBIAJB4ABqIAMQGUEYbGoiACsDCEQAAAAAAAAAAGUEQCAAIAo5AwgLIANBAWohAyACKALAASEFDAALAAsgAiACKQPAATcDWCACIAIpA7gBNwNQIAIoArgBIAJB0ABqIAVBAWsQGUEYbGoiACAJIAArAwigOQMICwNAAkAgAigCwAEiAEUNACACIAIpA8ABNwNIIAIgAikDuAE3A0AgAigCuAEgAkFAayAAQQFrEBlBGGxqKwMIRAAAAAAAAAAAZA0AIAIgAikDwAE3AzggAiACKQO4ATcDMCACQTBqIAIoAsABQQFrEBkhBQJAAkAgAigCyAEiAA4CAQYACyACIAIoArgBIAVBGGxqIgUpAwg3AyAgAiAFKQMQNwMoIAIgBSkDADcDGCACQRhqIAARAQALIAJBuAFqIAhBGBC+AQwBCwsgASACQbgBakEwEB8aCyACQfABaiQAIAcPC0HD0wFBuPwAQS1B+PIAEAAAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwAL6QEBBH8jAEEQayIEJAAgABBLIgMgAWoiASADQQF0QYAIIAMbIgIgASACSxshASAAECQhBQJAAkACQCAALQAPQf8BRgRAIANBf0YNAiAAKAIAIQIgAUUEQCACEBhBACECDAILIAIgARBqIgJFDQMgASADTQ0BIAIgA2pBACABIANrEDgaDAELIAFBARA/IgIgACAFEB8aIAAgBTYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LQY7AA0HS/ABBzQBBvbMBEAAACyAEIAE2AgBBiPYIKAIAQfXpAyAEECAaEC8ACwQAQQELrAEBBH8jAEEQayIEJAACQCAAKAIAIgNB/////wBJBEAgACgCBCADQQR0IgVBEGoiBhBqIgNFDQEgAyAFaiIFQgA3AAAgBUIANwAIIAAgAzYCBCAAIAAoAgAiAEEBajYCACADIABBBHRqIgAgAjkDCCAAIAE5AwAgBEEQaiQADwtBjsADQdL8AEHNAEG9swEQAAALIAQgBjYCAEGI9ggoAgBB9ekDIAQQIBoQLwAL8AIBBH8jAEEwayIDJAAgAyACNgIMIAMgAjYCLCADIAI2AhACQAJAAkACQAJAQQBBACABIAIQYCICQQBIDQAgAkEBaiEGAkAgABBLIAAQJGsiBSACSw0AIAYgBWshBSAAECgEQEEBIQQgBUEBRg0BCyAAIAUQkQNBACEECyADQgA3AxggA0IANwMQIAQgAkEQT3ENASADQRBqIQUgAiAEBH8gBQUgABBzCyAGIAEgAygCLBBgIgFHIAFBAE5xDQIgAUEATA0AIAAQKARAIAFBgAJPDQQgBARAIAAQcyADQRBqIAEQHxoLIAAgAC0ADyABajoADyAAECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAEDQQgACAAKAIEIAFqNgIECyADQTBqJAAPC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAAC2gBA38jAEEQayIBJAACQCAAECgEQCAAIAAQJCIDEJACIgINASABIANBAWo2AgBBiPYIKAIAQfXpAyABECAaEC8ACyAAQQAQkgMgACgCACECCyAAQgA3AgAgAEIANwIIIAFBEGokACACCzMAIAAoAgAQGCAAKAIEEBggACgCCBAYIAAoAhAQGCAAKAIMEBggACgCFBAYIAAoAhgQGAvBAQEBfwJ/IAAoAhAiAigC2AFFBEBBACACLQCMAkEBcUUNARoLIAAQlwIgAigC2AELIgAgASgCAEcEQCAAEBggAiABKAIANgLYAQsgAigC7AEiACABKAIERwRAIAAQGCACIAEoAgQ2AuwBCyACKAL8ASIAIAEoAghHBEAgABAYIAIgASgCCDYC/AELIAIoAtwBIgAgASgCDEcEQCAAEBggAiABKAIMNgLcAQsgAiABLQAQIAIvAYwCQf7/A3FyOwGMAgvdBQEGfyMAQUBqIgUkACAAKAIQIQYgBUIANwM4IAVCADcDMCAEIAYoAtgBNgIAIAQgBigC7AE2AgQgBCAGKAL8ATYCCCAEIAYoAtwBNgIMIAQgBi0AjAJBAXE6ABACQCACKAIQIgQEQCAELQAADQELIAEoAjwiBEUEQCAAIAYoAgggBUEwahCnBhBkIQQgAUEBOgBAIAEgBDYCPAtB0N8KQdDfCigCACIBQQFqNgIAIAUgBDYCICAFIAE2AiQgBUEwaiEBIwBBMGsiBCQAIAQgBUEgaiIHNgIMIAQgBzYCLCAEIAc2AhACQAJAAkACQAJAAkBBAEEAQa6xASAHEGAiCkEASA0AIApBAWohBwJAIAEQSyABECRrIgkgCksNACAHIAlrIQkgARAoBEBBASEIIAlBAUYNAQsgASAJELcCQQAhCAsgBEIANwMYIARCADcDECAIIApBEE9xDQEgBEEQaiEJIAogCAR/IAkFIAEQcwsgB0GusQEgBCgCLBBgIgdHIAdBAE5xDQIgB0EATA0AIAEQKARAIAdBgAJPDQQgCARAIAEQcyAEQRBqIAcQHxoLIAEgAS0ADyAHajoADyABECRBEEkNAUGTtgNBoPwAQeoBQfgeEAAACyAIDQQgASABKAIEIAdqNgIECyAEQTBqJAAMBAtBxqYDQaD8AEHdAUH4HhAAAAtBrZ4DQaD8AEHiAUH4HhAAAAtB+c0BQaD8AEHlAUH4HhAAAAtBo54BQaD8AEHsAUH4HhAAAAsgARDTAiEECyAAQQAgAigCACACKAIMIAIoAgggBCAGKAIIEOwIIQEgBUEwahBcAkAgAUUNACAGKALYAUUEQCAGLQCMAkEBcUUNAQsgBSADKQMYNwMYIAUgAykDEDcDECAFIAMpAwg3AwggBSADKQMANwMAIAAgBRDdBCAAIAYoAtgBIAYoAuwBIAYoAvwBIAYoAtwBEMQBCyAFQUBrJAAgAQuaAQEDfyMAQRBrIgUkACAAKAIEIgBB3ABqKAAAIQQgACgCVCAFIAApAlw3AwggBSAAKQJUNwMAIAUgBEEBaxAZQQJ0aigCACIEIAE2AhQgBEEEECYhBiAEKAIAIAZBAnRqIAQoAhQ2AgAgASADNgJcIAAtAIQBQQJxBEAgASABLQBkQfwBcUEBcjoAZAsgASACNgJYIAVBEGokAAtCAQF/IwBBEGsiAiQAIAAoAiRFBEAgAEEBNgIkIAIgABCsBjYCBCACIAE2AgBBh/8EIAIQNyAAEJQJCyACQRBqJAAL5AEBA39BwAIhBEG8AiEFAkACQAJAIANBAWsOAgIBAAsgAEHaATYCoAJBuAIhBEG0AiEFDAELQcgCIQRBxAIhBQsCQAJAIAAgBGoiBigCACIEBEAgBiAEKAIINgIADAELIABBHEHuMRCYASIEDQBBASEGDAELIAFBgQI7ASAgACABQfUxELIGQQAhBiABQQA2AgwgBCAAIAVqIgUoAgA2AgggBSAENgIAIAQgAzYCGCAEIAE2AgwgACgC0AIhASAEIAI6ABQgBCABNgIQIARCADcCACADDQAgAEEBOgDgBEEADwsgBgtqAQF/IwBBEGsiBCQAIAQgAjYCDAJ/AkAgACgCDEUEQCAAEF9FDQELIABBDGohAgNAIAEgBEEMaiADIAIgACgCCCABKAI4EQgAQQJPBEAgABBfDQEMAgsLIAAoAhAMAQtBAAsgBEEQaiQAC0wBAn8gACgCACEBA0AgAQRAIAEoAgAgACgCFCABQcA+EGchAQwBCwsgACgCBCEBA0AgAQRAIAEoAgAgACgCFCABQcY+EGchAQwBCwsLbgEDfyMAQRBrIgEkAAJAIAAQqwQiAgRAQfyAC0EANgIAIAFBADYCDCACIAFBDGpBChCpBCEAAkBB/IALKAIADQAgAiABKAIMIgNGDQAgAy0AAEUNAgtB/IALQQA2AgALQQAhAAsgAUEQaiQAIAALSwECfyAAIAAoAhQgACgCDEECdGoiAigCACIBKAIQNgIcIAAgASgCCCIBNgIkIAAgATYCUCAAIAIoAgAoAgA2AgQgACABLQAAOgAYC9YFAQZ/AkAgAiABayIGQQJIDQACQAJAAkACQAJAAkACQAJ/IAEtAAAiB0UEQCAAIAEtAAEiBWotAEgMAQsgB8AgASwAASIFECsLQf8BcSIEQRNrDgYCBgYBBgEACwJAIARBBmsOAgQDAAsgBEEdRw0FIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxRQ0FCyAAQcgAaiEJAkACQANAIAIgASIAQQJqIgFrIgZBAkgNCCAALQADIQUCQAJAAkACfyAALQACIgdFBEAgBSAJai0AAAwBCyAHwCAFwBArC0H/AXEiBEESaw4MBQoKCgMKAwMDAwoBAAsgBEEGaw4CAQMJCyAFQQN2QRxxIAdBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0BDAgLCyAGQQJGDQUMBgsgBkEESQ0EDAULIABBBGohAUEJIQgMBAsgAiABQQJqIgRrQQJIDQQgAS0AAyIGwCEFAn8gASwAAiIHRQRAIAVB+ABGBEAgAiABQQRqIgRrQQJIDQcCfyAELAAAIgVFBEAgACABLQAFai0ASAwBCyAFIAEsAAUQKwtB/gFxQRhHBEAgBCEBDAcLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNCCAALQADIQQCfyAALAACIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRhrQQJJDQALIARBEkcNBiAAQQRqIQFBCiEIDAYLIAAgBmotAEgMAQsgByAFECsLQRlHBEAgBCEBDAQLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNBSAALQADIQQCfyAALAACIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRlGDQALIARBEkcNAyAAQQRqIQFBCiEIDAMLIAZBBEkNAQwCCyAGQQJHDQELQX4PCyADIAE2AgAgCA8LQX8LGwAgACgCTCIAKAIIIAEgAiAAKAIAKAIUEQUAC9YFAQZ/AkAgAiABayIGQQJIDQACQAJAAkACQAJAAkACQAJ/IAEtAAEiB0UEQCAAIAEtAAAiBWotAEgMAQsgB8AgASwAACIFECsLQf8BcSIEQRNrDgYCBgYBBgEACwJAIARBBmsOAgQDAAsgBEEdRw0FIAVBA3ZBHHEgB0GggAhqLQAAQQV0ckGw8wdqKAIAIAV2QQFxRQ0FCyAAQcgAaiEJAkACQANAIAIgASIAQQJqIgFrIgZBAkgNCCAALQACIQUCQAJAAkACfyAALQADIgdFBEAgBSAJai0AAAwBCyAHwCAFwBArC0H/AXEiBEESaw4MBQoKCgMKAwMDAwoBAAsgBEEGaw4CAQMJCyAFQQN2QRxxIAdBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0BDAgLCyAGQQJGDQUMBgsgBkEESQ0EDAULIABBBGohAUEJIQgMBAsgAiABQQJqIgRrQQJIDQQgAS0AAiIGwCEFAn8gASwAAyIHRQRAIAVB+ABGBEAgAiABQQRqIgRrQQJIDQcCfyABLAAFIgFFBEAgACAELQAAai0ASAwBCyABIAQsAAAQKwtB/gFxQRhHBEAgBCEBDAcLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNCCAALQACIQQCfyAALAADIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRhrQQJJDQALIARBEkcNBiAAQQRqIQFBCiEIDAYLIAAgBmotAEgMAQsgByAFECsLQRlHBEAgBCEBDAQLIABByABqIQUgBCEBA0AgAiABIgBBAmoiAWtBAkgNBSAALQACIQQCfyAALAADIgZFBEAgBCAFai0AAAwBCyAGIATAECsLQf8BcSIEQRlGDQALIARBEkcNAyAAQQRqIQFBCiEIDAMLIAZBBEkNAQwCCyAGQQJHDQELQX4PCyADIAE2AgAgCA8LQX8LpQUBBX9BASEEAkAgAiABayIFQQBMDQACQAJAAkACQAJAAkACQAJAIABByABqIgYgAS0AAGotAAAiCEEFaw4DAQIDAAsgCEETaw4GAwUFBAUEBQsgBUEBRg0FIAAgASAAKALgAhEAAA0EIAAgASAAKALUAhEAAEUNBEECIQQMAwsgBUEDSQ0EIAAgASAAKALkAhEAAA0DIAAgASAAKALYAhEAAEUNA0EDIQQMAgsgBUEESQ0DIAAgASAAKALoAhEAAA0CIAAgASAAKALcAhEAAEUNAkEEIQQMAQsgAiABQQFqIgBrQQBMDQMgAC0AACIEQfgARgRAIAIgAUECaiIBa0EATA0EIAYgAS0AAGotAABB/gFxQRhHDQIDQCACIAEiAEEBaiIBa0EATA0FIAYgAS0AAGotAAAiBEEYa0ECSQ0ACyAEQRJHDQIgAEECaiEBQQohBwwCCyAEIAZqLQAAQRlHBEAgACEBDAILIAAhAQNAIAIgASIAQQFqIgFrQQBMDQQgBiABLQAAai0AACIEQRlGDQALIARBEkcNASAAQQJqIQFBCiEHDAELIAEgBGohAQNAIAIgAWsiBUEATA0DQQEhBAJAAkACQCAGIAEtAABqLQAAIghBEmsOCgIEBAQBBAEBAQEACwJAAkACQCAIQQVrDgMAAQIGCyAFQQFGDQYgACABIAAoAuACEQAADQUgACABIAAoAsgCEQAARQ0FQQIhBAwCCyAFQQNJDQUgACABIAAoAuQCEQAADQQgACABIAAoAswCEQAARQ0EQQMhBAwBCyAFQQRJDQQgACABIAAoAugCEQAADQMgACABIAAoAtACEQAARQ0DQQQhBAsgASAEaiEBDAELCyABQQFqIQFBCSEHCyADIAE2AgAgBw8LQX4PC0F/C/gDAQV/IAMgBE8EQEF8DwsgASgCSCEHAkACQAJAAkAgBCADQQFqRgRAQX8hBiABLQBFIglBA2tB/wFxQQNJDQMgAy0AACIIQe8BayIKQRBLQQEgCnRBgYAGcUVyDQEgAkUNAyAJRQ0CDAMLAkACQAJAIAMtAAEiCCADLQAAIglBCHRyIgZBgPgARwRAIAZBu98DRg0CIAZB/v8DRg0BIAZB//0DRw0DIAIEQCABLQBFRQ0GCyAFIANBAmo2AgAgByAAKAIQNgIAQQ4PCwJAIAEtAEUiBkEERwRAIAJFIAZBA0dyDQEMBgsgAg0FCyAHIAAoAhQiADYCAAwGCyACBEAgAS0ARUUNBAsgBSADQQJqNgIAIAcgACgCFDYCAEEODwsCQCACRQ0AIAEtAEUiBkEFSw0AQQEgBnRBOXENAwsgBCADQQJqRgRAQX8PCyADLQACQb8BRw0CIAUgA0EDajYCACAHIAAoAgg2AgBBDg8LIAlFBEAgAgRAIAEtAEVBBUYNAwsgByAAKAIQIgA2AgAMBAsgAiAIcg0BIAcgACgCFCIANgIAIAAgAyAEIAUgACgCABEGACEGDAILIAhFIAhBPEZyDQELIAcgACABLABFQQJ0aigCACIANgIADAELIAYPCyAAIAMgBCAFIAAgAkECdGooAgARBgALCABB4AQQpAoLJgAgACABQdzbCigCAEHx/wQQjwEiAEGF9QAgAC0AABsiABBJIAALigQCDXwDfyMAQUBqIhEkACABEC0oAkgoAhAoAnQhEiARIAEoAhAiEykDGDcDGCARIBMpAxA3AxAgEUEwaiARQRBqIBJBA3EiEhDhCSARIAIoAhAiAikDGDcDCCARIAIpAxA3AwAgEUEgaiARIBIQ4QkCQCADLQAhIhJFIBJBD0ZyRQRAAnwgAygCGCICBEAgAisDGCEGIAIrAxAhByACKwMAIQggAisDCAwBCyABEC0hAiABKAIQIhMrA1giBCATKwNQRAAAAAAAAOA/oiIFIAIoAhAtAHRBAXEiAhshBiAFIAQgAhshByAFmiIFIASaIgQgAhshCCAEIAUgAhsLIQkgCCAHoEQAAAAAAADgP6IhCiAJIAagRAAAAAAAAOA/oiEMQQAhEyARKwMoIQ0gESsDICEOIBErAzghDyARKwMwIRBBACECA0AgAkEERkUEQAJAIBIgAnZBAXFFDQAgCiEEIAkhBQJAAnwCQAJAAkAgAkEBaw4DAAECBAsgBwwCCyAGIQUMAgsgCAshBCAMIQULQQAgEyAQIASgIA6hIgQgBKIgDyAFoCANoSIEIASioCIEIAtjGw0AIAJBAnRBkPMHaigCACETIAQhCwsgAkEBaiECDAELCyADLQAhIRIMAQtBACETCyAAIAMoAiQ2AiQgASADKAIYIAAgEyASQQAQlgQaIBFBQGskAAs5AgF/AXwjAEEQayICJAAgACACQQxqEOEBIQMgAigCDCAARgR/QQEFIAEgAzkDAEEACyACQRBqJAALUgEDfyAAEOYJIABBBGohAgN/IAAoAgAQrQIiAUEwayEDIAFBLkYgA0EKSXIEfyACIAHAEJcDDAEFIAFBf0cEQCABIAAoAgAQ0wsLIAIQ6QkLCwvYAQECfyMAQRBrIgQkAEH83gpB/N4KKAIAIgVBAWo2AgAgBCABECE2AgQgBCAFNgIAIAJBmjMgBBCEASABEDkgAhD6BEEBEI0BIgJB/CVBwAJBARA2GiACKAIQQQE6AIYBIAEgAkEBEIUBGiADIABBARCFARpB8NsKIAIQLSACQcLwAEHx/wRB8NsKKAIAENQGNgIAQfzbCiACEC0gAkHHmQFBsy1B/NsKKAIAENQGNgIAQdjbCiACEC0gAkGhlgFBmhJB2NsKKAIAENQGNgIAIARBEGokACACC/0FAgZ/AXwgAEHU2wooAgBEAAAAAAAA6D9EexSuR+F6hD8QTCEHIAAoAhAgBzkDICAAQdDbCigCAEQAAAAAAADgP0R7FK5H4XqUPxBMIQcgACgCECAHOQMoAn8gAEHY2wooAgBB+5IBEI8BIQIjAEEgayIDJAAgAEHImgEQJxD7BARAIAJBnewAIAJBkYMBED4bIQILAkACQAJAAkAgAkGd7AAQPg0AQfD+CSEBA0AgASgCACIERQ0BIAQgAhA+DQIgAUEQaiEBDAALAAsgAhDHBiIBDQBBnN8KQZzfCigCACIEQQFqIgE2AgAgBEH/////A08NAUGY3wooAgAgAUECdCIBEGoiBUUNAiABIARBAnQiBksEQCAFIAZqQQA2AAALQZjfCiAFNgIAQRAQUiEBQZjfCigCACAEQQJ0aiABNgIAIAFB+P4JKQMANwIIIAFB8P4JKQMANwIAIAEgAhClATYCAEEBIQQCQEHg2gooAgANACACQZ3sABA+DQAgASgCACECQQAhBCADQfD+CSgCADYCECADIAI2AhRBr/oDIANBEGoQKgsgASAEOgAMCyADQSBqJAAgAQwCC0GOwANB0vwAQc0AQb2zARAAAAsgAyABNgIAQYj2CCgCAEH16QMgAxAgGhAvAAshASAAKAIQIAE2AgggAEHw2wooAgAQRSEBIABB5NsKKAIARAAAAAAAACxARAAAAAAAAPA/EEwhByAAQejbCigCAEHq6QAQjwEhAiAAQezbCigCAEGF9QAQjwEhAyAAIAEgARB2QQBHIAAQ5QJBAkYgByACIAMQ2wIhASAAKAIQIAE2AngCQEH02wooAgAiAUUNACAAIAEQRSIBRQ0AIAEtAABFDQAgACABIAEQdkEAR0EAIAcgAiADENsCIQEgACgCECABNgJ8IAAQLSgCECIBIAEtAHFBEHI6AHELIABBgNwKKAIAQQBBABBiIQEgACgCECICQf8BIAEgAUH/AU4bOgCgASAAIAIoAggoAgQoAgARAQALRAACQCAAECgEQCAAECRBD0YNAQsgAEEAEH8LAkAgABAoBEAgAEEAOgAPDAELIABBADYCBAsgABAoBH8gAAUgACgCAAsLlAYBBH8jAEGQAWsiASQAAkACQCAARQ0AIAAtAABFDQBB8NoKKAIAIgMEQEG+3gotAAANASABIAM2AnBB/vkEIAFB8ABqECpBvt4KQQE6AAAMAQtBwN4KKAIAIQMCQEHk2gooAgAEQCADDQEDQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHk2gooAgAiAjYCACABQfQAaiACEP4JQdzeCiABKAKMATYCAEHU3gogASkChAE3AgBBzN4KIAEpAnw3AgBBxN4KIAEpAnQ3AgAMAwUgAUHM3gopAgA3A0ggAUHE3gopAgA3A0AgAUFAayACEBkhAwJAAkBB1N4KKAIAIgQOAgEHAAsgAUHE3gooAgAgA0EDdGopAgA3AzggAUE4aiAEEQEACyACQQFqIQIMAQsACwALAkAgA0Ho2gooAgBGDQADQEHM3gooAgAgAk0EQEHE3gpBCBAxQcTeChA0QcDeCkHo2gooAgAiAjYCACACRQ0CIAItAABFDQIgAUH0AGogAhD+CUHc3gogASgCjAE2AgBB1N4KIAEpAoQBNwIAQczeCiABKQJ8NwIAQcTeCiABKQJ0NwIABSABQczeCikCADcDMCABQcTeCikCADcDKCABQShqIAIQGSEDAkACQEHU3gooAgAiBA4CAQcACyABQcTeCigCACADQQN0aikCADcDICABQSBqIAQRAQALIAJBAWohAgwBCwsLAkAgAC0AAEEvRg0AQczeCigCAEUNACABQdzeCigCADYCGCABQdTeCikCADcDECABQczeCikCADcDCCABQcTeCikCADcDACABIAAQ/QkhAgwCCyAAIQIMAQtBACECA0AgAkEDRwRAIAAgAkH54gFqLAAAIAAQQEEBahDkCyIDQQFqIAAgAxshACACQQFqIQIMAQsLIAFB3N4KKAIANgJoIAFB1N4KKQIANwNgIAFBzN4KKQIANwNYIAFBxN4KKQIANwNQIAFB0ABqIAAQ/QkhAgsgAUGQAWokACACDwtBsIMEQcIAQQFBiPYIKAIAEDoaEDsAC7QBAQR/AkAgACABRg0AAkAgACgCECICKALwAUUEQCACQQE2AuwBIAIgADYC8AEMAQsgABCiASEACwJAIAEoAhAiAigC8AFFBEAgAkEBNgLsASACIAE2AvABDAELIAEQogEhAQsgACABRg0AIAAoAhAiAiABKAIQIgMgAigCiAEgAygCiAFKIgQbIgUgASAAIAQbIgA2AvABIAMgAiAEGyIBIAEoAuwBIAUoAuwBajYC7AELIAAL5gMBCX8gACgCBCIHRQRAIAAgATYCBCABDwsCQCABRQ0AIAAoAiAoAgAhCCAALQAJQRBxBEAgAEEAEOcBCyAAIAE2AgQgABCuASEEIABBADYCGCAAQQA2AgwgACAAKAIIIgNB/19xNgIIAkAgA0EBcUUNACAAKAIQIgIgACgCFEECdGohAwNAIAIgA08NASACQQA2AgAgAkEEaiECDAALAAsDQCAERQ0BAn8gASgCCCIDQQBIBEAgBCgCCAwBCyAEIANrCyABKAIAaiECIAQoAgAgBAJ/IAEoAgQiA0EASARAIAIoAgAhAgtBACEFAkACQAJAIANBAEwEQCACIQMDQCADLQAAIgoEQCADQQJBASADLQABIgYbaiEDIAYgCkEIdCAFampBs6aUCGwhBQwBCwsgAhBAQQBIDQIgAyACayEDDAELIAIgA2pBAWshBgNAIAIgBkkEQCACLQABIAItAABBCHQgBWpqQbOmlAhsIQUgAkECaiECDAELCyACIAZLDQAgAi0AAEEIdCAFakGzppQIbCEFCyADQQBIDQEgAyAFakGzppQIbAwCC0HxzAFBqrwBQR5BlPkAEAAAC0G6mANBqrwBQShBlPkAEAAACzYCBCAAIARBICAIEQMAGiEEDAALAAsgBwudBAIEfwV8IwBBEGsiBCQAAkACQCAAKAIQLQBwQQZGDQACQEGs3QooAgAiAwRAIAAgAxBFEIkKRQ0BC0Go3QooAgAiA0UNAiAAIAMQRRCJCg0CCyAAKAIQQeQAQegAIAEbaigCACEDIAAQmQMiBUUNACAFKAIAIQICfAJAIAFFBEAgAigCCARAIAIrAxghByACKwMQIQggAigCACIBKwMIIQYgASsDAAwDCyACKAIAIgErAwghByABKwMAIQggBCABRJqZmZmZmbk/QQBBABChAQwBCyACIAUoAgRBMGxqIgFBMGshAiABQSRrKAIABEAgAUEIaysDACEHIAFBEGsrAwAhCCACKAIAIAFBLGsoAgBBBHRqIgFBCGsrAwAhBiABQRBrKwMADAILIAIoAgAgAUEsaygCAEEEdGoiAUEIaysDACEHIAFBEGsrAwAhCCAEIAFBQGpEzczMzMzM7D9BAEEAEKEBCyAEKwMIIQYgBCsDAAshCSAGIAehIAkgCKEQqAEhBiAAQazdCigCAEQAAAAAAAA5wEQAAAAAAIBmwBBMIQlBASECIABBqN0KKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwhCiADQQE6AFEgAyAKRAAAAAAAACRAoiIKIAYgCUQAAAAAAIBmQKNEGC1EVPshCUCioCIGEFeiIAegOQNAIAMgCiAGEEqiIAigOQM4DAELCyAEQRBqJAAgAguLAQEBfwNAAkAgAkEIRgRAQX8hAgwBCyABIAJBAnRB8NsHaigCAEYNACACQQFqIQIMAQsLQQAhAQNAAkAgAUEIRgRAQX8hAQwBCyAAIAFBAnRB8NsHaigCAEYNACABQQFqIQEMAQsLQQAhACABIAJyQQBOBH8gAUEFdCACQQJ0akGQ3AdqKAIABUEACwvpDwIIfAZ/IwBBMGsiESQAIAEgAUEwayISIAEoAgBBA3EiDUECRhsoAighDiABKAIQIg8tAFdBAUYEQCARQQhqIhAgDiABQTBBACANQQNHG2ooAiggD0E4aiINEPUEIA0gEEEoEB8aCyAOKAIQIg8oAggiDQR/IA0oAgQoAhAFQQALIRAgDysAECEFIAEoAhAiDSsAOCEGIAAgDSsAQCAPKwAYoDkDMCAAIAYgBaA5AygCQCAEBEAgACABIBIgASgCAEEDcUECRhsoAigQigpEGC1EVPshCUCgIgU5AzggBUQYLURU+yEZQGMEQEEBIQQMAgtBvtgBQfm5AUHRBEGu+AAQAAALQQEhBCANLQBVQQFHBEBBACEEDAELIAAgDSsDSDkDOAsgACAEOgBFIAMgACkDMDcDKCADIAApAyg3AyACQAJAAkACQAJAIAJBAWsOAgABAgtBBCENIA4oAhAiBC0ArAENAiABKAIQLQBZIg9FDQIgAysDECEGIAMrAwAhBQJAIA9BBHEEQCADQQQ2AjAgACsDMCEIIAMgBTkDOCADQQE2AjQgAyAGOQNIIAMgAysDGDkDUCADIAMrAwgiBSAIIAUgCGMbOQNAIAAgACsDMEQAAAAAAADwP6A5AzAMAQsgD0EBcQRAIANBATYCMCAEKwMYIAQrA1BEAAAAAAAA4L+ioCEKAnwgACsDKCAEKwMQYwRAIAArAzAhCCAOEC0hDSAFRAAAAAAAAPC/oCIFIQkgDigCECIEKwMQIAQrA1ihDAELIAArAzAhCCAOEC0hDSAOKAIQIgQrAxAgBCsDYKBEAAAAAAAAAACgIQkgBkQAAAAAAADwP6AiBgshByANKAIQKAL8ASECIAQrAxghCyAEKwNQIQwgAyAHOQNoIAMgCDkDYCADIAk5A1ggAyAIOQNQIAMgBjkDSCADIAU5AzggA0ECNgI0IAMgCyAMRAAAAAAAAOA/oqA5A3AgAyAKIAJBAm23oTkDQCAAIAArAzBEAAAAAAAA8L+gOQMwDAELIA9BCHEEQCADQQg2AjAgBCsDGCEGIAQrA1AhCCAAKwMwIQcgAyAAKwMoOQNIIAMgBzkDQCADIAU5AzggA0EBNgI0IAMgBiAIRAAAAAAAAOA/oqA5A1AgACAAKwMoRAAAAAAAAPC/oDkDKAwBCyADQQI2AjAgBCsDGCEFIAQrA1AhCCAAKwMoIQcgACsDMCEJIAMgBjkDSCADIAk5A0AgAyAHOQM4IANBATYCNCADIAUgCEQAAAAAAADgP6KgOQNQIAAgACsDKEQAAAAAAADwP6A5AygLA0AgASIAKAIQIgIoAngiAQRAIAItAHANAQsLIAJB1gBBLiAOIABBUEEAIAAoAgBBA3FBAkcbaigCKEYbakEAOgAAIAMgDzYCMAwDCyABKAIQLQBZIg1FDQAgAysDGCEHIAMrAxAhCCADKwMIIQYgAysDACEFAkAgDUEEcQRAIAArAzAhCSADIAc5A1AgAyAIOQNIIAMgBTkDOCADQQE2AjQgAyAGIAkgBiAJYxs5A0AgACAAKwMwRAAAAAAAAPA/oDkDMAwBCyANQQFxBEACfyADKAIwQQRGBEAgDigCECICKwNQIQYgAisDGCEHIAArAyghCCAOEC0gDigCECICKwMYIQkgAisDUCEKKAIQKAL8ASEPIAIrA1ghCyACKwMQIQwgAyAHIAZEAAAAAAAA4D+ioSIHOQNgIAMgBUQAAAAAAADwv6AiBTkDWCADIAU5AzggAyAMIAuhRAAAAAAAAADAoDkDaEECIQQgByAPQQJtt6EhBiAJIApEAAAAAAAA4D+ioCEFQfAADAELIAcgACsDCCIJIAcgCWQbIQdBASEEQTgLIANqIAU5AwAgAyAHOQNQIAMgCDkDSCADIAY5A0AgAyAENgI0IAAgACsDMEQAAAAAAADwv6A5AzAMAQsgACsDMCIGRAAAAAAAAPC/oCEHIA4oAhAiAisDGCIKIAIrA1BEAAAAAAAA4D+iIguhIQkgCiALoCEKIAMoAjAhAiAAKwMoIQsgDUEIcQRAIAMgBTkDOCADQQE2AjQgAyALRAAAAAAAAPA/oDkDSCADIAogBkQAAAAAAADwP6AgAkEERiICGzkDUCADIAcgCSACGzkDQCAAIAArAyhEAAAAAAAA8L+gOQMoDAELIAMgCDkDSCADQQE2AjQgAyALRAAAAAAAAPC/oDkDOCADIAogBiACQQRGIgIbOQNQIAMgByAJIAIbOQNAIAAgACsDKEQAAAAAAADwP6A5AygLA0AgASIAKAIQIgIoAngiAQRAIAItAHANAQsLIAJB1gBBLiAOIABBUEEAIAAoAgBBA3FBAkcbaigCKEYbakEAOgAAIAMgDTYCMAwCCyADKAIwIQ0LAkAgEEUNACAOIAEoAhBBOGogDSADQThqIANBNGogEBEIACIBRQ0AIAMgATYCMAwBCyADQQE2AjQgAyADKQMANwM4IAMgAykDGDcDUCADIAMpAxA3A0ggA0FAayADKQMINwMAAkACQAJAIAJBAWsOAgIBAAsgAkEIRw0CQfSeA0H5uQFB8gVBrvgAEAAACyAAKwMwIQUgAygCMEEERgRAIAMgBTkDQAwCCyADIAU5A1AMAQsgACsDMCEFIANBBDYCMCADIAU5A0AgACAFRAAAAAAAAPA/oDkDMAsgEUEwaiQAC+cPAgh8Bn8jAEEwayIRJAAgASABQTBqIhIgASgCAEEDcSINQQNGGygCKCEOIAEoAhAiEC0AL0EBRgRAIBFBCGoiDyAOIAFBUEEAIA1BAkcbaigCKCAQQRBqIg0Q9QQgDSAPQSgQHxoLIA4oAhAiDygCCCINBH8gDSgCBCgCEAVBAAshECAPKwAQIQUgASgCECINKwAQIQggACANKwAYIA8rABigOQMIIAAgCCAFoDkDAAJ/IAACfCAEBEAgASASIAEoAgBBA3FBA0YbKAIoEIoKDAELQQAgDS0ALUEBRw0BGiANKwMgCzkDEEEBCyEEIAAgATYCWCAAQQA2AlAgACAEOgAdIAMgACkDADcDICADIAApAwg3AygCQAJAAkACQAJAIAJBAWsOAgABAgtBASEEIA4oAhAiDS0ArAENAiABKAIQLQAxIg9FDQIgAysDECEFIAMrAwAhCAJAIA9BBHEEQCADQQQ2AjAgDSsDGCANKwNQRAAAAAAAAOA/oqAhCgJ8IAArAwAgDSsDEGMEQCAAKwMIIQcgDhAtIQIgCEQAAAAAAADwv6AiCCEJIA4oAhAiBCsDECAEKwNYoQwBCyAAKwMIIQcgDhAtIQIgDigCECIEKwMQIAQrA2CgRAAAAAAAAAAAoCEJIAVEAAAAAAAA8D+gIgULIQYgAigCECgC/AEhAiAEKwMYIQsgBCsDUCEMIAMgBzkDcCADIAY5A2ggAyAJOQNYIAMgBTkDSCADIAc5A0AgAyAIOQM4IAMgCyAMRAAAAAAAAOC/oqA5A2AgAyAKIAJBAm23oDkDUCAAIAArAwhEAAAAAAAA8D+gOQMIIANBAjYCNAwBCyAPQQFxBEAgAysDGCEHIAMrAwghCSADQQE2AjAgACsDCCEGIAMgBTkDSCADIAk5A0AgAyAIOQM4IANBATYCNCADIAcgBiAGIAdjGzkDUCAAIAArAwhEAAAAAAAA8L+gOQMIDAELIA9BCHEEQCADQQg2AjAgDSsDGCEFIA0rA1AhByAAKwMAIQYgAyAAKwMIOQNQIAMgBjkDSCADIAg5AzggA0EBNgI0IAMgBSAHRAAAAAAAAOC/oqA5A0AgACAAKwMARAAAAAAAAPC/oDkDAAwBCyADQQI2AjAgDSsDGCEIIA0rA1AhByAAKwMAIQYgAyAAKwMIOQNQIAMgBTkDSCADIAY5AzggA0EBNgI0IAMgCCAHRAAAAAAAAOC/oqA5A0AgACAAKwMARAAAAAAAAPA/oDkDAAsDQCABIgAoAhAiAigCeCIBBEAgAi0AcA0BCwsgAEEwQQAgACgCAEEDcUEDRxtqKAIoIA5GBEAgAkEAOgAuDAQLIAJBADoAVgwDCyABKAIQLQAxIg1FDQAgAysDGCEGIAMrAxAhCCADKwMIIQUgAysDACEHAkAgDUEEcQRAIAArAwghCSADIAY5A1AgAyAIOQNIIAMgBzkDOCADQQE2AjQgAyAFIAkgBSAJYxs5A0AgACAAKwMIRAAAAAAAAPA/oDkDCAwBCyANQQFxBEACfyADKAIwQQRGBEAgACsDACEFIA4oAhAiAisDGCEHIAIrA1AhBiAOEC0gDigCECICKwMYIQkgAisDUCEKKAIQKAL8ASEQIAIrA2AhCyACKwMQIQwgAyAIRAAAAAAAAPA/oCIIOQNoIAMgByAGRAAAAAAAAOA/oqEiBjkDYCADIAU5AzggAyAMIAugRAAAAAAAAAAAoDkDWEECIQQgBiAQQQJtt6EhBSAJIApEAAAAAAAA4D+ioCEHQfAADAELIAYgACsDCCIJIAYgCWQbIQZBASEEQTgLIANqIAc5AwAgAyAGOQNQIAMgCDkDSCADIAU5A0AgAyAENgI0IAAgACsDCEQAAAAAAADwv6A5AwgMAQsgACsDACEFIA1BCHEEQCAOKAIQIgIrAxghCCACKwNQIQkgACsDCCEGIAMgBUQAAAAAAADwP6A5A0ggAyAHOQM4IANBATYCNCADIAggCUQAAAAAAADgP6IiBaAgBkQAAAAAAADwP6AgAygCMEEERiICGzkDUCADIAZEAAAAAAAA8L+gIAggBaEgAhs5A0AgACAAKwMARAAAAAAAAPC/oDkDAAwBCyAOKAIQIgIrAxghByACKwNQIQkgACsDCCEGIAMgCDkDSCADIAU5AzggA0EBNgI0IAMgByAJRAAAAAAAAOA/oiIFoCAGRAAAAAAAAPA/oCADKAIwQQRGIgIbOQNQIAMgBiAHIAWhIAIbOQNAIAAgACsDAEQAAAAAAADwP6A5AwALA0AgASIAKAIQIgIoAngiAQRAIAItAHANAQsLIAJBLkHWACAOIABBMEEAIAAoAgBBA3FBA0cbaigCKEYbakEAOgAAIAMgDTYCMAwCCyADKAIwIQQLAkAgEEUNACAOIAEoAhBBEGogBCADQThqIANBNGogEBEIACIBRQ0AIAMgATYCMAwBCyADQQE2AjQgAyADKQMANwM4IAMgAykDGDcDUCADIAMpAxA3A0ggA0FAayADKQMINwMAAkACQAJAIAJBAWsOAgIBAAsgAkEIRw0CQfSeA0H5uQFBrARBmvgAEAAACyAAKwMIIQUgAygCMEEERgRAIAMgBTkDQAwCCyADIAU5A1AMAQsgACsDCCEFIANBATYCMCADIAU5A1AgACAFRAAAAAAAAPC/oDkDCAsgEUEwaiQAC4kEAwd/A3wBfiMAQcABayIEJAAgBAJ/IAMEQCAEQSBqIQYgBEEoaiEHIARBgAFqIQggAgwBCyAEQShqIQYgBEEgaiEHIARBgAFqIQkgAkEwagsiAykDCDcDOCAEIAMpAwA3AzAgBEIANwMoIARCgICAgICAgPg/NwMgRAAAAAAAAPA/IQsgBCsDMCEMA0AgBCsDOCENIARBEGogAiALRAAAAAAAAOA/oiILIAkgCBChASAEIAQpAxgiDjcDOCAEIA43AwggBCAEKQMQIg43AzAgBCAONwMAAkAgACAEIAERAAAEQCAHIAs5AwBBACEDA0AgA0EERgRAQQEhBQwDBSADQQR0IgUgBEFAa2oiCiAEQYABaiAFaiIFKQMINwMIIAogBSkDADcDACADQQFqIQMMAQsACwALIAYgCzkDAAsCQCAMIAQrAzAiDKGZRAAAAAAAAOA/ZEUEQCANIAQrAzihmUQAAAAAAADgP2RFDQELIAQrAyAgBCsDKKAhCwwBCwtBACEDAkAgBQRAA0AgA0EERg0CIAIgA0EEdCIAaiIBIARBQGsgAGoiACkDCDcDCCABIAApAwA3AwAgA0EBaiEDDAALAAsDQCADQQRGDQEgAiADQQR0IgBqIgEgBEGAAWogAGoiACkDCDcDCCABIAApAwA3AwAgA0EBaiEDDAALAAsgBEHAAWokAAs1AQF8IAAgACsDECIBOQMwIAAgATkDICAAIAArAxg5AyggACAAKwMIOQM4IAAgACsDADkDEAs0AQF/IwBBEGsiAiQAIAEgACACQQxqEJoHNgIAIAIoAgwhASACQRBqJAAgAUEAIAAgAUcbC9gBAQJ/IwBBIGsiBCQAAkACQAJAIAMEQCABQX8gA24iBU8NASACIAVLDQICQCACIANsIgJFBEAgABAYQQAhAAwBCyAAIAIQaiIARQ0EIAIgASADbCIBTQ0AIAAgAWpBACACIAFrEDgaCyAEQSBqJAAgAA8LQduxA0HS/ABBzABBvbMBEAAAC0GOwANB0vwAQc0AQb2zARAAAAsgBCADNgIEIAQgAjYCAEGI9ggoAgBBpuoDIAQQIBoQLwALIAQgAjYCEEGI9ggoAgBB9ekDIARBEGoQIBoQLwALCwAgACABKAIAEC4LEQAgABAoBH8gAAUgACgCAAsLSQECfyAAKAIEIgZBCHUhBSAGQQFxBEAgAigCACAFEO4GIQULIAAoAgAiACABIAIgBWogA0ECIAZBAnEbIAQgACgCACgCGBEKAAuwAQEDfyMAQRBrIgIkACACIAE6AA8CQAJAAn8gABCjASIERQRAQQohASAAEKUDDAELIAAQ9gJBAWshASAAKAIECyIDIAFGBEAgACABQQEgASABEP4GIAAQRhoMAQsgABBGGiAEDQAgACIBIANBAWoQ0wEMAQsgACgCACEBIAAgA0EBahC/AQsgASADaiIAIAJBD2oQ0gEgAkEAOgAOIABBAWogAkEOahDSASACQRBqJAALDQAgAEGo6wk2AgAgAAsHACAAQQhqCwcAIABBAkkLOwACQCAAECgEQCAAECRBD0YNAQsgAEEAEMoDCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQhwULBABBBAslAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAhCzChogA0EQaiQAC6EBAQJ/AkACQCABEEAiAkUNACAAEEsgABAkayACSQRAIAAgAhC9AQsgABAkIQMgABAoBEAgACADaiABIAIQHxogAkGAAk8NAiAAIAAtAA8gAmo6AA8gABAkQRBJDQFBk7YDQaD8AEGXAkHE6gAQAAALIAAoAgAgA2ogASACEB8aIAAgACgCBCACajYCBAsPC0GSzgFBoPwAQZUCQcTqABAAAAsdACAAQQRqEPkGQX9GBEAgACAAKAIAKAIIEQEACwsRACAAIAEgASgCACgCKBEEAAtpAQF/IwBBEGsiAiQAAkAgACgCAARAIAEoAgBFDQEgAiAAKQIANwMIIAIgASkCADcDACACQQhqIAIQ8gogAkEQaiQARQ8LQcHWAUGJ+wBB2wBB6zsQAAALQbLWAUGJ+wBB3ABB6zsQAAALCABB/////wcLBQBB/wALYQEBfyMAQRBrIgIkACACIAA2AgwCQCAAIAFGDQADQCACIAFBBGsiATYCCCAAIAFPDQEgAigCDCACKAIIEKYFIAIgAigCDEEEaiIANgIMIAIoAgghAQwACwALIAJBEGokAAvxAQEEfyMAQRBrIgQkAAJAAkACQCAABEAgACABEIwCIAAoAgwiBSAAKAIIIgJLBEAgAUUNAiAFQX8gAW5PDQMgACgCACEDAkAgASACbCICRQRAIAMQGEEAIQMMAQsgAyACEGoiA0UNBSACIAEgBWwiAU0NACABIANqQQAgAiABaxA4GgsgACADNgIAIAAgACgCCDYCDAsgBEEQaiQADwtB0dMBQYm4AUH3AkGUxAEQAAALQduxA0HS/ABBzABBvbMBEAAAC0GOwANB0vwAQc0AQb2zARAAAAsgBCACNgIAQYj2CCgCAEH16QMgBBAgGhAvAAvQAQECfyACQYAQcQRAIABBKzoAACAAQQFqIQALIAJBgAhxBEAgAEEjOgAAIABBAWohAAsgAkGEAnEiA0GEAkcEQCAAQa7UADsAACAAQQJqIQALIAJBgIABcSECA0AgAS0AACIEBEAgACAEOgAAIABBAWohACABQQFqIQEMAQsLIAACfwJAIANBgAJHBEAgA0EERw0BQcYAQeYAIAIbDAILQcUAQeUAIAIbDAELQcEAQeEAIAIbIANBhAJGDQAaQccAQecAIAIbCzoAACADQYQCRwuqAQEBfwJAIANBgBBxRQ0AIAJFIANBygBxIgRBCEYgBEHAAEZycg0AIABBKzoAACAAQQFqIQALIANBgARxBEAgAEEjOgAAIABBAWohAAsDQCABLQAAIgQEQCAAIAQ6AAAgAEEBaiEAIAFBAWohAQwBCwsgAAJ/Qe8AIANBygBxIgFBwABGDQAaQdgAQfgAIANBgIABcRsgAUEIRg0AGkHkAEH1ACACGws6AAALDAAgABBGIAFBAnRqC5wEAQt/IwBBgAFrIgwkACAMIAE2AnwgAiADEJcLIQggDEEKNgIQIAxBCGpBACAMQRBqIgkQfSEPAkACQAJAIAhB5QBPBEAgCBBPIglFDQEgDyAJEJABCyAJIQcgAiEBA0AgASADRgRAQQAhCwNAIAAgDEH8AGoiARBaQQEgCBsEQCAAIAEQWgRAIAUgBSgCAEECcjYCAAsDQCACIANGDQYgCS0AAEECRg0HIAlBAWohCSACQQxqIQIMAAsACyAAEIIBIQ0gBkUEQCAEIA0QmwEhDQsgC0EBaiEQQQAhDiAJIQcgAiEBA0AgASADRgRAIBAhCyAORQ0CIAAQlQEaIAkhByACIQEgCCAKakECSQ0CA0AgASADRgRADAQFAkAgBy0AAEECRw0AIAEQJSALRg0AIAdBADoAACAKQQFrIQoLIAdBAWohByABQQxqIQEMAQsACwAFAkAgBy0AAEEBRw0AIAEgCxCaBSgCACERAkAgBgR/IBEFIAQgERCbAQsgDUYEQEEBIQ4gARAlIBBHDQIgB0ECOgAAIApBAWohCgwBCyAHQQA6AAALIAhBAWshCAsgB0EBaiEHIAFBDGohAQwBCwALAAsABSAHQQJBASABEPYBIgsbOgAAIAdBAWohByABQQxqIQEgCiALaiEKIAggC2shCAwBCwALAAsQkQEACyAFIAUoAgBBBHI2AgALIA8QfCAMQYABaiQAIAILEQAgACABIAAoAgAoAgwRAAALmwQBC38jAEGAAWsiDCQAIAwgATYCfCACIAMQlwshCCAMQQo2AhAgDEEIakEAIAxBEGoiCRB9IQ8CQAJAAkAgCEHlAE8EQCAIEE8iCUUNASAPIAkQkAELIAkhByACIQEDQCABIANGBEBBACELA0AgACAMQfwAaiIBEFtBASAIGwRAIAAgARBbBEAgBSAFKAIAQQJyNgIACwNAIAIgA0YNBiAJLQAAQQJGDQcgCUEBaiEJIAJBDGohAgwACwALIAAQgwEhDSAGRQRAIAQgDRCcBSENCyALQQFqIRBBACEOIAkhByACIQEDQCABIANGBEAgECELIA5FDQIgABCWARogCSEHIAIhASAIIApqQQJJDQIDQCABIANGBEAMBAUCQCAHLQAAQQJHDQAgARAlIAtGDQAgB0EAOgAAIApBAWshCgsgB0EBaiEHIAFBDGohAQwBCwALAAUCQCAHLQAAQQFHDQAgASALEEMsAAAhEQJAIAYEfyARBSAEIBEQnAULIA1GBEBBASEOIAEQJSAQRw0CIAdBAjoAACAKQQFqIQoMAQsgB0EAOgAACyAIQQFrIQgLIAdBAWohByABQQxqIQEMAQsACwALAAUgB0ECQQEgARD2ASILGzoAACAHQQFqIQcgAUEMaiEBIAogC2ohCiAIIAtrIQgMAQsACwALEJEBAAsgBSAFKAIAQQRyNgIACyAPEHwgDEGAAWokACACCykAIAJFIAAgAUVyckUEQEGFnANBibgBQS1BkpUBEAAACyAAIAEgAmxqCw0AIAAoAgAgASgCAEkLBwAgAEELSQsJACAAQQEQqAsLFgAgACABKAIANgIAIAAgAigCADYCBAsJACAAIAEQpAMLMQEBfyMAQRBrIgMkACADIAE2AgwgAyACNgIIIAAgA0EMaiADQQhqEKIFIANBEGokAAtvAQR/IAAQLSEFAkAgACgCACICIAEoAgBzQQNxDQADQCAFIAJBA3EgAxDlAyIDRQ0BIAEgAygCCBCuByICRQ0BAkAgACADEEUiBBB2BEAgASACIAQQqAQMAQsgASACIAQQcQsgACgCACECDAALAAsLHAEBfyAAKAIAIQIgACABKAIANgIAIAEgAjYCAAsIACAAKAIARQuNAQEBfwJAIAAoAgQiASABKAIAQQxrKAIAaigCGEUNACAAKAIEIgEgASgCAEEMaygCAGoQwQtFDQAgACgCBCIBIAEoAgBBDGsoAgBqKAIEQYDAAHFFDQAgACgCBCIBIAEoAgBBDGsoAgBqKAIYEMALQX9HDQAgACgCBCIAIAAoAgBBDGsoAgBqQQEQqgULC7MBAQF/IAAgATYCBCAAQQA6AAAgASABKAIAQQxrKAIAahDBCwRAIAEgASgCAEEMaygCAGooAkgiAQRAIwBBEGsiAiQAIAEgASgCAEEMaygCAGooAhgEQCACQQhqIAEQqQUaAkAgAi0ACEUNACABIAEoAgBBDGsoAgBqKAIYEMALQX9HDQAgASABKAIAQQxrKAIAakEBEKoFCyACQQhqEKgFCyACQRBqJAALIABBAToAAAsgAAsJACAAIAEQsw0L2gMCBX8CfiMAQSBrIgQkACABQv///////z+DIQcCQCABQjCIQv//AYMiCKciA0GB/wBrQf0BTQRAIAdCGYinIQICQCAAUCABQv///w+DIgdCgICACFQgB0KAgIAIURtFBEAgAkEBaiECDAELIAAgB0KAgIAIhYRCAFINACACQQFxIAJqIQILQQAgAiACQf///wNLIgUbIQJBgYF/QYCBfyAFGyADaiEDDAELIAAgB4RQIAhC//8BUnJFBEAgB0IZiKdBgICAAnIhAkH/ASEDDAELIANB/oABSwRAQf8BIQMMAQtBgP8AQYH/ACAIUCIFGyIGIANrIgJB8ABKBEBBACECQQAhAwwBCyAEQRBqIAAgByAHQoCAgICAgMAAhCAFGyIHQYABIAJrELEBIAQgACAHIAIQpwMgBCkDCCIAQhmIpyECAkAgBCkDACADIAZHIAQpAxAgBCkDGIRCAFJxrYQiB1AgAEL///8PgyIAQoCAgAhUIABCgICACFEbRQRAIAJBAWohAgwBCyAHIABCgICACIWEQgBSDQAgAkEBcSACaiECCyACQYCAgARzIAIgAkH///8DSyIDGyECCyAEQSBqJAAgAUIgiKdBgICAgHhxIANBF3RyIAJyvgu/AQIFfwJ+IwBBEGsiAyQAIAG8IgRB////A3EhAgJ/IARBF3YiBUH/AXEiBgRAIAZB/wFHBEAgAq1CGYYhByAFQf8BcUGA/wBqDAILIAKtQhmGIQdB//8BDAELIAJFBEBBAAwBCyADIAKtQgAgAmciAkHRAGoQsQEgAykDCEKAgICAgIDAAIUhByADKQMAIQhBif8AIAJrCyECIAAgCDcDACAAIAKtQjCGIARBH3atQj+GhCAHhDcDCCADQRBqJAALqwsBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQJxRQ0BIAAoAgAiAiABaiEBAkACQAJAIAAgAmsiAEHklQsoAgBHBEAgACgCDCEDIAJB/wFNBEAgAyAAKAIIIgRHDQJB0JULQdCVCygCAEF+IAJBA3Z3cTYCAAwFCyAAKAIYIQYgACADRwRAIAAoAggiAiADNgIMIAMgAjYCCAwECyAAKAIUIgQEfyAAQRRqBSAAKAIQIgRFDQMgAEEQagshAgNAIAIhByAEIgNBFGohAiADKAIUIgQNACADQRBqIQIgAygCECIEDQALIAdBADYCAAwDCyAFKAIEIgJBA3FBA0cNA0HYlQsgATYCACAFIAJBfnE2AgQgACABQQFyNgIEIAUgATYCAA8LIAQgAzYCDCADIAQ2AggMAgtBACEDCyAGRQ0AAkAgACgCHCICQQJ0QYCYC2oiBCgCACAARgRAIAQgAzYCACADDQFB1JULQdSVCygCAEF+IAJ3cTYCAAwCCwJAIAAgBigCEEYEQCAGIAM2AhAMAQsgBiADNgIUCyADRQ0BCyADIAY2AhggACgCECICBEAgAyACNgIQIAIgAzYCGAsgACgCFCICRQ0AIAMgAjYCFCACIAM2AhgLAkACQAJAAkAgBSgCBCICQQJxRQRAQeiVCygCACAFRgRAQeiVCyAANgIAQdyVC0HclQsoAgAgAWoiATYCACAAIAFBAXI2AgQgAEHklQsoAgBHDQZB2JULQQA2AgBB5JULQQA2AgAPC0HklQsoAgAgBUYEQEHklQsgADYCAEHYlQtB2JULKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LIAJBeHEgAWohASAFKAIMIQMgAkH/AU0EQCAFKAIIIgQgA0YEQEHQlQtB0JULKAIAQX4gAkEDdndxNgIADAULIAQgAzYCDCADIAQ2AggMBAsgBSgCGCEGIAMgBUcEQCAFKAIIIgIgAzYCDCADIAI2AggMAwsgBSgCFCIEBH8gBUEUagUgBSgCECIERQ0CIAVBEGoLIQIDQCACIQcgBCIDQRRqIQIgAygCFCIEDQAgA0EQaiECIAMoAhAiBA0ACyAHQQA2AgAMAgsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgAMAwtBACEDCyAGRQ0AAkAgBSgCHCICQQJ0QYCYC2oiBCgCACAFRgRAIAQgAzYCACADDQFB1JULQdSVCygCAEF+IAJ3cTYCAAwCCwJAIAUgBigCEEYEQCAGIAM2AhAMAQsgBiADNgIUCyADRQ0BCyADIAY2AhggBSgCECICBEAgAyACNgIQIAIgAzYCGAsgBSgCFCICRQ0AIAMgAjYCFCACIAM2AhgLIAAgAUEBcjYCBCAAIAFqIAE2AgAgAEHklQsoAgBHDQBB2JULIAE2AgAPCyABQf8BTQRAIAFBeHFB+JULaiECAn9B0JULKAIAIgNBASABQQN2dCIBcUUEQEHQlQsgASADcjYCACACDAELIAIoAggLIQEgAiAANgIIIAEgADYCDCAAIAI2AgwgACABNgIIDwtBHyEDIAFB////B00EQCABQSYgAUEIdmciAmt2QQFxIAJBAXRrQT5qIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEGAmAtqIQICQAJAQdSVCygCACIEQQEgA3QiB3FFBEBB1JULIAQgB3I2AgAgAiAANgIAIAAgAjYCGAwBCyABQRkgA0EBdmtBACADQR9HG3QhAyACKAIAIQIDQCACIgQoAgRBeHEgAUYNAiADQR12IQIgA0EBdCEDIAQgAkEEcWoiBygCECICDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC74CAQR/IANBzJULIAMbIgUoAgAhAwJAAn8CQCABRQRAIAMNAUEADwtBfiACRQ0BGgJAIAMEQCACIQQMAQsgAS0AACIDwCIEQQBOBEAgAARAIAAgAzYCAAsgBEEARw8LQcSDCygCACgCAEUEQEEBIABFDQMaIAAgBEH/vwNxNgIAQQEPCyADQcIBayIDQTJLDQEgA0ECdEGgjwlqKAIAIQMgAkEBayIERQ0DIAFBAWohAQsgAS0AACIGQQN2IgdBEGsgA0EadSAHanJBB0sNAANAIARBAWshBCAGQf8BcUGAAWsgA0EGdHIiA0EATgRAIAVBADYCACAABEAgACADNgIACyACIARrDwsgBEUNAyABQQFqIgEsAAAiBkFASA0ACwsgBUEANgIAQfyAC0EZNgIAQX8LDwsgBSADNgIAQX4LIQAgABAtEDkgACgCAEEDcRCrAyIARQRAQQAPCyAAEJoBC50EAgd/BH4jAEEQayIIJAACQAJAAkAgAkEkTARAIAAtAAAiBQ0BIAAhBAwCC0H8gAtBHDYCAEIAIQMMAgsgACEEAkADQCAFwBDKAkUNASAELQABIQUgBEEBaiEEIAUNAAsMAQsCQCAFQf8BcSIGQStrDgMAAQABC0F/QQAgBkEtRhshByAEQQFqIQQLAn8CQCACQRByQRBHDQAgBC0AAEEwRw0AQQEhCSAELQABQd8BcUHYAEYEQCAEQQJqIQRBEAwCCyAEQQFqIQQgAkEIIAIbDAELIAJBCiACGwsiCq0hDEEAIQIDQAJAAkAgBC0AACIGQTBrIgVB/wFxQQpJDQAgBkHhAGtB/wFxQRlNBEAgBkHXAGshBQwBCyAGQcEAa0H/AXFBGUsNASAGQTdrIQULIAogBUH/AXFMDQAgCCAMQgAgC0IAEJwBQQEhBgJAIAgpAwhCAFINACALIAx+Ig0gBa1C/wGDIg5Cf4VWDQAgDSAOfCELQQEhCSACIQYLIARBAWohBCAGIQIMAQsLIAEEQCABIAQgACAJGzYCAAsCQAJAIAIEQEH8gAtBxAA2AgAgB0EAIANCAYMiDFAbIQcgAyELDAELIAMgC1YNASADQgGDIQwLIAynIAdyRQRAQfyAC0HEADYCACADQgF9IQMMAgsgAyALWg0AQfyAC0HEADYCAAwBCyALIAesIgOFIAN9IQMLIAhBEGokACADC2sBAX8CQCAARQRAQciVCygCACIARQ0BCyAAIAEQqgQgAGoiAi0AAEUEQEHIlQtBADYCAEEADwsgAiABEMkCIAJqIgAtAAAEQEHIlQsgAEEBajYCACAAQQA6AAAgAg8LQciVC0EANgIACyACC9IKAQ1/IAEsAAAiAkUEQCAADwsCQCAAIAIQzQEiAEUNACABLQABRQRAIAAPCyAALQABRQ0AIAEtAAJFBEAgAC0AASICQQBHIQQCQCACRQ0AIAAtAABBCHQgAnIiAiABLQABIAEtAABBCHRyIgVGDQAgAEEBaiEBA0AgASIALQABIgNBAEchBCADRQ0BIABBAWohASACQQh0QYD+A3EgA3IiAiAFRw0ACwsgAEEAIAQbDwsgAC0AAkUNACABLQADRQRAIABBAmohAiAALQACIgRBAEchAwJAAkAgBEUNACAALQABQRB0IAAtAABBGHRyIARBCHRyIgQgAS0AAUEQdCABLQAAQRh0ciABLQACQQh0ciIFRg0AA0AgAkEBaiEAIAItAAEiAUEARyEDIAFFDQIgACECIAEgBHJBCHQiBCAFRw0ACwwBCyACIQALIABBAmtBACADGw8LIAAtAANFDQAgAS0ABEUEQCAAQQNqIQIgAC0AAyIEQQBHIQMCQAJAIARFDQAgAC0AAUEQdCAALQAAQRh0ciAALQACQQh0ciAEciIEIAEoAAAiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnIiBUYNAANAIAJBAWohACACLQABIgFBAEchAyABRQ0CIAAhAiAEQQh0IAFyIgQgBUcNAAsMAQsgAiEACyAAQQNrQQAgAxsPCyAAIQRBACECIwBBoAhrIggkACAIQZgIakIANwMAIAhBkAhqQgA3AwAgCEIANwOICCAIQgA3A4AIAkACQAJAAkAgASIFLQAAIgFFBEBBfyEJQQEhAAwBCwNAIAQgBmotAABFDQQgCCABQf8BcUECdGogBkEBaiIGNgIAIAhBgAhqIAFBA3ZBHHFqIgAgACgCAEEBIAF0cjYCACAFIAZqLQAAIgENAAtBASEAQX8hCSAGQQFLDQELQX8hA0EBIQcMAQtBASEKQQEhAQNAAn8gBSAJaiABai0AACIDIAAgBWotAAAiB0YEQCABIApGBEAgAiAKaiECQQEMAgsgAUEBagwBCyADIAdLBEAgACAJayEKIAAhAkEBDAELIAIiCUEBaiECQQEhCkEBCyIBIAJqIgAgBkkNAAtBfyEDQQAhAEEBIQJBASEHQQEhAQNAAn8gAyAFaiABai0AACILIAIgBWotAAAiDEYEQCABIAdGBEAgACAHaiEAQQEMAgsgAUEBagwBCyALIAxJBEAgAiADayEHIAIhAEEBDAELIAAiA0EBaiEAQQEhB0EBCyIBIABqIgIgBkkNAAsgCiEACwJ/IAUgBSAHIAAgA0EBaiAJQQFqSyIAGyIKaiADIAkgABsiC0EBaiIHEM4BBEAgCyAGIAtBf3NqIgAgACALSRtBAWohCkEADAELIAYgCmsLIQ0gBkEBayEOIAZBP3IhDEEAIQMgBCEAA0ACQCAEIABrIAZPDQBBACECIARBACAMEPoCIgEgBCAMaiABGyEEIAFFDQAgASAAayAGSQ0CCwJ/An8gBiAIQYAIaiAAIA5qLQAAIgFBA3ZBHHFqKAIAIAF2QQFxRQ0AGiAIIAFBAnRqKAIAIgEgBkcEQCAGIAFrIgEgAyABIANLGwwBCwJAIAUgByIBIAMgASADSxsiAmotAAAiCQRAA0AgACACai0AACAJQf8BcUcNAiAFIAJBAWoiAmotAAAiCQ0ACwsDQCABIANNBEAgACECDAYLIAUgAUEBayIBai0AACAAIAFqLQAARg0ACyAKIQEgDQwCCyACIAtrCyEBQQALIQMgACABaiEADAALAAsgCEGgCGokACACIQQLIAQLHQAgAEEAIABBmQFNG0EBdEGQhQlqLwEAQZT2CGoL6gEBA38CQAJAAkAgAUH/AXEiAiIDBEAgAEEDcQRAA0AgAC0AACIERSACIARGcg0FIABBAWoiAEEDcQ0ACwtBgIKECCAAKAIAIgJrIAJyQYCBgoR4cUGAgYKEeEcNASADQYGChAhsIQQDQEGAgoQIIAIgBHMiA2sgA3JBgIGChHhxQYCBgoR4Rw0CIAAoAgQhAiAAQQRqIgMhACACQYCChAggAmtyQYCBgoR4cUGAgYKEeEYNAAsMAgsgABBAIABqDwsgACEDCwNAIAMiAC0AACICRQ0BIABBAWohAyACIAFB/wFxRw0ACwsgAAt+AQJ/IwBBEGsiBCQAAkAgAA0AQZTeCigCACIADQAgBEH48AkoAgA2AgxBlN4KQQAgBEEMakEAEOMBIgA2AgALAn8CQCADRQ0AIAAgAxDLAyIFIANHDQAgBRB2RQ0AIAAgASACIAMQ5wMMAQsgACABIAIgAxAiCyAEQRBqJAALDwBB6IMLIABBAWutNwMAC0gBAn8CfyABQR9NBEAgACgCACECIABBBGoMAQsgAUEgayEBIAALKAIAIQMgACACIAF0NgIAIAAgAyABdCACQSAgAWt2cjYCBAvIAgEGfyMAQfABayIIJAAgCCADKAIAIgc2AugBIAMoAgQhAyAIIAA2AgAgCCADNgLsAUEAIAFrIQwgBUUhCQJAAkACQAJAIAdBAUcEQCAAIQdBASEFDAELIAAhB0EBIQUgAw0ADAELA0AgByAGIARBAnRqIgooAgBrIgMgACACEKoDQQBMDQEgCUF/cyELQQEhCQJAIAsgBEECSHJBAXFFBEAgCkEIaygCACEKIAcgDGoiCyADIAIQqgNBAE4NASALIAprIAMgAhCqA0EATg0BCyAIIAVBAnRqIAM2AgAgCEHoAWoiByAHEOELIgcQuQUgBUEBaiEFIAQgB2ohBCADIQcgCCgC6AFBAUcNASAIKALsAQ0BDAMLCyAHIQMMAQsgByEDIAlFDQELIAEgCCAFEOALIAMgASACIAQgBhChBwsgCEHwAWokAAtLAQJ/IAAoAgQhAiAAAn8gAUEfTQRAIAAoAgAhAyACDAELIAFBIGshASACIQNBAAsiAiABdjYCBCAAIAJBICABa3QgAyABdnI2AgALmwEBAX8CQCACQQNPBEBB/IALQRw2AgAMAQsCQCACQQFHDQAgACgCCCIDRQ0AIAEgAyAAKAIEa6x9IQELIAAoAhQgACgCHEcEQCAAQQBBACAAKAIkEQMAGiAAKAIURQ0BCyAAQQA2AhwgAEIANwMQIAAgASACIAAoAigRHQBCAFMNACAAQgA3AgQgACAAKAIAQW9xNgIAQQAPC0F/C68BAQN/IAMoAkwaIAEgAmwhBSADIAMoAkgiBEEBayAEcjYCSCADKAIEIgYgAygCCCIERgR/IAUFIAAgBiAEIAZrIgQgBSAEIAVJGyIEEB8aIAMgAygCBCAEajYCBCAAIARqIQAgBSAEawsiBARAA0ACQCADEL4FRQRAIAMgACAEIAMoAiARAwAiBg0BCyAFIARrIAFuDwsgACAGaiEAIAQgBmsiBA0ACwsgAkEAIAEbCy8AIAAgACABlyABvEH/////B3FBgICA/AdLGyABIAC8Qf////8HcUGAgID8B00bC0EBAn8jAEEQayIBJABBfyECAkAgABC+BQ0AIAAgAUEPakEBIAAoAiARAwBBAUcNACABLQAPIQILIAFBEGokACACC3wBAn8gACAAKAJIIgFBAWsgAXI2AkggACgCFCAAKAIcRwRAIABBAEEAIAAoAiQRAwAaCyAAQQA2AhwgAEIANwMQIAAoAgAiAUEEcQRAIAAgAUEgcjYCAEF/DwsgACAAKAIsIAAoAjBqIgI2AgggACACNgIEIAFBG3RBH3ULGgEBfxDtAyEAQdfdCi0AAEHM3QooAgAgABsL+gMDA3wCfwF+IAC9IgZCIIinQf////8HcSIEQYCAwKAETwRAIABEGC1EVPsh+T8gAKYgAL1C////////////AINCgICAgICAgPj/AFYbDwsCQAJ/IARB///v/gNNBEBBfyAEQYCAgPIDTw0BGgwCCyAAmSEAIARB///L/wNNBEAgBEH//5f/A00EQCAAIACgRAAAAAAAAPC/oCAARAAAAAAAAABAoKMhAEEADAILIABEAAAAAAAA8L+gIABEAAAAAAAA8D+goyEAQQEMAQsgBEH//42ABE0EQCAARAAAAAAAAPi/oCAARAAAAAAAAPg/okQAAAAAAADwP6CjIQBBAgwBC0QAAAAAAADwvyAAoyEAQQMLIAAgAKIiAiACoiIBIAEgASABIAFEL2xqLES0or+iRJr93lIt3q2/oKJEbZp0r/Kws7+gokRxFiP+xnG8v6CiRMTrmJmZmcm/oKIhAyACIAEgASABIAEgAUQR2iLjOq2QP6JE6w12JEt7qT+gokRRPdCgZg2xP6CiRG4gTMXNRbc/oKJE/4MAkiRJwj+gokQNVVVVVVXVP6CiIQEgBEH//+/+A00EQCAAIAAgAyABoKKhDwtBA3QiBEGgzAhqKwMAIAAgAyABoKIgBEHAzAhqKwMAoSAAoaEiAJogACAGQgBTGyEACyAACx8BAX8CQCABEOwBIgIEQCACKAIIDQELIAAgARDVCwsLqQcCDX8EfCMAQdAAayIDJAAgASgCGCENIAEoAhQhByABKAIAIQUgASgCACIIQQAgCEEAShshCiABKAIYIQsgASgCFCEJA0AgBCAKRwRAIAkgBEECdGooAgAiBiAJIARBAWoiAUECdGooAgAiDCAGIAxKGyEMA0AgBiAMRgRAIAEhBAwDCyAGQQJ0IQ4gBkEBaiEGIAQgCyAOaigCAEcNAAsLCwJAIAQgCE4EQCADQQA2AkggAyAFNgJMIAVBIU8EQCADIAVBA3YgBUEHcUEAR2pBARAaNgJICyAFQQAgBUEAShshCCADQUBrIQkDQCAIIA8iAUcEQCAHIAFBAWoiD0ECdGooAgAgByABQQJ0aiIEKAIAa0EBRw0BIAMgAykCSDcDKCADQShqIAEQywINASANIAQoAgBBAnRqKAIAIQEgAyADKQJINwMgIANBIGogARDLAg0BIANByABqIAEQ+AUgCUIANwMAIANCADcDOCADQgA3AzAgByABQQJ0aiIGKAIAIQREAAAAAAAAAAAhEANAIAYoAgQgBEoEQCAHIA0gBEECdGoiBSgCACIKQQJ0aiILKAIEIAsoAgBrQQFGBEAgA0HIAGogChD4BSACIAAgASAFKAIAENgBIREgAyAFKAIANgJEIANBMGpBBBAmIQUgAygCMCAFQQJ0aiADKAJENgIAIBAgEaAhEAsgBEEBaiEEDAELCyADKAI4IgRFDQNEAAAAAAAAAABETGB3hy5VGEAgBLgiEaMgBEEBRhshEiAQIBGjIREgAiAAIAFsQQN0aiEGQQAhAUSamZmZmZm5PyEQQQAhBQNAIAQgBUsEQCADIAMpAzg3AwggAyADKQMwNwMAIBAQSiETIAIgAygCMCADIAUQGUECdGooAgAgAGxBA3RqIgQgEyARoiAGKwMAoDkDACAEIBAQVyARoiAGKwMIoDkDCCAFQQFqIQUgEiAQoCEQIAMoAjghBAwBCwsDQCABIARPBEAgA0EwaiIBQQQQMSABEDQMAwUgAyADKQM4NwMYIAMgAykDMDcDECADQRBqIAEQGSEEAkACQAJAIAMoAkAiBQ4CAgABCyADKAIwIARBAnRqKAIAEBgMAQsgAygCMCAEQQJ0aigCACAFEQEACyABQQFqIQEgAygCOCEEDAELAAsACwsgAygCTEEhTwRAIAMoAkgQGAsgA0HQAGokAA8LQdCnA0H1uwFByQFBhi4QAAALQeuiA0H1uwFB3AFBhi4QAAALrAICCn8DfCAAKAIYIQcgACgCFCEFIABBARDSAgRAIAUgACgCACIEQQJ0aigCACIIRQRARAAAAAAAAPA/DwtBACEAIARBACAEQQBKGyEJIAFBACABQQBKGyEKA0AgACAJRwRAIAUgAEECdGooAgAiAyAFIABBAWoiBEECdGooAgAiBiADIAZKGyEGIAIgACABbEEDdGohCwNAIAMgBkYEQCAEIQAMAwUgByADQQJ0aiEMQQAhAEQAAAAAAAAAACEOA0AgACAKRkUEQCALIABBA3RqKwMAIAIgDCgCACABbEEDdGorAwChIg8gD6IgDqAhDiAAQQFqIQAMAQsLIANBAWohAyANIA6foCENDAELAAsACwsgDSAIt6MPC0HopQNB9bsBQZwBQcn3ABAAAAuYAQEDfyAABEAgACgCECECIAAoAhQQGCAAKAIgEBggACgCMBAYIAAoAiQEQEEBIAJ0IgJBACACQQBKGyECA0AgACgCJCEDIAEgAkZFBEAgAyABQQJ0aigCABDEBSABQQFqIQEMAQsLIAMQGAsgACgCKCEBA0AgAQRAIAEoAhQhAiABELMIIAAgAjYCKCACIQEMAQsLIAAQGAsLHgEBfyAAKAIwIgJFBEAgACABQQgQGiICNgIwCyACC0oCAn8CfCACQQAgAkEAShshAgNAIAIgA0ZFBEAgACADQQN0IgRqKwMAIAEgBGorAwChIgYgBqIgBaAhBSADQQFqIQMMAQsLIAWfC+8BAQR/IwBBEGsiByQAIAEoAhAoAogBIgQgAygCBCIGSQRAIAMhBSAGQSFPBH8gAygCAAUgBQsgBEEDdmoiBSAFLQAAQQEgBEEHcXRyOgAAIAIgAUEBEIUBGiAAIAEQbiEEA0AgBARAIAEgBEEwQQAgBCgCAEEDcSIGQQNHG2ooAigiBUYEQCAEQVBBACAGQQJHG2ooAighBQsgBSgCECgCiAEhBiAHIAMpAgA3AwggB0EIaiAGEMsCRQRAIAAgBSACIAMQxwULIAAgBCABEHIhBAwBCwsgB0EQaiQADwtBl7IDQe/6AEHRAEHfIRAAAAvmAwIDfwh8IAEQHCEFA0AgBQRAAkAgAyAFRiACIAVGcg0AIAUoAhAiBigC6AEgAUcNACAGLQCGAQ0AIAAgBSAEQQAQxww2AhQgAEEEECYhBiAAKAIAIAZBAnRqIAAoAhQ2AgALIAEgBRAdIQUMAQVBASEGA0AgASgCECIFKAK0ASAGTgRAIAUoArgBIAZBAnRqKAIAIgUgAkYgAyAFRnJFBEBBAUEIENQCIQcgBSgCECIFKwMoIQsgBSsDICEIIAUrAxghCSAFKwMQIQogB0EENgIEIAdBBEEQENQCIgU2AgACfCAELQAQQQFGBEAgCSAEKwMIIgyhIQkgCiAEKwMAIg2hIQogCCANoCEIIAsgDKAMAQsgBCsDCCIMIAmiIAkgC6BEAAAAAAAA4L+iIAxEAAAAAAAA8L+goiIOoCEJIAQrAwAiDSAKoiAKIAigRAAAAAAAAOC/oiANRAAAAAAAAPC/oKIiD6AhCiANIAiiIA+gIQggDCALoiAOoAshCyAFIAk5AzggBSAIOQMwIAUgCzkDKCAFIAg5AyAgBSALOQMYIAUgCjkDECAFIAk5AwggBSAKOQMAIAAgBzYCFCAAQQQQJiEFIAAoAgAgBUECdGogACgCFDYCAAsgBkEBaiEGDAELCwsLC5wBAQh/IAFBACABQQBKGyEJIAFBAWogAWxBAm1BBBAaIQcgAUEEEBohBCABIQUDQCADIAlGRQRAIAMgACABIAQQ8QMgAiAFaiEIIAMhBgNAIAIgCEZFBEAgByACQQJ0aiAEIAZBAnRqKAIAsjgCACAGQQFqIQYgAkEBaiECDAELCyAFQQFrIQUgA0EBaiEDIAghAgwBCwsgBBAYIAcLKQEBfyAAKAIQLwGIAUEOcSECIAEEQCAAEM0HGgsgAgRAIAAgAhDLBQsLDQAgAEHhAyABEMMMGgu7AgIDfwF8IwBBIGsiBCQAA38gAC0AACIGQQlrQQVJIAZBIEZyBH8gAEEBaiEADAEFIAZBK0YEQEEBIQUgAEEBaiEACyABIAU6ABAgBCAEQRhqNgIAIAQgBEEQajYCBAJAAkACQCAAQdyDASAEEFEiAA4CAgABCyAEIAQrAxg5AxALIAECfCABLQAQQQFGBEAgAkQAAAAAAADwP2QEQCABIAMgBCsDGCACoxApOQMAIAMgBCsDECACoxApDAILIAQrAxghByACRAAAAAAAAPA/YwRAIAEgAyAHIAKjECM5AwAgAyAEKwMQIAKjECMMAgsgASAHOQMAIAQrAxAMAQsgASAEKwMYIAKjRAAAAAAAAPA/oDkDACAEKwMQIAKjRAAAAAAAAPA/oAs5AwhBASEACyAEQSBqJAAgAAsLCyYBAn8gACgCSCIBIAAoAgRJBH8gACABQQRqNgJIIAEoAgAFQQALC4MCAgV/CHwgAgRAAkAgACgCCCIDRQ0AIAEoAggiBEUNACADKAIkIgUgBCgCJCIHRg0AIAMrAwAiCyAEKwMIIgiiIAMrAwgiCSAEKwMAIgyioSIKmUS7vdfZ33zbPWMNACADKwMQIg0gCKIgBCsDECIOIAmioSAKoyEIAkAgBSsDCCIJIAcrAwgiD2MNACAJIA9hBEAgBSsDACAHKwMAYw0BCyAHIQUgASEACyAALQAMIQACQCAFKwMAIAhlBEAgAA0BDAILIABBAUYNAQsgAkEYENcHIgYgDiALoiANIAyaoqAgCqM5AwggBiAIOQMACyAGDwtBn9QBQZK6AUEuQcMjEAAACxoAIAArAwAgASsDAKEgACsDCCABKwMIoRBHC4EBAgJ/AXwgASACNgIQIAEgAyACKwMIoDkDGCAAKAIAIAAgARDgDEEobGohBANAAkAgBCIFKAIgIgRFDQAgASsDGCIGIAQrAxgiA2QNASADIAZkDQAgAisDACAEKAIQKwMAZA0BCwsgASAENgIgIAUgATYCICAAIAAoAghBAWo2AggLtQECA38CfAJAIABBtiYQJyIEBEAgBBCRAiIEQQJKDQELQRQhBAsgBBDNAiEFIAMgACgCECIAKwMoRAAAAAAAAOA/oqAhAyACIAArAyBEAAAAAAAA4D+ioCECIAS4IQhBACEAA38gACAERgR/IAEgBDYCACAFBSAFIABBBHRqIgYgALggCKNEGC1EVPshCUCiIgcgB6AiBxBXIAOiOQMIIAYgBxBKIAKiOQMAIABBAWohAAwBCwsLIgAgACABKwMAIAIrAwCgOQMAIAAgASsDCCACKwMIoDkDCAumEQIRfwh8IwBBEGsiDSQAIAAoAgggACgCBGoiB0EgEBohECAHIAUoAjAiCUEBdEEAIAlBAEobayIVQQAgFUEAShshDiABIAFDRwOAP5QgAxu7IRcDQCAGIA5HBEAgECAGQQV0aiIIIAUrAxhEAAAAAAAA4D+iIhggBSgCKCAGQQR0aiIRKwMAIBeiRAAAAAAAAOA/oiIZIAZBAnQiEiACKAIAaioCALsiGqCgOQMQIAggGiAZoSAYoTkDACAIIAUrAyBEAAAAAAAA4D+iIhggESsDCCAXokQAAAAAAADgP6IiGSACKAIEIBJqKgIAuyIaoKA5AxggCCAaIBmhIBihOQMIIAZBAWohBgwBCwsCQCAJQQBKBEAgCUEBakEEEBohEUEAIRIgBSgCMEEBakEEEBohDkEAIQIDQCAFKAIwIgYgAkoEQEEAIQYgAkECdCIKIAUoAjRqKAIAIghBACAIQQBKGyETRP///////+9/IRdE////////7/8hGCAIQQJqIgxBBBAaIQcgDEEgEBohCUT////////v/yEZRP///////+9/IRoDQCAGIBNHBEAgByAGQQJ0IgtqIAAoAhAgBSgCOCAKaigCACALaigCACIPQQJ0aigCADYCACAJIAZBBXRqIgsgECAPQQV0aiIPKwMAIhs5AwAgCyAPKwMIIhw5AwggCyAPKwMQIh05AxAgCyAPKwMYIh45AxggBkEBaiEGIBogGxApIRogFyAcECkhFyAZIB0QIyEZIBggHhAjIRgMAQsLIAUoAkQgAkEFdGoiBiAYOQMYIAYgGTkDECAGIBc5AwggBiAaOQMAIAcgCEECdGogACgCECAVQQJ0aiACQQN0aiIGKAIANgIAIAcgCEEBaiILQQJ0aiAGKAIENgIAIAkgCEEFdGoiBiAYOQMYIAYgGTkDECAGIBc5AwggBiAaOQMAIAkgC0EFdGoiCCAYOQMYIAggGTkDECAIIBc5AwggCCAaOQMAIAogEWohCyAKIA5qAn8gA0UEQCAGIBpELUMc6+I2Gj+gOQMQIAggGUQtQxzr4jYav6A5AwAgDCAJIAcgCyAEEOgHDAELIAYgF0QtQxzr4jYaP6A5AxggCCAYRC1DHOviNhq/oDkDCCAMIAkgByALEOcHCyIGNgIAIAcQGCAJEBggAkEBaiECIAYgEmohEgwBCwsgBSgCPCAGaiIHQQQQGiEJIAdBIBAaIQhBACECIAUoAjwiBkEAIAZBAEobIQsDQCACIAtGBEAgBiAHIAYgB0obIQwDQCAGIAxHBEAgCSAGQQJ0aiAGQfsAakQAAAAAAADwPxDpBzYCACAIIAZBBXRqIgIgBSgCRCAGIAUoAjxrQQV0aiIKKwMAOQMAIAIgCisDCDkDCCACIAorAxA5AxAgAiAKKwMYOQMYIAZBAWohBgwBCwsgESAFKAIwIgZBAnRqIQIgDiAGQQJ0agJ/IANFBEAgByAIIAkgAiAEEOgHDAELIAcgCCAJIAIQ5wcLNgIAIAUoAjwiBiAHIAYgB0obIQ8DQCAGIA9HBEAgCCAGQQV0aiECIAkgBkECdGoiDCgCACEEIAYgBSgCPGtBAXQgFWpBAnQiEyAAKAIQaigCACELAnwgA0UEQCACKwMQIAIrAwChDAELIAIrAxggAisDCKELRAAAAAAAAOC/oiEXIwBBEGsiByQAIAtBKGohFCAEKAIsIRYgBCgCKCECA0AgAiAWRgRAIAQgBCgCKDYCLCAHQRBqJAAFIAcgAigCACIKNgIMIAogCzYCBCAKIBcgCisDCKA5AwggFCAHQQxqEMABIAJBBGohAgwBCwsgDCgCACECIAAoAhAgE2ooAgQhCiMAQRBrIgQkACAKQTRqIQsgAigCOCETIAIoAjQhBwNAIAcgE0YEQCACIAIoAjQ2AjggBEEQaiQABSAEIAcoAgAiFDYCDCAUIAo2AgAgBCgCDCIUIBcgFCsDCKA5AwggCyAEQQxqEMABIAdBBGohBwwBCwsgDCgCABCKDSAGQQFqIQYMAQsLIA4gBSgCMEECdGooAgAhAiAJEBggCBAYIA0gAiASaiIDELwEIgI2AgxBACEEA0AgBSgCMCAETgRAQQAhBiAOIARBAnQiB2ooAgAiCUEAIAlBAEobIQkgByARaiEIA0AgCCgCACEHIAYgCUcEQCACIAcgBkECdGooAgA2AgAgBkEBaiEGIAJBBGohAgwBCwtBACAHEPMDIARBAWohBAwBCwsgERAYIA4QGAwDBSAJIAJBAnQiCmogACgCECAFKAJAIApqKAIAIgxBAnRqKAIANgIAIAggAkEFdGoiCiAQIAxBBXRqIgwrAwA5AwAgCiAMKwMIOQMIIAogDCsDEDkDECAKIAwrAxg5AxggAkEBaiECDAELAAsACyAAKAIQIQIgA0UEQCAHIBAgAiANQQxqIAQQ6AchAwwBCyAHIBAgAiANQQxqEOcHIQMLAkAgACgCFEEATA0AIAAoAiQQiA0gACgCGCEGA0AgACgCHCECIAAoAhQgBkoEQCACIAZBAnRqKAIAIgIEQCACELUNCyACEBggBkEBaiEGDAELCyACIAAoAiBGDQBBACACEPMDCwJAIAAoAhgiAkUEQCAAIAM2AhQgACANKAIMNgIcDAELIAAgAiADaiICNgIUIAAgAhC8BDYCHEEAIQYgACgCFCICQQAgAkEAShshAgNAIAIgBkcEQCAGQQJ0IgMgACgCHGoCfyAAKAIYIgQgBkoEQCADIAAoAiBqDAELIA0oAgwgBiAEa0ECdGoLKAIANgIAIAZBAWohBgwBCwtBACANKAIMEPMDIAAoAhQhAwtB7NoKLQAABEAgDSADNgIAQYj2CCgCAEGT5AMgDRAgGiAAKAIUIQMLIAAgACgCDCAAKAIIIAAoAgRqaiAAKAIQIAMgACgCHBCMDTYCJCAQEBggDUEQaiQACzgBAX8gAEEAIABBAEobIQADQCAAIAJHBEAgASACQQN0akQAAAAAAAAAADkDACACQQFqIQIMAQsLC0UBA38gAEEAIABBAEobIQADQCAAIARGRQRAIAEgBEECdCIFaiIGIAIgAyAFaioCAJQgBioCAJI4AgAgBEEBaiEEDAELCwtDAQJ/IABBACAAQQBKGyEFA0AgBCAFRkUEQCADIARBA3QiAGogACABaisDACAAIAJqKwMAoDkDACAEQQFqIQQMAQsLC0MBAn8gAEEAIABBAEobIQUDQCAEIAVGRQRAIAMgBEEDdCIAaiAAIAFqKwMAIAAgAmorAwChOQMAIARBAWohBAwBCwsLEAAgACgCICsDECAAKwMYoAvNAgIEfwF8IwBBIGsiBSQAAkAgACgCBCIEIAAoAghJBEAgAysDACEIIAQgASgCADYCACAEIAIoAgA2AgQgBCACKAIEIgE2AgggAQRAIAEgASgCBEEBajYCBAsgBCAIOQMQIARBGGohAgwBCyAEIAAoAgBrQRhtQQFqIgRBq9Wq1QBPBEAQwAQACyAFQQxqQarVqtUAIAAoAgggACgCAGtBGG0iBkEBdCIHIAQgBCAHSRsgBkHVqtUqTxsgACgCBCAAKAIAa0EYbSAAQQhqEJgNIQQgAysDACEIIAQoAggiAyABKAIANgIAIAMgAigCADYCBCADIAIoAgQiAjYCCCADIQEgAgRAIAIgAigCBEEBajYCBCAEKAIIIQELIAMgCDkDECAEIAFBGGo2AgggACAEEJcNIAAoAgQhAiAEEJYNCyAAIAI2AgQgBUEgaiQAC0oBAX8gACABEK4DIgEgAEEEakcEQCABEKsBIQIgASAAKAIARgRAIAAgAjYCAAsgACAAKAIIQQFrNgIIIAAoAgQgARCfDSABEBgLC3oBBnwgASsDACICIAErAwgiBCACoUQAAAAAAADgP6KgIQUgACsDACIDIAArAwgiBiADoUQAAAAAAADgP6KgIQcgAiAGY0UgBSAHZkVyRQRAIAYgAqEPCyAEIAOhRAAAAAAAAAAAIAUgB2UbRAAAAAAAAAAAIAMgBGMbCw0AIAAtABhBAXZBAXELugIBAn8gAyABNgIIIANCADcCACACIAM2AgAgACgCACgCACIBBEAgACABNgIAIAIoAgAhAwsgAyADIAAoAgQiBUY6AAwCQANAIAMgBUYNASADKAIIIgItAAwNASACKAIIIgEoAgAiBCACRgRAAkAgASgCBCIERQ0AIAQtAAwNACACQQE6AAwgASABIAVGOgAMIARBAToADCABIQMMAgsgAigCACADRwRAIAIQvwQgAigCCCICKAIIIQELIAJBAToADCABQQA6AAwgARC+BAwCCwJAIARFDQAgBC0ADA0AIAJBAToADCABIAEgBUY6AAwgBEEBOgAMIAEhAwwBCwsgAigCACADRgRAIAIQvgQgAigCCCICKAIIIQELIAJBAToADCABQQA6AAwgARC/BAsgACAAKAIIQQFqNgIIC3QBBH8gAEEEaiEDIAAoAgAhAQNAIAEgA0cEQCABKAIQIgQtAChBAUYEQCABIgIQqwEhASACIAAoAgBGBEAgACABNgIACyAAIAAoAghBAWs2AgggACgCBCACEJ8NIAIQGCAEEKcNEBgFIAEQqwEhAQsMAQsLC7kBAQR/IAEgAhCyDSACKAIsIQYgAigCKCEEA0AgBCAGRgRAAkAgAigCOCEGIAIoAjQhBANAIAQgBkYNAQJAIAQoAgAiBygCBCIFKAIgIABHIAMgBUZyDQAgBy0AHEEBcUUNACAAIAEgBSACEN8FCyAEQQRqIQQMAAsACwUCQCAEKAIAIgcoAgAiBSgCICAARyADIAVGcg0AIActABxBAXFFDQAgACABIAUgAhDfBQsgBEEEaiEEDAELCwu8AQEEfyABKAI4IQYgASgCNCEDA0AgAyAGRgRAAkAgASgCLCEGIAEoAighAwNAIAMgBkYNAQJAIAMoAgAiBCgCACIFKAIgIABHIAIgBUZyDQAgBC0AHEEBcUUNACAEQgA3AxAgACAFIAEQ4AULIANBBGohAwwACwALBQJAIAMoAgAiBCgCBCIFKAIgIABHIAIgBUZyDQAgBC0AHEEBcUUNACAEQgA3AxAgACAFIAEQ4AULIANBBGohAwwBCwsLqwECA38DfCMAQRBrIgQkACACQQE6ABwgASsDICEHIAAgASsDGCIIIAArAxigIgk5AxggACAAKwMgIAcgAyAIoqGgIgc5AyAgACAHIAmjOQMQIAEoAgQhBiABKAIAIQIDQCACIAZGBEAgAUEBOgAoIARBEGokAAUgBCACKAIAIgU2AgwgBSAANgIgIAUgAyAFKwMYoDkDGCAAIARBDGoQwAEgAkEEaiECDAELCwubHAITfwZ8IwBB8ABrIgckACAAIABBAEHKlAFBABAiQX9BARBiIQ0gAEEKEIkCIwBBIGsiAiQAAkAgAEGKJBAnIgRFDQAgAkEANgIUIAJCADcDGCACIAJBGGo2AgAgAiACQRRqNgIEIARB57EBIAIQUUEATA0AQefkBEEAECoLIAJBIGokACAAIAAQzQ0gABDRDUHs2gotAAAEQEGI9ggoAgAiDBDVASAHENYBNwNoIAdB6ABqEOsBIgooAhQhCCAKKAIQIQsgCigCDCEGIAooAgghAiAKKAIEIQQgByAKKAIANgJcIAcgBDYCWCAHIAI2AlQgByAGNgJQIAdBsQI2AkQgB0HGuAE2AkAgByALQQFqNgJMIAcgCEHsDmo2AkggDEHGygMgB0FAaxAgGkHRxgFBG0EBIAwQOhpBCiAMEKcBGiAMENQBCyAAEO4OAkAgDUEBRgRAIABBARCBCEEAIQsMAQtB7NoKLQAABEBBiPYIKAIAIgwQ1QEgBxDWATcDaCAHQegAahDrASIKKAIUIQggCigCECELIAooAgwhBiAKKAIIIQIgCigCBCEEIAcgCigCADYCPCAHIAQ2AjggByACNgI0IAcgBjYCMCAHQbcCNgIkIAdBxrgBNgIgIAcgC0EBajYCLCAHIAhB7A5qNgIoIAxBxsoDIAdBIGoQIBpB7cUBQR9BASAMEDoaQQogDBCnARogDBDUAQsgABDfDiILDQAgDUECRgRAIABBAhCBCEEAIQsMAQtB7NoKLQAABEBBiPYIKAIAIgwQ1QEgBxDWATcDaCAHQegAahDrASIKKAIUIQggCigCECELIAooAgwhBiAKKAIIIQIgCigCBCEEIAcgCigCADYCHCAHIAQ2AhggByACNgIUIAcgBjYCECAHQcACNgIEIAdBxrgBNgIAIAcgC0EBajYCDCAHIAhB7A5qNgIIIAxBxsoDIAcQIBpBjcYBQR9BASAMEDoaQQogDBCnARogDBDUAQsgABD3DSANQQNGBEAgAEECEIEIQQAhCwwBCwJAIAAoAhAtAIgBQRBxRQ0AIABBgPQAQQAQkgEiCkUNACAKEBwhCwNAIAsEQCAKIAsQHSAAIAsQ/AVBACEGIAAoAhAoAsQBIgwgCygCECgC9AFByABsIg1qIggoAgAiDkEAIA5BAEobIQICQANAIAIgBkcEQCALIAgoAgQgBkECdGooAgBGBEADQCAMIA1qIQggBkEBaiICIA5ODQQgCCgCBCIIIAZBAnRqIAggAkECdGooAgA2AgAgACgCECgCxAEiDCANaigCACEOIAIhBgwACwAFIAZBAWohBgwCCwALC0G16wBBxrgBQfkBQZr0ABAAAAsgCCAOQQFrNgIAIAsQzw0gACALENEEIQsMAQsLIAAgChD+DAsgABDCDiAAQQEQkg4iCw0AQQAhCyAAQeWjARAnEGhFDQAjAEHAAmsiASQAIAAQ9wkhESAAEBwhEANAIBAEQCAAIBAQLCEJA0ACQAJAAkACQAJAIAkEQCAJQZmxARAnIBEQ0w0iBSAJQf7uABAnIBEQ0w0iDnJFDQUgCSgCECgCCCICRQ0FIAIoAgRBAk8EQCAJQTBBACAJKAIAQQNxQQNHG2ooAigQISEEIAEgCUFQQQAgCSgCAEEDcUECRxtqKAIoECE2AgQgASAENgIAQdS3BCABECoMBgsgCSAJQTBqIgYgCSgCAEEDcSIEQQNGGygCKCESIAkgCUEwayIKIARBAkYbKAIoIQwgAigCACIDKAIEIQ0gAUGQAmpBAEEwEDgaIAEgAygCDCIPNgKcAiABIAMoAggiAjYCmAICQAJAAkACQCAFRQ0AQdX0AyEIAkAgBSgCECIFKwMQIhUgDCgCECIEKwAQIhRlRQ0AIBQgBSsDICIWZUUNACAFKwMYIhcgBCsAGCIUZUUNACAUIAUrAygiGGVFDQAgBUEQaiETAkACQAJAIBUgAygCACIFKwAAIhRlRSAUIBZlRXINACAXIAUrAAgiFGVFDQAgFCAYZQ0BCyANQQFrIQRBACEFA0AgBCAFTQ0CIAMoAgAgBUEEdGogExDSDQ0CIAVBA2ohBQwACwALAkAgFSASKAIQIgQrABAiFGVFIBQgFmVFcg0AIBcgBCsAGCIUZUUNAEGA9QMhCCAUIBhlDQILAkAgFSADKwAQIhRlRSAUIBZlRXINACAXIAMrABgiFGVFDQAgFCAYZQ0DCyACRQ0FIAEgBSkDCDcDyAEgASAFKQMANwPAASABIAMpAxg3A7gBIAEgAykDEDcDsAEgAUHQAWogAUHAAWogAUGwAWogExDlBSADKAIAIgQgASkD0AE3AzAgBCABKQPYATcDOCADKwAQIRQgASsD0AEhGSADKAIAIgIgAysAGCABKwPYASIXoEQAAAAAAADgP6IiFTkDGCACIBQgGaBEAAAAAAAA4D+iIhY5AxAgAysAECEYIAMrABghFCACIBcgFaBEAAAAAAAA4D+iOQMoIAIgGSAWoEQAAAAAAADgP6I5AyAgAiAVIBSgRAAAAAAAAOA/ojkDCCACIBYgGKBEAAAAAAAA4D+iOQMAIAMoAgwiBEUEQEEDIQQMBAsgCSACQQBBACABQZACaiAEENoGQQNqIQQMAwsgAygCDCECIAQgBUYEQCACRQ0EIAMoAgAhAiABIAMpAyg3A6gBIAEgAykDIDcDoAEgASACIARBBHRqIgIpAwg3A5gBIAEgAikDADcDkAEgAUHQAWogAUGgAWogAUGQAWogExDlBSABIAEpA9gBNwO4AiABIAEpA9ABNwOwAgwDCyACBH8gCSADKAIAQQAgBSABQZACaiACENoGBSAFC0EDaiEEDAILIBIQISECIAkgCiAJKAIAQQNxQQJGGygCKBAhIQQgASAJQZmxARAnNgKIASABIAQ2AoQBIAEgAjYCgAEgCCABQYABahAqIAMoAgwhDwsgDUEBayEEIA9FDQAgASADKQMgNwOwAiABIAMpAyg3A7gCCyAORQ0EQbPzAyEFIA4oAhAiCCsDECIVIBIoAhAiAisAECIUZUUNAyAUIAgrAyAiFmVFDQMgCCsDGCIXIAIrABgiFGVFDQMgFCAIKwMoIhhlRQ0DIAhBEGohDgJAIBUgBCICQQR0IgggAygCAGoiDSsAACIUZUUgFCAWZUVyDQAgFyANKwAIIhRlRSAUIBhlRXINAAJAIBUgDCgCECICKwAQIhRlRSAUIBZlRXINACAXIAIrABgiFGVFDQBB3vMDIQUgFCAYZQ0FCyADKAIMRQ0FAkAgFSABKwOwAiIUZUUgFCAWZUVyDQAgFyABKwO4AiIUZUUNACAUIBhlDQYLIAEgDSkDCDcDeCABIA0pAwA3A3AgASABKQO4AjcDaCABIAEpA7ACNwNgIAFB0AFqIAFB8ABqIAFB4ABqIA4Q5QUgAygCACAEQQNrIgJBBHRqIgYgASkD0AE3AwAgBiABKQPYATcDCCABKwOwAiEUIAErA9ABIRkgCCADKAIAIghqIgZBCGsgASsDuAIgASsD2AEiF6BEAAAAAAAA4D+iIhU5AwAgBkEQayAUIBmgRAAAAAAAAOA/oiIWOQMAIAErA7ACIRggASsDuAIhFCAGQRhrIBcgFaBEAAAAAAAA4D+iOQMAIAZBIGsgGSAWoEQAAAAAAADgP6I5AwAgBiAVIBSgRAAAAAAAAOA/ojkDCCAGIBYgGKBEAAAAAAAA4D+iOQMAIAMoAggiBkUNByAJIAggAiACIAFBkAJqIAYQ2QYhAgwHCwNAIAJFDQZBACEFA0AgBUEERgRAIAFB0AFqIA4Q0g1FBEAgAkEDayECDAMLQQAhBQNAIAVBBEcEQCADKAIAIAIgBWtBBHRqIgggAUHQAWogBUEEdGoiBikDADcDACAIIAYpAwg3AwggBUEBaiEFDAELCyACQQNrIQIgAygCCCIGRQ0JIAkgAygCACACIARBA2sgAUGQAmogBhDZBiECDAkFIAFB0AFqIAVBBHRqIgggAygCACACIAVrQQR0aiIGKQMANwMAIAggBikDCDcDCCAFQQFqIQUMAQsACwALAAtBxIIBQay+AUHWAkGSngEQAAALQbmCAUGsvgFBxAJBkp4BEAAACyAAIBAQHSEQDAcLIAkgBiAJKAIAQQNxQQNGGygCKBAhIQYgCSAKIAkoAgBBA3FBAkYbKAIoECEhAiABIAlB/u4AECc2AjggASACNgI0IAEgBjYCMCAFIAFBMGoQKgtBACECIAMoAghFDQEgASADKQMQNwOgAiABIAMpAxg3A6gCDAELQQAhAiADKAIIRQ0AIAMoAgAhBiABIAMpAxg3A1ggASADKQMQNwNQIAEgBikDCDcDSCABIAYpAwA3A0AgAUHQAWogAUHQAGogAUFAayAOEOUFIAEgASkD2AE3A6gCIAEgASkD0AE3A6ACCyABIAQgAmtBAWoiDzYClAIgD0GAgICAAUkEQEEAIA8gD0EQEE4iBBtFBEAgASAENgKQAkEAIQUDQCAFIA9PBEAgAygCABAYIAkoAhAoAggoAgAgAUGQAmpBMBAfGgwEBSABKAKQAiAFQQR0aiIGIAMoAgAgAkEEdGoiBCkDADcDACAGIAQpAwg3AwggAkEBaiECIAVBAWohBSABKAKUAiEPDAELAAsACyABIA9BBHQ2AiBBiPYIKAIAQfXpAyABQSBqECAaEC8ACyABQRA2AhQgASAPNgIQQYj2CCgCAEGm6gMgAUEQahAgGhAvAAsgACAJEDAhCQwACwALCyAREJkBGiABQcACaiQACyAHQfAAaiQAIAsLtgICAXwEfyMAQZABayIIJAACQCABIAJhBEAgASEGDAELQX8gACsDCCIGIANkIAMgBmQbIglFIQpBASEHA0AgB0EERkUEQCAKIAlBAEcgCUF/IAAgB0EEdGorAwgiBiADZCADIAZkGyIJR3FqIQogB0EBaiEHDAELC0QAAAAAAADwvyEGAkACQCAKDgICAAELIAArAzggA6GZRHsUrkfhenQ/ZUUNACACRAAAAAAAAPC/IAArAzAiASAFZRtEAAAAAAAA8L8gASAEZhshBgwBCyAIIABEAAAAAAAA4D8gCEHQAGoiACAIQRBqIgcQoQEgACABIAEgAqBEAAAAAAAA4D+iIgEgAyAEIAUQ4wUiBkQAAAAAAAAAAGYNACAHIAEgAiADIAQgBRDjBSEGCyAIQZABaiQAIAYLtgICAXwEfyMAQZABayIIJAACQCABIAJhBEAgASEGDAELQX8gACsDACIGIANkIAMgBmQbIglFIQpBASEHA0AgB0EERkUEQCAKIAlBAEcgCUF/IAAgB0EEdGorAwAiBiADZCADIAZkGyIJR3FqIQogB0EBaiEHDAELC0QAAAAAAADwvyEGAkACQCAKDgICAAELIAArAzAgA6GZRHsUrkfhenQ/ZUUNACACRAAAAAAAAPC/IAArAzgiASAFZRtEAAAAAAAA8L8gASAEZhshBgwBCyAIIABEAAAAAAAA4D8gCEHQAGoiACAIQRBqIgcQoQEgACABIAEgAqBEAAAAAAAA4D+iIgEgAyAEIAUQ5AUiBkQAAAAAAAAAAGYNACAHIAEgAiADIAQgBRDkBSEGCyAIQZABaiQAIAYLlwMCCXwBfyMAQUBqIg0kACADKwMYIQggAysDECEJIAMrAwghCiACKwMIIQcgASsDCCEFIAErAwAhBgJAAkAgAisDACILIAMrAwAiDGNFDQAgACAMOQMAIAAgBSAFIAehIAwgBqGiIAYgC6GjEDKgIgQ5AwggBCAKZkUNACAEIAhlDQELAkAgCSALY0UNACAAIAk5AwAgACAFIAUgB6EgCSAGoaIgBiALoaMQMqAiBDkDCCAEIApmRQ0AIAQgCGUNAQsCQCAHIApjRQ0AIAAgCjkDCCAAIAYgBiALoSAKIAWhoiAFIAehoxAyoCIEOQMAIAQgDGZFDQAgBCAJZQ0BCwJAIAcgCGRFDQAgACAIOQMIIAAgBiAGIAuhIAggBaGiIAUgB6GjEDKgIgQ5AwAgBCAMZkUNACAEIAllDQELIA0gCDkDOCANIAk5AzAgDSAKOQMoIA0gDDkDICANIAc5AxggDSALOQMQIA0gBTkDCCANIAY5AwBB6u8EIA0QN0H0ngNBrL4BQcUAQYODARAAAAsgDUFAayQAC7UBAQV/IAMgARDXDSADQRRqIQcDQAJAIAMoAAhFDQAgAyAHQQQQvgEgAygCFCIERQ0AIAMoAhgiAQRAIAQgAiABEQQACyAFQQFqIQUgACAEEG4hAQNAIAFFDQIgBCABQTBBACABKAIAQQNxIghBA0cbaigCKCIGRgRAIAFBUEEAIAhBAkcbaigCKCEGCyAGQX8gAygCHBEAAEUEQCADIAYQ1w0LIAAgASAEEHIhAQwACwALCyAFCwwAIAAgAUHMFxDoBgvyAQEDf0HexQEhBAJAIAFFDQAgASECA0AgAi0AACEDIAJBAWohAiADQd8ARg0AIANFBEAgASEEDAILIAPAIgNBX3FBwQBrQRpJIANBMGtBCklyDQALCwJAAkAgBBBAIgFFDQAgABBLIAAQJGsgAUkEQCAAIAEQvQELIAAQJCECIAAQKARAIAAgAmogBCABEB8aIAFBgAJPDQIgACAALQAPIAFqOgAPIAAQJEEQSQ0BQZO2A0Gg/ABBlwJBxOoAEAAACyAAKAIAIAJqIAQgARAfGiAAIAAoAgQgAWo2AgQLDwtBks4BQaD8AEGVAkHE6gAQAAAL/wMCAXwHfwJ/IAArAwgiA0QAAAAAAADgP0QAAAAAAADgvyADRAAAAAAAAAAAZhugIgOZRAAAAAAAAOBBYwRAIAOqDAELQYCAgIB4CyEGAn8gASsDCCIDRAAAAAAAAOA/RAAAAAAAAOC/IANEAAAAAAAAAABmG6AiA5lEAAAAAAAA4EFjBEAgA6oMAQtBgICAgHgLIgcgBmsiBCAEQR91IgVzIAVrAn8gACsDACIDRAAAAAAAAOA/RAAAAAAAAOC/IANEAAAAAAAAAABmG6AiA5lEAAAAAAAA4EFjBEAgA6oMAQtBgICAgHgLIQBBAXQhBUF/QQEgBEEATBshCUF/QQECfyABKwMAIgNEAAAAAAAA4D9EAAAAAAAA4L8gA0QAAAAAAAAAAGYboCIDmUQAAAAAAADgQWMEQCADqgwBC0GAgICAeAsiCCAAayIBQQBMGyEKAkAgBSABIAFBH3UiBHMgBGtBAXQiBEgEQCAFIARBAXVrIQEDQCACIAC3IAa3EL4CIAAgCEYNAiABIAVqIARBACABQQBOIgcbayEBIAAgCmohACAJQQAgBxsgBmohBgwACwALIAQgBUEBdWshAQNAIAIgALcgBrcQvgIgBiAHRg0BIAEgBGogBUEAIAFBAE4iCBtrIQEgBiAJaiEGIApBACAIGyAAaiEADAALAAsLaQECfyMAQRBrIgMkAAJAIABB+/QAECciBEUEQCABIQAMAQsgAyADQQxqNgIAIARBwbIBIAMQUUEBRgRAIAMoAgwiAEEATg0BCyABIQAgBC0AAEEgckH0AEcNACACIQALIANBEGokACAAC/EBAgR/B3wgACABIAIgAxDaDUUEQCACEMECIAIoAhAiAysDKCEIIAMrAyAhCSADKwMYIQogAysDECELA0AgACAFRgRAIAMgCDkDKCADIAk5AyAgAyAKOQMYIAMgCzkDEAVBASECIAEgBUECdGooAgAoAhAiBigCtAEiBEEAIARBAEobQQFqIQcDQCACIAdHBEAgBigCuAEgAkECdGooAgAoAhAiBCsAECEMIAQrABghDSAEKwAgIQ4gCCAEKwAoECMhCCAJIA4QIyEJIAogDRApIQogCyAMECkhCyACQQFqIQIMAQsLIAVBAWohBQwBCwsLC40EAgV/AnwgAygCECIFKAJgBH8gAigCECgC9AEgASgCECgC9AFqQQJtBUF/CyEIAkAgBSgCsAFFBEAgASgCECgC9AEhBwNAIAIoAhAoAvQBIgQgB0oEQCACIQUgBCAHQQFqIgdKBEACQCAHIAhGBEAgAygCECgCYCIFKwMgIQkgBSsDGCEKIAAQugIiBSgCECADKAIQKAJgNgJ4IAUQOSEGIAUoAhAiBCAGKAIQKAL4Abc5A1ggAygCEC0Acw0BIAAQOSEGIAUoAhAiBCAJIAogBigCECgCdEEBcSIGGzkDYCAEIAogCSAGGzkDUAwBCyAAIAAQugIiBRDqDSAFKAIQIQQLIAQgBzYC9AELAkACQEEwQQAgASAFIAMQ5AEiASgCAEEDcSIEQQNHGyABaigCKCgCECIGLQCsAUEBRwR/IAYsALYBQQJIBUECC0EMbCABQVBBACAEQQJHG2ooAigoAhAiBC0ArAFBAUcEfyAELAC2AUECSAVBAgtBAnRqQeDECGooAgAiBEEATgRAIAEoAhAiASgCnAEiBkH/////ByAEbkoNASABIAQgBmw2ApwBDAILQY+YA0GbuQFBxg1B8yAQAAALQaqyBEEAEDcQLwALIAUhAQwBCwsgAygCECgCsAFFDQEPC0HT0gFB774BQdEAQf/kABAAAAtBj9cBQe++AUHfAEH/5AAQAAALiwEBA38gACgCECgCgAJFBEAgABBhELoCIgEoAhBBAjoArAEgABBhELoCIgIoAhBBAjoArAECQCAAKAIQKAIMRQ0AIAAQYSAARg0AIAAQOSgCEC0AdEEBcQ0AIAEgAiAAKAIQIgMrAzAgAysDUBAjQQAQnwEaCyAAKAIQIgAgAjYChAIgACABNgKAAgsLlwICAn8EfCMAQdAAayIHJAAgB0EIaiIIIAFBKBAfGiAHQTBqIAAgCCADQQAgBBCzAyAFIAcpA0g3AxggBSAHQUBrKQMANwMQIAUgBykDODcDCCAFIAcpAzA3AwAgBUEENgIwIAUrAxAhCSAFKwMAIQoCQCAGBEAgAiAEQQIgBUEAEIEFDAELIAIgBEECIAVBABCABQsCQCAJIApkRQ0AIAVBOGoiAiAFKAI0IgFBBXRqQQhrKwMAIgsgAygCECIDKwMYIAAoAhAoAsQBIAMoAvQBQcgAbGorAxigIgxjRQ0AIAUgAUEBajYCNCACIAFBBXRqIgAgDDkDGCAAIAk5AxAgACALOQMIIAAgCjkDAAsgB0HQAGokAAsoACAAQQVPBEBBuc8BQf26AUHTA0GHNRAAAAsgAEECdEHYyAhqKAIAC0sBAX8gACABIAIQtgNFBEAgAUEFdCIBIAAoAgRqIgMgAjYCHCADQQhqQQQQJiECIAAoAgQgAWoiACgCCCACQQJ0aiAAKAIcNgIACwueAQICfwF+AkAgASACQYAEIAEoAgARAwAiBUUEQCAAKAIQIAAoAgAiBUEobGoiBiAFNgIgIAAgBUEBajYCACAGIQAgA0UNASADIAAoAiBBBXRqIgUgAikDADcDCCACKQMIIQcgBSAANgIAIAUgBzcDECAAIAQ6ACQgASAFQQEgASgCABEDABoLIAUoAgAPC0G2LEHuvAFBqAJBtRwQAAAL7wMCA38GfCMAQSBrIgUkAANAIAQoAgAhBiAFIAQpAgg3AxggBSAEKQIANwMQAkACQAJAAkACQCAGIAVBEGogAhAZQShsaiIGKAIAQQFrDgMCAQADCyAGKAIYIAVBIGokAA8LQSQhAiAAKwAIIgggBisAECIKREivvJry13o+oCILZA0CIAggCkRIr7ya8td6vqAiDGNFIAArAAAiDSAGKwAIIglkcQ0CQSAhAiAIIAqhmURIr7ya8td6PmVFIA0gCaGZREivvJry13o+ZUVyDQJBJCECIAErAAgiCCALZA0CQSBBJEEgIAErAAAgCWQbIAggDGMbIQIMAgsgACsAACEJAkACQCAAKwAIIgggAyAGKAIEIgdBOGxqIgIrAAihmURIr7ya8td6PmUEQCAJIAIrAAChmURIr7ya8td6PmUNAQsgCCACKwAYoZlESK+8mvLXej5lRQ0BIAkgAisAEKGZREivvJry13o+ZUUNAQsgCCABKwMIoZlESK+8mvLXej5lBEBBIEEkIAErAwAgCWMbIQIMAwtBIEEkIAcgAyABEMcEGyECDAILQSBBJCAHIAMgABDHBBshAgwBCyAFQbMCNgIEIAVBt74BNgIAQYj2CCgCAEHYvwQgBRAgGhA7AAsgAiAGaigCACECDAALAAveSAIUfwh8IwBBgAdrIgIkAEGE/gogACgCECgCdCIEQQFxIgs6AABBgP4KIARBA3E2AgACQCALBEAgABC1DgwBCyAAELQOCyAAKAIQIgQvAYgBIQsCQCAELQBxIgRBNnFFBEAgBEEBcUUNAUGk2wooAgANAQsgC0EOcSEGIAAQHCEJQQAhBEEAIQsDQCAJBEACQCAJKAIQKAJ8IgdFDQAgBy0AUUEBRgRAIANBAWohAwwBCyALQQFqIQsLIAAgCRAsIQUDQCAFBEACQCAFKAIQIgcoAmwiDEUNACAMLQBRQQFGBEAgA0EBaiEDDAELIAZFDQAgBCAHKAIIQQBHaiEECwJAIAcoAmQiDEUNACAMLQBRQQFGBEAgA0EBaiEDDAELIAZFDQAgBCAHKAIIQQBHaiEECwJAIAcoAmgiDEUNACAMLQBRQQFGBEAgA0EBaiEDDAELIAZFDQAgBCAHKAIIQQBHaiEECwJAIAcoAmAiDEUNACAMLQBRQQFGBEAgA0EBaiEDDAELIAZFDQAgBCAHKAIIQQBHaiEECyAAIAUQMCEFDAELCyAAIAkQHSEJDAELCyAAKAIQLQBxQQhxBEAgABCzDiENCyAEIAtqIhBFDQAgABA8IAMgBGogDWpqIgxBKBAaIQsgEEEoEBohCSACQv////////93NwP4BiACQv////////93NwPwBiACQv/////////3/wA3A+gGIAJC//////////f/ADcD4AYgABAcIQogCyEEIAkhBwNAIAoEQCAKKAIQIgVBKEEgQYT+Ci0AACIDG2orAwAhFiACKwP4BiEYIAIrA+gGIRkgAisD4AYhGiACKwPwBiEdIAQgBUEgQSggAxtqKwMARAAAAAAAAFJAoiIbOQMYIAQgFkQAAAAAAABSQKIiHDkDECAEIAooAhAiBSkDEDcDACAEIAUpAxg3AwggBCAEKwMAIBxEAAAAAAAA4D+ioSIWOQMAIAQgBCsDCCAbRAAAAAAAAOA/oqEiFzkDCCACIB0gHCAWoCIcIBwgHWMbOQPwBiACIBogFiAWIBpkGzkD4AYgAiAZIBcgFyAZZBs5A+gGIAIgGCAbIBegIhYgFiAYYxs5A/gGAkAgCigCECgCfCIFRQ0AIAUtAFFBAUYEQCACIAIpA+gGNwO4BSACIAIpA/AGNwPABSACIAIpA/gGNwPIBSACIAIpA+AGNwOwBSACQfgFaiAFIARBKGoiBCACQbAFahD+AyACIAIpA5AGNwP4BiACIAIpA4gGNwPwBiACIAIpA4AGNwPoBiACIAIpA/gFNwPgBgwBCwJAIAMEQCAHIAUrAyA5AwAgByAFKwMYOQMIDAELIAcgBSkDGDcDACAHIAUpAyA3AwgLIAdBADoAJCAHIAU2AiAgBCAHNgIgIAdBKGohBwsgBEEoaiEEIAAgChAsIQUDQAJAAkACQAJAAkAgBQRAIAUoAhAiAygCYCIIBEACQCAILQBRQQFGBEAgAiACKQPoBjcDiAUgAiACKQPwBjcDkAUgAiACKQP4BjcDmAUgAiACKQPgBjcDgAUgAkH4BWogCCAEIAJBgAVqEP4DIAIgAikDkAY3A/gGIAIgAikDiAY3A/AGIAIgAikDgAY3A+gGIAIgAikD+AU3A+AGDAELIAZFDQMgAygCCEUNAyACQdAGaiAAIAUQiAogAiACKQPYBjcDgAYgAiACKQPQBjcD+AUgAkIANwOQBiACQgA3A4gGIAQgAikDkAY3AxggBCACKQOIBjcDECAEIAIpA4AGNwMIIAQgAikD+AU3AwAgBEIANwMgAkBBhP4KLQAAQQFGBEAgByAIKwMgOQMAIAcgCCsDGDkDCAwBCyAHIAgpAxg3AwAgByAIKQMgNwMICyAHQQA6ACQgByAINgIgIAQgBzYCICAHQShqIQcLIAUoAhAhAyAEQShqIQQLIAMoAmgiCARAAkAgCC0AUUEBRgRAIAIgAikD6AY3A9gEIAIgAikD8AY3A+AEIAIgAikD+AY3A+gEIAIgAikD4AY3A9AEIAJB+AVqIAggBCACQdAEahD+AyACIAIpA5AGNwP4BiACIAIpA4gGNwPwBiACIAIpA4AGNwPoBiACIAIpA/gFNwPgBgwBCyAGRQ0EIAMoAghFDQQCQCAFEJkDIgNFBEAgAkIANwPIBiACQgA3A8AGDAELIAMoAgAiAygCCARAIAIgAykDGDcDyAYgAiADKQMQNwPABgwBCyACIAMoAgAiAykDCDcDyAYgAiADKQMANwPABgsgAiACKQPIBjcDgAYgAiACKQPABjcD+AUgAkIANwOQBiACQgA3A4gGIAQgAikDkAY3AxggBCACKQOIBjcDECAEIAIpA4AGNwMIIAQgAikD+AU3AwAgBEIANwMgAkBBhP4KLQAAQQFGBEAgByAIKwMgOQMAIAcgCCsDGDkDCAwBCyAHIAgpAxg3AwAgByAIKQMgNwMICyAHQQA6ACQgByAINgIgIAQgBzYCICAHQShqIQcLIAUoAhAhAyAEQShqIQQLIAMoAmQiCARAAkAgCC0AUUEBRgRAIAIgAikD6AY3A6gEIAIgAikD8AY3A7AEIAIgAikD+AY3A7gEIAIgAikD4AY3A6AEIAJB+AVqIAggBCACQaAEahD+AyACIAIpA5AGNwP4BiACIAIpA4gGNwPwBiACIAIpA4AGNwPoBiACIAIpA/gFNwPgBgwBCyAGRQ0FIAMoAghFDQUCQCAFEJkDIgNFBEAgAkIANwO4BiACQgA3A7AGDAELIAMoAgAgAygCBEEwbGoiA0EkaygCAARAIAIgA0EQayIDKQMINwO4BiACIAMpAwA3A7AGDAELIAIgA0EwaygCACADQSxrKAIAQQR0akEQayIDKQMINwO4BiACIAMpAwA3A7AGCyACIAIpA7gGNwOABiACIAIpA7AGNwP4BSACQgA3A5AGIAJCADcDiAYgBCACKQOQBjcDGCAEIAIpA4gGNwMQIAQgAikDgAY3AwggBCACKQP4BTcDACAEQgA3AyACQEGE/gotAABBAUYEQCAHIAgrAyA5AwAgByAIKwMYOQMIDAELIAcgCCkDGDcDACAHIAgpAyA3AwgLIAdBADoAJCAHIAg2AiAgBCAHNgIgIAdBKGohBwsgBSgCECEDIARBKGohBAsgAygCbCIIRQ0FAkAgCC0AUUEBRgRAIAIgAikD6AY3A/gDIAIgAikD8AY3A4AEIAIgAikD+AY3A4gEIAIgAikD4AY3A/ADIAJB+AVqIAggBCACQfADahD+AyACIAIpA5AGNwP4BiACIAIpA4gGNwPwBiACIAIpA4AGNwPoBiACIAIpA/gFNwPgBgwBCyAGRQ0FIAMoAghFDQUgAkGgBmogACAFEIgKIAIgAikDqAY3A4AGIAIgAikDoAY3A/gFIAJCADcDkAYgAkIANwOIBiAEIAIpA5AGNwMYIAQgAikDiAY3AxAgBCACKQOABjcDCCAEIAIpA/gFNwMAIARCADcDIAJAQYT+Ci0AAEEBRgRAIAcgCCsDIDkDACAHIAgrAxg5AwgMAQsgByAIKQMYNwMAIAcgCCkDIDcDCAsgB0EAOgAkIAcgCDYCICAEIAc2AiAgB0EoaiEHCyAEQShqIQQMBQsgACAKEB0hCgwHCyACIAgoAgA2AqAFQfD2AyACQaAFahAqDAMLIAIgCCgCADYC8ARBx/YDIAJB8ARqECoMAgsgAiAIKAIANgLABEGU9wMgAkHABGoQKgwBCyACIAgoAgA2ApAEQaL2AyACQZAEahAqCyAAIAUQMCEFDAALAAsLIA0EQCACIAIpA/gGNwOQBiACIAIpA/AGNwOIBiACIAIpA+gGNwOABiACIAIpA+AGNwP4BSACIAQ2ApgGIAJByANqIgQgAkH4BWoiB0EoEB8aIAJB0AVqIgUgACAEELIOIAcgBUEoEB8aIAIgAikDgAY3A+gGIAIgAikDiAY3A/AGIAIgAikDkAY3A/gGIAIgAikD+AU3A+AGC0EAIQcgAEEAQYUtQQAQIiEEIAIgAikD+AY3A5AGIAIgAikD8AY3A4gGIAIgAikD6AY3A4AGIAIgAikD4AY3A/gFIAAgBEEBEIAKIQQgAkEANgCcBiACQQA2AJkGIAIgBDoAmAYgAkH4BWohBCMAQaABayIDJABBHBD4AyIIQdzPCkGg7gkoAgAQkwEiCjYCFAJAAkACQAJAAkAgCgRAQbgZEPgDIgUQkwgiBkEANgIEIAY2AgAgCCAENgIQIAggEDYCDCAIIAk2AgggCCAMNgIEIAggCzYCACAIIAU2AhggA0FAayEUAn8gAisDiAYgAisDkAYQIxAyEK0HnCIWRAAAAAAAAPBBYyAWRAAAAAAAAAAAZnEEQCAWqwwBC0EAC0EBaiEFAkADQCAMIBFGDQFBOBD4AyIPIAsgEUEobGoiBDYCMAJ8IAQoAiAiBkUEQEQAAAAAAAAAACEWRAAAAAAAAAAADAELIAYrAwghFiAGKwMACyEXIAQrAxAhHSAEKwMYIRsgBCsDACEYIA8gBCsDCCIcIBahnCIZOQMYIA8gGCAXoZwiGjkDECAPIBYgHCAboKCbIhs5AyggDyAXIBggHaCgmyIWOQMgIBogFiAaoUQAAAAAAADgP6KgIhZEAAAAAAAA4MFmRSAWRAAAwP///99BZUVyDQMgGSAbIBmhRAAAAAAAAOA/oqAiF0QAAAAAAADgwWZFIBdEAADA////30FlRXINBAJ/IBeZRAAAAAAAAOBBYwRAIBeqDAELQYCAgIB4CyEGAn8gFplEAAAAAAAA4EFjBEAgFqoMAQtBgICAgHgLIQ5BACENIAUhBANAIARBAEoEQCAOIARBAWsiBHZBAXEiEkEBdCANQQJ0ciASIAYgBHZBAXEiE3NyIQ0gE0EBayITQQAgEmtxIBMgBiAOc3FzIhIgBnMhBiAOIBJzIQ4MAQsLIA8gDTYCCCARQQFqIREgCiAPQQEgCigCABEDAA0ACwwGCyAKQQBBgAEgCigCABEDACEEA0AgBARAIAQoAjAhCiAIKAIYIQYgAyAEKQMoNwMYIAMgBCkDIDcDECADIAQpAxg3AwggAyAEKQMQNwMAIwBB8ABrIgUkACAFQQA2AmwCQCAGBEAgAysDACADKwMQZQRAIAMrAwggAysDGGUNAgtB/ccBQa+3AUGyAUGpHBAAAAtBz+sAQa+3AUGwAUGpHBAAAAsgBigCACENIAUgAykDGDcDGCAFIAMpAxA3AxAgBSADKQMINwMIIAUgAykDADcDACAGIAUgCiANIAVB7ABqELkOBEAQkwgiCiAGKAIAIg4oAgRBAWo2AgQgBUFAayINIA4Q9QUgBSAGKAIANgJgIAYgDSAKQQAQyAQaIAVBIGogBSgCbBD1BSAFIAUpAzg3A1ggBSAFKQMwNwNQIAUgBSkDKDcDSCAFIAUpAyA3A0AgBSAFKAJsNgJgIAYgDSAKQQAQyAQaIAYgCjYCAAsgBUHwAGokACAIKAIUIgogBEEIIAooAgARAwAhBAwBCwtBACEGIAoQmgEDQCAKEJoBBEAgCigCDCIERQ0FAn8gCigCBCgCCCINQQBIBEAgBCgCCAwBCyAEIA1rCyIERQ0FIAogBEGAICAKKAIAEQMAGiAEEBggBkEBaiEGDAELCyAGRw0EIAoQmQFBAEgNBUEAIQRBACEOA0AgDCAORgRAIAgoAhgiBCgCABC7DiAEKAIAEBggBBAYIAgQGAwHBSALIA5BKGxqIgUoAiAiBgRAIAUrAxAhGiAGKwMIIRcgBSsDGCEYIAYrAwAhFiADQfAAaiIKQQBBJBA4GiAGIAUrAwAgFqE5AxAgBiAYIAUrAwigOQMYIANB0ABqIAggBSAKEIUCAn8CQCADKAJQRQRAIAMgAykDaDcDKCADIAMpA2A3AyAMAQsgBiAFKwMIOQMYIANBMGogCCAFIANB8ABqEIUCAkACQCADKAIwRQ0AIAMrAzggAysDWGMEQCADIAMpA0g3A2ggAyADQUBrKQMANwNgIAMgAykDODcDWCADIAMpAzA3A1ALIAYgBSsDCCAGKwMIoTkDGCADQTBqIAggBSADQfAAahCFAiADKAIwRQ0AIAMrAzggAysDWGMEQCADIAMpA0g3A2ggAyADQUBrKQMANwNgIAMgAykDODcDWCADIAMpAzA3A1ALIAYgBSsDADkDECAGIAUrAwggBSsDGKA5AxggA0EwaiAIIAUgA0HwAGoQhQIgAygCMEUNACADKwM4IAMrA1hjBEAgAyADKQNINwNoIAMgA0FAaykDADcDYCADIAMpAzg3A1ggAyADKQMwNwNQCyAGIAUrAwggBisDCKE5AxggA0EwaiAIIAUgA0HwAGoQhQIgAygCMEUNACADKwM4IAMrA1hjBEAgAyADKQNINwNoIAMgA0FAaykDADcDYCADIAMpAzg3A1ggAyADKQMwNwNQCyAGIAUrAwAgBSsDEKA5AxAgBiAFKwMIIAUrAxigOQMYIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQAgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgBiAFKwMIOQMYIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQAgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgBiAFKwMIIAYrAwihOQMYIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQAgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgFyAXoCAYoEQAAAAAAADgP6IhGSAWIBagIBqgRAAAAAAAAMA/oiEaAkAgAygCcCINIAMoAowBIgogAygCiAFyIAMoAnwiDyADKAKQASIRcnJyRQRAIAUrAwghFkEAIQ0MAQsgBSsDCCEWIAogEXIEfyAPBSAGIAUrAwAiFyAGKwMAoSIYOQMQIAYgFiAFKwMYoDkDGANAIBcgBSsDEKAgGGYEQCADQTBqIAggBSADQfAAahCFAiADKAIwRQ0EIAMrAzggAysDWGMEQCADIAMpA0g3A2ggAyADQUBrKQMANwNgIAMgAykDODcDWCADIAMpAzA3A1ALIAYgGiAGKwMQoCIYOQMQIAUrAwAhFwwBCwsgAygCcCENIAUrAwghFiADKAJ8CyANcg0AIAYgBSsDACAGKwMAoTkDECAWIAUrAxigIRcDQAJAIAYgFzkDGCAXIBYgBisDCKFmRQ0AIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQMgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgBisDGCAZoSEXIAUrAwghFgwBCwsgAygCcCENCyAGIAUrAwAiFyAFKwMQoCIYOQMQIAYgFiAGKwMIoTkDGCADKAKQASIKIAMoAnQiDyADKAJ4ciANIAMoAoQBIhFycnJFDQEgDSAPcgR/IBEFA0AgFyAGKwMAoSAYZQRAIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQMgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgBiAGKwMQIBqhIhg5AxAgBSsDACEXDAELCyADKAKQASEKIAMoAoQBCyAKcg0BIAYgFyAFKwMQoDkDECAFKwMIIhYgBisDCKEhFwNAIAYgFzkDGCAXIBYgBSsDGKBlRQ0CIANBMGogCCAFIANB8ABqEIUCIAMoAjBFDQEgAysDOCADKwNYYwRAIAMgAykDSDcDaCADIANBQGspAwA3A2AgAyADKQM4NwNYIAMgAykDMDcDUAsgGSAGKwMYoCEXIAUrAwghFgwACwALIAMgFCkDCDcDKCADIBQpAwA3AyAMAQsgAyADKQNoNwMoIAMgAykDYDcDICADKAJQRQ0AIAMrA1hEAAAAAAAAAABhBEAgBSgCICIGIAMpAyA3AxAgBiADKQMoNwMYDAELQQEgAi0AmAZBAUcNARogBSgCICIGIAMpAyA3AxAgBiADKQMoNwMYCyAFKAIgQQE6ACQgBAshBAsgDkEBaiEODAELAAsAC0HI2QNBDkEBQYj2CCgCABA6GhAvAAtB+ckBQdS5AUH6A0H0sAEQAAALQdzJAUHUuQFB+wNB9LABEAAAC0GpPEHUuQFBigRB/rABEAAAC0HLrgFB1LkBQZEEQf6wARAAAAsgA0GgAWokAAJAQezaCi0AAEUNACACIAIrA/gFOQOgAyACIAIrA4AGOQOoAyACIAIrA4gGOQOwAyACIAIrA5AGOQO4AyACIAw2ApADIAIgEDYClAMgAiACLQCYBjYCmANBiPYIKAIAIgNBjPIEIAJBkANqEDNB7NoKLQAAQQJJDQBB7uQDQQhBASADEDoaQQAhBSALIQQDQCAFIAxGBEBBgukDQQhBASADEDoaQQAhBSAJIQQDQCAFIBBGDQMgBC0AJCEMIAQrAxAhFiAEKwMYIRcgBCsDACEYIAQrAwghGSACIAQoAiAoAgA2AtACIAIgGTkDyAIgAiAYOQPAAiACIBc5A7gCIAIgFjkDsAIgAiAMNgKoAiACIAQ2AqQCIAIgBTYCoAIgA0HlggQgAkGgAmoQMyAEQShqIQQgBUEBaiEFDAALAAUgBCsDGCEWIAQrAxAhFyAEKwMIIRggBCsDACEZIAIgBCgCICIGBH8gBigCICgCAAVB8f8ECzYCjAMgAiAGNgKIAyACIBY5A4ADIAIgFzkD+AIgAiAYOQPwAiACIBk5A+gCIAIgBTYC4AIgA0GD+wQgAkHgAmoQMyAEQShqIQQgBUEBaiEFDAELAAsACyAJIQRBACEFAkADQCAFIBBGBEBB7NoKLQAABEAgAiAQNgKUAiACIAc2ApACQYj2CCgCAEHr5gQgAkGQAmoQIBoMAwsFIAQtACQEQCAEKAIgIgxBAToAUSAEKwMQIRYgBCsDACEXIAwgBCsDGCAEKwMIRAAAAAAAAOA/oqA5A0AgDCAWIBdEAAAAAAAA4D+ioDkDOCAAIAwQigIgB0EBaiEHCyAFQQFqIQUgBEEoaiEEDAELCyAHIBBGDQAgAiAQNgKEAiACIAc2AoACQY7nBCACQYACahAqCyALEBggCRAYC0QAAAAAAAAAACEXAkAgACgCECIEKAIMIgVFBEBEAAAAAAAAAAAhFgwBC0QAAAAAAAAAACEWIAUtAFENACAELQCTAkEBcSELIAUrAyBEAAAAAAAAIECgIRYgBSsDGEQAAAAAAAAwQKAhF0GE/gotAABBAUYEQAJAIAsEQCAEIBYgBCsDIKA5AyAMAQsgBCAEKwMQIBahOQMQCyAXIAQrAygiGCAEKwMYIhmhIhpkRQ0BIAQgGCAXIBqhRAAAAAAAAOA/oiIYoDkDKCAEIBkgGKE5AxgMAQtBgP4KKAIAIQkCQCALBEAgCUUEQCAEIBYgBCsDKKA5AygMAgsgBCAEKwMYIBahOQMYDAELIAlFBEAgBCAEKwMYIBahOQMYDAELIAQgFiAEKwMooDkDKAsgFyAEKwMgIhggBCsDECIZoSIaZEUNACAEIBggFyAaoUQAAAAAAADgP6IiGKA5AyAgBCAZIBihOQMQCwJAIAFFDQACQAJAAkACQAJAAkBBgP4KKAIAIgFBAWsOAwECAwALQYj+CiAEKQMQNwMAQZD+CiAEKQMYNwMAQYj+CisDACEYQZD+CisDACEZDAQLIAQrAyhBkP4KIAQrAxAiGTkDAJohGAwCCyAEKwMoIRlBiP4KIAQrAxAiGDkDAEGQ/gogGZoiGTkDAAwCCyAEKwMYIRhBkP4KIAQrAxAiGTkDAAtBiP4KIBg5AwALIAEgGEQAAAAAAAAAAGJyRSAZRAAAAAAAAAAAYXENACAAEBwhAQNAAkAgAQRAQYD+CigCAARAIAFBABCYBAsgAiABKAIQIgQpAxg3A/gBIAIgBCkDEDcD8AEgAkH4BWoiCyACQfABahCEAiAEIAIpA4AGNwMYIAQgAikD+AU3AxAgASgCECgCfCIEBEAgAiAEQUBrIgkpAwA3A+gBIAIgBCkDODcD4AEgCyACQeABahCEAiAJIAIpA4AGNwMAIAQgAikD+AU3AzgLQaDbCigCAEEBRw0BIAAgARAsIQsDQCALRQ0CQQAhCQJAIAsoAhAiBCgCCCIFRQRAQYzbCi0AAA0BIAQtAHBBBkYNASALQTBBACALKAIAQQNxQQNHG2ooAigQISEEIAIgC0FQQQAgCygCAEEDcUECRxtqKAIoECE2AmQgAiAENgJgQZmyBCACQeAAahA3DAELA0AgBSgCBCAJTQRAIAQoAmAiCQRAIAIgCUFAayIEKQMANwPYASACIAkpAzg3A9ABIAJB+AVqIAJB0AFqEIQCIAQgAikDgAY3AwAgCSACKQP4BTcDOCALKAIQIQQLIAQoAmwiCQRAIAIgCUFAayIEKQMANwPIASACIAkpAzg3A8ABIAJB+AVqIAJBwAFqEIQCIAQgAikDgAY3AwAgCSACKQP4BTcDOCALKAIQIQQLIAQoAmQiCQR/IAIgCUFAayIEKQMANwO4ASACIAkpAzg3A7ABIAJB+AVqIAJBsAFqEIQCIAQgAikDgAY3AwAgCSACKQP4BTcDOCALKAIQBSAECygCaCIERQ0CIAIgBEFAayIJKQMANwOoASACIAQpAzg3A6ABIAJB+AVqIAJBoAFqEIQCIAkgAikDgAY3AwAgBCACKQP4BTcDOAwCCyAJQTBsIgwgBSgCAGoiBCgCDCEFIAQoAgghAyAEKAIEIQYgBCgCACEIQQAhBANAIAQgBkYEQCALKAIQIQQgAwRAIAIgBCgCCCgCACAMaiIEKQMYNwOIASACIAQpAxA3A4ABIAJB+AVqIAJBgAFqEIQCIAQgAikDgAY3AxggBCACKQP4BTcDECALKAIQIQQLIAlBAWohCSAFBEAgAiAEKAIIKAIAIAxqIgQpAyg3A3ggAiAEKQMgNwNwIAJB+AVqIAJB8ABqEIQCIAQgAikDgAY3AyggBCACKQP4BTcDICALKAIQIQQLIAQoAgghBQwCBSACIAggBEEEdGoiBykDCDcDmAEgAiAHKQMANwOQASACQfgFaiACQZABahCEAiAHIAIpA4AGNwMIIAcgAikD+AU3AwAgBEEBaiEEDAELAAsACwALIAAgCxAwIQsMAAsACyAAIAAoAhAoAnRBA3EQtw4gACgCECIEKAIMIQUMAgsgACABEB0hAQwACwALAkAgBUUNACAFLQBRDQACfCAELQCTAiIAQQRxBEAgBCsDICAXRAAAAAAAAOC/oqAMAQsgF0QAAAAAAADgP6IgBCsDECIXoCAAQQJxDQAaIBcgBCsDIKBEAAAAAAAA4D+iCyEXIBZEAAAAAAAA4D+iIRYCfCAAQQFxBEAgBCsDKCAWoQwBCyAWIAQrAxigCyEWIAVBAToAUSAFIBY5A0AgBSAXOQM4C0HI7QkoAgAEQCACQgA3A4AGIAJCADcD+AUCQEGE/gotAABBAUYEQCACQYj+CisDACIWOQMgIAJBkP4KKwMAIhc5AyggAiAWOQMQIAIgFzkDGCACQfgFakGMoAQgAkEQahCEAQwBCyACQUBrQZD+CisDACIWOQMAIAJBiP4KKwMAIhc5A0ggAiAXmjkDUCACIBaaOQNYIAIgFjkDMCACIBc5AzggAkH4BWpB8ZkEIAJBMGoQhAELIAJB+AVqIgEQKCEEIAEQJCEAAkAgBARAIAEgABCQAiIFDQEgAiAAQQFqNgIAQYj2CCgCAEH16QMgAhAgGhAvAAsgAkH4BWoiARBLIABNBEAgAUEBELcCCyACQfgFaiIAECQhAQJAIAAQKARAIAAgAWpBADoAACACIAItAIcGQQFqOgCHBiAAECRBEEkNAUGTtgNBoPwAQa8CQcSyARAAAAsgAigC+AUgAWpBADoAAAsgAigC+AUhBQtB1O0JIAU2AgAgAkIANwOABiACQgA3A/gFAn9ByO0JKAIAIgFBzO0JKAIAIgBGBEBBwO0JIAFBAXRBASABG0EEEPwBQcztCSgCACEACwJAIAAEQEHI7QkoAgAgAE8NAUHE7QkgAEHE7QkoAgBqQQFrIABwIgA2AgBBwO0JIABBBBDfARpByO0JQcjtCSgCAEEBajYCAEHE7QkoAgAMAgtBr5UDQYm4AUHYAEHrwwEQAAALQZoMQYm4AUHZAEHrwwEQAAALIQBBwO0JKAIAIABBAnRqQdTtCSgCADYCAAsgAkGAB2okAAtDAQJ8IAAgASgCICIBKwMQIgIQMjkDACAAIAErAxgiAxAyOQMIIAAgAiABKwMAoBAyOQMQIAAgAyABKwMIoBAyOQMYC6UCAQR/IwBB4ABrIgIkAAJAIAEEQCAAEL8OIAFBCGohBUEAIQFBASEEA0AgAUHAAEYNAiAFIAFBKGxqIgMoAiAEQAJAIAQEQCAAIAMpAwA3AwAgACADKQMYNwMYIAAgAykDEDcDECAAIAMpAwg3AwgMAQsgAiAAKQMINwMoIAIgACkDEDcDMCACIAApAxg3AzggAiAAKQMANwMgIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDADcDACACQUBrIAJBIGogAhCKAyAAIAIpA1g3AxggACACKQNQNwMQIAAgAikDSDcDCCAAIAIpA0A3AwALQQAhBAsgAUEBaiEBDAALAAtBz+sAQYy+AUHWAEHMNxAAAAsgAkHgAGokAAukAwEEfyMAQYABayIDJAAgACABQQJ0aiIEQdwWaiIFKAIARQRAIABBCGohBiAEQdgUaiACNgIAIAVBATYCACAAIAJBBXRqQegYaiEEAkAgACACQQJ0akHgGGoiBSgCAEUEQCAEIAYgAUEobGoiASkDADcDACAEIAEpAxg3AxggBCABKQMQNwMQIAQgASkDCDcDCAwBCyADIAYgAUEobGoiASkDCDcDSCADIAEpAxA3A1AgAyABKQMYNwNYIAMgASkDADcDQCADIAQpAwg3AyggAyAEKQMQNwMwIAMgBCkDGDcDOCADIAQpAwA3AyAgA0HgAGogA0FAayADQSBqEIoDIAQgAykDeDcDGCAEIAMpA3A3AxAgBCADKQNoNwMIIAQgAykDYDcDAAsgAyAAIAJBBXRqIgFBgBlqKQMANwMYIAMgAUH4GGopAwA3AxAgAyABQfAYaikDADcDCCADIAFB6BhqKQMANwMAIAAgAkEDdGpBqBlqIAMQiwM3AwAgBSAFKAIAQQFqNgIAIANBgAFqJAAPC0HaxwFB0boBQd4BQdEOEAAACx8BAX9BEBBSIgMgAjYCCCADIAE2AgQgAyAANgIAIAMLTAEBfyAAKAIEIgIgAUsEQCACQSFPBH8gACgCAAUgAAsgAUEDdmoiACAALQAAQQEgAUEHcXRyOgAADwtBl7IDQe/6AEHRAEHfIRAAAAtQAQF/IAEoAhAoApwBRQRAQQAPCyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDDDgR/IAAgAUFQQQAgASgCAEEDcUECRxtqKAIoEMMOBUEACws1AQJ/AkAgABAcIgFFBEAMAQsgARCGAiECA0AgACABEB0iAUUNASACIAEQnggaDAALAAsgAguGAwEDfyABIAFBMGoiAyABKAIAQQNxQQNGGygCKCgCECICKALQASACKALUASICQQFqIAJBAmoQ2gEhAiABIAMgASgCAEEDcUEDRhsoAigoAhAgAjYC0AEgASADIAEoAgBBA3FBA0YbKAIoKAIQIgIgAigC1AEiBEEBajYC1AEgAigC0AEgBEECdGogATYCACABIAMgASgCAEEDcUEDRhsoAigoAhAiAygC0AEgAygC1AFBAnRqQQA2AgAgASABQTBrIgMgASgCAEEDcUECRhsoAigoAhAiAigC2AEgAigC3AEiAkEBaiACQQJqENoBIQIgASADIAEoAgBBA3FBAkYbKAIoKAIQIAI2AtgBIAEgAyABKAIAQQNxQQJGGygCKCgCECICIAIoAtwBIgRBAWo2AtwBIAIoAtgBIARBAnRqIAE2AgAgASADIAEoAgBBA3FBAkYbKAIoKAIQIgEoAtgBIAEoAtwBQQJ0akEANgIAIAAoAhBBAToA8AEgABBhKAIQQQE6APABC4ABAQJ/QcABIQMgACECA0AgAigCECADaigCACICBEBBuAEhAyABIAJHDQELCyACBEAgASgCECICKAK8ASEBIAIoArgBIgIEQCACKAIQIAE2ArwBCyABIAAgARsoAhBBuAFBwAEgARtqIAI2AgAPC0GbpANBq7oBQb8BQdyfARAAAAsJAEEBIAAQ1AILYQEEfyAAKAIEIQQCQANAIAIgBEYNASACQQJ0IAJBAWohAiAAKAIAIgVqIgMoAgAgAUcNAAsgACAEQQFrIgE2AgQgAyAFIAFBAnQiAWooAgA2AgAgACgCACABakEANgIACwtDAAJAIAAQKARAIAAQJEEPRg0BCyAAEI4PCwJAIAAQKARAIABBADoADwwBCyAAQQA2AgQLIAAQKAR/IAAFIAAoAgALC3QBAn8jAEEgayICJAACQCAArSABrX5CIIhQBEAgACABEE4iA0UNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBiPYIKAIAQabqAyACECAaEC8ACyACIAAgAWw2AhBBiPYIKAIAQfXpAyACQRBqECAaEC8AC7cNAgh/A3wjAEHAAmsiBCQAAkAgABA5IgkgACgCAEEDcSIKQQAQ5QMiBUUNAANAIAVFDQECQCAAIAUQRSIDRQ0AIAMtAABFBEAgBSgCCEHC8AAQPkUNAQsgAUG57QQQGxogASACKAIAEEQgBSgCCCACIAEQuwIgAUGTzQMQGxoCQCACLQAFQQFHDQACQCAFKAIIIgNBwcMBED4NACADQbHDARA+DQAgA0G5wwEQPg0AIANBl8MBED4NACADQajDARA+DQAgA0GfwwEQPkUNAQsgACAFEEUiA0UNASADLQAARQ0BIANBABCQCiIIRQRAIAQgAzYCAEHK+gQgBBAqDAILIAFB7v8EEBsaIAIgAigCACIDQQFqNgIAIAEgAxBEIAFB/s0EEBsaQQAhBwNAIAgoAgAgB00EQCACIAIoAgBBAWs2AgAgAUHu/wQQGxogASACKAIAEEQgAUH+yAEQGxogCBCOCgwDCyAHBEAgAUG57QQQGxoLIAgoAgghAyACIAIoAgAiBkEBajYCACABIAYQRCABQfDYAxAbGiABIAIoAgAQRAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADIAdB0ABsaiIDKAIAIgYOEAoKAAABAQIDBAQGBwsFBQgJCyAEQdAAQfAAIAZBAkYbNgJQIAFB7+wEIARB0ABqEB4gASACKAIAEEQgASADQQhqELQIDAoLIARBwgBB4gAgBkEERhs2AmAgAUHv7AQgBEHgAGoQHiABIAIoAgAQRCABIANBCGoQtAgMCQsgAUGk7QRBABAeIAEgAigCABBEIAEgA0EIahC0CAwICyABQYztBEEAEB4gASACKAIAEEQgAysDCCELIAQgAysDEDkDmAEgBCALOQOQASABQffqBCAEQZABahAeIAEgAigCABBEIARB4wBB8gAgAygCGCIGQQFGG0HsACAGGzYCgAEgAUH87AQgBEGAAWoQHiABIAIoAgAQRCAEIAMrAyA5A3AgAUG76gQgBEHwAGoQHiABIAIoAgAQRCABQdfMAxAbGiADKAIoIAIgARC7AiABQQoQZQwHCyAEQcMAQeMAIAZBCEYbNgKgASABQe/sBCAEQaABahAeIAEgAigCABBEIAFBo+wEQQAQHiABIAIoAgAQRCABQfDMAxAbGiADKAIIIAIgARC7AiABQQoQZQwGCyAEQcMAQeMAIAZBDUYbNgKQAiABQe/sBCAEQZACahAeIAEgAigCABBEAkACQAJAIAMoAggOAgABAgsgAUGj7ARBABAeIAEgAigCABBEIAFB8MwDEBsaIAMoAhAgAiABELsCIAFBChBlDAcLIAFB/esEQQAQHiABIAIoAgAQRCABIAIoAgAQRCADKwMQIQsgBCADKwMYOQOIAiAEIAs5A4ACIAFBo+sEIARBgAJqEB4gASACKAIAEEQgAysDICELIAQgAysDKDkD+AEgBCALOQPwASABQY3rBCAEQfABahAeIAEgAigCABBEIAEgAygCMCADKAI0IAIQkA8MBgsgAUGQ7ARBABAeIAEgAigCABBEIAEgAigCABBEIAMrAxAhCyADKwMYIQwgBCADKwMgOQPgASAEIAw5A9gBIAQgCzkD0AEgAUHV6wQgBEHQAWoQHiABIAIoAgAQRCADKwMoIQsgAysDMCEMIAQgAysDODkDwAEgBCAMOQO4ASAEIAs5A7ABIAFBuesEIARBsAFqEB4gASACKAIAEEQgASADKAJAIAMoAkQgAhCQDwwFCyABQbDtBEEAEB4gASACKAIAEEQgBCADKwMIOQOgAiABQczqBCAEQaACahAeIAEgAigCABBEIAFBjc0DEBsaIAMoAhAgAiABELsCIAFBChBlDAQLIAFBmO0EQQAQHiABIAIoAgAQRCABQYPNAxAbGiADKAIIIAIgARC7AiABQQoQZQwDCyABQfHrBEEAEB4gASACKAIAEEQgBCADKAIINgKwAiABQe7HBCAEQbACahAeDAILIARBsgI2AhQgBEGFuwE2AhBBiPYIKAIAQdi/BCAEQRBqECAaEDsACyAEQeUAQcUAIAYbNgJAIAFB7+wEIARBQGsQHiABIAIoAgAQRCADKwMIIQsgAysDECEMIAMrAxghDSAEIAMrAyA5AzggBCANOQMwIAQgDDkDKCAEIAs5AyAgAUHJygQgBEEgahAeCyACIAIoAgBBAWsiAzYCACABIAMQRCABQa8IEBsaIAdBAWohBwwACwALIAAgBRBFIAIgARC7AgsgCSAKIAUQ5QMhBQwACwALIARBwAJqJAAL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IAM2AgAgAUEgakG4MiABEIQBA0AgAi0AACACQQFqIQINAAtBuqADIQMMAQUgAUEgakEpEH8LCwsgAEGsywMgAUEgahDCARDAAwwACwALIAFBIGoQXCABQTBqJAALaQECfyMAQRBrIgMkACADQgA3AwggA0IANwMAA0ACQCACLQAAIgRB3ABHBEAgBA0BIAAgASADEMIBEHEgAxBcIANBEGokAA8LIANB3AAQfyACLQAAIQQLIAMgBMAQfyACQQFqIQIMAAsAC5ICAQV/IAAQhwUhAyAAECQhAQJAAkACQANAIAEiAkUNASADIAFBAWsiAWotAABBLkcNAAsgABAkIQEDQCABQQFrIQUgASACRwRAIAMgBWotAABBMEcNAgsCQCAAECgEQCAALQAPIgRFDQQgACAEQQFrOgAPDAELIAAgACgCBEEBazYCBAsgASACRyAFIQENAAsgABAkIgFBAkkNACABIANqIgFBAmsiAi0AAEEtRw0AIAFBAWstAABBMEcNACACQTA6AAAgABAoBEAgAC0ADyIBRQ0DIAAgAUEBazoADw8LIAAgACgCBEEBazYCBAsPC0HijwNBoPwAQZIDQegqEAAAC0HijwNBoPwAQagDQegqEAAAC8cBAQN/IwBBEGsiAiQAIAFBUEEAIAEoAgBBA3FBAkcbaiIBQVBBACABKAIAQQNxIgNBAkcbaigCKCEEIAFBMEEAIANBA0cbaigCKCEDIAIgASkDCDcDCCACIAEpAwA3AwACQCAAIAMgBCACENkCRQ0AIAAQOSAARgRAIAAtABhBIHEEQCABEMcLCyAAIAEQzwcgARCzByAAQQIgASkDCBC/BgsgACABQQ9BAEEAEMgDDQAgABA5IABGBEAgARAYCwsgAkEQaiQACxoAIAAgARCsASIBIAIQwQMgACABQQAQjAEaC0UAIAAgAUG+zgMgAisDAEQAAAAAAABSQKMQjQMgACABQb7OAyADIAIrAwgiA6EgA0G42wotAAAbRAAAAAAAAFJAoxCNAwt9AQN/IwBBMGsiAiQAIAAQISEDIAAQLSEEAkACQCADBEBBfyEAIAQgASADEJIGQX9HDQEMAgsgAiAAKQMINwMAIAJBEGoiA0EeQdTPASACELQBGkF/IQAgASADIAQoAkwoAgQoAgQRAABBf0YNAQtBACEACyACQTBqJAAgAAvN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ABCPATYCuAJBAEHk2wooAgBEAAAAAAAALEBEAAAAAAAA8D8QTCEOIABBnKAKNgLIAiAAIA45A8ACIAAgARAhNgK0ASAAKAKoAhAYIABBADYCqAIgACgCrAIQGCAAQQA2AqwCIAAoArQCEBggAEEANgK0AgJAAkAgAUGqKRAnIgUEQCAAIAFB/doAECciAkG8zgMgAhs2AqACIAAgAUHw2gAQJyICQbqgAyACGyIENgKkAiAAKAKgAiICIAQQyQIgAmoiAkEAIAItAAAbIgIEQCADIAIsAAA2AtACQYLkBCADQdACahAqIABB8f8ENgKkAgsgACAFEGQ2AqgCIANCADcD0AQgA0IANwPIBCADQgA3A8AEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAIAAoAqgCIQIDQCACIAAoAqACELEFIgIEQCADIAI2AtQEIANBwARqQQQQJiECIAMoAsAEIAJBAnRqIAMoAtQENgIAQQAhAgwBCwsgAygCyAQiAkEBayIFQQBIDQIgAkECTwRAIANBADYC1AQgA0HABGoiBEEEECYhAiADKALABCACQQJ0aiADKALUBDYCACAEIABBrAJqQQBBBBDHAQtBACECA0AgAygCyAQgAksEQCADIAMpA8gENwO4AiADIAMpA8AENwOwAiADQbACaiACEBkhCQJAAkACQCADKALQBCIEDgICAAELIAMoAsAEIAlBAnRqKAIAEBgMAQsgAygCwAQgCUECdGooAgAgBBEBAAsgAkEBaiECDAELCyADQcAEaiICQQQQMSACEDQgACAFNgKwAiABQZEkECciBUUNASAFLQAARQ0BQQAhBiAAKAKwAkECakEEED8hB0EBIQIDQCAAKAKwAiIEIAJOBEAgACACIAQgBRDfCARAIAcgBkEBaiIGQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBgRAIAcgBjYCACAHIAZBAnRqIARBAWo2AgQMAQsgAyAFNgLAAkHA5QQgA0HAAmoQKiAHEBhBACEHCyAAIAc2ArQCDAELIABBATYCsAILQQEQ2gIgA0GoBGohDCADQcgEaiENQYC/CCgCACEIIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgRFBEBBACEGQQAMAQsgBCgCDCEGIAQoAggLIQQgAiAGNgIYIAIg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/////////w+DhCICQoGAgICAgICACFoEQCAAQgF8IQAMAQsgAkKAgICAgICAgAhSDQAgAEIBgyAAfCEACyAAQoCAgICAgIAIhSAAIABC/////////wdWIgQbIQAgBK0LIQIgBUEgaiQAIAFCgICAgICAgICAf4MgAkI0hoQgAIS/C4kCAAJAIAAEfyABQf8ATQ0BAkBBxIMLKAIAKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LC0H8gAtBGTYCAEF/BUEBCw8LIAAgAToAAEEBC8ICAQR/IwBB0AFrIgUkACAFIAI2AswBIAVBoAFqIgJBAEEoEDgaIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAIgAyAEENELQQBIBEBBfyEEDAELIAAoAkxBAEggACAAKAIAIghBX3E2AgACfwJAAkAgACgCMEUEQCAAQdAANgIwIABBADYCHCAAQgA3AxAgACgCLCEGIAAgBTYCLAwBCyAAKAIQDQELQX8gABCmBw0BGgsgACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBDRCwshAiAGBEAgAEEAQQAgACgCJBEDABogAEEANgIwIAAgBjYCLCAAQQA2AhwgACgCFCEBIABCADcDECACQX8gARshAgsgACAAKAIAIgAgCEEgcXI2AgBBfyACIABBIHEbIQQNAAsgBUHQAWokACAECxIAIAAgAUEKQoCAgIAIELAFpwthAAJAIAANACACKAIAIgANAEEADwsgACABEKoEIABqIgAtAABFBEAgAkEANgIAQQAPCyAAIAEQyQIgAGoiAS0AAARAIAIgAUEBajYCACABQQA6AAAgAA8LIAJBADYCACAAC38CAn8CfiMAQaABayIEJAAgBCABNgI8IAQgATYCFCAEQX82AhggBEEQaiIFQgAQjwIgBCAFIANBARDYCyAE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IABCADcCBCAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQQQALlAMCA34CfwJAIAC9IgJCNIinQf8PcSIEQf8PRw0AIABEAAAAAACAVkCiIgAgAKMPCyACQgGGIgFCgICAgICAwNaAf1gEQCAARAAAAAAAAAAAoiAAIAFCgICAgICAwNaAf1EbDwsCfiAERQRAQQAhBCACQgyGIgFCAFkEQANAIARBAWshBCABQgGGIgFCAFkNAAsLIAJBASAEa62GDAELIAJC/////////weDQoCAgICAgIAIhAshASAEQYUISgRAA0ACQCABQoCAgICAgKALfSIDQgBTDQAgAyIBQgBSDQAgAEQAAAAAAAAAAKIPCyABQgGGIQEgBEEBayIEQYUISg0AC0GFCCEECwJAIAFCgICAgICAoAt9IgNCAFMNACADIgFCAFINACAARAAAAAAAAAAAog8LIAFC/////////wdYBEADQCAEQQFrIQQgAUKAgICAgICABFQgAUIBhiEBDQALCyACQoCAgICAgICAgH+DIAFCgICAgICAgAh9IAStQjSGhCABQQEgBGutiCAEQQBKG4S/C+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPoCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEL0FIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLpBgDE38EfAF+IwBBMGsiCSQAAkACQAJAIAC9IhlCIIinIgNB/////wdxIgZB+tS9gARNBEAgA0H//z9xQfvDJEYNASAGQfyyi4AETQRAIBlCAFkEQCABIABEAABAVPsh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IABEAAAAAAAA4D+ioiIDob1CgICAgHCDvyIERAAAIGVHFfc/oiIBIAkgCEEUdmq3IgKgIgUgASACIAWhoCAAIABEAAAAAAAAAECgoyIBIAMgASABoiICIAKiIgEgASABRJ/GeNAJmsM/okSveI4dxXHMP6CiRAT6l5mZmdk/oKIgAiABIAEgAUREUj7fEvHCP6JE3gPLlmRGxz+gokRZkyKUJEnSP6CiRJNVVVVVVeU/oKKgoKIgACAEoSADoaAiACAEoEQAou8u/AXnPaIgAEQAACBlRxX3P6KgoKAhAAsgAAtZAQF/IwBBIGsiAiQAIAAQ7AEiAAR/IAAoAgghACACQgA3AwggAkEANgIYIAJCADcDECACIAE2AgggAkIANwMAIAAgAkEEIAAoAgARAwAFQQALIAJBIGokAAuVAQIDfwV8IAMQVyIImiEJIAAoAgghBiADEEohByAGEBwhBANAIAQEQCAEKAIQKAKUASIFIAIgBSsDACIKIAiiIAcgBSsDCCILoqCgOQMIIAUgASAKIAeiIAsgCaKgoDkDACAGIAQQHSEEDAELCyAAQThqIQQDQCAEKAIAIgAEQCAAIAEgAiADEK8HIABBBGohBAwBCwsLtQIBBX8jAEEwayIDJAAgACgACCABTwRAIABBADYCFCAAQQQQJiEEIAAoAgAgBEECdGogACgCFDYCACAAQQQQjAIgACgACCABQX9zakECdCIEBEAgACgCACADIAApAgg3AyggAyAAKQIANwMgIANBIGogAUEBahAZIAAoAgAhByADIAApAgg3AxggAyAAKQIANwMQQQJ0aiAHIANBEGogARAZQQJ0aiAEELYBGgsgACACNgIUIAMgACkCCDcDCCADIAApAgA3AwAgAyABEBkhAQJAAkACQCAAKAIQIgIOAgIAAQsgACgCACABQQJ0aigCABAYDAELIAAoAgAgAUECdGooAgAgAhEBAAsgACgCACABQQJ0aiAAKAIUNgIAIANBMGokAA8LQfGhA0GFuAFBFkGhGhAAAAsdACAAKAIIIAFBARCFARogASgCECgCgAEgADYCDAtEAQF/IAAEQCAAKAIEIgEEQCABEG0LIAAoAggiAQRAIAEQbQsgACgCDBAYIAAoAhQiAQRAIAEgACgCEBEBAAsgABAYCws+AQN/IAAQLSECIAAoAhAiAQRAA0Ag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/wotAABB1P8KQQE6AABBAXFFBEAgCkEwQQAgCigCAEEDcUEDRxtqKAIoECEhACAEIApBUEEAIAooAgBBA3FBAkcbaigCKBAhNgIEIAQgADYCAEHo7QQgBBAqCyAGEBggChCZBAwFBSAEKAKMASENIAQrA1ghEyAFIAQrA4ABOQMIIAUgEzkDACABQQFrIQEgBUEQaiEFIAIgDWohAgwCCwALCwNAIAItAAAiBUEJayIBQRdLQQEgAXRBn4CABHFFckUEQCACQQFqIQIMAQsLIAogABDeBiEJIBIEQCAEKAJ8IQEgCSAVOQMYIAkgFjkDECAJIAE2AggLIAgEQCAEKAJ4IQEgCSAXOQMoIAkgFDkDICAJIAE2AgwLIAIgBUEARyIRaiECQQAhBQNAIAAgBUcEQCAFQQR0IgEgCSgCAGoiDSABIAZqIgEpAwA3AwAgDSABKQMINwMIIAVBAWohBQwBCwsgBhAYDAELCyAKKAIQIgUoAmAiAARAIAogAEH12QAQsQQgCigCECEFCyAFKAJsIgAEQCAKIABB2tkAELEEIAooAhAhBQsgBSgCZCIABH8gCiAAQfDZABCxBCAKKAIQBSAFCygCaCIABEAgCiAAQejZABCxBAsgC0EBaiELCyADIAoQMCEKDAELCyADIA8QHSEPDAELCyALRQRAQQAhAQwBC0ECQQEgAxC0AiALRhshAQtBACEAQQAhCiADKAIQKAIIIgIoAlgiCARAIAJBADYCVEEBIQoLAkAgCA0AQfjaCigCAEEBRw0AIAMQtgRFDQBBASEAIAMoAhAoAgwiAkUNACACQQA6AFELIAMQwQIgCARAIAMoAhAhD0QAAAAAAAAAACEVRAAAAAAAAAAAIRZBACERQQAhEkEAIQ4jAEFAaiILJAAgAygCECICKAKQASENIARB2ABqIgkgAikDEDcDACAJIAIpAyg3AxggCSACKQMgNwMQIAkgAikDGDcDCAJAIAIoAggoAlgiBkUNAAJAIAkrAwAgCSsDEGINACAJKwMIIAkrAxhiDQAgCUL/////////dzcDGCAJQv/////////3/wA3AwAgCUL/////////9/8ANwMIIAlC/////////3c3AxALIAYoAgghBwNAIBEgBigCAE8NASALQgA3AzggC0IANwMwIAtCADcDKCALQgA3AyACQAJAAkACQAJA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AisDAKEiGyAboiACKwMYIAIrAwihIhsgG6KgIAUrAxAgBSsDAKEgBCsDOKAgBCsDKKEiGyAbokQAAAAAAADQP6JlIQMMAQsgBSgCICEDIAUoAiQgASACKQMYNwPIAiABIAIpAxA3A8ACIAMgAUHAAmoQ5gwhBiAEKAJIIQMgBCgCTCABIAIpAwg3A7gCIAEgAikDADcDsAIgAyABQbACahDmDCEHIAQoAkgiEUEBdCEXIAUoAiAiDkEBdCEYIBFBAWshGSAOQQFrIRpBACEDQQAhCAJAA0AgASAGIAhBBHRqIgkpAwg3A6gCIAEgCSkDADcDoAIgASAGIAggGmogDm9BBHRqIhIpAwg3A5gCIAEgEikDADcDkAIgAUHABGogAUGgAmogAUGQAmoQ6wwgASAHIAxBBHRqIgspAwg3A4gCIAEgCykDADcDgAIgASAHIAwgGWogEW9BBHRqIhMpAwg3A/gBIAEgEykDADcD8AEgAUGwBGogAUGAAmogAUHwAWoQ6wwgAUIANwOYBCABQgA3A+gBIAEgASkDyAQ3A9gBIAEgASkDuAQ3A8gBIAFCADcDkAQgAUIANwPgASABIAEpA8AENwPQASABIAEpA7AENwPAASABKwPoASABKwPYASIboSABKwPAASABKwPQASIcoaIgASsDyAEgG6EgASsD4AEgHKGioSEfIAEgEikDCDcDuAEgASASKQMANwOwASABIAkpAwg3A6gBIAEgCSkDADcDoAEgASALKQMINwOYASABIAspAwA3A5ABIAFBsAFqIAFBoAFqIAFBkAFqEOoMIRUgASATKQMINwOIASABIBMpAwA3A4ABIAEgCykDCDcDeCABIAspAwA3A3AgASAJKQMINwNoIAEgCSkDADcDYCABQYABaiABQfAAaiABQeAAahDqDCEWIAEgEikDCDcDWCABIBIpAwA3A1AgASAJKQMINwNIIAEgCSkDADcDQCABIBMpAwg3AzggASATKQMANwMwIAEgCykDCDcDKCABIAspAwA3AyAgASsDMCIgIAErA1giGyABQUBrIgkrAwgiIaGiIAErAyAiJSAhIBuhIiKiIAErA1AiHiABKwMoIh0gASsDOCIcoaIiJiAJKwMAIiMgHCAdoaKgoKAiJEQAAAAAAAAAAGIEfyABICUgHCAboaIgJiAgIBsgHaGioKAgJKMi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AgAiESAKKAIASARAIBAgAkECdCIRaiAMNgIAIAMgEWogBCAFaigCADYCACACQQFqIQIMAQsgAyARQQJ0aiIMIAwoAgAgBCAFaigCAGo2AgALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIANBACADQQBKGyEJQQAhAANAIAAgCUYNByAPIABBAWoiAUECdCIDaiEEIA8gAEECdCIFaigCACEAA0AgACAEKAIATkUEQCAGIBQgAEECdGooAgAiCEECdGogAjYCACAQIAJBAnRqIAg2AgAgAEEBaiEAIAJBAWohAgwBCwsgBSAHaiEEIAMgDmohCCAFIA5qKAIAIQADQCAAIAgoAgBORQRAIAYgEyAAQQJ0aigCACIFQQJ0aigCACAEKAIASARAIBAgAkECdGogBTYCACACQQFqIQILIABBAWohAAwBCwsgAyAHaiACNgIAIAEhAAwACwALIAVBAUYNBAsgEkHqBDYCBCASQZa3ATYCAEGI9ggoAgBB2L8EIBIQIBoQOwALQcLeAUGWtwFBlQRBr7ABEAAAC0GH0AFBlrcBQZYEQa+wARAAAAtB2pUBQZa3AUGXBEGvsAEQAAALIANBACADQQBKGyEIIA0oAhwhAyABKAIcIQUgACgCHCEVQQAhAANAIAAgCEYNASAPIABBAWoiAUECdCIJaiEKIA8gAEECdCIEaigCACEAA0AgACAKKAIATkUEQCAGIBQgAEECdGooAgAiC0ECdGogAjYCACAQIAJBAnRqIAs2AgAgAyACQQN0aiAVIABBA3RqKwMAOQMAIABBAWohACACQQFqIQIMAQsLIAQgB2ohCiAJIA5qIQsgBCAOaigCACEAA0AgACALKAIATkUEQAJAIAYgEyAAQQJ0aigCACIEQQJ0aigCACIMIAooAgBIBEAgECACQQJ0aiAENgIAIAMgAkEDdGogBSAAQQN0aisDADkDACACQQFqIQIMAQsgAyAMQQN0aiIEIAUgAEEDdGorAwAgBCsDAKA5AwALIABBAWohAAwBCwsgByAJaiACNgIAIAEhAAwACwALIA0gAjYCCCAGEBgLIBJBEGokACANC8sHAg9/AXwjAEEQayINJAACQCAARQRADAELAkACQCAAKAIgRQRAIAAoAhghDiAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELYCIgkgATYCCCAJKAIYIQ8gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEFA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECDAELIAcgAUEBaiICQQJ0aiEEIAcgAUECdGooAgAhAQNAIAQoAgAgAUwEQCACIQEMAwUgBSAOIAFBAnRqKAIAQQJ0aiILIAsoAgBBAWo2AgAgAUEBaiEBDAELAAsACwsDQCABIAJGRQRAIAFBAnQhBSADIAFBAWoiAUECdGoiBCAEKAIAIAMgBWooAgBqNgIADAELC0EAIQICQAJAAkACQCAAKAIQIgFBBGsOBQADAwMBAgsgCSgCHCEFIAAoAhwhBEEAIQADQCAAIApGDQggByAAQQFqIgJBAnRqIQsgByAAQQJ0aigCACEBA0AgCygCACABTARAIAIhAAwCBSAPIAMgDiABQQJ0IgZqIgwoAgBBAnRqKAIAQQJ0aiAANgIAIAQgBmooAgAhBiADIAwoAgBBAnRqIgwgDCgCACIMQQFqNgIAIAUgDEECdGogBjYCACABQQFqIQEMAQsACwALAAsDQCACIApGDQcgByACQQFqIgBBAnRqIQUgByACQQJ0aigCACEBA0AgBSgCACABTARAIAAhAgwCBSADIA4gAUECdGooAgBBAnRqIgQgBCgCACIEQQFqNgIAIA8gBEECdGogAjYCACABQQFqIQEMAQsACwALAAsgAUEBRg0ECyANQfQANgIEIA1BlrcBNgIAQYj2CCgCAEHYvwQgDRAgGhA7AAUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtBodABQZa3AUHFAEGckwEQAAALIAkoAhwhBSAAKAIcIQQDQCACIApGDQEgByACQQFqIgBBAnRqIQsgByACQQJ0aigCACEBA0AgCygCACABTARAIAAhAgwCBSAPIAMgDiABQQJ0aiIGKAIAQQJ0aigCAEECdGogAjYCACAEIAFBA3RqKwMAIRAgAyAGKAIAQQJ0aiIGIAYoAgAiBkEBajYCACAFIAZBA3RqIBA5AwAgAUEBaiEBDAELAAsACwALA0AgCEEATEUEQCADIAhBAnRqIAMgCEEBayIIQQJ0aigCADYCAAwBCwsgA0EANgIACyANQRBqJAAgCQsLACAAIAFBAhD/Bws+AQJ8IAG3IQMDQEGc2wovAQAgAkoEQBDXASEEIAAoAhAoApQBIAJBA3RqIAQgA6I5AwAgAkEBaiECDAELCwv3AQICfwJ8IwBBMGsiAyQAIAAgARAsIQEDQCABBEACQAJAIAJFDQAgASACEEUiBC0AAEUNACADIANBKGo2AiACQCAEQfCDASADQSBqEFFBAEwNACADKwMoIgVEAAAAAAAAAABjDQAgBUQAAAAAAAAAAGINAkH42gooAgANAgsgAyAENgIQQem1AyADQRBqECogABAhIQQgA0KAgICAgICA+D83AwggAyAENgIAQbGmBCADEIABCyADQoCAgICAgID4PzcDKEQAAAAAAADwPyEFCyABKAIQIAU5A4gBIAYgBaAhBiAAIAEQMCEBDAELCyADQTBqJAAgBguQAQEFfyMAQeAAayIDJAAgAEEBQab0AEHx/wQQIiEFIABBAUHlOUHx/wQQIiEGIAAQHCECIAFBAkkhAQNAIAIEQCADQTdqIgQgAigCEDQC9AEQzA0gAiAFIAQQcSABRQRAIANBDmoiBCACKAIQNAL4ARDMDSACIAYgBBBxCyAAIAIQHSECDAELCyADQeAAaiQAC9gBAQJ/IAAQeSEBA0AgAQRAIAEQggggARB4IQEMAQsLAkAgAEHiJUEAQQEQNkUNACAAKAIQKAIIEBggACgCECIBQQA2AgggASgCuAEQGCAAKAIQKAKMAhAYIAAoAhAoAtgBEBggACgCECICKALEAQRAIAIoAugBIQEDQCABIAIoAuwBSkUEQCACKALEASABQcgAbGooAgwQGCABQQFqIQEgACgCECECDAELCyACKALEAUG4f0EAIAIoAugBQX9GG2oQGAsgABA5IABGDQAgACgCECgCDBC8AQsLzgIBA38jAEHQAGsiAiQAIAJCADcDSCACQgA3A0ACfyAAEDxFBEAgAUEANgIAQQAMAQsgAkIANwM4IAJCADcDMCACQgA3AyggAkIANwMYIAJCADcDECACQgA3AwggAkG6AzYCJCACQbsDNgIgIAAQHCEDA0AgAwRAIAMoAhBBADYCsAEgACADEB0hAwwBCwsgABAcIQMDQCADBEAgA0F/IAIoAiQRAABFBEAgAkFAayIEQQAQ6AUgAiACKAIwNgIAIAQgAhDnBSAAIAQQsQNBARCSASIEQeIl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AigCACAFIAIpAgg3A7gGIAUgAikCADcDsAYgBUGwBmogAxAZQcgAbGooAixBAWtBfUsNACACKAIAIAUgAikCCDcD+AMgBSACKQIANwPwAyAFQfADaiADEBlByABsaigCPCACKAIAIQAgBSACKQIINwPoAyAFIAIpAgA3A+ADIAVB4ANqIAMQGSEBQQFrQX1NBEAgAigCACEGAn8gACABQcgAbGooAkBBAUYEQCAFIAIpAgg3A8gBIAUgAikCADcDwAEgBiAFQcABaiADEBlByABsaigCLCEAIAIoAgAgBSACKQIINwO4ASAFIAIpAgA3A7ABIAVBsAFqIAQQGUHIAGxqIAA2AiggAigCACAFIAIpAgg3A6gBIAUgAikCADcDoAEgBUGgAWogAxAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDmAEgBSACKQIANwOQASAFQZABaiADEBlByABsaigCPCEAIAIoAgAgBSACKQIINwOIASAFIAIpAgA3A4ABIAVBgAFqIAQQGUHIAGxqIAA2AiwgAigCACEAIAUgAikCCDcDeCAFIAIpAgA3A3AgACAFQfAAaiADEBlByABsaigCKCEBIAUgAikCCDcDaCAFIAIpAgA3A2AgACAFQeAAaiABEBlByABsaiADNgIwIAIoAgAhACAFIAIpAgg3A1ggBSACKQIANwNQIAAgBUHQAGogBBAZQcgAbGooAighASAFIAIpAgg3A0ggBSACKQIANwNAIAAgBUFAayABEBlByABsaiAENgIwIAIoAgAhACAFIAIpAgg3AzggBSACKQIANwMwIAAgBUEwaiAEEBlByABsakEsagwBCyAFIAIpAgg3A4gDIAUgAikCADcDgAMgBiAFQYADaiAEEBlByABsakF/NgIsIAIoAgAgBSACKQIINwP4AiAFIAIpAgA3A/ACIAVB8AJqIAMQGUHIAGxqKAIsIQAgAigCACAFIAIpAgg3A+gCIAUgAikCADcD4AIgBUHgAmogBBAZQcgAbGogADYCKCACKAIAIAUgAikCCDcD2AIgBSACKQIANwPQAiAFQdACaiADEBlByABsaigCKCEAIAIoAgAgBSACKQIINwPIAiAFIAIpAgA3A8ACIAVBwAJqIAMQGUHIAGxqIAA2AiwgAigCACAFIAIpAgg3A7gCIAUgAikCADcDsAIgBUGwAmogAxAZQcgAbGooAjwhACACKAIAIAUgAikCCDcDqAIgBSACKQIANwOgAiAFQaACaiADEBlByABsaiAANgIoIAIoAgAhACAFIAIpAgg3A5gCIAUgAikCADcDkAIgACAFQZACaiADEBlByABsaigCKCEBIAUgAikCCDcDiAIgBSACKQIANwOAAiAAIAVBgAJqIAEQGUHIAGxqIAM2AjAgAigCACEAIAUgAikCCDcD+AEgBSACKQIANwPwASAAIAVB8AFqIAMQGUHIAGxqKAIsIQEgBSACKQIINwPoASAFIAIpAgA3A+ABIAAgBUHgAWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYASAFIAIpAgA3A9ABIAAgBUHQAWogBBAZQcgAbGpBKGoLKAIAIQEgBSACKQIINwMoIAUgAikCADcDICAAIAVBIGogARAZQcgAbGogBDYCMCACKAIAIAUgAikCCDcDGCAFIAIpAgA3AxAgBUEQaiADEBlByABsakEANgI8IAIoAgAgBSACKQIINwMIIAUgAikCADcDACAFIAQQGUHIAGxqQQA2AjwMAgsgACABQcgAbGooAiwhACACKAIAIAUgAikCCDcD2AMgBSACKQIANwPQAyAFQdADaiAEEBlByABsaiAANgIoIAIoAgAgBSACKQIINwPIAyAFIAIpAgA3A8ADIAVBwANqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A7gDIAUgAikCADcDsAMgBUGwA2ogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwOoAyAFIAIpAgA3A6ADIAAgBUGgA2ogBBAZQcgAbGooAighASAFIAIpAgg3A5gDIAUgAikCADcDkAMgACAFQZADaiABEBlByABsaiAENgIwDAELIAIoAgAgBSACKQIINwOoBiAFIAIpAgA3A6AGIAVBoAZqIAMQGUHIAGxqKAIoIQYgAigCACEHIAUgAikCCDcDmAYgBSACKQIANwOQBgJAIAcgBUGQBmogBhAZQcgAbGooAjAiB0EBa0F9Sw0AIAIoAgAgBSACKQIINwOIBiAFIAIpAgA3A4AGIAVBgAZqIAYQGUHIAGxqKAI0QQFrQX1LDQAgAigCACEGIAUgAikCCDcDuAUgBSACKQIANwOwBQJAIAYgBUGwBWogBxAZQcgAbGooAgRBAEwNACACKAIAIAUgAikCCDcDqAUgBSACKQIANwOgBSAFQaAFaiAHEBlByABsaigCBCABIABBEGoQxwQNACACKAIAIAUgAikCCDcDmAUgBSACKQIANwOQBSAFQZAFaiADEBlByABsakF/NgIoIAIoAgAgBSACKQIINwOIBSAFIAIpAgA3A4AFIAVBgAVqIAMQGUHIAGxqQX82AiwgAigCACAFIAIpAgg3A/gEIAUgAikCADcD8AQgBUHwBGogBBAZQcgAbGpBfzYCLCACKAIAIQAgBSACKQIINwPoBCAFIAIpAgA3A+AEIAAgBUHgBGogBBAZQcgAbGooAighASAFIAIpAgg3A9gEIAUgAikCADcD0AQgACAFQdAEaiABEBlByABsaiAENgI0DAILIAIoAgAgBSACKQIINwPIBCAFIAIpAgA3A8AEIAVBwARqIAQQGUHIAGxqQX82AiggAigCACAFIAIpAgg3A7gEIAUgAikCADcDsAQgBUGwBGogBBAZQcgAbGpBfzYCLCACKAIAIAUgAikCCDcDqAQgBSACKQIANwOgBCAFQaAEaiADEBlByABsakF/NgIsIAIoAgAhACAFIAIpAgg3A5gEIAUgAikCADcDkAQgACAFQZAEaiADEBlByABsaigCKCEBIAUgAikCCDcDiAQgBSACKQIANwOABCAAIAVBgARqIAEQGUHIAGxqIAM2AjAMAQsgAigCACEAIAUgAikCCDcD+AUgBSACKQIANwPwBSAAIAVB8AVqIAMQGUHIAGxqKAIoIQEgBSACKQIINwPoBSAFIAIpAgA3A+AFIAAgBUHgBWogARAZQcgAbGogAzYCMCACKAIAIQAgBSACKQIINwPYBSAFIAIpAgA3A9AFIAAgBUHQBWogAxAZQcgAbGooAighASAFIAIpAgg3A8gFIAUgAikCADcDwAUgACAFQcAFaiABEBlByABsaiAENgI0CyAFQdAGaiQAC1UCAnwBfyABQQAgAUEAShshASAAtyIDIQIDfyABIARGBH8gAyACo5siAplEAAAAAAAA4EFjBEAgAqoPC0GAgICAeAUgBEEBaiEEIAIQrQchAgwBCwsLPgECfCAAIAErAwAiAhAyOQMAIAAgASsDCCIDEDI5AwggACACIAErAxCgEDI5AxAgACADIAErAxigEDI5AxgLLAEBfyAAKAIEIgIE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RQRAAkAgASADKAK4ASACQQJ0aigCACIDECEiBUGABCABKAIAEQMABEAgBCAFNgIAQaG4BCAEECoMAQtBEBBSIgYgAzYCDCAGIAU2AgggASAGQQEgASgCABEDABoLIAMgARD0CSACQQFqIQIMAQsLIARBEGokAAsoAQF/A38gAAR/IAAoAgQQ9QkgAWpBAWohASAAKAIAIQAMAQUgAQsLC00BAn8gARAhIgMEQAJAIANB4jdBBxDqAQ0AIAAgARAhQYAEIAAoAgARAwAiAEUNACAAKAIMIQILIAIPC0GI1AFB6/sAQQxBnvcAEAAACxkAIABB5PwJQZTuCSgCABCTASIAEPQJIAAL8gECA38GfCAAIAEoAiwgASgCCCIDIAEoAgQiAUEBayICQQAgASACTxtsQQR0aiICKQMANwMQIAAgAikDCDcDGCAAIAIpAwg3AwggACACKQMANwMAQQEgAyADQQFNGyEDIAArAxghBSAAKwMIIQYgACsDECEHIAArAwAhCEEBIQEDQCABIANGBEAgACAFOQMYIAAgBjkDCCAAIAc5AxAgACAIOQMABSAFIAIgAUEEdGoiBCsDCCIJIAUgCWQbIQUgByAEKwMAIgogByAKZBshByAGIAkgBiAJYxshBiAIIAogCCAKYxshCCABQQFqIQEMAQsLCyoBAX8CQCABRQ0AIAAgARBFIgBFDQAgAC0AAEUNACAAEGhBAXMhAgsgAgtRAQF/AkACQCADRQ0AIANBOhDNASIERQ0AIARBADoAACAAIAIgAyAEQQFqIgMgAREHACAEQTo6AAAMAQsgACACIANBACABEQcACyAAIAM2AiQLXAAgASgCCEUEQCAAIAEQ1QYLIAIgAEGc3QooAgAgASsDAEQAAAAAAADwPxBMOQMAIAIgAEGg3QooAgAgASgCCBCPATYCCCACIABBpN0KKAIAIAEoAgwQjwE2AgwLlwQCCHwIfyMAQUBqIgwkACABKAIAIQ8gAisDCCEGIAIrAwAhByABKAIEIRBE////////738hA0F/IQ1BfyECA0ACQCALIBBGBEAgDyANQTBsaiIBKAIAIAIgAiABKAIEQQFrRmsiASABQQNwa0EEdGohAkEAIQEMAQsgDyALQTBsaiIBKAIEIREgASgCACESQQAhAQNAIAEgEUYEQCALQQFqIQsMAwUgEiABQQR0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dSAGQRBqJAAgBUHomws2AghBhJ0LIAUoAggQogIaQYidC0EBOgAACyAFQRBqJABBjJ0LQYSdCxDcCkGQnQtBAToAAAsgAEGMnQsoAgAiADYCACAAENsKCxEAIABB6JsLRwRAIAAQ3goLCxMAIAAgASgCACIANgIAIAAQ2woLnQEBBH8gAEG4swk2AgAgAEEIaiEBA0AgARDEAiACSwRAIAEgAhCdAygCAARAIAEgAhCdAygCABCRBQsgAkEBaiECDAELCyAAQZABahA1GiMAQRBrIgIkACACQQxqIAEQogIiASgCACIDKAIABEAgAxDfCiABKAIAGiABKAIAEJwDIAEoAgAiASgCACABEL8KGhC+CgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDACgt7AQN/IwBBEGsiBCQAIARBBGoiAiAANgIAIAIgACgCBCIDNgIEIAIgAyABQQJ0ajYCCCACIgMoAgQhASACKAIIIQIDQCABIAJGBEAgAygCACADKAIENgIEIARBEGokAAUgABCcAxogARDBCiADIAFBBGoiATYCBAwBCwsLIAAgAEGIvAk2AgAgACgCCBBmRwRAIAAoAggQmwsLIAALBABBfwumAQEDfyMAQRBrIgQkACMAQSBrIgMkACADQRhqIAAgARDGCiADQRBqIAMoAhggAygCHCACEKsLIAMoAhAhBSMAQRBrIgEkACABIAA2AgwgAUEMaiIAIAUgABD1BmtBAnUQ+wYhACABQRBqJAAgAyAANgIMIAMgAiADKAIUEKQDNgIIIARBCGogA0EMaiADQQhqEPsBIANBIGokACAEKAIMIARBEGokAAuBBgEKfyMAQRBrIhMkACACIAA2AgBBBEEAIAcbIRUgA0GABHEhFgNAIBRBBEYEQCANECVBAUsEQCATIA0Q3gE2AgwgAiATQQxqQQEQ+wYgDRDyAiACKAIAEOMKNgIACyADQbABcSIDQRBHBEAgASADQSBGBH8gAigCAAUgAAs2AgALIBNBEGokAAUCQAJAAkACQAJAAkAgCCAUai0AAA4FAAEDAgQFCyABIAIoAgA2AgAMBAsgASACKAIANgIAIAZBIBDRASEHIAIgAigCACIPQQRqNgIAIA8gBzYCAAwDCyANEPYBDQIgDUEAEJoFKAIAIQcgAiACKAIAIg9BBGo2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QQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMgCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQvQtBfxDIAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQyAJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUyACEMwBQSAQmwEhACACEFAgAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4JoLEKkCCw0AIAAgASACQQAQogcLCQAgABCSBxAYCz0BAX8gACgCGCICIAAoAhxGBEAgACABEKYDIAAoAgAoAjQRAAAPCyAAIAJBAWo2AhggAiABOgAAIAEQpgMLNAEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBAWo2AgwgASwAABCmAwsqAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEsAAAQpgMLDwAgACAAKAIAKAIYEQIACwgAIAAoAhBFCwQAQX8LLAAgACABEK4HIgFFBEAPCwJAIAMEQCAAIAEgAhCoBAwBCyAAIAEgAhC7CwsLCAAgABCLBxoLvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJC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dGpBADYCAAsgDEUEQEEAIQwMAQsgBCAMakEAOgAACyACIQALIAMoAgQgAygCLGusIAMpA3ggFXx8IRUgDiAIQQBHaiEOCyABQQFqIQQgAS0AASIBDQEMCAsLIAIhAAwBC0EBIQVBACEMQQAhAAwCCyAPIQUMAgsgDyEFCyAOQX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQmQcLFQEBfxDtAyEAQQ9B0N0KKAIAIAAbC7wCAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4SAAgJCggJAQIDBAoJCgoICQUGBwsgAiACKAIAIgFBBGo2AgAgACABKAIANgIADwsgAiACKAIAIgFBBGo2AgAgACABMgEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMwEANwMADwsgAiACKAIAIgFBBGo2AgAgACABMAAANwMADwsgAiACKAIAIgFBBGo2AgAgACABMQAANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRBAALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC28BBX8gACgCACIDLAAAQTBrIgFBCUsEQEEADwsDQEF/IQQgAkHMmbPmAE0EQEF/IAEgAkEKbCIFaiABIAVB/////wdzSxshBAsgACADQQFqIgU2AgAgAywAASAEIQIgBSEDQTBrIgFBCkkNAAsgAgv1EgISfwJ+IwBBQGoiCCQAIAggATYCPCAIQSdqIRYgCEEoaiERAkACQAJAAkADQEEAIQcDQCABIQ0gByAOQf////8Hc0oNAiAHIA5qIQ4CQAJAAkACQCABIgctAAAiCwRAA0ACQAJAIAtB/wFxIgFFBEAgByEBDAELIAFBJUcNASAHIQsDQCALLQABQSVHBEAgCyEBDAILIAdBAWohByALLQACIAtBAmoiASELQSVGDQALCyAHIA1rIgcgDkH/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KQOIAyAWIAJBAE4iARshFiAEKQOAAyAXIAEbIRcgCSAGIAhHIAJBAEhycSAVIBhCAEIAEKgDQQBHcUUgFCABIA1qIg1B7gBqTnENAEH8gAtBxAA2AgALIARB8AJqIBcgFiANENoLIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCoA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBpIAUgBSkDECICIAUpAxgiASACIAEQxQsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCoA0EATARAIAEgCiADIAkQqAMEQCABIQQMAgsgBUHwAGogASACQgBCABBpIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGkgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBpIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBpIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGkgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhB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QfWrBCADQTBqEDMLIAAgAhAdIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQezaCi0AAEECTwRAIAEQsAIgBRAhIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQeOrBCADEDMgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxDzCyAEQQFqIQQMAQsLIANB4ABqJAALyhoDD38LfAF+IwBBwARrIgIkACAAKAJIIQpB7NoKLQAAQQJPBEAgARCwAiACIAAQITYCsANBiPYIKAIAQfDwAyACQbADahAgGgsgAUEBaiEJQQEhBANAIAAoAhAiAygCtAEgBEgEQAJAAkAgABA8IAdrIhBBACAAKAIQIgMoArQBayILRw0AIAMoAgwNACADQgA3AxAgA0KAgICAgICAmcAANwMoIANCgICAgICAgJnAADcDICADQgA3AxgMAQsCQAJ/AkAgAEEEQQQgAkGgBGoQ+QNBAk0EQCACQQM2ArAEDAELQQAgAigCsARBBEcNARpBACEJIAItALwEQQJxRQ0CIApBAEHwFkEAECIiCSAKQQFB8BZBABAiIgZyDQIgAiAAECE2AqADQcifAyACQaADahAqC0EACyEGQQAhCQsgAkHoA2pBAEE4EDgaIAJCADcD4AMgAkIANwPYAyACQgA3A9ADIAJCADcDyAMgAkIANwPAAyACQgA3A7gDQQEhBwNAAkAgACgCECIDKAK0ASAHSARAIBBBAEwNASAAEBwhBwNAIAdFDQIgBygCECIDKAKAAUUEQCADIAA2AoABIAJCADcDiAQgAkIANwOABCADKwNgIRIgAysDWCERIAIgAysDUDkDmAQgAiARIBKgOQOQBCACQegDakEgECYhAyACKALoAyADQQV0aiIDIAIpA4AENwMAIAMgAikDmAQ3AxggAyACKQOQBDcDECADIAIpA4gENwMIIAYEQCACIAcgBkEAQQAQYjYCzAMgAkG4A2pBBBAmIQMgAigCuAMgA0ECdGogAigCzAM2AgALIAIgBzYC5AMgAkHQA2pBBBAmIQMgAigC0AMg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EBwhAwNAIAMEQCADKAIQQQA2ArgBIAAgAxAdIQMMAQsLQezaCi0AAEECTwRAIAEoAhAhAyAFIAAQITYC5AEgBSADNgLgAUGI9ggoAgBBjfkDIAVB4AFqECAaCyABIAEoAhBBAWo2AhAgBUG88AkoAgA2AtwBQdKnASAFQdwBakEAEOMBIgpB4iVBmAJBARA2GkE4EFIhAyAKKAIQIAM2AowBIAAQOSEDIAooAhAgAygCEC8BsAE7AbABIAAgCkHa3AAQuQcgACAKQZjbABC5ByAAIApBsNgBELkHIAVBqAJqIQggBUGgAmohDCAFQZgCaiELQQEhDwNAIAAoAhAiAygCtAEgD04EQCADKAK4ASAPQQJ0aigCACIEEJQEIAogBBAhELgHIgYoAhAiAyAJNgKIASADIAQ2AugBAkACQCABKAIEIgdFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiAEIAcQRSIDLQAARQ0AIAEoAgAgBEcEQCADIAQoAkQgBxBFEE1FDQELIAVBADoA+AEgBSALNgLEASAFIAw2AsgBIAUgCDYCzAEgBSAFQfgBajYC0AEgBSAFQZACajYCwAEgA0H4vgEgBUHAAWoQUUEETgRAIAUrA6gCIRogBSsDoAIhHSAFKwOYAiEbIAUrA5ACIRxBgNsKKwMAIh5EAAAAAAAAAABkBEAgGyAeoyEbIBwgHqMhHCAdIB6jIR0gGiAeoyEaCyAGKAIQQQNBAkEBIAUtAPgBIgNBP0YbIANBIUYbOgCHAQwCCyAEECEhByAFIAM2ArQBIAUgBzYCsAFBh+sDIAVBsAFqECoLRP///////+//IR1E////////738hHAsgCUEBaiEJIAQQHCEDA0AgAwRAIAMoAhAgBjYCuAEgBCADEB0hAwwBCwsgBigCECIDLQCHAQRAIAMoApQBIgMgGiAboEQAAAAAAADgP6I5AwggAyAdIBygRAAAAAAAAOA/ojkDAAsgD0EBaiEPDAELCyAAEBwhAwJ/AkADQCADBEACQCADKAIQIgQoArgBDQACQCAEKALoASIGRQ0AIAYgACgCECgCjAEoAjBGDQAgAxAhIQEgABAhIQAgBSADKAIQKALoARAhNgKoASAFIAA2AqQBIAUgATYCoAFBiv0EIAVBoAFqEDcM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QRhqCyILKwMIIQggCysDACEHAn8gASgCECIAKAIEIAFGBEAgACgCAAwBCyABQRhqCyIAKwMIIQkgACsDACEKIAJBfyAHIAShIgcgBSADoaIgCCADoSIFIAYgBKGioSIGRAAAAAAAAAAAZCAGRAAAAAAAAAAAYxsiADYCACACQX8gByAJIAOhoiAFIAogBKGioSIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsiATYCBCACIAAgAWw2AggLTQECfAJ/QQEgACgCACIAKwMAIgIgASgCACIBKwMAIgNkDQAaQX8gAiADYw0AGkEBIAArAwgiAiABKwMIIgNkDQAaQX9BACACIANjGwsLzg8DEH8KfAF+IwBBsAFrIgIkACABQQAgAUEAShshDyABQSgQGiENA0AgAyAPRkUEQCAAIANBAnRqKAIAKAIEIApqIQogA0EBaiEDDAELCyAKQRgQGiIOQRhrIQYDQCAIIA9HBEAgDSAIQShsaiIEIA4gB0EYbGo2AgAgACAIQQJ0aigCACILKAIEIQxBACEDRP///////+9/IRJE////////7/8hE0T////////v/yEVRP///////+9/IRQDQCADIAxGBEAgBCATOQMgIAQgFTkDGCAEIBI5AxAgBCAUOQMIIAQgBiAHQRhsajYCBCAIQQFqIQgMAwUgCygCACADQQR0aiIFKwMAIRYgBSsDCCEXIA4gB0EYbGoiBUEANgIUIAUgBDYCECAFIBc5AwggBSAWOQMAIANBAWohAyAHQQFqIQcgEyAXECMhEyAVIBYQIyEVIBIgFxApIRIgFCAWECkhFAwBCwALAAsLIAJCADcDiAEgAkIANwOAASACQgA3A3hBACEDIApBBBAaIQwCQANAIAMgCkYEQAJAIAwgCkEEQeADELUBIAJBjAFqIRBBACELA0AgCiALRg0BIAIgDCALQQJ0aiIRKAIAIgM2AnQgAgJ/IAMoAhAiBCgCACADRgRAIAQoAgQMAQsgA0EYawsiBTYCcEEAIQgDQAJAAkAgCEECRwRAAkAgAkH0AGogAkHwAGoQzQxBAWoOAwADAgMLIAVBGGohB0EAIQMDQAJAIAIoAoABIANLBEAgAiACKQOAATcDWCACIAIpA3g3A1AgAigCeCACQdAAaiADEBlBAnRqKAIAIgYgBSACQZQBaiIJEMwMIAIoApwB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dGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJEBAAsLMQEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxC2ARoLIAAgASADajYCBAt+AQN/IAAoAgAiAUE0aiABKAI4IQMgASgCNCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARC0DSAAKAIEIgFBKGogASgCLCEDIAEoAighAQNAAkAgASADRg0AIAEoAgAgAEYNACABQQRqIQEMAQsLIAEQtA0L6gEBCH8gAEHTrAMQ0QIhAiABKAIAIQYjAEEQayIDJAAgA0EIaiIEIAIQqQUaAkAgBC0AAEUNACACIAIoAgBBDGsoAgBqIgUoAgQaIANBBGoiBCAFEFMgBBC6CyEFIAQQUCADIAIQuQshByACIAIoAgBBDGsoAgBqIggQuAshCSADIAUgBygCACAIIAkgBiAFKAIAKAIQEQgANgIEIAQQpwVFDQAgAiACKAIAQQxrKAIAakEFEKoFCyADQQhqEKgFIANBEGokACACQdjgARDRAiABKAIgKwMQIAErAxigEJEH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EiACQQJ0akF/NgIAIAJBAWohAgwBCwtBhscBQZa3AUGLBkGBDhAAAAtBhscBQZa3AUGkBkGBDhAAAAtBhscBQZa3AUG4BkGBDhAAAAtBh9ABQZa3AUHQBUGBDhAAAAsgFEEQaiQAIA8L2AYCCn8BfCMAQRBrIgokACAAKAIgRQRAAkACQCAAKAIQQQFrIgQOBAEAAAEAC0HU0AFBlrcBQZAFQcg1EAAACyACKAIAIQUgACgCACEDIAAoAhghBiAAKAIUIQcCQAJAAkACQCAEDgQAAgIBAgsgACgCHCEJIAEEQCAFRQRAIANBCBA/IQULQQAhBCADQQAgA0EAShshAwNAIAMgBEYNBCAFIARBA3RqIgtCADcDACAHIARBAnRqKAIAIgAgByAEQQFqIgRBAnRqKAIAIgggACAIShshCEQAAAAAAAAAACENA0AgACAIRgRADAIFIAsgCSAAQQN0aisDACABIAYgAEECdGooAgBBA3RqKwMAoiANoCINOQMAIABBAWohAAwBCwALAAsACyAFRQRAIANBCBA/IQULQQAhASADQQAgA0EAShshBANAIAEgBEYNAyAFIAFBA3RqIgNCADcDACAHIAFBAnRqKAIAIgAgByABQQFqIgFBAnRqKAIAIgYgACAGShshBkQAAAAAAAAAACENA0AgACAGRgRADAIFIAMgCSAAQQN0aisDACANoCINOQMAIABBAWohAAwBCwALAAsACyAAKAIcIQkgAQRAIAVFBEAgA0EIED8hBQtBACEEIANBACADQQBKGyEDA0AgAyAERg0DIAUgBEEDdGoiC0IANwMAIAcgBEECdGooAgAiACAHIARBAWoiBEECdGooAgAiCCAAIAhKGyEIRAAAAAAAAAAAIQ0DQCAAIAhGBEAMAgUgCyAJIABBAnQiDGooAgC3IAEgBiAMaigCAEEDdGorAwCiIA2gIg05AwAgAEEBaiEADAELAAsACwALIAVFBEAgA0EIED8hBQtBACEBIANBACADQQBKGyEEA0AgASAERg0CIAUgAUEDdGoiA0IANwMAIAcgAUECdGooAgAiACAHIAFBAWoiAUECdGooAgAiBiAAIAZKGyEGRAAAAAAAAAAAIQ0DQCAAIAZGBEAMAgUgAyANIAkgAEECdGooAgC3oCINOQMAIABBAWohAAwBCwALAAsACyAKQcMFNgIE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AxggBiAAKALsAUHIAGxqIgEgASsDECAAKwN4ECM5AxALC4kDAgZ/BHwgABBhKAIQKALEASEFIAAQYSAARgR8RAAAAAAAACBABSAAQczbCigCAEEIQQAQYrcLIQkgACgCECIBKwOAASEHIAErA3ghCEEBIQIDQCACIAEoArQBSkUEQCABKAK4ASACQQJ0aigCACIBEO0NIQYgASgCECIEKALsASAAKAIQIgEoAuwBRgRAIAggCSAEKwN4oCIKIAggCmQbIQgLIAQoAugBIAEoAugBRgRAIAcgCSAEKwOAAaAiCiAHIApkGyEHCyADIAZyIQMgAkEBaiECDAELCyAAEGEhAiAAKAIQIQECQCAAIAJGDQAgASgCDEUNACAAEDlBASEDIAAoAhAhASgCEC0AdEEBcQ0AIAcgASsDWKAhByAIIAErAzigIQgLIAEgBzkDgAEgASAIOQN4IAAQYSAARwRAIAUgACgCECIAKALoAUHIAGxqIgEgASsDGCIJIAcgByAJYxs5AxggBSAAKALsAUHIAGxqIgAgACsDECIHIAggByAIZBs5AxALIAMLcAECf0EBIQQDQCAEIAAoAhAiAygCtAFKRQRAIAMoArgBIARBAnRqKAIAIAEgAhDuDSAEQQFqIQQMAQsLIAMgASADKwMQojkDECADIAIgAysDGKI5AxggAyABIAMrAyCiOQMgIAMgAiADKwMoojkDKAvlBAIIfwR8QQEhAgNAIAIgACgCECIDKAK0AUpFBEAgAygCuAEgAkECdGooAgAgARDvDSACQQFqIQIMAQsLIAAQYSECIAAoAhAhAwJAIAAgAkYEQCADKALsASEFRAAAwP///9/BIQpEAADA////30EhCyADKALoASIIIQQDQCAEIAVKBEAgAygCtAEiAEEAIABBAEobQQFqIQBBASECA0AgACACRg0EIAogAygCuAEgAkECdGooAgAoAhAiBCsDIEQAAAAAAAAgQKAiDCAKIAxkGyEKIAsgBCsDEEQAAAAAAAAgwKAiDCALIAxjGyELIAJBAWohAgwACwAFAkAgAygCxAEgBEHIAGxqIgAoAgAiBkUNAEEBIQIgACgCBCIHKAIAIgBFDQADQCAAKAIQIgAtAKwBIglFIAIgBk5yRQRAIAcgAkECdGooAgAhACACQQFqIQIMAQsLIAkNACAGQQJrIQIgACsDECAAKwNYoSEMIAcgBkECdGpBBGshAANAIAAoAgAoAhAiAC0ArAEEQCAHIAJBAnRqIQAgAkEBayECDAELCyAKIAArAxAgACsDYKAiDSAKIA1kGyEKIAsgDCALIAxjGyELCyAEQQFqIQQMAQsACwALIAMoAugBIQggAygC7AEhBSADKAKEAigCECgC9AG3IQogAygCgAIoAhAoAvQBtyELCyABKAIQKALEASIAIAVByABsaigCBCgCACgCECsDGCEMIAAgCEHIAGxqKAIEKAIAKAIQKwMYIQ0gAyAKOQMgIAMgCzkDECADIA0gAysDgAGgOQMoIAMgDCADKwN4oTkDGAuiAQICfAF/AkACf0H/////ByAAQdQgECciA0UNABogABA8IQAgAxCuAiEBIABBAEgNAUEAIAFEAAAAAAAAAABjDQAaIAC4IQIgAUQAAAAAAADwP2QEQEH/////B0QAAMD////fQSABoyACYw0BGgsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4Cw8LQc+YA0GH/ABBzQBBztkAEAAAC4gCAgd/AXwjAEEQayIEJAAgAEHM2wooAgBBCEEAEGIgABDtBbchCCAAKAIQIgEoAugBIQMgASgChAIhBSABKAKAAiEGA0AgAyABKALsAUpFBEACQCADQcgAbCIHIAEoAsQBaiICKAIARQ0AIAIoAgQoAgAiAkUEQCAAECEhASAEIAM2AgQgBCABNgIAQdu0BCAEEDcMAQsgBiACIAIoAhArA1ggCKAgASsDYKBBABCfARogACgCECIBKALEASAHaiICKAIEIAIoAgBBAnRqQQRrKAIAIgIgBSACKAIQKwNgIAigIAErA0CgQQAQnwEaCyADQQFqIQMgACgCECEBDAELCyAEQRBqJAAL2wICCn8BfCAAQczbCigCAEEIQQAQYiEHQQEhAQNAIAAoAhAiBSgCtAEiBCABSARAIAe3IQtBASEBA0AgASAESkUEQCABQQJ0IQkgAUEBaiIHIQEDQCAFKAK4ASICIAlqKAIAIQMgASAESkUEQCACIAFBAnRqKAIAIgYgAyADKAIQKALoASAGKAIQKALoAUoiAhsiCCgCECIKKALsASADIAYgAhsiAygCECIGKALoASICTgRAIAggAyACQcgAbCICIAooAsQBaigCBCgCACgCECgC+AEg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P2UNACAAEPENIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEJ8BGgsCQCAAQQIgABDwDRDMBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCiAFTgRAQQAhCCACKALEASAFQcgAbGoiBygCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgBygCBCABQQJ0aigCACIIKAIQIgsoApACIg1FDQADQCANIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSIMQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIAxBA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCygCiAIiC0UNAANAIAsgBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIg1BA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACANQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABDwDRDMBEUNA0GImwNBprsBQY0BQbHiABAAAAsgASEDCwJAIAhFIAMgCUhyRQRAIAdBzABBvH8gBSAKSBtqKAIAKAIAIgJFDQEgBygCBCgCACEDIAAQugIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCfARogASACRAAAAAAAAAAAQQAQnwEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAAKAIQIQILIAVBAWohBQwBCwtB0toAQaa7AUH2AEGO+gAQAAALIAAoAhAiASgC7AEhBSABKALoASECIAEoAsQBIQQDQCACIAVMBEBBACEBIAQgAkHIAGxqIgcoAgAiA0EAIANBAEobIQYDQCABIAZHBEAgBygCBCABQQJ0aigCACgCECIDKAL0ASEIIAMgAjYC9AEgAyAItzkDECABQQFqIQEMAQsLIAJBAWohAgwBCwsgACAAEO8NAkAgACgCECIBKALsAUEATA0AIAEoAggiAigCVCIFRQ0AIAErACgiESABKwAYoSIUIAErACAiEiABKwAQoSIVIAEoAnRBAXEiAxshEyAVIBQgAxshFAJAAnwCQAJAAkACQAJAIAVBAWsOBQQABwEDBwsgAisD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IAJB7BxqENAEIQcgAigC7BwhAwwBCyACQegMaiACQewcahDPBCEHIBogAigC7BwiA0EFSXINACAHIAcpAwA3AxAgByAHKQMINwMYIAcgByADQQR0akEQayIDKQMANwMgIAcgAykDCDcDKCADKQMAIWUgByADKQMINwM4IAcgZTcDMCACQQQ2AuwcQQQMAQsgA0UNASADCyEGQQAhAwwBCyAHEBhBACEDA0AgAigCmB0gA00EQCACQZAdaiIDQSAQMSADEDRBACEDA0AgAigC+B0gA00EQCACQfAdaiIDQRAQMSADEDRBACEDA0AgAigC0B0gA00EQCACQcgdaiIDQRAQMSADEDQMCwUgAkHwCWogAkHQHWopAwA3AwAgAiACKQPIHTcD6AkgAkHoCWogAxAZIQUCQAJAIAIoAtgdIgQOAgETAAsgAkHgCWogAigCyB0gBUEEdGoiBSkDCDcDACACIAUpAwA3A9gJIAJB2AlqIAQRAQALIANBAWohAwwBCwALAAUgAkHQCWogAkH4HWopAwA3AwAgAiACKQPwHTcDyAkgAkHICWogAxAZIQUCQAJAIAIoAoAeIgQOAgERAAsgAkHACWogAigC8B0gBUEEdGoiBSkDCDcDACACIAUpAwA3A7gJIAJBuAlqIAQRAQALIANBAWohAwwBCwALAAUgAkGwCWogAkGYHWopAwA3AwAgAiACKQOQHTcDqAkgAkGoCWogAxAZIQUCQAJAIAIoAqAdIgQOAgEPAAsgAkGQCWogAigCkB0gBUEFdGoiBSkDCDcDACACQZgJaiAFKQMQNwMAIAJBoAlqIAUpAxg3AwAgAiAFKQMANwOICSACQYgJaiAEEQEACyADQQFqIQMMAQsACwALA0AgAyAGSQRAIAwgByADQQR0aiIGKQMANwMAIAwgBikDCDcDCCACQfAdakEQECYhBiACKALwHSAGQQR0aiIGIAwpAwA3AwAgBiAMKQMINwMIIANBAWohAyACKALsHCEGDAELCyAHEBggCiEDA0AgCCgCACgCyAEoAgAhBiADBEAgA0EBayEDIAZBUEEAIAYoAgBBA3FBAkcbaigCKEEQaiEIDAELCyACKAL4HSIHBEAgAkHoCmogAkH4HWoiAykDADcDACACIAIpA/AdNwPgCiAMIAIoAvAdIAJB4ApqIAdBAWsQGUEEdGoiBykD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Dg0FIAIoAqwEIQggAigCqAQhCwJAAkACQCAJQQFqDgMAAQIDCyADKAIAIAIgAykCCDcDYCACIAMpAgA3A1ggAkHYAGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDUCACIAMpAgA3A0ggAkHIAGogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAkFAayADKQIINwMAIAIgAykCADcDOCACQThqIAAQGUECdGooAgAgAygCACACIAMpAgg3AzAgAiADKQIANwMoIAJBKGogBRAZQQJ0aigCACAHQQEgCyABELgCIAhBAUcNAiADKAIAIAIgAykCCDcDICACIAMpAgA3AxggAkEYaiAFEBlBAnRqKAIAIAMoAgAgAiADKQIINwMQIAIgAykCADcDCCACQQhqIAAQGUECdGooAgAgByABEJcODAILAkACQAJAIAhBAWoOAwABAgQLIAMoAgAgAiADKQIINwOgASACIAMpAgA3A5gBIAJBmAFqIAAQGUECdGooAgAgAygCACACIAMpAgg3A5ABIAIgAykCADcDiAEgAkGIAWogBRAZQQJ0aigCACAEQQAgBiABELgCIAMoAgAgAiADKQIINwOAASACIAMpAgA3A3ggAkH4AGogABAZQQJ0aigCACADKAIAIAIgAykCCDcDcCACIAMpAgA3A2ggAkHoAGogBRAZQQJ0aigCACAHQQEgCyABELgCDAMLIAMoAgAgAiADKQIINwPgASACIAMpAgA3A9gBIAJB2AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A9ABIAIgAykCADcDyAEgAkHIAWogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwPAASACIAMpAgA3A7gBIAJBuAFqIAUQGUECdGooAgAgAygCACACIAMpAgg3A7ABIAIgAykCADcDqAEgAkGoAWogABAZQQJ0aigCAEEBIAcgCyABELgCDAILIAMoAgAgAiADKQIINwOgAiACIAMpAgA3A5gCIAJBmAJqIAUQGUECdGooAgAgAygCACACIAMpAgg3A5ACIAIgAykCADcDiAIgAkGIAmogABAZQQJ0aigCAEEAIAQgBiABELgCIAMoAgAgAiADKQIINwOAAiACIAMpAgA3A/gBIAJB+AFqIAUQGUECdGooAgAgAygCACACIAMpAgg3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QbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhggCSACQQggCSgCABEDACECDAELCyAIIARB0AJqQYAEIAgoAgARAwAhAgNAAkAgASsDQCEbIAJFDQAgAisDECAbY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCGCAIIAJBCCAIKAIAEQMAIQIMAQsLIAQgGzkD2AIgCSAEQdACakGABCAJKAIAEQMAIQIDQAJAIAErAzghGyACRQ0AIAIrAwggG2NFDQAgBCACKAIANgLMAiAEQbgCakEEECYhCiAEKAK4AiAKQQJ0aiAEKALMAjYCACACKAIAIAE2AhQgCSACQQggCSgCABEDACECDAELCyAEIBs5A9ACIAQgASsDMDkD2AIgCCAEQdACakGABCAIKAIAEQMAIQIDQAJAIAJFDQAgAisDECABKwNAY0UNACAEIAIoAgA2AswCIARBuAJqQQQQJiEKIAQoArgCIApBAnRqIAQoAswCNgIAIAIoAgAgATYCFCAIIAJBCCAIKAIAEQMAIQIMAQsLIARBuAJqIAFBJGogAUEgakEEEMcBIAEoAiAiASAMIAEgDEsbIQwgBkEBaiEGDAELCwNAIBAgEUYEQCAAKAIQIAAoAgAiAUEobGoiAyABNgIgIAMgAUEBajYCSEEAIQMgACgCAEEGbCAMQQF0akEEEBohAiAAIAAoAgBBA2wgDGpBGBAaNgIUIAAoAgAiBkEAIAZBAEobIQEDQCABIANGBEAgBkECaiEDA0AgASADSARAIAAoAhAgAUEobGogAjYCHCABQQFqIQEgAiAMQQJ0aiECDAELCwUgACgCECADQShsaiACNgIcIANBAWohAyACQRhqIQIMAQsLQQAhBgJAAkADQCAGIA9GBEACQCAIEJkBGiAJEJkBGiALEBhBACEBQYj2CCgCACECA0AgASAAKAIATg0BIAAoAhAgAUEobGoiAygCFEUEQCAEIAE2AhAgAkH4zAQgBEEQahAgGiADKAIURQ0FCyADKAIYRQRAIAQgATYCACACQeLMBCAEECAaIAMoAhhFDQYLIAFBAWohAQwACwALBSASIAZByABsaiIBKwM4IAErAyihIhsgASsDQCABKwMwoSIfoEQAAAAAAADg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EmogBhAZQcgAbGogBTYCKAsgAigCACEGIARBkBJqIAIpAgg3AwAgBCACKQIANwOIEgJAIAYgBEGIEmogBRAZQcgAbGooAjQiBkEBa0F9Sw0AIAIoAgAgBEGAEmogAikCCDcDACAEIAIpAgA3A/gRIARB+BFqIAYQGUHIAGxqKAIsIAlHDQAgAigCACAEQfARaiACKQIINwMAIAQgAikCADcD6BEgBEHoEWogBhAZQcgAbGogBTYCLAsgAxDvASEHIAMQ7wEhCiACKAIAIARB4BFqIAIpAgg3AwAgBCACKQIANwPYESAEQdgRaiAJEBlByABsaigCOCEGIAMoAgAgBEHQEWogAykCCDcDACAEIAMpAgA3A8gRIARByBFqIAYQGUEobGpBAjYCACADKAIAIARBwBFqIAMpAgg3AwAgBCADKQIANwO4ESAEQbgRaiAGEBlBKGxqIg4gCCkDADcDCCAOIAgpAwg3AxAgAygCACAEQbARaiADKQIINwMAIAQgAykCADcDqBEgBEGoEWogBhAZQShsaiAANgIEIAMoAgAgBEGgEWogAykCCDcDACAEIAMpAgA3A5gRIARBmBFqIAYQGUEobGogCjYCICADKAIAIARBkBFqIAMpAgg3AwAgBCADKQIANwOIESAEQYgRaiAGEBlBKGxqIAc2AiQgAygCACAEQYARaiADKQIINwMAIAQgAykCADcD+BAgBEH4EGogBxAZQShsakEDNgIAIAMoAgAgBEHwEGogAykCCDcDACAEIAMpAgA3A+gQIARB6BBqIAcQGUEobGogCTYCGCADKAIAIARB4BBqIAMpAgg3AwAgBCADKQIANwPYECAEQdgQaiAHEBlBKGxqIAY2AhwgAygCACAEQdAQaiADKQIINwMAIAQgAykCADcDyBAgBEHIEGogChAZQShsakEDNgIAIAMoAgAgBEHAEGogAykCCDcDACAEIAMpAgA3A7gQIARBuBBqIAoQGUEobGogBTYCGCADKAIAIARBsBBqIAMpAgg3AwAgBCADKQIANwOoECAEQagQaiAKEBlBKGxqIAY2AhwgAigCACAEQaAQaiACKQIINwMAIAQgAikCADcDmBAgBEGYEGogCRAZQcgAbGogBzYCOCACKAIAIARBkBBqIAIpAgg3AwAgBCACKQIANwOIECAEQYgQaiAFEBlByABsaiAK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IAIoAgAgBEGIDGogAikCCDcDACAEIAIpAgA3A4AMIARBgAxqIAkQGUHIAGxqKwMYoZlESK+8mvLXej5lRSALRXINAAJAIBMoAgAiBUEATA0AIAUgASAHEMcERQ0AIAIoAgAhBSAEQbgLaiACKQIINwMAIAQgAikCADcDsAsgBSAEQbALaiAIEBlByABsaigCMCEHIARBqAtqIAIpAgg3AwAgBCACKQIANwOgCyAFIARBoAtqIAcQGUHIAGxqIAg2AiggAigCACAEQZgLaiACKQIINwMAIAQgAikCADcDkAsgBEGQC2ogBhAZQcgAbGpBfzYCMCACKAIAIARBiAtqIAIpAgg3AwAgBCACKQIANwOACyAEQYALaiAGEBlByABsakF/NgI0DAILIAIoAgAhBSAEQfgLaiACKQIINwMAIAQgAikCADcD8AsgBSAEQfALaiAGEBlByABsaigCMCEHIARB6AtqIAIpAgg3AwAgBCACKQIANwPgCyAFIARB4AtqIAcQGUHIAGxqIAY2AiwgAigCACAEQdgLaiACKQIINwMAIAQgAikCADcD0AsgBEHQC2ogCBAZQcgAbGpBfzYCMCACKAIAIARByAtqIAIpAgg3AwAgBCACKQIANwPACyAEQcALaiAIEBlByABsakF/NgI0DAELIAIoAgAhBSAEQfgKaiACKQIINwMAIAQgAikCADcD8AogBSAEQfAKaiAIEBlByABsaigCMCEHIARB6ApqIAIpAgg3AwAgBCACKQIANwPgCgJAIAUgBEHgCmogBxAZQcgAbGooAihBAWtBfUsNACACKAIAIQUgBEHYCmogAikCCDcDACAEIAIpAgA3A9AKIAUgBEHQCmogCBAZQcgAbGooAjAhByAEQcgKaiACKQIINwMAIAQgAikCADcDwAogBSAEQcAKaiAHEBlByABsaigCLEEBa0F9Sw0AIAIoAgAhBSAEQbgKaiACKQIINwMAIAQgAikCADcDsAogBSAEQbAKaiAIEBlByABsaigCMCEHIARBqApqIAIpAgg3AwAgBCACKQIANwOgCiAFIARBoApqIAcQGUHIAGxqKAIoIQcgAigCACEFIARBmApqIAIpAgg3AwAgBCACKQIANwOQCiAFIARBkApqIAgQGUHIAGxqKAIwIQogBEGICmogAikCCDcDACAEIAIpAgA3A4AKIAUg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aCAEIAIpAgA3A2AgBSAEQeAAaiAHEBlByABsaiAGNgIoIAIoAgAhBSAEIAIpAgg3A1ggBCACKQIANwNQIAUgBEHQAGogCBAZQcgAbGooAjQhByAEIAIpAgg3A0ggBCACKQIANwNAIAUgBEFAayAHEBlByABsakF/NgIsIAIoAgAgBCACKQIINwM4IAQgAikCADcDMCAEQTBqIAgQGUHIAGxqQX82AjQgAigCACAEIAIpAgg3AyggBCACKQIANwMgIARBIGogCBAZQcgAbGpBMGoMAQsgB0F/NgIsIAIoAgAhBSAEIAIpAgg3A/gBIAQgAikCADcD8AEgBSAEQfABaiAIEBlByABsaigCNCEHIAQgAikCCDcD6AEgBCACKQIANwPgASAFIARB4AFqIAcQGUHIAGxqIAg2AiggAigCACEFIAQgAikCCDcD2AEgBCACKQIANwPQASAFIARB0AFqIAgQGUHIAGxqKAI0IQcgBCACKQIINwPIASAEIAIpAgA3A8ABIAUgBEHAAWogBxAZQcgAbGogBjYCLCACKAIAIAQgAikCCDcDuAEgBCACKQIANwOwASAEQbABaiAIEBlByABsaigCNCEFIAIoAgAgBCACKQIINwOoASAEIAIpAgA3A6ABIARBoAFqIAYQGUHIAGxqIAU2AjAgAigCACAEIAIpAgg3A5gBIAQgAikCADcDkAEgBEGQAWogBhAZQcgAbGpBfzYCNCACKAIAIAQgAikCCDcDiAEgBCACKQIANwOAASAEQYABaiAIEBlByABsakE0agsoAgAhBSACKAIAIAQgAikCCDcDGCAEIAIpAgA3AxAgBEEQaiAIEBlByABsaiAANgIEIAIoAgAgBCACKQIINwMIIAQgAikCADcDACAEIAYQGUHIAGxqIAA2AgAMAAsAC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALySADEH8CfAJ+IwBBkAlrIgQkACAEQaAIaiIJQQBBwAAQOBogAEEAQeAAEDgiBUHIABAmIQAgBSgCACAAQcgAbGogBUEYakHIABAfGiADKAIAIRMgCRDvASEJIARBmAhqIARBqAhqIgApAwA3AwAgBCAEKQOgCDcDkAggBCgCoAggBEGQCGogCRAZQShsakECNgIAIARBiAhqIAApAwA3AwAgBCAEKQOgCDcDgAggBCgCoAggBEGACGog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AiACKAIAQQNxIQMLIAIgBiADQQNGGygCKCAFRw0CQZDdCigCACIDRQ0CIAIgAxBFIgMtAABFDQIgAUGwAmogAiADEMAODAILA0ACQCADIARPBEAgAUHgAmpBHBAxQQAhA0EAIQIDQCACIAEoArgCIgRPDQIgASABKQK4AjcD+AEgASABKQKwAjcD8AEgASgCsAIgAUHwAWogAhAZQRxsaigADEECTwRAIAEgASkCuAI3A+gBIAEgASkCsAI3A+ABIAEgASgCsAIgAUHgAWogAhAZQRxsaiIEKQIUNwPYASABIAQpAgw3A9ABIAEgBCkCBDcDyAEgBSABQcgBahDBDgsgAkEBaiECDAALAAsgASABKQLoAjcDwAEgASABKQLgAjcDuAEgAUG4AWogAxAZIQICQAJAIAEoAvACIgQOAgEJAAsgASABKALgAiACQRxsaiICKQIINwOgASABIAIpAhA3A6gBIAEgAigCGDYCsAEgASACKQIANwOYASABQZgBaiAEEQEACyADQQFqIQMgASgC6AIhBAwBCwsDQCADIARPBEAgAUGwAmpBHBAxIAAgBRAdIQUMBQUgASABKQK4AjcDqAIgASABKQKwAjcDoAIgAUGgAmogAxAZIQICQAJAIAEoAsACIgQOAgEJAAsgASABKAKwAiACQRxsaiICKQIINwOIAiABIAIpAhA3A5ACIAEgAigCGDYCmAIgASACKQIANwOAAiABQYACaiAEEQEACyADQQFqIQMgASgCuAIhBAwBCwALAAsgAUHgAmogAiADEMAOCyAAIAIgBRByIQIMAAsACwALIAFBkANqJAAPC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwALHAEBf0EBIQIgACABENIOBH9BAQUgACABENEOCwtAAQJ/AkAgASAAKAIATw0AIAIgACgCBCIETw0AIAAoAgggASAEbCACaiIAQQN2ai0AACAAQQdxdkEBcSEDCyADC84CAQp/AkACQCAABEAgACgCACIFIAFLIAAoAgQiBCACS3FFBEAgBCACQQFqIgMgAyAESRsiBCAFIAFBAWoiAyADIAVJGyIFbCIDQQN2IANBB3FBAEdqEMYDIQcgACgCACEIA0AgBiAIRwRAIAQgBmwhCSAAKAIEIQpBACEDA0AgAyAKRgRAIAZBAWohBgwDCyAAIAYgAxDEDgRAIAcg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A0HMAGohCgJAA0AgAgRAAkAgAigCECIEIAhqKAIAKAIADQAgBCgCsAENACAEQQE2ArABIAMgAjYCTCADQThqQQQQJiEEIAMoAjggBEECdGogAygCTDYCAANAIAMoAkBFDQEgA0E4aiAKEKEEIAMoAkwiBSgCEC0AtQFBB0cEQCAAIAUQ0A4EQEEAIQIDQCADKAJAIAJNBEBBfyEEDAgFIAMgA0FAaykDADcDMCADIAMpAzg3AyggA0EoaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAELAAsACyADQThqIAUgARDPDgwBCyADQThqIQtBACEEAkAgAUEBaiIMIAUoAhAoAugBIgYoAhAiBSwAkQJGDQAgBSgC6AEhBQNAIAYoAhAiBCgC7AEiByAFTgRAIAVBAnQhByAFQQFqIQUgACAHIAQoAowCaigCABDQDiIERQ0BDAILCyAEKALoASEFA0AgBSAHTARAIAsgBCgCjAIgBUECdGooAgAgARDPDiAFQQFqIQUgBigCECIEKALsASEHDAELCyAEIAw6AJECQQAhBAsgBEUNAAtBACECA0AgAiADKAJATw0EIAMgA0FAaykDADcDICADIAMpAzg3AxggA0EYaiACEBkhAAJAAkACQCADKAJIIgEOAgIAAQsgAygCOCAAQQJ0aigCABAYDAELIAMoAjggAEECdGooAgAgAREBAAsgAkEBaiECDAALAAsgAigCECAJaigCACECDAELC0Ho/QooAgAhBSAAKAIQIgIoAugBIQQDQCACKALsASAETgRAIARByABsIgEgBSgCECgCxAFqQQA6ADECQCACLQB0QQFxRQ0AIAIoAsQBIAFqIgEoAgAiBkEATA0AIAZBAWsiBkEBdkEBaiEHIAEoAgQhAUEAIQIDQCACIAdHBEAgASACQQJ0aigCACABIAYgAmtBAnRqKAIAEJcIIAJBAWohAgwBCwsgACgCECECCyAEQQFqIQQMAQsLAkAgABBhIABHDQAQyQRCAFcNACAAQQAQlggLQQAhBEEAIQIDQCACIAMoAkBPDQEgAyADQUBrKQMANwMQIAMgAykDODcDCCADQQhqIAIQGSEAAkACQAJAIAMoAkgiAQ4CAgABCyADKAI4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IQILIAMgASACIAYQ6w4gASECCyAAIAYQMCEGDAALAAsACyAAEOoODAELIAAgA0EAQQAQ6Q4gAxAcIQEDQCABBEAgASgCECICQQA6ALQBIAJBADYCsAEgAyABEB0hAQwBCwsgAxAcIQEDQCABBEAgAyABEOgOIAMgARAdIQEMAQsLIAMQHCEBA0AgAQRAIAEoAhBBADYCkAEgAyABEB0hAQwBCwtBACEJIAMQHCEBA0AgAQRAIAEoAhAoApABRQRAIAMgASAJQQFqIgkQoAgLIAMgARAdIQEMAQsLAkAgCUECSA0AIANB5xwQygQhAiADEBwhAUEBIQgDQCABRQ0BIAggASgCECgCkAFGBEAgAyACIAFBAEEBEF4aIAhBAWohCAsgAyABEB0hAQwACwALIAMQHCEHA0AgBwRAIAMgBxAsIQEDQCABBEAgBygCECICKALIASACKALMASICQQFqIAJBAmoQ2gEhBCAHKAIQIgIgBDYCyAEgAiACKALMASICQQFqNgLMASAEIAJBAnRqIAE2AgAgBygCECICKALIASACKALMAUECdGpBADYCACABIAFBMGsiBSABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEASICQQFqIAJBAmoQ2gEhAiABIAUgASgCAEEDcUECRhsoAigoAhAgAjYCwAEgASAFIAEoAgBBA3FBAkYbKAIoKAIQIgQgBCgCxAEiAkEBajYCxAEgBCgCwAEgAkECdGogATYCACABIAUgASgCAEEDcUECRhsoAigoAhAiAigCwAEgAigCxAFBAnRqQQA2AgAgAyABEDAhAQwBCwsgAyAHEB0hBwwBCwsgA0EBIBAgAEGnhwEQJyICBH8gAhCRAgVBfwsQ/w4aIAAoAhBC/////3c3A+gBQQAhBwJAIAlBAkgNACAJQQFqIgIQnwghB0EBIQEDQCABIAJGDQEgByABQQJ0akH/////BzYCACABQQFqIQEMAAsACyAAEBwhCANAIAgEQCAIEIYCIQIgCCgCECIBIAIoAhAoAqQBKAIQIgIoAvQBIgU2AvQBIAUgACgCECIEKALsAUoEQCAEIAU2AuwBCyAFIAQoAugBSARAIAQgBTYC6AELIAcEQCABIAIoApABIgI2ApABIAcgAkECdGoiAiACKAIAIgIgBSACIAVIGzYCAAsgACAIEB0hCAwB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IAFCADcDECABQgA3AwggASAANgIcIAFBCGpBBBAmIQAgASgCCCAAQQJ0aiABKAIcNgIAIAFBHGohCkH/////ByEEA0AgASgCEARAIAFBCGogCkEEEL4BQQAhACABKAIcIQcDQCAHKAIQIgIoAsgBIABBAnRqKAIAIgMEQCADQVBBACADKAIAQQNxIgtBAkcbaigCKCIMKAIQIg0oArACIQYCQCADKAIQIg4oAqQBQQBIBEAgBiAITCAGIAlOcQ0BIA0oAvQBIANBMEEAIAtBA0cbaigCKCgCECgC9AEgDigCrAFqayICIAQgBUUgAiAESHIiAhshBCADIAUgAhshBQwBCyAGIAIoArACTg0AIAEgDDYCHCABQQhqQQQQJiECIAEoAgggAkECdGogASgCHDYCAAsgAEEBaiEADAEFQQAhACAEQQBMDQMDQCACKAKYAiAAQQJ0aigCACIDRQ0EIANBMEEAIAMoAgBBA3FBA0cbaigCKCIDKAIQKAKwAiACKAKwAkgEQCABIAM2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgAgBygCECECCyAAQQFqIQAMAAsACwALAAsLDAELIAQoAhAiACgCsAIhCCAAKAKsAiEJIAFBADYCGCABQgA3AxAgAUIANwMIIAEgBDYCHCABQQhqQQQQJiEAIAEoAgggAEECdGogASgCHDYCACABQRxqIQpB/////wchBANAIAEoAhAEQCABQQhqIApBBBC+AUEAIQAgASgCHCEHA0AgBygCECICKALAASAAQQJ0aigCACIDBEAgA0EwQQAgAygCAEEDcSILQQNHG2ooAigiDCgCECINKAKwAiEGAkAgAygCECIOKAKkAUEASARAIAYgCEwgBiAJTnENASADQVBBACALQQJHG2ooAigoAhAoAvQBIA0oAvQBIA4oAqwBamsiAiAEIAVFIAIgBEhyIgIbIQQgAyAFIAIbIQUMAQsgBiACKAKwAk4NACABIAw2AhwgAUEIakEEECYhAiABKAIIIAJBAnRqIAEoAhw2AgALIABBAWohAAwBBUEAIQAgBEEATA0DA0AgAigCoAIgAEECdGooAgAiA0UNBCADQVBBACADKAIAQQNxQQJHG2ooAigiAygCECgCsAIgAigCsAJIBEAgASADNgIcIAFBCGpBBBAmIQIgASgCCCACQQJ0aiABKAIcNgIAIAcoAhAhAgsgAEEBaiEADAALAAsACwALCwsgAUEIaiIAQQQQMSAAEDQgAUEgaiQAIAUL2QEBBH8gAEEwQQAgACgCAEEDcSIFQQNHG2ooAigiBiEDAn8CQCABIAZGBH8gAEFQQQAgBUECRxtqKAIoBSADCygCECgCsAIiAyABKAIQIgQoAqwCTgRAIAMgBCgCsAJMDQELIAAoAhAoApwBIQNBAAwBC0EAIQMgACgCECIEKAKkAUEATgR/IAQoAqABBUEACyAEKAKcAWshA0EBCyEEQQAgA2sgA0EBQX8gAkEATAR/IAEgBkYFIABBUEEAIAVBAkcbaigCKCABRgsbIgBBACAAayAEG0EASBsLgUsCEH8BfiMAQaAFayIEJAAgBEHQxAgvAQA7AfAEIARByMQIKQMANwPoBCAEQcDECCkDADcD4AQgBEG0BGpBAEEsEDgaQezaCi0AAARAIAAoAhBBwAFqIQUDQCAFKAIAIgUEQCAFKAIQIgooAsgBIQlBACEFA0AgCSAFQQJ0aigCAARAIAVBAWohBSAGQQFqIQYMAQUgCkG4AWohBSAHQQFqIQcMAwsACwALCyAEIAE2ArAEIAQgAjYCrAQgBCAGNgKoBCAEIAc2AqQEIAQgBEHgBGo2AqAEQYj2CCgCAEH7wAQgBEGgBGoQIBoQrQELIAQgADYCtARBACEGIARBuARqQQBBKBA4IQ4gACgCEEHAAWohBUEAIQkDQAJAIAUoAgAiB0UEQCAEIAY2AtQEIAQgCTYC2AQgDiAJQQQQ/AEgACgCEEHAAWohBUEBIQgDQCAFKAIAIgcEQEEAIQUgBygCECIKQQA2ArQCIAooAsABIQkDQCAFQQFqIQYgCSAFQQJ0aigCACIFBEAgCiAGNgK0AiAFKAIQIgxCgICAgHA3A6ABIAggDCgCrAEgBUFQQQAgBSgCAEEDcSIIQQJHG2ooAigoAhAoAvQBIAVBMEEAIAhBA0cbaigCKCgCECgC9AFrTHEhCCAGIQUMAQsLIAZBBBAaIQpBACEFIAcoAhAiBkEANgKcAiAGIAo2ApgCIAYoAsgBIQYDQCAFQQJ0IQogBUEBaiEFIAYgCmooAgANAAsgBUEEEBohBiAHKAIQIgVBADYCpAIgBSAGNgKgAiAFQbgBaiEFDAELCwJAIAhBAXENACAEQgA3A4gFIARCADcDgAUgBEIANwP4BCAEQfgEaiAEKALYBEEEEPwBIAQoArQEKAIQQcABaiEFIARBjAVqIQwDQCAFKAIAIgUEQCAFKAIQIgYoArQCBH8gBgUgBCAFNgKMBSAEQfgEakEEECYhBiAEKAL4BCAGQQJ0aiAEKAKMBTYCACAFKAIQC0G4AWohBQwBBUEAIQoLCwNAAkAgBCgCgAUEQCAEQfgEaiAMEKEEQQAhBiAEKAKMBSILKAIQIglBADYC9AEgCSgCwAEhDUEAIQdBACEIA0AgDSAIQQJ0aigCACIFBEAgCSAHIAUoAhAoAqwBIAVBMEEAIAUoAgBBA3FBA0cbaigCKCgCECgC9AFqIgUgBSAHSBsiBzYC9AEgCEEBaiEIDAELCwNAIAkoAsgBIAZBAnRqKAIAIgVFDQIgBSAFQTBrIgcgBSgCAEEDcUECRhsoAigoAhAiCCAIKAK0AiIIQQFrNgK0AiAIQQFMBEAgBCAFIAcgBSgCAEEDcUECRhsoAig2AowFIARB+ARqQQQQJiEFIAQoAvgEIAVBAnRqIAQoAowFNgIAIAsoAhAhCQsgBkEBaiEGDAALAAsCQCAKIAQoAtgERg0AQbWTBEEAEDcgBCgCtAQoAhBBwAFqIQUDQCAFKAIAIgVFDQEgBSgCECIGKAK0AgR/IAUQISEGIAQgBSgCECgCtAI2ApQEIAQgBjYCkARB/MEEIARBkARqEIABIAUoAhAFIAYLQbgBaiEFDAALAAtBACEFA0AgBSAEKAKABU9FBEAgBCAEKQOABTcDiAQgBCAEKQP4BDcDgAQgBEGABGogBRAZIQYCQAJAAkAgBCgCiAUiBw4CAgABCyAEKAL4BCAGQQJ0aigCABAYDAELIAQoAvgEIAZBAnRqKAIAIAcRAQALIAVBAWohBQwBCwsgBEH4BGoiBUEEEDEgBRA0DAILIApBAWohCgwACwALIARBHiADIANBAEgbNgLcBCAEKAK0BCgCEEHAAWohBQJAAkADQCAFKAIAIgMEQCADKAIQIgNBADYCqAIgA0G4AWohBQwBBQJAIAQoAtgEQQQQGiENIAQoArQEKAIQQcABaiEFIARBjAVqIQdBACEKA0AgBSgCACIMBEAgDCgCECIFKAKoAgR/IAUFQRAQUiIJIAw2AgAgDCgCECAJNgKoAiAEQQA2AogFIARCADcDgAUgBEIANwP4BEEBIQUgBEEBNgKYBSAEQgA3A5AFIAQgDDYCjAUgBEH4BGpBEBAmIQMgBCgC+AQgA0EEdGoiAyAHKQIANwIAIAMgBykCCDcCCANAAkAgBSEDIAQoAoAFIgVFDQAgBCAEKQOABTcD+AMgBCAEKQP4BDcD8AMgBCgC+AQgBEHwA2ogBUEBaxAZQQR0aiIIKAIEIQYgCCgCACgCECIPKALAASEQA0ACQCAQIAZBAnRqKAIAIgVFBEAgCCgCCCEGIA8oAsgBIQ8MAQsCQCAFKAIQIhEoAqQBQQBODQAgBSAFQTBqIgsgBSgCAEEDcSISQQNGGygCKCgCECITKAKoAg0AIAVBUEEAIBJBAkcbaigCKCgCECgC9AEgESgCrAEgEygC9AFqRw0AIARBtARqIAUQrAgEQCAEIAQpA4AFNwPoAyAEIAQpA/gENwPgAyAEQeADaiAEKAKABUEBaxAZIQUCQAJAIAQoAogFIgYOAgERAAsgBCAEKAL4BCAFQQR0aiIFKQIINwPYAyAEIAUpAgA3A9ADIARB0ANqIAYRAQALIARB+ARqIAdBEBC+AUF/IQUgBCgCgAUiBkUNBSAEIAQpA4AFNwPIAyAEIAQpA/gENwPAAyAEKAL4BCAEQcADaiAGQQFrEBlBBHRqIgUgBSgCDEEBazYCDCADIQUMBQsgCCAIKAIEQQFqNgIEIAUgCyAFKAIAQQNxQQNGGygCKCgCECAJNgKoAiAFIAsgBSgCAEEDcUEDRhsoAighBSAEQQE2ApgFIARCADcDkAUgBCAFNgKMBSAEQfgEakEQECYhBSAEKAL4BCAFQQR0aiIFIAcpAgA3AgAgBSAHKQIINwIIIAMhBQwECyAIIAZBAWoiBjYCBAwBCwsCQANAIA8gBkECdGooAgAiBUUNAQJAAkAgBSgCECIQKAKkAUEATg0AIAUgBUEwayILIAUoAgBBA3EiEUECRhsoAigoAhAiEigCqAINACASKAL0ASAQKAKsASAFQTBBACARQQNHG2ooAigoAhAoAvQBakYNAQsgCCAGQQFqIgY2AggMAQsLIARBtARqIAUQrAgEQCAEIAQpA4AFNwO4AyAEIAQpA/gENwOwAyAEQbADaiAEKAKABUEBaxAZIQUCQAJAIAQoAogFIgYOAgEPAAsgBCAEKAL4BCAFQQR0aiIFKQIINwOoAyAEIAUpAgA3A6ADIARBoANqIAYRAQALIARB+ARqIAdBEBC+AUF/IQUgBCgCgAUiBkUNAyAEIAQpA4AFNwOYAyAEIAQpA/gENwOQAyAEKAL4BCAEQZADaiAGQQFrEBlBBHRqIgUgBSgCDEEBazYCDCADIQUMAwsgCCAIKAIIQQFqNgIIIAUgCyAFKAIAQQNxQQJGGygCKCgCECAJNgKoAiAFIAsgBSgCAEEDcUECRhsoAighBSAEQQE2ApgFIARCADcDkAUgBCAFNgKMBSAEQfgEakEQECYhBSAEKAL4BCAFQQR0aiIFIAcpAgA3AgAgBSAHKQIINwIIIAMhBQwCCyAEQfgEaiAHQRAQvgEgBCgCmAUhBSAEKAKABSIGRQ0BIAQgBCkDgAU3A4gDIAQgBCkD+AQ3A4ADIAQoAvgEIARBgANqIAZBAWsQGUEEdGoiBiAGKAIMIAVqNgIMIAMhBQwBCwsgBEH4BGoiBUEQEDEgBRA0IAkgAzYCBCADQQBIDQMgCSAJNgIMIA0gCkECdGogCTYCACAKQQFqIQogDCgCEAtBuAFqIQUMAQsLQQgQUiIHIAo2AgQgByANNgIAQQAhBQNAIAUgCkYEQCAKQQF2IQUDQCAFQX9GBEACQCANQQRrIRBBACEMIAohCQNAIAlBAkkiDw0KIA0oAgAiA0F/NgIIIA0gECAJQQJ0aiIFKAIAIgY2AgAgBkEANgIIIAUgAzYCACAHIAlBAWsiCTYCBCAHQQAQqwggAygCAEEAQQAQqggiCEUEQEEBIQwMCwsgCCgCECgCpAFBAE4NASAIIAhBMGoiAyAIKAIAQQNxQQNGGygCKBDOBCEFIAggCEEwayILIAgoAgBBA3FBAkYbKAIoEM4EIQYgCCgCECgCrAEgCCADIAgoAgBBA3EiEUEDRhsoAigoAhAoAvQBaiEDIAggCyARQQJGGygCKCgCECgC9AEhCwJAAn8gBSgCCEF/RgRAIAMgC0YNAiALIANrIQsgBQwBCyADIAtGDQEgAyALayELIAYLKAIAQQAgCxCpCAsgBEG0BGogCBCsCA0JA0AgBSIDKAIMIgUEQCADIAVHDQELCwNAIAYiBSgCDCIGBEAgBSAGRw0BCwsCQCADIAVHBEAgBSgCCCEGAn8gAygCCEF/RgRAIAZBf0cEQCAFIQZBAAwCC0G3qQNBx7kBQbkDQcrjABAAAAsgBkF/RgRAIAMhBkEADAELIAMgBSAFKAIEIAMoAgRIGyIGKAIIQX9GCyAFIAY2AgwgAyAGNgIMIAYgBSgCBCADKAIEajYCBEUNAUGDowNBx7kBQcEDQcrjABAAAAsgAyIGRQ0KCyAHIAYoAggQqwgMAAsACwUgByAFEKsIIAVBAWshBQwBCwtB96YDQce5AUGrBEHaMBAAAAUgDSAFQQJ0aigCACAFNgIIIAVBAWohBQwBCwALAAsLCyAJEBhBAiEMQQAhDyANIApBAnRqQQA2AgBBACEHDAELQQIhDAsgBxAYQQAhBQJAAkACQAJAAkADQCAFIApGBEACQCANEBggD0UNBiAEKALABCAEKALYBEEBa0YEQCAEKAK0BCgCECgCwAEhAyAEQQA2AogFIARCADcDgAUgBEIANwP4BCADKAIQQoCAgIAQNwOoAiAEQgA3A5gFIARCgICAgBA3A5AFIAQgAzYCjAUgBEH4BGpBFBAmIQMgBCgC+AQgA0EUbGoiAyAEKQKMBTcCACADIAQoApwFNgIQIAMgBCkClAU3AgggBEGMBWohBQNAIAQoAoAFIgMEQCAEIAQpA4AFNwP4AiAEIAQpA/gENwPwAiAEKAL4BCAEQfACaiADQQFrEBlBFGxqIgMoAgwhBiADKAIAKAIQIgooAqACIQkCQANAIAkgBkECdGooAgAiB0UEQCADKAIQIQYgCigCmAIhCQNAIAkgBkECdGooAgAiB0UNAyADIAZBAWoiBjYCECAHIAMoAgRGDQALIAdBMEEAIAcoAgBBA3FBA0cbaigCKCIGKAIQIgogBzYCqAIgCiADKAIIIgM2AqwCIARCADcDmAUgBCADNgKUBSAEIAc2ApAFIAQgBjYCjAUgBEH4BGpBFBAmIQMgBCgC+AQgA0EUbGoiAyAFKQIANwIAIAMgBSgCEDYCECADIAUpAgg3AggMBAsgAyAGQQFqIgY2AgwgByADKAIERg0ACyAHQVBBACAHKAIAQQNxQQJHG2ooAigiBigCECIKIAc2AqgCIAogAygCCCIDNgKsAiAEQgA3A5gFIAQgAzYClAUgBCAHNgKQBSAEIAY2AowFIARB+ARqQRQQJiEDIAQoAvgEIANBFGxqIgMgBSkCADcCACADIAUoAhA2AhAgAyAFKQIINwIIDAILIAogAygCCCIGNgKwAiAEIAQpA4AFNwPoAiAEIAQpA/gENwPgAiAEQeACaiAEKAKABUEBaxAZIQMCQAJAIAQoAogFIgcOAgEOAAsgBCAEKAL4BCADQRRsaiIDKQIINwPQAiAEIAMoAhA2AtgCIAQgAykCADcDyAIgBEHIAmogBxEBAAsgBEH4BGogBUEUEL4BIAQoAoAFIgNFDQEgBCAEKQOABTcDwAIgBCAEKQP4BDcDuAIgBCgC+AQgBEG4AmogA0EBaxAZQRRsaiAGQQFqNgIIDAELCyAEQfgEaiIFQRQQMSAFEDQgBCgCtAQoAhAoAsABIQMgBEEANgKIBSAEQgA3A4AFIARCADcD+AQgBEEANgKYBSAEQgA3A5AFIAQgAzYCjAUgBUEQECYhAyAEKAL4BCADQQR0aiIDIAQpAowFNwIAIAMgBCkClAU3AgggBEGMBWohCgJAAkADQCAEKAKABSIDBEAgBCAEKQOABTcDsAIgBCAEKQP4BDcDqAIgBCgC+AQgBEGoAmogA0EBaxAZQQR0aiIDKAIIIQUgAygCACgCECIJKAKgAiEHAkADQCAHIAVBAnRqKAIAIgZFBEAgAygCBCEHIAMoAgwhBSAJKAKYAiEJA0AgCSAFQQJ0aigCACIGRQ0DIAMgBUEBaiIFNgIMIAYgB0YNAAsgBkEwQQAgBigCAEEDcUEDRxtqKAIoIQMgBEIANwKUBSAEIAY2ApAFIAQgAzYCjAUgBEH4BGpBEBAmIQMgBCgC+AQgA0EEdGoiAyAKKQIANwIAIAMgCikCCDcCCAwECyADIAVBAWoiBTYCCCAGIAMoAgRGDQALIAZBUEEAIAYoAgBBA3FBAkcbaigCKCEDIARCADcClAUgBCAGNgKQBSAEIAM2AowFIARB+ARqQRAQJiEDIAQoAvgEIANBBHRqIgMgCikCADcCACADIAopAgg3AggMAgsgBwRAIAcgB0EwQQAgBygCAEEDcSIFQQNHG2ooAigiCCgCECIDKAKoAkYEf0EBBSAHQVBBACAFQQJHG2ooAigiCCgCECEDQX8LIQkgAygCyAEhDEEAIQVBACEGA0ACQCAMIAZBAnRqKAIAIgtFBEAgAygCwAEhA0EAIQYDQCADIAZBAnRqKAIAIgxFDQIgDCAIIAkQ/g4iDEEASCAFIAUgDGoiBUpHDQcgBkEBaiEGDAALAAsgCyAIIAkQ/g4iC0EASCAFIAUgC2oiBUpHDQYgBkEBaiEGDAELCyAHKAIQIAU2AqABCyAEIAQpA4AFNwOgAiAEIAQpA/gENwOYAiAEQZgCaiAEKAKABUEBaxAZIQMCQAJAIAQoAogFIgUOAgEQAAsgBCAEKAL4BCADQQR0aiIDKQIINwOQAiAEIAMpAgA3A4gCIARBiAJqIAURAQALIARB+ARqIApBEBC+AQwBCwsgBEH4BGoiA0EQEDEgAxA0IAJBAEwNCEGI9ggoAgAhDSAEQYwFaiEKQQAhAwJAA0AgBCgC0AQiByEGQQAhBUEAIQkCQANAIAQoAsAEIAZLBEAgBCAOKQIINwPgASAEIA4pAgA3A9gBIAQoArgEIARB2AFqIAYQGUECdGooAgAiBigCECgCoAEiCEEASARAAn8gBQRAIAYgBSAFKAIQKAKgASAIShsMAQsgBCAOKQIINwPQASAEIA4pAgA3A8gBIAQoArgEIARByAFqIAQoAtAEEBlBAnRqKAIACyEFIAlBAWoiCSAEKALcBE4NAwsgBCAEKALQBEEBaiIGNgLQBAwBCwtBACEGIAdFDQADQCAEIAY2AtAEIAYgB08NASAEIA4pAgg3A4ACIAQgDikCADcD+AEgBCgCuAQgBEH4AWogBhAZQQJ0aigCACIGKAIQKAKgASIIQQBIBEACfyAFBEAgBiAFIAUoAhAoAqABIAhKGwwBCyAEIA4pAgg3A/ABIAQgDikCADcD6AEgBCgCuAQgBEHoAWogBCgC0AQQGUECdGooAgALIQUgCUEBaiIJIAQoAtwETg0CCyAEKALQBEEBaiEGDAALAAsgBUUNAQJAIAUQ/Q4iByAHQTBrIgYgBygCAEEDcSIJQQJGGygCKCgCECgC9AEgByAHQTBqIgggCUEDRhsoAigoAhAoAvQBIAcoAhAoAqwBamsiCUEATA0AAkAgBUEwQQAgBSgCAEEDcSILQQNHG2ooAigiECgCECIMKAKkAiAMKAKcAmpBAUYNACAFQVBBACALQQJHG2ooAigiCygCECIPKAKkAiAPKAKcAmpBAUYEQCALQQAgCWsQugMMAgsgDCgCsAIgDygCsAJIDQAgC0EAIAlrELoDDAELIBAgCRC6AwsgByAIIAcoAgBBA3EiCUEDRhsoAiggByAGIAlBAkYbKAIoIAUoAhAoAqABIgtBARD8DiIJIAcgBiAHKAIAQQNxIgxBAkYbKAIoIAcgCCAMQQNGGygCKCALQQAQ/A5HDQkgCSgCECgCrAIhDCAJIAcgBiAHKAIAQQNxQQJGGygCKBD7DiAJIAcgCCAHKAIAQQNxQQNGGygCKBD7DiAHKAIQIgZBACALazYCoAEgBSgCECIIQQA2AqABIAYgCCgCpAEiBjYCpAECQCAGQQBOBEAgBCAHNgLMBCAEIA4pAgg3A8ABIAQgDikCADcDuAEgBEG4AWogBhAZIQYCQAJAAkAgBCgCyAQiCA4CAgABCyAEKAK4BCAGQQJ0aigCABAYDAELIAQoArgEIAZBAnRqKAIAIAgRAQALIAQoArgEIAZBAnRqIAQoAswENgIAIAUoAhBBfzYCpAFBACEGIAVBMEEAIAUoAgBBA3FBA0cbaigCKCIPKAIQIgggCCgCpAJBAWsiCzYCpAIgCCgCoAIhCANAAkAgBiALSw0AIAggBkECdGooAgAgBUYNACAGQQFqIQYMAQsLIAggBkECdGogCCALQQJ0IgtqKAIANgIAQQAhBiAPKAIQKAKgAiALakEANgIAIAVBUEEAIAUoAgBBA3FBAkcbaigCKCIPKAIQIgggCCgCnAJBAWsiCzYCnAIgCCgCmAIhCANAAkAgBiALSw0AIAggBkECdGooAgAgBUYNACAGQQFqIQYMAQsLIAggBkECdGogCCALQQJ0IgVqKAIANgIAIA8oAhAoApgCIAVqQQA2AgAgB0EwQQAgBygCAEEDcUEDRxtqKAIoIgYoAhAiBSAFKAKkAiIIQQFqNgKkAiAFKAKgAiAIQQJ0aiAHNgIAIAYoAhAiBSgCoAIgBSgCpAJBAnRqQQA2AgAgB0FQQQAgBygCAEEDcUECRxtqKAIoIgYoAhAiBSAFKAKcAiIIQQFqNgKcAiAFKAKYAiAIQQJ0aiAHNgIAIAYoAhAiBSgCmAIgBSgCnAJBAnRqQQA2AgAgCSgCECIFKAKsAiAMRg0BIAUoAqgCIQYgBEEANgKIBSAEQgA3A4AFIARCADcD+AQgBSAMNgKsAiAEQgA3A5gFIAQgDDYClAUgBCAGNgKQBSAEIAk2AowFIARB+ARqQRQQJiEFIAQoAvgEIAVBFGxqIgUgCikCADcCACAFIAooAhA2AhAgBSAKKQIINwIIA0ACQAJAIAQoAoAFIgUEQCAEIAQpA4AFNwOwASAEIAQpA/gENwOoASAEKAL4BCAEQagBaiAFQQFrEBlBFGxqIgUoAgwhBiAFKAIAKAIQIgcoAqACIQgCQAJAA0AgCCAGQQJ0aigCACIJRQRAIAUoAhAhBiAHKAKYAiEIA0AgCCAGQQJ0aigCACIJRQ0EIAUgBkEBaiIGNgIQIAkgBSgCBEYNAAsgCUEwQQAgCSgCAEEDcUEDRxtqKAIoIggoAhAiBigCqAIgCUYNAiAFKAIIIQcMBgsgBSAGQQFqIgY2AgwgCSAFKAIERg0ACyAJIAlBUEEAIAkoAgBBA3FBAkcbaigCKCIIKAIQIgYoAqgCRwRAIAUoAgghBwwECyAFKAIIIgcgBigCrAJHDQMgBSAGKAKwAkEBajYCCAwFCyAFKAIIIgcgBigCrAJHDQMgBSAGKAKwAkEBajYCCAwECyAHIAUoAggiBjYCsAIgBCAEKQOABTcDoAEgBCAEKQP4BDcDmAEgBEGYAWogBCgCgAVBAWsQGSEFAkACQAJAIAQoAogFIgcOAgIAAQtBsIMEQcIAQQEgDRA6GhA7AAsgBCAEKAL4BCAFQRRsaiIFKQIINwOIASAEIAUoAhA2ApABIAQgBSkCADcDgAEgBEGAAWogBxEBAAsgBEH4BGogCkEUEL4BIAQoAoAFIgVFDQMgBCAEKQOABTcDeCAEIAQpA/gENwNwIAQoAvgEIARB8ABqIAVBAWsQGUEUbGogBkEBajYCCAwDCyAEQfgEaiIFQRQQMSAFEDQMBAsgBiAHNgKsAiAGIAk2AqgCIARCADcDmAUgBCAHNgKUBSAEIAk2ApAFIAQgCDYCjAUgBEH4BGpBFBAmIQUgBCgC+AQgBUEUbGoiBSAKKQIANwIAIAUgCigCEDYCECAFIAopAgg3AggMAQsgBiAHNgKsAiAGIAk2AqgCIARCADcDmAUgBCAHNgKUBSAEIAk2ApAFIAQgCDYCjAUgBEH4BGpBFBAmIQUgBCgC+AQgBUEUbGoiBSAKKQIANwIAIAUgCigCEDYCECAFIAopAgg3AggMAAsAC0GxmgNBx7kBQfUAQZUwEAAACwJAQezaCi0AAEUgA0EBaiIDQeQAcHINACADQegHcCIFQeQARgRAIARB4ARqIA0QiwEaCyAEIAM2AmAgDUH3ygMgBEHgAGoQIBogBQ0AQQogDRCnARoLIAIgA0cNAAsgAiEDC0EAIQUCQAJAAkACQCABQQFrDgIAAQILIARBtARqEPkOIgBBAEgNAkEBIQdBACEKIABBAWpBBBAaIQEgBCgCtARB56EBECciAkUNBiACQc7kABBjIgZFBEBBAiEHIAJBmRMQY0UNBwsgBCgCtAQoAhBBwAFqIQUgBkEBcyEKA0AgBSgCACICBEACQCACKAIQIgItAKwBDQAgCiACKALEAUEAR3JFBEAgAkEANgL0AQsgBiACKALMAXINACACIAA2AvQBCyACQbgBaiEFDAEFIAchCgwICwALAAsDQCAFIAQoAsAET0UEQCAEIA4pAgg3A1ggBCAOKQIANwNQAkAgBCgCuAQgBEHQAGogBRAZQQJ0aigCACIAKAIQKAKgAQ0AIAAQ/Q4iAUUNACABQVBBACABKAIAQQNxIgJBAkcbaigCKCgCECgC9AEgAUEwQQAgAkEDRxtqKAIoKAIQKAL0ASABKAIQKAKsAWprIgFBAkgNACABQQF2IQEgAEEwQQAgACgCAEEDcSICQQNHG2ooAigiBigCECgCsAIgAEFQQQAgAkECRxtqKAIoIgAoAhAoArACSARAIAYgARC6AwwBCyAAQQAgAWsQugMLIAVBAWohBQwBCwsgBEG0BGogBCgCtAQQzQQMCAsgBEG0BGoiABD5DhogACAEKAK0BBDNBAwHC0HdmANBx7kBQY4GQdyhARAAAAtBn40EQQAQNxAvAAtBn40EQQAQNxAvAAtB740DQce5AUH0BEGMnwEQAAALBSANIAVBAnRqKAIAEBggBUEBaiEFDAELCyAEQgA3A4gFIARCADcDgAUgBEIANwP4BCAEQfgEaiAEKALYBEEEEPwBIAQoArQEKAIQQcABaiEFA0AgBSgCACICBEAgBCACNgKMBSAEQfgEakEEECYhBSAEKAL4BCAFQQJ0aiAEKAKMBTYCACACKAIQQbgBaiEFDAELCyAEQfgEakGeA0GfAyAKQQFKG0EEEKIDQQAhBgNAIAQoAoAFIgUgBk0EQEEAIQwDQCAFIAxNBEBBACEGA0AgBSAGTUUEQCAEIAQpA4AFNwNIIAQgBCkD+AQ3A0AgBEFAayAGEBkhAAJAAkACQCAEKAKIBSICDgICAAELIAQoAvgEIABBAnRqKAIAEBgMAQsgBCgC+AQgAEECdGooAgAgAhEBAAsgBkEBaiEGIAQoAoAFIQUMAQsLIARB+ARqIgBBBBAxIAAQNCABEBggBEG0BGoQ+A4MBAsgBCAEKQOABTcDOCAEIAQpA/gENwMwIAQoAvgEIARBMGogDBAZQQJ0aigCACIOKAIQIgItAKwBRQRAIAIoAsABIQdBACEJQQAhBkEAIQgDQCAHIAhBAnRqKAIAIgUEQCAGIAUoAhAiCygCrAEgBUEwQQAgBSgCAEEDcUEDRxtqKAIoKAIQKAL0AWoiBSAFIAZIGyEGIAhBAWohCCALKAKcASAJaiEJDAEFAkAgAigCyAEhD0EAIQsgACEHQQAhCANAIA8gCEECdGooAgAiBQRAIAcgBUFQQQAgBSgCAEEDcUECRxtqKAIoKAIQKAL0ASAFKAIQIgUoAqwBayIQIAcgEEgbIQcgCEEBaiEIIAUoApwBIAtqIQsMAQUgCgRAIAkgC0cNAyACIAYgByAKQQFGGzYC9AEMAwsgCSALRw0CIAcgBiAGIAdIGyEHIAYhBQNAIAUgB0YEQCABIAIoAvQBQQJ0aiIFIAUoAgBBAWs2AgAgASAGQQJ0aiIFIAUoAgBBAWo2AgAgAiAGNgL0AQUgBUEBaiIFIAYgASAFQQJ0aigCACABIAZBAnRqKAIASBshBgwBCwsLCwsLCyACKAKYAhAYIA4oAhAoAqACEBggDigCEEEANgKwAQsgDEEBaiEMIAQoAoAFIQUMAAsACyAEIAQpA4AFNwMoIAQgBCkD+AQ3AyAgBCgC+AQgBEEgaiAGEBlBAnRqKAIAKAIQIgItAKwBRQRAIAEgAigC9AFBAnRqIgIgAigCAEEBajYCAAsgBkEBaiEGDAALAAtBACEMQezaCi0AAEUNAyADQeQATgRAQQogDRCnARoLIAQpAtQEIRQgBBCOATkDECAEIAM2AgwgBCAUQiCJNwIEIAQgBEHgBGo2AgAgDUHqyQQgBBAzDAMLQeDqA0EAEDcgBEG0BGogABDNBEECIQwMAgsgBEG0BGogABDNBEEAIQwMAQsgBEG0BGogABDNBAsgBEGgBWokACAMDwtBACEFIAcoAhAiB0EANgKwASAHKALIASEKA0AgCiAFQQJ0aigCAARAIAVBAWohBSAGQQFqIQYMAQUgB0G4AWohBSAJQQFqIQkMAwsACwALC0GwgwRBwgBBAUGI9ggoAgAQOhoQOwAL5wQBA38jAEGAAWsiBSQAIAUgATYCfCAFIAIpAgg3A2AgBSACKQIANwNYIAVB2ABqIAVB/ABqEIcHIQYgBSgCfCEBAkAgBgRAIAEgA0cNASACKAAIIQZBACEAA0AgBCgACCAASwRAIAQoAgAhAyAFIAQpAgg3AzAgBSAEKQIANwMoQQAhASAGIAMgBUEoaiAAEBlBAnRqKAIAIgMoAAhGBEADQCABIAZGDQUgAygCACEHIAUgAykCCDcDICAFIAMpAgA3AxggBSAHIAVBGGogARAZQQJ0aigCADYCbCAFIAIpAgg3AxAgBSACKQIANwMIIAFBAWohASAFQQhqIAVB7ABqEIcHDQALCyAAQQFqIQAMAQsLEIEPIQAgBUFAayACKQIINwMAIAUgAikCADcDOCAFQewAaiAFQThqEIsLIABBADYCFCAAIAUpAmw3AgAgACAFKQJ0NwIIIAAgAigCEDYCECAEIAA2AhQgBEEEECYhACAEKAIAIABBAnRqIAQoAhQ2AgAMAQsgAiABNgIUIAJBBBAmIQEgAigCACABQQJ0aiACKAIUNgIAIAAgBSgCfBAsIQEDQCABBEAgACABQVBBACABKAIAQQNxQQJHG2ooAiggAiADIAQQgA8gACABEDAhAQwBCwsgAigACCIARQ0AIAJBFGohASAFIAIpAgg3A1AgBSACKQIANwNIIAVByABqIABBAWsQGSEAAkACQAJAIAIoAhAiAw4CAgABCyACKAIAIABBAnRqKAIAEBgMAQsgAigCACAAQQJ0aigCACADEQEACyACIAFBBBC+AQsgBUGAAWokAAsIAEEBQRgQGgu/EgMLfwl8An4jAEHQAmsiBSQAIAEoAgAiBiAGQTBrIgkgBigCAEEDcSIHQQJGGygCKCEKIAZBMEEAIAdBA0cbaigCKCgCECIIKwAQIRAgBigCECIHKwAQIREgBSAHKwAYIAgrABigIhM5A5gCIAUgBSkDmAI3A6gCIAUgESAQoCIROQOQAiAFIAUpA5ACNwOgAiAKKAIQIggrABAhECAHKwA4IRIgBSAHKwBAIAgrABigIhQ5A8gCIAUgEiAQoCIQOQPAAiAFIAUpA8gCNwO4AiAFIAUpA8ACNwOwAgJAAkACQCACQQFHBEBBjNsKLQAAQQFHDQELIANBBEcNASAFQbjECCkCACIZNwPgASAFQbDECCkCACIaNwPYASAFIBo3A5gBIAUgGTcDoAEgBUGoxAgpAgAiGTcD0AEgBSAZNwOQASAAEBwhAwNAIAMEQCAFEIEPIgE2AuQBIAVB0AFqQQQQJiECIAUoAtABIAJBAnRqIAUoAuQBNgIAIAAgAyABIAMgBUGQAWoQgA8gACADEB0hAwwBBUEAIQMDQCAFKALYASADSwRAIAUgBSkD2AE3AxAgBSAFKQPQATcDCCAFQQhqIAMQGSEBAkACQAJAIAUoAuABIgIOAgIAAQsgBSgC0AEgAUECdGooAgAQGAwBCyAFKALQASABQQJ0aigCACACEQEACyADQQFqIQMMAQsLIAVB0AFqIgFBBBAxIAZBKGohCCABEDRBACEKQQAhAQNAAkACQCAFKAKYASIDIApLBEAgBUFAayAFKQOYATcDACAFIAUpA5ABNwM4IAUoApABIAVBOGogChAZQQJ0aigCACIHKAAIIgJBA0kNAiABBEAgASgACCACTQ0DC0EAIQMgCEFQQQAgBigCAEEDcSILQQJHG2ooAgAhDSAIQTBBACALQQNHG2ooAgAhCwNAIAIgA0YEQCACIQMMAwsgBygCACAFIAcpAgg3AzAgBSAHKQIANwMoIAVBKGogAyACIAMbQQFrEBlBAnRqKAIAIQwgBygCACEOIAUgBykCCDcDICAFIAcpAgA3AxggBUEYaiADEBkhDyALIAxGBEAgDiAPQQJ0aigCACANRg0DCyADQQFqIQMMAAsACwJAAkAgAQRAQQAhA0QAAAAAAAAAACERRAAAAAAAAAAAIRBEAAAAAAAAAAAhEwwBC0EAIQEDQCABIANPBEAgBUGQAWoiAUEEEDEgARA0IAAoAhAiACsDGCAAKwMooEQAAAAAAADgP6IhEiAAKwMQIAArAyCgRAAAAAAAAOA/oiEVDAMFIAUgBSkDmAE3A1AgBSAFKQOQATcDSCAFQcgAaiABEBkhAgJAAkACQCAFKAKgASIDDgICAAELIAUoApABIAJBAnRqKAIAEBgMAQsgBSgCkAEgAkECdGooAgAgAxEBAAsgAUEBaiEBIAUoApgBIQMMAQsACwALA0AgASgACCADSwRAIAEoAgAhACAFIAEpAgg3A2AgBSABKQIANwNYIBFEAAAAAAAA8D+gIREgECAAIAVB2ABqIAMQGUECdGooAgAoAhAiACsDGKAhECATIAArAxCgIRMgA0EBaiEDDAELC0EAIQMDfCAFKAKYASADTQR8IAVBkAFqIgBBBBAxIBAgEaMhEiATIBGjIRUgABA0IAUrA5gCIRMgBSsDyAIhFCAFKwPAAiEQIAUrA5ACBSAFIAUpA5gBNwNwIAUgBSkDkAE3A2ggBUHoAGogAxAZIQACQAJAAkAgBSgCoAEiAQ4CAgABCyAFKAKQASAAQQJ0aigCABAYDAELIAUoApABIABBAnRqKAIAIAERAQALIANBAWohAwwBCwshEQsgFSAQIBGgRAAAAAAAAOA/oiIVoSIWIBIgFCAToEQAAAAAAADgP6IiF6EiGBBHIhJEAAAAAAAAAABhDQYgBSAXIBggEqMgECARoSIQIBCiIBQgE6EiECAQoqCfRAAAAAAAABRAoyIQoqEiETkDuAIgBSAVIBYgEqMgEKKhIhA5A6ACIAUgEDkDsAIgBSAROQOoAgwGCyAHIAEgAiADSxshAQsgCkEBaiEKDAALAAsACwALAkACfCARIBChIhIgEqIgEyAUoSISIBKioESN7bWg98awPmMEQCAFIAUpA5ACNwOgAiAFIAUpA5gCNwOoAiAFIAUpA8ACNwOwAiAFIAUpA8gCNwO4AkQAAAAAAAAAACEQRAAAAAAAAAAADAELIAJBAWsiBkEASA0BIAUgFCAQIBGhIhUgACgCSCgCECgC+AEiACAGbEECbbciFqIgEiAVEEciFKMiF6A5A7gCIAUgECASIBaiIBSjIhCgOQOwAiAFIBMgF6A5A6gCIAUgESAQoDkDoAIgFUEAIABrtyIRoiAUoyEQIBIgEaIgFKMLIRFBACEGIANBBkchCANAIAIgBkYNA0EAIQMCQCAKIAEgBkECdGooAgAiACAAQTBrIgcgACgCAEEDcUECRhsoAihGBEADQCADQQRGDQIgA0EEdCIJIAVB0AFqaiILIAVBkAJqIAlqIgkpAwg3AwggCyAJKQMANwMAIANBAWohAwwACwALA0AgA0EERg0BQQAgA2tBBHQgBWoiCSAFQZACaiADQQR0aiILKQMINwOIAiAJIAspAwA3A4ACIANBAWohAwwACwALAkAgCEUEQCAFIAUpA9ABNwOQASAFKQPYASEZIAUgBSkD4AE3A6ABIAUgGTcDmAEgBSAFKQPoATcDqAEgBSAFKQPwATcDsAEgBSAFKQP4ATcDuAEgBSAFKQOIAjcDyAEgBSAFKQOAAjcDwAEgBUEENgKEASAFIAVBkAFqNgKAASAFIAUpAoABNwN4IAVB+ABqIAVBiAFqEI4EIAAgACAHIAAoAgBBA3FBAkYbKAIoIAUoAogBIAUoAowBIAQQlAEMAQsgACAAIAcgACgCAEEDcUECRhsoAiggBUHQAWpBBCAEEJQBCyAAEJoDIAUgECAFKwOoAqA5A6gCIAUgESAFKwOgAqA5A6ACIAUgESAFKwOwAqA5A7ACIAUgECAFKwO4AqA5A7gCIAZBAWohBgwACwALQZjMAUHXuwFB7wdBqTAQAAALIAYgBiAJIAYoAgBBA3FBAkYbKAIoIAVBkAJqQQQgBBCUASAGEJoDCyAFQdACaiQAC/UCAgV8BX8gBCABuKIhCANAIAMgCkEDaiINSwRAIAIgDUEEdGohDkQAAAAAAAAAACEHIAIgCkEEdGohCwNAIAcgCGVFBEAgDSEKDAMLIAcgCKMiBCAEIAQgDisDCCALKwMoIgWhoiAFoCAEIAUgCysDGCIFoaIgBaAiBqGiIAagIAQgBiAEIAUgCysDCCIFoaIgBaAiBaGiIAWgIgWhoiAFoCEFIAQgBCAEIA4rAwAgCysDICIGoaIgBqAgBCAGIAsrAxAiBqGiIAagIgmhoiAJoCAEIAkgBCAGIAsrAwAiBKGiIASgIgShoiAEoCIEoaIgBKAhBEEAIQoDQCABIApGBEAgB0QAAAAAAADwP6AhBwwCBQJAIAUgACAKQQV0aiIMKwMYRC1DHOviNho/oGVFDQAgBSAMKwMIRC1DHOviNhq/oGZFDQAgDCAMKwMAIAQQKTkDACAMIAwrAxAgBBAjOQMQCyAKQQFqIQoMAQsACwALAAsLC4wBAgF8AX8CQCABIAJlIAAgA2ZyBHxEAAAAAAAAAAAFIAAgAmVFIAEgA2ZFckUEQCABIAChDwsgACACZiIFRSABIANlRXJFBEAgAyACoQ8LIAVFIAAgA2VFckUEQCADIAChDwsgASACZkUgASADZUVyDQEgASACoQsPC0Gx8QJB17sBQe0EQdrcABAAAAvSIQIRfwh8IwBB0AJrIgQkACABQQA2AgBBzP0KQcz9CigCAEEBajYCAEHQ/QogACgCUCIMQdD9CigCAGo2AgAgAEHYAGohAwJAAkACQANAIAMoAgAiDkUNASAOKAIQIgdB+ABqIQMgBy0AcA0ACyAAKAJUIQhBACEDAkADQCADIAxGBEACQCAIKwMAIAgrAxBkDQAgCCsDCCAIKwMYZA0AQQEgCiAKQQFNG0EBayERQYj2CCgCACEPQQAhAwwDCwUCQCAIIANBBXRqIgcrAwggBysDGKGZRHsUrkfheoQ/Yw0AIAcrAwAgBysDEKGZRHsUrkfheoQ/Yw0AIAggCkEFdGoiBSAHKQMANwMAIAUgBykDGDcDGCAFIAcpAxA3AxAgBSAHKQMINwMIIApBAWohCgsgA0EBaiEDDAELC0HwtQRBABA3IAAQrQgMAwsDQCADIBFHBEACQCAIIANBAWoiB0EFdGoiBSsDACIWIAUrAxAiFGRFBEAgBSsDCCIXIAUrAxgiGGRFDQELIAQgBzYC0AFBwbUEIARB0AFqEDcgABCtCEEAIQYMBQsCQAJAAkAgCCADQQV0aiIGKwMAIhUgFGQiCSAGKwMQIhkgFmMiEmogBisDGCIaIBdjIg1qIAYrAwgiGyAYZCILaiIQRQ0AQezaCi0AAEUNACAEIAc2AuQBIAQgAzYC4AEgD0GRlQQgBEHgAWoQIBogABCtCAwBCyAQRQ0BCwJAIBIEQCAGKwMQIRQgBiAFKwMAOQMQIAUgFDkDAAwBCyAUIBVjBEAgBisDACEUIAYgBSsDEDkDACAFIBQ5AxBBACEJDAELIBcgGmQEQCAGKwMYIRQgBiAFKwMIOQMYIAUgFDkDCEEAIQlBACENDAELQQAhCUEAIQ1BACELIBggG2NFDQAgBisDCCEUIAYgBSsDGDkDCCAFIBQ5AxgLIBBBAWshEEEAIQMDQCADIBBHBEACQCAJQQFxBEAgBSAGKwMAIAUrAxCgRAAAAAAAAOA/okQAAAAAAADgP6AiFDkDECAGIBQ5AwAMAQsgDUEBRgRAIAUgBisDGCAFKwMIoEQAAAAAAADgP6JEAAAAAAAA4D+gIhQ5AwggBiAUOQMYQQAhDQwBC0EAIQ0gCwRAIAUgBisDCCAFKwMYoEQAAAAAAADgP6JEAAAAAAAA4D+gIhQ5AxggBiAUOQMIC0EAIQsLIANBAWohA0EAIQkMAQsLIAUrAxAhFCAFKwMAIRYgBisDECEZIAYrAwAhFQsgByEDIBUgGSAWIBQQhA8iFEQAAAAAAAAAAGRFIAYrAwggBisDGCAFKwMIIAUrAxgQhA8iFUQAAAAAAAAAAGRFcg0BAkAgFCAVYwRAIAYrAxAiFCAGKwMAIhahIAUrAxAiFSAFKwMAIhehZARAIBQgFWNFBEAgBiAVOQMADAMLIAYgFzkDEAwCCyAUIBVjBEAgBSAUOQMADAILIAUgFjkDEAwBCyAGKwMYIhQgBisDCCIWoSAFKwMYIhUgBSsDCCIXoWQEQCAUIBVjBEAgBiAXOQMYDAILIAYgFTkDCAwBCyAUIBVjBEAgBSAUOQMIDAELIAUgFjkDGAsMAQsLIAgrAxAhFAJAAkAgACsDACIWIAgrAwAiF2MEQCAIKwMIIRUMAQsgCCsDCCEVIBQgFmMNACAAKwMIIhggFWMNACAYIAgrAxhkRQ0BCyAAIBYgFxAjIBQQKTkDACAIKwMYIRQgACAAKwMIIBUQIyAUECk5AwgLIAggCkEFdGoiA0EYaysDACEUAkAgACsDKCIVIANBIGsrAwAiF2MgFSADQRBrKwMAIhhkciAAKwMwIhYgFGNyRQRAIBYgA0EIaysDAGRFDQELIAAgFSAXECMgGBApOQMoIANBCGsrAwAhFSAAIBYgFBAjIBUQKTkDMAtBACEGIAxBA3RBEBAaIQsgDEECSQ0BIAgrAwggCCsDKGRFDQEDQCAGIAxGBEBBASEGDAMFIAggBkEFdGoiAysDGCEUIAMgAysDCJo5AxggAyAUmjkDCCAGQQFqIQYMAQsACwALQf6yBEEAEDcMAQsgDiAOQTBqIhEgDigCAEEDcSIDQQNGGygCKCAOIA5BMGsiECADQQJGGygCKEcEQCALQRhqIRIgCEEYayETQQAhCkEAIQUDQAJAIAwgBSIDRgRAIAhBOGshCSAMIQMMAQtBACENQQAhCSASIApBBHRqAn8gAwRAQX9BASAIIANBBXQiB2orAwggByATaisDAGQbIQkLIAwgA0EBaiIFSwRAQQFBfyAIIAVBBXRqKwMIIAggA0EFdGorAwhkGyENCwJAIAkgDUcEQCAIIANBBXRqIQMgDUF/RyAJQQFHcQ0BIAsgCkEEdGoiByADKwMAIhQ5AwAgAysDGCEVIAcgFDkDECAHIBU5AwggA0EIagwCCwJAAkAgCUEBag4CBQABCyALIApBBHRqIgcgCCADQQV0aiIDKwMAIhQ5AwAgAysDGCEVIAcgFDkDECAHIBU5AwggA0EIagwCCyALEBggBEH6AjYCyAEgBCAJNgLEASAEIAk2AsABQejEBCAEQcABahA3QQAhBgwFCyALIApBBHRqIgcgAysDECIUOQMAIAMrAwghFSAHIBQ5AxAgByAVOQMIIANBGGoLKwMAOQMAIApBAmohCgwBCwsDQAJ/AkAgAwRAIANBAWshB0EAIQ1BACEFIAMgDEkEQEF/QQEgCCAHQQV0aisDCCAIIANBBXRqKwMIZBshBQsgBwRAQQFBfyAJIANBBXRqKwMAIAggB0EFdGorAwhkGyENCyAFIA1HBEAgCCAHQQV0aiEDIA1Bf0cgBUEBR3FFBEAgCyAKQQR0aiIFIAMrAwAiFDkDACADKwMYIRUgBSAUOQMQIAUgFTkDCCAFIAMrAwg5AxgMAwsgCyAKQQR0aiIFIAMrAxAiFDkDACADKwMIIRUgBSAUOQMQIAUgFTkDCCAFIAMrAxg5AxgMAgsCQAJAAkAgBUEBag4CAAECCyALIApBBHRqIgMgCCAHQQV0aiIFKwMQIhQ5AwAgBSsDCCEVIAMgFDkDECADIBU5AwggAyAFKwMYIhQ5AxggAyAFKwMAIhU5AzAgAyAUOQMoIAMgFTkDICADIAUrAwg5AzggCkEEagwECyALIApBBHRqIgMgCCAHQQV0aiIFKwMQIhQ5AwAgBSsDCCEVIAMgFDkDECADIBU5AwggAyAFKwMYOQMYDAILIAsQGCAEQZwDNgK4ASAEIAU2ArQBIAQgBTYCsAFB6MQEIARBsAFqEDdBACEGDAULAkAgBkUNAEEAIQMDQCADIAxGBEBBACEDA0AgAyAKRg0DIAsgA0EEdGoiByAHKwMImjkDCCADQQFqIQMMAAsABSAIIANBBXRqIgcrAxghFCAHIAcrAwiaOQMYIAcgFJo5AwggA0EBaiEDDAELAAsAC0EAIQMDQCADIAxGBEACQCAEIAo2AswCIAQgCzYCyAIgBCAAKwMAOQOQAiAEIAArAwg5A5gCIAQgACsDKDkDoAIgBCAAKwMwOQOoAkEAIQYgBEHIAmogBEGQAmogBEHAAmoQjA9BAEgEQCALEBhBxb4EQQAQNwwICyACBEAgBCAEKQLAAjcDqAEgBEGoAWogBEG4AmoQjgQMAQsgBCgCzAJBIBAaIQIgBCgCzAIhB0EAIQMDQCADIAdGBEAgBEIANwOIAiAEQgA3A4ACIARCADcD+AEgBEIANwPwASAALQAdBEAgBCAAKwMQIhQQVzkD+AEgBCAUEEo5A/ABCyAALQBFQQFGBEAgBCAAKwM4IhQQV5o5A4gCIAQgFBBKmjkDgAILIAQgBCkCwAI3A6ABIAIgByAEQaABaiAEQfABaiAEQbgCahCwCCACEBhBACEGQQBODQIgCxAYQey+BEEAEDcMCQUgAiADQQV0aiIFIAsgA0EEdGoiBikDADcDACAFIAYpAwg3AwggBSALIANBAWoiA0EAIAMgB0cbQQR0aiIGKQMANwMQIAUgBikDCDcDGAwBCwALAAsFIAggA0EFdGoiB0L/////////dzcDECAHQv/////////3/wA3AwAgA0EBaiEDDAELCwJAAkACQCAEKAK8AiIJQRAQTiIGBEBBACEDIAQoArgCIQADQCADIAlGBEBBACEDIAlBAEchBQJAAkADQCADIAlGDQEgA0EEdCEAIANBAWohAyAGKwMIIAAgBmorAwihmUQtQxzr4jYaP2RFDQALQQAhBQwBCyAJRQ0AQezaCi0AAEUNACAPENUBIAQQ1gE3A/ABIARB8AFqEOsBIgAoAhQhAiAAKAIQIQMgACgCDCEHIAAoAgghBSAAKAIEIQkgBCAAKAIANgKcASAEIAk2ApgBIAQgBTYClAEgBCAHNgKQASAEQYgENgKEASAEQde7ATYCgAFBASEFIAQgA0EBajYCjAEgBCACQewOajYCiAEgD0HGygMgBEGAAWoQIBogBiAEKAK8AkEEdGoiAEEIaysDACEUIAYrAwghFSAGKwMAIRYgBCAAQRBrKwMAOQNwIAQgFDkDeCAEIBY5A2AgBCAVOQNoIA9B4a4BIARB4ABqEDNBCiAPEKcBGiAPENQBIAQoArwCIQkLQQAhAyAJQQBHIQ0CQANAIAMgCUYNASADQQR0IQAgA0EBaiEDIAYrAwAgACAGaisDAKGZRC1DHOviNho/ZEUNAAtBACENDAQLIAlFDQNB7NoKLQAARQ0DIA8Q1QEgBBDWATcD8AEgBEHwAWoQ6wEiACgCFCECIAAoAhAhAyAAKAIMIQcgACgCCCEFIAAoAgQhCSAEIAAoAgA2AlwgBCAJNgJYIAQgBTYCVCAEIAc2AlAgBEGWBDYCRCAEQde7ATYCQCAEIANBAWo2AkwgBCACQewOajYCSCAPQcbKAyAEQUBrECAaIAYgBCgCvAJBBHRqIgBBCGsrAwAhFCAGKwMIIRUgBisDACEWIAQgAEEQaysDADkDMCAEIBQ5AzggBCAWOQMgIAQgFTkDKCAPQbKvASAEQSBqEDNBCiAPEKcBGiAPENQBDAQFIAYgA0EEdCICaiIHIAAgAmoiAikDADcDACAHIAIpAwg3AwggA0EBaiEDDAELAAsACyALEBhBACEGQc3mA0EAEDcMBwtBASEDIAUgDXJBAUcNAQtBACEDQQAhCQNAIAkgDEYNASAIIAlBBXRqIgAgBisDACIUOQMQIAAgFDkDACAJQQFqIQkMAAsAC0QAAAAAAAAkQCEUQQAhCgNAIANBAXFFIApBDktyRQRAIAggDCAGIAQoArwCIBQQgw9BACEDA0ACQAJAIAMgDEYEQCAMIQMMAQsgCCADQQV0aiIAKQMAQv/////////3/wBSBEAgACkDEEL/////////d1INAgsgFCAUoCEUCyAKQQFqIQogAyAMRyEDDAMLIANBAWohAwwACwALCyADQQFxBEAgDiARIA4oAgBBA3FBA0YbKAIoECEhACAEIA4gECAOKAIAQQNxQQJGGygCKBAhNgIUIAQgADYCEEHp4QQgBEEQahAqIAQgBCkCwAI3AwggBEEIaiAEQfABahCOBCAIIAwgBCgC8AEgBCgC9AFEAAAAAAAAJEAQgw8LIAEgBCgCvAI2AgAgCxAYDAQLIApBAmoLIQogByEDDAALAAsgCxAYIAQgDiAQIA4oAgBBA3FBAkYbKAIoECE2AgBBmPEDIAQQN0EAIQYLIARB0AJqJAAgBgurAwEDfyMAQeAAayIFJAAgBSAAKwMAOQMwIAUgACsDCDkDOCAFIAErAwA5A0AgBSABKwMIOQNIQQAhAQJAIAIgBUEwaiAFQdgAahCMD0EASA0AAkAgBARAIAUgBSkCWDcDCCAFQQhqIAVB0ABqEI4EDAELIAIoAgRBIBAaIQEgAigCACEGIAIoAgQhAkEAIQADQCAAIAJGBEAgBUIANwMoIAVCADcDICAFQgA3AxggBUIANwMQIAUgBSkCWDcDACABIAIgBSAFQRBqIAVB0ABqELAIIAEQGEEATg0CQQAhAQwDBSABIABBBXRqIgQgBiAAQQR0aiIHKQMANwMAIAQgBykDCDcDCCAEIAYgAEEBaiIAQQAgACACRxtBBHRqIgcpAwA3AxAgBCAHKQMINwMYDAELAAsACyAFKAJUIgJBEBBOIgEEQEEAIQAgBSgCUCEEA0AgACACRgRAIAMgAjYCAAwDBSABIABBBHQiBmoiByAEIAZqIgYpAwA3AwAgByAGKQMINwMIIABBAWohAAwBCwALAAtBACEBQc3mA0EAEDcLIAVB4ABqJAAgAQtMAgJ/AXxBASECA0AgASACRkUEQCAEIAAgAkEEdGoiAysDACADQRBrKwMAoSADKwMIIANBCGsrAwChEEegIQQgAkEBaiECDAELCyAEC+0CAQJ/IwBBEGsiAyQAQbD9CkF/NgIAQaz9CiAANgIAQaj9CiACNgIAQaT9CkF/NgIAQaD9CiACNgIAQZz9CiABNgIAQZj9CkF/NgIAQZT9CiABNgIAQZD9CiAANgIAQYz9CkEANgIAAn9BACECAkACQAJAQYD9CigCACIBQYT9CigCACIARw0AAkAgAUEASARAIAEhAAwBC0H4/AogAUEBdEEBIAEbQSgQjAdBhP0KKAIAIQBFDQELIABBf0YNAUH4/AogAEEBakEoEIwHDQFBhP0KKAIAIQALQYD9CigCACIBIABPDQFB+PwKQfz8CigCACABaiAAcEEoEN8BQYz9CkEoEB8aQQEhAkGA/QpBgP0KKAIAQQFqNgIACyACDAELQZoMQYm4AUHDAUGxxQEQAAALRQRAIANBuS02AgggA0HgAjYCBCADQZC4ATYCAEGI9ggoAgBBsoEEIAMQIBpBfyEECyADQRBqJAAgBAvbAgEGfyMAQeAAayICJAAgACgCCCEEAkADQCAEIgMgACgCECIFSQRAIAAoAgAiByADQQJ0aigCACgCACEFIAEoAgAhBiACIAcgA0EBaiIEQQJ0aigCACgCACIHKQMINwMoIAIgBykDADcDICACIAUpAwg3AxggAiAFKQMANwMQIAIgBikDCDcDCCACIAYpAwA3AwAgAkEgaiACQRBqIAIQgARBAUcNAQwCCwsgACgCDCEEIAUhAwN/IAMgBE8NASAAKAIAIARBAnRqIgYoAgAoAgAhAyABKAIAIQUgAiAGQQRrKAIAKAIAIgYpAwg3A1ggAiAGKQMANwNQIAIgAykDCDcDSCACIAMpAwA3A0AgAiAFKQMINwM4IAIgBSkDADcDMCACQdAAaiACQUBrIAJBMGoQgARBAkYEfyAEBSAEQQFrIQQgACgCECEDDAELCyEDCyACQeAAaiQAIAMLrQIBBX8jAEFAaiICJAAgAkGA/QopAgA3AzggAkH4/AopAgA3AzACf0EAQfj8CigCACACQTBqIAAQGUEobGooAgANABogAkGA/QopAgA3AyggAkH4/AopAgA3AyBB+PwKKAIAIAJBIGogABAZQShsakEBNgIAQQEgACABRg0AGgNAAkAgAkGA/QopAgA3AxggAkH4/AopAgA3AxBB+PwKKAIAIQUgAkEQaiAAEBkhBiADQQNGDQACQCADQQxsIgQgBSAGQShsamooAgxBf0YNACACQYD9CikCADcDCCACQfj8CikCADcDAEH4/AooAgAgAiAAEBlBKGxqIARqKAIMIAEQig9FDQBBAQwDCyADQQFqIQMMAQsLIAUgBkEobGpBADYCAEEACyACQUBrJAAL+gEBBX8jAEHQAGsiAiQAA0AgA0EDRkUEQCACQYD9CikCADcDSCACQfj8CikCADcDQCADQQxsIgVB+PwKKAIAIAJBQGsgABAZQShsamooAgQoAgAhBiACQYD9CikCADcDOCACQfj8CikCADcDMEH4/AooAgAgAkEwaiAAEBlBKGxqIAVqKAIIKAIAIQUgAiAGKQMINwMoIAIgBikDADcDICACIAUpAwg3AxggAiAFKQMANwMQIAIgASkDCDcDCCACIAEpAwA3AwAgA0EBaiEDIAQgAkEgaiACQRBqIAIQgARBAkdqIQQMAQsLIAJB0ABqJAAgBEUgBEEDRnIL3iMCEn8NfCMAQdADayIDJAACQAJAIAAoAgQiBkEIEE4iDiAGRXJFBEAgA0HqLDYCCCADQd8ANgIEIANBkLgBNgIAQYj2CCgCAEGygQQgAxAgGgwBCwJAIAZBBBBOIgkgBkVyRQRAIANBmCo2AhggA0HkADYCFCADQZC4ATYCEEGI9ggoAgBBsoEEIANBEGoQIBoMAQsCQAJAAkADQEGA/QooAgAgBE0EQAJAQfj8CkEoEDFBACEEIANBADYCvAMgAyAAKAIEIgVBAXQiBjYCsAMgAyAGQQQQTiILNgKsAyALDQAgA0HTLDYCaCADQe4ANgJkIANBkLgBNgJgQYj2CCgCAEGygQQgA0HgAGoQIBoMAwsFIANBgP0KKQIANwNYIANB+PwKKQIANwNQIANB0ABqIAQQGSEGAkACQAJAQYj9CigCACIIDgICAAELQbCDBEHCAEEBQYj2CCgCABA6GhA7AAsgA0EoaiIHQfj8CigCACAGQShsakEoEB8aIAcgCBEBAAsgBEEBaiEEDAELCyADIAVB/////wdxIhE2ArQDQX8hBiADIBFBAWsiDzYCuANEAAAAAAAA8H8hFQNAIAQgBUcEQCAAKAIAIARBBHRqKwMAIhcgFSAVIBdkIggbIRUgBCAGIAgbIQYgBEEBaiEEDAELCyADIAAoAgAiBCAGQQR0aiIIKQMINwOgAyADIAgpAwA3A5gDIAMgBCAGIAUgBhtBBHRqQRBrIggpAwg3A5ADIAMgCCkDADcDiAMgBCAGQQFqIAVwQQR0aiEEAkACQAJAIAMrA5gDIhUgAysDiANiDQAgFSAEKwMAYg0AIAQrAwggAysDoANkDQELIAMgAykDkAM3A4ADIAMgAykDoAM3A/ACIAMgAykDmAM3A+gCIAMgAykDiAM3A/gCIAMgBCkDCDcD4AIgAyAEKQMANwPYAiADQfgCaiADQegCaiADQdgCahCABCAAKAIEIQVBAUcNAEEAIQdBACEEA0AgBCAFRg0CIAAoAgAhCAJAAkAgBEUNACAIIARBBHRqIgYrAwAgBkEQaysDAGINACAGKwMIIAZBCGsrAwBhDQELIA4gB0EDdGoiBiAIIARBBHRqNgIAIAYgDiAHIAVwQQN0ajYCBCAJIAdBAnRqIAY2AgAgB0EBaiEHCyAEQQFqIQQMAAsACyAFQQFrIQpBACEHIAUhBgNAIAYhBANAIARFDQIgACgCACEIAkAgBEEBayIGIApPDQAgCCAGQQR0aiIMKwMAIAggBEEEdGoiDSsDAGINACAGIQQgDCsDCCANKwMIYQ0BCwsgDiAHQQN0aiIEIAggBkEEdGo2AgAgBCAOIAcgBXBBA3RqNgIEIAkgB0ECdGogBDYCACAHQQFqIQcMAAsACyMAQRBrIgwkAAJ/AkACQAJAA0ACQEEAIQAgB0EESQ0AA0AgACIEIAdGDQMgBEEBaiEAIARBAmogB3AhCkEAIQ0jAEGAAmsiBSQAIAVB8AFqIAkgBCAHakEBayAHcCIIEMEBIAVB4AFqIAkgBBDBASAFQdABaiAJIAAgB3AiBhDBAQJAAkAgBSsD+AEgBSsD6AEiFaEgBSsD0AEgBSsD4AEiF6GiIAUrA9gBIBWhIAUrA/ABIBehoqFEAAAAAAAAAABjBEAgBUHAAWogCSAEEMEBIAVBsAFqIAkgChDBASAFQaABaiAJIAgQwQEgBSsDyAEgBSsDuAEiFaEgBSsDoAEgBSsDsAEiF6GiIAUrA6gBIBWhIAUrA8ABIBehoqFEAAAAAAAAAABjRQ0CIAVBkAFqIAkgChDBASAFQYABaiAJIAQQwQEgBUHwAGogCSAGEMEBIAUrA5gBIAUrA4gBIhWhIAUrA3AgBSsDgAEiF6GiIAUrA3ggFaEgBSsDkAEgF6GioUQAAAAAAAAAAGNFDQIMAQsgBUHgAGogCSAEEMEBIAVB0ABqIAkgChDBASAFQUBrIAkgBhDBASAFKwNoIAUrA1giFaEgBSsDQCAFKwNQIhehoiAFKwNIIBWhIAUrA2AgF6GioUQAAAAAAAAAAGRFDQELQQAhCANAIAgiBiAHRiINDQEgBkEBaiIIQQAgByAIRxsiECAKRiAGIApGciAEIAZGIAQgEEZycg0AIAVBMGogCSAEEMEBIAVBIGogCSAKEMEBIAVBEGogCSAGEMEBIAUgCSAQEMEBIAUrAzAiGiAFKwMgIhWhIhaaIRsCQAJAIAUrAzgiHCAFKwMoIhehIh4gBSsDECIfIBWhoiAFKwMYIiAgF6EgFqKhIhZEAAAAAAAAAABkIBZEAAAAAAAAAABjIgZyIhBFDQAgHiAFKwMAIhYgFaGiIAUrAwgiGCAXoSAboqAiGUQAAAAAAAAAAGQgGUQAAAAAAAAAAGMiEnJFDQAgICAYoSIZIBogFqGiIBwgGKEgHyAWoSIdoqEiIUQAAAAAAAAAAGQgIUQAAAAAAAAAAGMiE3JFDQAgGSAVIBahoiAXIBihIB2aoqAiFkQAAAAAAAAAAGQgFkQAAAAAAAAAAGMiFHINAQsgFyAcoSEWIBUgGqEhGAJAIBANACAfIBqhIhkgGKIgFiAgIByhIh2ioEQAAAAAAAAAAGZFDQAgGSAZoiAdIB2ioCAYIBiiIBYgFqKgZQ0DCwJAIB4gBSsDACIeIBWhoiAFKwMIIhkgF6EgG6KgIhtEAAAAAAAAAABkIBtEAAAAAAAAAABjcg0AIB4gGqEiGyAYoiAWIBkgHKEiHaKgRAAAAAAAAAAAZkUNACAbIBuiIB0gHaKgIBggGKIgFiAWoqBlDQMLIBkgIKEhFiAeIB+hIRgCQCAgIBmhIhsgGiAeoaIgHCAZoSAfIB6hIh2ioSIhRAAAAAAAAAAAZCAhRAAAAAAAAAAAY3INACAaIB+hIhogGKIgHCAgoSIcIBaioEQAAAAAAAAAAGZFDQAgGiAaoiAcIByioCAYIBiiIBYgFqKgZQ0DCyAbIBUgHqGiIBcgGaEgHZqioCIaRAAAAAAAAAAAZCAaRAAAAAAAAAAAY3INASAVIB+hIhUgGKIgFyAgoSIXIBaioEQAAAAAAAAAAGZFIBUgFaIgFyAXoqAgGCAYoiAWIBaioGVFcg0BDAILIBMgFHNFIAYgEkZyDQALCyAFQYACaiQAIA1FDQALIAkgBEECdGooAgAgCSAAQQAgACAHRxsiAEECdGooAgAgCSAKQQJ0aigCABCIDw0EIAAgB0EBayIHIAAgB0sbIQQDQCAAIARGDQIgCSAAQQJ0aiAJIABBAWoiAEECdGooAgA2AgAMAAsACwsgCSgCACAJKAIEIAkoAggQiA8NAgwBCyAMQdKtATYCCCAMQc0CNgIEIAxBkLgBNgIAQYj2CCgCAEGygQQgDBAgGgtBAAwBC0F/CyEAIAxBEGokAAJAIABFBEBBACEMQYD9CigCACEEQQAhCANAIAQgCE0EQANAIAQgDE0NBCAMIAEQiw9BgP0KKAIAIQQNBCAMQQFqIQwMAAsACyAIQQFqIgAhCgNAQQAhBiAEIApNBEAgACEIDAILA0BBACEEAkAgBkEDRwRAA0AgBEEDRg0CIANBgP0KKQIANwOIASADQfj8CikCADcDgAFB+PwKKAIAIQcgA0GAAWogCBAZIQUgA0GA/QopAgA3A3ggA0H4/AopAgA3A3BB+PwKKAIAIQ0gA0HwAGogChAZIRACQAJAAkAgByAFQShsaiAGQQxsaiIHKAIEKAIAIhIgDSAQQShsaiAEQQxsaiIFKAIEKAIAIhBHBEAgBSgCCCgCACENDAELIAUoAggoAgAiDSAHKAIIKAIARg0BCyANIBJHDQEgBygCCCgCACAQRw0BCyAHIAo2AgwgBSAINgIMCyAEQQFqIQQMAAsACyAKQQFqIQpBgP0KKAIAIQQMAgsgBkEBaiEGDAALAAsACwALIAsQGAwBCwJAIAQgDEcEQCABQRBqIQZBACEAA0AgACAETw0CIAAgBhCLD0GA/QooAgAhBA0CIABBAWohAAwACwALIANBsZsBNgKYASADQbYBNgKUASADQZC4ATYCkAFBiPYIKAIAQbKBBCADQZABahAgGgwDCyAAIARGBEAgA0GLmwE2AqgBIANBwQE2AqQBIANBkLgBNgKgAUGI9ggoAgBBsoEEIANBoAFqECAaDAMLIAwgABCKD0UEQCADQdP4ADYCyAIgA0HLATYCxAIgA0GQuAE2AsACQQAhBEGI9ggoAgBBsoEEIANBwAJqECAaIAsQGCAJEBggDhAYQQIQsggNBSACQQI2AgRBtP0KKAIAIgAgASkDADcDACAAIAEpAwg3AwggACAGKQMANwMQIAAgBikDCDcDGCACIAA2AgAMBgsgACAMRgRAIAsQGCAJEBggDhAYQQIQsggNBSACQQI2AgRBACEEQbT9CigCACIAIAEpAwA3AwAgACABKQMINwMIIAAgBikDADcDECAAIAYpAwg3AxggAiAANgIADAYLIANBADYCzAMgAyAGNgLIAyADQQA2AsQDIAMgATYCwAMgEUUEQCADIAsoAgA2AsQDCyADQcADaiIAQQhyIQggAyAPNgK0AyALIA9BAnRqIAA2AgAgAyAPNgK8AyAPIgchBSAMIQoDQCAKQX9HBEBBACEEIANBgP0KKQIANwO4AiADQfj8CikCADcDsAJB+PwKKAIAIANBsAJqIAoQGUEobGoiAEECNgIAIABBDGohEQJ/AkADQCAEQQNHBEAgESAEQQxsIgFqKAIAIg1Bf0cEQCADQYD9CikCADcDqAIgA0H4/AopAgA3A6ACQfj8CigCACADQaACaiANEBlBKGxqKAIAQQFGDQMLIARBAWohBAwBCwsgCyAHQQJ0aiIEKAIAKAIAIQAgCyAFQQJ0aigCACgCACEBIAMgBikDCDcD6AEgAyAGKQMANwPgASADIAEpAwg3A9gBIAMgASkDADcD0AEgAyAAKQMINwPIASADIAApAwA3A8ABIANB4AFqIANB0AFqIANBwAFqEIAEIQAgCCAEKAIAIgEgAEEBRiIAGyEEIAEgCCAAGwwBCyAAQQRqIg0gAWoiACgCBCgCACEBIA0gBEEBakEDcEEMbGooAgQoAgAhBCADIAAoAgAoAgAiDSkDCDcDmAIgAyANKQMANwOQAiADIAQpAwg3A4gCIAMgBCkDADcDgAIgAyABKQMINwP4ASADIAEpAwA3A/ABIANBkAJqIANBgAJqIANB8AFqEIAEQQFGBEAgACgCACEEIAAoAgQMAQsgACgCBCEEIAAoAgALIQACQCAKIAxGBEAgBSAHTQRAIAAgCyAHQQJ0aigCADYCBAsgAyAHQQFqIgc2ArgDIAsgB0ECdGogADYCACAFIAdNBEAgBCALIAVBAnRqKAIANgIECyADIAVBAWsiBTYCtAMgCyAFQQJ0aiAENgIADAELIAMCfwJAIAsgBUECdGooAgAgBEYNACALIAdBAnRqKAIAIARGDQAgA0GsA2ogBBCJDyIAIAdNBEAgBCALIABBAnRqKAIANgIECyADIABBAWsiBTYCtAMgCyAFQQJ0aiAENgIAIAAgDyAAIA9LGwwBCyAFIANBrANqIAAQiQ8iAU0EQCAAIAsgAUECdGooAgA2AgQLIAMgAUEBaiIHNgK4AyALIAdBAnRqIAA2AgAgASAPIAEgD0kbCyIPNgK8AwtBACEEA0AgBEEDRgRAQX8hCgwDCwJAIBEgBEEMbGoiACgCACIBQX9GDQAgA0GA/QopAgA3A7gBIANB+PwKKQIANwOwAUH4/AooAgAgA0GwAWogARAZQShsaigCAEEBRw0AIAAoAgAhCgwDCyAEQQFqIQQMAAsACwsgCxAYQQAhACAIIQQDQCAEBEAgAEEBaiEAIAQoAgQhBAwBCwsgABCyCEUNAQsgCRAYDAILIAIgADYCBEG0/QooAgAhAQNAIAgEQCABIABBAWsiAEEEdGoiBCAIKAIAIgYpAwA3AwAgBCAGKQMINwMIIAgoAgQhCAwBCwsgAiABNgIAIAkQGCAOEBhBACEEDAMLIAsQGCAJEBggDhAYQX8hBAwCCyAOEBgLQX4hBAsgA0HQA2okACAEC44EAgh/AX4jAEEwayICJAACQAJAIAAEQCABRQ0BIAAoAgRB5ABsIAAoAgAEf0EBIAAoAgh0BUEACyIFQcYAbEkNAkEBIAUEfyAAKAIIQQFqBUEKCyIDdEEEEBohBCACQgA3AxggAkIANwMoIAJCADcDICACIAM2AhggAkIANwMQIAIgBDYCEEEAIQMDQCAAKAIAIQQgAyAFRgRAIAQQGCAAIAIpAyg3AxggACACKQMgNwMQIAAgAikDGDcDCCAAIAIpAxA3AwAMBAsgBCADQQJ0aigCACIEQQFqQQJPBEAgAkEQaiAEEI0PCyADQQFqIQMMAAsAC0Gl1QFBjL4BQaMDQcCwARAAAAtBidUBQYy+AUGkA0HAsAEQAAALIAEoAhApAwghCgJAIAAtAAxBAUYEQCAKIAApAxBaDQELIAAgCjcDECAAQQE6AAwLIAApAxggClQEQCAAIAo3AxgLAkAgACgCACIEBEBBASAAKAIIdCIFIAAoAgQiBksNAQtBiogBQYy+AUHRA0HAsAEQAAALIAVBAWshByAKpyEIQQAhAwJAA0AgAyAFRwRAIAQgAyAIaiAHcUECdGoiCSgCAEEBakECSQ0CIANBAWohAwwBCwsgAkHgAzYCBCACQYy+ATYCAEGI9ggoAgBB2L8EIAIQIBoQOwALIAkgATYCACAAIAZBAWo2AgQgAkEwaiQAC3MBAX8gABAkIAAQS08EQCAAQQEQvQELIAAQJCEBAkAgABAoBEAgACABakEAOgAAIAAgAC0AD0EBajoADyAAECRBEEkNAUGTtgNBoPwAQa8CQcSyARAAAAsgACgCACABakEAOgAAIAAgACgCBEEBajYCBAsLuAECA38BfCMAQTBrIgQkAANAIAIgBUYEQCADBEAgASsDACEHIAQgASsDCDkDCCAEIAc5AwAgAEHRpQMgBBAeCyAAQe7/BBAbGiAEQTBqJAAFAkAgBUUEQCABKwMAIQcgBCABKwMIOQMYIAQgBzkDECAAQaOlAyAEQRBqEB4MAQsgASAFQQR0aiIGKwMAIQcgBCAGKwMIOQMoIAQgBzkDICAAQdGlAyAEQSBqEB4LIAVBAWohBQwBCwsLigEBA38jAEEQayIEJAAgAEGPyQFBABAeIAFBACABQQBKGyEFQQAhAQNAIAEgBUcEQCABBEAgAEG6oANBABAeCyAEIAIgAUEEdGoiBisDADkDACAAQeDMAyAEEB4gBigCCCADIAAQuwIgAEH9ABBlIAFBAWohAQwBCwsgAEHAzQRBABAeIARBEGokAAu7AQECfwJAAkAgACgCMBC7AyAAKAIsEJoBRgRAIAAoAjAQuwMhAyAAEDkgAEYEfyABQRxqBUEkEFILIgIgATYCECAAKAIwIAIQjQ8gACgCLCIBIAJBASABKAIAEQMAGiAAKAIwELsDIAAoAiwQmgFHDQEgACgCMBC7AyADQQFqRw0CDwtBjqMDQYy+AUHiAEHJnwEQAAALQY6jA0GMvgFB6QBByZ8BEAAAC0GejgNBjL4BQeoAQcmfARAAAAsjACAAKAIAKAIAQQR2IgAgASgCACgCAEEEdiIBSyAAIAFJaws1ACAAIAFBACACEJUPIAAQeSEAA0AgAARAIAFBue0EEBsaIAAgASACEJMPIAAQeCEADAELCwucAgEFfyMAQSBrIgQkAAJAAkACQCAAEDkgAEYNACAAQbWnAUEAEGsgATYCCCAAECEiA0UNASABQQFqIQEgA0HiN0EHEOoBDQAgABAhIQMgAEG1pwFBABBrKAIIIQYgAiADQYAEIAIoAgARAwAiBQRAIAUoAgwgBkYNASAEIAM2AhBB0fsEIARBEGoQKgwBC0EBQRAQgAYhBSADEKUBIgdFDQIgBSAGNgIMIAUgBzYCCCACIAVBASACKAIAEQMAGgsgABB5IQADQCAABEAgACABIAIQlA8hASAAEHghAAwBCwsgBEEgaiQAIAEPC0GI1AFB6/sAQQxBnvcAEAAACyAEIAMQQEEBajYCAEGI9ggoAgBB9ekDIAQQIBoQLwAL0A4BCH8jAEGwAWsiBiQAIAIEQEHkuQpBlO4JKAIAEJMBIQogAEEBQbWnAUEMQQAQswIgAEECQbWnAUEMQQAQswIgAEEAQbWnAUF0QQAQswIgAEEAIAoQlA8hCyAAEBwhCANAIAgEQAJAIAgoAhAtAIYBQQFGBEAgCiAIECFBgAQgCigCABEDACIFRQRAQX8hBAwCCyAFKAIMIQQMAQsgCSALaiEEIAlBAWohCQsgCEG1pwFBABBrIAQ2AgggACAIECwhBANAIAQEQCAEQbWnAUEAEGsgBzYCCCAHQQFqIQcgACAEEDAhBAwBCwsgACAIEB0hCAwBCwsgChCZARoLIAMgAygCACIFQQFqNgIAIAEgBRBEIAFB8NgDEBsaIAAQISABIAMoAgAQRCABQfrMAxAbGiADIAEQuwICQCACBEAgAUG57QQQGxogASADKAIAEEQgBkG+igFB+pMBIAAQggIbNgKQASABQarqBCAGQZABahAeIAEgAygCABBEIAZBvooBQfqTASAAENwFGzYCgAEgAUGlNCAGQYABahAeIAAgASADEIEGIAFBue0EEBsaIAEgAygCABBEIAYgCzYCcCABQZmyASAGQfAAahAeDAELIAAgASADEIEGIAFBue0EEBsaIAEgAygCABBEIAYgAEG1pwFBABBrKAIINgKgASABQa2yASAGQaABahAeCwJAIAAQeSIFRQ0AIAFBue0EEBsaIAMgAygCACIEQQFqNgIAIAEgBBBEAkAgAgRAIAFBy80EEBsaDAELIAFB2c0EEBsaIAEgAygCABBEC0Hx/wQhByAFIQQDQCAEBEAgASAHEBsaAkAgAgRAIAQgASADEJMPDAELIAYgBEG1pwFBABBrKAIINgJgIAFBwbIBIAZB4ABqEB4LQbntBCEHIAQQeCEEDAELCyACDQAgAyADKAIAQQFrNgIAIAFB7v8EEBsaIAEgAygCABBEIAFB/sgBEBsaCyAAEBwhBAJAAkACQANAIAQEQCAEKAIQLQCGAUEBRw0CIAAgBBAdIQQMAQsLIAJFIAVFcg0CDAELIAFBue0EEBsaAkAgAgRAIAUNASADIAMoAgAiBUEBajYCACABIAUQRCABQcvNBBAbGgwBCyADIAMoAgAiBUEBajYCACABIAUQRCABQfXNBBAbGiABIAMoAgAQRAtB8f8EIQcgABAcIQQDQCAERQ0BAkAgBCgCEC0AhgENACABIAcQGxogAgRAIAMgAygCACIFQQFqNgIAIAEgBRBEIAFB8NgDEBsaIAEgAygCABBEIAYgBEG1pwFBABBrKAIINgJAIAFB6eoEIAZBQGsQHiABIAMoAgAQRCABQfrMAxAbGiAEECEgAyABELsCIAQgASADEIEGIAFB7v8EEBsaIAMgAygCAEEBayIFNgIAIAEgBRBEIAFBrwgQGxpBue0EIQcMAQsgBiAEQbWnAUEAEGsoAgg2AlAgAUHBsgEgBkHQAGoQHkG6oAMhBwsgACAEEB0hBAwACwALIAMgAygCAEEBazYCACABQe7/BBAbGiABIAMoAgAQRCABQf7IARAbGgtBACEHIAAQHCEIA0ACQCAIRQRAIAdFDQFBACEIIAdBBBCABiEJIAAQHCEFA0AgBUUEQCAJIAdBBEHoAhC1ASABQbntBBAbGiADIAMoAgAiAEEBajYCACABIAAQRCABQenNBBAbGiACRQRAIAEgAygCABBEC0EAIQQDQCAEIAdGBEAgCRAYIAMgAygCAEEBazYCACABQe7/BBAbGiABIAMoAgAQRCABQf7IARAbGgwFBQJAIAYCfwJAAkAgBARAIAkgBEECdGohACACRQ0CIAFBue0EEBsaIAAoAgAhAAwBCyAJKAIAIgAgAkUNAhoLIAMgAygCACIFQQFqNgIAIAEgBRBEIAFB8NgDEBsaIAEgAygCABBEIAYgAEG1pwFBABBrKAIINgIgIAFB6eoEIAZBIGoQHiABIAMoAgAQRCAGIABBMEEAIAAoAgBBA3FBA0cbaigCKEG1pwFBABBrKAIINgIQIAFB3OoEIAZBEGoQHiABIAMoAgAQRCAGIABBUEEAIAAoAgBBA3FBAkcbaigCKEG1pwFBABBrKAIINgIAIAFBubIBIAYQHiAAIAEgAxCBBiABQe7/BBAbGiADIAMoAgBBAWsiADYCACABIAAQRCABQa8IEBsaDAILIAFBuqADEBsaIAAoAgALQbWnAUEAEGsoAgg2AjAgAUHBsgEgBkEwahAeCyAEQQFqIQQMAQsACwALIAAgBRAsIQQDQCAEBEAgCSAIQQJ0aiAENgIAIAhBAWohCCAAIAQQMCEEDAEFIAAgBRAdIQUMAgsACwALAAsgACAIECwhBANAIAQEQCAHQQFqIQcgACAEEDAhBAwBBSAAIAgQHSEIDAMLAAsACwsgAUHu/wQQGxogAyADKAIAQQFrIgA2AgAgASAAEEQgAUGW2ANBrwggAhsQGxogBkGwAWokAAuDAQEBfyAAIAAoAgBBd3E2AgAgABB5IQIDQCACBEAgAkEAEJYPIAIQeCECDAELCwJAIAFFDQAgABAcIQEDQCABRQ0BIAEgASgCAEF3cTYCACAAIAEQLCECA0AgAgRAIAIgAigCAEF3cTYCACAAIAIQMCECDAELCyAAIAEQHSEBDAALAAsLvwEBA38jAEEgayICJAACQAJAAkACQAJAIAEoAiBBAWsOBAECAgACCyABKAIAIgFBicEIEE0NAiAAQfzACBAbGgwDCyABLQADRQRAIABB/MAIEBsaDAMLIAEtAAAhAyABLQABIQQgAiABLQACNgIYIAIgBDYCFCACIAM2AhAgAEGdEyACQRBqEB4MAgsgAkGIATYCBCACQb68ATYCAEGI9ggoAgBB2L8EIAIQIBoQOwALIAAgARAbGgsgAkEgaiQAC+sDAQd/IwBBIGsiAyQAAkAgAARAAkACQAJAIAFBAWoOAgEAAgtB2NQBQaK6AUGlAUHNsAEQAAALQZjbAUGiugFBpgFBzbABEAAACyAAKAIEQeQAbCAAKAIAIgIEf0EBIAAoAgh0BUEACyIFQcYAbEkNAUEBIAUEfyAAKAIIQQFqBUEKCyICdEEEEBohBCADIAI2AhxBACECIANBADYCGCADIAQ2AhQDQCAAKAIAIQQgAiAFRgRAIAQQGCAAIAMoAhw2AgggACADKQIUNwIAIAAoAgAhAgwDCyAEIAJBAnRqKAIAIgRBAWpBAk8EQCADQRRqIAQQmA8LIAJBAWohAgwACwALQe/TAUGiugFBpAFBzbABEAAACwJAIAIEQEEBIAAoAgh0IgUgACgCBE0NASAFQQFrIQQgAUEIaiABKQMAQj+IpxC+BiEGIAAoAgAhB0EAIQICQANAIAIgBUcEQCAHIAIgBmogBHFBAnRqIggoAgBBAWpBAkkNAiACQQFqIQIMAQsLIANB2gE2AgQgA0GiugE2AgBBiPYIKAIAQdi/BCADECAaEDsACyAIIAE2AgAgACAAKAIEQQFqNgIEIANBIGokAA8LQfzTAUGiugFByAFBzbABEAAAC0H0hwFBoroBQcoBQc2wARAAAAubAQEBfwJAAkACQCACQQJrDgIAAQILIAAgAUECEIQGIQMMAQsgABC1CCEDCyAAQfqSARAbGiAAIAIgAxCDBiAAQcbDAxAbGiAAIAErAwAQeyAAQbLDAxAbGiAAIAErAwiaEHsgAEG/wwMQGxogACABKwMQIAErAwChEHsgAEGDwwMQGxogACABKwMYIAErAwihEHsgAEHM1AQQGxoL/gcCBn8BfCMAQdABayIDJAAgACgCECEGIABB5roDEBsaIABBm7ADQfjBA0H3vAMgAi0AMCIEQfIARhsgBEHsAEYbEBsaIAIrAxggASsDCKAhCSAGLQCNAkECcUUEQCAAQczDAxAbGiAAIAErAwAQeyAAQbnDAxAbGiAAIAmaEHsgAEGPxwMQGxoLAn8CQCACKAIEIgQoAggiAQRAQRAhB0EIIQUgASEEAkACQAJAIAAoAgAoAqABKAIQKAL0AUEBaw4CAgABCyABQRhqIQRBICEHQRwhBQwBCyABQQRqIQQLIAEgBWooAgAhBSABIAdqKAIAIQcgASgCDCEIIAMgBCgCACIENgLAASAAQbMzIANBwAFqEB4gASgCGCIBRSABIARGckUEQCADIAE2ArABIABBrzMgA0GwAWoQHgsgAEEiEGUgBQRAIAMgBTYCoAEgAEGotQMgA0GgAWoQHgsgCARAIAMgCDYCkAEgAEHFtQMgA0GQAWoQHgsgB0UNASADIAc2AoABIABB2LUDIANBgAFqEB5BAQwCCyADIAQoAgA2AnAgAEGWtQMgA0HwAGoQHgtBAAshBAJAIAIoAgQoAhgiAUH/AHFFDQAgAUEBcUUgBXJFBEAgAEGLwgMQGxoLIAQgAUECcUVyRQRAIABBn8IDEBsaCyABQeQAcQRAIABB78MDEBsaQQAhBSABQQRxIgQEQCAAQaOXARAbGkEBIQULIAFBwABxBEAgA0G6oANB8f8EIAQbNgJgIABBmJcBIANB4ABqEB5BASEFCyABQSBxBEAgA0G6oANB8f8EIAUbNgJQIABBofoAIANB0ABqEB4LIABBIhBlCyABQQhxBEAgAEH7tQMQGxoLIAFBEHFFDQAgAEG0wgMQGxoLIAMgAigCBCsDEDkDQCAAQcG6AyADQUBrEB4CQAJAAkACQCAGKAIwQQFrDgQBAwMAAwsgBigCECIBQfDACBAuRQ0BIAMgATYCECAAQbq1AyADQRBqEB4MAQsgBi0AECEBIAYtABEhBCADIAYtABI2AjggAyAENgI0IAMgATYCMCAAQe2tAyADQTBqEB4gBi0AEyIBQf8BRg0AIAMgAbhEAAAAAADgb0CjOQMgIABB07oDIANBIGoQHgsgAEE+EGUgBi0AjQJBAnEEQCAAQcKtAxAbGiAAIAYoAtwBEIoBIABBisMDEBsaIAAgCZoQeyAAQc3gARAbGgsgAigCACADQfjACCgCADYCDCADQQxqQdICIAAQngQgBi0AjQJBAnEEQCAAQYXfARAbGgsgAEGt0gQQGxogA0HQAWokAA8LIANBmAQ2AgQgA0G+vAE2AgBBiPYIKAIAQdi/BCADECAaEDsACwsAIABB/NIEEBsaC+YBAQF/IwBBEGsiBSQAIABB3IIBEBsaIAQEQCAAQePFARAbGiAAIAQQigEgAEEiEGULIABB28IBEBsaAkAgAUUNACABLQAARQ0AIABBocQDEBsaIAVBADYCCCAFQQA2AgwgASAFQQhqQdICIAAQngQgAEEiEGULAkAgAkUNACACLQAARQ0AIABB0MQDEBsaIAVB+MAIKAIANgIEIAIgBUEEakHSAiAAEJ4EIABBIhBlCwJAIANFDQAgAy0AAEUNACAAQdHDAxAbGiAAIAMQigEgAEEiEGULIABBl9YEEBsaIAVBEGokAAtIAQF/IAAgACgCECIBKALcAUEAQe+dASABKAIIEIIEIABBtN8BEBsaIABB6NoBIAEoAggQgQEiARCKASABEBggAEHP0wQQGxoLXgEDfyAAIAAoAhAiASgC3AEgACgCoAEiA0ECTgR/IAAoAgAoAqwCIANBAnRqKAIABUEAC0HonwEgASgCCBCCBCAAQbTfARAbGiAAIAEoAggQIRCKASAAQc/TBBAbGgs8AQF/IAAgACgCECIBKALcAUEAQeI3IAEoAggQggQgAEG03wEQGxogACABKAIIECEQigEgAEHP0wQQGxoL2gECAn8BfCMAQSBrIgEkACAAIAAoAhAiAigC3AFBAEGI+gAgAigCCBCCBCAAQbWsAxAbGiAAKwPoAyEDIAEgACsD8AM5AxggASADOQMQIABB/YIBIAFBEGoQHiABQQAgACgC6AJrNgIAIABBnawDIAEQHiAAIAArA/gDEHsgAEEgEGUgACAAKwOABJoQeyAAQdPVBBAbGgJAIAIoAggQIS0AAEUNACACKAIIECEtAABBJUYNACAAQbbfARAbGiAAIAIoAggQIRCKASAAQc/TBBAbGgsgAUEgaiQACx8AIAAgAUEAQbc3IAAoAhAoAggQggQgAEGX1gQQGxoLCwAgAEH00gQQGxoL0gECAn8BfiMAQTBrIgEkACAAKAIQIQIgAEG0oAMQGxoCQCACKAIIECEtAABFDQAgAigCCBAhLQAAQSVGDQAgAEHOzAMQGxogACACKAIIECEQigELIAEgACgCqAEgACgCpAFsNgIgIABB0dQEIAFBIGoQHiABIAApA8ADNwMQIABBwPgEIAFBEGoQHiAAKQPIAyEDIAEgACkD0AM3AwggASADNwMAIABB3MUDIAEQHiAAKAJAQQJHBEAgAEG0twMQGxoLIABBl9YEEBsaIAFBMGokAAusAQEBfyAAKAJAQQJHBEAgAEHu0wQQGxoCQCAAKAIAKAKgAUH2IhAnIgFFDQAgAS0AAEUNACAAQa/EAxAbGiAAIAEQGxogAEHZ0wQQGxoLIABB7tQEEBsaCyAAQbzHAxAbGiAAIAAoAgwoAgAoAgAQigEgAEHayAMQGxogACAAKAIMKAIAKAIEEIoBIABB0qwDEBsaIAAgACgCDCgCACgCCBCKASAAQeHUBBAbGguJAgEBfyMAQUBqIgUkAAJAIARFDQAgACgCECIEKwNQRAAAAAAAAOA/ZEUNACAAIARBOGoQlQIgAEGmywMQGxogACACIAMQiwIgAEG+zgMQGxogBSACKQMINwM4IAUgAikDADcDMCAAIAVBMGoQ6AEgBSABNgIkIAUgAzYCICAAQaj5AyAFQSBqEB4LIAAoAhArAyhEAAAAAAAA4D9kBEAgABCDBCAAIAAoAhBBEGoQlQIgAEGmywMQGxogACACIAMQiwIgAEG+zgMQGxogBSACKQMINwMYIAUgAikDADcDECAAIAVBEGoQ6AEgBSABNgIEIAUgAzYCACAAQcj5AyAFEB4LIAVBQGskAAsbACAAQaTNAxAbGiAAIAEQGxogAEHu/wQQGxoLxQEBA38jAEEgayIDJAAgACgCECsDKEQAAAAAAADgP2QEQCAAEIMEIAAgACgCEEEQahCVAiAAQZ/JAxAbGiADIAEpAwg3AxggAyABKQMANwMQIAAgA0EQahDoASAAQZmKBBAbGkEBIAIgAkEBTRshBEEBIQIDQCACIARGBEAgAEHvsQQQGxoFIAMgASACQQR0aiIFKQMINwMIIAMgBSkDADcDACAAIAMQ6AEgAEGrigQQGxogAkEBaiECDAELCwsgA0EgaiQAC7UCAQF/IwBBIGsiBCQAAkAgA0UNACAAKAIQIgMrA1BEAAAAAAAA4D9kRQ0AIAAgA0E4ahCVAiAAQZ/JAxAbGiAEIAEpAwg3AxggBCABKQMANwMQIAAgBEEQahDoASAAQZmKBBAbGkEBIQMDQCACIANNBEAgAEGZjgQQGxoFIAAgASADQQR0akEDEIsCIABB/okEEBsaIANBA2ohAwwBCwsLIAAoAhArAyhEAAAAAAAA4D9kBEAgABCDBCAAIAAoAhBBEGoQlQIgAEGfyQMQGxogBCABKQMINwMIIAQgASkDADcDACAAIAQQ6AEgAEGZigQQGxpBASEDA0AgAiADTQRAIABB77EEEBsaBSAAIAEgA0EEdGpBAxCLAiAAQf6JBBAbGiADQQNqIQMMAQsLCyAEQSBqJAAL+wIBA38jAEFAaiIEJAACQCADRQ0AIAAoAhAiAysDUEQAAAAAAADgP2RFDQAgACADQThqEJUCIABBn8kDEBsaIAQgASkDCDcDOCAEIAEpAwA3AzAgACAEQTBqEOgBIABBmYoEEBsaQQEgAiACQQFNGyEFQQEhAwNAIAMgBUYEQCAAQZmOBBAbGgUgBCABIANBBHRqIgYpAwg3AyggBCAGKQMANwMgIAAgBEEgahDoASAAQauKBBAbGiADQQFqIQMMAQsLCyAAKAIQKwMoRAAAAAAAAOA/ZARAIAAQgwQgACAAKAIQQRBqEJUCIABBn8kDEBsaIAQgASkDCDcDGCAEIAEpAwA3AxAgACAEQRBqEOgBIABBmYoEEBsaQQEgAiACQQFNGyECQQEhAwNAIAIgA0YEQCAAQc+xBBAbGgUgBCABIANBBHRqIgUpAwg3AwggBCAFKQMANwMAIAAgBBDoASAAQauKBBAbGiADQQFqIQMMAQsLCyAEQUBrJAALvAEBAX8jAEEgayIDJAAgAyABKQMANwMAIAMgASkDCDcDCCADIAErAxAgASsDAKE5AxAgAyABKwMYIAErAwihOQMYAkAgAkUNACAAKAIQIgErA1BEAAAAAAAA4D9kRQ0AIAAgAUE4ahCVAiAAIANBAhCLAiAAQamOBBAbGgsgACgCECsDKEQAAAAAAADgP2QEQCAAEIMEIAAgACgCEEEQahCVAiAAIANBAhCLAiAAQeGxBBAbGgsgA0EgaiQAC+4CAQR/IwBB0ABrIgMkACAAKAIQIgQrAyhEAAAAAAAA4D9jRQRAIAAgBEEQahCVAiAAIAIoAgQrAxAQeyACKAIEKAIAIgQQQEEeTwRAIAMgBDYCQEH55QMgA0FAaxAqCyAEIQUCQANAIAUtAAAiBkUNASAGQSBGIAbAQQBIciAGQSBJckUEQCAFQQFqIQUgBkH/AEcNAQsLIAMgBDYCMEGr5QMgA0EwahAqCyADIAIoAgQoAgA2AiAgAEGz4QMgA0EgahAeIAIoAgBBtPwKKAIAEM4GIQQgAi0AMCIFQewARwRAIAEgASsDAAJ8IAVB8gBGBEAgAisDIAwBCyACKwMgRAAAAAAAAOA/oguhOQMACyABIAIrAxggASsDCKA5AwggAyABKQMINwMYIAMgASkDADcDECAAIANBEGoQ6AEgAEHRyAMQGxogACACKwMgEHsgAyAENgIAIABBmt4DIAMQHiAEEBgLIANB0ABqJAALaAAjAEEQayICJAACQCABRQ0AIAAoAhAiAygCmAJFDQAgAEGeywMQGxogACADKAKYAkECEIsCIABBv80EEBsaIAIgAUG0/AooAgAQzgYiATYCACAAQdySBCACEB4gARAYCyACQRBqJAALNgEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZaDBCABEB4gAEHdrAQQGxogAUEQaiQAC2MBAX8jAEEQayIBJAAgACgCDCgCFARAIABB+IUEEBsaIABBACAAKAIMKAIUQQRqEM8GCyAAQd2vBBAbGiAAQZWJBBAbGiABIAAoAgwoAhw2AgAgAEHdxwQgARAeIAFBEGokAAuUBAMGfwF+A3wjAEGwAWsiASQAIAAoAtQDIQIgACgC0AMhAyAAKALMAyEFIAAoAsgDIQYgASAAKAIMKAIcQQFqIgQ2AqQBIAEgBDYCoAEgAEHpxgQgAUGgAWoQHiAAKAIMKAIURQRAIAEgAjYCnAEgASADNgKYASABIAU2ApQBIAEgBjYCkAEgAEGpxgQgAUGQAWoQHgsgAUGxlgFB5CAgACgC6AIbNgKAASAAQcP/AyABQYABahAeIAAoAkBBAUYEQCABIAI2AnQgASADNgJwIABBmrUEIAFB8ABqEB4LIAApAsQBIQcgASAAKALMATYCaCABIAc3A2AgAEGyswQgAUHgAGoQHiAAKAIMKAIURQRAIAEgBTYCVCABIAIgBWs2AlwgASAGNgJQIAEgAyAGazYCWCAAQYOUBCABQdAAahAeCyAAKwPoAyEIIAArA/ADIQkgACgC6AIhBCAAKwP4AyEKIAFBQGsgACsDgAQ5AwAgASAKOQM4IAEgBDYCMCABIAk5AyggASAIOQMgIABBoK4EIAFBIGoQHiAAKAJAQQFGBEAgAkHA8ABIIANBv/AATHFFBEAgACgCDCgCECEEIAFBwPAANgIYIAEgAjYCFCABIAM2AhBBmPYEIAFBEGogBBEEAAsgASACNgIMIAEgAzYCCCABIAU2AgQgASAGNgIAIABBs5IEIAEQHgsgAUGwAWokAAsqACMAQRBrIgEkACABIAM2AgQgASACNgIAIABB24YEIAEQHiABQRBqJAAL6AMCBX8BfiMAQTBrIgIkACAAKAIQIQNBsPwKQQA6AAACQCAAKAIMKAIcDQAgAiADKAIIECE2AiAgAEHygAQgAkEgahAeIABBxdwEQbn0BCAAKAJAQQJGGxAbGgJAIAAoAgwoAhQNACAAKAJAQQJHBEAgAEGh9AQQGxoMAQsgACkDyAMhBiACIAApA9ADNwMYIAIgBjcDECAAQcvGBCACQRBqEB4LIABB5KwEEBsaIAAgACgCDCgCGEHgrgoQzwYjAEEQayIEJAACQEGA3wooAgAiAUUNACABQQBBgAEgASgCABEDACEBA0AgAUUNASABLQAQRQRAIAQgASgCDDYCACAAQdbYAyAEEB4gAEH62AQQGxogACABEO0JIABBoeIDEBsaIABBn6QEEBsaC0GA3wooAgAiBSABQQggBSgCABEDACEBDAALAAsgBEEQaiQAIAAoAgwoAhQiAUUNACABKAIAIQEgAkEANgIsIAIgATYCKCAAQQAgAkEoahDPBgtBtPwKQQFBfyADKAIIKAIQLQBzQQFGGzYCAEGw/AotAABFBEAgAEGF3AQQGxpBsPwKQQE6AAALIAMoAtgBIgEEQCACIAFBtPwKKAIAEM4GIgE2AgAgAEH/kQQgAhAeIAEQGAsgAkEwaiQAC5EBAgF/AX4jAEEgayIBJAAgAEGkiQQQGxogACgCQEECRwRAIAEgACgCDCgCHDYCECAAQcHHBCABQRBqEB4LAkAgACgCDCgCFA0AIAAoAkBBAkYNACAAKQPYAyECIAEgACkD4AM3AwggASACNwMAIABBy8YEIAEQHgsgAEH4rwQQGxogAEHizwQQGxogAUEgaiQAC18CAn8BfiMAQRBrIgEkACAAQZmVAxAbGiAAQfXcBEHu/wQgACgCQEECRhsQGxogACgCDCgCACICKQIAIQMgASACKAIINgIIIAEgAzcDACAAQanvBCABEB4gAUEQaiQACyYAIAAgACgCECIAKAKQAiAAKAKYAiAAKAKUAiABIAIgAyAEEIYGC4kBAQF/IAAoAhAhAQJAAkACQCAAKAJAQQJrDgIAAQILIAAgASgCkAIgASgCmAIgASgClAIgASgC2AEgASgC7AEgASgC/AEgASgC3AEQhgYPCyAAIAEoApACIAEoApgCIAEoApQCIAEoAtgBIAEoAuwBIAEoAvwBIAEoAtwBEIYGIABB7NIEEBsaCwvPAQECfyAAKAIQIQECQCAAAn8CQAJAAkAgACgCQA4EAAEEAgQLIABBh4kEEBsaIAEoAtgBIgJFDQMgAi0AAEUNAyAAQaTIAxAbGkHu/wQhAiABKALYAQwCCyABKALYASICRQ0CIAItAABFDQIgAEGkyAMQGxogACABKALYARCKASAAQb7OAxAbGkHu/wQhAiABKAIIECEMAQsgAEGrxQMQGxogACABKAIIECEQigEgAEHHxAMQGxpBkdYEIQIgASgCCBAhCxCKASAAIAIQGxoLC2oCAX8CfkF/IQICQCAAKAIoKQMIIgMgASgCKCkDCCIEVA0AIAMgBFYEQEEBDwsCQCAALQAAQQNxRQ0AIAEtAABBA3FFDQAgACkDCCIDIAEpAwgiBFQNAUEBIQIgAyAEVg0BC0EAIQILIAILxAECA38BfCMAQdAAayIDJAAgACgCECIEKAKYASEFIAQrA6ABIQYgAyAEKAIQNgIYIANBADYCHCADQaDkCigCADYCICADQgA3AiQgA0EANgI4IANCADcCPCADQgA3AkQgAyACNgJMIAMgBhAyOQMQIANEAAAAAAAAJEBEAAAAAAAAAAAgBUEBa0ECSSIEGzkDMCADQoKAgIAQNwMAIAMgBUEAIAQbNgIIIABB1NwDIAMQHiAAIAEgAkEAELwIIANB0ABqJAAL/AYCDX8EfCMAQfABayIEJABBoOQKKAIAIQwgACgCECIHKAIQIQ0gBysDoAEgBEIANwOoASAEQgA3A6ABEDIhEiACQQNLBEBBfyEIIAcoApgBIgZBAWtBAkkhBUEEIQsgAwRAIAcoAjghCkEFIQtBFCEIC0QAAAAAAAAkQEQAAAAAAAAAACAFGyETIAZBACAFGyEOIAQgASsDACIUOQPgASABKwMIIREgBCAUOQOAASAEIBE5A+gBIAQgETkDiAEgBEGgAWogBEGAAWoQuwhBASEFQQAhAwNAAkACQCACIANBA2oiB00EQCAEIAU2AnQgBEEANgJwIARCADcDaCAEIBM5A2AgBCAINgJYIARBADYCVCAEIAw2AlAgBCAKNgJMIAQgDTYCSCAEQUBrIBI5AwAgBCAONgI4IAQgCzYCNCAEQQM2AjAgAEH6xQQgBEEwahAeAkAgBEGgAWoiARAoBEAgARAkQQ9GDQELIARBoAFqIgEQJCABEEtPBEAgAUEBEL0BCyAEQaABaiICECQhASACECgEQCABIAJqQQA6AAAgBCAELQCvAUEBajoArwEgAhAkQRBJDQFBk7YDQaD8AEGvAkHEsgEQAAALIAQoAqABIAFqQQA6AAAgBCAEKAKkAUEBajYCpAELAkAgBEGgAWoQKARAIARBADoArwEMAQsgBEEANgKkAQsgBEGgAWoiAhAoIQEgBCACIAQoAqABIAEbNgIgIABBq4MEIARBIGoQHiAELQCvAUH/AUYEQCAEKAKgARAYCyAFQQAgBUEAShshASAFQQFrIQJBACEDA0AgASADRg0CIAQgAyACb0EARzYCECAAQcCyASAEQRBqEB4gA0EBaiEDDAALAAsgBCAEKQPgATcDsAEgBCAEKQPoATcDuAEgASADQQR0aiEPQQEhA0EBIQYDQCAGQQRGRQRAIAZBBHQiCSAEQbABamoiECAJIA9qIgkrAwA5AwAgECAJKwMIOQMIIAZBAWohBgwBCwsDQCADQQdGDQIgBEGQAWogBEGwAWogA7hEAAAAAAAAGECjQQBBABChASAEIAQrA5ABOQMAIAQgBCsDmAE5AwggBEGgAWogBBC7CCADQQFqIQMMAAsACyAAQe7/BBAbGiAEQfABaiQADwsgBUEGaiEFIAchAwwACwALQfW1AkHSvAFBvwJBjzkQAAAL2gECBH8BfCMAQdAAayIEJAAgACgCECIFKAKYASEGIAUrA6ABIQggBSgCOCEHIAQgBSgCEDYCGCAEIAc2AhwgBEGg5AooAgA2AiAgBEEANgIkIARBFEF/IAMbNgIoIARBADYCOCAEQgA3AjwgBEIANwJEIAQgAkEBajYCTCAEIAgQMjkDECAERAAAAAAAACRARAAAAAAAAAAAIAZBAWtBAkkiAxs5AzAgBEKCgICAMDcDACAEIAZBACADGzYCCCAAQdTcAyAEEB4gACABIAJBARC8CCAEQdAAaiQAC6wCAgN/B3wjAEGQAWsiAyQAIAAoAhAiBCgCmAEhBSAEKwOgASEKIAErAxghBiABKwMQIQcgASsDCCEIIAErAwAhCSAEKAI4IQEgAyAEKAIQNgIYIAMgATYCHCADQaDkCigCADYCICADQQA2AiQgA0EUQX8gAhs2AiggA0EANgI4IANBQGtCADcDACADIAkQMiILOQNIIAMgCBAyIgw5A1AgAyALOQNoIAMgDDkDcCADIAcQMjkDeCADIAYQMjkDgAEgAyAKEDI5AxAgAyAHIAmhEDI5A1ggAyAGIAihEDI5A2AgA0QAAAAAAAAkQEQAAAAAAAAAACAFQQFrQQJJIgEbOQMwIANCgYCAgBA3AwAgAyAFQQAgARs2AgggAEGDpwQgAxAeIANBkAFqJAALxgMBC38jAEEwayIDJABBfyEFAkACQAJAAkACQAJAAkAgASgCIEEBaw4EAQICAAILIAEoAgAhAANAIAJBCEYNBSAARQ0GIAJBAnRBsMAIaigCACAAEE1FDQQgAkEBaiECDAALAAtBpOQKKAIAIgZBACAGQQBKGyEHIAEtAAIhCCABLQABIQkgAS0AACEKQYP0CyELAkADQCACIAdHBEACQCACQQF0IgxBsOwKai4BACAJayIEIARsIAxBsOQKai4BACAKayIEIARsaiAMQbD0CmouAQAgCGsiBCAEbGoiBCALTg0AIAIhBSAEIgsNAAwDCyACQQFqIQIMAQsLIAZBgARHDQILIAVBIGohAgwCCyADQfUANgIEIANB0rwBNgIAQYj2CCgCAEHYvwQgAxAgGhA7AAtBpOQKIAZBAWo2AgAgB0EBdCIFQbDkCmogCjsBACAFQbDsCmogCTsBACAFQbD0CmogCDsBACADIAg2AiAgAyAJNgIcIAMgCjYCGCADIAdBIGoiAjYCFCADQQA2AhAgAEHz2wMgA0EQahAeCyABIAI2AgALIAFBBTYCICADQTBqJAAPC0GU1gFB1PsAQQ1B5TsQAAALxwICB38EfCMAQdAAayIDJAAgACgC6AIhBiAAKwPgAiEKQaDkCigCACEHIAIoAgQiBCsDECELIAAoAhAoAhAhCCACKAIAEEAhCSAEKAIIIgQEfyAEKAIUBUF/CyEEIAItADAhBSABKwMIIQwgASsDACENIAMgCyAKoiIKOQMwIANBBjYCKCADRBgtRFT7Ifk/RAAAAAAAAAAAIAYbOQMgIAMgCjkDGCADIAQ2AhQgA0EANgIQIANBQGsgDRAyOQMAIAMgDEQAAAAAAABSwKAQMjkDSCADIAogCqBEAAAAAAAACECjIAm4okQAAAAAAADgP6I5AzggAyAHNgIMIAMgCDYCCCADQQQ2AgAgA0ECQQEgBUHyAEYbQQAgBUHsAEcbNgIEIABB88kDIAMQHiAAIAIoAgAQxAogAEGS3AQQGxogA0HQAGokAAsLAEGg5ApBADYCAAsLAEGg5ApBATYCAAuCAQECfwJAAkAgAEUgAUVyRQRAAkAgACgCKCICIAEoAigiA0cEQCACKAIAQQR2IgAgAygCAEEEdiIBSQ0EIAAgAU0NAQwDCyAAKAIAQQR2IgAgASgCAEEEdiIBSQ0DIAAgAUsNAgtBAA8LQdTzAkHgvQFBhwNBloMBEAAAC0EBDwtBfwsLACAAQdywBBAbGgvZAQIDfwF+IwBBMGsiASQAIAAoAhAhAiAAQYjaBBAbGiAAKAIMKAIAIgMpAgAhBCABIAMoAgg2AiggASAENwMgIABBhu8EIAFBIGoQHiABIAIoAggQITYCECAAQY+BBCABQRBqEB4gASAAKAKoASAAKAKkAWw2AgAgAEHQxwQgARAeIABB6+IDEBsaIABBnogEEBsaIABB/OsDEBsaIABB1ocEEBsaIABB7dwEEBsaIABB77AEEBsaIABBktoEEBsaIABB85QDEBsaIABBgdwEEBsaIAFBMGokAAsYACAAEIoGIAAQ1QQgAEHMACABIAIQvwgLEwAgACABIAIgA0HCAEHiABCXCgsTACAAIAEgAiADQfAAQdAAEJcKC6MBAQJ/IwBBEGsiAyQAIAAoAhAoAgwgABCKBiAAENUEIAIEfwJAIAJBfnFBAkYEQCAAIAIgAUECEMAIDAELIAAQiQYLQbvLAwVBw8oDCyECQQJ0QfC/CGooAgAiACACEPIBIAMgASkDCDcDCCADIAEpAwA3AwAgACADENcCIAAgASsDECABKwMAoRCWAiAAIAErAxggASsDCKEQlgIgA0EQaiQAC78CAQZ/IwBBMGsiAyQAIAAoAhAoAgwiB0ECdEHwvwhqKAIAIgRBuMsDEPIBIAQgAigCBCsDEBCWAiAAQfH/BCACKAIEKAIAEMADIAAQ1QQgAigCBCIGBEAgBigCGEH/AHEhBQsgAi0AMCEGAkBB4OMKKAIALwEoIghBD0kNACAIQQ9rIghBAksNACAIQQJ0QaDACGooAgAgBXEiBSAHQQJ0QfDjCmoiBygCAEYNACADIAU2AiAgBEGHyAMgA0EgahCEASAHIAU2AgALIAEgAisDGCABKwMIoDkDCCAEQanLAxDyASADIAEpAwg3AxggAyABKQMANwMQIAQgA0EQahDXAiADQX8gBkHyAEYgBkHsAEYbNgIAIARB98oDIAMQhAEgBCACKwMgEJYCIABB8f8EIAIoAgAQwAMgA0EwaiQAC8sCACAAKAIQKAIIIQBB8OIKECQEQCAAQeDjCigCACgCEEHw4goQwgEQcQtBgOMKECQEQCAAQeDjCigCACgCGEGA4woQwgEQcQtBkOMKECQEQCAAQeDjCigCACgCFEGQ4woQwgEQcQtBsOMKECQEQCAAQeDjCigCACgCHEGw4woQwgEQiwYLQcDjChAkBEAgAEHg4wooAgAoAiRBwOMKEMIBEHELQdDjChAkBEAgAEHg4wooAgAoAiBB0OMKEMIBEHELQYilCkKAgICAgICA+D83AwBB+KQKQoCAgICAgID4PzcDAEHopApCgICAgICAgPg/NwMAQeCkCkKAgICAgICA+D83AwBByKQKQoCAgICAgID4PzcDAEHApApCgICAgICAgPg/NwMAQYjkCkIANwMAQfjjCkIANwMAQZzkCkEANgIAQZTkCkEANgIAC30AIAAoAhAoAgghAEHw4goQJARAIABB4OMKKAIAKAIIQfDiChDCARBxC0Gw4woQJARAIABB4OMKKAIAKAIMQbDjChDCARCLBgtBgKUKQoCAgICAgID4PzcDAEHwpApCgICAgICAgPg/NwMAQZjkCkEANgIAQZDkCkEANgIAC3MAIAAoAhAoAggiAEHg4wooAgAoAgBB8OIKEMIBEHEgACgCECgCDARAIABB4OMKKAIAKAIEQbDjChDCARBxC0HYpApCgICAgICAgPg/NwMAQbikCkKAgICAgICA+D83AwBBhOQKQQA2AgBB9OMKQQA2AgALxAMBBH8jAEEQayIDJAAgACgCECgCCCEBQeTjCigCAEUEQEHs4wpBoAI2AgBB6OMKQaECNgIAQeTjCkHw7wkoAgA2AgALIAEoAkwiAigCBCEEIAJB5OMKNgIEAkACQAJAAkACQAJAIAAoAkAOBwEBBAACAgIDCyAAIAEgAEEBEMcIDAQLIAAtAJsBQQhxDQMgASAAENUIDAMLQeDiChAkBEBB4OMKKAIAKAIAIgJFBEAgAUEAQcHDARCIASECQeDjCigCACACNgIACyABIAJB4OIKEMIBEHELIAEoAhAoAgwEQCABQeDjCigCACgCBEGg4woQwgEQiwYLQQAhAiABQb7jAEHg4wooAgAoAiwQkAcDQCACQQhGRQRAIAJBBHRB4OIKahBcIAJBAWohAgwBCwtB4OMKKAIAEBhB0KQKQoCAgICAgID4PzcDAEGwpApCgICAgICAgPg/NwMAQYDkCkEANgIAQfDjCkEANgIAIAAtAJsBQQhxDQIgASAAENUIDAILIANB5QM2AgQgA0GluAE2AgBBiPYIKAIAQdi/BCADECAaEDsACyAAIAEgAEEAEMcICyABKAJMIAQ2AgQgA0EQaiQAC5IGAgd/AXwjAEEQayIEJAAgACgCECgCCCECAkACQAJAAkACQCAAKAJADgcDAAQEAQEBAgsgAkH23gBBABBrRQ0DIAIQ8wkMAwsgAiAEQQ5qIARBD2oQxQghCCAAKAJAIQUgBC0ADyAELQAOIQdB4OMKQQFBOBAaIgA2AgBB8bUCIQFBDiEDAkACQAJAIAVBBWsOAgACAQtBve4CIQFBDCEDDAELAkAgAkG+4wAQJyIBRQ0AIAEtAABFDQAgARDBCCIDQQtJDQBB4OMKKAIAIQAMAQtBsf0BIQFBsf0BEMEIIQNB4OMKKAIAIQALIAAgATYCLCAAIAM7ASgCQCACKAIQIgEoArQBBEAgAkEAQcHDARCIASEBQeDjCigCACIAIAE2AgAgAigCECEBDAELIABBADYCAAtBACEDQQAhBSABLQBxQQhxBH8gAkEAQbHDARCIASEFQeDjCigCAAUgAAsgBTYCBCACQQFBwcMBEIgBIQBB4OMKKAIAIAA2AgggAkEBQbHDARCIASEAQeDjCigCACAANgIMIAJBAkHBwwEQiAEhAEHg4wooAgAiASAANgIQQQFxBEAgAkECQbnDARCIASEDQeDjCigCACEBCyABIAM2AhRBACEAIAdBAXEEQCACQQJBl8MBEIgBIQBB4OMKKAIAIQELIAEgADYCGAJAIAIoAhAtAHEiA0EhcQRAIAJBAkGxwwEQiAEhAEHg4wooAgAiASAANgIcIAIoAhAtAHEhAwwBCyABQQA2AhwLAkAgA0ECcQRAIAJBAkGowwEQiAEhAEHg4wooAgAiASAANgIgIAIoAhAtAHEhAwwBCyABQQA2AiALQQAhAEEAIQUgA0EEcQRAIAJBAkGfwwEQiAEhBUHg4wooAgAhAQsgASAFNgIkA0AgAEEIRkUEQCAAQQR0IgJB6OIKakIANwMAIAJB4OIKakIANwMAIABBAWohAAwBCwsgASAIOQMwDAILIARBpwM2AgQgBEGluAE2AgBBiPYIKAIAQdi/BCAEECAaEDsACyACEMIICyAEQRBqJAALeQEBfyMAQRBrIgMkACAAKAIQKAIMQQJ0QfC/CGooAgAiBEG1ywMQ8gEgAyACKQMINwMIIAMgAikDADcDACAEIAMQ1wIgBCACKwMQIAIrAwChEJYCIAQgAisDGCACKwMIoRCWAiAAQfH/BCABKAIIEMADIANBEGokAAsXACAAKAIAIgAgASgCACIBSyAAIAFJawsOACACRAAAAAAAAOA/ogslACACIAAgAaMiAEQAAAAAAADwPyAAoSAARAAAAAAAAOA/ZRuiCxQAIAAgAaMgAqJEAAAAAAAA4D+iCx4AIAJEAAAAAAAA8D8gACABo6GiRAAAAAAAAOA/ogsXACAAKAIAQQdGBEAgACgCcEEBEPUICwvXAgEHfwJAIAAoAgAiAygCmAEiBEUNACADKAKcAQ0AIANBADYCmAEgAygCuAEhCCADQQA2ArgBIAQhBwsgAygCoAEhBiMAQRBrIgUkAAJAIAMgARDEBkUEQCAFIANBAyABEKAENgIEIAUgATYCAEGT8AMgBRA3DAELIAMoApwBIgQgBCAEKAI0ENkENgI4AkAgBkHiJUEAQQEQNgRAIAYoAhAoAggNAQsgBC0AmwFBBHENAEGasARBABA3DAELAkAgAygCmAEiAUUEQCADEPMEIgE2ApwBIAMgATYCmAEMAQtBpN8KKAIAIglFDQAgCSgCBCIBDQAQ8wQhAUGk3wooAgAgATYCBAtBpN8KIAE2AgAgASADNgIAIAEgAjYCICADIAYQnwYaIAQQhwQgBBCxCiADEJUECyAFQRBqJAAgBwRAIAAoAgAiACAINgK4ASAAIAc2ApgBCwsVACAAKAIAIgAgACgCoAEgARCUBhoL5QEBA38gACgCACEDAkACQCABRQRAQYz2CCgCAEEAEIsIIQEMAQsgAUHjOxCfBCIERQ0BIARBABCLCCEBIAQQ6gMLIAFFDQAgAygCoAEiBARAAkAgAygCpAEiBUUNACAFKAIEIgVFDQAgBCAFEQEAIAMoAqABIQQLIAQQ0wkgAygCoAEQuQELIAFBAEHiJUGYAkEBELMCIAFBAUH8JUHAAkEBELMCIAFBAkHvJUG4AUEBELMCIAMgATYCoAEgASgCECADNgKQASADIAEgAhCUBkF/Rg0AIABCADcDwAQgAEEBOgCZBAsLjQICBHwCfyMAQRBrIgYkACABKwMAIAArA7AEoSAAKwOIBKMiA5lELUMc6+I2Gj9jIAErAwggACsDuAShIAArA5AEoyIEmUQtQxzr4jYaP2NxRQRAIABBsARqIQcCQAJAAkAgAC0AnQQOAwACAQILIAYgASkDCDcDCCAGIAEpAwA3AwAgACAGEKgGDAELIAArA9ACIQUgACsD4AIhAgJ8IAAoAugCBEAgACAFIAQgAqOhOQPQAiADIAKjIAArA9gCoAwBCyAAIAUgAyACo6E5A9ACIAArA9gCIAQgAqOhCyECIABBAToAmQQgACACOQPYAgsgByABKQMANwMAIAcgASkDCDcDCAsgBkEQaiQACxIAIABBADoAnQQgAEEAOgCaBAvQCAIDfwJ8IwBBIGsiBCQAAkACQAJAAkACQAJAAkAgAUEBaw4FAAECAwQGCyAEIAIpAwg3AwggBCACKQMANwMAIAAgBBCoBgJAIAAoAsQEIgFFDQACQAJAAkAgARCSAg4DAAECAwsgASgCECIBIAEtAHBB+QFxQQRyOgBwDAILIAEoAhAiASABLQCFAUH5AXFBBHI6AIUBDAELIAEoAhAiASABLQB0QfkBcUEEcjoAdAsgACgCzAQQGCAAQQA2AswEIAAgACgCwAQiATYCxAQCQCABRQ0AAkACQAJAIAEQkgIOAwABAgMLIAEoAhAiAyADLQBwQQJyOgBwIAAgARDvCAwCCyABKAIQIgMgAy0AhQFBAnI6AIUBIAEQLUEBQa6FAUEAECIiA0UEQCABEC1BAUGf0gFBABAiIgNFDQILIAAgASADEEUgARCBATYCzAQMAQsgASgCECIDIAMtAHRBAnI6AHQgASABQTBrIgUgASgCAEEDcUECRhsoAigQLUECQa6FAUEAECIiA0UEQCABIAUgASgCAEEDcUECRhsoAigQLUECQZ/SAUEAECIiA0UNAQsgACABIAMQRSABEIEBNgLMBAsgAEEBOgCdBCAAQQE6AJoEDAQLIABBAjoAnQQgAEEBOgCaBAwDCyAEIAIpAwg3AxggBCACKQMANwMQIAAgBEEQahCoBiAAQQM6AJ0EIABBAToAmgQMAgsgAEEAOgCYBAJ8IAAoAugCBEAgACAAKwPQAiACKwMIIAAoAsQDuEQAAAAAAADgP6KhRKCZmZmZmbk/oiAAKwPgAiIGIAArA5AEoqOhOQPQAiACKwMAIAAoAsADuEQAAAAAAADgP6KhRKCZmZmZmbk/oiAGIAArA4gEoqMMAQsgACAAKwPQAiACKwMAIAAoAsADuEQAAAAAAADgP6KhRKCZmZmZmbk/oiAAKwPgAiIGIAArA4gEoqOgOQPQAiACKwMIIAAoAsQDuEQAAAAAAADgP6KhRKCZmZmZmbk/oiAGIAArA5AEoqMLIQcgACAGRJqZmZmZmfE/ojkD4AIgACAAKwPYAiAHoDkD2AIMAQsgAEEAOgCYBCAAIAArA+ACRJqZmZmZmfE/oyIGOQPgAgJ/IAAoAugCBEAgACAAKwPQAiACKwMIIAAoAsQDuEQAAAAAAADgP6KhRKCZmZmZmbk/oiAGIAArA5AEoqOgOQPQAiACKwMAIAAoAsADuEQAAAAAAADgP6KhIQcgAEGIBGoMAQsgACAAKwPQAiACKwMAIAAoAsADuEQAAAAAAADgP6KhRKCZmZmZmbm/oiAGIAArA4gEoqOgOQPQAiACKwMIIAAoAsQDuEQAAAAAAADgP6KhIQcgAEGQBGoLIQEgACAAKwPYAiAHRKCZmZmZmbm/oiAGIAErAwCio6A5A9gCCyAAQQE6AJkECyAAIAIpAwA3A7AEIAAgAikDCDcDuAQgBEEgaiQAC0kBAn8gACgCACgCoAEhASAAKALEBEUEQCAAIAE2AsQEIAEoAhAiAiACLQBwQQJyOgBwIAAgARDvCAsgACABEOcIIABBAToAnAQLYQIBfwJ8IAAgAC0AmAQiAUEBczoAmAQgAUUEQCAAQgA3A9ACIABBAToAmQQgAEIANwPYAiAAIAAoAsADIgG4IAG3oyICIAAoAsQDIgC4IAC3oyIDIAIgA2MbOQPgAgtBAAsjACAAQYACOwGYBCAAIAArA+ACRJqZmZmZmfE/ozkD4AJBAAsjACAAQYACOwGYBCAAIAArA+ACRJqZmZmZmfE/ojkD4AJBAAsqACAAQYACOwGYBCAAIAArA9gCRAAAAAAAACRAIAArA+ACo6A5A9gCQQALKgAgAEGAAjsBmAQgACAAKwPYAkQAAAAAAAAkwCAAKwPgAqOgOQPYAkEACxgAIAEQLSAARwR/IAAgAUEAENYCBSABCwsqACAAQYACOwGYBCAAIAArA9ACRAAAAAAAACTAIAArA+ACo6A5A9ACQQALKgAgAEGAAjsBmAQgACAAKwPQAkQAAAAAAAAkQCAAKwPgAqOgOQPQAkEACxgAIAEQLSAARwR/IAAgAUEAEIUBBSABCwsEACAAC0MBAn8Cf0EBIAAoAgAiAiABKAIAIgNKDQAaQX8gAiADSA0AGkEBIAAoAgQiACABKAIEIgFKDQAaQX9BACAAIAFIGwsLHABBFBBSIgEgACkCCDcCCCABIAAoAhA2AhAgAQtDAQJ8An9BASAAKwMAIgIgASsDACIDZA0AGkF/IAIgA2MNABpBASAAKwMIIgIgASsDCCIDZA0AGkF/QQAgAiADYxsLCzwBAn8gACgCACEBIAAoAgQhAkEAIQADQCAAIAJGBEAgARAYBSABIABBOGxqKAIAEBggAEEBaiEADAELCwsOACAAIAEQpQE2AiBBAAsOACAAIAEQpQE2AiRBAAtwAQF/IwBBEGsiAiQAAn8gAUHAzwEQLkUEQCAAQfIANgIAQQAMAQsgAUHPzwEQLkUEQCAAQewANgIAQQAMAQsgAUHD0AEQLkUEQCAAQe4ANgIAQQAMAQsgAiABNgIAQcS7BCACECpBAQsgAkEQaiQAC0ABAn8jAEEQayICJABBASEDIAFB69oBQQBB/wEgAkEMahCZAkUEQCAAIAIoAgy3OQMQQQAhAwsgAkEQaiQAIAMLCwAgACABNgIAQQALCwAgACABNgIEQQALUwECfyMAQRBrIgIkAEEBIQMCQCABQdXRAUEAQf//AyACQQxqEJkCDQAgAigCDCIBRQRAQZW9BEEAECoMAQsgACABOwFSQQAhAwsgAkEQaiQAIAMLUwECfyMAQRBrIgIkAEEBIQMCQCABQd3RAUEAQf//AyACQQxqEJkCDQAgAigCDCIBRQRAQbq9BEEAECoMAQsgACABOwFQQQAhAwsgAkEQaiQAIAMLHwAgACABQby8BEHD0AFBgAJBwM8BQYAEQc/PARDkBguNAQEBfyMAQRBrIgIkAAJ/AkACQCABQc/PARAuRQRAIAAgAC8BJEEEcjsBJAwBCyABQcDPARAuRQRAIAAgAC8BJEECcjsBJAwBCyABQc/OARAuRQRAIAAgAC8BJEEGcjsBJAwBCyABQcPQARAuDQELQQAMAQsgAiABNgIAQem8BCACECpBAQsgAkEQaiQAC0ABAn8jAEEQayICJABBASEDIAFB49gBQQBB//8DIAJBDGoQmQJFBEAgACACKAIMOwEmQQAhAwsgAkEQaiQAIAMLHQAgACABQZ27BEHD2wFBCEGy0QFBEEHs0QEQ5AYLDgAgACABEKUBNgIMQQALDgAgACABEKUBNgIIQQALjwQBBX8jAEHQAGsiAiQAAkAgAQRAAkADQCAFQQJGDQEgBUG5oANqIAVBuqADaiEDIAVBAWohBS0AACEEA0AgAy0AACIGRQ0BIANBAWohAyAEIAZHDQALC0H6sgNBuPwAQTVB+PIAEAAAC0EAIQUgAUG5oAMQyQIhBCABIQMDQCADRQ0CIAIgBDYCTCACIAM2AkggAiACKQJINwNAAkAgAkFAa0Gm3QEQkwMEQCAAIAAtACpBAnI6ACoMAQsgAiACKQJINwM4IAJBOGpBzdcBEJMDBEAgACAALQAqQQFyOgAqDAELIAIgAikCSDcDMCACQTBqQYjdARCTAwRAIAAgAC0AKkHnAXE6ACoMAQsgAiACKQJINwMoAkAgAkEoakHK2wEQkwNFBEAgAiACKQJINwMgIAJBIGpB8s8BEJMDRQ0BCyAAIAAtACpBBHI6ACoMAQsgAiACKQJINwMYIAJBGGpBmN0BEJMDBEAgACAALQAqQQhyOgAqDAELIAIgAikCSDcDECACQRBqQZ/dARCTAwRAIAAgAC0AKkEQcjoAKgwBCyACIAM2AgQgAiAENgIAQZS8BCACECpBASEFCyADIARqIQZBACEDQQAhBCAGIAEQQCABakYNACAGQbmgAxCqBCAGaiIDQbmgAxDJAiEEDAALAAtBw9MBQbj8AEEtQfjyABAAAAsgAkHQAGokACAFC78BAQN/IwBBEGsiBCQAA0AgAS0AACIDBEAgAUEBaiEBAkACQAJAAkACQCADQSBqIAMgA8AiA0HBAGtBGkkbwEHiAGtBH3cOCgMEBAQEAAQEAgEECyACQYAIciECDAULIAJBgBByIQIMBAsgAkGAIHIhAgwDCyACQYDAAHIhAgwCCyAEIAM2AgQgBCADNgIAQfisBCAEECoMAQsLIAJB//8DcUGA+ABHBEAgACAALwEkIAJyOwEkCyAEQRBqJABBAAsPACAAIAFBAUHQugQQqQoLDgAgACABEKUBNgIEQQALDgAgACABEKUBNgIQQQALDgAgACABEKUBNgIAQQALQAECfyMAQRBrIgIkAEEBIQMgAUHGzwFBAEH//wMgAkEMahCZAkUEQCAAIAIoAgw7AShBACEDCyACQRBqJAAgAws/AQJ/IwBBEGsiAiQAQQEhAyABQazbAUEAQegCIAJBDGoQmQJFBEAgACACLwEMNgIcQQAhAwsgAkEQaiQAIAMLVwEBfyMAQRBrIgIkAAJ/AkACQCABQfbaARAuRQRAIAAgAC8BJEEBcjsBJAwBCyABQYHbARAuDQELQQAMAQsgAiABNgIAQeq7BCACECpBAQsgAkEQaiQACw8AIAAgAUECQfW6BBCpCgsOACAAIAEQpQE2AhhBAAtOAQJ/IwBBEGsiAiQAQQEhAyABQfrZAUGAf0H/ACACQQxqEJkCRQRAIAAgAigCDDoAICAAIAAvASRBgAFyOwEkQQAhAwsgAkEQaiQAIAMLTQECfyMAQRBrIgIkAEEBIQMgAUHu2QFBAEH/ASACQQxqEJkCRQRAIAAgAigCDDoAIiAAIAAvASRBwAByOwEkQQAhAwsgAkEQaiQAIAMLPwECfyMAQRBrIgIkAEEBIQMgAUGS0QFBAEH/ACACQQxqEJkCRQRAIAAgAigCDDoAbEEAIQMLIAJBEGokACADC0wBAn8jAEEQayICJABBASEDIAFBltEBQQBB/wEgAkEMahCZAkUEQCAAIAIoAgw6ACEgACAALwEkQSByOwEkQQAhAwsgAkEQaiQAIAMLDgAgACABEKUBNgIUQQALHQAgACABQcS7BEHD0AFBAkHAzwFBBEHPzwEQ5AYLUgECfwJAIAAtAChFDQADQCACBEAgAS0AACIEQSBPBEAgACgCDCAEwBB/IANBAWohAwsgAUEBaiEBIAJBAWshAgwBCwsgA0UNACAAQYsCNgIICwvHAwAgAUHU2wEQLkUEQCAAQQE6ACggAEGIAjYCCA8LAkAgAUGE0AEQLgRAIAFB/dgBEC4NAQsgAEGFAjYCCA8LIAFBwtwBEC5FBEAgAEEAOgAoIABBiQI2AggPCyABQaPSARAuRQRAIABBhwI2AggPCyABQbTPARAuRQRAIABBigI2AggPCyABQcfeARAuRQRAIABBjgI2AggPCyABQcrOARAuRQRAIABBjwI2AggPCyABQbbRARAuRQRAIABBkAI2AggPCyABQdrYARAuRQRAIABBjQI2AggPCyABQa7RARAuRQRAIABBkQI2AggPCyABQZHeARAuRQRAIABBkgI2AggPCyABQf/PARAuRQRAIABBkwI2AggPCyABQZ3RARAuRQRAIAAoAghBmwJGBEAgAEGaAjYCCA8LIABBggI2AggPCyABQcDQARAuRQRAIAAoAghBlQJGBEAgAEGUAjYCCA8LIABBlgI2AggPCyABQYHQARAuRQRAIAAoAghBmAJGBEAgAEGXAjYCCA8LIABBmQI2AggPCyABQYvaARAuRQRAIAAoAghBnQJGBEAgAEGcAjYCCA8LIABBgwI2AggPCyAAIAEQkgkL3QUAIAFB1NsBEC5FBEBBiAEQUiIBQgA3AlQgAUF/NgJ4IAFB/wE6AGwgAUEANgJoIAFB4QE2AmQgAUIANwJcIAAgAUGwmwpBFiACQYrgARCPBCAAKAJAIAE2AgAgAEGeAjYCCCAAQQA6ACgPCwJAIAFBhNABEC4EQCABQf3YARAuDQELIABBhAI2AgggAEEAOgAoDwsgAUHC3AEQLkUEQCAAQQE6AChB6AAQUiIBQYGABDYCUCAAIAFB4JwKQRYgAkHF4AEQjwQgACgCQCABNgIAIABBnwI2AggPCyABQbTPARAuRQRAIAAgAkEAEN8CIQEgACgCQCABNgIAIABBoAI2AggPCyABQcfeARAuRQRAIABBAEEBEN8CIQEgACgCQCABNgIAIABBogI2AggPCyABQf/PARAuRQRAIABBAEEgEN8CIQEgACgCQCABNgIAIABBpwI2AggPCyABQcrOARAuRQRAIABBAEEEEN8CIQEgACgCQCABNgIAIABBowI2AggPCyABQbbRARAuRQRAIABBAEHAABDfAiEBIAAoAkAgATYCACAAQaQCNgIIDwsgAUHa2AEQLkUEQCAAQQBBAhDfAiEBIAAoAkAgATYCACAAQaECNgIIDwsgAUGu0QEQLkUEQCAAQQBBCBDfAiEBIAAoAkAgATYCACAAQaUCNgIIDwsgAUGR3gEQLkUEQCAAQQBBEBDfAiEBIAAoAkAgATYCACAAQaYCNgIIDwsgAUGd0QEQLkUEQCAAKAJAQQA2AgAgACAAKAJAQaieCkEBIAJBxd8BEI8EIABBmwI2AggPCyABQcDQARAuRQRAIABBlQI2AggPCyABQYHQARAuRQRAIABBmAI2AggPCyABQYvaARAuRQRAIABBKBBSIgFBsJ4KQQIgAkHZ3wEQjwQgACgCQCABNgIAIABBnQI2AggPCyABQaPSARAuRQRAIABBhgI2AggPCyAAIAEQkgkLhgEBAn8jAEEQayIEJAAgBCABNgIMAkAgACAAKAKcASAEQQxqIAIgAyAALQD8A0VBABCWCSIBDQBBACEBIAQoAgwiBUUNACAAKAL0AwRAIABB3QE2AqACIAAgBSACIAMQlQkhAQwBCyAAQdYBNgKgAiAAIAUgAiADELYGIQELIARBEGokACABC6gDAQR/IwBBEGsiAyQAAkACQCAAKAK0AiIFRQRAQRchAgwBCyAFKAIMIgEtACEEQCABKAIIIAMgASgCBCIGIAEoAgxqIgI2AgwgBmohBAJ/IAEtACIEQCAAKALsASIGIAIgBCADQQxqIgcgBigCABEGACEGIAAgACgC7AEgAiAEIAYgAygCDCAHQQBBAEEBEK0JDAELIAAgBSgCECAAKALsASACIAQgA0EMakEAQQEQsAYLIgINAQJAIAQgAygCDCICRg0AAkACQCAAKAL4A0EBaw4DAAIBAgsgAC0A4ARFDQELIAEgAiABKAIEazYCDEEAIQIMAgtBACECIAFBADoAIQJAIAEtACINACAFKAIQIAAoAtACRg0AQQ0hAgwCCyAAQQE6AOAEDAELIAAgAUHGMhCUAyAAKAK0AiIEIAVHDQFBACECIAFBADoAICAAIAQoAggiBDYCtAIgBSAAKAK4AjYCCCAAIAU2ArgCIARFBEAgAEHQAUHWASABLQAiGzYCoAILIABBAToA4AQLIANBEGokACACDwtBjAtBn70BQcwyQfo1EAAAC2YBAX8jAEEQayIEJAAgBCABNgIMAkAgACAAKAKcASAEQQxqIAIgAyAALQD8A0UQpgkiAQ0AIAQoAgwiAUUEQEEAIQEMAQsgAEHQATYCoAIgACABIAIgAxC4BiEBCyAEQRBqJAAgAQsIACAAKAKkAgtlAQR/IABBoAFqIQUgAEGcAWohBiAAKALwASEHIAAtAPQBBH8gBSAGIAcQzQkFIAUgBiAHEMEGCwR/QQAFIAAgACgC8AEQrgkLIgQEfyAEBSAAQdABNgKgAiAAIAEgAiADELgGCwtsAEERIQICQAJAAkACQCABQQ9rDgMDAgEACyABQRtHDQEgAEERNgIIIABBswE2AgBBEw8LIABBoQFBtQEgACgCEBs2AgBBFA8LAkAgAUEcRw0AIAAoAhANAEE7DwsgAEGeATYCAEF/IQILIAILGAAgACABIAIgAyAEQcwBQRVBG0EREMMCC0UAIAFBD0YEQEERDwsgAUEbRgRAIABBETYCCCAAQbMBNgIAQRMPCwJAIAFBHEcNACAAKAIQDQBBOw8LIABBngE2AgBBfwtbAAJ/QScgAUEPRg0AGgJAIAFBFUcEQCABQSRHDQEgAEEnNgIIIABBswE2AgBBLg8LIABBygE2AgBBJw8LIAFBHEYEQEE7IAAoAhBFDQEaCyAAQZ4BNgIAQX8LCxYAIAAgASACIAMgBEEnQcsBQTMQ5wYLpAEAAkACQAJAAkACQAJAAkACQAJAIAFBF2sOCgEGBgYGBgYCAwQAC0EnIQIgAUEPaw4EBgUFBwQLIAAgACgCBEEBajYCBEEsDwsgAEHHATYCAEE1DwsgAEHHATYCAEE0DwsgAEHHATYCAEE2DwsgAUEpRg0CCwJAIAFBHEcNACAAKAIQDQBBOw8LIABBngE2AgBBfyECCyACDwsgAEHHATYCAEEzC4ABAEEnIQICQAJAAkACQAJAIAFBFWsOBAECAgQACyABQQ9GDQIgAUEkRw0BIABBJzYCCCAAQbMBNgIAQS4PCyAAQcoBNgIAQScPCyABQRxGBEBBOyECIAAoAhBFDQELIABBngE2AgBBfyECCyACDwsgAEEnNgIIIABBswE2AgBBLQuWAgACfwJAAkACQAJAAkACQAJAIAFBI2sOBAIBAwQACwJAAkAgAUEVaw4EBgcHAQALIAFBD0cNBkEnDwsgACAAKAIEQQFrIgI2AgRBLSACDQYaIABBJzYCCCAAQbMBNgIAQS0PCyAAIAAoAgRBAWsiAjYCBEEuIAINBRogAEEnNgIIIABBswE2AgBBLg8LIAAgACgCBEEBayICNgIEQS8gAg0EGiAAQSc2AgggAEGzATYCAEEvDwsgACAAKAIEQQFrIgI2AgRBMCACDQMaIABBJzYCCCAAQbMBNgIAQTAPCyAAQckBNgIAQTIPCyAAQckBNgIAQTEPCwJAIAFBHEcNACAAKAIQDQBBOw8LIABBngE2AgBBfwsLvQEBAn9BMyEFQccBIQYCQAJAAkACQAJAAkACQAJAAkAgAUESaw4PCAcBBwcCBwcHBwcHAwQFAAsgAUEPRw0FQScPCyAEIAIgBCgCQGogA0GRqAggBCgCGBEGAEUNBUErIQVByAEhBgwGCyAAQQI2AgRBLCEFQckBIQYMBQtBNSEFDAQLQTQhBQwDC0E2IQUMAgsgAUEpRg0BC0F/IQVBngEhBiABQRxHDQAgACgCEA0AQTsPCyAAIAY2AgAgBQsSACAAIAEgAiADIARBxAEQqgoLEgAgACABIAIgAyAEQcIBEKoKCxYAIAAgASACIAMgBEEhQcYBQSAQqAoLGAAgACABIAIgAyAEQa0BQSZBG0EhEMMCC1YAQR8hAkHFASEEQSEhAwJAAkACQAJAIAFBD2sOBQMBAQICAAsgAUEpRg0BC0F/IQJBngEhBCABQRxHDQAgACgCEA0AQTsPCyAAIAQ2AgAgAiEDCyADC0cAQSEhAiABQQ9GBEBBIQ8LQcQBIQMCfwJAIAFBF0YNAEF/IQJBngEhAyABQRxHDQBBOyAAKAIQRQ0BGgsgACADNgIAIAILC7oBAQF/IAFBD0YEQEEhDwtBrQEhBQJAIAFBG0YEQEElIQQMAQsCQCABQRRHDQAgBCACIAQoAkBqIANB8KcIIAQoAhgRBgAEQEEjIQQMAgsgBCACIAQoAkBqIANB+KcIIAQoAhgRBgAEQEEkIQQMAgsgBCACIAQoAkBqIANBgagIIAQoAhgRBgBFDQBBISEEQcMBIQUMAQtBfyEEQZ4BIQUgAUEcRw0AIAAoAhANAEE7DwsgACAFNgIAIAQLvwEBAn9BISEFAkACQAJAAkACQCABQQ9rDgQDAgIAAQtBACEFAkADQCAEKAIYIQYgBUEIRg0BIAQgAiADIAVBAnRBoKcIaigCACAGEQYARQRAIAVBAWohBQwBCwsgAEHAATYCACAFQRdqDwsgBCACIANB/aYIIAYRBgBFDQEgAEHBATYCAEEhDwsgAUEXRg0CCyABQRxGBEBBOyEFIAAoAhBFDQELIABBngE2AgBBfyEFCyAFDwsgAEHCATYCAEEhC08AQQshAgJAAkACQCABQQ9rDgQCAQEAAQsgAEELNgIIIABBswE2AgBBEA8LAkAgAUEcRw0AIAAoAhANAEE7DwsgAEGeATYCAEF/IQILIAILdAEBf0ELIQUCQAJAAkACQAJAIAFBD2sOBAQBAgABCyAEIAIgA0GVpwggBCgCGBEGAEUNAEG/ASEEDAILQX8hBUGeASEEIAFBHEcNASAAKAIQDQFBOw8LQaEBQbUBIAAoAhAbIQRBDyEFCyAAIAQ2AgALIAULGAAgACABIAIgAyAEQbUBQTpBGUEAEMMCC0wAAn9BACABQQ9GDQAaIAFBGUYEQCAAQbUBNgIAIAAgACgCDEEBajYCDEEADwsgAUEcRgRAQTsgACgCEEUNARoLIABBngE2AgBBfwsLewEBfwJAAkACQAJAIAFBD2sOBAIBAQABCyAEIAIgA0GGpwggBCgCGBEGAARAQb0BIQQMAwsgBCACIANBjqcIIAQoAhgRBgBFDQBBvgEhBAwCC0F/IQVBngEhBCABQRxHDQEgACgCEA0BQTshBQsgBQ8LIAAgBDYCACAFC1IAQQshAgJAAkACQAJAIAFBD2sOAwMAAQALQX8hAkGeASEDIAFBHEcNASAAKAIQDQFBOw8LQaEBQbUBIAAoAhAbIQNBDyECCyAAIAM2AgALIAILGAAgACABIAIgAyAEQbkBQQ5BG0ELEMMCCxgAIAAgASACIAMgBEG8AUENQRtBCxDDAgtNAAJAAkACQCABQQ9rDgMBAgACCyAAQaEBQbUBIAAoAhAbNgIACyAAKAIIDwsCfyABQRxGBEBBOyAAKAIQRQ0BGgsgAEGeATYCAEF/CwsYACAAIAEgAiADIARBsQFBDkEbQQsQwwILGAAgACABIAIgAyAEQbsBQQ1BG0ELEMMCCxUAIAAgASACIAMgBEG6AUG5ARCnCgt/AQF/QREhBQJAAkACQAJAIAFBD2sOBAIBAQABCyAEIAIgA0HYpgggBCgCGBEGAARAQbcBIQQMAwsgBCACIANB36YIIAQoAhgRBgBFDQBBuAEhBAwCC0F/IQVBngEhBCABQRxHDQEgACgCEA0BQTshBQsgBQ8LIAAgBDYCACAFC6wBAQF/QSchBQJAAkACQAJAAkAgAUEPaw4EAwICAAELIAQgAiADQYeoCCAEKAIYEQYABEAgAEEnNgIIIABBswE2AgBBKg8LIAQgAiADQY2oCCAEKAIYEQYARQ0BIABBJzYCCCAAQbMBNgIAQSkPCyABQRdGDQILAkAgAUEcRw0AIAAoAhANAEE7DwsgAEGeATYCAEF/IQULIAUPCyAAQQE2AgQgAEG2ATYCAEEsC2wAQRYhAkG0ASEEQSEhAwJAAkACQAJAAkAgAUEPaw4EBAIAAwELQaEBQbUBIAAoAhAbIQRBISECDAILIAFBKUYNAQtBfyECQZ4BIQQgAUEcRw0AIAAoAhANAEE7DwsgACAENgIAIAIhAwsgAwsVACAAIAEgAiADIARBsgFBsQEQpwoLFgAgACABIAIgAyAEQQtBsAFBChCoCgteAEEDIQICQAJAAkACQAJAIAFBD2sOAwQBAgALIAFBGUcNAEEHIQJBoQEhAwwCC0F/IQJBngEhAyABQRxHDQEgACgCEA0BQTsPC0EIIQJBpAEhAwsgACADNgIACyACC0oAQQghAkGkASEEQQMhAwJAAkACQCABQQ9rDgMCAAEAC0F/IQJBngEhBCABQRxHDQAgACgCEA0AQTsPCyAAIAQ2AgAgAiEDCyADC0cAQa8BIQNBESECAkACQAJAIAFBD2sOBAIAAAEACyABQRxHQX8hAUGeASEDDQAgACgCEA0AQTsPCyAAIAM2AgAgASECCyACCxYAIAAgASACIAMgBEEnQa4BQSgQ5wYLFgAgACABIAIgAyAEQSFBrQFBIhDnBgtgAEGrASEEQQshAgJ/AkACQAJAAkAgAUESaw4FAAICAgMBC0EJIQJBrAEhBAwCC0ELIAFBD0YNAhoLQX8hAkGeASEEIAFBHEcNAEE7IAAoAhBFDQEaCyAAIAQ2AgAgAgsLXQBBACECAkACQAJAAkACQCABQQtrQR93DgoAAQQDAwMDAwMCAwtBNw8LQTgPCyAAQZ4BNgIAQQIPCwJAIAFBHEcNACAAKAIQDQBBOw8LIABBngE2AgBBfyECCyACCxgAIAAgASACIAMgBEGiAUEGQRtBAxDDAgsYACAAIAEgAiADIARBqgFBBUEbQQMQwwILnAEBAX9BAyEFAkACQAJAAkACQAJAIAFBD2sOBAUCAwEACyABQRlHDQFBByEFQaEBIQQMAwsgBCACIANB2KYIIAQoAhgRBgAEQEGiASEEDAMLIAQgAiADQd+mCCAEKAIYEQYARQ0AQaMBIQQMAgtBfyEFQZ4BIQQgAUEcRw0BIAAoAhANAUE7DwtBCCEFQaQBIQQLIAAgBDYCAAsgBQt7AQF/AkACQAJAAkACQAJAIAFBIWsOAgECAAsgAUF8Rg0CIAFBD0YNBCABQRpGDQMgACABIAIgAyAEELcJDwsgAEGgATYCAEEADwsgACgCDCIBRQ0BIAAgAUEBazYCDEEADwsgACgCDEUNAQsgAEGeATYCAEF/IQULIAULVQBBAyECQQQhA0GfASEEAkACQAJAAkAgAUEPaw4EAwEBAgALIAFBKUYNAQtBfyEDQZ4BIQQgAUEcRw0AIAAoAhANAEE7DwsgACAENgIAIAMhAgsgAguKAQEBfwJAAkACQAJAAkACQAJAIAFBC2sOBgAEAQUFAgMLQTcPC0E4DwsgBCACIAQoAkBBAXRqIANB0KYIIAQoAhgRBgBFDQEgAEGdATYCAEEDDwsgAUEdRg0CCwJAIAFBHEcNACAAKAIQDQBBOw8LIABBngE2AgBBfyEFCyAFDwsgAEGeATYCAEECC6gBAQN/QZwBIQYCQAJAAkACQAJAAkACQAJAAkAgAUELaw4GAQACCAcDBAtBASEFDAYLQTchBQwFC0E4IQUMBAsgBCACIAQoAkBBAXRqIANB0KYIIAQoAhgRBgBFDQFBAyEFQZ0BIQYMAwsgAUEdRg0BC0F/IQVBngEhBiABQRxHDQFBOyEHIAAoAhBFDQIMAQtBAiEFQZ4BIQYLIAAgBjYCACAFIQcLIAcLmgEBAn8gASgCACIAIAIgAGtBfnEiBWohAiAEIAMoAgBrIAVIBEAgAkECayIGIAIgBi0AAEH4AXFB2AFGIgYbIQILAkADQCAAIAJPDQEgBCADKAIAIgVLBEAgAC8AACEAIAMgBUECajYCACAFIABBCHQgAEEIdnI7AQAgASABKAIAQQJqIgA2AgAMAQsLIAQgBUcNAEECIQYLIAYLpgQBBH8gASgCACIAIAIgAGtBfnFqIQgCfwNAQQAgACAITw0BGiAALQABIgbAIQICQAJAAkACQAJAIAAtAAAiBQ4IAAEBAQEBAQECCyACQQBIDQAgAygCACIFIARGDQMgAyAFQQFqNgIAIAUgAjoAAAwCC0ECIAQgAygCACIHa0ECSA0EGiADIAdBAWo2AgAgByACQQZ2QQNxIAVBAnRyQcABcjoAACADIAMoAgAiBUEBajYCACAFIAJBP3FBgAFyOgAADAELIAVB2AFrQQRPBEAgBCADKAIAIgZrQQNIDQIgAyAGQQFqNgIAIAYgBUEEdkHgAXI6AAAgAyADKAIAIgZBAWo2AgAgBiAFQQJ0QTxxIAJBwAFxQQZ2ckGAAXI6AAAgAyADKAIAIgVBAWo2AgAgBSACQT9xQYABcjoAAAwBCyAEIAMoAgAiB2tBBEgNAUEBIAggAGtBBEgNAxogAyAHQQFqNgIAIAcgBUECdEEMcSAGQQZ2ckEBaiIFQQJ2QfABcjoAACADIAMoAgAiB0EBajYCACAHIAVBBHRBMHEgBkECdkEPcXJBgAFyOgAAIAAtAAIhBiAALQADIQUgAyADKAIAIgdBAWo2AgAgByAGQQJ0QQxxIAJBBHRBMHEgBUEGdnJyQYABcjoAACADIAMoAgAiAkEBajYCACACIAVBP3FBgAFyOgAAIABBAmohAAsgAEECaiEADAELC0ECCyABIAA2AgALzAEBB38gAEHIAGohCCACQQJrIQlBASEGAkADQCAJIAFBAmoiAGtBAkgNASABLQADIgTAIQUCQAJAAkACfyABLAACIgJFBEAgBCAIai0AAAwBCyACIAUQKwtB/wFxQQlrIgdBGksNACAAIQFBASAHdCIKQfOPlz9xDQMgCkGAwAhxRQRAIAdBDEcNASAFQQlHIAJyDQQMAwsgAg0CIAVBAE4NAwwBCyACDQELIAAhASAEQSRGIARBwABGcg0BCwsgAyAANgIAQQAhBgsgBgu3AgECfyAAQcgAaiEFA0AgAiABa0ECTgRAIAEtAAEhAAJAAkACQAJAAkACQAJ/IAEsAAAiBEUEQCAAIAVqLQAADAELIAQgAMAQKwtB/wFxQQVrDgYAAQIFBAMFCyADIAMoAgRBAWo2AgQgAUECaiEBDAYLIAMgAygCBEEBajYCBCABQQNqIQEMBQsgAyADKAIEQQFqNgIEIAFBBGohAQwECyADQQA2AgQgAyADKAIAQQFqNgIAIAFBAmohAQwDCyADIAMoAgBBAWo2AgACfyACIAFBAmoiAGtBAkgEQCAADAELIAEtAAMhBCABQQRqIAACfyABLAACIgBFBEAgBCAFai0AAAwBCyAAIATAECsLQQpGGwshASADQQA2AgQMAgsgAyADKAIEQQFqNgIEIAFBAmohAQwBCwsLnAIAAkACQAJAAkAgAiABa0ECbUECaw4DAAECAwsgAS0AAg0CIAEtAANB9ABHDQIgAS0AAA0CQTxBPkEAIAEtAAEiAEHnAEYbIABB7ABGGw8LIAEtAAANASABLQABQeEARw0BIAEtAAINASABLQADQe0ARw0BIAEtAAQNASABLQAFQfAARw0BQSYPCyABLQAADQAgAS0AASIAQeEARwRAIABB8QBHDQEgAS0AAg0BIAEtAANB9QBHDQEgAS0ABA0BIAEtAAVB7wBHDQEgAS0ABg0BIAEtAAdB9ABHDQFBIg8LIAEtAAINACABLQADQfAARw0AIAEtAAQNACABLQAFQe8ARw0AIAEtAAYNACABLQAHQfMARw0AQScPC0EAC50CAQJ/AkACQAJAIAEtAAQNACABLQAFQfgARw0AIAFBBmohAUEAIQADQAJAIAEtAAANACABLAABIgJB/wFxIgNBO0YNBAJ/AkACQAJAIANBMGsONwAAAAAAAAAAAAAEBAQEBAQEAQEBAQEBBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAgICAgIECyACQTBrIABBBHRyDAILIABBBHQgAmpBN2sMAQsgAEEEdCACakHXAGsLIgBB///DAEoNAwsgAUECaiEBDAALAAsgAUEEaiEBQQAhAANAQU8hAiABLQAARQRAIAEsAAEiAkE7Rg0DIAJBMGshAgsgAUECaiEBIAIgAEEKbGoiAEGAgMQASA0ACwtBfw8LIAAQkgQL0AUBCH8gAEHIAGohCkEBIQADQCAAIQUgASIGLQADIgDAIQgCfyAGLAACIglFBEAgACAKai0AAAwBCyAJIAgQKwshCyAGQQJqIQEgBSEAAkACQAJAAkACQAJAAkACQAJAAkACQCALQf8BcUEDaw4bBgsAAQILCAgJBAULCwsJCwsLBwMLAwsLCwsDCwsgBQ0KQQEhACACIARMDQogAyAEQQR0aiIFQQE6AAwgBSABNgIADAoLAkAgBQ0AQQEhACACIARMDQAgAyAEQQR0aiIFQQE6AAwgBSABNgIACyAGQQNqIQEMCQsCQCAFDQBBASEAIAIgBEwNACADIARBBHRqIgVBAToADCAFIAE2AgALIAZBBGohAQwICyAFDQdBASEAIAIgBEwNByADIARBBHRqIgVBAToADCAFIAE2AgAMBwsgBUECRwRAQQwhB0ECIQAgAiAETA0HIAMgBEEEdGogBkEEajYCBAwHC0ECIQAgB0EMRw0GIAIgBEoEQCADIARBBHRqIAE2AggLIARBAWohBEEMIQdBACEADAYLIAVBAkcEQEENIQdBAiEAIAIgBEwNBiADIARBBHRqIAZBBGo2AgQMBgtBAiEAIAdBDUcNBSACIARKBEAgAyAEQQR0aiABNgIICyAEQQFqIQRBDSEHQQAhAAwFCyACIARMDQQgAyAEQQR0akEAOgAMDAMLQQAhAAJAIAVBAWsOAgQAAwtBAiEAIAIgBEwNAyADIARBBHRqIgUtAAxFDQMCQCAJDQAgASAFKAIERiAIQSBHcg0AIAYtAAUiCcAhCAJ/IAYsAAQiBkUEQCAIQSBGDQIgCSAKai0AAAwBCyAGIAgQKwsgB0cNBAsgBUEAOgAMDAMLQQAhAAJAIAVBAWsOAgMAAgtBAiEAIAIgBEwNAiADIARBBHRqQQA6AAwMAgtBAiEAIAVBAkYNASAEDwsgBSEADAALAAtaAQJ/IABByABqIQIDQCABLQABIQACfyABLAAAIgNFBEAgACACai0AAAwBCyADIADAECsLQf8BcSIAQRVLQQEgAHRBgIyAAXFFckUEQCABQQJqIQEMAQsLIAELbwEDfyAAQcgAaiEDIAEhAANAIAAtAAEhAgJ/IAAsAAAiBEUEQCACIANqLQAADAELIAQgAsAQKwtBBWtB/wFxIgJBGU9Bh4D4CyACdkEBcUVyRQRAIAAgAkECdEHspQhqKAIAaiEADAELCyAAIAFrC0wBAX8CQANAIAMtAAAiBARAQQAhACACIAFrQQJIDQIgAS0AAA0CIAEtAAEgBEcNAiADQQFqIQMgAUECaiEBDAELCyABIAJGIQALIAAL1QIBBH8gASACTwRAQXwPCyACIAFrQQJIBEBBfw8LIABByABqIQcgASEEAkADQCACIARrQQJIDQEgBC0AASEFAn8gBCwAACIGRQRAIAUgB2otAAAMAQsgBiAFwBArCyEGQQIhBQJAAkACQAJAAkACQAJAAkAgBkH/AXEiBkEDaw4IAgYGAAEGBAMFC0EDIQUMBQtBBCEFDAQLIAEgBEcNBiAAIAFBAmogAiADEO4EDwsgASAERw0FIAMgAUECajYCAEEHDwsgASAERw0EIAIgAUECaiICa0ECSARAQX0PCyABLQADIQAgAyABQQRqIAICfyABLAACIgRFBEAgACAHai0AAAwBCyAEIADAECsLQQpGGzYCAEEHDwsgBkEeRg0BCyAEIAVqIQQMAQsLIAEgBEcNACAAIAFBAmogAiADELsJIgBBACAAQRZHGw8LIAMgBDYCAEEGC9cCAQR/IAEgAk8EQEF8DwsgAiABa0ECSARAQX8PCyAAQcgAaiEHIAEhBAJAA0AgAiAEa0ECSA0BIAQtAAEhBQJ/IAQsAAAiBkUEQCAFIAdqLQAADAELIAYgBcAQKwshBkECIQUCQAJAAkACQAJAAkACQAJAAkAgBkH/AXEiBkECaw4JAwIHBwABBwUEBgtBAyEFDAYLQQQhBQwFCyABIARHDQcgACABQQJqIAIgAxDuBA8LIAMgBDYCAEEADwsgASAERw0FIAMgAUECajYCAEEHDwsgASAERw0EIAIgAUECaiICa0ECSARAQX0PCyABLQADIQAgAyABQQRqIAICfyABLAACIgRFBEAgACAHai0AAAwBCyAEIADAECsLQQpGGzYCAEEHDwsgBkEVRg0BCyAEIAVqIQQMAQsLIAEgBEcNACADIAFBAmo2AgBBJw8LIAMgBDYCAEEGC/MCAQR/IAEgAiABayIEQX5xaiACIARBAXEbIQQgAEHIAGohBwJAA0AgBCABIgJrIgZBAkgNASACLQABIQACfyACLAAAIgFFBEAgACAHai0AAAwBCyABIADAECsLIQFBACEAAkACQAJAAkACQAJAAkACQCABQf8BcQ4JBAQCBgMGAAEEBgsgBkECRg0GIAJBA2ohAQwHCyAGQQRJDQUgAkEEaiEBDAYLIAQgAkECaiIBa0ECSA0GIAEtAAANBSACLQADQSFHDQUgBCACQQRqIgFrQQJIDQYgAS0AAA0FIAItAAVB2wBHDQUgAkEGaiEBIAVBAWohBQwFCyAEIAJBAmoiAWtBAkgNBSABLQAADQQgAi0AA0HdAEcNBCAEIAJBBGoiAWtBAkgNBSABLQAADQQgAi0ABUE+Rw0EIAJBBmohASAFDQFBKiEAIAEhAgsgAyACNgIAIAAPCyAFQQFrIQUMAgsgAkECaiEBDAELC0F+DwtBfwuYBAEEfyABIAJPBEBBfA8LAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkAgAiABayIEQQFxBEAgBEF+cSICRQ0BIAEgAmohAgsCQAJAAn8gASwAACIERQRAIAAgAS0AAWotAEgMAQsgBCABLAABECsLQf8BcQ4LDAwHBwAEBQYMAQkHC0F/IQUgAiABQQJqIgRrQQJIDQwgBC0AAA0HIAEtAANB3QBHDQcgAiABQQRqa0ECSA0MIAEtAAQNByABLQAFQT5HDQcgAUEGaiEBQSghBQwLCyACIAFBAmoiBGtBAk4NAQtBfw8LIAFBBGogBAJ/IAQsAAAiAkUEQCAAIAEtAANqLQBIDAELIAIgASwAAxArC0EKRhsMBgsgAiABa0ECSA0JIAFBAmohBAwDCyACIAFrQQNIDQggAUEDaiEEDAILIAIgAWtBBEgNByABQQRqIQQMAQsgAUECaiEECyAAQcgAaiEHQQYhBQNAIAIgBGsiBkECSA0DIAQtAAEhAAJ/IAQsAAAiAUUEQCAAIAdqLQAADAELIAEgAMAQKwshAUECIQACQCABQf8BcSIBQQpLDQACQCABQQZHBEAgAUEHRg0BQQEgAXRBkw5xDQYMAgtBAyEAIAZBAkYNBQwBC0EEIQAgBkEESQ0ECyAAIARqIQQMAAsACyABQQJqCyEBQQchBQwBCyAEIQELIAMgATYCAAsgBQ8LQX4LzRoBCn8jAEEQayIMJAACQCABIAJPBEBBfCEHDAELAkACQAJAAkACQAJAAkACQCACIAFrIgVBAXEEQCAFQX5xIgJFDQEgASACaiECCwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/IAEsAAAiBUUEQCAAIAEtAAFqLQBIDAELIAUgASwAARArC0H/AXEOCwgIAAEEBQYHCAIDCQtBfyEHIAIgAUECaiIJayIFQQJIDQ4CQAJAAkACQAJAAkACQAJ/IAEtAAIiBEUEQCAAIAEtAAMiBmotAEgMAQsgBMAgASwAAyIGECsLQf8BcSIIQQVrDhQcAQIcHBwcHBwcBAMFHBwcHAYcBgALIAhBHUcNGyAGQQN2QRxxIARBoIAIai0AAEEFdHJBsPMHaigCACAGdkEBcQ0FDBsLIAVBAkcNGgwZCyAFQQRPDRkMGAsgAiABQQRqIgVrQQJIDRkCQAJ/IAEsAAQiBEUEQCAAIAEtAAVqLQBIDAELIAQgASwABRArC0H/AXEiBEEURwRAIARBG0cNASAAIAFBBmogAiADEL0JIQcMGwsgAiABQQZqIgRrQQxIDRogAUESaiECQQAhAQNAIAFBBkYEQEEIIQcMGQtBACEHIAQtAAANFyAELQABIAFBwJAIai0AAEcNFyAEQQJqIQQgAUEBaiEBDAALAAsgAyAFNgIAQQAhBwwZCyAAIAFBBGogAiADELwJIQcMGAsgAiABQQRqIgRrIgZBAkgND0EAIQcCQAJ/IAQtAAAiCEUEQCAAIAEtAAUiBWotAEgMAQsgCMAgASwABSIFECsLQf8BcSIBQQZrDgISEQALAkACQCABQRZrDgMBFAEACyABQR1HDRMgBUEDdkEccSAIQaCACGotAABBBXRyQbDzB2ooAgAgBXZBAXFFDRMLIABByABqIQYCfwJAAkACQANAIAIgBCIAQQJqIgRrIghBAkgNFCAALQADIQECQAJAAn8gAC0AAiIJRQRAIAEgBmotAAAMAQsgCcAgAcAQKwtB/wFxQQZrDhgBAxkEBAUZGRkZGRkZGRkEAgICAgICGQAZCyABQQN2QRxxIAlBoIIIai0AAEEFdHJBsPMHaigCACABdkEBcQ0BDBgLCyAIQQJGDRkMFgsgCEEESQ0YDBULA0AgAiAEIgFBAmoiBGtBAkgNEiABLQADIQACQAJAAn8gASwAAiIFRQRAIAAgBmotAAAMAQsgBSAAwBArC0H/AXEiAEEJaw4DAgIBAAsgAEEVRg0BDBYLCyABQQRqDAELIABBBGoLIQRBBSEHDBILIABByABqIQkgAUEEaiEBQQAhBgNAIAIgAWsiC0ECSA0XIAEtAAEhBEECIQUCQAJAAkACQAJAAkACQAJAAn8gAS0AACIKRQRAIAQgCWotAAAMAQsgCsAgBMAQKwtB/wFxQQZrDhgBAhYEBAUWFhYWFgYWFhYEBwMHBwcHFgAWCyAEQQN2QRxxIApBoIIIai0AAEEFdHJBsPMHaigCACAEdkEBcQ0GDBULIAtBAkYNGwwUCyALQQRJDRoMEwsgBg0SIAIgAUECaiINayILQQJIDRsgAS0AAyEEQQEhBkEEIQUCQAJ/IAEtAAIiCkUEQCAEIAlqLQAADAELIArAIATAECsLQf8BcSIIQRZrDgMEEgQACwJAAkAgCEEdRwRAIAhBBmsOAgECFAsgBEEDdkEccSAKQaCACGotAABBBXRyQbDzB2ooAgAgBHZBAXENBQwTCyALQQJGDRoMEgsgC0EESQ0ZDBELAkACQAJAA0AgAiABIgRBAmoiAWsiBkECSA0eIAQtAAMhBQJAAn8gBC0AAiILRQRAIAUgCWotAAAMAQsgC8AgBcAQKwtB/wFxQQZrDhgDBBYBAQUWFhYWFgYWFhYBAhYCFhYWFgAWCwsgBUEDdkEccSALQaCACGotAABBBXRyQbDzB2ooAgAgBXZBAXFFDRQLQQAhCwJAAkACQANAIARBBGohBAJAAkACQAJAAkACQANAIAwgBDYCDEF/IQcgAiAEayIKQQJIDScgBC0AASEBIAQhBUEAIQYCQAJAAkACfyAELQAAIg1FBEAgASAJai0AAAwBCyANwCABwBArC0H/AXFBBmsOGAIEHwgIHx8fCR8fHx8fHwgBBQEBAQEfAB8LIAFBA3ZBHHEgDUGggghqLQAAQQV0ckGw8wdqKAIAIAF2QQFxRQ0FCyAEQQJqIQQMAQsLIApBAkYNJAwbCyAKQQRJDSMMGgsgC0UNAQsgBCEFDBcLIAwgBEECaiIFNgIMIAIgBWsiCEECSA0iIAQtAAMhAUEBIQsCQAJ/IAQtAAIiCkUEQCABIAlqLQAADAELIArAIAHAECsLQf8BcSIHQRZrDgMDGAMACwJAAkAgB0EdRwRAIAdBBmsOAgECGgsgAUEDdkEccSAKQaCACGotAABBBXRyQbDzB2ooAgAgAXZBAXENBAwZCyAIQQJGDSEMGAsgCEEESQ0gDBcLA0AgAiAEQQJqIgVrQQJIDSIgBC0AAyEBAn8gBCwAAiIERQRAIAEgCWotAAAMAQsgBCABwBArCyIBQQ5HBEAgAUH/AXEiAUEVSw0XIAUhBEEBIAF0QYCMgAFxRQ0XDAELCyAMIAU2AgwgBSEECwNAIAIgBEECaiIFa0ECSA0hIAQtAAMhAQJ/IAQsAAIiBkUEQCABIAlqLQAADAELIAYgAcAQKwsiAUH+AXFBDEcEQCABQf8BcSIBQRVLDRYgBSEEQQEgAXRBgIyAAXFFDRYMAQsLIARBBGohBQNAIAwgBTYCDAJAAkADQCACIAVrIghBAkgNJCAFLQABIQQCfyAFLAAAIgZFBEAgBCAJai0AAAwBCyAGIATAECsLIgQgAUYNAkEAIQYCQAJAAkAgBEH/AXEOCRwcHAIEBAABHAQLIAhBAkYNJCAFQQNqIQUMBQsgCEEESQ0jIAVBBGohBQwECyAAIAVBAmogAiAMQQxqEO4EIgVBAEoEQCAMKAIMIQUMAQsLIAUiBw0jIAwoAgwhBQwXCyAFQQJqIQUMAQsLIAwgBUECaiIBNgIMIAIgAWtBAkgNICAFLQADIQQCfyAFLAACIgZFBEAgBCAJai0AAAwBCyAGIATAECsLIQggBSEEIAEhBUEAIQYCQAJAIAhB/wFxIgFBCWsOCQEBBBcXFxcXBQALIAFBFUYNAAwVCwJAA0AgAiAFIgRBAmoiBWsiCEECSA0iIAQtAAMhAUEAIQsCQAJ/IAQtAAIiCkUEQCABIAlqLQAADAELIArAIAHAECsLQf8BcUEGaw4YAgQYAQEFGBgYGBgGGBgYAQMYAxgYGBgAGAsLIAwgBTYCDCAELQADIgFBA3ZBHHEgCkGggAhqLQAAQQV0ckGw8wdqKAIAIAF2QQFxDQEMFgsLIAhBAkYNHQwUCyAIQQRJDRwMEwsgBEEEaiEFQQEhBgwSCyAMIAVBAmoiADYCDCACIABrQQJIDRwgAC0AAARAIAAhBQwRCyAFQQRqIAAgBS0AA0E+RiIAGyEFQQNBACAAGyEGDBELIAZBAkYNGQwSCyAGQQRJDRgMEQtBAiEHIAMgAUECajYCAAwZCyACIAFBAmoiAGtBAkgNGAJAIAEtAAJFBEAgAS0AA0E+Rg0BCyADIAA2AgBBACEHDBkLQQQhByADIAFBBGo2AgAMGAsgASAFaiEBDAALAAsgACABQQJqIAIgAxDuBCEHDBULIAIgAUECaiIFa0ECSARAQX0hBwwVCyADIAFBBGogBQJ/IAUsAAAiAkUEQCAAIAEtAANqLQBIDAELIAIgASwAAxArC0EKRhs2AgBBByEHDBQLIAMgAUECajYCAEEHIQcMEwtBeyEHIAIgAUECaiIEa0ECSA0SIAQtAAANBSABLQADQd0ARw0FIAIgAUEEaiIFa0ECSA0SIAEtAAQNBSABLQAFQT5HDQUgAyAFNgIAQQAhBwwSCyACIAFrQQJIDQ8gAUECaiEEDAQLIAIgAWtBA0gNDiABQQNqIQQMAwsgAiABa0EESA0NIAFBBGohBAwCCyADIAE2AgAMDgsgAUECaiEECyAAQcgAaiEHA0ACQCACIAQiAGsiAUECSA0AIAQtAAEhBQJAAkACQAJAAn8gBCwAACIERQRAIAUgB2otAAAMAQsgBCAFwBArC0H/AXEOCwQEBAQCAwABBAQEAwsgAUECRg0DIABBA2ohBAwECyABQQNNDQIgAEEEaiEEDAMLIAFBBEkNASAAQQJqIQQgAC0AAg0CIAAtAANB3QBHDQIgAUEGSQ0BIAAtAAQNAiAALQAFQT5HDQIgAyAAQQRqNgIAQQAhBwwPCyAAQQJqIQQMAQsLIAMgADYCAEEGIQcMDAtBACEGCyADIAU2AgAgBiEHDAoLIAMgDTYCAEEAIQcMCQsgAyABNgIAQQAhBwwIC0F/IQcMBwsgBkEESQ0EDAELIAZBAkYNAwsgAyAENgIADAQLIAQhAgsgAyACNgIADAILQX4hBwwBCyADIAk2AgBBACEHCyAMQRBqJAAgBwuyEQEGfyABIAJPBEBBfA8LAkACQAJAAkACQAJAAkACQAJAAkAgAiABayIEQQFxBEAgBEF+cSICRQ0BIAEgAmohAgtBfiEGQRIhBQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8gAS0AACIIRQRAIAAgAS0AASIHai0ASAwBCyAIwCABLAABIgcQKwtB/wFxQQJrDiMCGAgODxAYAwQMAAEYGBgYGA0HBBMSExISEhgRBQkKGBgGCxgLQQwgACABQQJqIAIgAxC+CQ8LQQ0gACABQQJqIAIgAxC+CQ8LQX8hBiACIAFBAmoiBWtBAkgNEQJAAkACQAJAAkACfyABLAACIgRFBEAgACABLQADai0ASAwBCyAEIAEsAAMQKwtB/wFxIgRBD2sOCgMCBAQEBAQBBAEACyAEQQVrQQNJDQAgBEEdRw0DCyADIAE2AgBBHQ8LIAIgAUEEaiIEa0ECSA0TAkACQAJAAkACfyAELAAAIgVFBEAgACABLQAFai0ASAwBCyAFIAEsAAUQKwtB/wFxQRRrDggBAwIDAgMDAAMLIAAgAUEGaiACIAMQvQkPCyADIAFBBmo2AgBBIQ8LIABByABqIQUCQANAIAIgBCIBQQJqIgRrIgdBAkgNFiABLQADIQACQAJ/IAEsAAIiCEUEQCAAIAVqLQAADAELIAggAMAQKwtB/wFxIgBBFWsOCiEBAwEDAwMDAwACCwsgB0EESQ0VIAEtAAUhAAJ/IAEsAAQiAUUEQCAAIAVqLQAADAELIAEgAMAQKwtB/wFxIgBBHksNH0EBIAB0QYCMgIEEcQ0BDB8LIABBCWtBAkkNHgsgAyAENgIADB4LIAAgAUEEaiACIAMQvAkPCyADIAU2AgAMHAsgAUECaiACRw0AIAMgAjYCAEFxDwsgAEHIAGohBQNAAkAgAiABIgBBAmoiAWtBAkgNACAALQADIQQCQAJAAn8gACwAAiIGRQRAIAQgBWotAAAMAQsgBiAEwBArC0H/AXEiBEEJaw4CAQMACyAEQRVGDQIMAQsgAEEEaiACRw0BCwsgAyABNgIAQQ8PCyAAIAFBAmogAiADELsJDwsgAyABQQJqNgIAQSYPCyADIAFBAmo2AgBBGQ8LIAIgAUECaiIAayICQQJIBEBBZg8LAkAgAS0AAg0AIAEtAANB3QBHDQAgAkEESQ0OIAEtAAQNACABLQAFQT5HDQAgAyABQQZqNgIAQSIPCyADIAA2AgBBGg8LIAMgAUECajYCAEEXDwsgAiABQQJqIgRrQQJIBEBBaA8LAkACQAJAAkACQAJAAn8gASwAAiICRQRAIAAgAS0AA2otAEgMAQsgAiABLAADECsLQf8BcSIAQSBrDgUYAQMYGAALIABBCWsOBxcXFwQEBAEDCyADIAFBBGo2AgBBJA8LIAMgAUEEajYCAEEjDwsgAyABQQRqNgIAQSUPCyAAQRVGDRMLIAMgBDYCAAwUCyADIAFBAmo2AgBBFQ8LIAMgAUECajYCAEERDwsgAiABQQJqIgRrIgVBAkgNCAJAAn8gBC0AACIIRQRAIAAgAS0AAyIHai0ASAwBCyAIwCABLAADIgcQKwtB/wFxIgFBBmsOAg0MAAtBACEGAkACQAJAIAFBFmsOAwERAQALIAFBHUcNASAHQQN2QRxxIAhBoIAIai0AAEEFdHJBsPMHaigCACAHdkEBcUUNAQsgAEHIAGohCANAIAIgBCIAQQJqIgRrIgdBAkgEQEFsDwsgAC0AAyEFQRQhBgJAAkACQAJ/IAAtAAIiAEUEQCAFIAhqLQAADAELIADAIAXAECsLQf8BcUEGaw4fAAEEExMTBAQEBAQEBAQEEwMEAwMDAwQCEwQTBAQEEwQLQQAhBiAHQQJGDREMEgtBACEGIAdBBEkNEAwRCyAFQQN2QRxxIABBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0ACwtBACEGDA4LIAIgAWtBAkgNBQwJCyACIAFrQQNODQgMBAsgAiABa0EETg0HDAMLQQEgB3QiBCAHQeABcUEFdkECdCIGIAhBoIAIai0AAEEFdHJBsPMHaigCAHENAUETIQUgCEGggghqLQAAQQV0IAZyQbDzB2ooAgAgBHFFDQYMAQtBEyEFCyAAQcgAaiEGIAFBAmohAAJAAkACQAJAAkADQCAFQSlGIQkgBUESRyEEA0AgAiAAIgFrIgdBAkgNBiABLQABIQACQAJAAkACQAJAAkACfyABLQAAIghFBEAgACAGai0AAAwBCyAIwCAAwBArC0H/AXFBBmsOHwIDEAQEBBAQEAsQEBAQBAQBBQEBAQEQAAQQBAoJBAQQCyAAQQN2QRxxIAhBoIIIai0AAEEFdHJBsPMHaigCACAAdkEBcUUNDwsgAUECaiEADAQLIAdBAkYNEQwNCyAHQQRJDRAMDAsgAyABNgIAIAUPCyABQQJqIQAgCQRAQRMhBQwCCyAEDQALIAIgAGsiCEECSA0IIAEtAAMhBEETIQUCQAJAAkACQAJ/IAEtAAIiCUUEQCAEIAZqLQAADAELIAnAIATAECsLQf8BcSIHQRZrDggCBAICAgIEAQALIAdBBWsOAwoCBAMLIARBA3ZBHHEgCUGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxRQ0JCyABQQRqIQBBKSEFDAELCyAIQQJGDQwMBgsgCEEESQ0LDAULIAVBE0YNBiADIAFBAmo2AgBBIA8LIAVBE0YNBSADIAFBAmo2AgBBHw8LIAVBE0YNBCADIAFBAmo2AgBBHg8LQQAgBWshBgsgBg8LIAMgADYCAAwJC0F/DwsgAyABNgIADAcLIAMgATYCAAwGC0EAIQYgBUEESQ0BDAILQQAhBiAFQQJHDQELQX4PCyADIAQ2AgAgBg8LIAMgBDYCAEEYDwsgAyAENgIAQRAPC0EAC1gBAX8CQANAIAEoAgAiACACTw0BIAQgAygCACIFSwRAIAEgAEEBajYCACAALQAAIQAgAyADKAIAIgVBAWo2AgAgBSAAOgAADAELCyAEIAVHDQBBAg8LQQALkgEBAn8gASgCACIAIAIgAGtBfnEiBWohAiAEIAMoAgBrIAVIBEAgAkF+QQAgAkEBay0AAEH4AXFB2AFGIgYbaiECCwJAA0AgACACTw0BIAQgAygCACIFSwRAIAAvAAAhACADIAVBAmo2AgAgBSAAOwEAIAEgASgCAEECaiIANgIADAELCyAEIAVHDQBBAiEGCyAGC6YEAQR/IAEoAgAiACACIABrQX5xaiEIAn8DQEEAIAAgCE8NARogAC0AACIGwCECAkACQAJAAkACQCAALQABIgUOCAABAQEBAQEBAgsgAkEASA0AIAMoAgAiBSAERg0DIAMgBUEBajYCACAFIAI6AAAMAgtBAiAEIAMoAgAiB2tBAkgNBBogAyAHQQFqNgIAIAcgAkEGdkEDcSAFQQJ0ckHAAXI6AAAgAyADKAIAIgVBAWo2AgAgBSACQT9xQYABcjoAAAwBCyAFQdgBa0EETwRAIAQgAygCACIGa0EDSA0CIAMgBkEBajYCACAGIAVBBHZB4AFyOgAAIAMgAygCACIGQQFqNgIAIAYgBUECdEE8cSACQcABcUEGdnJBgAFyOgAAIAMgAygCACIFQQFqNgIAIAUgAkE/cUGAAXI6AAAMAQsgBCADKAIAIgdrQQRIDQFBASAIIABrQQRIDQMaIAMgB0EBajYCACAHIAVBAnRBDHEgBkEGdnJBAWoiBUECdkHwAXI6AAAgAyADKAIAIgdBAWo2AgAgByAFQQR0QTBxIAZBAnZBD3FyQYABcjoAACAALQADIQYgAC0AAiEFIAMgAygCACIHQQFqNgIAIAcgBkECdEEMcSACQQR0QTBxIAVBBnZyckGAAXI6AAAgAyADKAIAIgJBAWo2AgAgAiAFQT9xQYABcjoAACAAQQJqIQALIABBAmohAAwBCwtBAgsgASAANgIAC8wBAQd/IABByABqIQggAkECayEJQQEhBgJAA0AgCSABQQJqIgBrQQJIDQEgAS0AAiIEwCEFAkACQAJAAn8gASwAAyICRQRAIAQgCGotAAAMAQsgAiAFECsLQf8BcUEJayIHQRpLDQAgACEBQQEgB3QiCkHzj5c/cQ0DIApBgMAIcUUEQCAHQQxHDQEgBUEJRyACcg0EDAMLIAINAiAFQQBODQMMAQsgAg0BCyAAIQEgBEEkRiAEQcAARnINAQsLIAMgADYCAEEAIQYLIAYLtwIBAn8gAEHIAGohBQNAIAIgAWtBAk4EQCABLQAAIQACQAJAAkACQAJAAkACfyABLAABIgRFBEAgACAFai0AAAwBCyAEIADAECsLQf8BcUEFaw4GAAECBQQDBQsgAyADKAIEQQFqNgIEIAFBAmohAQwGCyADIAMoAgRBAWo2AgQgAUEDaiEBDAULIAMgAygCBEEBajYCBCABQQRqIQEMBAsgA0EANgIEIAMgAygCAEEBajYCACABQQJqIQEMAwsgAyADKAIAQQFqNgIAAn8gAiABQQJqIgBrQQJIBEAgAAwBCyABLQACIQQgAUEEaiAAAn8gASwAAyIARQRAIAQgBWotAAAMAQsgACAEwBArC0EKRhsLIQEgA0EANgIEDAILIAMgAygCBEEBajYCBCABQQJqIQEMAQsLC5wCAAJAAkACQAJAIAIgAWtBAm1BAmsOAwABAgMLIAEtAAMNAiABLQACQfQARw0CIAEtAAENAkE8QT5BACABLQAAIgBB5wBGGyAAQewARhsPCyABLQABDQEgAS0AAEHhAEcNASABLQADDQEgAS0AAkHtAEcNASABLQAFDQEgAS0ABEHwAEcNAUEmDwsgAS0AAQ0AIAEtAAAiAEHhAEcEQCAAQfEARw0BIAEtAAMNASABLQACQfUARw0BIAEtAAUNASABLQAEQe8ARw0BIAEtAAcNASABLQAGQfQARw0BQSIPCyABLQADDQAgAS0AAkHwAEcNACABLQAFDQAgAS0ABEHvAEcNACABLQAHDQAgAS0ABkHzAEcNAEEnDwtBAAudAgECfyABQQRqIQACQAJAAkAgAS0ABQ0AIAAtAABB+ABHDQAgAUEGaiEAQQAhAQNAAkAgAC0AAQ0AIAAsAAAiAkH/AXEiA0E7Rg0EAn8CQAJAAkAgA0Ewaw43AAAAAAAAAAAAAAQEBAQEBAQBAQEBAQEEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAICAgICAgQLIAJBMGsgAUEEdHIMAgsgAUEEdCACakE3awwBCyABQQR0IAJqQdcAawsiAUH//8MASg0DCyAAQQJqIQAMAAsAC0EAIQEDQEFPIQIgAC0AAUUEQCAALAAAIgJBO0YNAyACQTBrIQILIABBAmohACACIAFBCmxqIgFBgIDEAEgNAAsLQX8PCyABEJIEC9QFAQl/IABByABqIQpBASEFA0AgBSEGIAEiBy0AAiIAwCEJAn8gBywAAyILRQRAIAAgCmotAAAMAQsgCyAJECsLIQwgB0ECaiIAIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkAgDEH/AXFBA2sOGwYMAAECDAgICQQFDAwMCQwMDAcDDAMMDAwMAwwLIAYNC0EBIQUgAiAETA0LIAMgBEEEdGoiAEEBOgAMIAAgATYCAAwLCyAHQQNqIQEgBg0KQQEhBSACIARMDQogAyAEQQR0aiIGQQE6AAwgBiAANgIADAoLAkAgBg0AQQEhBSACIARMDQAgAyAEQQR0aiIBQQE6AAwgASAANgIACyAHQQRqIQEMCQsgBg0IQQEhBSACIARMDQggAyAEQQR0aiIAQQE6AAwgACABNgIADAgLIAZBAkcEQEEMIQhBAiEFIAIgBEwNCCADIARBBHRqIAdBBGo2AgQMCAtBAiEFIAhBDEcNByACIARKBEAgAyAEQQR0aiAANgIICyAEQQFqIQRBDCEIDAYLIAZBAkcEQEENIQhBAiEFIAIgBEwNByADIARBBHRqIAdBBGo2AgQMBwtBAiEFIAhBDUcNBiACIARKBEAgAyAEQQR0aiAANgIICyAEQQFqIQRBDSEIDAULIAIgBEwNBSADIARBBHRqQQA6AAwMAwtBACEFAkAgBkEBaw4CBQADC0ECIQUgAiAETA0EIAMgBEEEdGoiBi0ADEUNBAJAIAsNACAAIAYoAgRGIAlBIEdyDQAgBy0ABCIJwCEBAn8gBywABSIHRQRAIAFBIEYNAiAJIApqLQAADAELIAcgARArCyAAIQEgCEcNBQsgBkEAOgAMIAAhAQwEC0EAIQUCQCAGQQFrDgIEAAILQQIhBSACIARMDQMgAyAEQQR0akEAOgAMDAMLQQIhBSAGQQJGDQIgBA8LIAYhBQwBC0EAIQUMAAsAC1oBAn8gAEHIAGohAgNAIAEtAAAhAAJ/IAEsAAEiA0UEQCAAIAJqLQAADAELIAMgAMAQKwtB/wFxIgBBFUtBASAAdEGAjIABcUVyRQRAIAFBAmohAQwBCwsgAQtvAQN/IABByABqIQMgASEAA0AgAC0AACECAn8gACwAASIERQRAIAIgA2otAAAMAQsgBCACwBArC0EFa0H/AXEiAkEZT0GHgPgLIAJ2QQFxRXJFBEAgACACQQJ0QeylCGooAgBqIQAMAQsLIAAgAWsLTAEBfwJAA0AgAy0AACIEBEBBACEAIAIgAWtBAkgNAiABLQABDQIgAS0AACAERw0CIANBAWohAyABQQJqIQEMAQsLIAEgAkYhAAsgAAvVAgEEfyABIAJPBEBBfA8LIAIgAWtBAkgEQEF/DwsgAEHIAGohByABIQQCQANAIAIgBGtBAkgNASAELQAAIQUCfyAELAABIgZFBEAgBSAHai0AAAwBCyAGIAXAECsLIQZBAiEFAkACQAJAAkACQAJAAkACQCAGQf8BcSIGQQNrDggCBgYAAQYEAwULQQMhBQwFC0EEIQUMBAsgASAERw0GIAAgAUECaiACIAMQ8AQPCyABIARHDQUgAyABQQJqNgIAQQcPCyABIARHDQQgAiABQQJqIgJrQQJIBEBBfQ8LIAEtAAIhACADIAFBBGogAgJ/IAEsAAMiBEUEQCAAIAdqLQAADAELIAQgAMAQKwtBCkYbNgIAQQcPCyAGQR5GDQELIAQgBWohBAwBCwsgASAERw0AIAAgAUECaiACIAMQwQkiAEEAIABBFkcbDwsgAyAENgIAQQYL1wIBBH8gASACTwRAQXwPCyACIAFrQQJIBEBBfw8LIABByABqIQcgASEEAkADQCACIARrQQJIDQEgBC0AACEFAn8gBCwAASIGRQRAIAUgB2otAAAMAQsgBiAFwBArCyEGQQIhBQJAAkACQAJAAkACQAJAAkACQCAGQf8BcSIGQQJrDgkDAgcHAAEHBQQGC0EDIQUMBgtBBCEFDAULIAEgBEcNByAAIAFBAmogAiADEPAEDwsgAyAENgIAQQAPCyABIARHDQUgAyABQQJqNgIAQQcPCyABIARHDQQgAiABQQJqIgJrQQJIBEBBfQ8LIAEtAAIhACADIAFBBGogAgJ/IAEsAAMiBEUEQCAAIAdqLQAADAELIAQgAMAQKwtBCkYbNgIAQQcPCyAGQRVGDQELIAQgBWohBAwBCwsgASAERw0AIAMgAUECajYCAEEnDwsgAyAENgIAQQYL8wIBBH8gASACIAFrIgRBfnFqIAIgBEEBcRshBCAAQcgAaiEHAkADQCAEIAEiAmsiBkECSA0BIAItAAAhAAJ/IAIsAAEiAUUEQCAAIAdqLQAADAELIAEgAMAQKwshAUEAIQACQAJAAkACQAJAAkACQAJAIAFB/wFxDgkEBAIGAwYAAQQGCyAGQQJGDQYgAkEDaiEBDAcLIAZBBEkNBSACQQRqIQEMBgsgBCACQQJqIgFrQQJIDQYgAi0AAw0FIAEtAABBIUcNBSAEIAJBBGoiAWtBAkgNBiACLQAFDQUgAS0AAEHbAEcNBSACQQZqIQEgBUEBaiEFDAULIAQgAkECaiIBa0ECSA0FIAItAAMNBCABLQAAQd0ARw0EIAQgAkEEaiIBa0ECSA0FIAItAAUNBCABLQAAQT5HDQQgAkEGaiEBIAUNAUEqIQAgASECCyADIAI2AgAgAA8LIAVBAWshBQwCCyACQQJqIQEMAQsLQX4PC0F/C5gEAQR/IAEgAk8EQEF8DwsCQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQCACIAFrIgRBAXEEQCAEQX5xIgJFDQEgASACaiECCwJAAkACfyABLAABIgRFBEAgACABLQAAai0ASAwBCyAEIAEsAAAQKwtB/wFxDgsMDAcHAAQFBgwBCQcLQX8hBSACIAFBAmoiBGtBAkgNDCABLQADDQcgBC0AAEHdAEcNByACIAFBBGprQQJIDQwgAS0ABQ0HIAEtAARBPkcNByABQQZqIQFBKCEFDAsLIAIgAUECaiIEa0ECTg0BC0F/DwsgAUEEaiAEAn8gASwAAyICRQRAIAAgBC0AAGotAEgMAQsgAiAELAAAECsLQQpGGwwGCyACIAFrQQJIDQkgAUECaiEEDAMLIAIgAWtBA0gNCCABQQNqIQQMAgsgAiABa0EESA0HIAFBBGohBAwBCyABQQJqIQQLIABByABqIQdBBiEFA0AgAiAEayIGQQJIDQMgBC0AACEAAn8gBCwAASIBRQRAIAAgB2otAAAMAQsgASAAwBArCyEBQQIhAAJAIAFB/wFxIgFBCksNAAJAIAFBBkcEQCABQQdGDQFBASABdEGTDnENBgwCC0EDIQAgBkECRg0FDAELQQQhACAGQQRJDQQLIAAgBGohBAwACwALIAFBAmoLIQFBByEFDAELIAQhAQsgAyABNgIACyAFDwtBfgvXGgEKfyMAQRBrIgskAAJAIAEgAk8EQEF8IQcMAQsCQAJAAkACQAJAAkACQAJAIAIgAWsiBUEBcQRAIAVBfnEiAkUNASABIAJqIQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8gASwAASIFRQRAIAAgAS0AAGotAEgMAQsgBSABLAAAECsLQf8BcQ4LCAgAAQQFBgcIAgMJC0F/IQcgAiABQQJqIglrIgVBAkgNDgJAAkACQAJAAkACQAJAAn8gAS0AAyIERQRAIAAgAS0AAiIGai0ASAwBCyAEwCABLAACIgYQKwtB/wFxIghBBWsOFBwBAhwcHBwcHBwEAwUcHBwcBhwGAAsgCEEdRw0bIAZBA3ZBHHEgBEGggAhqLQAAQQV0ckGw8wdqKAIAIAZ2QQFxDQUMGwsgBUECRw0aDBkLIAVBBE8NGQwYCyACIAFBBGoiBWtBAkgNGQJAAn8gASwABSIERQRAIAAgAS0ABGotAEgMAQsgBCABLAAEECsLQf8BcSIEQRRHBEAgBEEbRw0BIAAgAUEGaiACIAMQwwkhBwwbCyACIAFBBmoiBGtBDEgNGiABQRJqIQJBACEBA0AgAUEGRgRAQQghBwwZC0EAIQcgBC0AAQ0XIAQtAAAgAUHAkAhqLQAARw0XIARBAmohBCABQQFqIQEMAAsACyADIAU2AgBBACEHDBkLIAAgAUEEaiACIAMQwgkhBwwYCyACIAFBBGoiBGsiBkECSA0PQQAhBwJAAn8gAS0ABSIIRQRAIAAgBC0AACIFai0ASAwBCyAIwCAELAAAIgUQKwtB/wFxIgFBBmsOAhIRAAsCQAJAIAFBFmsOAwEUAQALIAFBHUcNEyAFQQN2QRxxIAhBoIAIai0AAEEFdHJBsPMHaigCACAFdkEBcUUNEwsgAEHIAGohBgJ/AkACQAJAA0AgAiAEIgBBAmoiBGsiCEECSA0UIAAtAAIhAQJAAkACfyAALQADIglFBEAgASAGai0AAAwBCyAJwCABwBArC0H/AXFBBmsOGAEDGQQEBRkZGRkZGRkZGQQCAgICAgIZABkLIAFBA3ZBHHEgCUGggghqLQAAQQV0ckGw8wdqKAIAIAF2QQFxDQEMGAsLIAhBAkYNGQwWCyAIQQRJDRgMFQsDQCACIAQiAUECaiIEa0ECSA0SIAEtAAIhAAJAAkACfyABLAADIgVFBEAgACAGai0AAAwBCyAFIADAECsLQf8BcSIAQQlrDgMCAgEACyAAQRVGDQEMFgsLIAFBBGoMAQsgAEEEagshBEEFIQcMEgsgAEHIAGohCSABQQRqIQFBACEGA0AgAiABayIKQQJIDRcgAS0AACEEQQIhBQJAAkACQAJAAkACQAJAAkACfyABLQABIgxFBEAgBCAJai0AAAwBCyAMwCAEwBArC0H/AXFBBmsOGAECFgQEBRYWFhYWBhYWFgQHAwcHBwcWABYLIARBA3ZBHHEgDEGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxDQYMFQsgCkECRg0bDBQLIApBBEkNGgwTCyAGDRIgAiABQQJqIg1rIgpBAkgNGyABLQACIQRBASEGQQQhBQJAAn8gAS0AAyIMRQRAIAQgCWotAAAMAQsgDMAgBMAQKwtB/wFxIghBFmsOAwQSBAALAkACQCAIQR1HBEAgCEEGaw4CAQIUCyAEQQN2QRxxIAxBoIAIai0AAEEFdHJBsPMHaigCACAEdkEBcQ0FDBMLIApBAkYNGgwSCyAKQQRJDRkMEQsCQAJAAkADQCACIAEiBEECaiIBayIGQQJIDR4gBC0AAiEFAkACfyAELQADIgpFBEAgBSAJai0AAAwBCyAKwCAFwBArC0H/AXFBBmsOGAMEFgEBBRYWFhYWBhYWFgECFgIWFhYWABYLCyAFQQN2QRxxIApBoIAIai0AAEEFdHJBsPMHaigCACAFdkEBcUUNFAtBACEKAkACQAJAA0AgBEEEaiEEAkACQAJAAkACQAJAA0AgCyAENgIMQX8hByACIARrIgxBAkgNJyAELQAAIQEgBCEFQQAhBgJAAkACQAJ/IAQtAAEiDUUEQCABIAlqLQAADAELIA3AIAHAECsLQf8BcUEGaw4YAgQfCAgfHx8JHx8fHx8fCAEFAQEBAR8AHwsgAUEDdkEccSANQaCCCGotAABBBXRyQbDzB2ooAgAgAXZBAXFFDQULIARBAmohBAwBCwsgDEECRg0kDBsLIAxBBEkNIwwaCyAKRQ0BCyAEIQUMFwsgCyAEQQJqIgU2AgwgAiAFayIIQQJIDSIgBC0AAiEBQQEhCgJAAn8gBC0AAyIMRQRAIAEgCWotAAAMAQsgDMAgAcAQKwtB/wFxIgdBFmsOAwMYAwALAkACQCAHQR1HBEAgB0EGaw4CAQIaCyABQQN2QRxxIAxBoIAIai0AAEEFdHJBsPMHaigCACABdkEBcQ0EDBkLIAhBAkYNIQwYCyAIQQRJDSAMFwsDQCACIARBAmoiBWtBAkgNIiAELQACIQECfyAELAADIgRFBEAgASAJai0AAAwBCyAEIAHAECsLIgFBDkcEQCABQf8BcSIBQRVLDRcgBSEEQQEgAXRBgIyAAXFFDRcMAQsLIAsgBTYCDCAFIQQLA0AgAiAEQQJqIgVrQQJIDSEgBC0AAiEBAn8gBCwAAyIGRQRAIAEgCWotAAAMAQsgBiABwBArCyIBQf4BcUEMRwRAIAFB/wFxIgFBFUsNFiAFIQRBASABdEGAjIABcUUNFgwBCwsgBEEEaiEFA0AgCyAFNgIMAkACQANAIAIgBWsiCEECSA0kIAUtAAAhBAJ/IAUsAAEiBkUEQCAEIAlqLQAADAELIAYgBMAQKwsiBCABRg0CQQAhBgJAAkACQCAEQf8BcQ4JHBwcAgQEAAEcBAsgCEECRg0kIAVBA2ohBQwFCyAIQQRJDSMgBUEEaiEFDAQLIAAgBUECaiACIAtBDGoQ8AQiBUEASgRAIAsoAgwhBQwBCwsgBSIHDSMgCygCDCEFDBcLIAVBAmohBQwBCwsgCyAFQQJqIgE2AgwgAiABa0ECSA0gIAUtAAIhBAJ/IAUsAAMiBkUEQCAEIAlqLQAADAELIAYgBMAQKwshCCAFIQQgASEFQQAhBgJAAkAgCEH/AXEiAUEJaw4JAQEEFxcXFxcFAAsgAUEVRg0ADBULAkADQCACIAUiBEECaiIFayIIQQJIDSIgBC0AAiEBAn8gBCwAAyIGRQRAIAEgCWotAAAMAQsgBiABwBArCyEBQQAhCkEAIQYCQCABQf8BcUEGaw4YAgQYAQEFGBgYGBgGGBgYAQMYAxgYGBgAGAsLIAsgBTYCDCAELQACIgFBA3ZBHHEgBC0AA0GggAhqLQAAQQV0ckGw8wdqKAIAIAF2QQFxDQEMFgsLIAhBAkYNHQwUCyAIQQRJDRwMEwsgBEEEaiEFQQEhBgwSCyALIAVBAmoiADYCDCACIABrQQJIDRwgBS0AAwRAIAAhBQwRCyAFQQRqIAAgBS0AAkE+RiIAGyEFQQNBACAAGyEGDBELIAZBAkYNGQwSCyAGQQRJDRgMEQtBAiEHIAMgAUECajYCAAwZCyACIAFBAmoiAGtBAkgNGAJAIAEtAANFBEAgAS0AAkE+Rg0BCyADIAA2AgBBACEHDBkLQQQhByADIAFBBGo2AgAMGAsgASAFaiEBDAALAAsgACABQQJqIAIgAxDwBCEHDBULIAIgAUECaiIFa0ECSARAQX0hBwwVCyADIAFBBGogBQJ/IAEsAAMiAkUEQCAAIAUtAABqLQBIDAELIAIgBSwAABArC0EKRhs2AgBBByEHDBQLIAMgAUECajYCAEEHIQcMEwtBeyEHIAIgAUECaiIEa0ECSA0SIAEtAAMNBSAELQAAQd0ARw0FIAIgAUEEaiIFa0ECSA0SIAEtAAUNBSABLQAEQT5HDQUgAyAFNgIAQQAhBwwSCyACIAFrQQJIDQ8gAUECaiEEDAQLIAIgAWtBA0gNDiABQQNqIQQMAwsgAiABa0EESA0NIAFBBGohBAwCCyADIAE2AgAMDgsgAUECaiEECyAAQcgAaiEHA0ACQCACIAQiAGsiAUECSA0AIAQtAAAhBQJAAkACQAJAAn8gBCwAASIERQRAIAUgB2otAAAMAQsgBCAFwBArC0H/AXEOCwQEBAQCAwABBAQEAwsgAUECRg0DIABBA2ohBAwECyABQQNNDQIgAEEEaiEEDAMLIAFBBEkNASAAQQJqIQQgAC0AAw0CIAQtAABB3QBHDQIgAUEGSQ0BIAAtAAUNAiAALQAEQT5HDQIgAyAAQQRqNgIAQQAhBwwPCyAAQQJqIQQMAQsLIAMgADYCAEEGIQcMDAtBACEGCyADIAU2AgAgBiEHDAoLIAMgDTYCAEEAIQcMCQsgAyABNgIAQQAhBwwIC0F/IQcMBwsgBkEESQ0EDAELIAZBAkYNAwsgAyAENgIADAQLIAQhAgsgAyACNgIADAILQX4hBwwBCyADIAk2AgBBACEHCyALQRBqJAAgBwuyEQEGfyABIAJPBEBBfA8LAkACQAJAAkACQAJAAkACQAJAAkAgAiABayIEQQFxBEAgBEF+cSICRQ0BIAEgAmohAgtBfiEGQRIhBQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8gAS0AASIIRQRAIAAgAS0AACIHai0ASAwBCyAIwCABLAAAIgcQKwtB/wFxQQJrDiMCGAgODxAYAwQMAAEYGBgYGA0HBBMSExISEhgRBQkKGBgGCxgLQQwgACABQQJqIAIgAxDECQ8LQQ0gACABQQJqIAIgAxDECQ8LQX8hBiACIAFBAmoiBWtBAkgNEQJAAkACQAJAAkACfyABLAADIgRFBEAgACABLQACai0ASAwBCyAEIAEsAAIQKwtB/wFxIgRBD2sOCgMCBAQEBAQBBAEACyAEQQVrQQNJDQAgBEEdRw0DCyADIAE2AgBBHQ8LIAIgAUEEaiIEa0ECSA0TAkACQAJAAkACfyABLAAFIgVFBEAgACAELQAAai0ASAwBCyAFIAQsAAAQKwtB/wFxQRRrDggBAwIDAgMDAAMLIAAgAUEGaiACIAMQwwkPCyADIAFBBmo2AgBBIQ8LIABByABqIQUCQANAIAIgBCIBQQJqIgRrIgdBAkgNFiABLQACIQACQAJ/IAEsAAMiCEUEQCAAIAVqLQAADAELIAggAMAQKwtB/wFxIgBBFWsOCiEBAwEDAwMDAwACCwsgB0EESQ0VIAEtAAQhAAJ/IAEsAAUiAUUEQCAAIAVqLQAADAELIAEgAMAQKwtB/wFxIgBBHksNH0EBIAB0QYCMgIEEcQ0BDB8LIABBCWtBAkkNHgsgAyAENgIADB4LIAAgAUEEaiACIAMQwgkPCyADIAU2AgAMHAsgAUECaiACRw0AIAMgAjYCAEFxDwsgAEHIAGohBQNAAkAgAiABIgBBAmoiAWtBAkgNACAALQACIQQCQAJAAn8gACwAAyIGRQRAIAQgBWotAAAMAQsgBiAEwBArC0H/AXEiBEEJaw4CAQMACyAEQRVGDQIMAQsgAEEEaiACRw0BCwsgAyABNgIAQQ8PCyAAIAFBAmogAiADEMEJDwsgAyABQQJqNgIAQSYPCyADIAFBAmo2AgBBGQ8LIAIgAUECaiIAayICQQJIBEBBZg8LAkAgAS0AAw0AIAEtAAJB3QBHDQAgAkEESQ0OIAEtAAUNACABLQAEQT5HDQAgAyABQQZqNgIAQSIPCyADIAA2AgBBGg8LIAMgAUECajYCAEEXDwsgAiABQQJqIgRrQQJIBEBBaA8LAkACQAJAAkACQAJAAn8gASwAAyICRQRAIAAgAS0AAmotAEgMAQsgAiABLAACECsLQf8BcSIAQSBrDgUYAQMYGAALIABBCWsOBxcXFwQEBAEDCyADIAFBBGo2AgBBJA8LIAMgAUEEajYCAEEjDwsgAyABQQRqNgIAQSUPCyAAQRVGDRMLIAMgBDYCAAwUCyADIAFBAmo2AgBBFQ8LIAMgAUECajYCAEERDwsgAiABQQJqIgRrIgVBAkgNCAJAAn8gAS0AAyIIRQRAIAAgBC0AACIHai0ASAwBCyAIwCAELAAAIgcQKwtB/wFxIgFBBmsOAg0MAAtBACEGAkACQAJAIAFBFmsOAwERAQALIAFBHUcNASAHQQN2QRxxIAhBoIAIai0AAEEFdHJBsPMHaigCACAHdkEBcUUNAQsgAEHIAGohCANAIAIgBCIAQQJqIgRrIgdBAkgEQEFsDwsgAC0AAiEFQRQhBgJAAkACQAJ/IAAtAAMiAEUEQCAFIAhqLQAADAELIADAIAXAECsLQf8BcUEGaw4fAAEEExMTBAQEBAQEBAQEEwMEAwMDAwQCEwQTBAQEEwQLQQAhBiAHQQJGDREMEgtBACEGIAdBBEkNEAwRCyAFQQN2QRxxIABBoIIIai0AAEEFdHJBsPMHaigCACAFdkEBcQ0ACwtBACEGDA4LIAIgAWtBAkgNBQwJCyACIAFrQQNODQgMBAsgAiABa0EETg0HDAMLQQEgB3QiBCAHQeABcUEFdkECdCIGIAhBoIAIai0AAEEFdHJBsPMHaigCAHENAUETIQUgCEGggghqLQAAQQV0IAZyQbDzB2ooAgAgBHFFDQYMAQtBEyEFCyAAQcgAaiEGIAFBAmohAAJAAkACQAJAAkADQCAFQSlGIQkgBUESRyEEA0AgAiAAIgFrIgdBAkgNBiABLQAAIQACQAJAAkACQAJAAkACfyABLQABIghFBEAgACAGai0AAAwBCyAIwCAAwBArC0H/AXFBBmsOHwIDEAQEBBAQEAsQEBAQBAQBBQEBAQEQAAQQBAoJBAQQCyAAQQN2QRxxIAhBoIIIai0AAEEFdHJBsPMHaigCACAAdkEBcUUNDwsgAUECaiEADAQLIAdBAkYNEQwNCyAHQQRJDRAMDAsgAyABNgIAIAUPCyABQQJqIQAgCQRAQRMhBQwCCyAEDQALIAIgAGsiCEECSA0IIAEtAAIhBEETIQUCQAJAAkACQAJ/IAEtAAMiCUUEQCAEIAZqLQAADAELIAnAIATAECsLQf8BcSIHQRZrDggCBAICAgIEAQALIAdBBWsOAwoCBAMLIARBA3ZBHHEgCUGggghqLQAAQQV0ckGw8wdqKAIAIAR2QQFxRQ0JCyABQQRqIQBBKSEFDAELCyAIQQJGDQwMBgsgCEEESQ0LDAULIAVBE0YNBiADIAFBAmo2AgBBIA8LIAVBE0YNBSADIAFBAmo2AgBBHw8LIAVBE0YNBCADIAFBAmo2AgBBHg8LQQAgBWshBgsgBg8LIAMgADYCAAwJC0F/DwsgAyABNgIADAcLIAMgATYCAAwGC0EAIQYgBUEESQ0BDAILQQAhBiAFQQJHDQELQX4PCyADIAQ2AgAgBg8LIAMgBDYCAEEYDwsgAyAENgIAQRAPC0EAC2ABAX9BASEAAkAgASwAA0G/f0oNACABLAACQb9/Sg0AIAEtAAEhAiABLQAAIgFB8AFGBEAgAkFAa0H/AXFB0AFJDwsgAsBBAE4NACACQY8BQb8BIAFB9AFGG0shAAsgAAubAQEDf0EBIQICQCABLAACIgNBAE4NAAJAAkACQCABLQAAIgRB7wFGBEBBvwEhACABLQABIgFBvwFHDQEgA0G9f00NAwwECyADQb9/Sw0DIAEtAAEhACAEQeABRw0BIABBQGtB/wFxQeABSQ8LIAEhACADQb9/Sw0CCyAAwEEATg0BCyAAQf8BcUGfAUG/ASAEQe0BRhtLIQILIAILKgBBASEAAkAgAS0AAEHCAUkNACABLAABIgFBAE4NACABQb9/SyEACyAACw0AIAAgAUGggAgQmAoLDQAgACABQaCACBCZCgsNACAAIAFBoIIIEJgKCw0AIAAgAUGggggQmQoL5AIBBX8gAEHIAGohByABKAIAIQAgAygCACEFAn8CQANAIAQgBU0gACACT3JFBEACQAJAAkACQCAHIAAtAAAiBmotAABBBWsOAwABAgMLIAIgAGtBAkgNBSAFIAAtAAFBP3EgBkEfcUEGdHI7AQAgAEECaiEAIAVBAmohBQwECyACIABrQQNIDQQgBSAALQACQT9xIAAtAAFBP3FBBnQgBkEMdHJyOwEAIABBA2ohACAFQQJqIQUMAwtBAiAEIAVrQQNIDQQaIAIgAGtBBEgNAyAALQABIQggBSAALQACQT9xQQZ0IgkgAC0AA0E/cXJBgLgDcjsBAiAFIAZBB3FBEnQgCEE/cUEMdHIgCXJBgID8B2pBCnZBgLADcjsBACAAQQRqIQAgBUEEaiEFDAILIAUgBsA7AQAgBUECaiEFIABBAWohAAwBCwsgACACSUEBdAwBC0EBCyABIAA2AgAgAyAFNgIAC60CAQd/IwBBEGsiACQAIAAgAjYCDCACIAEoAgAiBmsiCiAEIAMoAgAiC2siCUoEQCAAIAYgCWoiAjYCDAsgBiEEIAAoAgwhBgNAAkACQAJAAkAgBiIFIARNDQACQCAFQQFrIgYtAAAiCEH4AXFB8AFGBEAgB0EDa0F7TQ0BDAMLIAhB8AFxQeABRgRAIAdBAmtBfEsNAyAFQQJqIQUMAgsgCEHgAXFBwAFGBEAgB0EBa0F9Sw0DIAVBAWohBQwCCyAIwEEATg0BDAMLIAVBA2ohBQsgACAFNgIMDAILQQAhBwsgB0EBaiEHDAELCyALIAQgACgCDCIGIARrIgQQHxogASABKAIAIARqNgIAIAMgAygCACAEajYCACAAQRBqJABBAiACIAZLIAkgCkgbC1gBAX8CQANAIAEoAgAiACACTw0BIAQgAygCACIFSwRAIAEgAEEBajYCACAALQAAIQAgAyADKAIAIgVBAmo2AgAgBSAAOwEADAELCyAEIAVHDQBBAg8LQQALtAEBAn8DQCACIAEoAgAiBUYEQEEADwsgAygCACEAAkACQCAFLAAAIgZBAEgEQCAEIABrQQJIDQEgAyAAQQFqNgIAIAAgBkHAAXFBBnZBwAFyOgAAIAMgAygCACIAQQFqNgIAIAAgBkG/AXE6AAAgASABKAIAQQFqNgIADAMLIAAgBEcNAQtBAg8LIAEgBUEBajYCACAFLQAAIQAgAyADKAIAIgVBAWo2AgAgBSAAOgAADAALAAuaAQEFfyAAQcgAaiEGIAJBAWshB0EBIQICQANAIAcgAUEBaiIBa0EATA0BAkACQCAGIAEtAAAiAGotAABBCWsiBEEaSw0AQQEgBHQiCEHzj5c/cQ0CIADAIQUgCEGAwAhxRQRAIARBDEcNASAFQQlHDQMMAgsgBUEATg0CCyAAQSRGIABBwABGcg0BCwsgAyABNgIAQQAhAgsgAgvFAQACQAJAAkACQCACIAFrQQJrDgMAAQIDCyABLQABQfQARw0CQTxBPkEAIAEtAAAiAEHnAEYbIABB7ABGGw8LIAEtAABB4QBHDQEgAS0AAUHtAEcNASABLQACQfAARw0BQSYPCyABLQAAIgBB4QBHBEAgAEHxAEcNASABLQABQfUARw0BIAEtAAJB7wBHDQEgAS0AA0H0AEcNAUEiDwsgAS0AAUHwAEcNACABLQACQe8ARw0AIAEtAANB8wBHDQBBJw8LQQALgAIBAn8CQAJAIAEtAAIiAEH4AEcEQCABQQJqIQJBACEBA0AgAEH/AXFBO0YNAiAAwCABQQpsakEwayIBQf//wwBKDQMgAi0AASEAIAJBAWohAgwACwALIAFBA2ohAEEAIQEDQCAALQAAIgPAIQICQAJ/AkACQAJAIANBMGsONwAAAAAAAAAAAAAEBgQEBAQEAQEBAQEBBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAgICAgIECyACQTBrIAFBBHRyDAILIAFBBHQgAmpBN2sMAQsgAUEEdCACakHXAGsLIgFB///DAEoNAwsgAEEBaiEADAALAAsgARCSBA8LQX8LlQUBBn8gAEHIAGohCEEBIQADQCAAIQUgASIGQQFqIQECQAJAAkACQAJAAkACQAJAAkACQAJAIAggBi0AASIJai0AAEEDaw4bBgsAAQILCAgJBAULCwsJCwsLBwMLAwsLCwsDCwsCQCAFDQBBASEAIAIgBEwNACADIARBBHRqIgVBAToADCAFIAE2AgALIAZBAmohAQwKCwJAIAUNAEEBIQAgAiAETA0AIAMgBEEEdGoiBUEBOgAMIAUgATYCAAsgBkEDaiEBDAkLAkAgBQ0AQQEhACACIARMDQAgAyAEQQR0aiIFQQE6AAwgBSABNgIACyAGQQRqIQEMCAsgBQ0HQQEhACACIARMDQcgAyAEQQR0aiIFQQE6AAwgBSABNgIADAcLIAVBAkcEQEEMIQdBAiEAIAIgBEwNByADIARBBHRqIAZBAmo2AgQMBwtBAiEAIAdBDEcNBiACIARKBEAgAyAEQQR0aiABNgIICyAEQQFqIQRBDCEHQQAhAAwGCyAFQQJHBEBBDSEHQQIhACACIARMDQYgAyAEQQR0aiAGQQJqNgIEDAYLQQIhACAHQQ1HDQUgAiAESgRAIAMgBEEEdGogATYCCAsgBEEBaiEEQQ0hB0EAIQAMBQsgAiAETA0EIAMgBEEEdGpBADoADAwDC0EAIQACQCAFQQFrDgIEAAMLQQIhACACIARMDQMgAyAEQQR0aiIFLQAMRQ0DAkAgCUEgRw0AIAEgBSgCBEYNACAGLQACIgZBIEYNACAHIAYgCGotAABHDQQLIAVBADoADAwDC0EAIQACQCAFQQFrDgIDAAILQQIhACACIARMDQIgAyAEQQR0akEAOgAMDAILQQIhACAFQQJGDQEgBA8LIAUhAAwACwALOwEBfyAAQcgAaiEAA0AgACABLQAAai0AACICQRVLQQEgAnRBgIyAAXFFckUEQCABQQFqIQEMAQsLIAELVAECfyAAQcgAaiEDIAEhAANAIAMgAC0AAGotAABBBWtB/wFxIgJBGU9Bh4D4CyACdkEBcUVyRQRAIAAgAkECdEGIpQhqKAIAaiEADAELCyAAIAFrC0UBAX8CQANAIAMtAAAiBARAQQAhACACIAFrQQBMDQIgAS0AACAERw0CIANBAWohAyABQQFqIQEMAQsLIAEgAkYhAAsgAAueAgEEfyABIAJPBEBBfA8LIAIgAWtBAEwEQEF/DwsgAEHIAGohBiABIQQCQANAIAIgBGtBAEwNAUECIQUCQAJAAkACQAJAAkACQAJAAkAgBiAELQAAai0AACIHQQNrDggCBgcAAQYEAwULQQMhBQwGC0EEIQUMBQsgASAERw0HIAAgAUEBaiACIAMQ8QQPCyABIARHDQYgAyABQQFqNgIAQQcPCyABIARHDQUgAiABQQFqIgBrQQBMBEBBfQ8LIAMgAUECaiAAIAYgAS0AAWotAABBCkYbNgIAQQcPCyAHQR5GDQILQQEhBQsgBCAFaiEEDAELCyABIARHDQAgACABQQFqIAIgAxDHCSIAQQAgAEEWRxsPCyADIAQ2AgBBBgufAgEDfyABIAJPBEBBfA8LIAIgAWtBAEwEQEF/DwsgAEHIAGohBiABIQQDQAJAIAIgBGtBAEwNAEECIQUCQAJAAkACQAJAAkACQAJAAkAgBiAELQAAai0AAEECaw4UAwIHCAABBwUEBwcHBwcHBwcHBwYHC0EDIQUMBwtBBCEFDAYLIAEgBEcNBiAAIAFBAWogAiADEPEEDwsgAyAENgIAQQAPCyABIARHDQQgAyABQQFqNgIAQQcPCyABIARHDQMgAiABQQFqIgBrQQBMBEBBfQ8LIAMgAUECaiAAIAYgAS0AAWotAABBCkYbNgIAQQcPCyABIARHDQIgAyABQQFqNgIAQScPC0EBIQULIAQgBWohBAwBCwsgAyAENgIAQQYL2QIBBH8gAEHIAGohBwJAA0AgAiABIgRrIgFBAEwNAQJAAkACQAJAAkACQAJAAkACQCAHIAQtAABqLQAADgkFBQMHBAABAgUHCyABQQFGDQcgACAEIAAoAuACEQAADQQgBEECaiEBDAgLIAFBA0kNBiAAIAQgACgC5AIRAAANAyAEQQNqIQEMBwsgAUEESQ0FIAAgBCAAKALoAhEAAA0CIARBBGohAQwGCyACIARBAWoiAWtBAEwNBiABLQAAQSFHDQUgAiAEQQJqIgFrQQBMDQYgAS0AAEHbAEcNBSAEQQNqIQEgBUEBaiEFDAULIAIgBEEBaiIBa0EATA0FIAEtAABB3QBHDQQgAiAEQQJqIgFrQQBMDQUgAS0AAEE+Rw0EIARBA2ohASAFDQFBKiEGIAEhBAsgAyAENgIAIAYPCyAFQQFrIQUMAgsgBEEBaiEBDAELC0F+DwtBfwvhAwEEfyABIAJPBEBBfA8LAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkAgAEHIAGoiByABLQAAai0AAA4LCgoGBgADBAUKAQIGC0F/IQUgAiABQQFqIgRrQQBMDQogBC0AAEHdAEcNBiACIAFBAmprQQBMDQogAS0AAkE+Rw0GIAFBA2ohAUEoIQUMCQsgAiABQQFqIgBrQQBKDQZBfw8LIAFBAWoMBgsgAiABa0ECSA0IIAAgASAAKALgAhEAAA0GIAFBAmohBAwDCyACIAFrQQNIDQcgACABIAAoAuQCEQAADQUgAUEDaiEEDAILIAIgAWtBBEgNBiAAIAEgACgC6AIRAAANBCABQQRqIQQMAQsgAUEBaiEECyAEIQEDQEEGIQUgAiABayIGQQBMDQNBASEEAkACQAJAAkAgByABLQAAai0AAA4LBwcDAwcAAQIHBwcDCyAGQQFGDQYgACABIAAoAuACEQAADQZBAiEEDAILIAZBA0kNBSAAIAEgACgC5AIRAAANBUEDIQQMAQsgBkEESQ0EIAAgASAAKALoAhEAAA0EQQQhBAsgASAEaiEBDAALAAsgAUECaiAAIAcgAS0AAWotAABBCkYbCyEBQQchBQsgAyABNgIACyAFDwtBfguOHAEHfyMAQRBrIgkkAAJAIAEgAk8EQEF8IQYMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQcgAaiIIIAEtAABqLQAADgsFBQALBwQDAgUKCQELQQEhB0F/IQYgAiABQQFqIgRrIgVBAEwNEQJAAkACQAJAIAggBC0AAGotAABBBWsOFAABAhQUFBQUFBQQAw8UFBQUEhQSFAsgBUEBRg0SIAAgBCAAKALgAhEAAA0TIAAgBCAAKALUAhEAAEUNE0ECIQcMEQsgBUEDSQ0RIAAgBCAAKALkAhEAAA0SIAAgBCAAKALYAhEAAEUNEkEDIQcMEAsgBUEESQ0QIAAgBCAAKALoAhEAAA0RIAAgBCAAKALcAhEAAEUNEUEEIQcMDwsgAiABQQJqIgRrQQBMDRIgCCABLQACai0AACIGQRRHBEAgBkEbRw0OIAAgAUEDaiACIAMQyQkhBgwTC0F/IQYgAiABQQNqIgBrQQZIDRIgAUEJaiECQQAhAQNAAkAgAUEGRgR/QQgFIAAtAAAgAUHAkAhqLQAARg0BIAAhAkEACyEGIAMgAjYCAAwUCyAAQQFqIQAgAUEBaiEBDAALAAsgAUEBaiEEDAYLIAIgAWtBBEgNDSAAIAEgACgC6AIRAAANAiABQQRqIQQMBQsgAiABa0EDSA0MIAAgASAAKALkAhEAAA0BIAFBA2ohBAwECyACIAFrQQJIDQsgACABIAAoAuACEQAARQ0BCyADIAE2AgAMDQsgAUECaiEEDAELQXshBiACIAFBAWoiBGtBAEwNCyAELQAAQd0ARw0AIAIgAUECaiIHa0EATA0LIAEtAAJBPkcNACADIAc2AgBBACEGDAsLA0ACQCACIAQiAWsiBkEATA0AAkACQAJAAkACQCAIIAEtAABqLQAADgsFBQUFAwABAgUFBQQLIAZBAUYNBCAAIAEgACgC4AIRAAANBCABQQJqIQQMBQsgBkEDSQ0DIAAgASAAKALkAhEAAA0DIAFBA2ohBAwECyAGQQRJDQIgACABIAAoAugCEQAADQIgAUEEaiEEDAMLIAZBAUYNASABQQFqIQQgAS0AAUHdAEcNAiAGQQNJDQEgAS0AAkE+Rw0CIAMgAUECajYCAEEAIQYMDQsgAUEBaiEEDAELCyADIAE2AgBBBiEGDAoLIAMgAUEBajYCAEEHIQYMCQsgAiABQQFqIgBrQQBMBEBBfSEGDAkLIAMgAUECaiAAIAggAS0AAWotAABBCkYbNgIAQQchBgwICyAAIAFBAWogAiADEPEEIQYMBwtBASEEIAIgAUECaiIBayIHQQBMDQVBACEGAkACQAJAAkACQAJAIAggAS0AAGotAAAiBUEFaw4DAQIDAAsgBUEWaw4DAwQDBAsgB0EBRg0HIAAgASAAKALgAhEAAA0DIAAgASAAKALUAhEAAEUNA0ECIQQMAgsgB0EDSQ0GIAAgASAAKALkAhEAAA0CIAAgASAAKALYAhEAAEUNAkEDIQQMAQsgB0EESQ0FIAAgASAAKALoAhEAAA0BIAAgASAAKALcAhEAAEUNAUEEIQQLIAEgBGohAQNAIAIgAWsiB0EATA0HQQEhBAJAAn8CQAJAAkACQAJAAkAgCCABLQAAai0AAEEFaw4XAAECCQMDBAkJCQkJCQkJCQMHBwcHBwcJCyAHQQFGDQwgACABIAAoAuACEQAADQggACABIAAoAsgCEQAARQ0IQQIhBAwGCyAHQQNJDQsgACABIAAoAuQCEQAADQcgACABIAAoAswCEQAARQ0HQQMhBAwFCyAHQQRJDQogACABIAAoAugCEQAADQYgACABIAAoAtACEQAARQ0GQQQhBAwECwNAIAIgASIAQQFqIgFrQQBMDQwCQCAIIAEtAABqLQAAIgRBCWsOAwEBAwALIARBFUYNAAsMBQsgAUEBagwBCyAAQQJqCyEBQQUhBgwCCyABIARqIQEMAAsACyADIAE2AgAMBgsgACABQQJqIAIgAxDICSEGDAULIAMgBDYCAEEAIQYMBAsgBCAHaiEBQQAhBwNAIAIgAWsiBUEATA0EQQEhBAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAIIAEtAABqLQAAQQVrDhcAAQIHBAQFBwcHBwcGBwcHBAsDCwsLCwcLIAVBAUYNDCAAIAEgACgC4AIRAAANBiAAIAEgACgCyAIRAABFDQZBAiEEDAoLIAVBA0kNCyAAIAEgACgC5AIRAAANBSAAIAEgACgCzAIRAABFDQUMCAsgBUEESQ0KIAAgASAAKALoAhEAAA0EIAAgASAAKALQAhEAAEUNBAwGCyAHDQMgAiABQQFqIgVrIgRBAEwNDEEBIQcCQAJAAkACQCAIIAUtAABqLQAAIgpBBWsOAwECAwALQQIhBAJAIApBFmsOAwsICwALDAcLIARBAUYNCyAAIAUgACgC4AIRAAANBiAAIAUgACgC1AIRAAANCAwGCyAEQQNJDQogACAFIAAoAuQCEQAADQUgACAFIAAoAtgCEQAADQYMBQsgBEEESQ0JIAAgBSAAKALoAhEAAA0EIAAgBSAAKALcAhEAAEUNBEEFIQQMBwsCQAJAAkADQCACIAEiBEEBaiIBayIFQQBMDQ9BAiEHAkAgCCABLQAAai0AAEEFaw4UAAIDBwEBBQcHBwcHBgcHBwEEBwQHCwsgBUEBRg0LIAAgASAAKALgAhEAAA0FIAAgASAAKALUAhEAAEUNBUEDIQcMAgsgBUEDSQ0KIAAgASAAKALkAhEAAA0EIAAgASAAKALYAhEAAEUNBEEEIQcMAQsgBUEESQ0JIAAgASAAKALoAhEAAA0DIAAgASAAKALcAhEAAEUNA0EFIQcLIAQgB2ohBEEAIQUCQAJAA0AgCSAENgIMQX8hBiACIARrIgpBAEwNDkEAIQcCQAJAAkACQAJAAkACQAJAAkAgCCAEIgEtAABqLQAAQQVrDhcBAgMLBwcLCwsICwsLCwsLBwAEAAAAAAsLIARBAWohBAwICyAKQQFGDRIgACAEIAAoAuACEQAADQMgACAEIAAoAsgCEQAARQ0DIARBAmohBAwHCyAKQQNJDREgACAEIAAoAuQCEQAADQIgACAEIAAoAswCEQAARQ0CIARBA2ohBAwGCyAKQQRJDRAgACAEIAAoAugCEQAADQEgACAEIAAoAtACEQAARQ0BIARBBGohBAwFCyAFRQ0BCwwFCyAJIARBAWoiATYCDCACIAFrIgVBAEwNEAJAAkACQAJAIAggAS0AAGotAAAiBkEFaw4DAQIDAAsCQCAGQRZrDgMACAAICyAEQQJqIQRBASEFDAULIAVBAUYNDyAAIAEgACgC4AIRAAANBiAAIAEgACgC1AIRAABFDQYgBEEDaiEEQQEhBQwECyAFQQNJDQ4gACABIAAoAuQCEQAADQUgACABIAAoAtgCEQAARQ0FIARBBGohBEEBIQUMAwsgBUEESQ0NIAAgASAAKALoAhEAAA0EIAAgASAAKALcAhEAAEUNBCAEQQVqIQRBASEFDAILA0AgAiABQQFqIgFrQQBMDRACQAJAIAggAS0AAGotAAAiBEEJaw4GAgIGBgYBAAsgBEEVRg0BDAULCyAJIAE2AgwgASEECwNAIAIgBEEBaiIBa0EATA0PIAggAS0AAGotAAAiBUH+AXFBDEcEQCAFQRVLDQQgASEEQQEgBXRBgIyAAXENAQwECwsgBEECaiEBA0AgCSABNgIMAkACQANAIAIgAWsiBEEATA0SIAggAS0AAGotAAAiCiAFRg0CAkACQAJAAkAgCg4JCgoKAwUAAQIKBQsgBEEBRg0SIAAgASAAKALgAhEAAA0JIAFBAmohAQwGCyAEQQNJDREgACABIAAoAuQCEQAADQggAUEDaiEBDAULIARBBEkNECAAIAEgACgC6AIRAAANByABQQRqIQEMBAsgACABQQFqIAIgCUEMahDxBCIBQQBKBEAgCSgCDCEBDAELCyABIgYNESAJKAIMIQEMBQsgAUEBaiEBDAELCyAJIAFBAWoiBTYCDCACIAVrQQBMDQ4gASEEAkACQAJAIAggBSIBLQAAai0AACIFQQlrDgkBAQIFBQUFBQQACyAFQRVGDQAMBAsCQAJAAkADQCACIAEiBEEBaiIBayIFQQBMDRMCQCAIIAEtAABqLQAAQQVrDhQCAwQIAQEFCAgICAgHCAgIAQAIAAgLCyAEQQJqIQRBACEFDAQLIAVBAUYNDiAAIAEgACgC4AIRAAANBSAAIAEgACgC1AIRAABFDQUgBEEDaiEEQQAhBQwDCyAFQQNJDQ0gACABIAAoAuQCEQAADQQgACABIAAoAtgCEQAARQ0EIARBBGohBEEAIQUMAgsgBUEESQ0MIAAgASAAKALoAhEAAA0DIAAgASAAKALcAhEAAEUNAyAEQQVqIQRBACEFDAELCyAEQQJqIQFBASEHDAELIAkgAUEBaiIANgIMIAIgAGtBAEwNDCABQQJqIAAgAS0AAUE+RiIAGyEBQQNBACAAGyEHCyADIAE2AgAgByEGDAsLIAMgAUEBajYCAEECIQYMCgsgAiABQQFqIgBrQQBMDQkgAS0AAUE+RwRAIAMgADYCAEEAIQYMCgsgAyABQQJqNgIAQQQhBgwJCyADIAE2AgBBACEGDAgLIAMgBTYCAEEAIQYMBwtBBCEEDAELQQMhBAsgASAEaiEBDAALAAtBfiEGDAILIAMgBDYCAEEAIQYMAQtBfyEGCyAJQRBqJAAgBgsCAAuhEQEFfyABIAJPBEBBfA8LQQEhBEESIQUCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABByABqIgcgAS0AAGotAABBAmsOIwIXCA4PEBcDBAwAARcXFxcXDQcEFRMVExMTFxcFCQoXFwYLFwtBDCAAIAFBAWogAiADEMoJDwtBDSAAIAFBAWogAiADEMoJDwtBfyEFIAIgAUEBaiIGa0EATA0TAkACQAJAAkACQCAHIAEtAAFqLQAAIgRBD2sOCgMCBAQEBAQBBAEACyAEQQVrQQNJDQAgBEEdRw0DCyADIAE2AgBBHQ8LIAIgAUECaiIEa0EATA0VAkACQAJAAkAgByAELQAAai0AAEEUaw4IAQMCAwIDAwADCyAAIAFBA2ogAiADEMkJDwsgAyABQQNqNgIAQSEPCwJAA0AgAiAEIgBBAWoiBGsiAUEATA0YAkAgByAELQAAai0AACIGQRVrDgoeAQMBAwMDAwMAAgsLIAFBAUYNFyAHIAAtAAJqLQAAIgBBHksNHEEBIAB0QYCMgIEEcQ0BDBwLIAZBCWtBAkkNGwsgAyAENgIADBsLIAAgAUECaiACIAMQyAkPCyADIAY2AgAMGQsgAUEBaiACRw0AIAMgAjYCAEFxDwsDQAJAIAIgASIAQQFqIgFrQQBMDQACQAJAIAcgAS0AAGotAAAiBEEJaw4CAQMACyAEQRVGDQIMAQsgAEECaiACRw0BCwsgAyABNgIAQQ8PCyAAIAFBAWogAiADEMcJDwsgAyABQQFqNgIAQSYPCyADIAFBAWo2AgBBGQ8LIAIgAUEBaiIAayICQQBMBEBBZg8LAkAgAS0AAUHdAEcNACACQQFGDRIgAS0AAkE+Rw0AIAMgAUEDajYCAEEiDwsgAyAANgIAQRoPCyADIAFBAWo2AgBBFw8LIAIgAUEBaiIAa0EATARAQWgPCwJAAkACQAJAAkACQCAHIAEtAAFqLQAAIgJBIGsOBRQBAxQUAAsgAkEJaw4HExMTBAQEAQMLIAMgAUECajYCAEEkDwsgAyABQQJqNgIAQSMPCyADIAFBAmo2AgBBJQ8LIAJBFUYNDwsgAyAANgIADBELIAMgAUEBajYCAEEVDwsgAyABQQFqNgIAQREPCyACIAFBAWoiAWsiBkEATA0MQQAhBQJAAkACQAJAAkACQCAHIAEtAABqLQAAIghBBWsOAwECAwALIAhBFmsOAwMEAwQLIAZBAUYNDiAAIAEgACgC4AIRAAANAyAAIAEgACgC1AIRAABFDQNBAiEEDAILIAZBA0kNDSAAIAEgACgC5AIRAAANAiAAIAEgACgC2AIRAABFDQJBAyEEDAELIAZBBEkNDCAAIAEgACgC6AIRAAANASAAIAEgACgC3AIRAABFDQFBBCEECyABIARqIQEDQCACIAFrIgZBAEwEQEFsDwtBASEEQRQhBQJAAkACQAJAAkAgByABLQAAai0AAEEFaw4gAAECBAYGBgQEBAQEBAQEBAYDBAMDAwMEBAYEBgQEBAYECyAGQQFGDRAgACABIAAoAuACEQAADQMgACABIAAoAsgCEQAARQ0DQQIhBAwCCyAGQQNJDQ8gACABIAAoAuQCEQAADQIgACABIAAoAswCEQAARQ0CQQMhBAwBCyAGQQRJDQ4gACABIAAoAugCEQAADQEgACABIAAoAtACEQAARQ0BQQQhBAsgASAEaiEBDAELC0EAIQULIAMgATYCACAFDwsgAiABa0ECSA0JIAAgASAAKALgAhEAAA0IQQIhBCAAIAEgACgC1AIRAAANAiAAIAEgACgCyAIRAABFDQgMBQsgAiABa0EDSA0IIAAgASAAKALkAhEAAA0HQQMhBCAAIAEgACgC2AIRAAANASAAIAEgACgCzAIRAABFDQcMBAsgAiABa0EESA0HIAAgASAAKALoAhEAAA0GQQQhBCAAIAEgACgC3AIRAABFDQELDAMLIAAgASAAKALQAhEAAEUNBAwBC0ETIQUMAQtBEyEFCyABIARqIQQCQAJAAkACQANAIAIgBCIBayIEQQBMDQQCQAJAAkACQAJAAkACQCAHIAEtAABqLQAAQQVrDiABAgMKBAQECgoKCQoKCgoEBAAFAAAAAAoKBAoECAYEBAoLIAFBAWohBAwGCyAEQQFGDQwgACABIAAoAuACEQAADQggACABIAAoAsgCEQAARQ0IIAFBAmohBAwFCyAEQQNJDQsgACABIAAoAuQCEQAADQcgACABIAAoAswCEQAARQ0HIAFBA2ohBAwECyAEQQRJDQogACABIAAoAugCEQAADQYgACABIAAoAtACEQAARQ0GIAFBBGohBAwDCyADIAE2AgAgBQ8LIAFBAWohBCAFQSlHBEAgBUESRw0CIAIgBGsiBkEATA0LQRMhBQJAAkACQAJAAkACQAJAIAcgBC0AAGotAAAiCEEWaw4IAQkBAQEBCQUACyAIQQVrDgMBAgMICyABQQJqIQRBKSEFDAcLIAZBAUYNDSAAIAQgACgC4AIRAAANAiAAIAQgACgCyAIRAABFDQIgAUEDaiEEQSkhBQwGCyAGQQNJDQwgACAEIAAoAuQCEQAADQEgACAEIAAoAswCEQAARQ0BIAFBBGohBEEpIQUMBQsgBkEESQ0LIAAgBCAAKALoAhEAAA0AIAAgBCAAKALQAhEAAA0BCyADIAQ2AgAMDgsgAUEFaiEEQSkhBQwCC0ETIQUMAQsLIAVBE0YNAiADIAFBAWo2AgBBIA8LIAVBE0YNASADIAFBAWo2AgBBHw8LIAVBE0YNACADIAFBAWo2AgBBHg8LIAMgATYCAAwHC0EAIAVrIQULIAUPCyADIAE2AgAMBAtBfg8LIAMgADYCAEEYDwtBfw8LIAMgBDYCAEEQDwtBAAsPACAAIAEgAkHQlggQpQoLEwBB0JYIIABBACABIAIgAxDyBAsTAEHQlgggAEEBIAEgAiADEPIECw4AIAKnQQAgAkIBg1AbCw8AIAAgASACQeCHCBClCgsTAEHghwggAEEAIAEgAiADEPIECxMAQeCHCCAAQQEgASACIAMQ8gQLDwBB6IoIIAEgAiADENAJCxsAIAKnIgFBAXFFBEAgACgCCCABQQAQjAEaCwvQAQEGfyMAQRBrIggkACAAQcgAaiEJIABB9AZqIQoCfwNAQQAgAiABKAIAIgVGDQEaAkAgAQJ/IAogBS0AAEECdGoiBiwAACIHRQRAIAAoAvACIAUgACgC7AIRAAAgCEEMaiIGEJMEIgcgBCADKAIAa0oNAiABKAIAIgUgCSAFLQAAai0AAGpBA2sMAQsgBCADKAIAayAHSA0BIAZBAWohBiAFQQFqCzYCACADKAIAIAYgBxAfGiADIAMoAgAgB2o2AgAMAQsLQQILIAhBEGokAAujAQEEfyAAQcgAaiEHIABB9AJqIQgCQANAIAEoAgAiBSACTw0BIAQgAygCACIGSwRAIAECfyAIIAUtAABBAXRqLwEAIgZFBEAgACgC8AIgBSAAKALsAhEAACEGIAEoAgAiBSAHIAUtAABqLQAAakEDawwBCyAFQQFqCzYCACADIAMoAgAiBUECajYCACAFIAY7AQAMAQsLIAQgBkcNAEECDwtBAAsNACAAIAFBoIIIEJoKCw0AIAAgAUGggAgQmgoLLgEBf0EBIQIgACgC8AIgASAAKALsAhEAACIAQf//A00EfyAAEJIEQR92BUEBCwtuAAJAAkAgAgRAIAAoAgghAAJ/IAQEQCAAIAIQrAEMAQsgACACEIcKCyIAQQFxDQIgAyAArTcDAAwBCyADIAApAwBCAYZCAYQ3AwAgACAAKQMAQgF8NwMAC0EBDwtBlLQDQb6+AUE7QdDbABAAAAugAgIHfAJ/AkAgASsDCCIEIAErAwAiA6MiAkQAVUQTDm/uP2QEQCAERABVRBMOb+4/oyEDDAELIAJEAFVEEw5v7j9jRQ0AIANEAFVEEw5v7j+iIQQLIANE/1REEw5v/j+jIgVEYC2gkSFyyD+iRAAAAAAAAOC/oiEGIAVE/1REEw5v7j+iRFDpLzfvxtM/okSv19yLGJ/oP6MhB0Tg8Jx2LxvUPyECA0AgCUEJS0UEQCAAIAlBBHRqIgogBSACEEqiOQMAIAogByACRODwnHYvG+Q/oCIIEEqiOQMQIAogBSACEFeiIAagOQMIIAogByAIEFeiIAagOQMYIAlBAmohCSAIRODwnHYvG+Q/oCECDAELCyABIAQ5AwggASADOQMAC2cBAXwgACABKwMARP9URBMOb/4/oyABKwMIRKj0l5t34/E/oxAjRP9URBMOb+4/okSo9Jebd+PpP6JEXlp1BCPP0j+jIgJEVPrLzbvx/D+iOQMIIAAgAiACoET/VEQTDm/uP6I5AwALQwEBfyMAQRBrIgEkAEEBQRAQTiICRQRAIAFBEDYCAEGI9ggoAgBB9ekDIAEQIBoQLwALIAIgADYCCCABQRBqJAAgAgv4AwIIfwZ8IwBBIGsiAyQAAkAgAEUNACAAKAIEIQIgACgCACIFEC0oAhAoAnQhBiADIAEpAwg3AwggAyABKQMANwMAIANBEGogAyAGQQNxQdoAbBCbAyADKwMYIQsgAysDECEMIAIEQCACKwMAIAxlRQ0BIAwgAisDEGVFDQEgAisDCCALZSALIAIrAxhlcSEEDAELAkAgACgCCCAFRwRAIAAgBSgCECgCDCIBNgIYIAEoAgghAiABKAIsIQZBACEBIAVBvNwKKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwhCgJAIAAoAhgoAgQiBEUgCkQAAAAAAAAAAGRFckUEQCACIARsIQEMAQsgBEUNACAEQQFrIAJsIQELIAAgBTYCCCAAIAE2AiAMAQsgACgCGCIBKAIIIQIgASgCLCEGC0EAIQVBACEBA0AgASACTyIEDQEgACgCICIHIAFqIQggAUEEaiEJIAFBAmohASAFIAsgBiAJIAJwIAdqQQR0aiIHKwMAIAYgCEEEdGoiCCsDACINoSIKoiAHKwMIIAgrAwgiD6EiDiAMoqEgDyAKoiAOIA2ioSINoUQAAAAAAAAAAGYgCkQAAAAAAAAAAKIgDkQAAAAAAAAAAKKhIA2hRAAAAAAAAAAAZnNqIgVBAkcNAAsLIANBIGokACAEC6wCAgZ/BHwjAEEgayIEJAAgASgCECIFKAIMIQICQAJAAkAgACgCECIDKALYASIGRQRAIAJFDQMgAy0AjAJBAXENAQwCCyACRQ0CC0EBIQcgAC0AmAFBBHENACAAIAYgAygC7AEgAygC/AEgAygC3AEQxAEgASgCECEFCyAAKAIkIAIrAwghCCAFKwMQIQkgAisDECEKIAUrAxghCyAEIAIoAgA2AhAgBCALIAqgOQMIIAQgCSAIoDkDAEGhwAQgBBAzIAEoAhAiAigCeCIFIAIpAxA3AzggBUFAayACKQMYNwMAIABBCiABKAIQKAJ4EJADIAdFDQAgAC0AmAFBBHEEQCAAIAMoAtgBIAMoAuwBIAMoAvwBIAMoAtwBEMQBCyAAEJcCCyAEQSBqJAALmwECAn8CfCMAQSBrIgIkACAAKAIAIgAQLSgCECgCdCEDIAIgASkDCDcDCCACIAEpAwA3AwAgAkEQaiACIANBA3FB2gBsEJsDQQAhAQJAIAIrAxgiBCAAKAIQIgArA1BEAAAAAAAA4D+iIgWaZkUgBCAFZUVyDQAgAisDECIEIAArA1iaZkUNACAEIAArA2BlIQELIAJBIGokACABC40FAgZ/AnwjAEGgAWsiAiQAQQEhBiAAKAIQIgQoAtgBIgVFBEAgBC0AjAJBAXEhBgsgAiABKAIQIgMoAgwiBykDKDcDmAEgAiAHKQMgNwOQASACIAcpAxg3A4gBIAIgBykDEDcDgAEgAiADKwMQIgggAisDgAGgOQOAASACIAMrAxgiCSACKwOIAaA5A4gBIAIgCCACKwOQAaA5A5ABIAIgCSACKwOYAaA5A5gBAkAgBkUNACAALQCYAUEEcQ0AIAAgBSAEKALsASAEKAL8ASAEKALcARDEAQsgAkE8aiAAIAEQ3QkgACABEPQEGiACQgA3AzACf0EAIAIoAjwiBUEBcUUNABogARDFBiIDIAJBMGogAkFAaxCLBARAIAAgAigCMBBdIAAgAigCNCIDQYX1ACADGyABQcDcCigCAEEAQQAQYiACKwNAEI4DQQNBAiAFQQJxGwwBCyAAIAMQXUEBCyEDIAEoAhAoAggoAgBBw6IBED4EQCACIAVBBHIiBTYCPAsCQCAFQYzgH3EEQCACIAIpA4ABNwNAIAIgAikDiAE3A0ggAiACKQOYATcDaCACIAIpA5ABNwNgIAIgAisDSDkDWCACIAIrA0A5A3AgAiACKAI8NgIsIAIgAisDYDkDUCACIAIrA2g5A3ggACACQUBrQQQgAkEsaiADEJYDDAELIAIgAikDmAE3AyAgAiACKQOQATcDGCACIAIpA4gBNwMQIAIgAikDgAE3AwggACACQQhqIAMQiAILIAAgASAHENcJIAIoAjAQGCACKAI0EBggBgRAIAAtAJgBQQRxBEAgACAEKALYASAEKALsASAEKAL8ASAEKALcARDEAQsgABCXAgsgAkGgAWokAAvyAwIEfwV8IwBB0ABrIgUkACABLQAcQQFGBEAgASsDACEJIAAoAhAoAgwhBkEAIQEDQAJAIAEgBigCME4NACAAEC0hBwJAIAYoAjggAUECdGooAgAiCEEYQRAgBygCEC0AdEEBcSIHG2orAwAiCiAJZUUNACAJIAhBKEEgIAcbaisDACILZUUNAAJAIAAQLSgCEC0AdEEBcQRAIAAoAhAhByAFIAYoAjggAUECdGooAgAiASkDKDcDKCAFIAEpAyA3AyAgBSABKQMYNwMYIAUgASkDEDcDECAFIAcpAxg3AwggBSAHKQMQNwMAIAUrAxghCiAFKwMQIQsgBSsDACEJIAUrAyghDCAFIAUrAyAgBSsDCCINoDkDSCAFIAwgCaA5A0AgBSALIA2gOQM4IAUgCiAJoDkDMCADIAUpA0g3AxggAyAFQUBrKQMANwMQIAMgBSkDODcDCCADIAUpAzA3AwAgACgCECIAKwNQRAAAAAAAAOA/oiEKIAArAxghCQwBCyADIAogACgCECIAKwMQIgqgOQMAIAArAxghCSAAKwNQIQwgAyALIAqgOQMQIAMgCSAMRAAAAAAAAOA/oiIKoTkDCAsgAyAJIAqgOQMYIARBATYCAAwBCyABQQFqIQEMAQsLIAIhBgsgBUHQAGokACAGC6YCAgV/BXwjAEEgayIDJAAgACgCBCECIAAoAgAiBBAtKAIQKAJ0IQAgAyABKQMINwMIIAMgASkDADcDACADQRBqIAMgAEEDcUHaAGwQmwMgASADKQMYNwMIIAEgAykDEDcDAAJAIAJFBEAgBCgCECgCDCICQShqIQAgAkEgaiEFIAJBGGohBiACQRBqIQIMAQsgAkEYaiEAIAJBEGohBSACQQhqIQYLIAYrAwAhCSAAKwMAIQogBSsDACEHQQAhACACKwMAIARBvNwKKAIARAAAAAAAAPA/RAAAAAAAAAAAEExEAAAAAAAA4D+iIgihIAErAwAiC2VFIAsgByAIoGVFckUEQCABKwMIIgcgCSAIoWYgByAKIAigZXEhAAsgA0EgaiQAIAALuAEBA38jAEFAaiIEJAACQCACLQAARQRAIABB0PIHQSgQHxoMAQsCQCABKAIQKAIMIgYgAhDYCSIFBEAgASAFQRBqIARBGGogA0HpxQEgAxsiAyAFLQBBQQAQlgRFDQEgARAhIQEgBCADNgIIIAQgAjYCBCAEIAE2AgBB370EIAQQKgwBCyABIAZBEGogBEEYaiACQQ9BABCWBEUNACABIAIQ3wkLIAAgBEEYakEoEB8aCyAEQUBrJAALDQAgACgCECgCDBDGBgsZAQJ+IAApAxAiAiABKQMQIgNWIAIgA1RrC60DAQh8IAErAwghAyAAIAErAwBEAAAAAAAA4D+iIgKaIgU5A2AgACADRAAAAAAAAOA/oiIEIANEAAAAAAAAJkCjIgOhIgY5A2ggAEIANwMwIAAgBDkDSCAAIAQ5AzggACAEOQMoIAAgAjkDECAAIAI5AwAgACAFOQNQIAAgAkQUmE7rNqjhv6IiCDkDQCAAIAJEFJhO6zao4T+iIgk5AyAgACAGOQMIIAAgA0TYz2Ipkq/cv6IgBKAiBzkDWCAAIAc5AxggACAAKQNgNwNwIAAgACkDaDcDeCAAIAU5A4ABIAAgAyAEoTkDiAEgACAAKQOAATcDkAEgACAAKQOIATcDmAEgACACOQPwASAAIAeaIgM5A+gBIAAgAjkD4AEgACAEmiICOQPYASAAIAk5A9ABIAAgAjkDyAEgAEIANwPAASAAIAI5A7gBIAAgCDkDsAEgACADOQOoASAAIAU5A6ABIAAgBpo5A/gBIAAgACkD8AE3A4ACIAAgACkD+AE3A4gCIAAgACkDCDcDmAIgACAAKQMANwOQAiAAIAApAwg3A6gCIAAgACkDADcDoAILKgAgASABKwMIRAAAAAAAAPY/ojkDCCAAIAEpAwA3AwAgACABKQMINwMIC+QEAgx/AXwjAEEwayIDJAACQCAAKAIQIgQoAtgBIgJFBEAgBC0AjAJBAXFFDQELQQEhCSAALQCYAUEEcQ0AIAAgAiAEKALsASAEKAL8ASAEKALcARDEAQsgASgCECgCDCICKAIEIQYgAigCCCEKIAIoAiwhDCADQQA2AiwgASADQSxqENoJGiAAQaCICkGkiAogAygCLEEgcRsQ5QFBvNwKKAIAIgIEQCAAIAEgAkQAAAAAAADwP0QAAAAAAAAAABBMEIcCCwJAIAEoAhAtAIUBIgJBAXEEQCAAQc+QAxBJQYG2ASECIABBgbYBEF0MAQsgAkECcQRAIABBpJIDEElBmOkBIQIgAEGY6QEQXQwBCyACQQhxBEAgAEHajwMQSUHSjwMhAiAAQdKPAxBdDAELIAJBBHEEQCAAQc2SAxBJQZDpASECIABBkOkBEF0MAQsgACABQYX1ABDZCSICEF0gACABEPQEGgsCQCAGDQBBASEGIAItAABFDQAgACACEEkLQQEhCwNAIAUgBkYEQCAJBEAgAC0AmAFBBHEEQCAAIAQoAtgBIAQoAuwBIAQoAvwBIAQoAtwBEMQBCyAAEJcCCyADQTBqJAAPCyADQgA3AxggA0IANwMQIANCADcDCCADQgA3AwAgDCAFIApsQQR0aiENQQAhAgNAIAIgCkYEQCAAIAMgCxCGBCAFQQFqIQVBACELDAILIAJBAU0EQCANIAJBBHQiB2oiCCsDCCEOIAMgB2oiByAIKwMAIAEoAhAiCCsDEKA5AwAgByAOIAgrAxigOQMICyACQQFqIQIMAAsACwALlwICBX8DfCMAQSBrIgIkAAJAIABFDQAgACgCACIEEC0oAhAoAnQhAyACIAEpAwg3AwggAiABKQMANwMAIAJBEGogAiADQQNxQdoAbBCbAyACKwMYIQggAisDECEJAkAgACgCCCAERgRAIAArAxAhBwwBCyAEKAIQKAIMIQZBACEBIARBvNwKKAIARAAAAAAAAPA/RAAAAAAAAAAAEEwhBwJAIAYoAgQiA0UgB0QAAAAAAAAAAGRFckUEQCADQQF0IQEMAQsgA0UNACADQQF0QQJrIQELIAYoAiwgAUEEdGorAxAhByAAIAQ2AgggACAHOQMQCyAJmSAHZCAImSAHZHINACAJIAgQRyAHZSEFCyACQSBqJAAgBQseAEEBQX9BACAAKAIYIgAgASgCGCIBSRsgACABSxsLlgwCEn8FfCMAQdAAayIDJAACQCAAKAIQIgkoAtgBIgJFBEAgCS0AjAJBAXFFDQELQQEhECAALQCYAUEEcQ0AIAAgAiAJKALsASAJKAL8ASAJKALcARDEAQsgASgCECgCDCICKAIEIQogAigCLCERIAIoAggiB0EFakEQEBohBiABKAIQIgIoAngiBSACKQMQNwM4IAVBQGsgAikDGDcDACABKAIQIgIrA1AgAisDKCACKwNYIAIrA2AgAisDICADQcwAaiAAIAEQ3QkgA0IANwNAQQEhAgJ/IAEoAhAtAIUBIgVBAXEEQCAAQc+QAxBJIABBgbYBEF1BACEFQc+QAwwBCyAFQQJxBEAgAEGkkgMQSSAAQZjpARBdQQAhBUGkkgMMAQsgBUEIcQRAIABB2o8DEEkgAEHSjwMQXUEAIQVB2o8DDAELIAVBBHEEQCAAQc2SAxBJIABBkOkBEF1BACEFQc2SAwwBCwJ/IAMoAkwiAkEBcQRAIAEQxQYiBSADQUBrIANBOGoQiwQEQCAAIAMoAkAQXSAAIAMoAkQiBEGF9QAgBBsgAUHA3AooAgBBAEEAEGIgAysDOBCOA0EDQQIgAkECcRsMAgsgACAFEF1BAQwBCyACQcAEcUUEQEEAIQVBAAwBCyABEMUGIQVBAQshAiAAIAEQ9AQLIQtEAAAAAAAAUkCiIRigIRREAAAAAAAAUkCiIAEoAhAoAggiBC0ADEEBRgRAIAQoAgBBnewAED5BAXMhDQsgDSAKIAJFcnJFBEAgAEG7HxBJQQEhCgsgFCAYoyEWoyEVIAZBIGohDCAHQQNJIRIDQCAIIApHBEAgESAHIAhsQQR0aiETQQAhBANAIAQgB0YEQCADKAJMIQQCQCASBEACQCAIIARBgARxRXINACAFENwJRQ0AQQAhAiAAIAYgBRDpCEECSA0AIAMgARAhNgIgQf77AyADQSBqEIABCyAAIAYgAhCGBCADLQBMQQhxRQ0BIAAgARDbCQwBCyAEQcAAcQRAAkAgCA0AIAAgBiAFQQEQpQZBAkgNACADIAEQITYCMEH++wMgA0EwahCAAQsgACAGIAdBABBIDAELIARBgAhxBEAgAEG7HxBJIAAgBiAHIAIQSCAAIAsQSSAAIAxBAhA9DAELIARBjOAfcQRAIAMgAygCTDYCLCAAIAYgByADQSxqIAIQlgMMAQsgACAGIAcgAhBICyAIQQFqIQhBACECDAMFIBMgBEEEdCIOaiIPKwMIIRQgBiAOaiIOIA8rAwAgFqIgASgCECIPKwMQoDkDACAOIBQgFaIgDysDGKA5AwggBEEBaiEEDAELAAsACwsCQAJAIAEoAhAoAggiBC0ADEEBRgRAIAQoAgAiCEGd7AAQPkUNASABQciaARAnIghFDQIgCC0AAA0BDAILIAFBv54BECciCEUNASAILQAARQ0BC0EAIQQCQANAIAQgB0YEQAJAIAJFIA1yQQFxRQ0AIAJBAEchAgwDCwUgESAEQQR0IgtqIgwrAwghFCAGIAtqIgsgDCsDACAWoiABKAIQIgwrAxCgOQMAIAsgFCAVoiAMKwMYoDkDCCAEQQFqIQQMAQsLIAMoAkwhBCAHQQJNBEACQCAKIARBgARxRXINACAFENwJRQ0AQQAhAiAAIAYgBRDpCEECSA0AIAMgARAhNgIAQf77AyADEIABCyAAIAYgAhCGBCADLQBMQQhxRQ0BIAAgARDbCQwBCyAEQcAAcQRAQQEhAiAAIAYgBUEBEKUGQQJOBEAgAyABECE2AhBB/vsDIANBEGoQgAELIAAgBiAHQQAQSAwBCwJAIARBDHEEQCADIAMoAkw2AgwgACAGIAcgA0EMaiACEJYDDAELIAAgBiAHIAIQSAtBASECCyAAIAggBiAHIAJBAEcgAUGg3AooAgBB+pMBEHogAUGk3AooAgBBgLQBEHoQ2AgLIAYQGCADKAJAEBggAygCRBAYIABBCiABKAIQKAJ4EJADIBAEQCAALQCYAUEEcQRAIAAgCSgC2AEgCSgC7AEgCSgC/AEgCSgC3AEQxAELIAAQlwILIANB0ABqJAALwwkCCn8JfCMAQTBrIgUkAAJAIABFDQAgACgCBCECIAAoAgAiBBAtKAIQKAJ0IQMgBSABKQMINwMIIAUgASkDADcDACAFQRBqIAUgA0EDcUHaAGwQmwMgBSsDGCEQIAUrAxAhEiACBEAgAisDACASZUUNASASIAIrAxBlRQ0BIAIrAwggEGUgECACKwMYZXEhBgwBCwJAIAAoAgggBEcEQCAAIAQoAhAoAgwiAjYCGCACKAIIIQEgAigCLCEHAnwgAi0AKUEIcQRAIAVBEGogAhD4CSAFKwMgIAUrAxChIgwgBSsDKCAFKwMYoSINIAQQLSgCECgCdEEBcSICGyERIA0gDCACGyETIA0hDiAMDAELIAQQLSEDIAQoAhAiAisDWCACKwNgoCIMIAIrA1AiDSADKAIQLQB0QQFxIgMbIREgDSAMIAMbIRMgAisDcEQAAAAAAABSQKIhDiACKwMoRAAAAAAAAFJAoiENIAIrAyBEAAAAAAAAUkCiIQwgAisDaEQAAAAAAABSQKILIQ8gACAORAAAAAAAAOA/ojkDQCAAIA9EAAAAAAAA4D+iOQM4IAAgDSANIBGjIBG9UBs5AzAgACAMIAwgE6MgE71QGzkDKEEAIQIgBEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCEMAkAgACgCGCgCBCIDRSAMRAAAAAAAAAAAZEVyRQRAIAEgA2whAgwBCyADRQ0AIANBAWsgAWwhAgsgACAENgIIIAAgAjYCIAwBCyAAKAIYIgIoAgghASACKAIsIQcLIAArAzgiDyASIAArAyiiIgyZYw0AIAArA0AiDiAQIAArAzCiIg2ZYw0AIAFBAk0EQCAMIA+jIA0gDqMQR0QAAAAAAADwP2MhBgwBCyANIAcgACgCHCABcCIEQQFqIgJBACABIAJHGyICIAAoAiAiCGpBBHRqIgMrAwAiECAHIAQgCGpBBHRqIgkrAwAiD6EiEaIgAysDCCISIAkrAwgiDqEiEyAMoqEgDiARoiATIA+ioSIUoUQAAAAAAAAAAGYgEUQAAAAAAAAAAKIgE0QAAAAAAAAAAKKhIBShRAAAAAAAAAAAZnMNACANRAAAAAAAAAAAIBChIhGiRAAAAAAAAAAAIBKhIhMgDKKhIBIgEaIgEyAQoqEiFKFEAAAAAAAAAABmIA4gEaIgEyAPoqEgFKFEAAAAAAAAAABmcyIJRQRAQQEhBiANIA+iIA4gDKKhIA9EAAAAAAAAAACiIA5EAAAAAAAAAACioSIRoUQAAAAAAAAAAGYgDyASoiAOIBCioSARoUQAAAAAAAAAAGZGDQELIAFBAWshCkEBIQYCQANAIAEgBkYNASAGQQFqIQYgDSAHIAgCfyAJRQRAIAIiA0EBaiABcAwBCyAEIApqIAFwIQMgBAsiAmpBBHRqIgsrAAAgByAIIAMiBGpBBHRqIgMrAAAiEKEiD6IgCysACCADKwAIIhKhIg4gDKKhIBIgD6IgDiAQoqEiEKFEAAAAAAAAAABmIA9EAAAAAAAAAACiIA5EAAAAAAAAAACioSAQoUQAAAAAAAAAAGZGDQALIAAgBDYCHEEAIQYMAQsgACAENgIcQQEhBgsgBUEwaiQAIAYL5AIBA38jAEGQAWsiBCQAAkAgAi0AAEUEQCAAQdDyB0EoEB8aDAELIARBDzoAZwJAAkAgASgCECIFKAJ4LQBSQQFGBEACfwJAIAJFDQAgAi0AAEUNAAJAIAEoAhAoAngoAkgiBSgCBEECRg0AIAUoAgAgAhD9CCIFRQ0AIAQgBS0AIzoAZyAFQTBqIQYLIAYMAQtB7KsDQdS9AUGVB0GYHBAAAAsiBg0BIAEoAhAhBQsgBEEYaiIGQQBByAAQOBpBACEDIAUoAggoAghB4IYKRwRAIAQgATYCGCAGIQMLIAFBACAEQegAaiACIAQtAGcgAxCWBEUNASABIAIQ3wkMAQsgASAGIARB6ABqIANB6cUBIAMbIgMgBC0AZ0EAEJYERQ0AIAEQISEBIAQgAzYCCCAEIAI2AgQgBCABNgIAQd+9BCAEECoLIARBADYCjAEgACAEQegAakEoEB8aCyAEQZABaiQACxoAIAAoAhAoAgwiAARAIAAoAiwQGCAAEBgLC6kFAgR8CH9BMBBSIQYgACgCECgCCCgCCCgCBCEKAnwgAEHU2wooAgBE////////739EexSuR+F6hD8QTCAAQdDbCigCAET////////vf0R7FK5H4XqUPxBMIgEQKSICvUL/////////9/8AUiABvUL/////////9/8AUnJFBEAgACgCECIFQpqz5syZs+bUPzcDICAFQpqz5syZs+bUPzcDKETNzMzMzMwMQAwBCyACRGEyVTAqqTM/ECMhASAAKAIQIgUgASACIAJEAAAAAAAAAABkGyIBOQMgIAUgATkDKCABRAAAAAAAAFJAogshA0EBIQtBASAAQYjcCigCACAKQQAQYiIHIAdBAU0bIAdBAEcgAEG83AooAgBEAAAAAAAA8D9EAAAAAAAAAAAQTCIERAAAAAAAAAAAZHEiCmoiBUEBdEEQEBoiCCADRAAAAAAAAOA/oiICOQMYIAggAjkDECAIIAKaIgE5AwggCCABOQMAQQIhCQJAIAdBAkkEQCACIQEMAQsgAiEBA0AgByALRkUEQCAIIAlBBHRqIgwgAUQAAAAAAAAQQKAiAZo5AwggDCACRAAAAAAAABBAoCICmjkDACAMIAI5AxAgDCABOQMYIAtBAWohCyAJQQJqIQkMAQsLIAIgAqAhAwsgCkUgBSAHTXJFBEAgCCAJQQR0aiIFIAREAAAAAAAA4D+iIgQgAaAiATkDGCAFIAQgAqAiAjkDECAFIAGaOQMIIAUgApo5AwALIAZCADcDECAGQQI2AgggBiAHNgIEIAZBATYCACAGIAg2AiwgBkIANwMYIAZCADcDICAAKAIQIgAgAiACoEQAAAAAAABSQKMiATkDcCAAIAE5A2ggACADRAAAAAAAAFJAoyIBOQMoIAAgATkDICAAIAY2AgwLwQMCBH8CfCMAQdAAayIBJAAgABAtKAIQKAJ0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IAMgBBCIBSAFQQhqIgUgBkkNAAwDCwALA0AgAS0ANg0CIAEoAiRBAUYEQCABKAIYQQFGDQMLIAUgASACIAMgBBCIBSAFQQhqIgUgBkkNAAsMAQsgASACNgIUIAEgASgCKEEBajYCKCABKAIkQQFHDQAgASgCGEECRw0AIAFBAToANgsLcAECfyAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCDCEEIABBEGoiBSABIAIgAxCyCgJAIARBAkkNACAFIARBA3RqIQQgAEEYaiEAA0AgACABIAIgAxCyCiABLQA2DQEgAEEIaiIAIARJDQALCwszACAAIAEoAghBABDbAQRAIAEgAiADEO8GDwsgACgCCCIAIAEgAiADIAAoAgAoAhwRBwALGgAgACABKAIIQQAQ2wEEQCABIAIgAxDvBgsLgwUBBn8jAEFAaiIEJAACf0EBIAAgAUEAENsBDQAaQQAgAUUNABojAEEQayIGJAAgBiABKAIAIgNBCGsoAgAiBTYCDCAGIAEgBWo2AgQgBiADQQRrKAIANgIIIAYoAggiA0Ho6AlBABDbASEFIAYoAgQhBwJAIAUEQCAGKAIMIQEjAEFAaiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQejoCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANBuOgJNgIMIAMgATYCCCADQejoCTYCBEEAIQEgA0EUakEAQScQOBogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQOBogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIE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KAIIEPgGIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQ4QoQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahCvCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCgCgseACABQQBOBH9BsKUJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJBpJkJEKAKCx4AIAFBAE4Ef0GkmQkoAgAgAUECdGooAgAFIAELwAsJACAAENcKEBgLNQADQCABIAJGRQRAIAQgASgCACIAIAMgAEGAAUkbOgAAIARBAWohBCABQQRqIQEMAQsLIAELDgAgASACIAFBgAFJG8ALKgADQCABIAJGRQRAIAMgASwAADYCACADQQRqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQbClCRCfCgseACABQf8ATQR/QbClCSgCACABQQJ0aigCAAUgAQsLDwAgACABIAJBpJkJEJ8KCx4AIAFB/wBNBH9BpJkJKAIAIAFBAnRqKAIABSABCws6AANAAkAgAiADRg0AIAIoAgAiAEH/AEsNACAAQQJ0QYC0CWooAgAgAXFFDQAgAkEEaiECDAELCyACCzoAA0ACQCACIANGDQAgAigCACIAQf8ATQRAIABBAnRBgLQJaigCACABcQ0BCyACQQRqIQIMAQsLIAILSQEBfwNAIAEgAkZFBEBBACEAIAMgASgCACIEQf8ATQR/IARBAnRBgLQJaigCAAVBAAs2AgAgA0EEaiEDIAFBBGohAQwBCwsgAQslAEEAIQAgAkH/AE0EfyACQQJ0QYC0CWooAgAgAXFBAEcFQQALCwkAIAAQ3QoQGAvEAQAjAEEQayIDJAACQCAFEKMBRQRAIAAgBSgCCDYCCCAAIAUpAgA3AgAgABClAxoMAQsgBSgCACECIAUoAgQhBSMAQRBrIgQkAAJAAkACQCAFEIwFBEAgACIBIAUQ0wEMAQsgBUH3////A0sNASAEQQhqIAUQ0ANBAWoQzwMgBCgCDBogACAEKAIIIgEQ+gEgACAEKAIMEPkBIAAgBRC/AQsgASACIAVBAWoQ9wIgBEEQaiQADAELEMoBAAsLIANBEGokAAsJACAAIAUQ/wYLhwMBCH8jAEHgA2siACQAIABB3ANqIgYgAxBTIAYQywEhCiAFECUEQCAFQQAQmgUoAgAgCkEtENEBRiELCyACIAsgAEHcA2ogAEHYA2ogAEHUA2ogAEHQA2ogAEHEA2oQVCIMIABBuANqEFQiBiAAQawDahBUIgcgAEGoA2oQ5QogAEEKNgIQIABBCGpBACAAQRBqIgIQfSEIAkACfyAFECUgACgCqANKBEAgBRAlIQkgACgCqAMhDSAHECUgCSANa0EBdGogBhAlaiAAKAKoA2pBAWoMAQsgBxAlIAYQJWogACgCqANqQQJqCyIJQeUASQ0AIAggCUECdBBPEJABIAgoAgAiAg0AEJEBAAsgAiAAQQRqIAAgAygCBCAFEEYgBRBGIAUQJUECdGogCiALIABB2ANqIAAoAtQDIAAoAtADIAwgBiAHIAAoAqgDEOQKIAEgAiAAKAIEIAAoAgAgAyAEEKADIAgQfCAHEHcaIAYQdxogDBA1GiAAQdwDahBQIABB4ANqJAALxwQBC38jAEGgCGsiACQAIAAgBTcDECAAIAY3AxggACAAQbAHaiIHNgKsByAHQeQAQcaFASAAQRBqELQBIQcgAEEKNgKQBCAAQYgEakEAIABBkARqIgkQfSEOIABBCjYCkAQgAEGABGpBACAJEH0hCgJAIAdB5ABPBEAQZiEHIAAgBTcDACAAIAY3AwggAEGsB2ogB0HGhQEgABCmAiIHQX9GDQEgDiAAKAKsBxCQASAKIAdBAnQQTxCQASAKEKcFDQEgCigCACEJCyAAQfwDaiIIIAMQUyAIEMsBIhEgACgCrAciCCAHIAhqIAkQxwIgB0EASgRAIAAoAqwHLQAAQS1GIQ8LIAIgDyAAQfwDaiAAQfgDaiAAQfQDaiAAQfADaiAAQeQDahBUIhAgAEHYA2oQVCIIIABBzANqEFQiCyAAQcgDahDlCiAAQQo2AjAgAEEoakEAIABBMGoiAhB9IQwCfyAAKALIAyINIAdIBEAgCxAlIAcgDWtBAXRqIAgQJWogACgCyANqQQFqDAELIAsQJSAIECVqIAAoAsgDakECagsiDUHlAE8EQCAMIA1BAnQQTxCQASAMKAIAIgJFDQELIAIgAEEkaiAAQSBqIAMoAgQgCSAJIAdBAnRqIBEgDyAAQfgDaiAAKAL0AyAAKALwAyAQIAggCyAAKALIAxDkCiABIAIgACgCJCAAKAIgIAMgBBCgAyAMEHwgCxB3GiAIEHcaIBAQNRogAEH8A2oQUCAKEHwgDhB8IABBoAhqJAAPCxCRAQAL/wIBCH8jAEGwAWsiACQAIABBrAFqIgYgAxBTIAYQzAEhCiAFECUEQCAFQQAQQy0AACAKQS0QmwFB/wFxRiELCyACIAsgAEGsAWogAEGoAWogAEGnAWogAEGmAWogAEGYAWoQVCIMIABBjAFqEFQiBiAAQYABahBUIgcgAEH8AGoQ6AogAEEKNgIQIABBCGpBACAAQRBqIgIQfSEIAkACfyAFECUgACgCfEoEQCAFECUhCSAAKAJ8IQ0gBxAlIAkgDWtBAXRqIAYQJWogACgCfGpBAWoMAQsgBxAlIAYQJWogACgCfGpBAmoLIglB5QBJDQAgCCAJEE8QkAEgCCgCACICDQAQkQEACyACIABBBGogACADKAIEIAUQRiAFEEYgBRAlaiAKIAsgAEGoAWogACwApwEgACwApgEgDCAGIAcgACgCfBDnCiABIAIgACgCBCAAKAIAIAMgBBChAyAIEHwgBxA1GiAGEDUaIAwQNRogAEGsAWoQUCAAQbABaiQAC74EAQt/IwBBwANrIgAkACAAIAU3AxAgACAGNwMYIAAgAEHQAmoiBzYCzAIgB0HkAEHGhQEgAEEQahC0ASEHIABBCjYC4AEgAEHYAWpBACAAQeABaiIJEH0hDiAAQQo2AuABIABB0AFqQQAgCRB9IQoCQCAHQeQATwRAEGYhByAAIAU3AwAgACAGNwMIIABBzAJqIAdBxoUBIAAQpgIiB0F/Rg0BIA4gACgCzAIQkAEgCiAHEE8QkAEgChCnBQ0BIAooAgAhCQsgAEHMAWoiCCADEFMgCBDMASIRIAAoAswCIgggByAIaiAJEPUCIAdBAEoEQCAAKALMAi0AAEEtRiEPCyACIA8gAEHMAWogAEHIAWogAEHHAWogAEHGAWogAEG4AWoQVCIQIABBrAFqEFQiCCAAQaABahBUIgsgAEGcAWoQ6AogAEEKNgIwIABBKGpBACAAQTBqIgIQfSEMAn8gACgCnAEiDSAHSARAIAsQJSAHIA1rQQF0aiAIECVqIAAoApwBakEBagwBCyALECUgCBAlaiAAKAKcAWpBAmoLIg1B5QBPBEAgDCANEE8QkAEgDCgCACICRQ0BCyACIABBJGogAEEgaiADKAIEIAkgByAJaiARIA8gAEHIAWogACwAxwEgACwAxgEgECAIIAsgACgCnAEQ5wogASACIAAoAiQgACgCICADIAQQoQMgDBB8IAsQNRogCBA1GiAQEDUaIABBzAFqEFAgChB8IA4QfCAAQcADaiQADwsQkQEAC7oFAQR/IwBBwANrIgAkACAAIAI2ArgDIAAgATYCvAMgAEGsBDYCFCAAQRhqIABBIGogAEEUaiIHEH0hCiAAQRBqIgEgBBBTIAEQywEhCCAAQQA6AA8gAEG8A2ogAiADIAEgBCgCBCAFIABBD2ogCCAKIAcgAEGwA2oQ7goEQCMAQRBrIgEkACAGECUaAkAgBhCjAQRAIAYoAgAgAUEANgIMIAFBDGoQ3AEgBkEAEL8BDAELIAFBADYCCCAGIAFBCGoQ3AEgBkEAENMBCyABQRBqJAAgAC0AD0EBRgRAIAYgCEEtENEBEPAGCyAIQTAQ0QEhASAKKAIAIQIgACgCFCIDQQRrIQQDQAJAIAIgBE8NACACKAIAIAFHDQAgAkEEaiECDAELCyMAQRBrIggkACAGECUhASAGEPwGIQQCQCACIAMQ7AoiB0UNACAGEEYgBhBGIAYQJUECdGpBBGogAhDHCkUEQCAHIAQgAWtLBEAgBiAEIAEgBGsgB2ogASABEOsKCyAGEEYgAUECdGohBANAIAIgA0cEQCAEIAIQ3AEgAkEEaiECIARBBGohBAwBCwsgCEEANgIEIAQgCEEEahDcASAGIAEgB2oQngMMAQsjAEEQayIEJAAgCEEEaiIBIAIgAxCYCyAEQRBqJAAgARBGIQcgARAlIQIjAEEQayIEJAACQCACIAYQ/AYiCSAGECUiA2tNBEAgAkUNASAGEEYiCSADQQJ0aiAHIAIQ9wIgBiACIANqIgIQngMgBEEANgIMIAkgAkECdGogBEEMahDcAQwBCyAGIAkgAiAJayADaiADIANBACACIAcQtAoLIARBEGokACABEHcaCyAIQRBqJAALIABBvANqIABBuANqEFoEQCAFIAUoAgBBAnI2AgALIAAoArwDIABBEGoQUCAKEHwgAEHAA2okAAvaAwEDfyMAQfAEayIAJAAgACACNgLoBCAAIAE2AuwEIABBrAQ2AhAgAEHIAWogAEHQAWogAEEQaiIBEH0hByAAQcABaiIIIAQQUyAIEMsBIQkgAEEAOgC/AQJAIABB7ARqIAIgAyAIIAQoAgQgBSAAQb8BaiAJIAcgAEHEAWogAEHgBGoQ7gpFDQAgAEHU4wEoAAA2ALcBIABBzeMBKQAANwOwASAJIABBsAFqIABBugFqIABBgAFqEMcCIABBCjYCECAAQQhqQQAgARB9IQMgASEEAkAgACgCxAEgBygCAGsiAUGJA04EQCADIAFBAnVBAmoQTxCQASADKAIARQ0BIAMoAgAhBAsgAC0AvwFBAUYEQCAEQS06AAAgBEEBaiEECyAHKAIAIQIDQCAAKALEASACTQRAAkAgBEEAOgAAIAAgBjYCACAAQRBqQcyFASAAEFFBAUcNACADEHwMBAsFIAQgAEGwAWogAEGAAWoiASABQShqIAIQgwcgAWtBAnVqLQAAOgAAIARBAWohBCACQQRqIQIMAQsLEJEBAAsQkQEACyAAQewEaiAAQegEahBaBEAgBSAFKAIAQQJyNgIACyAAKALsBCAAQcABahBQIAcQfCAAQfAEaiQAC50FAQR/IwBBkAFrIgAkACAAIAI2AogBIAAgATYCjAEgAEGsBDYCFCAAQRhqIABBIGogAEEUaiIIEH0hCiAAQRBqIgEgBBBTIAEQzAEhByAAQQA6AA8gAEGMAWogAiADIAEgBCgCBCAFIABBD2ogByAKIAggAEGEAWoQ9QoEQCMAQRBrIgEkACAGECUaAkAgBhCjAQRAIAYoAgAgAUEAOgAPIAFBD2oQ0gEgBkEAEL8BDAELIAFBADoADiAGIAFBDmoQ0gEgBkEAENMBCyABQRBqJAAgAC0AD0EBRgRAIAYgB0EtEJsBEIkFCyAHQTAQmwEgCigCACECIAAoAhQiB0EBayEDQf8BcSEBA0ACQCACIANPDQAgAi0AACABRw0AIAJBAWohAgwBCwsjAEEQayIDJAAgBhAlIQEgBhBVIQQCQCACIAcQpgsiCEUNACAGEEYgBhBGIAYQJWpBAWogAhDHCkUEQCAIIAQgAWtLBEAgBiAEIAEgBGsgCGogASABEP4GCyAGEEYgAWohBANAIAIgB0cEQCAEIAIQ0gEgAkEBaiECIARBAWohBAwBCwsgA0EAOgAPIAQgA0EPahDSASAGIAEgCGoQngMMAQsgAyACIAcgBhCPByIHEEYhCCAHECUhASMAQRBrIgQkAAJAIAEgBhBVIgkgBhAlIgJrTQRAIAFFDQEgBhBGIgkgAmogCCABEKoCIAYgASACaiIBEJ4DIARBADoADyABIAlqIARBD2oQ0gEMAQsgBiAJIAEgCWsgAmogAiACQQAgASAIELcKCyAEQRBqJAAgBxA1GgsgA0EQaiQACyAAQYwBaiAAQYgBahBbBEAgBSAFKAIAQQJyNgIACyAAKAKMASAAQRBqEFAgChB8IABBkAFqJAAL0AMBA38jAEGQAmsiACQAIAAgAjYCiAIgACABNgKMAiAAQawENgIQIABBmAFqIABBoAFqIABBEGoiARB9IQcgAEGQAWoiCCAEEFMgCBDMASEJIABBADoAjwECQCAAQYwCaiACIAMgCCAEKAIEIAUgAEGPAWogCSAHIABBlAFqIABBhAJqEPUKRQ0AIABB1OMBKAAANgCHASAAQc3jASkAADcDgAEgCSAAQYABaiAAQYoBaiAAQfYAahD1AiAAQQo2AhAgAEEIakEAIAEQfSEDIAEhBAJAIAAoApQBIAcoAgBrIgFB4wBOBEAgAyABQQJqEE8QkAEgAygCAEUNASADKAIAIQQLIAAtAI8BQQFGBEAgBEEtOgAAIARBAWohBAsgBygCACECA0AgACgClAEgAk0EQAJAIARBADoAACAAIAY2AgAgAEEQakHMhQEgABBRQQFHDQAgAxB8DAQLBSAEIABB9gBqIgEgAUEKaiACEIYHIABrIABqLQAKOgAAIARBAWohBCACQQFqIQIMAQsLEJEBAAsQkQEACyAAQYwCaiAAQYgCahBbBEAgBSAFKAIAQQJyNgIACyAAKAKMAiAAQZABahBQIAcQfCAAQZACaiQAC5YDAQR/IwBBoANrIggkACAIIAhBoANqIgM2AgwjAEGQAWsiByQAIAcgB0GEAWo2AhwgAEEIaiAHQSBqIgIgB0EcaiAEIAUgBhD6CiAHQgA3AxAgByACNgIMIAhBEGoiAiAIKAIMEPgKIQUgACgCCCEAIwBBEGsiBCQAIAQgADYCDCAEQQhqIARBDGoQjgIgAiAHQQxqIAUgB0EQahCaCyEAEI0CIARBEGokACAAQX9GBEAQkQEACyAIIAIgAEECdGo2AgwgB0GQAWokACAIKAIMIQQjAEEQayIGJAAgBkEIaiMAQSBrIgAkACAAQRhqIAIgBBCkBSAAQQxqIABBEGogACgCGCEFIAAoAhwhCiMAQRBrIgQkACAEIAU2AgggBCABNgIMA0AgBSAKRwRAIARBDGogBSgCABC0CyAEIAVBBGoiBTYCCAwBCwsgBEEIaiAEQQxqEPsBIARBEGokACAAIAIgACgCEBCjBTYCDCAAIAAoAhQ2AgggAEEIahD7ASAAQSBqJAAgBigCDCAGQRBqJAAgAyQAC4ICAQR/IwBBgAFrIgIkACACIAJB9ABqNgIMIABBCGogAkEQaiIDIAJBDGogBCAFIAYQ+gogAigCDCEEIwBBEGsiBiQAIAZBCGojAEEgayIAJAAgAEEYaiADIAQQpAUgAEEMaiAAQRBqIAAoAhghBSAAKAIcIQojAEEQayIEJAAgBCAFNgIIIAQgATYCDANAIAUgCkcEQCAEQQxqIAUsAAAQtwsgBCAFQQFqIgU2AggMAQsLIARBCGogBEEMahD7ASAEQRBqJAAgACADIAAoAhAQowU2AgwgACAAKAIUNgIIIABBCGoQ+wEgAEEgaiQAIAYoAgwgBkEQaiQAIAJBgAFqJAAL8QwBAX8jAEEwayIHJAAgByABNgIsIARBADYCACAHIAMQUyAHEMsBIQggBxBQAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAZBwQBrDjkAARcEFwUXBgcXFxcKFxcXFw4PEBcXFxMVFxcXFxcXFwABAgMDFxcBFwgXFwkLFwwXDRcLFxcREhQWCyAAIAVBGGogB0EsaiACIAQgCBD9CgwYCyAAIAVBEGogB0EsaiACIAQgCBD8CgwXCyAAQQhqIAAoAggoAgwRAgAhASAHIAAgBygCLCACIAMgBCAFIAEQRiABEEYgARAlQQJ0ahDFAjYCLAwWCyAHQSxqIAIgBCAIQQIQpAIhAAJAIAQoAgAiAUEEcSAAQQFrQR5LckUEQCAFIAA2AgwMAQsgBCABQQRyNgIACwwVCyAHQZiyCSkDADcDGCAHQZCyCSkDADcDECAHQYiyCSkDADcDCCAHQYCyCSkDADcDACAHIAAgASACIAMgBCAFIAcgB0EgahDFAjYCLAwUCyAHQbiyCSkDADcDGCAHQbCyCSkDADcDECAHQaiyCSkDADcDCCAHQaCyCSkDADcDACAHIAAgASACIAMgBCAFIAcgB0EgahDFAjYCLAwTCyAHQSxqIAIgBCAIQQIQpAIhAAJAIAQoAgAiAUEEcSAAQRdKckUEQCAFIAA2AggMAQsgBCABQQRyNgIACwwSCyAHQSxqIAIgBCAIQQIQpAIhAAJAIAQoAgAiAUEEcSAAQQFrQQtLckUEQCAFIAA2AggMAQsgBCABQQRyNgIACwwRCyAHQSxqIAIgBCAIQQMQpAIhAAJAIAQoAgAiAUEEcSAAQe0CSnJFBEAgBSAANgIcDAELIAQgAUEEcjYCAAsMEAsgB0EsaiACIAQgCEECEKQCIQACQCAEKAIAIgFBBHEgAEEBayIAQQtLckUEQCAFIAA2AhAMAQsgBCABQQRyNgIACwwPCyAHQSxqIAIgBCAIQQIQpAIhAAJAIAQoAgAiAUEEcSAAQTtKckUEQCAFIAA2AgQMAQsgBCABQQRyNgIACwwOCyAHQSxqIQAjAEEQayIBJAAgASACNgIMA0ACQCAAIAFBDGoQWg0AIAhBASAAEIIBEP0BRQ0AIAAQlQEaDAELCyAAIAFBDGoQWgRAIAQgBCgCAEECcjYCAAsgAUEQaiQADA0LIAdBLGohAQJAIABBCGogACgCCCgCCBECACIAECVBACAAQQxqECVrRgRAIAQgBCgCAEEEcjYCAAwBCyABIAIgACAAQRhqIAggBEEAEJsFIgIgAEcgBSgCCCIBQQxHckUEQCAFQQA2AggMAQsgAiAAa0EMRyABQQtKckUEQCAFIAFBDGo2AggLCwwMCyAHQcCyCUEsEB8iBiAAIAEgAiADIAQgBSAGIAZBLGoQxQI2AiwMCwsgB0GAswkoAgA2AhAgB0H4sgkpAwA3AwggB0HwsgkpAwA3AwAgByAAIAEgAiADIAQgBSAHIAdBFGoQxQI2AiwMCgsgB0EsaiACIAQgCEECEKQCIQACQCAEKAIAIgFBBHEgAEE8SnJFBEAgBSAANgIADAELIAQgAUEEcjYCAAsMCQsgB0GoswkpAwA3AxggB0GgswkpAwA3AxAgB0GYswkpAwA3AwggB0GQswkpAwA3AwAgByAAIAEgAiADIAQgBSAHIAdBIGoQxQI2AiwMCAsgB0EsaiACIAQgCEEBEKQCIQACQCAEKAIAIgFBBHEgAEEGSnJFBEAgBSAANgIYDAELIAQgAUEEcjYCAAsMBwsgACABIAIgAyAEIAUgACgCACgCFBEJAAwHCyAAQQhqIAAoAggoAhgRAgAhASAHIAAgBygCLCACIAMgBCAFIAEQRiABEEYgARAlQQJ0ahDFAjYCLAwFCyAFQRRqIAdBLGogAiAEIAgQ+woMBAsgB0EsaiACIAQgCEEEEKQCIQAgBC0AAEEEcUUEQCAFIABB7A5rNgIUCwwDCyAGQSVGDQELIAQgBCgCAEEEcjYCAAwBCyMAQRBrIgAkACAAIAI2AgwCQCAEAn9BBiAHQSxqIgEgAEEMaiICEFoNABpBBCAIIAEQggEQ1QNBJUcNABogARCVASACEFpFDQFBAgsgBCgCAHI2AgALIABBEGokAAsgBygCLAsgB0EwaiQAC5sBAQR/IwBBEGsiAiQAQYj2CCgCACEEA0ACQCAALAAAIgFB/wFxIgNFBEBBACEBDAELAkACQCABQf8ARyABQSBPcQ0AIANBCWsiA0EXTUEAQQEgA3RBn4CABHEbDQAgAiABNgIAIARBtN8AIAIQICIBQQBODQEMAgsgASAEEKcBIgFBAEgNAQsgAEEBaiEADAELCyACQRBqJAAgAQtJAQJ/IwBBEGsiBiQAIAYgATYCDCAGQQhqIgcgAxBTIAcQywEhASAHEFAgBUEUaiAGQQxqIAIgBCABEPsKIAYoAgwgBkEQaiQAC0sBAn8jAEEQayIGJAAgBiABNgIMIAZBCGoiByADEFMgBxDLASEBIAcQUCAAIAVBEGogBkEMaiACIAQgARD8CiAGKAIMIAZBEGokAAtLAQJ/IwBBEGsiBiQAIAYgATYCDCAGQQhqIgcgAxBTIAcQywEhASAHEFAgACAFQRhqIAZBDGogAiAEIAEQ/QogBigCDCAGQRBqJAALMQAgACABIAIgAyAEIAUgAEEIaiAAKAIIKAIUEQIAIgAQRiAAEEYgABAlQQJ0ahDFAgtZAQF/IwBBIGsiBiQAIAZBqLMJKQMANwMYIAZBoLMJKQMANwMQIAZBmLMJKQMANwMIIAZBkLMJKQMANwMAIAAgASACIAMgBCAFIAYgBkEgaiIBEMUCIAEkAAuNDAEBfyMAQRBrIgckACAHIAE2AgwgBEEANgIAIAcgAxBTIAcQzAEhCCAHEFACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBkHBAGsOOQABFwQXBRcGBxcXFwoXFxcXDg8QFxcXExUXFxcXFxcXAAECAwMXFwEXCBcXCQsXDBcNFwsXFxESFBYLIAAgBUEYaiAHQQxqIAIgBCAIEIALDBgLIAAgBUEQaiAHQQxqIAIgBCAIEP8KDBcLIABBCGogACgCCCgCDBECACEBIAcgACAHKAIMIAIgAyAEIAUgARBGIAEQRiABECVqEMYCNgIMDBYLIAdBDGogAiAEIAhBAhClAiEAAkAgBCgCACIBQQRxIABBAWtBHktyRQRAIAUgADYCDAwBCyAEIAFBBHI2AgALDBULIAdCpdq9qcLsy5L5ADcDACAHIAAgASACIAMgBCAFIAcgB0EIahDGAjYCDAwUCyAHQqWytanSrcuS5AA3AwAgByAAIAEgAiADIAQgBSAHIAdBCGoQxgI2AgwMEwsgB0EMaiACIAQgCEECEKUCIQACQCAEKAIAIgFBBHEgAEEXSnJFBEAgBSAANgIIDAELIAQgAUEEcjYCAAsMEgsgB0EMaiACIAQgCEECEKUCIQACQCAEKAIAIgFBBHEgAEEBa0ELS3JFBEAgBSAANgIIDAELIAQgAUEEcjYCAAsMEQsgB0EMaiACIAQgCEEDEKUCIQACQCAEKAIAIgFBBHEgAEHtAkpyRQRAIAUgADYCHAwBCyAEIAFBBHI2AgALDBALIAdBDGogAiAEIAhBAhClAiEAAkAgBCgCACIBQQRxIABBAWsiAEELS3JFBEAgBSAANgIQDAELIAQgAUEEcjYCAAsMDwsgB0EMaiACIAQgCEECEKUCIQACQCAEKAIAIgFBBHEgAEE7SnJFBEAgBSAANgIEDAELIAQgAUEEcjYCAAsMDgsgB0EMaiEAIwBBEGsiASQAIAEgAjYCDANAAkAgACABQQxqEFsNACAIQQEgABCDARD+AUUNACAAEJYBGgwBCwsgACABQQxqEFsEQCAEIAQoAgBBAnI2AgALIAFBEGokAAwNCyAHQQxqIQECQCAAQQhqIAAoAggoAggRAgAiABAlQQAgAEEMahAla0YEQCAEIAQoAgBBBHI2AgAMAQsgASACIAAgAEEYaiAIIARBABCdBSICIABHIAUoAggiAUEMR3JFBEAgBUEANgIIDAELIAIgAGtBDEcgAUELSnJFBEAgBSABQQxqNgIICwsMDAsgB0HosQkoAAA2AAcgB0HhsQkpAAA3AwAgByAAIAEgAiADIAQgBSAHIAdBC2oQxgI2AgwMCwsgB0HwsQktAAA6AAQgB0HssQkoAAA2AgAgByAAIAEgAiADIAQgBSAHIAdBBWoQxgI2AgwMCgsgB0EMaiACIAQgCEECEKUCIQACQCAEKAIAIgFBBHEgAEE8SnJFBEAgBSAANgIADAELIAQgAUEEcjYCAAsMCQsgB0KlkOmp0snOktMANwMAIAcgACABIAIgAyAEIAUgByAHQQhqEMYCNgIMDAgLIAdBDGogAiAEIAhBARClAiEAAkAgBCgCACIBQQRxIABBBkpyRQRAIAUgADYCGAwBCyAEIAFBBHI2AgALDAcLIAAgASACIAMgBCAFIAAoAgAoAhQRCQAMBwsgAEEIaiAAKAIIKAIYEQIAIQEgByAAIAcoAgwgAiADIAQgBSABEEYgARBGIAEQJWoQxgI2AgwMBQsgBUEUaiAHQQxqIAIgBCAIEP4KDAQLIAdBDGogAiAEIAhBBBClAiEAIAQtAABBBHFFBEAgBSAAQewOazYCFAsMAwsgBkElRg0BCyAEIAQoAgBBBHI2AgAMAQsjAEEQayIAJAAgACACNgIMAkAgBAJ/QQYgB0EMaiIBIABBDGoiAhBbDQAaQQQgCCABEIMBENYDQSVHDQAaIAEQlgEgAhBbRQ0BQQILIAQoAgByNgIACyAAQRBqJAALIAcoAgwLIAdBEGokAAtJAQJ/IwBBEGsiBiQAIAYgATYCDCAGQQhqIgcgAxBTIAcQzAEhASAHEFAgBUEUaiAGQQxqIAIgBCABEP4KIAYoAgwgBkEQaiQAC0sBAn8jAEEQayIGJAAgBiABNgIMIAZBCGoiByADEFMgBxDMASEBIAcQUCAAIAVBEGogBkEMaiACIAQgARD/CiAGKAIMIAZBEGokAAtLAQJ/IwBBEGsiBiQAIAYgATYCDCAGQQhqIgcgAxBTIAcQzAEhASAHEFAgACAFQRhqIAZBDGogAiAEIAEQgAsgBigCDCAGQRBqJAALLgAgACABIAIgAyAEIAUgAEEIaiAAKAIIKAIUEQIAIgAQRiAAEEYgABAlahDGAgs8AQF/IwBBEGsiBiQAIAZCpZDpqdLJzpLTADcDCCAAIAEgAiADIAQgBSAGQQhqIAZBEGoiARDGAiABJAALjwEBBX8jAEHQAWsiACQAEGYhBiAAIAQ2AgAgAEGwAWoiByAHIAdBFCAGQf/cACAAEN0BIghqIgQgAhCnAiEGIABBEGoiBSACEFMgBRDLASAFEFAgByAEIAUQxwIgASAFIAhBAnQgBWoiASAGIABrQQJ0IABqQbAFayAEIAZGGyABIAIgAxCgAyAAQdABaiQAC4QEAQd/An8jAEGgA2siBiQAIAZCJTcDmAMgBkGYA2oiB0EBckGt2AEgAigCBBCYBSEIIAYgBkHwAmoiCTYC7AIQZiEAAn8gCARAIAIoAgghCiAGQUBrIAU3AwAgBiAENwM4IAYgCjYCMCAJQR4gACAHIAZBMGoQ3QEMAQsgBiAENwNQIAYgBTcDWCAGQfACakEeIAAgBkGYA2ogBkHQAGoQ3QELIQAgBkEKNgKAASAGQeQCakEAIAZBgAFqEH0hCSAGQfACaiEHAkAgAEEeTgRAEGYhAAJ/IAgEQCACKAIIIQcgBiAFNwMQIAYgBDcDCCAGIAc2AgAgBkHsAmogACAGQZgDaiAGEKYCDAELIAYgBDcDICAGIAU3AyggBkHsAmogACAGQZgDaiAGQSBqEKYCCyIAQX9GDQEgCSAGKALsAhCQASAGKALsAiEHCyAHIAAgB2oiCyACEKcCIQwgBkEKNgKAASAGQfgAakEAIAZBgAFqIgcQfSEIAkAgBigC7AIiCiAGQfACakYEQCAHIQAMAQsgAEEDdBBPIgBFDQEgCCAAEJABIAYoAuwCIQoLIAZB7ABqIgcgAhBTIAogDCALIAAgBkH0AGogBkHwAGogBxCDCyAHEFAgASAAIAYoAnQgBigCcCACIAMQoAMgCBB8IAkQfCAGQaADaiQADAELEJEBAAsL4AMBB38CfyMAQfACayIFJAAgBUIlNwPoAiAFQegCaiIGQQFyQfH/BCACKAIEEJgFIQcgBSAFQcACaiIINgK8AhBmIQACfyAHBEAgAigCCCEJIAUgBDkDKCAFIAk2AiAgCEEeIAAgBiAFQSBqEN0BDAELIAUgBDkDMCAFQcACakEeIAAgBUHoAmogBUEwahDdAQshACAFQQo2AlAgBUG0AmpBACAFQdAAahB9IQggBUHAAmohBgJAIABBHk4EQBBmIQACfyAHBEAgAigCCCEGIAUgBDkDCCAFIAY2AgAgBUG8AmogACAFQegCaiAFEKYCDAELIAUgBDkDECAFQbwCaiAAIAVB6AJqIAVBEGoQpgILIgBBf0YNASAIIAUoArwCEJABIAUoArwCIQYLIAYgACAGaiIKIAIQpwIhCyAFQQo2AlAgBUHIAGpBACAFQdAAaiIGEH0hBwJAIAUoArwCIgkgBUHAAmpGBEAgBiEADAELIABBA3QQTyIARQ0BIAcgABCQASAFKAK8AiEJCyAFQTxqIgYgAhBTIAkgCyAKIAAgBUHEAGogBUFAayAGEIMLIAYQUCABIAAgBSgCRCAFKAJAIAIgAxCgAyAHEHwgCBB8IAVB8AJqJAAMAQsQkQEACwsRACAAIAEgAiADIARBABCcCgsRACAAIAEgAiADIARBABCbCgsRACAAIAEgAiADIARBARCcCgsRACAAIAEgAiADIARBARCbCgvNAQEBfyMAQSBrIgUkACAFIAE2AhwCQCACKAIEQQFxRQRAIAAgASACIAMgBCAAKAIAKAIYEQgAIQIMAQsgBUEQaiIAIAIQUyAAENgDIQEgABBQAkAgBARAIAAgARD4AQwBCyAFQRBqIAEQ9wELIAUgBUEQahDeATYCDANAIAUgBUEQaiIAEPICNgIIIAVBDGoiASAFQQhqEPMCBEAgBUEcaiABIgAoAgAoAgAQtAsgABCABwwBBSAFKAIcIQIgABB3GgsLCyAFQSBqJAAgAguHAQEFfyMAQeAAayIAJAAQZiEGIAAgBDYCACAAQUBrIgcgByAHQRQgBkH/3AAgABDdASIIaiIEIAIQpwIhBiAAQRBqIgUgAhBTIAUQzAEgBRBQIAcgBCAFEPUCIAEgBSAFIAhqIgEgBiAAayAAakEwayAEIAZGGyABIAIgAxChAyAAQeAAaiQAC4QEAQd/An8jAEGAAmsiBiQAIAZCJTcD+AEgBkH4AWoiB0EBckGt2AEgAigCBBCYBSEIIAYgBkHQAWoiCTYCzAEQZiEAAn8gCARAIAIoAgghCiAGQUBrIAU3AwAgBiAENwM4IAYgCjYCMCAJQR4gACAHIAZBMGoQ3QEMAQsgBiAENwNQIAYgBTcDWCAGQdABakEeIAAgBkH4AWogBkHQAGoQ3QELIQAgBkEKNgKAASAGQcQBakEAIAZBgAFqEH0hCSAGQdABaiEHAkAgAEEeTgRAEGYhAAJ/IAgEQCACKAIIIQcgBiAFNwMQIAYgBDcDCCAGIAc2AgAgBkHMAWogACAGQfgBaiAGEKYCDAELIAYgBDcDICAGIAU3AyggBkHMAWogACAGQfgBaiAGQSBqEKYCCyIAQX9GDQEgCSAGKALMARCQASAGKALMASEHCyAHIAAgB2oiCyACEKcCIQwgBkEKNgKAASAGQfgAakEAIAZBgAFqIgcQfSEIAkAgBigCzAEiCiAGQdABakYEQCAHIQAMAQsgAEEBdBBPIgBFDQEgCCAAEJABIAYoAswBIQoLIAZB7ABqIgcgAhBTIAogDCALIAAgBkH0AGogBkHwAGogBxCHCyAHEFAgASAAIAYoAnQgBigCcCACIAMQoQMgCBB8IAkQfCAGQYACaiQADAELEJEBAAsL4AMBB38CfyMAQdABayIFJAAgBUIlNwPIASAFQcgBaiIGQQFyQfH/BCACKAIEEJgFIQcgBSAFQaABaiIINgKcARBmIQACfyAHBEAgAigCCCEJIAUgBDkDKCAFIAk2AiAgCEEeIAAgBiAFQSBqEN0BDAELIAUgBDkDMCAFQaABakEeIAAgBUHIAWogBUEwahDdAQshACAFQQo2AlAgBUGUAWpBACAFQdAAahB9IQggBUGgAWohBgJAIABBHk4EQBBmIQACfyAHBEAgAigCCCEGIAUgBDkDCCAFIAY2AgAgBUGcAWogACAFQcgBaiAFEKYCDAELIAUgBDkDECAFQZwBaiAAIAVByAFqIAVBEGoQpgILIgBBf0YNASAIIAUoApwBEJABIAUoApwBIQYLIAYgACAGaiIKIAIQpwIhCyAFQQo2AlAgBUHIAGpBACAFQdAAaiIGEH0hBwJAIAUoApwBIgkgBUGgAWpGBEAgBiEADAELIABBAXQQTyIARQ0BIAcgABCQASAFKAKcASEJCyAFQTxqIgYgAhBTIAkgCyAKIAAgBUHEAGogBUFAayAGEIcLIAYQUCABIAAgBSgCRCAFKAJAIAIgAxChAyAHEHwgCBB8IAVB0AFqJAAMAQsQkQEACwsRACAAIAEgAiADIARBABCeCgsRACAAIAEgAiADIARBABCdCgsRACAAIAEgAiADIARBARCeCgsRACAAIAEgAiADIARBARCdCgvNAQEBfyMAQSBrIgUkACAFIAE2AhwCQCACKAIEQQFxRQRAIAAgASACIAMgBCAAKAIAKAIYEQgAIQIMAQsgBUEQaiIAIAIQUyAAENoDIQEgABBQAkAgBARAIAAgARD4AQwBCyAFQRBqIAEQ9wELIAUgBUEQahDeATYCDANAIAUgBUEQaiIAEPQCNgIIIAVBDGoiASAFQQhqEPMCBEAgBUEcaiABIgAoAgAsAAAQtwsgABCCBwwBBSAFKAIcIQIgABA1GgsLCyAFQSBqJAAgAgvnAgEBfyMAQcACayIAJAAgACACNgK4AiAAIAE2ArwCIABBxAFqEFQhBiAAQRBqIgIgAxBTIAIQywFBwLEJQdqxCSAAQdABahDHAiACEFAgAEG4AWoQVCIDIAMQVRBBIAAgA0EAEEMiATYCtAEgACACNgIMIABBADYCCANAAkAgAEG8AmogAEG4AmoQWg0AIAAoArQBIAMQJSABakYEQCADECUhAiADIAMQJUEBdBBBIAMgAxBVEEEgACACIANBABBDIgFqNgK0AQsgAEG8AmoiAhCCAUEQIAEgAEG0AWogAEEIakEAIAYgAEEQaiAAQQxqIABB0AFqENcDDQAgAhCVARoMAQsLIAMgACgCtAEgAWsQQSADEEYQZiAAIAU2AgAgABCMC0EBRwRAIARBBDYCAAsgAEG8AmogAEG4AmoQWgRAIAQgBCgCAEECcjYCAAsgACgCvAIgAxA1GiAGEDUaIABBwAJqJAAL0AMBAX4jAEGAA2siACQAIAAgAjYC+AIgACABNgL8AiAAQdwBaiADIABB8AFqIABB7AFqIABB6AFqEIUHIABB0AFqEFQiASABEFUQQSAAIAFBABBDIgI2AswBIAAgAEEgajYCHCAAQQA2AhggAEEBOgAXIABBxQA6ABYDQAJAIABB/AJqIABB+AJqEFoNACAAKALMASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYCzAELIABB/AJqIgMQggEgAEEXaiAAQRZqIAIgAEHMAWogACgC7AEgACgC6AEgAEHcAWogAEEgaiAAQRxqIABBGGogAEHwAWoQhAcNACADEJUBGgwBCwsCQCAAQdwBahAlRQ0AIAAtABdBAUcNACAAKAIcIgMgAEEgamtBnwFKDQAgACADQQRqNgIcIAMgACgCGDYCAAsgACACIAAoAswBIAQQjQsgACkDACEGIAUgACkDCDcDCCAFIAY3AwAgAEHcAWogAEEgaiAAKAIcIAQQrwEgAEH8AmogAEH4AmoQWgRAIAQgBCgCAEECcjYCAAsgACgC/AIgARA1GiAAQdwBahA1GiAAQYADaiQAC7kDACMAQfACayIAJAAgACACNgLoAiAAIAE2AuwCIABBzAFqIAMgAEHgAWogAEHcAWogAEHYAWoQhQcgAEHAAWoQVCIBIAEQVRBBIAAgAUEAEEMiAjYCvAEgACAAQRBqNgIMIABBADYCCCAAQQE6AAcgAEHFADoABgNAAkAgAEHsAmogAEHoAmoQWg0AIAAoArwBIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgK8AQsgAEHsAmoiAxCCASAAQQdqIABBBmogAiAAQbwBaiAAKALcASAAKALYASAAQcwBaiAAQRBqIABBDGogAEEIaiAAQeABahCEBw0AIAMQlQEaDAELCwJAIABBzAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCvAEgBBCOCzkDACAAQcwBaiAAQRBqIAAoAgwgBBCvASAAQewCaiAAQegCahBaBEAgBCAEKAIAQQJyNgIACyAAKALsAiABEDUaIABBzAFqEDUaIABB8AJqJAALuQMAIwBB8AJrIgAkACAAIAI2AugCIAAgATYC7AIgAEHMAWogAyAAQeABaiAAQdwBaiAAQdgBahCFByAAQcABahBUIgEgARBVEEEgACABQQAQQyICNgK8ASAAIABBEGo2AgwgAEEANgIIIABBAToAByAAQcUAOgAGA0ACQCAAQewCaiAAQegCahBaDQAgACgCvAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArwBCyAAQewCaiIDEIIBIABBB2ogAEEGaiACIABBvAFqIAAoAtwBIAAoAtgBIABBzAFqIABBEGogAEEMaiAAQQhqIABB4AFqEIQHDQAgAxCVARoMAQsLAkAgAEHMAWoQJUUNACAALQAHQQFHDQAgACgCDCIDIABBEGprQZ8BSg0AIAAgA0EEajYCDCADIAAoAgg2AgALIAUgAiAAKAK8ASAEEI8LOAIAIABBzAFqIABBEGogACgCDCAEEK8BIABB7AJqIABB6AJqEFoEQCAEIAQoAgBBAnI2AgALIAAoAuwCIAEQNRogAEHMAWoQNRogAEHwAmokAAuaAwECfyMAQdACayIAJAAgACACNgLIAiAAIAE2AswCIAMQqAIhBiADIABB0AFqEKMEIQcgAEHEAWogAyAAQcQCahCiBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQcwCaiAAQcgCahBaDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQcwCaiIDEIIBIAYgAiAAQbQBaiAAQQhqIAAoAsQCIABBxAFqIABBEGogAEEMaiAHENcDDQAgAxCVARoMAQsLAkAgAEHEAWoQJUUNACAAKAIMIgMgAEEQamtBnwFKDQAgACADQQRqNgIMIAMgACgCCDYCAAsgBSACIAAoArQBIAQgBhCQCzcDACAAQcQBaiAAQRBqIAAoAgwgBBCvASAAQcwCaiAAQcgCahBaBEAgBCAEKAIAQQJyNgIACyAAKALMAiABEDUaIABBxAFqEDUaIABB0AJqJAALmgMBAn8jAEHQAmsiACQAIAAgAjYCyAIgACABNgLMAiADEKgCIQYgAyAAQdABahCjBCEHIABBxAFqIAMgAEHEAmoQogQgAEG4AWoQVCIBIAEQVRBBIAAgAUEAEEMiAjYCtAEgACAAQRBqNgIMIABBADYCCANAAkAgAEHMAmogAEHIAmoQWg0AIAAoArQBIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgK0AQsgAEHMAmoiAxCCASAGIAIgAEG0AWogAEEIaiAAKALEAiAAQcQBaiAAQRBqIABBDGogBxDXAw0AIAMQlQEaDAELCwJAIABBxAFqECVFDQAgACgCDCIDIABBEGprQZ8BSg0AIAAgA0EEajYCDCADIAAoAgg2AgALIAUgAiAAKAK0ASAEIAYQkws7AQAgAEHEAWogAEEQaiAAKAIMIAQQrwEgAEHMAmogAEHIAmoQWgRAIAQgBCgCAEECcjYCAAsgACgCzAIgARA1GiAAQcQBahA1GiAAQdACaiQAC5oDAQJ/IwBB0AJrIgAkACAAIAI2AsgCIAAgATYCzAIgAxCoAiEGIAMgAEHQAWoQowQhByAAQcQBaiADIABBxAJqEKIEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABBzAJqIABByAJqEFoNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYCtAELIABBzAJqIgMQggEgBiACIABBtAFqIABBCGogACgCxAIgAEHEAWogAEEQaiAAQQxqIAcQ1wMNACADEJUBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJQLNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABBzAJqIABByAJqEFoEQCAEIAQoAgBBAnI2AgALIAAoAswCIAEQNRogAEHEAWoQNRogAEHQAmokAAuaAwECfyMAQdACayIAJAAgACACNgLIAiAAIAE2AswCIAMQqAIhBiADIABB0AFqEKMEIQcgAEHEAWogAyAAQcQCahCiBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQcwCaiAAQcgCahBaDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQcwCaiIDEIIBIAYgAiAAQbQBaiAAQQhqIAAoAsQCIABBxAFqIABBEGogAEEMaiAHENcDDQAgAxCVARoMAQsLAkAgAEHEAWoQJUUNACAAKAIMIgMgAEEQamtBnwFKDQAgACADQQRqNgIMIAMgACgCCDYCAAsgBSACIAAoArQBIAQgBhCVCzYCACAAQcQBaiAAQRBqIAAoAgwgBBCvASAAQcwCaiAAQcgCahBaBEAgBCAEKAIAQQJyNgIACyAAKALMAiABEDUaIABBxAFqEDUaIABB0AJqJAAL7QEBAX8jAEEgayIGJAAgBiABNgIcAkAgAygCBEEBcUUEQCAGQX82AgAgACABIAIgAyAEIAYgACgCACgCEBEJACEBAkACQAJAIAYoAgAOAgABAgsgBUEAOgAADAMLIAVBAToAAAwCCyAFQQE6AAAgBEEENgIADAELIAYgAxBTIAYQywEhASAGEFAgBiADEFMgBhDYAyEAIAYQUCAGIAAQ+AEgBkEMciAAEPcBIAUgBkEcaiACIAYgBkEYaiIDIAEgBEEBEJsFIAZGOgAAIAYoAhwhAQNAIANBDGsQdyIDIAZHDQALCyAGQSBqJAAgAQvnAgEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBxAFqEFQhBiAAQRBqIgIgAxBTIAIQzAFBwLEJQdqxCSAAQdABahD1AiACEFAgAEG4AWoQVCIDIAMQVRBBIAAgA0EAEEMiATYCtAEgACACNgIMIABBADYCCANAAkAgAEH8AWogAEH4AWoQWw0AIAAoArQBIAMQJSABakYEQCADECUhAiADIAMQJUEBdBBBIAMgAxBVEEEgACACIANBABBDIgFqNgK0AQsgAEH8AWoiAhCDAUEQIAEgAEG0AWogAEEIakEAIAYgAEEQaiAAQQxqIABB0AFqENkDDQAgAhCWARoMAQsLIAMgACgCtAEgAWsQQSADEEYQZiAAIAU2AgAgABCMC0EBRwRAIARBBDYCAAsgAEH8AWogAEH4AWoQWwRAIAQgBCgCAEECcjYCAAsgACgC/AEgAxA1GiAGEDUaIABBgAJqJAAL0AMBAX4jAEGQAmsiACQAIAAgAjYCiAIgACABNgKMAiAAQdABaiADIABB4AFqIABB3wFqIABB3gFqEIkHIABBxAFqEFQiASABEFUQQSAAIAFBABBDIgI2AsABIAAgAEEgajYCHCAAQQA2AhggAEEBOgAXIABBxQA6ABYDQAJAIABBjAJqIABBiAJqEFsNACAAKALAASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYCwAELIABBjAJqIgMQgwEgAEEXaiAAQRZqIAIgAEHAAWogACwA3wEgACwA3gEgAEHQAWogAEEgaiAAQRxqIABBGGogAEHgAWoQiAcNACADEJYBGgwBCwsCQCAAQdABahAlRQ0AIAAtABdBAUcNACAAKAIcIgMgAEEgamtBnwFKDQAgACADQQRqNgIcIAMgACgCGDYCAAsgACACIAAoAsABIAQQjQsgACkDACEGIAUgACkDCDcDCCAFIAY3AwAgAEHQAWogAEEgaiAAKAIcIAQQrwEgAEGMAmogAEGIAmoQWwRAIAQgBCgCAEECcjYCAAsgACgCjAIgARA1GiAAQdABahA1GiAAQZACaiQAC7kDACMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBwAFqIAMgAEHQAWogAEHPAWogAEHOAWoQiQcgAEG0AWoQVCIBIAEQVRBBIAAgAUEAEEMiAjYCsAEgACAAQRBqNgIMIABBADYCCCAAQQE6AAcgAEHFADoABgNAAkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCOCzkDACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALzgcBBn8jAEHQAGsiAyQAQdzdCkHc3QooAgBBASAAIABBAkYbIABBA0YiBRsiBDYCAEHY3QpB2N0KKAIAIgYgBCAEIAZIGzYCAAJAAkACQAJAAkBBxN0KKAIAIARNBEAgAyACNgIwIAMgAjYCTEEAQQAgASACEGAiAkEASARAIANBhRk2AiBBiPYIKAIAQcavBCADQSBqECAaDAILIAJBAWoiBRBPIgJFBEAgA0GFGTYCAEGI9ggoAgBB19kDIAMQIBoMAgtBwN0KKAIAIgRBASAEGyEEIABBA0cEQEG9NkGh/wAgAEEBRhsgBBECABpBk80DIAQRAgAaCyACIAUgASADKAIwEGBBAEgEQCACEBggA0GFGTYCEEGI9ggoAgBBxq8EIANBEGoQIBoMAgsgAiAEEQIAGiACEBgMAQsCQCAFDQAQ7QMEQEHX3QpBADoAAAwBC0HM3QpBADYCAAsgAyACNgJMIAMgAjYCMEEAIQBBAEEAIAEgAhBgIgZBAEgNACAGQQFqIQcCQBDOCxC/BWsiAiAGSw0AIAcgAmshAhDtAwRAQQEhACACQQFGDQELIwBBIGsiBCQAIAIQzgsiAmoiACACQQF0QYAIIAIbIgUgACAFSxshABC/BSEIAkACQAJAAkACQEHX3QotAABB/wFGBEAgAkF/Rg0CQcjdCigCACEFIABFBEAgBRAYQQAhBQwCCyAFIAAQaiIFRQ0DIAAgAk0NASACIAVqQQAgACACaxA4GgwBC0EAIAAgAEEBEE4iBRsNAyAFQcjdCiAIEB8aQczdCiAINgIAC0HX3QpB/wE6AABB0N0KIAA2AgBByN0KIAU2AgAgBEEgaiQADAMLQY7AA0HS/ABBzQBBvbMBEAAACyAEIAA2AgBBiPYIKAIAQfXpAyAEECAaEC8ACyAEIAA2AhBBiPYIKAIAQfXpAyAEQRBqECAaEC8AC0EAIQALIANCADcDOCADQgA3AzAgBkEQT0EAIAAbDQEgA0EwaiECIAYgAAR/IAIFENUKCyAHIAEgAygCTBBgIgFHIAFBAE5xDQIgAUEATA0AEO0DBEAgAUGAAk8NBCAABEAQ1QogA0EwaiABEB8aC0HX3QpB190KLQAAIAFqOgAAEL8FQRBJDQFBk7YDQaD8AEHqAUH4HhAAAAsgAA0EQczdCkHM3QooAgAgAWo2AgALIANB0ABqJAAPC0HGpgNBoPwAQd0BQfgeEAAAC0GtngNBoPwAQeIBQfgeEAAAC0H5zQFBoPwAQeUBQfgeEAAAC0GjngFBoPwAQewBQfgeEAAAC7kDACMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBwAFqIAMgAEHQAWogAEHPAWogAEHOAWoQiQcgAEG0AWoQVCIBIAEQVRBBIAAgAUEAEEMiAjYCsAEgACAAQRBqNgIMIABBADYCCCAAQQE6AAcgAEHFADoABgNAAkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQJSACakYEQCABECUhAyABIAEQJUEBdBBBIAEgARBVEEEgACADIAFBABBDIgJqNgKwAQsgAEH8AWoiAxCDASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCIBw0AIAMQlgEaDAELCwJAIABBwAFqECVFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBCPCzgCACAAQcABaiAAQRBqIAAoAgwgBBCvASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDUaIABBwAFqEDUaIABBgAJqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKgCIQYgAEHEAWogAyAAQfcBahClBCAAQbgBahBUIgEgARBVEEEgACABQQAQQyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAlIAJqRgRAIAEQJSEDIAEgARAlQQF0EEEgASABEFUQQSAAIAMgAUEAEEMiAmo2ArQBCyAAQfwBaiIDEIMBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHAsQkQ2QMNACADEJYBGgwBCwsCQCAAQcQBahAlRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEJALNwMAIABBxAFqIABBEGogACgCDCAEEK8BIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNRogAEHEAWoQNRogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqAIhBiAAQcQBaiADIABB9wFqEKUEIABBuAFqEFQiASABEFUQQSAAIAFBABBDIgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECUgAmpGBEAgARAlIQMgASABECVBAXQQQSABIAEQVRBBIAAgAyABQQAQQyICajYC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AjgCQCABQeIlQQBBARA2BEAgASgCECgCCA0BCyACLQCbAUEEcQ0AQZqwBEEAEDdBfyEBDAELAkAgBQRAIAVBgCAQTyIGNgIAIAYNAQtBwf4AQQAQN0F/IQEMAQsgAkKAIDcCLCACIAY2AiggACABEJ8GIQEgAhCHBCABRQRAIAUgAigCKDYCACADIAIoAjA2AggLIAAQlQQLIARBEGokACADKAIMIQACQCABRQRAIAAhBwwBCyAAEBgLIANBEGokACAHCwsAEPYMELwMEJMKCzUAIAFB4iVBAEEBEDYEQCABKAIQKAKUASIABEAgASAAEQEAIAEoAhBBADYClAELIAEQ0wkLCwsAIAAgASACEJQGCwwAIAAQlwYgABCWBgsFABCVBgsHACAAELkBCwsAIAAgASACEJAHCw0AIAAgASACQQIQ4wYLDQAgACABIAJBARDjBgsNACAAIAEgAkEAEOMGCwsAIAAgAUEBEJIBCxwAIAAgACABQQEQjQEgACACQQEQjQFBAEEBEF4LCwAgACABQQEQjQELCwAgACABQQEQjAELCwAgACABQQAQjAELCQAgACABENUCCwkAIAAgARCsAQs2AQF/QQBBAUHC8ABBvdEBELUFGhD2DBC8DBCTCiAAENwNA0BBABDcDSIBBEAgARC5AQwBCwsLRwEBfyMAQRBrIgMkACADQQA7AA0gA0EAOgAPIANBAkEAIAIbIAFyOgAMIAMgAygCDDYCCCAAIANBCGpBABDjASADQRBqJAALsAMCBX8BfiMAQRBrIgMkACADQQA2AgwCfxCVBiEEIwBB4ABrIgEkACABQgA3A1ggAUIANwNQIAFCADcDSAJAAkACf0EAIABFDQAaAkADQCACQQVHBEAgACACQQJ0QbCWBWooAgAQLkUNAiACQQFqIQIMAQsLIAEgADYCAEHu+wQgARA3QQAMAQsgBCACQQJ0aigCQCECIAFCADcDQEEAIQADQCACBEAgAUE4aiACKAIEQToQ0AECQCAABEAgASABKQNANwMoIAEgASkDODcDICABQShqIAFBIGoQ+gYNAQsgASgCOCIARQ0EIAAgASgCPCIAEJACIgVFDQUgASAFNgJcIAFByABqQQQQJiEAIAEoAkggAEECdGogASgCXDYCAAsgASABKQM4IgY3A0AgBqchACACKAIAIQIMAQsLIAFB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iAFqQQAQGUECdGogAygCuAEQzgwEQCADIAMpA7gBNwOAASADIAMpA7ABNwN4IAchAiADKAKwASADQfgAakEAEBlBAnRqIAMoArgBENAMIgsNAUEAIQtBouwDQQAQKkEAIQIDQCACIAMoArgBTw0FIAMgAykDuAE3A1AgAyADKQOwATcDSCADQcgAaiACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsCQCAMDQAgA0GYAWogABD9AiAAQQhBCBDqBSECQcTtA0EAECogASsDACINIAK3Ig5mIA4gASsDCCIPZXIEQCADQUBrIA85AwAgAyANOQM4IAMgAjYCMEHj8AQgA0EwahCAAQwBCyADKwOYASIOIA1lIAMrA6ABIhAgD2VyRQ0AIAMgDzkDKCADIA05AyAgAyAQOQMYIAMgDjkDEEGV8QQgA0EQahCAAQtBACECA0AgAiADKAK4AU8NBCADIAMpA7gBNwMIIAMgAykDsAE3AwAgAyACEBkhBAJAAkACQCADKALAASIFDgICAAELIAMoArABIARBAnRqKAIAEBgMAQsgAygCsAEgBEECdGooAgAgBREBAAsgAkEBaiECDAALAAsDQCACRQRAQQAhAgNAIAIgAygCuAFPDQYgAyADKQO4ATcDYCADIAMpA7ABNwNYIANB2ABqIAIQGSEEAkACQAJAIAMoAsABIgUOAgIAAQsgAygCsAEgBEECdGooAgAQGAwBCyADKAKwASAEQQJ0aigCACAFEQEACyACQQFqIQIMAAsACyACKAIQIANBmAFqIAIgC0EAEMUMIAMpA5gBNwOQASADKAK4AUEATgRAIANBsAFqQQQQjAIgAyADKQO4ATcDcCADIAMpA7ABNwNoIAIgAygCsAEgA0HoAGpBABAZQQJ0aiADKAK4AUEAEMQMIAIoAhAoArABIQIMAQsLQYnNAUGDugFBggJBzDAQAAALQYnNAUGDugFB4QFBzDAQAAALIAAgChAdIQoMBQtBASEMCyADQbABaiICQQQQMSACEDQLIAAgBxAwIQcMAAsACwsgCwRAIAsQzwwLIANB0AFqJAAgDAtbAQJ/IAAQHCEBA0AgAQRAIAAgARAsIQIDQCACBEAgAhDAAiAA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AAAAUkCjoDkDMCAEIAUrAzhEAAAAAAAAUkCjIAOhOQM4CyAAIAQ2AiQgACAGKAIMIgE2AiAgBCABIAAgAEEQahDnDEEACyAGQRBqJAALEQAgACABQeD+CkHc/goQ5QYLLQECfUF/IAIgACgCAEECdGoqAgAiAyACIAEoAgBBAnRqKgIAIgReIAMgBF0bCxIAIABBNGoQ9QMgAEEoahD1AwsJACAAEJINEBgLGQECfiAAKQMIIgIgASkDCCIDViACIANUawsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJawtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEKENEBgLCQAgABDsBxAYC4kIAgl/AnwjAEGgAWsiAyQAIAAQog0gA0EANgKcASAAQQRqIQcgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCACAEIAQoAgRBBGs2AgQLIAoFIAogAigCACIGELUCIgtkBEAgAyAGNgKcASALIQogAiEBCyACQQRqIQIMAQsLREivvJry13q+YwRAIAMoApwBIgItABxBAUYNAiADIAIoAgAoAiAiATYCBCADIAIoAgQiBigCICIFNgKYASABIAVHBEAgASAFIAIQrw0MAgsgCEGRzgBODQMgAigCACEJIwBBEGsiBSQAIAEgASgCACgCAEEAEOAFIAUgASAGIAlBAEEAQQAQ8AcgBSgCCCEGIAVBEGokACABIANBBGoiBSADQZgBaiAGEO8HIAFBAToAKCADIAY2AhAgBCADQRBqIgEQwAEgAygCBCADKAKYASACEK8NIAEgByAFEPYDIAhBAWohCAwBCwsgBxDeBUEAIQEDQCABIAAoAhxPDQMgAUECdCABQQFqIQEgACgCGGooAgAiBBC1AkRIr7ya8td6vmNFDQALIANBEGoiAUHIlAk2AjggAUG0lAk2AgAgAUHUlAkoAgAiADYCACABIABBDGsoAgBqQdiUCSgCADYCACABIAEoAgBBDGsoAgBqIgJBADYCFCACIAFBBGoiADYCGCACQQA2AgwgAkKC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ACxBAXEEQCACQQFxRQ0CIAErABAiESADKwAQIhJjDQIgESASZA0BIAErABgiESADKwAYIhJjDQIgESASZCECCyACDQIgAS0AVCECIAMtAFRBAXEEQCACQQFxRQ0CIAErADgiESADKwA4IhJjDQIgESASZA0BIAErAEAiESADKwBAIhJjDQIgESASZCECCyACDQIgBygCECgCpAFBwAFxIgEgACgCECgCpAFBwAFxIgJJDQEgASACSw0AQX8hAiAHKAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAFQbAEaiQAIAILQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwv0AgEJfyMAQRBrIgYkACAAKAIwIQEjAEEQayIDJAADQAJAQQAhByACIAEoAgBPDQADQCACQQV0IgUgASgCBGoiCEEIaiEEIAgoABAgB00EQCAEQQQQMSABKAIEIAVqQQhqEDQgAkEBaiECDAMFIAMgBCkCCDcDCCADIAQpAgA3AwAgAyAHEBkhBAJAAkACQCABKAIEIAVqIgUoAhgiCA4CAgABCyAFKAIIIARBAnRqKAIAEBgMAQsgBSgCCCAEQQJ0aigCACAIEQEACyAHQQFqIQcMAQsACwALCyABKAIEEBggARAYIANBEGokACAAQRhqIQEDQCAAKAAgIAlLBEAgBiABKQIINwMIIAYgASkCADcDACAGIAkQGSECAkACQAJAIAAoAigiAw4CAgABCyABKAIAIAJBAnRqKAIAEBgMAQsgASgCACACQQJ0aigCACADEQEACyAJQQFqIQkMAQsLIAFBBBAxIAEQNCAAEBggBkEQaiQACxsBAnxBfyAAKwMAIgIgASsDACIDZCACIANjGwsPACAAKAIQEJkBGiAAEBgLIAECfEEBQX9BACAAKwMAIgIgASsDACIDYxsgAiADZBsLWgIBfAF/QX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsLC1oCAXwBf0F/IAArAwAgASsDAKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbIgMEfyADBUF/IAArAwggASsDCKEiAkRIr7ya8td6PmQgAkRIr7ya8td6vmMbCwuTAQEFfyMAQRBrIgIkACAAQQRqIQEDQCADIAAoAgxPRQRAIAIgASkCCDcDCCACIAEpAgA3AwAgAiADEBkhBAJAAkACQCAAKAIUIgUOAgIAAQsgASgCACAEQQJ0aigCABAYDAELIAEoAgAgBEECdGooAgAgBREBAAsgA0EBaiEDDAELCyABQQQQMSABEDQgAkEQaiQACyUAIAAoAgAoAhAoAvgBIgAgASgCACgCECgC+AEiAUogACABSGsLEgAgAUHatgEgAigCCEEBEDYaCxIAIAFB6bYBIAIoAgRBARA2GgsSACABQcq2ASACKAIAQQEQNhoLGQBBfyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLIwAgACgCECgCAEEEdiIAIAEoAhAoAgBBBHYiAUsgACABSWsLlQEBBH8jAEEQayIBJAAgAARAA0AgACgACCACTQRAIABBBBAxIAAQNAUgASAAKQIINwMIIAEgACkCADcDACABIAIQGSEDAkACQAJAIAAoAhAiBA4CAgABCyAAKAIAIANBAnRqKAIAEBgMAQsgACgCACADQQJ0aigCACAEEQEACyACQQFqIQIMAQsLCyAAEBggAUEQaiQACxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABBivwEIANBIGoQHiACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQbH5BCADEB4gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOAATkDkAEgBCAEKwOIATkDeCADBEBBACECIABBpssDQQAQHgNAIAJBBEZFBEAgBCAEQeAAaiACQQR0aiIDKwMAOQNQIAQgAysDCDkDWCAAQd7JAyAEQdAAahAeIAJBAWohAgwBCwsgBCAFOQNIIAQgBjkDQCAAQd7JAyAEQUBrEB4gBCABKAIINgI0IARBBDYCMCAAQbn5AyAEQTBqEB4LQQAhAiAAQabLA0EAEB4DQCACQQRGRQRAIAQgBEHgAGogAkEEdGoiAysDADkDICAEIAMrAwg5AyggAEHeyQMgBEEgahAeIAJBAWohAgwBCwsgBCAFOQMYIAQgBjkDECAAQd7JAyAEQRBqEB4gBCABKAIINgIEIARBBDYCACAAQdr5AyAEEB4LIARBoAFqJAAPC0HEvwFBqr0BQc8BQci/ARAAAAtBrCZBqr0BQdABQci/ARAAAAtB7pgBQaq9AUHRAUHIvwEQAAAL/gEBBX8gACgCRCEEIAAoAkghASMAQRBrIgMkACADQQA2AgwCQCABQQACf0HYggsoAgAiAARAIANBDGohAgNAIAAgBCAAKAIARg0CGiACBEAgAiAANgIACyAAKAIkIgANAAsLQQALIgAbRQRAQWQhAQwBCyABIAAoAgRHBEBBZCEBDAELIAAoAiQhAgJAIAMoAgwiBQRAIAUgAjYCJAwBC0HYggsgAjYCAAsgACgCECICQSBxRQRAIAQgASAAKAIgIAIgACgCDCAAKQMYEA0aCyAAKAIIBEAgACgCABAYC0EAIQEgAC0AEEEgcQ0AIAAQGAsgA0EQaiQAIAEQ5AMaC4gEAgR/AnwjAEGAAWsiAyQAAkACQCAABEAgAUUNASABKAIIRQ0CAkACQCABKAJEBEAgASgCTCIEQZMDRg0BIAEgBBEBACABQQA2AkwgAUIANwJECyABEOsJRQ0BIAEoAhQQ6gshBgJAIAEoAhhBfnFBBkYEQCAGIANBIGoQ6AsgASADKAI4IgQ2AkgCfyAEQf////8HTwRAQfyAC0EwNgIAQX8MAQtBQQJ/AkAgBEEBQQIgBkIAQSgQTyIFQQhqIAUQDCIHQQBOBEAgBSAGNgIMDAELIAUQGCAHDAELIAVBATYCICAFQgA3AxggBUECNgIQIAUgBDYCBCAFQdiCCygCADYCJEHYggsgBTYCACAFKAIACyIEIARBQUYbEOQDCyEEIAFBAToAECABIARBACAEQX9HGyIENgJEDAELIAEoAkQhBAsgBARAIAFBkwM2AkwLIAEQzQYgASgCREUNAQsgASsDICEIIAIrAwAhCSADIAIrAwggASsDKKE5AxggAyAJIAihOQMQIABBq5QEIANBEGoQHgJAIAEtABBBAUYEQCAAIAEQ7QkMAQsgAyABKAIMNgIAIABBvcAEIAMQHgsgAEHurwRBABAeCyADQYABaiQADwtBxL8BQaq9AUGSAUGxKhAAAAtBrCZBqr0BQZMBQbEqEAAAC0HumAFBqr0BQZQBQbEqEAAAC4ACACMAQRBrIgIkAAJAAkACQAJAIAAEQCAAKAIQIgNFDQEgAUUNAiABKAIIRQ0DIAMoAghFDQQgAEGy2ANBABAeIABBu9gDQQAQHiAAQZnYA0EAEB4gAEHr2QRBABAeIABB0dwEQQAQHiAAQbzQA0EAEB4gAiABKAIINgIAIABBldADIAIQHiAAQb7QA0EAEB4gAEGW2ANBABAeIAJBEGokAA8LQcS/AUGqvQFB8gBB7O0AEAAAC0Gf9QBBqr0BQfMAQeztABAAAAtBrCZBqr0BQfQAQeztABAAAAtB7pgBQaq9AUH1AEHs7QAQAAALQfLqAEGqvQFB9wBB7O0AEAAAC8UCAQR8IwBBoAFrIgMkAAJAAkAgAARAIAFFDQEgASgCCCIBRQ0CIAMgATYCnAEgA0EANgKYASADQoCAgIDQADcDkAEgA0IANwOIASADQgA3A4ABIANCADcDeCADQQA2AnAgA0KBgICAcDcDaCADQoCAgIBwNwNgIANCADcDWCADQoKAgIDQADcDUCAAQdX9AyADQdAAahAeIAIrAxghBSACKwMQIQYgAisDACEEIAMgAisDCCIHOQNIIANBQGsgBDkDACADIAc5AzggAyAGOQMwIAMgBTkDKCADIAY5AyAgAyAFOQMYIAMgBDkDECADIAc5AwggAyAEOQMAIABB1qcEIAMQHiADQaABaiQADwtBxL8BQaq9AUHcAEG3gQEQAAALQawmQaq9AUHdAEG3gQEQAAALQe6YAUGqvQFB3gBBt4EBEAAAC84CAQR8IwBB4ABrIgMkAAJAAkAgAARAIAFFDQEgASgCCEUNAiACKwMIIQQgAisDGCEFIAIrAxAiBiACKwMAIgegIAYgB6EiB6FEAAAAAAAA4D+iIQYgAEGbxAMQGxogACABKAIIEBsaIAUgBKAgBSAEoSIFoEQAAAAAAADgv6IhBAJAIAAoAugCBEAgAyAEOQNYIAMgBjkDUCADIAc5A0ggAyAFOQNAIABB8rkDIANBQGsQHiAAKALoAiEBIAMgBDkDMCADIAY5AyggAyABNgIgIABB/8UDIANBIGoQHgwBCyADIAQ5AxggAyAGOQMQIAMgBTkDCCADIAc5AwAgAEGjuQMgAxAeCyAAQc3UBBAbGiADQeAAaiQADwtBxL8BQaq9AUEwQe78ABAAAAtBrCZBqr0BQTFB7vwAEAAAC0HumAFBqr0BQTJB7vwAEAAACyUBAX8jAEEQayICJAAgAiABNgIAIABB2v4DIAIQHiACQRBqJAALkgMCBH8EfCMAQcABayIDJAAgAEGvsAQQGxpB9PwKQfD8CigCAEEGazYCACADQZgBaiIFIAAoAhBBEGpBKBAfGiAFQwAAAAAQvAMhBSADIAI2ApQBIANBzJcBNgKQASAAQYrqBCADQZABahAeA0AgAiAERgRAIABBntwEEBsaIAArA+gDIQcgACsD8AMhCCADQoCAgICAgID4PzcDYCADIAg5A1ggAyAHOQNQIABBq9MEIANB0ABqEB4gA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgAEGH0wQgA0EwahAeIANB9PwKKAIANgIgIANCADcDECADQgA3AxggAEGm1AQgA0EQahAeIAMgBTYCACAAQcDOAyADEB4gBRAYIANBwAFqJAAFIAEgBEEEdGoiBisDACEHIAYrAwghCCAAKwP4AyEJIAArA4AEIQogAyAAKAIQKwOgATkDiAEgA0IANwOAASADIAggCqA5A3ggAyAHIAmgOQNwIABBkKYEIANB8ABqEB4gBEEBaiEEDAELCwu9BAIEfwR8IwBBgAJrIgQkACAAQa+JBBAbGkEAIQNB9PwKQfD8CigCAEEEazYCACAEQcgBaiIFIAAoAhBBOGpBKBAfGiAFQwAAAAAQvAMhByAEQgA3A/gBIARB2pcBNgLAASAEIAJBAmo2AsQBIARCADcD8AEgBEHwAWpBiuoEIARBwAFqEHQDQCACIANHBEAgASADQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQO4ASAEQgA3A7ABIAQgCSALoDkDqAEgBCAIIAqgOQOgASAEQfABakGQpgQgBEGgAWoQdCADQQFqIQUgAwRAIAUiAyACRw0CCyAAKwP4AyEIIAYrAwAhCSAAKwOABCEKIAYrAwghCyAEIAAoAhArA6ABOQOYASAEQgA3A5ABIAQgCyAKoDkDiAEgBCAJIAigOQOAASAEQfABakGQpgQgBEGAAWoQdCAFIQMMAQsLIAQgBEHwAWoiARD/BTYCcCAAQZjcBCAEQfAAahAeIAArA+gDIQggACsD8AMhCSAEQoCAgICAgID4PzcDYCAEIAk5A1ggBCAIOQNQIABBq9MEIARB0ABqEB4gBEFAayAAKALoArK7OQMAIARCADcDOCAEQgA3AzAgAEGH0wQgBEEwahAeIARB9PwKKAIAQQJrNgIgIARCADcDECAEQgA3AxggAEGm1AQgBEEQahAeIAQgBzYCACAAQcDOAyAEEB4gBxAYIAEQXCAEQYACaiQAC9YGAgR/BHwjAEGgA2siBCQAIABBkI0EEBsaQfT8CkHw/AooAgBBAms2AgAgBEH4AmoiBiAAKAIQQRBqQSgQHxogBkMAAAAAELwDIQYgBCACQQFqNgL0AiAEQcyXATYC8AIgAEGK6gQgBEHwAmoQHgNAIAIgBUYEQAJAIAArA/gDIQggASsDACEJIAArA4AEIQogASsDCCELIAQgACgCECsDoAE5A8gCIARCADcDwAIgBCALIAqgOQO4AiAEIAkgCKA5A7ACIABBkKYEIARBsAJqEB4gAEGy3AQQGxogACsD6AMhCCAAKwPwAyEJIARCgICAgICAgPg/NwOgAiAEIAk5A5gCIAQgCDkDkAIgAEGr0wQgBEGQAmoQHiAEIAAoAugCsrs5A4ACIARCADcD+AEgBEIANwPwASAAQYfTBCAEQfABahAeQQAhBSAEQfT8CigCAEECazYC4AEgBEIANwPQASAEQgA3A9gBIABBptQEIARB0AFqEB4gBCAGNgLAASAAQcDOAyAEQcABahAeIAYQGCADRQ0AIARBmAFqIgMgACgCEEE4akEoEB8aIANDAACAPhC8AyEDIAQgAjYCkAEgAEH66QQgBEGQAWoQHgNAIAIgBUYEQCAAQbbOAxAbGiAAKwPoAyEIIAArA/ADIQkgBEKAgICAgICA+D83A2AgBCAJOQNYIAQgCDkDUCAAQavTBCAEQdAAahAeIARBQGsgACgC6AKyuzkDACAEQgA3AzggBEIANwMwIABBh9MEIARBMGoQHiAEQfT8CigCAEECazYCICAEQgA3AxAgBEIANwMYIABBptQEIARBEGoQHiAEIAM2AgAgAEHAzgMgBBAeIAMQGAUgASAFQQR0aiIGKwMAIQggBisDCCEJIAArA/gDIQogACsDgAQhCyAEQgA3A4ABIAQgCSALoDkDeCAEIAggCqA5A3AgAEGZ3wEgBEHwAGoQHiAFQQFqIQUMAQsLCwUgASAFQQR0aiIHKwMAIQggBysDCCEJIAArA/gDIQogACsDgAQhCyAEIAAoAhArA6ABOQPoAiAEQgA3A+ACIAQgCSALoDkD2AIgBCAIIAqgOQPQAiAAQZCmBCAEQdACahAeIAVBAWohBQwBCwsgBEGgA2okAAupBQICfwl8IwBB8AJrIgMkACAAQe2uBBAbGkH0/ApB8PwKKAIAQQZrNgIAIAArA4AEIQwgACsD+AMhDSAAKAIQIgQrA6ABIQUgACsD6AMhBiABKwMAIQcgASsDECEIIAArA/ADIQogASsDCCELIAErAxghCSADQbgCaiIBIARBEGpBKBAfGiABQwAAAAAQvAMhASADQgA3A+gCIANCgICAgICAgPg/NwOgAiADQgA3A+ACIAMgBSAGIAggB6GiIgUgCiAJIAuhoiIIoCIJo0QAAAAAAADgP6JEAAAAAAAAFECiOQOoAiADQeACaiIEQfylBCADQaACahB0IAMgCDkDkAIgAyAJRAAAAAAAANA/ojkDiAIgAyAFOQOAAiAEQavTBCADQYACahB0IAMgACgC6AKyuzkD8AEgA0IANwPoASADQoCAgICAgKCrwAA3A+ABIARBh9MEIANB4AFqEHQgA0H0/AooAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEGm1AQgA0HAAWoQdCADIAE2ArABIARBwM4DIANBsAFqEHQgACAEEP8FEBsaIAEQGCACBEAgA0GIAWoiASAAKAIQQThqQSgQHxogAUMAAAAAELwDIQEgA0IANwOAASADQgA3A3ggA0IANwNwIABBs90EIANB8ABqEB4gA0KAgICAgICA+D83A2AgAyAIOQNYIAMgBTkDUCAAQavTBCADQdAAahAeIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIABBh9MEIANBMGoQHiADQfT8CigCADYCICADIAY5AxAgAyAHOQMYIABBptQEIANBEGoQHiADIAE2AgAgAEHAzgMgAxAeIAEQGAsgA0HgAmoQXCADQfACaiQAC+gDAgN/BnwjAEHQAWsiAyQAIAIoAgAhBCACKAIEIgUrAxAhBiADIAUoAgA2ArABIAMgBjkDqAEgAyAENgKgASAAQY/+AyADQaABahAeQfT8CkHw/AooAgBBCWs2AgACfCABKwMAIgYgAi0AMCIEQewARg0AGiAEQfIARgRAIAYgAisDIKEMAQsgBiACKwMgRAAAAAAAAOC/oqALIQYgACsD8AMhByAAKwOABCEIIAErAwghCSAAKwPoAyEKIAArA/gDIQsgA0H4AGoiASAAKAIQQRBqQSgQHxogAUMAAAAAELwDIQEgA0IANwPIASADQgA3A8ABIAIoAgQoAgAhBCACKAIAIQUgA0IANwNwIANCgICAgICAgOg/NwNoIAMgBTYCZCADIAQ2AmAgA0HAAWoiBEGX3AMgA0HgAGoQdCADIAIoAgQrAxAgACsD6AOiOQNQIARB7KUEIANB0ABqEHQgA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgBEGH0wQgA0EwahB0IANB9PwKKAIANgIgIAMgCiAGIAugojkDECADIAcgCSAIoKI5AxggBEGm1AQgA0EQahB0IAMgATYCACAEQcDOAyADEHQgACAEEP8FEBsaIAQQXCABEBggA0HQAWokAAscACAAQYmyBBAbGkHw/ApB8PwKKAIAQQVqNgIACxwAIABB97EEEBsaQfD8CkHw/AooAgBBBWs2AgALCwAgAEGitAQQGxoLLQEBfyMAQRBrIgEkACABIAAoAhAoAggQITYCACAAQZyBBCABEB4gAUEQaiQACwsAIABB84cEEBsaCxwAIABB3ocEEBsaQfD8CkHw/AooAgBBAms2AgALCwAgAEHYswQQGxoLCwAgAEHGswQQGxoLpgICB38BfiMAQTBrIgQkACAEQQxqQQBBJBA4GiAEIAE2AhwgACABEG4hAgNAIAIEQCAAIAIgARByIAAgAkEAEM4IIQIMAQsLIAEpAwghCkEAIQFBACEDAkAgACgCMCICBEAgCqchBSACKAIAIgYEQEEBIAIoAgh0IQMLIANBAWshBwNAIAEgA0YNAgJAAkAgBiABIAVq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b3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAbGlzdC0+c2l6ZSA8IGxpc3QtPmNhcGFjaXR5AHJldC5zaXplIDwgcmV0LmNhcGFjaXR5AGZhbnRhc3kAL3N2Zy9pdm9yeQBvdXQgb2YgbWVtb3J5AEZlYnJ1YXJ5AEphbnVhcnkAZ3ZwbHVnaW5fZG90X2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9uZWF0b19sYXlvdXRfTFRYX2xpYnJhcnkAZ3ZwbHVnaW5fY29yZV9MVFhfbGlicmFyeQBnYXRoZXJfdGltZV9lbnRyb3B5AGNvcHkAYWxiYW55AEp1bHkAU3BhcnNlTWF0cml4X211bHRpcGx5AGVxdWFsbHkAYXNzZW1ibHkAc3VtbWVyc2t5AHNoeQBzYXRpc2Z5AGJlYXV0aWZ5AG5vanVzdGlmeQBDbGFzc2lmeQAvc3ZnL2xpZ2h0Z3JleQAvc3ZnL2RpbWdyZXkAL3N2Zy9kYXJrZ3JleQAvc3ZnL2xpZ2h0c2xhdGVncmV5AC9zdmcvZGFya3NsYXRlZ3JleQAvc3ZnL3NsYXRlZ3JleQB3ZWJncmV5AHgxMWdyZXkAL3N2Zy9ncmV5AG1vdmUgdG8gZnJvbnQgbG9jayBpbmNvbnNpc3RlbmN5AGV4dHJhY3RfYWRqYWNlbmN5AG1lcmdlX29uZXdheQBhcnJheQBhbGxvY0FycmF5AC9zdmcvbGlnaHRncmF5AC9zdmcvZGltZ3JheQAvc3ZnL2RhcmtncmF5AC9zdmcvbGlnaHRzbGF0ZWdyYXkAL3N2Zy9kYXJrc2xhdGVncmF5AC9zdmcvc2xhdGVncmF5AHdlYmdyYXkAeDExZ3JheQAvc3ZnL2dyYXkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5AC4uLy4uL2xpYi9jZ3JhcGgvZ3JhbW1hci55ACVtLyVkLyV5AHBvcnRob3l4AHBvcnRob195eAB4eHgAcHgAYm94AHZpZXdCb3gAY2hrQm91bmRCb3gAL01lZGlhQm94AGdldF9lZGdlX2xhYmVsX21hdHJpeABpZGVhbF9kaXN0YW5jZV9tYXRyaXgAbXVzdCBub3QgdW5kZWNsYXJlIHByZWZpeAB1bmJvdW5kIHByZWZpeABodG1sbGV4AG1heAAjJTAyeCUwMnglMDJ4ACMlMnglMnglMnglMngAIyUxeCUxeCUxeAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AHJhcnJvdwBsYXJyb3cASGVsdmV0aWNhLU5hcnJvdwBhcnJvd19sZW5ndGhfY3JvdwAvc3ZnL3Nub3cAc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nX3Nsb3cAL3N2Zy9saWdodHllbGxvdwAvc3ZnL2dyZWVueWVsbG93AC9zdmcvbGlnaHRnb2xkZW5yb2R5ZWxsb3cAL3N2Zy95ZWxsb3cAZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdwBmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93AGNvdXJpZXJuZXcAU3ByaW5nU21vb3RoZXJfbmV3AFRyaWFuZ2xlU21vb3RoZXJfbmV3AGRpYWdfcHJlY29uX25ldwBRdWFkVHJlZV9uZXcAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXIyX25ldwBuICYmIG5ldwBza2V3AHN0cnZpZXcAL3N2Zy9ob25leWRldwAgLWFuY2hvciB3AHNvcnR2AHBvdjpwb3YATm92AGludgBlcXVpdgBwaXYAbm9uYW1lLmd2AEdEX3JhbmsoZylbcl0uYXYgPT0gR0RfcmFuayhnKVtyXS52AGNjJXNfJXp1AGNjJXMrJXp1AC9zdmcvcGVydQBudQBtdQAlYyVsbHUAVGh1AHRhdQBUYXUATnUATXUAX3BvcnRfJXNfKCVkKV8oJWQpXyV1AE51bWJlciBvZiBpdGVyYXRpb25zID0gJXUATnVtYmVyIG9mIGluY3JlYXNlcyA9ICV1AHBsYWludGV4dABzdHJlc3N3dABpbnB1dAB0ZXh0bGF5b3V0AGRvdF9sYXlvdXQAbmVhdG9fbGF5b3V0AGluaXRMYXlvdXQAY2x1c3QAbWFwQ2x1c3QAbGFiZWxqdXN0AHNjQWRqdXN0AEF1Z3VzdABlZGdlc2ZpcnN0AG5vZGVzZmlyc3QAbWF4aW1hbF9pbmRlcGVuZGVudF9lZGdlX3NldF9oZWF2ZXN0X2VkZ2VfcGVybm9kZV9zdXBlcm5vZGVzX2ZpcnN0AGV4aXN0AHJlYWxpZ25Ob2RlbGlzdABhcHBlbmROb2RlbGlzdABzbG90X2Zyb21fY29uc3RfbGlzdABzbG90X2Zyb21fbGlzdABkZWZhdWx0ZGlzdABtaW5kaXN0AHBvd2VyX2Rpc3QAZ3JhcGhfZGlzdABhdmdfZGlzdABnZXRFZGdlTGlzdABpcXVlc3QAbG93YXN0AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19mYXN0AGd2X3NvcnQAdmlld3BvcnQAdGFpbHBvcnQAdW5leHBlY3RlZCBwYXJzZXIgc3RhdGUgLSBwbGVhc2Ugc2VuZCBhIGJ1ZyByZXBvcnQAaGVhZHBvcnQAaHRtbF9wb3J0AGluc2VydABSVHJlZUluc2VydABmaW5kU1ZlcnQAc3RhcnQAcGFydABlc3RpbWF0ZV90ZXh0X3dpZHRoXzFwdABxdW90AH9yb290AG5vdABtYWtlX3ZuX3Nsb3QAZW1pdF94ZG90AHhkb3Q6eGRvdABlcHM6eGRvdABzdmc6eGRvdABqcGc6eGRvdABwbmc6eGRvdABqcGVnOnhkb3QAZ2lmOnhkb3QAanBlOnhkb3QAeGRvdDEuNDp4ZG90AHhkb3QxLjI6eGRvdABzZG90AG1pZGRvdABndjpkb3QAcGxhaW4tZXh0OmRvdABkb3Q6ZG90AGVwczpkb3QAY2Fub246ZG90AHBsYWluOmRvdABzdmc6ZG90AGpwZzpkb3QAcG5nOmRvdABqcGVnOmRvdABnaWY6ZG90AGpwZTpkb3QAf2JvdABkb0RvdABzcGFuLT5mb250AHZhZ3hicHJpbnQAZW5kcG9pbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGdldF9oYXNoX3NlY3JldF9zYWx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABndl9hcmVuYV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAc2NhcmxldAAvc3ZnL2Rhcmt2aW9sZXQAL3N2Zy9ibHVldmlvbGV0AC9zdmcvdmlvbGV0AFRyZWJ1Y2hldABhZ3hnZXQAdGFpbHRhcmdldABsYWJlbHRhcmdldABlZGdldGFyZ2V0AGhlYWR0YXJnZXQAYml0YXJyYXlfZ2V0AHN0eWxlc2hlZXQAc3RyaWN0AGFnY29weWRpY3QAYWdtYWtlZGF0YWRpY3QAcmVjLT5kaWN0ID09IGRhdGFkaWN0AHdyaXRlX2RpY3QAaGludGVyc2VjdABndmJpc2VjdABlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdABhc3BlY3QAbGF5ZXJzZWxlY3QAS1BfU3VidHJhY3QAUXVhZFRyZWVfcmVwdWxzaXZlX2ZvcmNlX2ludGVyYWN0AGNvbXBhY3QAT2N0AHJlcXVlc3RlZCBmZWF0dXJlIHJlcXVpcmVzIFhNTF9EVEQgc3VwcG9ydCBpbiBFeHBhdABsYWJlbGZsb2F0AGxhYmVsX2Zsb2F0AFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfZm9ybWF0AC9zdmcvd2hlYXQAbW9uY2hhaW5zX2F0AFNhdABBZ3JhcGhpbmZvX3QAQWdlZGdlaW5mb190AEFnbm9kZWluZm9fdABcdAByb3cgPCBtZS0+bnJvd3MAbWludXMAb3BsdXMAcmFkaXVzAGhlYXJ0cwBzYW1wbGVwb2ludHMAZGlyZWRnZWNvbnN0cmFpbnRzAGxldmVsIGFzc2lnbm1lbnQgY29uc3RyYWludHMAeHkgcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggcHNldWRvLW9ydGhvZ29uYWwgY29uc3RyYWludHMAeHkgb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAGxpbmUgc2VnbWVudHMAc2V0X2NlbGxfaGVpZ2h0cwByZWN0cwBhY2NvdW50aW5nUmVwb3J0U3RhdHMAZW50aXR5VHJhY2tpbmdSZXBvcnRTdGF0cwBaYXBmRGluZ2JhdHMAcmVtaW5jcm9zcwBjb21wcmVzcwBndnVzZXJzaGFwZV9maWxlX2FjY2VzcwBicmFzcwBjbGFzcwBhcHBseWF0dHJzAGFnbWFrZWF0dHJzAGJpbmRhdHRycwBwYXJzZV9sYXllcnMAbWtDbHVzdGVycwByb3VuZF9jb3JuZXJzAG1ha2VfYmFycmllcnMAY2RhdGEubnRvcGxldmVsID09IGFnbm5vZGVzKGcpIC0gY2RhdGEubnZhcnMAY2Fubm90IHJlYWxsb2Mgb3BzAGNhbm5vdCByZWFsbG9jIHBubHBzAGVwcwBjb3JlX2xvYWRpbWFnZV9wcwBlcHM6cHMAcHMyOnBzAChsaWIpOnBzAGd2X3RyaW1femVyb3MAYWd4YnVmX3RyaW1femVyb3MAdGV4Z3lyZWhlcm9zAGltYWdlcG9zAHRpbm9zAHNldEVkZ2VMYWJlbFBvcwBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zAHhsaW50ZXJzZWN0aW9ucwBjb2x1bW5zAGRlamF2dXNhbnMAbmltYnVzc2FucwBsaWJlcmF0aW9uc2FucwBmcmVlc2FucwBzZXRDaGlsZFN1YnRyZWVTcGFucwBPcGVuU2FucwBvZmZzZXQgPT0gbl90ZXJtcwBkaXRlbXMAZGlhbXMAY29sIDwgbWUtPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACVzJXMAZXhwYXQ6IEFjY291bnRpbmcoJXApOiBEaXJlY3QgJTEwbGx1LCBpbmRpcmVjdCAlMTBsbHUsIGFtcGxpZmljYXRpb24gJTguMmYlcwAlLipzJWMlcwAgJXM6JXMAX18lZDolcwAvJXMvJXMAJXMtJXMALCVzACBmb250LWZhbWlseT0iJXMAIiBzdHJva2UtZGFzaGFycmF5PSIlcwAiIGNsYXNzPSIlcwBwb2x5ICVzACgoJWYsJWYpLCglZiwlZikpICVzICVzAGNvbG9yICVzAHJvb3QgPSAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAZnN0cgBzdHJ2aWV3X3N0cgBwb3ZfY29sb3JfYXNfc3RyAHZwc2MhPW51bGxwdHIAYmVuZFRvU3RyAHVhcnIAY3JhcnIAbGFycgBoYXJyAGRhcnIAdUFycgByQXJyAGxBcnIAaEFycgBkQXJyAEFwcgBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfdmVjdG9yAHRlcm1pbmF0b3IAaW5zdWxhdG9yAGludGVybmFsRW50aXR5UHJvY2Vzc29yAHRleGd5cmVjdXJzb3IAc3ludGF4IGVycm9yAG1vbmV5X2dldCBlcnJvcgBFcnJvcgByZmxvb3IAbGZsb29yAGxhYmVsZm9udGNvbG9yAHBlbmNvbG9yAGZpbGxjb2xvcgBiZ2NvbG9yAHJvdyBtYWpvcgBjb2x1bW4gbWFqb3IAbmVpZ2hib3IAc3R5bGVfb3IAbXIAcmFua2RpcgBwYWdlZGlyAGxheWVyAHVwcGVyID49IGxvd2VyAE5vZGVDb3ZlcgAvc3ZnL3NpbHZlcgBjbHVzdGVyAGV4cGFuZENsdXN0ZXIAcnByb21vdGVyAGxwcm9tb3RlcgBjZW50ZXIAbWF4aXRlcgBwYXJ0aWFsIGNoYXJhY3RlcgAhIHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyAGRrZ3JlZW5jb3BwZXIAY29vbGNvcHBlcgBndl9zb3J0X2NvbXBhcl93cmFwcGVyAHRhcGVyAG92ZXJsYXBfYmV6aWVyAGZpZ19iZXppZXIAY291cmllcgBDb3VyaWVyAGhpZXIAZGFnZ2VyAERhZ2dlcgBvdXRwdXRvcmRlcgBwb3N0b3JkZXIAZmxhdF9yZW9yZGVyAGNlbGxib3JkZXIAZml4TGFiZWxPcmRlcgBjeWxpbmRlcgAvc3ZnL2xhdmVuZGVyAHJlbmRlcgBmb2xkZXIAY2x1c3Rlcl9sZWFkZXIATkRfVUZfc2l6ZShuKSA8PSAxIHx8IG4gPT0gbGVhZGVyAE9jdG9iZXIAcmVmZXJlbmNlIHRvIGludmFsaWQgY2hhcmFjdGVyIG51bWJlcgBOb3ZlbWJlcgBTZXB0ZW1iZXIARGVjZW1iZXIAbWFjcgBicgBzdGFyAGZlbGRzcGFyAHJlZ3VsYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBuemMgPT0gKHNpemVfdCluAHMsJWxmLCVsZiVuACBlLCVsZiwlbGYlbgAlZCAlMVsiXSVuAHYgPT0gbgBiID09IG4AbmNsdXN0ZXIgPD0gbgBwc3ltAGFsZWZzeW0AdGhldGFzeW0AcXVhbnR1bQBzdW0AL3N2Zy9wbHVtAGludnRyYXBleml1bQBtZWRpdW0AOTpwcmlzbQBscm0AY3VzdG9tAGFwdHItPnRhZyA9PSBUX2F0b20AL2Rldi91cmFuZG9tAGd2X3JhbmRvbQBtbQBybG0Ac2ltAElNRFNfZ2l2ZW5fZGltAG9yZG0AY20AcGFyYWxsZWxvZ3JhbQAvc3ZnL21pbnRjcmVhbQBKdWwAdGwAZnJhc2wAU3ltYm9sAGZpbmRDb2wAPD94bWwAeXVtbAB1dW1sAG91bWwAaXVtbABldW1sAGF1bWwAWXVtbABVdW1sAE91bWwASXVtbABFdW1sAEF1bWwAY29yZV9sb2FkaW1hZ2VfdnJtbABqcGc6dnJtbABwbmc6dnJtbABqcGVnOnZybWwAZ2lmOnZybWwAanBlOnZybWwAYnVsbABmaWxsAC9zdmcvc2Vhc2hlbGwAZm9yYWxsAEFwcmlsAHBlcm1pbAByY2VpbABsY2VpbABjY2VkaWwAQ2NlZGlsAGFycm93dGFpbABsdGFpbABzYW1ldGFpbABsZXZlbCA+PSAwICYmIGxldmVsIDw9IG4tPmxldmVsAHN0cmVzc19tYWpvcml6YXRpb25fa0RfbWtlcm5lbABpc19wYXJhbGxlbABDYWxjdWxhdGluZyBjaXJjdWl0IG1vZGVsAENhbGN1bGF0aW5nIHN1YnNldCBtb2RlbABDYWxjdWxhdGluZyBNRFMgbW9kZWwAeGxhYmVsAHRhaWxsYWJlbABoZWFkbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkATl9JRFgocHEtPnBxW2ldKSA9PSBpAFN0cmVzc01ham9yaXphdGlvblNtb290aGVyX3Ntb290aABTcHJpbmdTbW9vdGhlcl9zbW9vdGgAYm90aABzdGFydHN3aXRoAGxpbmVsZW5ndGgAYmFkX2FycmF5X25ld19sZW5ndGgAYXZlcmFnZV9lZGdlX2xlbmd0aABldGgAcGVud2lkdGgAbHdpZHRoAHNldGxpbmV3aWR0aABzaG9ydHBhdGgAZm9udHBhdGgAUG9ic3BhdGgAYmVnaW5wYXRoAGltYWdlcGF0aABlbmRwYXRoAHN0cmFpZ2h0X3BhdGgAbWFwX3BhdGgAPHBhdGgAY2Fubm90IGZpbmQgdHJpYW5nbGUgcGF0aAAvc3ZnL2xhdmVuZGVyYmx1c2gAZmxlc2gAb3NsYXNoAE9zbGFzaABkdHN0cmhhc2gAc3RyZGljdF9oYXNoAG5kYXNoAG1kYXNoAGRpZ3JhcGgAc3ViZ3JhcGgAY29uc3RydWN0X2dyYXBoAGNoa1NncmFwaABjbG9zZXN0X3BhaXJzMmdyYXBoAGFnZGVsZXRlIG9uIHdyb25nIGdyYXBoAGNvbm5lY3RHcmFwaAB1cHNpaAAlc2xpbmUtdGhyb3VnaABjaGFuU2VhcmNoAFJUcmVlU2VhcmNoAE1hcmNoAERpc2NvbkJyYW5jaABQaWNrQnJhbmNoAEFkZEJyYW5jaAAuLi8uLi9saWIvdXRpbC9iaXRhcnJheS5oAC4uLy4uL2xpYi91dGlsL3N0cnZpZXcuaAAuLi8uLi9saWIvdXRpbC9zb3J0LmgALi4vLi4vbGliL2NncmFwaC9ub2RlX3NldC5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL3V0aWwvc3RhcnRzd2l0aC5oAC4uLy4uL2xpYi91dGlsL2d2X21hdGguaAAuLi8uLi9saWIvdXRpbC9hZ3hidWYuaAAuLi8uLi9saWIvdXRpbC90b2tlbml6ZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgAoWG1sQmlnQ291bnQpLTEgLSByb290UGFyc2VyLT5tX2FsbG9jX3RyYWNrZXIuYnl0ZXNBbGxvY2F0ZWQgPj0gYWJzRGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVfc2V0X3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBpbmRleCA8IGxpc3QtPnNpemUAY2FwYWNpdHkgPiBkaWN0LT5zaXplAGNhcGFjaXR5ID4gc2VsZi0+c2l6ZQBiei5zaXplAHBvaW50LXNpemUAU0laRV9NQVggLSBzaXplb2Yoc2l6ZV90KSAtIEVYUEFUX01BTExPQ19QQURESU5HID49IHNpemUAbm9ybWFsaXplAEVMaW5pdGlhbGl6ZQBta01hemUAaWN1cnZlAHRyeV9yZXNlcnZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAHlhY3V0ZQB1YWN1dGUAb2FjdXRlAGlhY3V0ZQBlYWN1dGUAYWFjdXRlAFlhY3V0ZQBVYWN1dGUAT2FjdXRlAElhY3V0ZQBFYWN1dGUAQWFjdXRlAHJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlAGR1cGxpY2F0ZSBhdHRyaWJ1dGUAbm90ZQBwcmltZXJzaXRlAHJpYm9zaXRlAHJlc3RyaWN0aW9uc2l0ZQBwcm90ZWFzZXNpdGUAL3N2Zy9naG9zdHdoaXRlAC9zdmcvbmF2YWpvd2hpdGUAL3N2Zy9mbG9yYWx3aGl0ZQAvc3ZnL2FudGlxdWV3aGl0ZQAvc3ZnL3doaXRlAFdoaXRlAHBvcF9vYmpfc3RhdGUAcGNwX3JvdGF0ZQBjb25jZW50cmF0ZQBkZWNvcmF0ZQBRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfYWNjdW11bGF0ZQBub3RyYW5zbGF0ZQAvc3ZnL2Nob2NvbGF0ZQBwYXJzZXJDcmVhdGUAZ2VvbVVwZGF0ZQBpbnZob3VzZQAvc3ZnL2NoYXJ0cmV1c2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGx1X2RlY29tcG9zZQBhZ2Nsb3NlAGVudGl0eVRyYWNraW5nT25DbG9zZQBTcGFyc2VNYXRyaXhfbXVsdGlwbHlfZGVuc2UAZmFsc2UAL3N2Zy9tZWRpdW10dXJxdW9pc2UAL3N2Zy9kYXJrdHVycXVvaXNlAC9zdmcvcGFsZXR1cnF1b2lzZQAvc3ZnL3R1cnF1b2lzZQBwaGFzZQBTSVpFX01BWCAtIHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBpbmNyZWFzZQBzbG90X2Zyb21fYmFzZQAvc3ZnL2F6dXJlAHNpZ25hdHVyZQBtb3JlX2NvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAcmVhbGx5cm91dGVzcGxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAGV4cGF0X2hlYXBfaW5jcmVhc2VfdG9sZXJhYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAZXhjaGFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAHBhdGNod29ya19pbml0X25vZGVfZWRnZQB0d29waV9pbml0X25vZGVfZWRnZQBtYWtlU3RyYWlnaHRFZGdlAG1ha2VTZWxmRWRnZQBtYWtlQ29tcG91bmRFZGdlACF1c2Vfc3RhZ2UAb3NhZ2UAcGFnZQBndmxvYWRpbWFnZQB2ZWUAdGVlAFFVQURfVFJFRV9IWUJSSUQsIHNpemUgbGFyZ2VyIHRoYW4gJWQsIHN3aXRjaCB0byBmYXN0IHF1YWR0cmVlAGZlYXNpYmxlX3RyZWUAbm9kZV9zZXRfZnJlZQBleHBhdF9mcmVlAGd2X2FyZW5hX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAHJvb3RQYXJzZXItPm1fYWxsb2NfdHJhY2tlci5ieXRlc0FsbG9jYXRlZCA+PSBieXRlc0FsbG9jYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemUgPT0gZnJlZWQAcm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgaG9yaXpvbnRhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABzcGxpbmUgWyUuMDNmLCAlLjAzZl0gLS0gWyUuMDNmLCAlLjAzZl0gaXMgdmVydGljYWw7IHdpbGwgYmUgdHJpdmlhbGx5IGJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAcGMAbGFiZWxsb2MAZXhwYXRfbWFsbG9jAGV4cGF0X3JlYWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAZ3ZfYXJlbmFfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwByb3V0ZXNwbGluZXM6ICVkIGVkZ2VzLCAlenUgYm94ZXMgJS4yZiBzZWMAOiAlLjJmIHNlYwBsaXN0ZGVscmVjAGxldmVsIGdyYXBoIHJlYwBsZXZlbCBlZGdlIHJlYwBsZXZlbCBub2RlIHJlYwBEZWMAX25lYXRvX2NjAGJjAHZpc2liaWxpdHkuYwBTcGFyc2VNYXRyaXguYwBodG1sbGV4LmMAaW5kZXguYwBzbWFydF9pbmlfeC5jAGd2cmVuZGVyX2NvcmVfcG92LmMAbHUuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAGd2cmVuZGVyX2NvcmVfZG90LmMAY29uc3RyYWludC5jAGRvdGluaXQuYwBuZWF0b2luaXQuYwBwYXRjaHdvcmtpbml0LmMAdHdvcGlpbml0LmMAb3NhZ2Vpbml0LmMAZW1pdC5jAGZsYXQuYwBhcnJvd3MuYwBtaW5jcm9zcy5jAHN0cmVzcy5jAHBvc3RfcHJvY2Vzcy5jAGNjb21wcy5jAG5zLmMAdXRpbHMuYwB4bGFiZWxzLmMAc2hhcGVzLmMAZG90c3BsaW5lcy5jAG5lYXRvc3BsaW5lcy5jAGNsdXN0ZXJlZGdlcy5jAGhlZGdlcy5jAGF0dHIuYwByZWZzdHIuYwBmYXN0Z3IuYwBjbHVzdGVyLmMAdGFwZXIuYwBndnJlbmRlci5jAHNwbGl0LnEuYwBjb21wLmMAZ3ZyZW5kZXJfY29yZV9tYXAuYwBoZWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2X2ZvcGVuLmMAdGV4dHNwYW4uYwBnZW9tLmMAcmFuZG9tLmMAcm91dGVzcGwuYwB4bWwuYwBNdWx0aWxldmVsLmMAc3ByaW5nX2VsZWN0cmljYWwuYwBndnJlbmRlcl9jb3JlX3RrLmMAcmFuay5jAHBhY2suYwBkdHN0cmhhc2guYwBncmFwaC5jAGd2cmVuZGVyX2NvcmVfc3ZnLmMAZ3ZyZW5kZXJfY29yZV9maWcuYwBzdHVmZi5jAG1hemUuYwBzcGFyc2Vfc29sdmUuYwByb3V0ZS5jAHdyaXRlLmMAY29seGxhdGUuYwB4bWxwYXJzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGFyZW5hLmMAZlBRLmMAY2xhc3MyLmMAJWxmLCVsZiwlbGYsJWxmJWMAJWxmLCVsZiwlbGYsJVteLF0lYwBcJWMAJGMAd2IAbnN1YgBzZXRoc2IAcmIAcHJvdGVjdF9yc3FiAGpvYgBjb3JlX2xvYWRpbWFnZV9wc2xpYgBGZWIAb2RiAGluaXRfc3BsaW5lc19iYgBiZXppZXJfYmIAcHJvdGVpbnN0YWIAcm5hc3RhYgAvc3ZnL29saXZlZHJhYgBcYgByd2EAL3N2Zy9hcXVhAGlvdGEASW90YQAvc3ZnL2RhcmttYWdlbnRhAC9zdmcvbWFnZW50YQBkZWx0YQBEZWx0YQB6ZXRhAHRoZXRhAFRoZXRhAGJldGEAWmV0YQBCZXRhAHByZXYgIT0gb2JqLT5kYXRhAG1ha2VHcmFwaERhdGEARXRhAG5pbWJ1c3NhbnNhAHBhcmEAa2FwcGEAS2FwcGEAL3N2Zy9zaWVubmEAVmVyZGFuYQBnYW1tYQBHYW1tYQBzaWdtYQBTaWdtYQBjb25zb2xhAG5hYmxhAC9zdmcvZnVjaHNpYQBHZW9yZ2lhAGFscGhhAEFscGhhAG9tZWdhAE9tZWdhAGFyZWEAbGFtYmRhAExhbWJkYQBoZWx2ZXRpY2EASGVsdmV0aWNhAG1pY2EAPjxhAGAAU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnlfAGd2X2xpc3RfY29weV8AX3RkcmF3XwBfdGxkcmF3XwBfaGxkcmF3XwBfbGRyYXdfAF9oZHJhd18AX2RyYXdfAGd2X2xpc3Rfc29ydF8AZ3ZfbGlzdF9hcHBlbmRfc2xvdF8AZ3ZfbGlzdF9wcmVwZW5kX3Nsb3RfAGd2X2xpc3RfcG9wX2Zyb250XwBndl9saXN0X3Nocmlua190b19maXRfAGFneHNldF8AZ3ZfbGlzdF9nZXRfAGRvdF9zcGxpbmVzXwAlc18AZ3ZfbGlzdF9jbGVhcl8AZ3ZfbGlzdF9wb3BfYmFja18AZ3ZfbGlzdF9kZXRhY2hfAGd2X2xpc3RfcmVtb3ZlXwBndl9saXN0X3JldmVyc2VfAGd2X2xpc3RfZnJlZV8AZ3ZfbGlzdF90cnlfYXBwZW5kXwBwYWdlJWQsJWRfAGd2X2xpc3Rfc3luY18AX2NjXwAgaWQ9ImFfAF4AU3RhcnRpbmcgcGhhc2UgMiBbZG90X21pbmNyb3NzXQBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dAG5fZWRnZXMgPT0gZ3JhcGgtPnNvdXJjZXNbZ3JhcGgtPm5dAFN0YXJ0aW5nIHBoYXNlIDEgW2RvdF9yYW5rXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAG5lZWRsZVtpXSAhPSBuZWVkbGVbal0AamFbbWFza1tqYVtqXV1dID09IGphW2pdAHEtPnF0c1tpaV0AIXJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS50YWtlbltpXQByLmJvdW5kYXJ5W2ldIDw9IHIuYm91bmRhcnlbTlVNRElNUyArIGldAFslLjAzZiwlLjAzZl0AW2ludGVybmFsIGhhcmQtY29kZWRdAG5wLT5jZWxsc1sxXQBucC0+Y2VsbHNbMF0AdXMtPm5hbWVbMF0AY3AtPnNyY1swXQBbLi5dAFxcACJwb2ludHMiOiBbACJzdG9wcyI6IFsACVsAWgBjb21wdXRlU2NhbGVYWQB5PD1ZACVhICViICVkICVIOiVNOiVTICVZAFBPU0lYAG56IDw9IElOVF9NQVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAExJU1RfU0laRSgmbGlzdCkgLSAxIDw9IElOVF9NQVgATElTVF9TSVpFKCZsYXllcklEcykgLSAxIDw9IElOVF9NQVgAc3RybGVuKGFyZ3MpIDw9IElOVF9NQVgATElTVF9TSVpFKCZvYmpsKSA8PSBJTlRfTUFYAExJU1RfU0laRSgmY3R4LT5UcmVlX2VkZ2UpIDw9IElOVF9NQVgAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA8PSBJTlRfTUFYAGkgPCBJTlRfTUFYAHJlc3VsdCA8PSAoaW50KVVDSEFSX01BWABzc3ogPD0gVUNIQVJfTUFYAGNvbCA+PSAwICYmIGNvbCA8PSBVSU5UMTZfTUFYAHg8PVgAVwBWAFUAXFQAVEVYVABTVFJFU1NfTUFKT1JJWkFUSU9OX1BPV0VSX0RJU1QAU1RSRVNTX01BSk9SSVpBVElPTl9HUkFQSF9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fQVZHX0RJU1QARkFTVABGT05UAGIgPT0gQl9SSUdIVABIRUlHSFQAQl9MRUZUAF8lbGx1X1NVU1BFQ1QAQlQAVHJlYnVjaGV0IE1TAElOVklTACVIOiVNOiVTAFZSAFRSAEEtPmZvcm1hdCA9PSBCLT5mb3JtYXQgJiYgQS0+Zm9ybWF0ID09IEZPUk1BVF9DU1IATFIARElSAEhSAENFTlRFUgAlJVRSQUlMRVIAQS0+dHlwZSA9PSBNQVRSSVhfVFlQRV9SRUFMIHx8IEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfSU5URUdFUgBDRUxMQk9SREVSAEJSACpSAFEARVhQAEJfVVAAU1VQAFRPUABPAG1hcE4AXE4AQl9ET1dOAFRIT1JOACUlQkVHSU4AUk9XU1BBTgBDT0xTUEFOAE5BTgBQTQBCT1RUT00AQk0AQU0AJUg6JU0AXEwAdGFpbFVSTABsYWJlbFVSTABlZGdlVVJMAGhlYWRVUkwASFRNTAB4IT1OVUxMAHJvb3RQYXJzZXItPm1fcGFyZW50UGFyc2VyID09IE5VTEwARURfdG9fdmlydChvcmlnKSA9PSBOVUxMAEVEX3RvX3ZpcnQoZSkgPT0gTlVMTABwcmVmaXggIT0gTlVMTABkdGQtPnNjYWZmSW5kZXggIT0gTlVMTABzbS0+THcgIT0gTlVMTABsdSAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAYWxsb2NhdG9yICE9IE5VTEwAcGFyc2VyICE9IE5VTEwAcm9vdFBhcnNlciAhPSBOVUxMAGxlYWRlciAhPSBOVUxMAGNtcCAhPSBOVUxMAGRhdGFwICE9IE5VTEwAaW50byAhPSBOVUxMAGl0ZW0gIT0gTlVMTABvcnRob2cgIT0gTlVMTABzZWxmICE9IE5VTEwAdmFsdWUgIT0gTlVMTABmaWxlbmFtZSAhPSBOVUxMAGpvYi0+b3V0cHV0X2ZpbGUgIT0gTlVMTABtb2RlICE9IE5VTEwAeGQgIT0gTlVMTABzbS0+THdkICE9IE5VTEwAam9iICE9IE5VTEwAc291cmNlLmRhdGEgIT0gTlVMTABiLmRhdGEgIT0gTlVMTABhLmRhdGEgIT0gTlVMTABhcmVuYSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBFWFBBVF9NQUxMT0NfREVCVUcAUk5HAFNQUklORwBDRUxMUEFERElORwBDRUxMU1BBQ0lORwBMQU5HAElNRwBceEYAJSVFT0YASU5GAFx4RkYAUklGRgBkZWx0YSA8PSAweEZGRkYAXHhFRgBceERGAFx4Q0YAXHhCRgBceEFGAFx4OUYAXHg4RgBceDdGAFx4MUYAXHhFAFxFAFBPSU5ULVNJWkUAVFJVRQBDTE9TRQBGQUxTRQBrZXkgIT0gVE9NQlNUT05FAHIgIT0gVE9NQlNUT05FAE5PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAMjAyNjAzMDMuMDQ1NABncmV5NDQAZ3JheTQ0AGdyZXkzNABncmF5MzQAZnJhYzM0AGdyZXkyNABncmF5MjQAZ3JleTE0AGdyYXkxNABceDE0AGZyYWMxNAAvcmRneTkvNAAvYnVwdTkvNAAvcmRwdTkvNAAvcHVidTkvNAAveWxnbmJ1OS80AC9nbmJ1OS80AC9yZHlsYnU5LzQAL3JkYnU5LzQAL2dyZXlzOS80AC9ncmVlbnM5LzQAL2JsdWVzOS80AC9wdXJwbGVzOS80AC9vcmFuZ2VzOS80AC9yZWRzOS80AC9wdW9yOS80AC95bG9yYnI5LzQAL3B1YnVnbjkvNAAvYnVnbjkvNAAvcHJnbjkvNAAvcmR5bGduOS80AC95bGduOS80AC9zcGVjdHJhbDkvNAAvcGl5ZzkvNAAvYnJiZzkvNAAvcHVyZDkvNAAveWxvcnJkOS80AC9vcnJkOS80AC9wYWlyZWQ5LzQAL3NldDM5LzQAL3NldDE5LzQAL3Bhc3RlbDE5LzQAL3JkZ3k4LzQAL2J1cHU4LzQAL3JkcHU4LzQAL3B1YnU4LzQAL3lsZ25idTgvNAAvZ25idTgvNAAvcmR5bGJ1OC80AC9yZGJ1OC80AC9hY2NlbnQ4LzQAL2dyZXlzOC80AC9ncmVlbnM4LzQAL2JsdWVzOC80AC9wdXJwbGVzOC80AC9vcmFuZ2VzOC80AC9yZWRzOC80AC9wdW9yOC80AC95bG9yYnI4LzQAL3B1YnVnbjgvNAAvYnVnbjgvNAAvcHJnbjgvNAAvcmR5bGduOC80AC95bGduOC80AC9zcGVjdHJhbDgvNAAvcGl5ZzgvNAAvYnJiZzgvNAAvcHVyZDgvNAAveWxvcnJkOC80AC9vcnJkOC80AC9wYWlyZWQ4LzQAL3NldDM4LzQAL3NldDI4LzQAL3Bhc3RlbDI4LzQAL2RhcmsyOC80AC9zZXQxOC80AC9wYXN0ZWwxOC80AC9yZGd5Ny80AC9idXB1Ny80AC9yZHB1Ny80AC9wdWJ1Ny80AC95bGduYnU3LzQAL2duYnU3LzQAL3JkeWxidTcvNAAvcmRidTcvNAAvYWNjZW50Ny80AC9ncmV5czcvNAAvZ3JlZW5zNy80AC9ibHVlczcvNAAvcHVycGxlczcvNAAvb3JhbmdlczcvNAAvcmVkczcvNAAvcHVvcjcvNAAveWxvcmJyNy80AC9wdWJ1Z243LzQAL2J1Z243LzQAL3ByZ243LzQAL3JkeWxnbjcvNAAveWxnbjcvNAAvc3BlY3RyYWw3LzQAL3BpeWc3LzQAL2JyYmc3LzQAL3B1cmQ3LzQAL3lsb3JyZDcvNAAvb3JyZDcvNAAvcGFpcmVkNy80AC9zZXQzNy80AC9zZXQyNy80AC9wYXN0ZWwyNy80AC9kYXJrMjcvNAAvc2V0MTcvNAAvcGFzdGVsMTcvNAAvcmRneTYvNAAvYnVwdTYvNAAvcmRwdTYvNAAvcHVidTYvNAAveWxnbmJ1Ni80AC9nbmJ1Ni80AC9yZHlsYnU2LzQAL3JkYnU2LzQAL2FjY2VudDYvNAAvZ3JleXM2LzQAL2dyZWVuczYvNAAvYmx1ZXM2LzQAL3B1cnBsZXM2LzQAL29yYW5nZXM2LzQAL3JlZHM2LzQAL3B1b3I2LzQAL3lsb3JicjYvNAAvcHVidWduNi80AC9idWduNi80AC9wcmduNi80AC9yZHlsZ242LzQAL3lsZ242LzQAL3NwZWN0cmFsNi80AC9waXlnNi80AC9icmJnNi80AC9wdXJkNi80AC95bG9ycmQ2LzQAL29ycmQ2LzQAL3BhaXJlZDYvNAAvc2V0MzYvNAAvc2V0MjYvNAAvcGFzdGVsMjYvNAAvZGFyazI2LzQAL3NldDE2LzQAL3Bhc3RlbDE2LzQAL3JkZ3k1LzQAL2J1cHU1LzQAL3JkcHU1LzQAL3B1YnU1LzQAL3lsZ25idTUvNAAvZ25idTUvNAAvcmR5bGJ1NS80AC9yZGJ1NS80AC9hY2NlbnQ1LzQAL2dyZXlzNS80AC9ncmVlbnM1LzQAL2JsdWVzNS80AC9wdXJwbGVzNS80AC9vcmFuZ2VzNS80AC9yZWRzNS80AC9wdW9yNS80AC95bG9yYnI1LzQAL3B1YnVnbjUvNAAvYnVnbjUvNAAvcHJnbjUvNAAvcmR5bGduNS80AC95bGduNS80AC9zcGVjdHJhbDUvNAAvcGl5ZzUvNAAvYnJiZzUvNAAvcHVyZDUvNAAveWxvcnJkNS80AC9vcnJkNS80AC9wYWlyZWQ1LzQAL3NldDM1LzQAL3NldDI1LzQAL3Bhc3RlbDI1LzQAL2RhcmsyNS80AC9zZXQxNS80AC9wYXN0ZWwxNS80AC9yZGd5NC80AC9idXB1NC80AC9yZHB1NC80AC9wdWJ1NC80AC95bGduYnU0LzQAL2duYnU0LzQAL3JkeWxidTQvNAAvcmRidTQvNAAvYWNjZW50NC80AC9ncmV5czQvNAAvZ3JlZW5zNC80AC9ibHVlczQvNAAvcHVycGxlczQvNAAvb3JhbmdlczQvNAAvcmVkczQvNAAvcHVvcjQvNAAveWxvcmJyNC80AC9wdWJ1Z240LzQAL2J1Z240LzQAL3ByZ240LzQAL3JkeWxnbjQvNAAveWxnbjQvNAAvc3BlY3RyYWw0LzQAL3BpeWc0LzQAL2JyYmc0LzQAL3B1cmQ0LzQAL3lsb3JyZDQvNAAvb3JyZDQvNAAvcGFpcmVkNC80AC9zZXQzNC80AC9zZXQyNC80AC9wYXN0ZWwyNC80AC9kYXJrMjQvNAAvc2V0MTQvNAAvcGFzdGVsMTQvNAAvcGFpcmVkMTIvNAAvc2V0MzEyLzQAL3JkZ3kxMS80AC9yZHlsYnUxMS80AC9yZGJ1MTEvNAAvcHVvcjExLzQAL3ByZ24xMS80AC9yZHlsZ24xMS80AC9zcGVjdHJhbDExLzQAL3BpeWcxMS80AC9icmJnMTEvNAAvcGFpcmVkMTEvNAAvc2V0MzExLzQAL3JkZ3kxMC80AC9yZHlsYnUxMC80AC9yZGJ1MTAvNAAvcHVvcjEwLzQAL3ByZ24xMC80AC9yZHlsZ24xMC80AC9zcGVjdHJhbDEwLzQAL3BpeWcxMC80AC9icmJnMTAvNAAvcGFpcmVkMTAvNAAvc2V0MzEwLzQAMS40AG4gPj0gNABzaWRlcyA9PSA0AGl2b3J5MwBTcGFyc2VNYXRyaXhfbXVsdGlwbHkzAGdyZXkzAGRhcmtzbGF0ZWdyYXkzAFx4MwBzbm93MwBsaWdodHllbGxvdzMAaG9uZXlkZXczAHdoZWF0MwBzdXAzAHRvbWF0bzMAcm9zeWJyb3duMwBtYXJvb24zAGxpZ2h0c2FsbW9uMwBsZW1vbmNoaWZmb24zAHNwcmluZ2dyZWVuMwBkYXJrb2xpdmVncmVlbjMAcGFsZWdyZWVuMwBkYXJrc2VhZ3JlZW4zAGxpZ2h0Y3lhbjMAdGFuMwBwbHVtMwBzZWFzaGVsbDMAY29yYWwzAGhvdHBpbmszAGxpZ2h0cGluazMAZGVlcHBpbmszAGNvcm5zaWxrMwBmaXJlYnJpY2szAGtoYWtpMwBsYXZlbmRlcmJsdXNoMwBwZWFjaHB1ZmYzAGJpc3F1ZTMAbGlnaHRza3libHVlMwBkZWVwc2t5Ymx1ZTMAbGlnaHRibHVlMwBjYWRldGJsdWUzAGRvZGdlcmJsdWUzAGxpZ2h0c3RlZWxibHVlMwByb3lhbGJsdWUzAHNsYXRlYmx1ZTMAbmF2YWpvd2hpdGUzAGFudGlxdWV3aGl0ZTMAY2hvY29sYXRlMwBjaGFydHJldXNlMwBtaXN0eXJvc2UzAHBhbGV0dXJxdW9pc2UzAGF6dXJlMwBhcXVhbWFyaW5lMwB0aGlzdGxlMwBtZWRpdW1wdXJwbGUzAGRhcmtvcmFuZ2UzAGxpZ2h0Z29sZGVucm9kMwBkYXJrZ29sZGVucm9kMwBidXJseXdvb2QzAGdvbGQzAG1lZGl1bW9yY2hpZDMAZGFya29yY2hpZDMAcGFsZXZpb2xldHJlZDMAaW5kaWFucmVkMwBvcmFuZ2VyZWQzAG9saXZlZHJhYjMAbWFnZW50YTMAc2llbm5hMwBceEYzAFx4RTMAXHhEMwBceEMzAFx4QjMAXHhBMwBncmV5OTMAZ3JheTkzAFx4OTMAZ3JleTgzAGdyYXk4MwBceDgzAGdyZXk3MwBncmF5NzMAZ3JleTYzAGdyYXk2MwBncmV5NTMAZ3JheTUzAFNUU0laRShuZXh0KSA8PSBVSU5UNjRfQygxKSA8PCA1MwBTVFNJWkUobikgPD0gVUlOVDY0X0MoMSkgPDwgNTMAZ3JleTQzAGdyYXk0MwBncmV5MzMAZ3JheTMzAGdyZXkyMwBncmF5MjMAZ3JleTEzAGdyYXkxMwBceDEzAC9yZGd5OS8zAC9idXB1OS8zAC9yZHB1OS8zAC9wdWJ1OS8zAC95bGduYnU5LzMAL2duYnU5LzMAL3JkeWxidTkvMwAvcmRidTkvMwAvZ3JleXM5LzMAL2dyZWVuczkvMwAvYmx1ZXM5LzMAL3B1cnBsZXM5LzMAL29yYW5nZXM5LzMAL3JlZHM5LzMAL3B1b3I5LzMAL3lsb3JicjkvMwAvcHVidWduOS8zAC9idWduOS8zAC9wcmduOS8zAC9yZHlsZ245LzMAL3lsZ245LzMAL3NwZWN0cmFsOS8zAC9waXlnOS8zAC9icmJnOS8zAC9wdXJkOS8zAC95bG9ycmQ5LzMAL29ycmQ5LzMAL3BhaXJlZDkvMwAvc2V0MzkvMwAvc2V0MTkvMwAvcGFzdGVsMTkvMwAvcmRneTgvMwAvYnVwdTgvMwAvcmRwdTgvMwAvcHVidTgvMwAveWxnbmJ1OC8zAC9nbmJ1OC8zAC9yZHlsYnU4LzMAL3JkYnU4LzMAL2FjY2VudDgvMwAvZ3JleXM4LzMAL2dyZWVuczgvMwAvYmx1ZXM4LzMAL3B1cnBsZXM4LzMAL29yYW5nZXM4LzMAL3JlZHM4LzMAL3B1b3I4LzMAL3lsb3JicjgvMwAvcHVidWduOC8zAC9idWduOC8zAC9wcmduOC8zAC9yZHlsZ244LzMAL3lsZ244LzMAL3NwZWN0cmFsOC8zAC9waXlnOC8zAC9icmJnOC8zAC9wdXJkOC8zAC95bG9ycmQ4LzMAL29ycmQ4LzMAL3BhaXJlZDgvMwAvc2V0MzgvMwAvc2V0MjgvMwAvcGFzdGVsMjgvMwAvZGFyazI4LzMAL3NldDE4LzMAL3Bhc3RlbDE4LzMAL3JkZ3k3LzMAL2J1cHU3LzMAL3JkcHU3LzMAL3B1YnU3LzMAL3lsZ25idTcvMwAvZ25idTcvMwAvcmR5bGJ1Ny8zAC9yZGJ1Ny8zAC9hY2NlbnQ3LzMAL2dyZXlzNy8zAC9ncmVlbnM3LzMAL2JsdWVzNy8zAC9wdXJwbGVzNy8zAC9vcmFuZ2VzNy8zAC9yZWRzNy8zAC9wdW9yNy8zAC95bG9yYnI3LzMAL3B1YnVnbjcvMwAvYnVnbjcvMwAvcHJnbjcvMwAvcmR5bGduNy8zAC95bGduNy8zAC9zcGVjdHJhbDcvMwAvcGl5ZzcvMwAvYnJiZzcvMwAvcHVyZDcvMwAveWxvcnJkNy8zAC9vcnJkNy8zAC9wYWlyZWQ3LzMAL3NldDM3LzMAL3NldDI3LzMAL3Bhc3RlbDI3LzMAL2RhcmsyNy8zAC9zZXQxNy8zAC9wYXN0ZWwxNy8zAC9yZGd5Ni8zAC9idXB1Ni8zAC9yZHB1Ni8zAC9wdWJ1Ni8zAC95bGduYnU2LzMAL2duYnU2LzMAL3JkeWxidTYvMwAvcmRidTYvMwAvYWNjZW50Ni8zAC9ncmV5czYvMwAvZ3JlZW5zNi8zAC9ibHVlczYvMwAvcHVycGxlczYvMwAvb3JhbmdlczYvMwAvcmVkczYvMwAvcHVvcjYvMwAveWxvcmJyNi8zAC9wdWJ1Z242LzMAL2J1Z242LzMAL3ByZ242LzMAL3JkeWxnbjYvMwAveWxnbjYvMwAvc3BlY3RyYWw2LzMAL3BpeWc2LzMAL2JyYmc2LzMAL3B1cmQ2LzMAL3lsb3JyZDYvMwAvb3JyZDYvMwAvcGFpcmVkNi8zAC9zZXQzNi8zAC9zZXQyNi8zAC9wYXN0ZWwyNi8zAC9kYXJrMjYvMwAvc2V0MTYvMwAvcGFzdGVsMTYvMwAvcmRneTUvMwAvYnVwdTUvMwAvcmRwdTUvMwAvcHVidTUvMwAveWxnbmJ1NS8zAC9nbmJ1NS8zAC9yZHlsYnU1LzMAL3JkYnU1LzMAL2FjY2VudDUvMwAvZ3JleXM1LzMAL2dyZWVuczUvMwAvYmx1ZXM1LzMAL3B1cnBsZXM1LzMAL29yYW5nZXM1LzMAL3JlZHM1LzMAL3B1b3I1LzMAL3lsb3JicjUvMwAvcHVidWduNS8zAC9idWduNS8zAC9wcmduNS8zAC9yZHlsZ241LzMAL3lsZ241LzMAL3NwZWN0cmFsNS8zAC9waXlnNS8zAC9icmJnNS8zAC9wdXJkNS8zAC95bG9ycmQ1LzMAL29ycmQ1LzMAL3BhaXJlZDUvMwAvc2V0MzUvMwAvc2V0MjUvMwAvcGFzdGVsMjUvMwAvZGFyazI1LzMAL3NldDE1LzMAL3Bhc3RlbDE1LzMAL3JkZ3k0LzMAL2J1cHU0LzMAL3JkcHU0LzMAL3B1YnU0LzMAL3lsZ25idTQvMwAvZ25idTQvMwAvcmR5bGJ1NC8zAC9yZGJ1NC8zAC9hY2NlbnQ0LzMAL2dyZXlzNC8zAC9ncmVlbnM0LzMAL2JsdWVzNC8zAC9wdXJwbGVzNC8zAC9vcmFuZ2VzNC8zAC9yZWRzNC8zAC9wdW9yNC8zAC95bG9yYnI0LzMAL3B1YnVnbjQvMwAvYnVnbjQvMwAvcHJnbjQvMwAvcmR5bGduNC8zAC95bGduNC8zAC9zcGVjdHJhbDQvMwAvcGl5ZzQvMwAvYnJiZzQvMwAvcHVyZDQvMwAveWxvcnJkNC8zAC9vcnJkNC8zAC9wYWlyZWQ0LzMAL3NldDM0LzMAL3NldDI0LzMAL3Bhc3RlbDI0LzMAL2RhcmsyNC8zAC9zZXQxNC8zAC9wYXN0ZWwxNC8zAC9yZGd5My8zAC9idXB1My8zAC9yZHB1My8zAC9wdWJ1My8zAC95bGduYnUzLzMAL2duYnUzLzMAL3JkeWxidTMvMwAvcmRidTMvMwAvYWNjZW50My8zAC9ncmV5czMvMwAvZ3JlZW5zMy8zAC9ibHVlczMvMwAvcHVycGxlczMvMwAvb3JhbmdlczMvMwAvcmVkczMvMwAvcHVvcjMvMwAveWxvcmJyMy8zAC9wdWJ1Z24zLzMAL2J1Z24zLzMAL3ByZ24zLzMAL3JkeWxnbjMvMwAveWxnbjMvMwAvc3BlY3RyYWwzLzMAL3BpeWczLzMAL2JyYmczLzMAL3B1cmQzLzMAL3lsb3JyZDMvMwAvb3JyZDMvMwAvcGFpcmVkMy8zAC9zZXQzMy8zAC9zZXQyMy8zAC9wYXN0ZWwyMy8zAC9kYXJrMjMvMwAvc2V0MTMvMwAvcGFzdGVsMTMvMwAvcGFpcmVkMTIvMwAvc2V0MzEyLzMAL3JkZ3kxMS8zAC9yZHlsYnUxMS8zAC9yZGJ1MTEvMwAvcHVvcjExLzMAL3ByZ24xMS8zAC9yZHlsZ24xMS8zAC9zcGVjdHJhbDExLzMAL3BpeWcxMS8zAC9icmJnMTEvMwAvcGFpcmVkMTEvMwAvc2V0MzExLzMAL3JkZ3kxMC8zAC9yZHlsYnUxMC8zAC9yZGJ1MTAvMwAvcHVvcjEwLzMAL3ByZ24xMC8zAC9yZHlsZ24xMC8zAC9zcGVjdHJhbDEwLzMAL3BpeWcxMC8zAC9icmJnMTAvMwAvcGFpcmVkMTAvMwAvc2V0MzEwLzMAMTQuMS4zAGl2b3J5MgBncmV5MgBkYXJrc2xhdGVncmF5MgBceDIAc25vdzIAbGlnaHR5ZWxsb3cyAGhvbmV5ZGV3MgBSVHJlZUluc2VydDIAd2hlYXQyAHN1cDIAbm9wMgB0b21hdG8yAHJvc3licm93bjIAbWFyb29uMgBsaWdodHNhbG1vbjIAbGVtb25jaGlmZm9uMgBzcHJpbmdncmVlbjIAZGFya29saXZlZ3JlZW4yAHBhbGVncmVlbjIAZGFya3NlYWdyZWVuMgBsaWdodGN5YW4yAHRhbjIAcGx1bTIAc2Vhc2hlbGwyAGNvcmFsMgBob3RwaW5rMgBsaWdodHBpbmsyAGRlZXBwaW5rMgBjb3Juc2lsazIAZmlyZWJyaWNrMgBraGFraTIAbGF2ZW5kZXJibHVzaDIAcGVhY2hwdWZmMgBicm9uemUyAGJpc3F1ZTIAbGlnaHRza3libHVlMgBkZWVwc2t5Ymx1ZTIAbGlnaHRibHVlMgBjYWRldGJsdWUyAGRvZGdlcmJsdWUyAGxpZ2h0c3RlZWxibHVlMgByb3lhbGJsdWUyAHNsYXRlYmx1ZTIAbmF2YWpvd2hpdGUyAGFudGlxdWV3aGl0ZTIAY2hvY29sYXRlMgBjaGFydHJldXNlMgBtaXN0eXJvc2UyAHBhbGV0dXJxdW9pc2UyAGF6dXJlMgBhcXVhbWFyaW5lMgB0aGlzdGxlMgBtZWRpdW1wdXJwbGUyAGRhcmtvcmFuZ2UyAGxpZ2h0Z29sZGVucm9kMgBkYXJrZ29sZGVucm9kMgBidXJseXdvb2QyAGdvbGQyAG1lZGl1bW9yY2hpZDIAZGFya29yY2hpZDIAcGFsZXZpb2xldHJlZDIAaW5kaWFucmVkMgBvcmFuZ2VyZWQyAG9saXZlZHJhYjIAbWFnZW50YTIAc2llbm5hMgBceEYyAFx4RTIAXHhEMgBceEMyAFx4QjIAXHhBMgBncmV5OTIAZ3JheTkyAFx4OTIAZ3JleTgyAGdyYXk4MgBceDgyAGdyZXk3MgBncmF5NzIAZ3JleTYyAGdyYXk2MgBncmV5NTIAZ3JheTUyAGdyZXk0MgBncmF5NDIAZ3JleTMyAGdyYXkzMgBncmV5MjIAZ3JheTIyAGdyZXkxMgBncmF5MTIAXHgxMgBmcmFjMTIAL3BhaXJlZDEyLzEyAC9zZXQzMTIvMTIAL3JkZ3k5LzIAL2J1cHU5LzIAL3JkcHU5LzIAL3B1YnU5LzIAL3lsZ25idTkvMgAvZ25idTkvMgAvcmR5bGJ1OS8yAC9yZGJ1OS8yAC9ncmV5czkvMgAvZ3JlZW5zOS8yAC9ibHVlczkvMgAvcHVycGxlczkvMgAvb3JhbmdlczkvMgAvcmVkczkvMgAvcHVvcjkvMgAveWxvcmJyOS8yAC9wdWJ1Z245LzIAL2J1Z245LzIAL3ByZ245LzIAL3JkeWxnbjkvMgAveWxnbjkvMgAvc3BlY3RyYWw5LzIAL3BpeWc5LzIAL2JyYmc5LzIAL3B1cmQ5LzIAL3lsb3JyZDkvMgAvb3JyZDkvMgAvcGFpcmVkOS8yAC9zZXQzOS8yAC9zZXQxOS8yAC9wYXN0ZWwxOS8yAC9yZGd5OC8yAC9idXB1OC8yAC9yZHB1OC8yAC9wdWJ1OC8yAC95bGduYnU4LzIAL2duYnU4LzIAL3JkeWxidTgvMgAvcmRidTgvMgAvYWNjZW50OC8yAC9ncmV5czgvMgAvZ3JlZW5zOC8yAC9ibHVlczgvMgAvcHVycGxlczgvMgAvb3JhbmdlczgvMgAvcmVkczgvMgAvcHVvcjgvMgAveWxvcmJyOC8yAC9wdWJ1Z244LzIAL2J1Z244LzIAL3ByZ244LzIAL3JkeWxnbjgvMgAveWxnbjgvMgAvc3BlY3RyYWw4LzIAL3BpeWc4LzIAL2JyYmc4LzIAL3B1cmQ4LzIAL3lsb3JyZDgvMgAvb3JyZDgvMgAvcGFpcmVkOC8yAC9zZXQzOC8yAC9zZXQyOC8yAC9wYXN0ZWwyOC8yAC9kYXJrMjgvMgAvc2V0MTgvMgAvcGFzdGVsMTgvMgAvcmRneTcvMgAvYnVwdTcvMgAvcmRwdTcvMgAvcHVidTcvMgAveWxnbmJ1Ny8yAC9nbmJ1Ny8yAC9yZHlsYnU3LzIAL3JkYnU3LzIAL2FjY2VudDcvMgAvZ3JleXM3LzIAL2dyZWVuczcvMgAvYmx1ZXM3LzIAL3B1cnBsZXM3LzIAL29yYW5nZXM3LzIAL3JlZHM3LzIAL3B1b3I3LzIAL3lsb3JicjcvMgAvcHVidWduNy8yAC9idWduNy8yAC9wcmduNy8yAC9yZHlsZ243LzIAL3lsZ243LzIAL3NwZWN0cmFsNy8yAC9waXlnNy8yAC9icmJnNy8yAC9wdXJkNy8yAC95bG9ycmQ3LzIAL29ycmQ3LzIAL3BhaXJlZDcvMgAvc2V0MzcvMgAvc2V0MjcvMgAvcGFzdGVsMjcvMgAvZGFyazI3LzIAL3NldDE3LzIAL3Bhc3RlbDE3LzIAL3JkZ3k2LzIAL2J1cHU2LzIAL3JkcHU2LzIAL3B1YnU2LzIAL3lsZ25idTYvMgAvZ25idTYvMgAvcmR5bGJ1Ni8yAC9yZGJ1Ni8yAC9hY2NlbnQ2LzIAL2dyZXlzNi8yAC9ncmVlbnM2LzIAL2JsdWVzNi8yAC9wdXJwbGVzNi8yAC9vcmFuZ2VzNi8yAC9yZWRzNi8yAC9wdW9yNi8yAC95bG9yYnI2LzIAL3B1YnVnbjYvMgAvYnVnbjYvMgAvcHJnbjYvMgAvcmR5bGduNi8yAC95bGduNi8yAC9zcGVjdHJhbDYvMgAvcGl5ZzYvMgAvYnJiZzYvMgAvcHVyZDYvMgAveWxvcnJkNi8yAC9vcnJkNi8yAC9wYWlyZWQ2LzIAL3NldDM2LzIAL3NldDI2LzIAL3Bhc3RlbDI2LzIAL2RhcmsyNi8yAC9zZXQxNi8yAC9wYXN0ZWwxNi8yAC9yZGd5NS8yAC9idXB1NS8yAC9yZHB1NS8yAC9wdWJ1NS8yAC95bGduYnU1LzIAL2duYnU1LzIAL3JkeWxidTUvMgAvcmRidTUvMgAvYWNjZW50NS8yAC9ncmV5czUvMgAvZ3JlZW5zNS8yAC9ibHVlczUvMgAvcHVycGxlczUvMgAvb3JhbmdlczUvMgAvcmVkczUvMgAvcHVvcjUvMgAveWxvcmJyNS8yAC9wdWJ1Z241LzIAL2J1Z241LzIAL3ByZ241LzIAL3JkeWxnbjUvMgAveWxnbjUvMgAvc3BlY3RyYWw1LzIAL3BpeWc1LzIAL2JyYmc1LzIAL3B1cmQ1LzIAL3lsb3JyZDUvMgAvb3JyZDUvMgAvcGFpcmVkNS8yAC9zZXQzNS8yAC9zZXQyNS8yAC9wYXN0ZWwyNS8yAC9kYXJrMjUvMgAvc2V0MTUvMgAvcGFzdGVsMTUvMgAvcmRneTQvMgAvYnVwdTQvMgAvcmRwdTQvMgAvcHVidTQvMgAveWxnbmJ1NC8yAC9nbmJ1NC8yAC9yZHlsYnU0LzIAL3JkYnU0LzIAL2FjY2VudDQvMgAvZ3JleXM0LzIAL2dyZWVuczQvMgAvYmx1ZXM0LzIAL3B1cnBsZXM0LzIAL29yYW5nZXM0LzIAL3JlZHM0LzIAL3B1b3I0LzIAL3lsb3JicjQvMgAvcHVidWduNC8yAC9idWduNC8yAC9wcmduNC8yAC9yZHlsZ240LzIAL3lsZ240LzIAL3NwZWN0cmFsNC8yAC9waXlnNC8yAC9icmJnNC8yAC9wdXJkNC8yAC95bG9ycmQ0LzIAL29ycmQ0LzIAL3BhaXJlZDQvMgAvc2V0MzQvMgAvc2V0MjQvMgAvcGFzdGVsMjQvMgAvZGFyazI0LzIAL3NldDE0LzIAL3Bhc3RlbDE0LzIAL3JkZ3kzLzIAL2J1cHUzLzIAL3JkcHUzLzIAL3B1YnUzLzIAL3lsZ25idTMvMgAvZ25idTMvMgAvcmR5bGJ1My8yAC9yZGJ1My8yAC9hY2NlbnQzLzIAL2dyZXlzMy8yAC9ncmVlbnMzLzIAL2JsdWVzMy8yAC9wdXJwbGVzMy8yAC9vcmFuZ2VzMy8yAC9yZWRzMy8yAC9wdW9yMy8yAC95bG9yYnIzLzIAL3B1YnVnbjMvMgAvYnVnbjMvMgAvcHJnbjMvMgAvcmR5bGduMy8yAC95bGduMy8yAC9zcGVjdHJhbDMvMgAvcGl5ZzMvMgAvYnJiZzMvMgAvcHVyZDMvMgAveWxvcnJkMy8yAC9vcnJkMy8yAC9wYWlyZWQzLzIAL3NldDMzLzIAL3NldDIzLzIAL3Bhc3RlbDIzLzIAL2RhcmsyMy8yAC9zZXQxMy8yAC9wYXN0ZWwxMy8yAC9wYWlyZWQxMi8yAC9zZXQzMTIvMgAvcmRneTExLzIAL3JkeWxidTExLzIAL3JkYnUxMS8yAC9wdW9yMTEvMgAvcHJnbjExLzIAL3JkeWxnbjExLzIAL3NwZWN0cmFsMTEvMgAvcGl5ZzExLzIAL2JyYmcxMS8yAC9wYWlyZWQxMS8yAC9zZXQzMTEvMgAvcmRneTEwLzIAL3JkeWxidTEwLzIAL3JkYnUxMC8yAC9wdW9yMTAvMgAvcHJnbjEwLzIAL3JkeWxnbjEwLzIAL3NwZWN0cmFsMTAvMgAvcGl5ZzEwLzIAL2JyYmcxMC8yAC9wYWlyZWQxMC8yAC9zZXQzMTAvMgAxLjIAIC1kYXNoIDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEATElTVF9TSVpFKCZjdHgtPlRyZWVfZWRnZSkgPT0gY3R4LT5OX25vZGVzIC0gMQBub2RlX3NldF9zaXplKGctPm5faWQpID09IG9zaXplICsgMQBuLT5jb3VudCArICgqbm4pLT5jb3VudCA9PSBOT0RFQ0FSRCArIDEAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdICsgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID09IE5PREVDQVJEICsgMQBncmV5MABncmF5MABqc29uMAAjZjBmMGYwACNlMGUwZTAAeGItPmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMABueiA+IDAAbGlzdC0+Y2FwYWNpdHkgPiAwAGRpc3QgPiAwAHBhdGhjb3VudCA+IDAAd2d0ID4gMABuc2l0ZXMgPiAwAHNpZGVzID4gMABydiA9PSAwIHx8IChORF9vcmRlcihydiktTkRfb3JkZXIodikpKmRpciA+IDAAaW5wbiA+IDAAbGVuID4gMABxdDEtPm4gPiAwICYmIHF0Mi0+biA+IDAAbSA+IDAgJiYgbiA+IDAAbmV3VG90YWwgPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGluY3JlYXNlID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABpbmRleCA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX25vZGVzID49IDAAbl9vYnMgPj0gMABuID49IDAAbi0+bGV2ZWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABsaXN0LT5iYXNlICE9IE5VTEwgfHwgaW5kZXggPT0gMCB8fCBzdHJpZGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMAByZXFfYWxpZ25tZW50ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhTElTVF9JU19FTVBUWShwbGlzdCkAZ3ZfbGlzdF9pc19jb250aWd1b3VzXygqbGlzdCkAb25lIDw9IExJU1RfU0laRShsaXN0KQBucCA8IExJU1RfU0laRShsaXN0KQBpc19wb3dlcl9vZl8yKGFsaWdubWVudCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhTElTVF9JU19FTVBUWSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAExJU1RfU0laRSgmYXJyKSA9PSAoc2l6ZV90KWFnbm5vZGVzKHNnKQBtb3ZlIHRvICglLjBmLCAlLjBmKQA7IHNwbGluZSB0byAoJS4wZiwgJS4wZikAOyBsaW5lIHRvICglLjBmLCAlLjBmKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIHRydWUpAHZhbHVlICYmIHN0cmxlbih2YWx1ZSkAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCBmYWxzZSkAIXVzZV9zdGFnZSB8fCBzaXplIDw9IHNpemVvZihzdGFnZSkARURfbGFiZWwoZmUpACFUUkVFX0VER0UoZSkAIWNvbnN0cmFpbmluZ19mbGF0X2VkZ2UoZywgZSkAbm9kZV9zZXRfaXNfZW1wdHkoZy0+bl9pZCkAcl8lZCkAbF8lZCkAKGxpYikAIVNwYXJzZU1hdHJpeF9oYXNfZGlhZ29uYWwoQSkAIHNjYW5uaW5nIGEgSFRNTCBzdHJpbmcgKG1pc3NpbmcgJz4nPyBiYWQgbmVzdGluZz8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSBxdW90ZWQgc3RyaW5nIChtaXNzaW5nIGVuZHF1b3RlPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIC8qLi4uKi8gY29tbWVudCAobWlzc2luZyAnKi8/IGxvbmdlciB0aGFuICVkPykAZmFsbGJhY2soNCkAb25faGVhcChyMCkgfHwgb25faGVhcChyMSkAYWd0YWlsKGUpID09IFVGX2ZpbmQoYWd0YWlsKGUpKQBhZ2hlYWQoZSkgPT0gVUZfZmluZChhZ2hlYWQoZSkpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eWVuc3VyZV9idWZmZXJfc3RhY2soKQBzdHJlcShtb2RlLCAiciIpIHx8IHN0cmVxKG1vZGUsICJyYiIpIHx8IHN0cmVxKG1vZGUsICJ3IikgfHwgc3RyZXEobW9kZSwgIndiIikAcG5hbWUgIT0gTlVMTCAmJiAhc3RyZXEocG5hbWUsICIiKQBzZXRsaW5ld2lkdGgoACkgcm90YXRlKCVkKSB0cmFuc2xhdGUoACB0cmFuc2Zvcm09InNjYWxlKABOT1RBVElPTigAICgAIG5lYXIgJyVzJwAlbGYsJWxmLCVsZiwnJVteJ10nAGlzZGlnaXQoKGludClkb3RwWzFdKSAmJiBpc2RpZ2l0KChpbnQpZG90cFsyXSkgJiYgZG90cFszXSA9PSAnXDAnACYAJQAkAHVybCgjADx0ZXh0UGF0aCB4bGluazpocmVmPSIjADxhcmVhIHNoYXBlPSJwb2x5IgAgZmlsbD0iIyUwMnglMDJ4JTAyeCIAKHNlcSAmIFNFUV9NQVNLKSA9PSBzZXEgJiYgInNlcXVlbmNlIElEIG92ZXJmbG93IgBndl9zb3J0X2NvbXBhciA9PSBOVUxMICYmIGd2X3NvcnRfYXJnID09IE5VTEwgJiYgInVuc3VwcG9ydGVkIHJlY3Vyc2l2ZSBjYWxsIHRvIGd2X3NvcnQiAGd2X3NvcnRfY29tcGFyICE9IE5VTEwgJiYgIm5vIGNvbXBhcmF0b3Igc2V0IGluIGd2X3NvcnQiAG9wLT5vcC51LnBvbHlnb24uY250IDw9IElOVF9NQVggJiYgInBvbHlnb24gY291bnQgZXhjZWVkcyBndnJlbmRlcl9wb2x5Z29uIHN1cHBvcnQiACB0ZXh0LWFuY2hvcj0ic3RhcnQiAHAueCAhPSBhICYmICJjYW5ub3QgaGFuZGxlIGVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpbiBob3Jpem9udGFsIGV4dHJlbWUgcG9pbnQiAGZ1bGxfbGVuZ3RoX3dpdGhvdXRfc2hhZnQgPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGggd2l0aG91dCBzaGFmdCIAPGFyZWEgc2hhcGU9InJlY3QiAHNpemUgPiAwICYmICJhdHRlbXB0IHRvIGFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZWQgZWxlbWVudHMiAGluZGV4IDwgc2VsZi0+c2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAaW5kZXggPCBzZWxmLnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiACpzMSAhPSAqczIgJiYgImR1cGxpY2F0ZSBzZXBhcmF0b3IgY2hhcmFjdGVycyIAR0RfbWlucmFuayhzdWJnKSA8PSBHRF9tYXhyYW5rKHN1YmcpICYmICJjb3JydXB0ZWQgcmFuayBib3VuZHMiAGluZGV4IDwgbGlzdC5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgAodWludHB0cl90KXMgJSAyID09IDAgJiYgImhlYXAgcG9pbnRlciB3aXRoIGxvdyBiaXQgc2V0IHdpbGwgY29sbGlkZSB3aXRoIGFub255bW91cyBJRHMiACAoKyU2bGQgYnl0ZXMgJXN8JXUsIHhtbHBhcnNlLmM6JWQpICUqcyIAIGZvbnQtZmFtaWx5PSIlcyIAIGZvbnQtd2VpZ2h0PSIlcyIAIGZpbGw9IiVzIgAgZm9udC1zdHJldGNoPSIlcyIAIGZvbnQtc3R5bGU9IiVzIgBiYWQgZWRnZSBsZW4gIiVzIgAgYmFzZWxpbmUtc2hpZnQ9InN1cGVyIgBhZ3hibGVuKHhiKSA8PSBzaXplb2YoeGItPnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT5sb2NhdGVkID09IEFHWEJVRl9PTl9IRUFQIHx8IHhiLT5sb2NhdGVkIDw9IHNpemVvZih4Yi0+c3RvcmUpKSAmJiAiY29ycnVwdGVkIGFneGJ1ZiB0eXBlIgBBLT50eXBlID09IHR5cGUgJiYgImNhbGwgdG8gU3BhcnNlTWF0cml4X2Nvb3JkaW5hdGVfZm9ybV9hZGRfZW50cnkgIiAid2l0aCBpbmNvbXBhdGlibGUgdmFsdWUgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAW0dyYXBodml6XSAlczolZDogJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgACVkIABUb3RhbCBzaXplID4gMSBpbiAiJXMiIGNvbG9yIHNwZWMgAFsgL1JlY3QgWyAAVCAAUyAAT1BFTiAASSAARiAARSAAQyAAIC0+IABSYW5rIHNlcGFyYXRpb24gPSAAVW5zYXRpc2ZpZWQgY29uc3RyYWludDogAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzOiAAJXM6IABTb2x2aW5nIG1vZGVsOiAAU2V0dGluZyB1cCBzcHJpbmcgbW9kZWw6IABjb252ZXJ0IGdyYXBoOiAAIFRpdGxlOiAAInRleHQiOiAAeyJmcmFjIjogJS4wM2YsICJjb2xvciI6IAAibmFtZSI6IAAic3R5bGUiOiAAImZhY2UiOiAAMiAAPCEtLSAAIC0tIAAlIABfcCIgAGxfJWQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAADSAgICAgICAgICAgICAgICBpdGVyID0gJWQsIHN0ZXAgPSAlZiBGbm9ybSA9ICVmIG56ID0gJXp1ICBLID0gJWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAAogICAgADoJIAAgICAgJXN9CgB0cnlpbmcgdG8gYWRkIHRvIHJlY3QgeyVmICsvLSAlZiwgJWYgKy8tICVmfQoAI2RlZmF1bHQgeyBmaW5pc2ggeyBhbWJpZW50IDAuMSBkaWZmdXNlIDAuOSB9IH0KAHBpZ21lbnQgeyBjb2xvciAlcyB9CgBsaWdodF9zb3VyY2UgeyA8MTUwMCwzMDAwLC0yNTAwPiBjb2xvciBXaGl0ZSB9CgBnbG9iYWxfc2V0dGluZ3MgeyBhc3N1bWVkX2dhbW1hIDEuMCB9CgAgICAgdGV4dHVyZSBJbWFnZVRleHR1cmUgeyB1cmwgIiVzIiB9CgAgICAgfQoALy9za3kKcGxhbmUgeyA8MCwgMSwgMD4sIDEgaG9sbG93CiAgICB0ZXh0dXJlIHsKICAgICAgICBwaWdtZW50IHsgYm96byB0dXJidWxlbmNlIDAuOTUKICAgICAgICAgICAgY29sb3JfbWFwIHsKICAgICAgICAgICAgICAgIFswLjAwIHJnYiA8MC4wNSwgMC4yMCwgMC41MD5dCiAgICAgICAgICAgICAgICBbMC41MCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNzUgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MC4yNSwgMC4yNSwgMC4yNT5dCiAgICAgICAgICAgICAgICBbMS4wMCByZ2IgPDAuNTAsIDAuNTAsIDAuNTA+XQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjYWxlIDwxLjAwLCAxLjAwLCAxLjUwPiAqIDIuNTAKICAgICAgICAgICAgdHJhbnNsYXRlIDwwLjAwLCAwLjAwLCAwLjAwPgogICAgICAgIH0KICAgICAgICBmaW5pc2ggeyBhbWJpZW50IDEgZGlmZnVzZSAwIH0KICAgIH0KICAgIHNjYWxlIDEwMDAwCn0KLy9taXN0CmZvZyB7IGZvZ190eXBlIDIKICAgIGRpc3RhbmNlIDUwCiAgICBj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ZCBjZWxsIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAGZpeGVkIHRhYmxlIHNpemUgd2l0aCB1bnNwZWNpZmllZCB3aWR0aCBvciBoZWlnaHQKAHBvcyBhdHRyaWJ1dGUgZm9yIGVkZ2UgKCVzLCVzKSBkb2Vzbid0IGhhdmUgM24rMSBwb2ludHMKACAgZ2VuZXJhdGVkICVkIGNvbnN0cmFpbnRzCgBzcGxpbmVzIGFuZCBjbHVzdGVyIGVkZ2VzIG5vdCBzdXBwb3J0ZWQgLSB1c2luZyBsaW5lIHNlZ21lbnRzCgBvYmplY3RzCgBXYXJuaW5nOiBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGZsb2F0cwoAZm9udCBuYW1lICVzIGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGJlIGFjY2VwdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAZm9udCBuYW1lICVzIGlzIGxvbmdlciB0aGFuIDI5IGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHJlamVjdGVkIGJ5IHNvbWUgUFMgdmlld2VycwoAY2Fubm90IGFsbG9jYXRlIHBzCgBzY2FsZT0xLjAgJXMgcmVxdWlyZWQgZm9yIGNvbXBhcmlzb25zCgBTZXR0aW5nIGluaXRpYWwgcG9zaXRpb25zCgAlcyBEV0IgMiBjb21wYXRpYmlsaXR5IGRlZmluaXRpb25zCgBhcnJheSBwYWNraW5nOiAlcyAlenUgcm93cyAlenUgY29sdW1ucwoAc3ludGF4IGFtYmlndWl0eSAtIGJhZGx5IGRlbGltaXRlZCBudW1iZXIgJyVzJyBpbiBsaW5lICVkIG9mICVzIHNwbGl0cyBpbnRvIHR3byB0b2tlbnMKAGVkZ2UgbGFiZWxzIHdpdGggc3BsaW5lcz1jdXJ2ZWQgbm90IHN1cHBvcnRlZCBpbiBkb3QgLSB1c2UgeGxhYmVscwoAZmxhdCBlZGdlIGJldHdlZW4gYWRqYWNlbnQgbm9kZXMgb25lIG9mIHdoaWNoIGhhcyBhIHJlY29yZCBzaGFwZSAtIHJlcGxhY2UgcmVjb3JkcyB3aXRoIEhUTUwtbGlrZSBsYWJlbHMKAG91dCBvZiBtZW1vcnkgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzCgBpbnRlZ2VyIG92ZXJmbG93IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSAqICV6dSBieXRlcwoAdXBkYXRlOiBtaXNtYXRjaGVkIGxjYSBpbiB0cmVldXBkYXRlcwoAZ3JhcGggJXMsIGNvb3JkICVzLCBleHBlY3RlZCBmb3VyIGRvdWJsZXMKAG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZG91YmxlcwoARm91bmQgJWQgRGlHLUNvTGEgYm91bmRhcmllcwoASW5jaGVzCgAoJTR6dSkgJTd6dSBub2RlcyAlN3p1IGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBjb3VsZCBub3QgY29uc3RydWN0IG9ic3RhY2xlcyAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgB0aGUgYm91bmRpbmcgYm94ZXMgb2Ygc29tZSBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBjb21wb3VuZEVkZ2VzOiBub2RlcyB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBzb21lIG5vZGVzIHdpdGggbWFyZ2luICglLjAyZiwlLjAyZikgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAbWVyZ2UyOiBncmFwaCAlcywgcmFuayAlZCBoYXMgb25seSAlZCA8ICVkIG5vZGVzCgBTY2FubmluZyBncmFwaCAlcywgJWQgbm9kZXMKAFdhcm5pbmc6IG5vIGhhcmQtY29kZWQgbWV0cmljcyBmb3IgJyVzJy4gIEZhbGxpbmcgYmFjayB0byAnVGltZXMnIG1ldHJpY3MKAGluIGVkZ2UgJXMlcyVzCgBVc2luZyAlczogJXM6JXMKAEZvcm1hdDogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoATGF5b3V0IHR5cGU6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAGxheW91dCAlcwoALmZ0ICVzCgBiYWQgbGFiZWwgZm9ybWF0ICVzCgBpbiByb3V0ZXNwbGluZXMsIGVkZ2UgaXMgYSBsb29wIGF0ICVzCgAgICAgICAgJTdkIG5vZGVzICU3ZCBlZGdlcyAlN3p1IGNvbXBvbmVudHMgJXMKAGluIGxhYmVsIG9mIGVkZ2UgJXMgJXMgJXMKACAgRWRnZSAlcyAlcyAlcwoAb3J0aG8gJXMgJXMKAHBvbHlsaW5lICVzICVzCgBzcGxpbmUgJXMgJXMKAHJlY3RhbmdsZSAoJS4wZiwlLjBmKSAoJS4wZiwlLjBmKSAlcyAlcwoAaW4gY2x1c3RlciAlcwoAJXMgd2FzIGFscmVhZHkgaW4gYSByYW5rc2V0LCBkZWxldGVkIGZyb20gY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgbm90IGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIGlzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgY2x1c3RlciAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIG5vZGUgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgbm90IGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIGlzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgY2x1c3RlciAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIG5vZGUgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAVW5oYW5kbGVkIGFkanVzdCBvcHRpb24gJXMKAHJlcG9zaXRpb24gJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggeGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHRhaWwgbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggbGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggaGVhZCBsYWJlbCAlcwoALy8qKiogYmVnaW5fZ3JhcGggJXMKAE1heC4gaXRlcmF0aW9ucyAoJWQpIHJlYWNoZWQgb24gZ3JhcGggJXMKAENvdWxkIG5vdCBwYXJzZSAiX2JhY2tncm91bmQiIGF0dHJpYnV0ZSBpbiBncmFwaCAlcwoAaW4gbGFiZWwgb2YgZ3JhcGggJXMKAENyZWF0aW5nIGVkZ2VzIHVzaW5nICVzCgBBZGp1c3RpbmcgJXMgdXNpbmcgJXMKACVzIHdoaWxlIG9wZW5pbmcgJXMKAGRlcml2ZSBncmFwaCBfZGdfJWQgb2YgJXMKACBdICAlenUgdHJ1ZSAlcwoAXSAgJWQgdHJ1ZSAlcwoAIF0gICV6dSBmYWxzZSAlcwoAXSAgJWQgZmFsc2UgJXMKAG1ha2VQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAG1ha2VBZGRQb2x5OiB1bmtub3duIHNoYXBlIHR5cGUgJXMKAHVzaW5nICVzIGZvciB1bmtub3duIHNoYXBlICVzCgAgIG9jdHJlZSBzY2hlbWUgJXMKAGNhbid0IG9wZW4gbGlicmFyeSBmaWxlICVzCgBjYW4ndCBmaW5kIGxpYnJhcnkgZmlsZSAlcwoAQm91bmRpbmdCb3ggbm90IGZvdW5kIGluIGVwc2YgZmlsZSAlcwoAY291bGRuJ3Qgb3BlbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IHJlYWQgZnJvbSBlcHNmIGZpbGUgJXMKAGluIG5vZGUgJXMKAHNoYXBlZmlsZSBub3Qgc2V0IG9yIG5vdCBmb3VuZCBmb3IgZXBzZiBub2RlICVzCgBpbiBsYWJlbCBvZiBub2RlICVzCgBlbmQgJXMKAHJhbmtpbmc6IGZhaWx1cmUgdG8gY3JlYXRlIHN0cm9uZyBjb25zdHJhaW50IGVkZ2UgYmV0d2VlbiBub2RlcyAlcyBhbmQgJXMKAG9vcHMsIGludGVybmFsIGVycm9yOiB1bmhhbmRsZWQgY29sb3IgdHlwZT0lZCAlcwoAJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlZAogJWQgJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmYWlsZWQgdG8gcmVzZXJ2ZSAlenUgZWxlbWVudHMgb2Ygc2l6ZSAlenUgYnl0ZXM6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAbGliL3BhdGhwbGFuLyVzOiVkOiAlcwoAZ3JpZCglZCwlZCk6ICVzCgBDb3VsZCBub3Qgb3BlbiAiJXMiIGZvciB3cml0aW5nIDogJXMKAHN0YXJ0IHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKAGVuZCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgAgWyV6dV0gJXAgc2V0ICVkICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcwoAJSUgJXMKACMgJXMKACAgbW9kZSAgICVzCgBsaXN0IGVsZW1lbnQgdHlwZSBpcyBub3QgYSBwb2ludGVyLCBidXQgYGZyZWVgIHVzZWQgYXMgZGVzdHJ1Y3RvcgoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRvCiAgICBYIFkgbGluZXRvCiAgICB4IFkgbGluZXRvCiAgICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCgAlIVBTLUFkb2JlLTIuMAovbm9kZSB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAfSBiaW5kIGRlZgoALlBTICUuNWYgJS41ZgoAb3ZlcmxhcDogJXMgdmFsdWUgJWQgc2NhbGluZyAlLjA0ZgoAICBiZWF1dGlmeV9sZWF2ZXMgJWQgbm9kZSB3ZWlnaHRzICVkIHJvdGF0aW9uICUuMDNmCgAgIHJlcHVsc2l2ZSBleHBvbmVudDogJS4wM2YKACAgSyA6ICUuMDNmIEMgOiAlLjAzZgoAJXMgJS4zZgoACmludGVyc2VjdGlvbiBhdCAlLjNmICUuM2YKACAgICBzY2FsZSAlLjNmCgB0b3J1cyB7ICUuM2YsICUuM2YKACAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4sICUuM2YKACBpbiAlcyAtIHNldHRpbmcgdG8gJS4wMmYKAGNpcmNsZSAlcyAlLjBmLCUuMGYsJS4wZgoAcmVjdCAlcyAlLjBmLCUuMGYgJS4wZiwlLjBmCgAlZCAlZCAlZCAlLjBmICVkICVkICVkICVkICVkICUuM2YgJWQgJS40ZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYKACAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAlJSUlUGFnZTogMSAxCiUlJSVQYWdlQm91bmRpbmdCb3g6ICUuMGYgJS4wZiAlLjBmICUuMGYKAHBvc1slenVdICUuMGYgJS4wZgoALm5yIFNGICUuMGYKc2NhbGV0aGlja25lc3MgPSAlLjBmCgAlcyBzYXZlIHBvaW50IHNpemUgYW5kIGZvbnQKLm5yIC5TIFxuKC5zCi5uciBERiBcbiguZgoAc2hvd3BhZ2UKJSUlJVRyYWlsZXIKJSUlJUJvdW5kaW5nQm94OiAlLmYgJS5mICUuZiAlLmYKAGFkZGluZyAlenUgaXRlbXMsIHRvdGFsIGFyZWEgPSAlZiwgdyA9ICVmLCBhcmVhL3c9JWYKAGdhcD0lZiwlZgoAICBhc3BlY3QgJWYKAGEgJWYgYiAlZiBjICVmIGQgJWYgciAlZgoAbW9kZWwgJWQgc21hcnRfaW5pdCAlZCBzdHJlc3N3dCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAU29sdmluZyBtb2RlbCAlZCBpdGVyYXRpb25zICVkIHRvbCAlZgoAJXMgY29vcmQgJS41ZyAlLjVnIGh0ICVmIHdpZHRoICVmCgByZWMgJWYgJWYgJWYgJWYKACVzIDogJWYgJWYgJWYgJWYKACVzIDogJWYgJWYKAG1heHBzaHQgPSAlZgptYXhwc3dpZCA9ICVmCgBtZHNNb2RlbDogZGVsdGEgPSAlZgoAIHIxICVmIHIyICVmCgBQYWNraW5nOiBjb21wdXRlIGdyaWQgc2l6ZQoAZ3NhdmUKACUlRW5kQ29tbWVudHMKc2F2ZQoAVW5yZWNvZ25pemVkIGNoYXJhY3RlciAnJWMnICglZCkgaW4gc2lkZXMgYXR0cmlidXRlCgBJbWFnZXMgdW5zdXBwb3J0ZWQgaW4gImJhY2tncm91bmQiIGF0dHJpYnV0ZQoAJXMgR05VIHBpYyB2cy4gMTB0aCBFZGl0aW9uIGRcKGUndGVudGUKAHJlc2V0ICVzIHNldCB0byBrbm93biBzdGF0ZQoAJWcgJWcgc2V0X3NjYWxlICVkIHJvdGF0ZSAlZyAlZyB0cmFuc2xhdGUKACVmICVmIHRyYW5zbGF0ZQoAJWQgJWQgdHJhbnNsYXRlCgAvLyoqKiBlbGxpcHNlCgBVbnJlY29nbml6ZWQgb3ZlcmxhcCB2YWx1ZSAiJXMiIC0gdXNpbmcgZmFsc2UKAG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBtaW5jcm9zczogcGFzcyAlZCBpdGVyICVkIHRyeWluZyAlZCBjdXJfY3Jvc3MgJWxsZCBiZXN0X2Nyb3NzICVsbGQKAG5vZGUgJXMsIHBvcnQgJXMgdW5yZWNvZ25pemVkCgAlcyVzIHVuc3VwcG9ydGVkCgBjbHVzdGVyIGN5Y2xlICVzIC0tICVzIG5vdCBzdXBwb3J0ZWQKACVzIC0+ICVzOiBzcGxpbmUgc2l6ZSA+IDEgbm90IHN1cHBvcnRlZAoAbGF5b3V0IGFib3J0ZWQKAHBhZ2VkaXI9JXMgaWdub3JlZAoAVHdvIGNsdXN0ZXJzIG5hbWVkICVzIC0gdGhlIHNlY29uZCB3aWxsIGJlIGlnbm9yZWQKAElsbGVnYWwgYXR0cmlidXRlICVzIGluICVzIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlbCIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGUiIGluIGdyYXBoICVzIC0gaWdub3JlZAoAc3RhcnQ9MCBub3Qgc3VwcG9ydGVkIHdpdGggbW9kZT1zZWxmIC0gaWdub3JlZAoAT3ZlcmxhcCB2YWx1ZSAiJXMiIHVuc3VwcG9ydGVkIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgUk9XUyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIENPTFVNTlMgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBWQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEZJWEVEU0laRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJS4qcyBmb3IgU1RZTEUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBCQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBBTElHTiBpbiBURCAtIGlnbm9yZWQKAFJPV1NQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBDT0xTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAbm9kZSAlcywgcG9ydCAlcywgdW5yZWNvZ25pemVkIGNvbXBhc3MgcG9pbnQgJyVzJyAtIGlnbm9yZWQKAFVua25vd24gInNwbGluZXMiIHZhbHVlOiAiJXMiIC0gaWdub3JlZAoAaW4gcm91dGVzcGxpbmVzLCBQc2hvcnRlc3RwYXRoIGZhaWxlZAoAaW4gcm91dGVzcGxpbmVzLCBQcm91dGVzcGxpbmUgZmFpbGVkCgAjIHBsdWdpbiBsb2FkaW5nIG9mIGRlcGVuZGVuY3kgIiUuKnMiIGZhaWxlZAoAUGFyc2luZyBvZiAiJXMiIGZhaWxlZAoAJXM6JWQ6IGNsYWltZWQgdW5yZWFjaGFibGUgY29kZSB3YXMgcmVhY2hlZAoAIyB1bnN1Y2Nlc3NmdWwgcGx1Z2luIGxvYWQKACUuNWcgJS41ZyB0cmFuc2xhdGUgbmV3cGF0aCB1c2VyX3NoYXBlXyVkCgBuc2l6ZXNjYWxlPSVmLGl0ZXJhdGlvbnM9JWQKAGN0cmwtPm92ZXJsYXA9JWQKACVzICV6dSBub2RlcyAlenUgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9s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bWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAZWRnZSAlcyAtPiAlcyA6IHNldCBtb3JlIHRoYW4gb25lIHNwbGluZS4gRmlyc3QgdXNlZCwgb3RoZXIgZHJvcHBlZC4KACV6dSBvdXQgb2YgJXp1IGxhYmVscyBwb3NpdGlvbmVkLgoAJXp1IG91dCBvZiAlenUgZXh0ZXJpb3IgbGFiZWxzIHBvc2l0aW9uZWQuCgAgIGdlbmVyYXRlIGVkZ2UgY29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgTm9uLW92ZXJsYXAgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRWRnZSBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBEaUctQ29MYSBFZGdlIENvbnN0cmFpbnRz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c2V0dGluZyBhIGJvdW5kaW5nIGJveCBzaXplLCBzZWUgZG90KDEpKQoAZXJyb3IgaW4gY29sb3J4bGF0ZSgpCgB0cnVuY2F0aW5nIHN0eWxlICclcycKAElsbGVnYWwgdmFsdWUgaW4gIiVzIiBjb2xvciBhdHRyaWJ1dGU7IGZsb2F0IGV4cGVjdGVkIGFmdGVyICc7JwoAZGVmaW5lIGF0dHJzMCAlJSAlJTsgZGVmaW5lIHVuZmlsbGVkICUlICUlOyBkZWZpbmUgcm91bmRlZCAlJSAlJTsgZGVmaW5lIGRpYWdvbmFscyAlJSAlJQoAPHN2ZyB3aWR0aD0iJWRwdCIgaGVpZ2h0PSIlZHB0IgoAIyBkZXBlbmRlbmNpZXMgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAjIHR5cGUgIiUuKnMiIGRpZCBub3QgbWF0Y2ggIiUuKnMiCgAkYyBjcmVhdGUgaW1hZ2UgJS4yZiAlLjJmIC1pbWFnZSAicGhvdG9fJXMiCgBObyBvciBpbXByb3BlciBpbWFnZSBmaWxlPSIlcyIKAGZpbGUgbG9hZGluZyBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZSBlbnZpcm9ubWVudCBjb250YWlucyBTRVJWRVJfTkFNRT0iJXMiCgBDb3VsZCBub3QgcGFyc2UgeGRvdCAiJXMiCgBObyBsb2FkaW1hZ2UgcGx1Z2luIGZvciAiJXMiCgAgWyV6dV0gKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVwICIlcyIKAGZvbnRuYW1lOiB1bmFibGUgdG8gcmVzb2x2ZSAiJXMiCgBEdXBsaWNhdGUgY2x1c3RlciBuYW1lICIlcyIKAHVucmVjb2duaXplZCBhcGkgbmFtZSAiJXMiCgBpbWFnZSBjcmVhdGUgcGhvdG8gInBob3RvXyVzIiAtZmlsZSAiJXMiCgBObyBvciBpbXByb3BlciBzaGFwZWZpbGU9IiVzIiBmb3Igbm9kZSAiJXMiCgBObyBvciBpbXByb3BlciBpbWFnZT0iJXMiIGZvciBub2RlICIlcyIKAG5vZGUgIiVzIiBpcyBjb250YWluZWQgaW4gdHdvIG5vbi1jb21wYXJhYmxlIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKAEVycm9yOiBub2RlICIlcyIgYmVsb25ncyB0byB0d28gbm9uLW5lc3RlZCBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgAgICIlcyIKACNpbmNsdWRlICJjb2xvcnMuaW5jIgojaW5jbHVkZSAidGV4dHVyZXMuaW5jIgojaW5jbHVkZSAic2hhcGVzLmluYyIKAFVua25vd24gSFRNTCBlbGVtZW50IDwlcz4gb24gbGluZSAlbHUgCgAlcyBpbiBsaW5lICVsdSAKAHNjYWxlIGJ5ICVnLCVnIAoAY29tcHJlc3MgJWcgCgBMYXlvdXQgd2FzIG5vdCBkb25lLiAgTWlzc2luZyBsYXlvdXQgcGx1Z2lucz8gCgCJUE5HDQoaCgAJAEGBgAULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQcKDBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHkhwULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEHCiQULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQaGLBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHiiwULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGQkAUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgM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ADekAAB7Zcx7zMT/AFqXAACMqspDosr/ABiMAACR86wIaKz/APW/AABBEfnw+ej/AOawAABNKevM68X/ANeiAABfPd2o3bX/APqVAAB7Zcx7zMT/ALiKAACMqspDosr/AJWDAACR86wIaKz/AJW+AABBEfnw+ej/AIavAABNKevM68X/AHehAABfPd2o3bX/AJqUAAB7Zcx7zMT/AFiJAACJoNNOs9P/ADWCAACNxb4rjL7/AHp8AACT8p4IWJ7/ADW9AAA8DPz3/PD/ACauAABMGfPg89v/ABegAABNKevM68X/ADqTAABfPd2o3bX/APiHAAB7Zcx7zMT/ANWAAACJoNNOs9P/ABp7AACNxb4rjL7/ALV2AACT8p4IWJ7/AP+7AAA8DPz3/PD/APCsAABMGfPg89v/AOGeAABNKevM68X/AASSAABfPd2o3bX/AMKGAAB7Zcx7zMT/AJ9/AACJoNNOs9P/AOR5AACNxb4rjL7/AH91AACR86wIaKz/AG5yAACW74EIQIH/AEfEAABKFfXl9eD/ADi1AABQSNmh2Zv/ACmnAABisqMxo1T/AOfCAABJD/jt+On/ANizAABONuS65LP/AMmlAABWaMR0xHb/AOyYAABivosji0X/AIfBAABJD/jt+On/AHiyAABONuS65LP/AGmkAABWaMR0xHb/AIyXAABisqMxo1T/AEqMAABm/20AbSz/ACfAAABJD/jt+On/ABixAABNLOnH6cD/AAmjAABQSNmh2Zv/ACyWAABWaMR0xHb/AOqKAABisqMxo1T/AMeDAABm/20AbSz/AMe+AABJD/jt+On/ALivAABNLOnH6cD/AKmhAABQSNmh2Zv/AMyUAABWaMR0xHb/AIqJAABgnqtBq13/AGeCAABivosji0X/AKx8AABs/1oAWjL/AGe9AABIB/z3/PX/AFiuAABKFfXl9eD/AEmgAABNLOnH6cD/AGyTAABQSNmh2Zv/ACqIAABWaMR0xHb/AAeBAABgnqtBq13/AEx7AABivosji0X/AOd2AABs/1oAWjL/ACa8AABIB/z3/PX/ABetAABKFfXl9eD/AAifAABNLOnH6cD/ACuSAABQSNmh2Zv/AOmGAABWaMR0xHb/AMZ/AABgnqtBq13/AAt6AABivosji0X/AKZ1AABm/20AbSz/AJVyAABl/0QARBv/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AG/DAADk3NDQHIv/AGC0AADlPvHxttr/AFGmAAA9Z+G44Yb/AHSZAABIxqxNrCb/AA/CAADk3NDQHIv/AACzAADlPvHxttr/APGkAAAAAPf39/f/ABSYAAA9Z+G44Yb/ANKMAABIxqxNrCb/AK/AAADm3MXFG33/AKCxAADnTOnpo8n/AJGjAADpHf394O//ALSWAAA7JvXm9dD/AHKLAAA/gdeh12r/AE+EAABExZJNkiH/AE+/AADm3MXFG33/AECwAADnTOnpo8n/ADGiAADpHf394O//AFSVAAAAAPf39/f/ABKKAAA7JvXm9dD/AO+CAAA/gdeh12r/ADR9AABExZJNkiH/AO+9AADm3MXFG33/AOCuAADodt7ed67/ANGgAADlPvHxttr/APSTAADpHf394O//ALKIAAA7JvXm9dD/AI+BAAA9Z+G44Yb/ANR7AAA/prx/vEH/AG93AABExZJNkiH/AK68AADm3MXFG33/AJ+tAADodt7ed67/AJCfAADlPvHxttr/ALOSAADpHf394O//AHGHAAAAAPf39/f/AE6AAAA7JvXm9dD/AJN6AAA9Z+G44Yb/AC52AAA/prx/vEH/AB1zAABExZJNkiH/AP7FAADO/0tAAEv/AB7KAABl/0QARBv/AO+2AADOrYN2KoP/AOCoAADHV6uZcKv/AKOaAADHM8/Cpc//AAGOAADSFejn1Oj/AH6FAABMHvDZ8NP/AGN+AABQRNum26D/AJ54AABYe65armH/AC10AABhxXgbeDf/AIbFAADO/0tAAEv/AJvJAABhxXgbeDf/AGG7AABl/0QARBv/AHe2AADOrYN2KoP/AGioAADHV6uZcKv/ACuaAADHM8/Cpc//AImNAADSFejn1Oj/AAaFAAAAAPf39/f/AOt9AABMHvDZ8NP/ACZ4AABQRNum26D/ALVzAABYe65armH/AKXEAADERsOvjcP/AJa1AAAAAPf39/f/AIenAABSWr9/v3v/AEXDAADJqJR7MpT/ADa0AADHM8/Cpc//ACemAABQRNum26D/AEqZAABm/4gAiDf/AOXBAADJqJR7MpT/ANayAADHM8/Cpc//AMekAAAAAPf39/f/AOqXAABQRNum26D/AKiMAABm/4gAiDf/AIXAAADOrYN2KoP/AHaxAADERsOvjcP/AGejAADSFejn1Oj/AIqWAABMHvDZ8NP/AEiLAABSWr9/v3v/ACWEAABhxXgbeDf/ACW/AADOrYN2KoP/ABawAADERsOvjcP/AAeiAADSFejn1Oj/ACqVAAAAAPf39/f/AOiJAABMHvDZ8NP/AMWCAABSWr9/v3v/AAp9AABhxXgbeDf/AMW9AADOrYN2KoP/ALauAADHV6uZcKv/AKegAADHM8/Cpc//AMqTAADSFejn1Oj/AIiIAABMHvDZ8NP/AGWBAABQRNum26D/AKp7AABYe65armH/AEV3AABhxXgbeDf/AIS8AADOrYN2KoP/AHWtAADHV6uZcKv/AGafAADHM8/Cpc//AImSAADSFejn1Oj/AEeHAAAAAPf39/f/ACSAAABMHvDZ8NP/AGl6AABQRNum26D/AAR2AABYe65armH/APNyAABhxXgbeDf/AAHEAAC9C/Ls5/L/APK0AACXPdumvdv/AOOmAACNxb4rjL7/AKHCAAC5CPbx7vb/AJKzAACbKOG9yeH/AIOlAACRcM90qc//AKaYAACP97AFcLD/AEHBAAC5CPbx7vb/ADKyAACbKOG9yeH/ACOkAACRcM90qc//AEaXAACNxb4rjL7/AASMAACP940EWo3/AOG/AAC5CPbx7vb/ANKwAACoGObQ0eb/AMOiAACXPdumvdv/AOaVAACRcM90qc//AKSKAACNxb4rjL7/AIGDAACP940EWo3/AIG+AAC5CPbx7vb/AHKvAACoGObQ0eb/AGOhAACXPdumvdv/AIaUAACRcM90qc//AESJAACOt8A2kMD/ACGCAACP97AFcLD/AGZ8AACP+HsDTnv/ACG9AADpCP//9/v/ABKuAAC9C/Ls5/L/AAOgAACoGObQ0eb/ACaTAACXPdumvdv/AOSHAACRcM90qc//AMGAAACOt8A2kMD/AAZ7AACP97AFcLD/AKF2AACP+HsDTnv/AOu7AADpCP//9/v/ANysAAC9C/Ls5/L/AM2eAACoGObQ0eb/APCRAACXPdumvdv/AK6GAACRcM90qc//AIt/AACOt8A2kMD/ANB5AACP97AFcLD/AGt1AACP940EWo3/AFpyAACP+VgCOFj/AJHEAADIDvDs4vD/AIK1AACXPdumvdv/AHOnAACC0JkckJn/ADHDAADPCPf27/f/ACK0AACbKOG9yeH/ABOmAACPgM9nqc//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ANaZAADPhKOYTqP/AHHCAAD+4eTkGhz/AGKzAACSsrg3frj/AFOlAABTk69Nr0r/AHaYAADPhKOYTqP/ADSNAAAV////fwD/ABHBAAD+4eTkGhz/AAKyAACSsrg3frj/APOjAABTk69Nr0r/ABaXAADPhKOYTqP/ANSLAAAV////fwD/ALGEAAAqzP///zP/ALG/AAD+4eTkGhz/AKKwAACSsrg3frj/AJOiAABTk69Nr0r/ALaVAADPhKOYTqP/AHSKAAAV////fwD/AFGDAAAqzP///zP/AJZ9AAAPwaamVij/AFG+AAD+4eTkGhz/AEKvAACSsrg3frj/ADOhAABTk69Nr0r/AFaUAADPhKOYTqP/ABSJAAAV////fwD/APGBAAAqzP///zP/ADZ8AAAPwaamVij/ANF3AADoeff3gb//APG8AAD+4eTkGhz/AOKtAACSsrg3frj/ANOfAABTk69Nr0r/APaSAADPhKOYTqP/ALSHAAAV////fwD/AJGAAAAqzP///zP/ANZ6AAAPwaamVij/AHF2AADoeff3gb//AGBzAAAAAJmZmZn/ABLFAAByeMJmwqX/AAO2AAALm/z8jWL/APSnAACcTcuNoMv/ALLDAAByeMJmwqX/AKO0AAALm/z8jWL/AJSmAACcTcuNoMv/ALeZAADkZufnisP/AFLCAAByeMJmwqX/AEOzAAALm/z8jWL/ADSlAACcTcuNoMv/AFeYAADkZufnisP/ABWNAAA6m9im2FT/APLAAAByeMJmwqX/AOOxAAALm/z8jWL/ANSjAACcTcuNoMv/APeWAADkZufnisP/ALWLAAA6m9im2FT/AJKEAAAi0P//2S//AJK/AAByeMJmwqX/AIOwAAALm/z8jWL/AHSiAACcTcuNoMv/AJeVAADkZufnisP/AFWKAAA6m9im2FT/ADKDAAAi0P//2S//AHd9AAAZWuXlxJT/ADK+AAByeMJmwqX/ACOvAAALm/z8jWL/ABShAACcTcuNoMv/ADeUAADkZufnisP/APWIAAA6m9im2FT/ANKBAAAi0P//2S//ABd8AAAZWuXlxJT/ALJ3AAAAALOzs7P/AELGAAB4VNON08f/AGjKAADTUr28gL3/ADO3AAAqTP///7P/ACSpAACvJdq+utr/AOeaAAAEi/v7gHL/AEWOAACQZNOAsdP/AMKFAAAWnP39tGL/AKd+AAA6ht6z3mn/AOJ4AADpL/z8zeX/AHF0AAAAANnZ2dn/AMrFAAB4VNON08f/AOXJAADTUr28gL3/AKu7AABNKevM68X/ALu2AAAqTP///7P/AKyoAACvJdq+utr/AG+aAAAEi/v7gHL/AM2NAACQZNOAsdP/AEqFAAAWnP39tGL/AC9+AAA6ht6z3mn/AGp4AADpL/z8zeX/APlzAAAAANnZ2dn/AFLFAAB4VNON08f/AGLJAADTUr28gL3/ACi7AABNKevM68X/ALasAAAlkP//7W//AEO2AAAqTP///7P/ADSoAACvJdq+utr/APeZAAAEi/v7gHL/AFWNAACQZNOAsdP/ANKEAAAWnP39tGL/ALd9AAA6ht6z3mn/APJ3AADpL/z8zeX/AIFzAAAAANnZ2dn/AAnFAAB4VNON08f/APq1AAAqTP///7P/AOunAACvJdq+utr/AKnDAAB4VNON08f/AJq0AAAqTP///7P/AIumAACvJdq+utr/AK6ZAAAEi/v7gHL/AEnCAAB4VNON08f/ADqzAAAqTP///7P/ACulAACvJdq+utr/AE6YAAAEi/v7gHL/AAyNAACQZNOAsdP/AOnAAAB4VNON08f/ANqxAAAqTP///7P/AMujAACvJdq+utr/AO6WAAAEi/v7gHL/AKyLAACQZNOAsdP/AImEAAAWnP39tGL/AIm/AAB4VNON08f/AHqwAAAqTP///7P/AGuiAACvJdq+utr/AI6VAAAEi/v7gHL/AEyKAACQZNOAsdP/ACmDAAAWnP39tGL/AG59AAA6ht6z3mn/ACm+AAB4VNON08f/ABqvAAAqTP///7P/AAuhAACvJdq+utr/AC6UAAAEi/v7gHL/AOyIAACQZNOAsdP/AMmBAAAWnP39tGL/AA58AAA6ht6z3mn/AKl3AADpL/z8zeX/AOi8AAB4VNON08f/ANmtAAAqTP///7P/AMqfAACvJdq+utr/AO2SAAAEi/v7gHL/AKuHAACQZNOAsdP/AIiAAAAWnP39tGL/AM16AAA6ht6z3mn/AGh2AADpL/z8zeX/AFdzAAAAANnZ2dn/ABTGAADt/Z6eAUL/ADbKAACxgqJeT6L/AAW3AAD6tNXVPk//APaoAAAKuPT0bUP/ALmaAAAUnf39rmH/ABeOAAAfc/7+4Iv/AJSFAAAxYPXm9Zj/AHl+AABPQd2r3aT/ALR4AAByeMJmwqX/AEN0AACPu70yiL3/AJzFAADt/Z6eAUL/ALPJAACPu70yiL3/AHm7AACxgqJeT6L/AI22AAD6tNXVPk//AH6oAAAKuPT0bUP/AEGaAAAUnf39rmH/AJ+NAAAfc/7+4Iv/AByFAAAqQP///7//AAF+AAAxYPXm9Zj/ADx4AABPQd2r3aT/AMtzAAByeMJmwqX/AMLEAAANpPz8jVn/ALO1AAAqQP///7//AKSnAABRTdWZ1ZT/AGLDAAD+4dfXGRz/AFO0AAAUnf39rmH/AESmAABPQd2r3aT/AGeZAACPxLorg7r/AALCAAD+4dfXGRz/APOyAAAUnf39rmH/AOSkAAAqQP///7//AAeYAABPQd2r3aT/AMWMAACPxLorg7r/AKLAAAD6tNXVPk//AJOxAAANpPz8jVn/AISjAAAfc/7+4Iv/AKeWAAAxYPXm9Zj/AGWLAABRTdWZ1ZT/AEKEAACPu70yiL3/AEK/AAD6tNXVPk//ADOwAAANpPz8jVn/ACSiAAAfc/7+4Iv/AEeVAAAqQP///7//AAWKAAAxYPXm9Zj/AOKCAABRTdWZ1ZT/ACd9AACPu70yiL3/AOK9AAD6tNXVPk//ANOuAAAKuPT0bUP/AMSgAAAUnf39rmH/AOeTAAAfc/7+4Iv/AKWIAAAxYPXm9Zj/AIKBAABPQd2r3aT/AMd7AAByeMJmwqX/AGJ3AACPu70yiL3/AKG8AAD6tNXVPk//AJKtAAAKuPT0bUP/AIOfAAAUnf39rmH/AKaSAAAfc/7+4Iv/AGSHAAAqQP///7//AEGAAAAxYPXm9Zj/AIZ6AABPQd2r3aT/ACF2AAByeMJmwqX/ABBzAACPu70yiL3/AFxHAACTD//w+P//AK9IAAAYI/r669f/AClgAAB///8A////AH5LAABxgP9//9T/AKFKAAB/D//w////AINOAAAqGvX19dz/AENFAAAXOv//5MT/AIA6AAAAAAAAAAD/ADJSAAAZMf//683/AGtHAACq//8AAP//AA8RAADAzuKKK+L/APgvAAAAvqWlKir/AKxRAAAXY97euIf/AHFGAACAZ6BfnqD/AGBJAAA///9//wD/ADBJAAAR2tLSaR7/AHo4AAALr///f1D/AIBGAACak+1kle3/ACs6AAAhIv//+Nz/AEYwAAD259zcFDz/AI80AAB///8A////AP9GAACq/4sAAIv/AIE0AAB//4sAi4v/AHdRAAAe77i4hgv/AEEIAAAAAKmpqan/AJ8zAABV/2QAZAD/AHYHAAAAAKmpqan/AAk7AAAnbr29t2v/AD1gAADU/4uLAIv/ANYzAAA6jmtVay//AF5OAAAX////jAD/AHpTAADGwMyZMsz/AIZVAAAA/4uLAAD/AMYwAAAKeenplnr/ADg0AABVPbyPvI//ADpHAACvj4tIPYv/AGMIAAB/Z08vT0//AJgHAAB/Z08vT0//ABVKAACA/9EAztH/AP8QAADH/9OUANP/AMs5AADo6///FJP/ACJGAACK//8Av///ADQIAAAAAGlpaWn/AGkHAAAAAGlpaWn/AJRGAACU4f8ekP//AGQ6AAAAzrKyIiL/AJ5IAAAcD///+vD/AGIzAABVwIsiiyL/AAJhAADU////AP//AO4uAAAAANzc3Nz/AH1IAACqB//4+P//AL9SAAAj////1wD/AJ1RAAAe2drapSD/AJUIAAAAAICAgID/AGE0AABV/4AAgAD/AE4KAAA70P+t/y//AMoHAAAAAICAgID/AFcLAABVD//w//D/AK85AADplv//abT/AHdVAAAAjM3NXFz/AEwvAADC/4JLAIL/AFYGAAAqD/////D/ABg7AAAmavDw5oz/AAIdAACqFPrm5vr/AG08AADwD///8PX/AJAzAABA//x8/AD/ABQyAAAmMf//+s3/AGJGAACJP+at2Ob/AGo4AAAAd/DwgID/AHI0AAB/H//g////AF8KAAAqKPr6+tL/ACUIAAAAANPT09P/AHMzAABVZO6Q7pD/AFoHAAAAANPT09P/ALw5AAD4Sf//tsH/ALUwAAAMhP//oHr/ABE0AAB90bIgsqr/ABBGAACPdfqHzvr/AE8IAACUOJl3iJn/AIQHAACUOJl3iJn/AM1GAACXNN6wxN7/AD0KAAAqH////+D/ABhMAABV//8A/wD/AOozAABVwM0yzTL/AAwzAAAVFPr68Ob/AE5gAADU////AP//AKkwAAAA/4CAAAD/AGhLAABxgM1mzar/AL1GAACq/80AAM3/AGhTAADMmNO6VdP/AOBMAAC3fNuTcNv/ACQ0AABnqbM8s3H/ACVHAACwj+57aO7/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APeqAAAXJO7u38z/AMacAAAXJM3NwLD/AAeQAAAYIouLg3j/AC5gAAB///8A////AINLAABxgP9//9T/AKW5AABxgP9//9T/AD2rAABxgO527sb/AAydAABxgM1mzar/AFSQAABxgItFi3T/AKZKAAB/D//w////AJ65AAB/D//w////ADarAAB/D+7g7u7/AAWdAAB/Ds3Bzc3/AEaQAAB/DouDi4v/AIhOAAAqGvX19dz/AEhFAAAXOv//5MT/AOe4AAAXOv//5MT/AH+qAAAXOu7u1bf/AE6cAAAWOs3Nt57/AI+PAAAXOouLfWv/AIU6AAAAAAAAAAD/ADdSAAAZMf//683/AHBHAACq//8AAP//AEy5AACq//8AAP//AOSqAACq/+4AAO7/ALOcAACq/80AAM3/APSPAACq/4sAAIv/ABQRAADAzuKKK+L/AP0vAAAAvqWlKir/AOi3AAAAv///QED/AJypAAAAv+7uOzv/AHObAAAAv83NMzP/ALSOAAAAvouLIyP/ALFRAAAXY97euIf/AAS6AAAXZP//05v/AIurAAAXY+7uxZH/AFqdAAAXY83Nqn3/AKKQAAAXY4uLc1X/AHZGAACAZ6BfnqD/ABW5AACDZ/+Y9f//AK2qAACDZu6O5e7/AHycAACDZ816xc3/AL2PAACDZotThov/AGVJAAA///9//wD/AHi5AAA///9//wD/ABCrAAA//+527gD/AN+cAAA//81mzQD/ACCQAAA//4tFiwD/ADVJAAAR2tLSaR7/AG25AAAR2///fyT/AAWrAAAR2+7udiH/ANScAAAR2s3NZh3/ABWQAAAR3IuLRRP/AH84AAALr///f1D/AHe4AAAHqf//clb/AByqAAAGqe7ualD/APObAAAGqc3NW0X/ADSPAAAGqIuLPi//AIVGAACak+1kle3/ADA6AAAhIv//+Nz/AJy4AAAhIv//+Nz/AEGqAAAiI+7u6M3/ABicAAAiIs3NyLH/AFmPAAAjIouLiHj/AEswAAD259zcFDz/AJQ0AAB///8A////AFy4AAB///8A////AAGqAAB//+4A7u7/ANibAAB//80Azc3/ABmPAAB//4sAi4v/AARHAACq/4sAAIv/AIY0AAB//4sAi4v/AHxRAAAe77i4hgv/APW5AAAe8P//uQ//AHyrAAAe8O7urQ7/AEudAAAe8M3NlQz/AJOQAAAe8IuLZQj/AEYIAAAAAKmpqan/AKQzAABV/2QAZAD/AHsHAAAAAKmpqan/AA47AAAnbr29t2v/AEJgAADU/4uLAIv/ANszAAA6jmtVay//AC64AAA6j//K/3D/ANOpAAA6j+687mj/AKqbAAA6j82izVr/AOuOAAA6j4tuiz3/AGNOAAAX////jAD/AMi5AAAV////fwD/AGCrAAAV/+7udgD/AC+dAAAV/83NZgD/AHeQAAAV/4uLRQD/AH9TAADGwMyZMsz/ACO6AADGwf+/Pv//AKqrAADGwO6yOu7/AHmdAADGwM2aMs3/AMGQAADGwItoIov/AItVAAAA/4uLAAD/AMswAAAKeenplnr/AD00AABVPbyPvI//AEm4AABVPv/B/8H/AO6pAABVPu607rT/AMWbAABVPs2bzZv/AAaPAABVPotpi2n/AD9HAACvj4tIPYv/AGgIAAB/Z08vT0//AJK3AAB/aP+X////AEKpAAB/Z+6N7u7/ACubAAB/aM15zc3/AHGOAAB/aItSi4v/AJ0HAAB/Z08vT0//ABpKAACA/9EAztH/AAQRAADH/9OUANP/ANA5AADo6///FJP/AJK4AADo6///FJP/ADeqAADo6+7uEon/AA6cAADo683NEHb/AE+PAADn7IuLClD/ACdGAACK//8Av///AP24AACK//8Av///AJWqAACK/+4Asu7/AGScAACK/80Ams3/AKWPAACK/4sAaIv/ADkIAAAAAGlpaWn/AG4HAAAAAGlpaWn/AJlGAACU4f8ekP//ACC5AACU4f8ekP//ALiqAACU4e4chu7/AIecAACU4c0YdM3/AMiPAACU4YsQTov/AGk6AAAAzrKyIiL/AKa4AAAAz///MDD/AEuqAAAAz+7uLCz/ACKcAAAAz83NJib/AGOPAAAAz4uLGhr/AKNIAAAcD///+vD/AGczAABVwIsiiyL/AAdhAADU////AP//APMuAAAAANzc3Nz/AIJIAACqB//4+P//AMRSAAAj////1wD/AA+6AAAj////1wD/AJarAAAj/+7uyQD/AGWdAAAj/83NrQD/AK2QAAAj/4uLdQD/AKJRAAAe2drapSD/APm5AAAe2v//wSX/AICrAAAe2u7utCL/AE+dAAAe2s3Nmx3/AJeQAAAe2ouLaRT/AJoIAAAAAMDAwMD/AMbHAAAAAAAAAAD/AJu3AAAAAAMDAwP/AEHJAAAAABoaGhr/AIDKAAAAAP//////AA+7AAAAABwcHBz/AJasAAAAAB8fHx//AKaeAAAAACEhISH/AMKRAAAAACQkJCT/AICGAAAAACYmJib/AGR/AAAAACkpKSn/AKl5AAAAACsrKyv/AER1AAAAAC4uLi7/ADNyAAAAADAwMDD/AEupAAAAAAUFBQX/ADPJAAAAADMzMzP/AAG7AAAAADY2Njb/AIisAAAAADg4ODj/AJieAAAAADs7Ozv/ALSRAAAAAD09PT3/AHKGAAAAAEBAQED/AFZ/AAAAAEJCQkL/AJt5AAAAAEVFRUX/ADZ1AAAAAEdHR0f/ACVyAAAAAEpKSkr/ADSbAAAAAAgICAj/AB3JAAAAAE1NTU3/APO6AAAAAE9PT0//AHqsAAAAAFJSUlL/AIqeAAAAAFRUVFT/AJ+RAAAAAFdXV1f/AGSGAAAAAFlZWVn/AEh/AAAAAFxcXFz/AI15AAAAAF5eXl7/ACh1AAAAAGFhYWH/ABdyAAAAAGNjY2P/AHqOAAAAAAoKCgr/AADJAAAAAGZmZmb/AOW6AAAAAGlpaWn/AGysAAAAAGtra2v/AHyeAAAAAG5ubm7/AJGRAAAAAHBwcHD/AFaGAAAAAHNzc3P/ADp/AAAAAHV1dXX/AH95AAAAAHh4eHj/ABp1AAAAAHp6enr/AAlyAAAAAH19fX3/ANKFAAAAAA0NDQ3/APLIAAAAAH9/f3//ANe6AAAAAIKCgoL/AF6sAAAAAIWFhYX/AC2eAAAAAIeHh4f/AHWRAAAAAIqKior/AEiGAAAAAIyMjIz/ACx/AAAAAI+Pj4//AHF5AAAAAJGRkZH/AAx1AAAAAJSUlJT/APtxAAAAAJaWlpb/ALt+AAAAAA8PDw//AOTIAAAAAJmZmZn/AMm6AAAAAJycnJz/AFCsAAAAAJ6enp7/AB+eAAAAAKGhoaH/AGeRAAAAAKOjo6P/ADqGAAAAAKampqb/AB5/AAAAAKioqKj/AGN5AAAAAKurq6v/AP50AAAAAK2tra3/AO1xAAAAALCwsLD/AAB5AAAAABISEhL/AF7IAAAAALOzs7P/ALu6AAAAALW1tbX/AEKsAAAAALi4uLj/ABGeAAAAALq6urr/AFmRAAAAAL29vb3/ACyGAAAAAL+/v7//ABB/AAAAAMLCwsL/AFV5AAAAAMTExMT/APB0AAAAAMfHx8f/AN9xAAAAAMnJycn/AIF0AAAAABQUFBT/AEPIAAAAAMzMzMz/AKi6AAAAAM/Pz8//AC+sAAAAANHR0dH/AP6dAAAAANTU1NT/AEaRAAAAANbW1tb/ABmGAAAAANnZ2dn/AP1+AAAAANvb29v/AEJ5AAAAAN7e3t7/AN10AAAAAODg4OD/AMFxAAAAAOPj4+P/AINxAAAAABcXFxf/ADDIAAAAAOXl5eX/AJW6AAAAAOjo6Oj/ABysAAAAAOvr6+v/AOudAAAAAO3t7e3/ADORAAAAAPDw8PD/AAaGAAAAAPLy8vL/AOp+AAAAAPX19fX/AC95AAAAAPf39/f/AMp0AAAAAPr6+vr/AK5xAAAAAPz8/Pz/AGY0AABV//8A/wD/AFC4AABV//8A/wD/APWpAABV/+4A7gD/AMybAABV/80AzQD/AA2PAABV/4sAiwD/AFMKAAA70P+t/y//AM8HAAAAAMDAwMD/AMDHAAAAAAAAAAD/AIy3AAAAAAMDAwP/ADrJAAAAABoaGhr/AHjKAAAAAP//////AAi7AAAAABwcHBz/AI+sAAAAAB8fHx//AJ+eAAAAACEhISH/ALuRAAAAACQkJCT/AHmGAAAAACYmJib/AF1/AAAAACkpKSn/AKJ5AAAAACsrKyv/AD11AAAAAC4uLi7/ACxyAAAAADAwMDD/ADypAAAAAAUFBQX/ACzJAAAAADMzMzP/APq6AAAAADY2Njb/AIGsAAAAADg4ODj/AJGeAAAAADs7Ozv/AK2RAAAAAD09PT3/AGuGAAAAAEBAQED/AE9/AAAAAEJCQkL/AJR5AAAAAEVFRUX/AC91AAAAAEdHR0f/AB5yAAAAAEpKSkr/ACWbAAAAAAgICAj/ABbJAAAAAE1NTU3/AOy6AAAAAE9PT0//AHOsAAAAAFJSUlL/AIOeAAAAAFRUVFT/AJiRAAAAAFdXV1f/AF2GAAAAAFlZWVn/AEF/AAAAAFxcXFz/AIZ5AAAAAF5eXl7/ACF1AAAAAGFhYWH/ABByAAAAAGNjY2P/AGuOAAAAAAoKCgr/APnIAAAAAGZmZmb/AN66AAAAAGlpaWn/AGWsAAAAAGtra2v/AHWeAAAAAG5ubm7/AIqRAAAAAHBwcHD/AE+GAAAAAHNzc3P/ADN/AAAAAHV1dXX/AHh5AAAAAHh4eHj/ABN1AAAAAHp6enr/AAJyAAAAAH19fX3/AMyFAAAAAA0NDQ3/AOvIAAAAAH9/f3//ANC6AAAAAIKCgoL/AFesAAAAAIWFhYX/ACaeAAAAAIeHh4f/AG6RAAAAAIqKior/AEGGAAAAAIyMjIz/ACV/AAAAAI+Pj4//AGp5AAAAAJGRkZH/AAV1AAAAAJSUlJT/APRxAAAAAJaWlpb/ALV+AAAAAA8PDw//AN3IAAAAAJmZmZn/AMK6AAAAAJycnJz/AEmsAAAAAJ6enp7/ABieAAAAAKGhoaH/AGCRAAAAAKOjo6P/ADOGAAAAAKampqb/ABd/AAAAAKioqKj/AFx5AAAAAKurq6v/APd0AAAAAK2tra3/AOZxAAAAALCwsLD/APp4AAAAABISEhL/AFfIAAAAALOzs7P/ALS6AAAAALW1tbX/ADusAAAAALi4uLj/AAqeAAAAALq6urr/AFKRAAAAAL29vb3/ACWGAAAAAL+/v7//AAl/AAAAAMLCwsL/AE55AAAAAMTExMT/AOl0AAAAAMfHx8f/ANhxAAAAAMnJycn/AHt0AAAAABQUFBT/ADzIAAAAAMzMzMz/AKG6AAAAAM/Pz8//ACisAAAAANHR0dH/APedAAAAANTU1NT/AD+RAAAAANbW1tb/ABKGAAAAANnZ2dn/APZ+AAAAANvb29v/ADt5AAAAAN7e3t7/ANZ0AAAAAODg4OD/ALpxAAAAAOPj4+P/AH1xAAAAABcXFxf/ACnIAAAAAOXl5eX/AI66AAAAAOjo6Oj/ABWsAAAAAOvr6+v/AOSdAAAAAO3t7e3/ACyRAAAAAPDw8PD/AP+FAAAAAPLy8vL/AON+AAAAAPX19fX/ACh5AAAAAPf39/f/AMN0AAAAAPr6+vr/AKdxAAAAAPz8/Pz/AFwLAABVD//w//D/ALi3AABVD//w//D/AGipAABVD+7g7uD/AFGbAABVDs3BzcH/AJeOAABVDouDi4P/ALQ5AADplv//abT/AH64AADqkf//brT/ACOqAADrje7uaqf/APqbAADsh83NYJD/ADuPAADqlIuLOmL/AHxVAAAAjM3NXFz/AD66AAAAlP//amr/AMWrAAAAlO7uY2P/AJSdAAAAlc3NVVX/ANyQAAAAlIuLOjr/AFEvAADC/4JLAIL/ALMWAAAqAP////4AAFsGAAAqD/////D/AIW3AAAqD/////D/ADWpAAAqD+7u7uD/AAebAAAqDs3NzcH/AGSOAAAqDouLi4P/AB07AAAmavDw5oz/AMa4AAAncP//9o//AFaqAAAncO7u5oX/AC2cAAAnb83NxnP/AG6PAAAnb4uLhk7/AAcdAACqFPrm5vr/AHI8AADwD///8PX/AM24AADwD///8PX/AF2qAADvD+7u4OX/ADScAADwDs3NwcX/AHWPAADvDouLg4b/AJUzAABA//x8/AD/ABkyAAAmMf//+s3/AAS4AAAmMf//+s3/ALipAAAlMu7u6b//AI+bAAAmMc3NyaX/ANCOAAAnMYuLiXD/AGdGAACJP+at2Ob/AAq5AACKQP+/7///AKKqAACKQO6y3+7/AHGcAACKP82awM3/ALKPAACJQItog4v/AG84AAAAd/DwgID/AHc0AAB/H//g////AFe4AAB/H//g////APypAAB/H+7R7u7/ANObAAB/H820zc3/ABSPAAB/H4t6i4v/AFhRAAAjc+7u3YL/AOW5AAAjdP//7Iv/AGyrAAAjc+7u3IL/ADudAAAjc83NvnD/AIOQAAAjc4uLgUz/AGQKAAAqKPr6+tL/ACoIAAAAANPT09P/AHgzAABVZO6Q7pD/AF8HAAAAANPT09P/AME5AAD4Sf//tsH/AIe4AAD5Uf//rrn/ACyqAAD4Ue7uoq3/AAOcAAD5UM3NjJX/AESPAAD5UIuLX2X/ALowAAAMhP//oHr/APe3AAAMhP//oHr/AKupAAALhO7ulXL/AIKbAAAMhc3NgWL/AMOOAAAMhYuLV0L/ABY0AAB90bIgsqr/ABVGAACPdfqHzvr/AO+4AACPT/+w4v//AIeqAACPT+6k0+7/AFacAACOT82Nts3/AJePAACPTotge4v/ABZHAACvj/+EcP//AFQIAACUOJl3iJn/AIkHAACUOJl3iJn/ANJGAACXNN6wxN7/ACy5AACXNf/K4f//AMSqAACXNe680u7/AJOcAACXNc2itc3/ANSPAACWNYtue4v/AEIKAAAqH////+D/AKu3AAAqH////+D/AFupAAAqH+7u7tH/AESbAAAqH83NzbT/AIqOAAAqH4uLi3r/AB1MAABV//8A/wD/AO8zAABVwM0yzTL/ABEzAAAVFPr68Ob/AFNgAADU////AP//AF+6AADU////AP//AOarAADU/+7uAO7/ALWdAADU/83NAM3/AP2QAADU/4uLAIv/AK4wAADvubCwMGD/AO+3AADky///NLP/AKOpAADky+7uMKf/AHqbAADkzM3NKZD/ALuOAADky4uLHGL/AG1LAABxgM1mzar/AMJGAACq/80AAM3/AG1TAADMmNO6VdP/ABW6AADLmf/gZv//AJyrAADLme7RX+7/AGudAADLmc20Us3/ALOQAADLmot6N4v/AOVMAAC3fNuTcNv/ALq5AAC3ff+rgv//AFKrAAC3fe6fee7/ACGdAAC3fc2JaM3/AGmQAAC3fItdR4v/ACk0AABnqbM8s3H/ACpHAACwj+57aO7/ALMzAABv//oA+pr/AAVKAAB9p9FI0cz/AOdUAADk5MfHFYX/AFVGAACqxnAZGXD/AIQ2AABqCf/1//r/AJJJAAAEHv//5OH/AIS5AAAEHv//5OH/AByrAAAEHu7u1dL/AOucAAADHc3Nt7X/ACyQAAAFHYuLfXv/AEEyAAAaSf//5LX/AJJIAAAZUf//3q3/AFK5AAAZUf//3q3/AOqqAAAZUu7uz6H/ALmcAAAZUs3Ns4v/APqPAAAZUouLeV7/AIcEAACq/4AAAID/AAdGAACq/4AAAID/AEBLAAAqAP////4AAAdRAAAbF/399eb/APJEAAAq/4CAgAD/ABhgAAA4wI5rjiP/AFS6AAA4wf/A/z7/ANurAAA4wO6z7jr/AKqdAAA4wM2azTL/APKQAAA4wItpiyL/AHNOAAAb////pQD/AMy5AAAb////pQD/AGSrAAAb/+7umgD/ADOdAAAb/83NhQD/AHuQAAAb/4uLWgD/AN5VAAAL////RQD/AEm6AAAL////RQD/ANCrAAAL/+7uQAD/AJ+dAAAL/83NNwD/AOeQAAAL/4uLJQD/AI9TAADWe9racNb/ACe6AADWfP//g/r/AK6rAADWfO7ueun/AH2dAADWfM3Nacn/AMWQAADVfIuLR4n/AI9RAAAmSO7u6Kr/AP4zAABVZPuY+5j/AD64AABVZf+a/5r/AOOpAABVZO6Q7pD/ALqbAABVZM18zXz/APuOAABVZItUi1T/AC1KAAB/Q+6v7u7/AI+5AAB/RP+7////ACerAAB/RO6u7u7/APacAAB/RM2Wzc3/ADeQAAB/Q4tmi4v/APxUAADxfNvbcJP/AC+6AADxff//gqv/ALarAADxfe7ueZ//AIWdAADxfc3NaIn/AM2QAADxfIuLR13/AEctAAAaKf//79X/ACJCAAAURv//2rn/ANy4AAAURv//2rn/AGyqAAATRe7uy63/AEOcAAATRc3Nr5X/AISPAAAURYuLd2X/ANULAAAUsM3NhT//AOc5AAD3P///wMv/AJa4AAD1Sf//tcX/ADuqAAD1Se7uqbj/ABKcAAD1Ss3NkZ7/AFOPAAD1SYuLY2z/APg1AADURt3doN3/AGe4AADURP//u///AAyqAADURO7uru7/AOObAADURM3Nls3/ACSPAADUQ4uLZov/AKlGAACEO+aw4Ob/AEFNAADE3fCgIPD/AMC5AAC/z/+bMP//AFirAADAz+6RLO7/ACedAADAz819Js3/AG+QAADAz4tVGov/AAdNAAC/qplmM5n/AChWAAAA////AAD/AE+6AAAA////AAD/ANarAAAA/+7uAAD/AKWdAAAA/83NAAD/AO2QAAAA/4uLAAD/AL8vAAAAPby8j4//AOS3AAAAPv//wcH/AJipAAAAPu7utLT/AG+bAAAAPs3Nm5v/ALCOAAAAPouLaWn/APVGAACfteFBaeH/ADy5AACft/9Idv//ANSqAACft+5Dbu7/AKOcAACfts06X83/AOSPAACft4snQIv/AOwvAAAR3IuLRRP/ANswAAAEivr6gHL/APy3AAAJlv//jGn/ALCpAAAJlu7ugmL/AIebAAAJls3NcFT/AMiOAAAJlouLTDn/AM4vAAATmvT0pGD/AE80AABnqosui1f/AE24AABnq/9U/5//APKpAABnq+5O7pT/AMmbAABnq81DzYD/AAqPAABnqosui1f/AD03AAAREP//9e7/AG24AAAREP//9e7/ABKqAAASEe7u5d7/AOmbAAASEc3Nxb//ACqPAAASEIuLhoL/AM1gAAANt6CgUi3/AGi6AAANuP//gkf/AO+rAAANuO7ueUL/AL6dAAANuM3NaDn/AAaRAAANuYuLRyb/ANsbAAAAAMDAwMD/ADhGAACLbOuHzuv/AAG5AACQeP+Hzv//AJmqAACQeO5+wO7/AGicAACQeM1sps3/AKmPAACRd4tKcIv/AFJHAACvj81qWs3/AEe5AACvkP+Db///AN+qAACvkO56Z+7/AK6cAACvkM1pWc3/AO+PAACvkItHPIv/AHsIAACUOJBwgJD/AJa3AACVOP/G4v//AEapAACVOO650+7/AC+bAACUOc2fts3/AHWOAACVOItse4v/ALAHAACUOJBwgJD/ABcKAAAABf//+vr/AKW3AAAABf//+vr/AFWpAAAABe7u6en/AD6bAAAABM3Nycn/AISOAAAAA4uLiYn/AMozAABq//8A/3//ACG4AABq//8A/3//AMapAABq/+4A7nb/AJ2bAABq/80AzWb/AN6OAABq/4sAi0X/AOZGAACSm7RGgrT/ADG5AACSnP9juP//AMmqAACSnO5crO7/AJicAACSnM1PlM3/ANmPAACTm4s2ZIv/AK00AAAYVNLStIz/AGK4AAAUsP//pU//AAeqAAAUsO7umkn/AN6bAAAUsM3NhT//AB+PAAAUsIuLWiv/AAo5AAB//4AAgID/ANJMAADUHdjYv9j/ALG5AADUHv//4f//AEmrAADUHu7u0u7/ABidAADUHc3Ntc3/AGCQAADUHYuLe4v/ANwuAAAGuP//Y0f/ANy3AAAGuP//Y0f/AJCpAAAGuO7uXEL/AGebAAAGuM3NTzn/AKiOAAAGuYuLNib/ALsPAAAqAP////4AAEBKAAB7tuBA4ND/AJO5AACB//8A9f//ACurAACB/+4A5e7/APqcAACB/80Axc3/ADuQAACB/4sAhov/ACQRAADUc+7ugu7/AABVAADj19DQIJD/ADO6AADrwf//Ppb/ALqrAADrwO7uOoz/AImdAADrwM3NMnj/ANGQAADrwIuLIlL/AIUIAAAAAICAgID/AAg0AABV/4AAgAD/ALoHAAAAAICAgID/AJUwAAAA/4CAAAD/AP1MAADU/4CAAID/AMsSAAAbRPX13rP/AMu3AAAbRf//57r/AH+pAAAbRO7u2K7/AFubAAAbRM3Nupb/AKGOAAAbQ4uLfmb/AMZIAAAAAP//////AEROAAAAAPX19fX/AI0IAAAAAL6+vr7/AFg0AABV//8A/wD/AMIHAAAAAL6+vr7/AJ8wAADvubCwMGD/ADJNAADE3fCgIPD/AH4KAAAq/////wD/ALC3AAAq/////wD/AGCpAAAq/+7u7gD/AEmbAAAq/83NzQD/AI+OAAAq/4uLiwD/AEQzAAA4wM2azTL/AEHAggcLA5R4AgBBzoIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//vHgCAEHeigcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE///weAIAQe6SBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//xh5AgBB/ZoHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//yB5AgBBjqMHC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//KHkCAEGeqwcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//80eQIAQa6zBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//0B5AgBBvrsHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//SHkCAEHOwwcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9QeQIAQd7LBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//1h5AgBB7tMHC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkFQgRrBYEEuQP2AzkFuwRBB2gEKATTA5kCZgOZAvwD/ANnAjkEOQRLAzkE7gOIAjkEOAT3AQsC1wP3AW4GOAQ4BDkEOQTRAicDxgI4BMED9gWtA8MDLgPAAs0DwAL8A///DAAAAAQAAAAGAAAAAgAAAAMAAAABAAAACQAAAAgAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADMAAAA0AAAANQAAADYAAAA3AAAAOAAAADkAAAA6AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABHAAAASAAAAEkAAABKAAAASwAAAEwAAABNAAAATgAAAFEAAABSAAAAUwAAAFQAAABV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APUAAABlFwAAlyIAALo2AAD2AAAAt2AAALYAAABFDgAAAiIAAFM3AAAwIAAAYCwAAKUiAAAjOwAAxgMAAM46AADAAwAAjAsAANYDAAAqMgAAsQAAAOhRAACjAAAADEwAADIgAABTUQAADyIAAKQsAAAdIgAAszoAAMgDAABiDgAAIgAAALAaAADSIQAA+1oAABoiAABSQAAAKiMAAL8uAAC7AAAAlxoAAJIhAABaNwAACSMAAJkuAAAdIAAADzkAABwhAAAIQQAArgAAAEMbAAALIwAARC8AAMEDAABSNgAADyAAALEuAAA6IAAAjS4AABkgAACrLgAAGiAAAIcwAABhAQAA7A4AAMUiAADSEQAApwAAADIHAACtAAAA6GAAAMMDAAC8QgAAwgMAAFY2AAA8IgAAoxgAAGAmAACpXwAAgiIAABRRAACGIgAA7zUAABEiAAA8LAAAgyIAANK3AAC5AAAAhqkAALIAAABimwAAswAAAO1KAACHIgAAmUAAAN8AAADrCwAAxAMAAE2QAAA0IgAAbGAAALgDAADeNQAA0QMAAEosAAAJIAAAQDAAAP4AAAAkUAAA3AIAAGYXAADXAAAAMVAAACIhAACrGgAA0SEAALxHAAD6AAAAkRoAAJEhAABaWQAA+wAAAPhEAAD5AAAA6DYAAKgAAAAbPQAA0gMAAOIwAADFAwAAtTYAAPwAAABlLAAAGCEAALA6AAC+AwAAtUcAAP0AAAC2MgAApQAAALA2AAD/AAAAZ2AAALYDAACWOgAADSAAAJo6AAAMIAAA5z8BAAgAAAADAAAA5T4AACLQAAALAAAABgAAAFcVAADzaAAAAgAAAAEAAADKLAAApXQAAAQAAAACAAAAGUIAAAAEAAADAAAABAAAAAxBAAAu0AAABQAAAAUAAAC4QgAABAQAAAQAAAAHAAAALRUAAKo2AAAFAAAACQAAAKw2AAAibQAABAAAAAoAAAAsQgAAQPkBAAQAAAAMAAAAsC8AAAAAAQAAAdDR0tPU1dbX2NkAQebyBwsJ8L8AAAAAAAABAEH48gcLDWludmlzAABmaWxsZWQAQZDzBwsaMBoAACJRAADPNQAAbgsAAPR4AABpxgAAVY4AQdDzBwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB4PQHC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBqvUHC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQfD2BwsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBmPcHCwb//v///wMAQcT3Bwty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEHA+AcLAQcAQdD4BwsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQZD5BwsV//////////////////////////8/AEGw+QcLFf//////////////////////////DwBB1fkHC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f//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rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQYG1CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIjJCUmJygM//8F////CRT//////wwbHP8QFRYhIiMkJSYnKBsc/////yEiIyQlJicoDP8SExQRFhf///////8MGxz///8SISIjJCUmJygbHP////8hIiMkJSYnKAz///////8T////////DBsc/////yEiIyQlJicoGxz/////ISIjJCUmJygSExQVFhcYGf///////////yMkJSYnGxITFBYXIjZoAR84ViEgAhsbG14bGzc5cDbSwk8EPCJHIj8iRCIiWCJlIiIFBl9gOQQHCAkKCwwNDgRmZ11qbQUGb1g7cQcICQoLDA0OBHI8W3M+YUYbEhMUFhcEBQY/QWJJBwgJCgsMDQ4FBgBcAAAHCAkKCwwNDgQAAE8AAABTQgAAAAAABAUGAERUVQcICQoLDA0OBQYAAAAABwgJCgsMDQ4EACosLkcxMwAAAAAAAAQFBgAAAEoHCAkKCwwNDgUGAAAAAAcICQoLDA0OBAAAAAAAAEwAAAAAAAAEBQYAAAAABwgJCgsMDQ4FBgAAAAAHCAkKCwwNDikrLS8wMjQ1AEHLuwgLLikrLTAyAAQvACQjABIUFhocHiAYAAUHLy8vAC8vAAAJCCgAAAEiAgYAAAAAAAgAQYa8CAs+JQMmEwopFQsqFw4tGREbDCsdDSwfDyEQADMAMAAvQwAxAC8ANS4nQjJBADo4ADw0RQA2AEAAAD8ARDc7OT0AQdG8CAtFAgMDAQECAQEBAwMDAwMDAwMBAQEBAQEBAQEBAQEBAQEBAgEBAgAGAQMDAwMDAQABAgMABAECAwAEAAQABAADAgECAQIBAEGhvQgLRSkqKiorLCwtLS0tLS0tLS0tLi8wMTIzNDU2Nzg5Ojs8PT4+Pz9BQEJCQkJCQkNDRERERkVHR0dJSEpIS0hMSE1NTk5PTwBB8L0IC5cBrv+u//z/6AD2////GgAAACcAAQAyAK7/rv8CACQAAwAvAK7/rv+u/67/rv/+/5QArv8JABsArv+8/67/rv+v/67/rv+u/67/rv+u/67/AAAAAw8QESM6JD0lQBVDJkUnSBhLGU0aKBxOHR5QUVJZWmxrbmNkV2kASAAAACgAAAAYAAAAOAAAABgAAAAIAAAADgAAAGxucgBBmL8ICwIdAQBBuL8ICy5zb2xpZAAAc2V0bGluZXdpZHRoADEAAADoTwAA704AAIERAAAIPQAAtzwAAL88AEHwvwgL5QFgsQIAcLECAICxAgCQsQIAoLECALCxAgDAsQIA0LECAHCxAgBwsQIAsLECALCxAgAfAAAAPwAAAH8AAAAAAAAAhToAAHBHAABmNAAAlDQAAChWAABTYAAAfgoAAMZIAAAAAAAAyNgAAI3eAADa1gAACD0AAAg9AADoTwAA704AAGJsYWNrAAAABwAAAG5vbmUANSwyADEsNQB0cmFuc3BhcmVudAAAAAAIPQAACD0AAO9OAADvTgAAPDgAAAg9AADvTgAA704AAOhPAADvTgAA6E8AAO9OAAABAAAAAQAAAAEAAAABAEHowQgLBQEAAAABAEH4wQgLGC5cIiAAIyAAZG90IHBpYyBwbHVnaW46IABBoMIIC4YCQUIAAPk6AABBSQAAV0UAAEFSAACBOQAAQVgAAG5FAABCIAAA5FIAAEJJAACFWgAAQ0IAAO9SAABDTwAAohwAAENYAACiRQAASCAAAExhAABIQgAAIFMAAEhJAAD1RQAASFgAALZFAABIYgAAzlIAAEhpAADMRQAASHIAAO8JAABIeAAAhUUAAEkgAADGWgAAS0IAAOw6AABLSQAARFoAAEtSAACTEAAAS1gAAHJaAABOQgAAClMAAE5JAADjWgAATlIAAAU1AABOWAAAqloAAFBBAAD2NAAAUEIAAPxSAABQSQAA01oAAFBYAACWWgAAUiAAAOo0AABTIAAAmzYAAFpEAAA+FABBuMQICxmdAQAAAAAAAG5ldHdvcmsgc2ltcGxleDogAEHgxAgLIQEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAEAAAACAAAABABBlMUICwKnAQBBtMUIC6MErAEAAK0BAAABAQAAJSUhUFMtQWRvYmUtMi4wCiUlJSVCb3VuZGluZ0JveDogKGF0ZW5kKQovcG9pbnQgewogIC9ZIGV4Y2ggZGVmCiAgL1ggZXhjaCBkZWYKICBuZXdwYXRoCiAgWCBZIDMgMCAzNjAgYXJjIGZpbGwKfSBkZWYKL2NlbGwgewogIC9ZIGV4Y2ggZGVmCiAgL1ggZXhjaCBkZWYKICAveSBleGNoIGRlZgogIC94IGV4Y2ggZGVmCiAgbmV3cGF0aAogIHggeSBtb3ZldG8KICB4IFkgbGluZXRvCiAgWCBZIGxpbmV0bwogIFggeSBsaW5ldG8KICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCi9ub2RlIHsKIC91IGV4Y2ggZGVmCiAvciBleGNoIGRlZgogL2QgZXhjaCBkZWYKIC9sIGV4Y2ggZGVmCiBuZXdwYXRoIGwgZCBtb3ZldG8KIHIgZCBsaW5ldG8gciB1IGxpbmV0byBsIHUgbGluZXRvCiBjbG9zZXBhdGggZmlsbAp9IGRlZgoKAAAAHW4AAKloAADNZwAAwGgAAL5nAADiGwAA6E8AAAg9AAAUCAAAChIAADRWUFNDADdJbmNWUFNDAE5TdDNfXzIyMF9fc2hhcmVkX3B0cl9lbXBsYWNlSU4xMl9HTE9CQUxfX05fMTROb2RlRU5TXzlhbGxvY2F0b3JJUzJfRUVFRQBB5MkIC8IB8T8BAEBLAAABAAAA0ToAANk6AAADAAAAOU4AAM0/AAANAAAAVhQAAFYUAAAOAAAATVkAAE1ZAAAPAAAAhi0AAIYtAAACAAAALU4AAMk/AAAEAAAAegQAALk/AAAFAAAAPi8AANITAAAGAAAACgkAANITAAAHAAAAcgQAALUTAAAIAAAAAQkAAM8TAAAJAAAAPS8AAJcTAAAKAAAACQkAAJcTAAALAAAAcQQAAHMTAAAMAAAAAAkAAJQTAAAQAAAAEzYAQcDLCAtQp20AAHNnAACSZwAAVGcAAOdsAAC6bQAA42wAAAAAAACnbQAAxmsAAK9nAACBbgAAAAAAAAAA8D8AAAAAAAD4PwAAAAAAAAAABtDPQ+v9TD4AQZvMCAtlQAO44j9Pu2EFZ6zdPxgtRFT7Iek/m/aB0gtz7z8YLURU+yH5P+JlLyJ/K3o8B1wUMyamgTy9y/B6iAdwPAdcFDMmppE8GC1EVPsh6T8YLURU+yHpv9IhM3982QJA0iEzf3zZAsAAQY/NCAvoFYAYLURU+yEJQBgtRFT7IQnAAwAAAAQAAAAEAAAABgAAAIP5ogBETm4A/CkVANFXJwDdNPUAYtvAADyZlQBBkEMAY1H+ALveqwC3YcUAOm4kANJNQgBJBuAACeouAByS0QDrHf4AKbEcAOg+pwD1NYIARLsuAJzphAC0JnAAQX5fANaROQBTgzkAnPQ5AItfhAAo+b0A+B87AN7/lwAPmAUAES/vAApaiwBtH20Az342AAnLJwBGT7cAnmY/AC3qXwC6J3UA5evHAD178QD3OQcAklKKAPtr6gAfsV8ACF2NADADVgB7/EYA8KtrACC8zwA29JoA46kdAF5hkQAIG+YAhZllAKAUXwCNQGgAgNj/ACdzTQAGBjEAylYVAMmocwB74mAAa4zAABnERwDNZ8MACejcAFmDKgCLdsQAphyWAESv3QAZV9EApT4FAAUH/wAzfj8AwjLoAJhP3gC7fTIAJj3DAB5r7wCf+F4ANR86AH/yygDxhx0AfJAhAGokfADVbvoAMC13ABU7QwC1FMYAwxmdAK3EwgAsTUEADABdAIZ9RgDjcS0Am8aaADNiAAC00nwAtKeXADdV1QDXPvYAoxAYAE12/ABknSoAcNerAGN8+AB6sFcAFxXnAMBJVgA71tkAp4Q4ACQjywDWincAWlQjAAAfuQDxChsAGc7fAJ8x/wBmHmoAmVdhAKz7RwB+f9gAImW3ADLoiQDmv2AA78TNAGw2CQBdP9QAFt7XAFg73gDem5IA0iIoACiG6ADiWE0AxsoyAAjjFgDgfcsAF8BQAPMdpwAY4FsALhM0AIMSYgCDSAEA9Y5bAK2wfwAe6fIASEpDABBn0wCq3dgArl9CAGphzgAKKKQA05m0AAam8gBcd38Ao8KDAGE8iACKc3gAr4xaAG/XvQAtpmMA9L/LAI2B7wAmwWcAVcpFAMrZNgAoqNIAwmGNABLJdwAEJhQAEkabAMRZxADIxUQATbKRAAAX8wDUQ60AKUnlAP3VEAAAvvwAHpTMAHDO7gATPvUA7PGAALPnwwDH+CgAkwWUAMFxPgAuCbMAC0XzAIgSnACrIHsALrWfAEeSwgB7Mi8ADFVtAHKnkABr5x8AMcuWAHkWSgBBeeIA9N+JAOiUlwDi5oQAmTGXAIjtawBfXzYAu/0OAEiatABnpGwAcXJCAI1dMgCfFbgAvOUJAI0xJQD3dDkAMAUcAA0MAQBLCGgALO5YAEeqkAB05wIAvdYkAPd9pgBuSHIAnxbvAI6UpgC0kfYA0VNRAM8K8gAgmDMA9Ut+ALJjaADdPl8AQF0DAIWJfwBVUikAN2TAAG3YEAAySDIAW0x1AE5x1ABFVG4ACwnBACr1aQAUZtUAJwedAF0EUAC0O9sA6nbFAIf5FwBJa30AHSe6AJZpKQDGzKwArRRUAJDiagCI2YkALHJQAASkvgB3B5QA8zBwAAD8JwDqcagAZsJJAGTgPQCX3YMAoz+XAEOU/QANhowAMUHeAJI5nQDdcIwAF7fnAAjfOwAVNysAXICgAFqAkwAQEZIAD+jYAGyArwDb/0sAOJAPAFkYdgBipRUAYcu7AMeJuQAQQL0A0vIEAEl1JwDrtvYA2yK7AAoUqgCJJi8AZIN2AAk7MwAOlBoAUTqqAB2jwgCv7a4AXCYSAG3CTQAtepwAwFaXAAM/gwAJ8PYAK0CMAG0xmQA5tAcADCAVANjDWwD1ksQAxq1LAE7KpQCnN80A5qk2AKuSlADdQmgAGWPeAHaM7wBoi1IA/Ns3AK6hqwDfFTEAAK6hAAz72gBkTWYA7QW3ACllMABXVr8AR/86AGr5uQB1vvMAKJPfAKuAMABmjPYABMsVAPoiBgDZ5B0APbOkAFcbjwA2zQkATkLpABO+pAAzI7UA8KoaAE9lqADSwaUACz8PAFt4zQAj+XYAe4sEAIkXcgDGplMAb27iAO/rAACbSlgAxNq3AKpmugB2z88A0QIdALHxLQCMmcEAw613AIZI2gD3XaAAxoD0AKzwLwDd7JoAP1y8ANDebQCQxx8AKtu2AKMlOgAAr5oArVOTALZXBAApLbQAS4B+ANoHpwB2qg4Ae1mhABYSKgDcty0A+uX9AInb/gCJvv0A5HZsAAap/AA+gHAAhW4VAP2H/wAoPgcAYWczACoYhgBNveoAs+evAI9tbgCVZzkAMb9bAITXSAAw3xYAxy1DACVhNQDJcM4AMMu4AL9s/QCkAKIABWzkAFrdoAAhb0cAYhLSALlchABwYUkAa1bgAJlSAQBQVTcAHtW3ADPxxAATbl8AXTDkAIUuqQAdssMAoTI2AAi3pADqsdQAFvchAI9p5AAn/3cADAOAAI1ALQBPzaAAIKWZALOi0wAvXQoAtPlCABHaywB9vtAAm9vBAKsXvQDKooEACGpcAC5VFwAnAFUAfxTwAOEHhgAUC2QAlkGNAIe+3gDa/SoAayW2AHuJNAAF8/4Aub+eAGhqTwBKKqgAT8RaAC34vADXWpgA9MeVAA1NjQAgOqYApFdfABQ/sQCAOJUAzCABAHHdhgDJ3rYAv2D1AE1lEQABB2sAjLCsALLA0ABRVUgAHvsOAJVywwCjBjsAwEA1AAbcewDgRcwATin6ANbKyADo80EAfGTeAJtk2ADZvjEApJfDAHdY1ABp48UA8NoTALo6PABGGEYAVXVfANK99QBuksYArC5dAA5E7QAcPkIAYcSHACn96QDn1vMAInzKAG+RNQAI4MUA/9eNAG5q4gCw/cYAkwjBAHxddABrrbIAzW6dAD5yewDGEWoA98+pAClz3wC1yboAtwBRAOKyDQB0uiQA5X1gAHTYigANFSwAgRgMAH5mlAABKRYAn3p2AP39vgBWRe8A2X42AOzZEwCLurkAxJf8ADGoJwDxbsMAlMU2ANioVgC0qLUAz8wOABKJLQBvVzQALFaJAJnO4wDWILkAa16qAD4qnAARX8wA/QtKAOH0+wCOO20A4oYsAOnUhAD8tKkA7+7RAC41yQAvOWEAOCFEABvZyACB/AoA+0pqAC8c2ABTtIQATpmMAFQizAAqVdwAwMbWAAsZlgAacLgAaZVkACZaYAA/Uu4AfxEPAPS1EQD8y/UANLwtADS87gDoXcwA3V5gAGeOmwCSM+8AyRe4AGFYmwDhV7wAUYPGANg+EADdcUgALRzdAK8YoQAhLEYAWfPXANl6mACeVMAAT4b6AFYG/ADlea4AiSI2ADitIgBnk9wAVeiqAIImOADK55sAUQ2kAJkzsQCp1w4AaQVIAGWy8AB/iKcAiEyXAPnRNgAhkrMAe4JKAJjPIQBAn9wA3EdVAOF0OgBn60IA/p3fAF7UXwB7Z6QAuqx6AFX2ogAriCMAQbpVAFluCAAhKoYAOUeDAInj5gDlntQASftAAP9W6QAcD8oAxVmKAJT6KwDTwcUAD8XPANtargBHxYYAhUNiACGGOwAseZQAEGGHACpMewCALBoAQ78SAIgmkAB4PIkAqMTkAOXbewDEOsIAJvTqAPdnigANkr8AZaMrAD2TsQC9fAsApFHcACfdYwBp4d0AmpQZAKgplQBozigACe20AESfIABOmMoAcIJjAH58IwAPuTIAp/WOABRW5wAh8QgAtZ0qAG9+TQClGVEAtfmrAILf1gCW3WEAFjYCAMQ6nwCDoqEAcu1tADmNegCCuKkAazJcAEYnWwAANO0A0gB3APz0VQABWU0A4HGAAEGD4wgLrQFA+yH5PwAAAAAtRHQ+AAAAgJhG+DwAAABgUcx4OwAAAICDG/A5AAAAQCAlejgAAACAIoLjNgAAAAAd82k1/oIrZUcVZ0AAAAAAAAA4QwAA+v5CLna/OjuevJr3DL29/f/////fPzxUVVVVVcU/kSsXz1VVpT8X0KRnERGBPwAAAAAAAMhC7zn6/kIu5j8kxIL/vb/OP7X0DNcIa6w/zFBG0quygz+EOk6b4NdVPwBBvuQIC5UQ8D9uv4gaTzubPDUz+6k99u8/XdzYnBNgcbxhgHc+muzvP9FmhxB6XpC8hX9u6BXj7z8T9mc1UtKMPHSFFdOw2e8/+o75I4DOi7ze9t0pa9DvP2HI5mFO92A8yJt1GEXH7z+Z0zNb5KOQPIPzxso+vu8/bXuDXaaalzwPiflsWLXvP/zv/ZIatY4890dyK5Ks7z/RnC9wPb4+PKLR0zLso+8/C26QiTQDarwb0/6vZpvvPw69LypSVpW8UVsS0AGT7z9V6k6M74BQvMwxbMC9iu8/FvTVuSPJkbzgLamumoLvP69VXOnj04A8UY6lyJh67z9Ik6XqFRuAvHtRfTy4cu8/PTLeVfAfj7zqjYw4+WrvP79TEz+MiYs8dctv61tj7z8m6xF2nNmWvNRcBITgW+8/YC86PvfsmjyquWgxh1TvP504hsuC54+8Hdn8IlBN7z+Nw6ZEQW+KPNaMYog7Ru8/fQTksAV6gDyW3H2RST/vP5SoqOP9jpY8OGJ1bno47z99SHTyGF6HPD+msk/OMe8/8ucfmCtHgDzdfOJlRSvvP14IcT97uJa8gWP14d8k7z8xqwlt4feCPOHeH/WdHu8/+r9vGpshPbyQ2drQfxjvP7QKDHKCN4s8CwPkpoUS7z+Py86JkhRuPFYvPqmvDO8/tquwTXVNgzwVtzEK/gbvP0x0rOIBQoY8MdhM/HAB7z9K+NNdOd2PPP8WZLII/O4/BFuOO4Cjhrzxn5JfxfbuP2hQS8ztSpK8y6k6N6fx7j+OLVEb+AeZvGbYBW2u7O4/0jaUPujRcbz3n+U02+fuPxUbzrMZGZm85agTwy3j7j9tTCqnSJ+FPCI0Ekym3u4/imkoemASk7wcgKwERdruP1uJF0iPp1i8Ki73IQrW7j8bmklnmyx8vJeoUNn10e4/EazCYO1jQzwtiWFgCM7uP+9kBjsJZpY8VwAd7UHK7j95A6Ha4cxuPNA8wbWixu4/MBIPP47/kzze09fwKsPuP7CvervOkHY8Jyo21dq/7j934FTrvR2TPA3d/ZmyvO4/jqNxADSUj7ynLJ12srnuP0mjk9zM3oe8QmbPotq27j9fOA+9xt54vIJPnVYrtO4/9lx77EYShrwPkl3KpLHuP47X/RgFNZM82ie1Nkev7j8Fm4ovt5h7PP3Hl9QSre4/CVQc4uFjkDwpVEjdB6vuP+rGGVCFxzQ8t0ZZiiap7j81wGQr5jKUPEghrRVvp+4/n3aZYUrkjLwJ3Ha54aXuP6hN7zvFM4y8hVU6sH6k7j+u6SuJeFOEvCDDzDRGo+4/WFhWeN3Ok7wlIlWCOKLuP2QZfoCqEFc8c6lM1FWh7j8oIl6/77OTvM07f2aeoO4/grk0h60Sary/2gt1EqDuP+6pbbjvZ2O8LxplPLKf7j9RiOBUPdyAvISUUfl9n+4/zz5afmQfeLx0X+zodZ/uP7B9i8BK7oa8dIGlSJqf7j+K5lUeMhmGvMlnQlbrn+4/09QJXsuckDw/Xd5PaaDuPx2lTbncMnu8hwHrcxSh7j9rwGdU/eyUPDLBMAHtoe4/VWzWq+HrZTxiTs8286LuP0LPsy/FoYi8Eho+VCek7j80NzvxtmmTvBPOTJmJpe4/Hv8ZOoRegLytxyNGGqfuP25XcthQ1JS87ZJEm9mo7j8Aig5bZ62QPJlmitnHqu4/tOrwwS+3jTzboCpC5azuP//nxZxgtmW8jES1FjKv7j9EX/NZg/Z7PDZ3FZmuse4/gz0epx8Jk7zG/5ELW7TuPykebIu4qV285cXNsDe37j9ZuZB8+SNsvA9SyMtEuu4/qvn0IkNDkrxQTt6fgr3uP0uOZtdsyoW8ugfKcPHA7j8nzpEr/K9xPJDwo4KRxO4/u3MK4TXSbTwjI+MZY8juP2MiYiIExYe8ZeVde2bM7j/VMeLjhhyLPDMtSuyb0O4/Fbu809G7kbxdJT6yA9XuP9Ix7pwxzJA8WLMwE57Z7j+zWnNuhGmEPL/9eVVr3u4/tJ2Ol83fgrx689O/a+PuP4czy5J3Gow8rdNamZ/o7j/62dFKj3uQvGa2jSkH7u4/uq7cVtnDVbz7FU+4ovPuP0D2pj0OpJC8OlnljXL57j80k6049NZovEde+/J2/+4/NYpYa+LukbxKBqEwsAXvP83dXwrX/3Q80sFLkB4M7z+smJL6+72RvAke11vCEu8/swyvMK5uczycUoXdmxnvP5T9n1wy4448etD/X6sg7z+sWQnRj+CEPEvRVy7xJ+8/ZxpOOK/NYzy15waUbS/vP2gZkmwsa2c8aZDv3CA37z/StcyDGIqAvPrDXVULP+8/b/r/P12tj7x8iQdKLUfvP0mpdTiuDZC88okNCIdP7z+nBz2mhaN0PIek+9wYWO8/DyJAIJ6RgryYg8kW42DvP6ySwdVQWo48hTLbA+Zp7z9LawGsWTqEPGC0AfMhc+8/Hz60ByHVgrxfm3szl3zvP8kNRzu5Kom8KaH1FEaG7z/TiDpgBLZ0PPY/i+cukO8/cXKdUezFgzyDTMf7UZrvP/CR048S94+82pCkoq+k7z99dCPimK6NvPFnji1Ir+8/CCCqQbzDjjwnWmHuG7rvPzLrqcOUK4Q8l7prNyvF7z/uhdExqWSKPEBFblt20O8/7eM75Lo3jrwUvpyt/dvvP53NkU07iXc82JCegcHn7z+JzGBBwQVTPPFxjyvC8+8/3hIElQAAAAD///////////////8wOgIAFAAAAEMuVVRGLTgAQYD1CAsDRDoCAEGg9QgLR0xDX0NUWVBFAAAAAExDX05VTUVSSUMAAExDX1RJTUUAAAAAAExDX0NPTExBVEUAAExDX01PTkVUQVJZAExDX01FU1NBR0VTAEHw9QgLB0MuVVRGLTgAQYj2CAugEDCrAgDIqwIAWKwCAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQdiGCQsMIQQAAAAAAAAAAC8CAEH4hgkLBjUERwRWBABBjocJCwKgBABBoocJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEHQhwkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEHxiAkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBBq4kJCwEMAEG3iQkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABB5YkJCwEQAEHxiQkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBn4oJCwESAEGrigkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBB4ooJCw4aAAAAGhoaAAAAAAAACQBBk4sJCwEUAEGfiwkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABBzYsJCwEWAEHZiwkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBBpIwJCwILAgBBzIwJCwj//////////wBBkI0JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAVEkCAA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAABAAAAAAAAACQSQIAGwIAABwCAAD8/////P///5BJAgAdAgAAHgIAALhIAgDMSAIAAAAAANhJAgAfAgAAIAIAAA8CAAAQAgAAIQIAACICAAATAgAAFAIAABUCAAAjAgAAFwIAACQCAAAZAgAAJQIAAMh0AgAoSQIA7EoCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAoHQCAFxJAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAJHUCAKhJAgAAAAAAAQAAABxJAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAyHQCAORJAgBUSQIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRz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";return u}var uA;function XA(u){if(u==uA&&Q)return new Uint8Array(Q);var w=f(u);if(w)return w;throw"both async and sync fetching of the wasm failed"}function EA(u){return Promise.resolve().then(()=>XA(u))}function ZA(u,w,S){return EA(u).then(T=>WebAssembly.instantiate(T,w)).then(S,T=>{B(`failed to asynchronously prepare wasm: ${T}`),KA(T)})}function MA(u,w,S,T){return ZA(w,S,T)}function be(){return{a:Ft}}function _A(){var u=be();function w(T,k){return rt=T.exports,b=rt.y,z(),aA(rt.z),mA(),rt}UA();function S(T){w(T.instance)}return uA??=HA(),MA(Q,uA,u,S).catch(o),{}}function pA(u){return i.agerrMessages.push(Me(u)),0}function Rt(u){this.name="ExitStatus",this.message=`Program terminated with exit(${u})`,this.status=u}var Et=u=>{u.forEach(w=>w(i))};function Qe(u,w="i8"){switch(w.endsWith("*")&&(w="*"),w){case"i1":return M[u];case"i8":return M[u];case"i16":return F[u>>1];case"i32":return G[u>>2];case"i64":return j[u>>3];case"float":return Y[u>>2];case"double":return AA[u>>3];case"*":return U[u>>2];default:KA(`invalid type for getValue: ${w}`)}}var _t=u=>Yi(u),Ue=()=>cn(),Te=typeof TextDecoder<"u"?new TextDecoder:void 0,ht=(u,w=0,S=NaN)=>{for(var T=w+S,k=w;u[k]&&!(k>=T);)++k;if(k-w>16&&u.buffer&&Te)return Te.decode(u.subarray(w,k));for(var H="";w>10,56320|Ae&1023)}}return H},Me=(u,w)=>u?ht(v,u,w):"",Ai=(u,w,S,T)=>{KA(`Assertion failed: ${Me(u)}, at: `+[w?Me(w):"unknown filename",S,T?Me(T):"unknown function"])};class J{constructor(w){this.excPtr=w,this.ptr=w-24}set_type(w){U[this.ptr+4>>2]=w}get_type(){return U[this.ptr+4>>2]}set_destructor(w){U[this.ptr+8>>2]=w}get_destructor(){return U[this.ptr+8>>2]}set_caught(w){w=w?1:0,M[this.ptr+12]=w}get_caught(){return M[this.ptr+12]!=0}set_rethrown(w){w=w?1:0,M[this.ptr+13]=w}get_rethrown(){return M[this.ptr+13]!=0}init(w,S){this.set_adjusted_ptr(0),this.set_type(w),this.set_destructor(S)}set_adjusted_ptr(w){U[this.ptr+16>>2]=w}get_adjusted_ptr(){return U[this.ptr+16>>2]}}var O=0,tA=(u,w,S)=>{var T=new J(u);throw T.init(w,S),O=u,O},oA={isAbs:u=>u.charAt(0)==="/",splitPath:u=>{var w=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return w.exec(u).slice(1)},normalizeArray:(u,w)=>{for(var S=0,T=u.length-1;T>=0;T--){var k=u[T];k==="."?u.splice(T,1):k===".."?(u.splice(T,1),S++):S&&(u.splice(T,1),S--)}if(w)for(;S;S--)u.unshift("..");return u},normalize:u=>{var w=oA.isAbs(u),S=u.substr(-1)==="/";return u=oA.normalizeArray(u.split("/").filter(T=>!!T),!w).join("/"),!u&&!w&&(u="."),u&&S&&(u+="/"),(w?"/":"")+u},dirname:u=>{var w=oA.splitPath(u),S=w[0],T=w[1];return!S&&!T?".":(T&&(T=T.substr(0,T.length-1)),S+T)},basename:u=>{if(u==="/")return"/";u=oA.normalize(u),u=u.replace(/\/$/,"");var w=u.lastIndexOf("/");return w===-1?u:u.substr(w+1)},join:(...u)=>oA.normalize(u.join("/")),join2:(u,w)=>oA.normalize(u+"/"+w)},NA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return u=>crypto.getRandomValues(u);KA("initRandomDevice")},de=u=>(de=NA())(u),Ee={resolve:(...u)=>{for(var w="",S=!1,T=u.length-1;T>=-1&&!S;T--){var k=T>=0?u[T]:L.cwd();if(typeof k!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!k)return"";w=k+"/"+w,S=oA.isAbs(k)}return w=oA.normalizeArray(w.split("/").filter(H=>!!H),!S).join("/"),(S?"/":"")+w||"."},relative:(u,w)=>{u=Ee.resolve(u).substr(1),w=Ee.resolve(w).substr(1);function S(Ae){for(var ne=0;ne=0&&Ae[Be]==="";Be--);return ne>Be?[]:Ae.slice(ne,Be-ne+1)}for(var T=S(u.split("/")),k=S(w.split("/")),H=Math.min(T.length,k.length),Z=H,gA=0;gA{for(var w=0,S=0;S=55296&&T<=57343?(w+=4,++S):w+=3}return w},dt=(u,w,S,T)=>{if(!(T>0))return 0;for(var k=S,H=S+T-1,Z=0;Z=55296&&gA<=57343){var DA=u.charCodeAt(++Z);gA=65536+((gA&1023)<<10)|DA&1023}if(gA<=127){if(S>=H)break;w[S++]=gA}else if(gA<=2047){if(S+1>=H)break;w[S++]=192|gA>>6,w[S++]=128|gA&63}else if(gA<=65535){if(S+2>=H)break;w[S++]=224|gA>>12,w[S++]=128|gA>>6&63,w[S++]=128|gA&63}else{if(S+3>=H)break;w[S++]=240|gA>>18,w[S++]=128|gA>>12&63,w[S++]=128|gA>>6&63,w[S++]=128|gA&63}}return w[S]=0,S-k};function At(u,w,S){var T=S>0?S:LA(u)+1,k=new Array(T),H=dt(u,k,0,k.length);return w&&(k.length=H),k}var Je=()=>{if(!xA.length){var u=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(u=window.prompt("Input: "),u!==null&&(u+=` `)),!u)return null;xA=At(u,!0)}return xA.shift()},Ge={ttys:[],init(){},shutdown(){},register(u,w){Ge.ttys[u]={input:[],output:[],ops:w},L.registerDevice(u,Ge.stream_ops)},stream_ops:{open(u){var w=Ge.ttys[u.node.rdev];if(!w)throw new L.ErrnoError(43);u.tty=w,u.seekable=!1},close(u){u.tty.ops.fsync(u.tty)},fsync(u){u.tty.ops.fsync(u.tty)},read(u,w,S,T,k){if(!u.tty||!u.tty.ops.get_char)throw new L.ErrnoError(60);for(var H=0,Z=0;Z0&&(d(ht(u.output)),u.output=[])},ioctl_tcgets(u){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(u,w,S){return 0},ioctl_tiocgwinsz(u){return[24,80]}},default_tty1_ops:{put_char(u,w){w===null||w===10?(B(ht(u.output)),u.output=[]):w!=0&&u.output.push(w)},fsync(u){u.output&&u.output.length>0&&(B(ht(u.output)),u.output=[])}}},ri=(u,w)=>{v.fill(0,u,u+w)},en=(u,w)=>Math.ceil(u/w)*w,rn=u=>{u=en(u,65536);var w=xi(65536,u);return w&&ri(w,u),w},Le={ops_table:null,mount(u){return Le.createNode(null,"/",16895,0)},createNode(u,w,S,T){if(L.isBlkdev(S)||L.isFIFO(S))throw new L.ErrnoError(63);Le.ops_table||={dir:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr,lookup:Le.node_ops.lookup,mknod:Le.node_ops.mknod,rename:Le.node_ops.rename,unlink:Le.node_ops.unlink,rmdir:Le.node_ops.rmdir,readdir:Le.node_ops.readdir,symlink:Le.node_ops.symlink},stream:{llseek:Le.stream_ops.llseek}},file:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr},stream:{llseek:Le.stream_ops.llseek,read:Le.stream_ops.read,write:Le.stream_ops.write,allocate:Le.stream_ops.allocate,mmap:Le.stream_ops.mmap,msync:Le.stream_ops.msync}},link:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr,readlink:Le.node_ops.readlink},stream:{}},chrdev:{node:{getattr:Le.node_ops.getattr,setattr:Le.node_ops.setattr},stream:L.chrdev_stream_ops}};var k=L.createNode(u,w,S,T);return L.isDir(k.mode)?(k.node_ops=Le.ops_table.dir.node,k.stream_ops=Le.ops_table.dir.stream,k.contents={}):L.isFile(k.mode)?(k.node_ops=Le.ops_table.file.node,k.stream_ops=Le.ops_table.file.stream,k.usedBytes=0,k.contents=null):L.isLink(k.mode)?(k.node_ops=Le.ops_table.link.node,k.stream_ops=Le.ops_table.link.stream):L.isChrdev(k.mode)&&(k.node_ops=Le.ops_table.chrdev.node,k.stream_ops=Le.ops_table.chrdev.stream),k.timestamp=Date.now(),u&&(u.contents[w]=k,u.timestamp=k.timestamp),k},getFileDataAsTypedArray(u){return u.contents?u.contents.subarray?u.contents.subarray(0,u.usedBytes):new Uint8Array(u.contents):new Uint8Array(0)},expandFileStorage(u,w){var S=u.contents?u.contents.length:0;if(!(S>=w)){var T=1024*1024;w=Math.max(w,S*(S>>0),S!=0&&(w=Math.max(w,256));var k=u.contents;u.contents=new Uint8Array(w),u.usedBytes>0&&u.contents.set(k.subarray(0,u.usedBytes),0)}},resizeFileStorage(u,w){if(u.usedBytes!=w)if(w==0)u.contents=null,u.usedBytes=0;else{var S=u.contents;u.contents=new Uint8Array(w),S&&u.contents.set(S.subarray(0,Math.min(w,u.usedBytes))),u.usedBytes=w}},node_ops:{getattr(u){var w={};return w.dev=L.isChrdev(u.mode)?u.id:1,w.ino=u.id,w.mode=u.mode,w.nlink=1,w.uid=0,w.gid=0,w.rdev=u.rdev,L.isDir(u.mode)?w.size=4096:L.isFile(u.mode)?w.size=u.usedBytes:L.isLink(u.mode)?w.size=u.link.length:w.size=0,w.atime=new Date(u.timestamp),w.mtime=new Date(u.timestamp),w.ctime=new Date(u.timestamp),w.blksize=4096,w.blocks=Math.ceil(w.size/w.blksize),w},setattr(u,w){w.mode!==void 0&&(u.mode=w.mode),w.timestamp!==void 0&&(u.timestamp=w.timestamp),w.size!==void 0&&Le.resizeFileStorage(u,w.size)},lookup(u,w){throw L.genericErrors[44]},mknod(u,w,S,T){return Le.createNode(u,w,S,T)},rename(u,w,S){if(L.isDir(u.mode)){var T;try{T=L.lookupNode(w,S)}catch(H){}if(T)for(var k in T.contents)throw new L.ErrnoError(55)}delete u.parent.contents[u.name],u.parent.timestamp=Date.now(),u.name=S,w.contents[S]=u,w.timestamp=u.parent.timestamp},unlink(u,w){delete u.contents[w],u.timestamp=Date.now()},rmdir(u,w){var S=L.lookupNode(u,w);for(var T in S.contents)throw new L.ErrnoError(55);delete u.contents[w],u.timestamp=Date.now()},readdir(u){var w=[".",".."];for(var S of Object.keys(u.contents))w.push(S);return w},symlink(u,w,S){var T=Le.createNode(u,w,41471,0);return T.link=S,T},readlink(u){if(!L.isLink(u.mode))throw new L.ErrnoError(28);return u.link}},stream_ops:{read(u,w,S,T,k){var H=u.node.contents;if(k>=u.node.usedBytes)return 0;var Z=Math.min(u.node.usedBytes-k,T);if(Z>8&&H.subarray)w.set(H.subarray(k,k+Z),S);else for(var gA=0;gA0||S+w{var k=T?"":`al ${u}`;C(u).then(H=>{w(new Uint8Array(H)),k&&mA()},H=>{if(S)S();else throw`Loading data file "${u}" failed.`}),k&&UA()},Bi=(u,w,S,T,k,H)=>{L.createDataFile(u,w,S,T,k,H)},vi=[],Ji=(u,w,S,T)=>{typeof Browser<"u"&&Browser.init();var k=!1;return vi.forEach(H=>{k||H.canHandle(w)&&(H.handle(u,w,S,T),k=!0)}),k},Dt=(u,w,S,T,k,H,Z,gA,DA,Ae)=>{var ne=w?Ee.resolve(oA.join2(u,w)):u;function Be(Ye){function ke(Re){Ae?.(),gA||Bi(u,w,Re,T,k,DA),H?.(),mA()}Ji(Ye,ne,ke,()=>{Z?.(),mA()})||ke(Ye)}UA(),typeof S=="string"?ji(S,Be,Z):Be(S)},qi=u=>{var w={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},S=w[u];if(typeof S>"u")throw new Error(`Unknown file open mode: ${u}`);return S},Nt=(u,w)=>{var S=0;return u&&(S|=365),w&&(S|=146),S},L={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(u){this.name="ErrnoError",this.errno=u}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(u){this.node=u}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(u){this.shared.flags=u}get position(){return this.shared.position}set position(u){this.shared.position=u}},FSNode:class{constructor(u,w,S,T){u||(u=this),this.parent=u,this.mount=u.mount,this.mounted=null,this.id=L.nextInode++,this.name=w,this.mode=S,this.node_ops={},this.stream_ops={},this.rdev=T,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(u){u?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(u){u?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return L.isDir(this.mode)}get isDevice(){return L.isChrdev(this.mode)}},lookupPath(u,w={}){if(u=Ee.resolve(u),!u)return{path:"",node:null};var S={follow_mount:!0,recurse_count:0};if(w=Object.assign(S,w),w.recurse_count>8)throw new L.ErrnoError(32);for(var T=u.split("/").filter(Be=>!!Be),k=L.root,H="/",Z=0;Z40)throw new L.ErrnoError(32)}}return{path:H,node:k}},getPath(u){for(var w;;){if(L.isRoot(u)){var S=u.mount.mountpoint;return w?S[S.length-1]!=="/"?`${S}/${w}`:S+w:S}w=w?`${u.name}/${w}`:u.name,u=u.parent}},hashName(u,w){for(var S=0,T=0;T>>0)%L.nameTable.length},hashAddNode(u){var w=L.hashName(u.parent.id,u.name);u.name_next=L.nameTable[w],L.nameTable[w]=u},hashRemoveNode(u){var w=L.hashName(u.parent.id,u.name);if(L.nameTable[w]===u)L.nameTable[w]=u.name_next;else for(var S=L.nameTable[w];S;){if(S.name_next===u){S.name_next=u.name_next;break}S=S.name_next}},lookupNode(u,w){var S=L.mayLookup(u);if(S)throw new L.ErrnoError(S);for(var T=L.hashName(u.id,w),k=L.nameTable[T];k;k=k.name_next){var H=k.name;if(k.parent.id===u.id&&H===w)return k}return L.lookup(u,w)},createNode(u,w,S,T){var k=new L.FSNode(u,w,S,T);return L.hashAddNode(k),k},destroyNode(u){L.hashRemoveNode(u)},isRoot(u){return u===u.parent},isMountpoint(u){return!!u.mounted},isFile(u){return(u&61440)===32768},isDir(u){return(u&61440)===16384},isLink(u){return(u&61440)===40960},isChrdev(u){return(u&61440)===8192},isBlkdev(u){return(u&61440)===24576},isFIFO(u){return(u&61440)===4096},isSocket(u){return(u&49152)===49152},flagsToPermissionString(u){var w=["r","w","rw"][u&3];return u&512&&(w+="w"),w},nodePermissions(u,w){return L.ignorePermissions?0:w.includes("r")&&!(u.mode&292)||w.includes("w")&&!(u.mode&146)||w.includes("x")&&!(u.mode&73)?2:0},mayLookup(u){if(!L.isDir(u.mode))return 54;var w=L.nodePermissions(u,"x");return w||(u.node_ops.lookup?0:2)},mayCreate(u,w){try{var S=L.lookupNode(u,w);return 20}catch(T){}return L.nodePermissions(u,"wx")},mayDelete(u,w,S){var T;try{T=L.lookupNode(u,w)}catch(H){return H.errno}var k=L.nodePermissions(u,"wx");if(k)return k;if(S){if(!L.isDir(T.mode))return 54;if(L.isRoot(T)||L.getPath(T)===L.cwd())return 10}else if(L.isDir(T.mode))return 31;return 0},mayOpen(u,w){return u?L.isLink(u.mode)?32:L.isDir(u.mode)&&(L.flagsToPermissionString(w)!=="r"||w&512)?31:L.nodePermissions(u,L.flagsToPermissionString(w)):44},MAX_OPEN_FDS:4096,nextfd(){for(var u=0;u<=L.MAX_OPEN_FDS;u++)if(!L.streams[u])return u;throw new L.ErrnoError(33)},getStreamChecked(u){var w=L.getStream(u);if(!w)throw new L.ErrnoError(8);return w},getStream:u=>L.streams[u],createStream(u,w=-1){return u=Object.assign(new L.FSStream,u),w==-1&&(w=L.nextfd()),u.fd=w,L.streams[w]=u,u},closeStream(u){L.streams[u]=null},dupStream(u,w=-1){var S=L.createStream(u,w);return S.stream_ops?.dup?.(S),S},chrdev_stream_ops:{open(u){var w=L.getDevice(u.node.rdev);u.stream_ops=w.stream_ops,u.stream_ops.open?.(u)},llseek(){throw new L.ErrnoError(70)}},major:u=>u>>8,minor:u=>u&255,makedev:(u,w)=>u<<8|w,registerDevice(u,w){L.devices[u]={stream_ops:w}},getDevice:u=>L.devices[u],getMounts(u){for(var w=[],S=[u];S.length;){var T=S.pop();w.push(T),S.push(...T.mounts)}return w},syncfs(u,w){typeof u=="function"&&(w=u,u=!1),L.syncFSRequests++,L.syncFSRequests>1&&B(`warning: ${L.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var S=L.getMounts(L.root.mount),T=0;function k(Z){return L.syncFSRequests--,w(Z)}function H(Z){if(Z)return H.errored?void 0:(H.errored=!0,k(Z));++T>=S.length&&k(null)}S.forEach(Z=>{if(!Z.type.syncfs)return H(null);Z.type.syncfs(Z,u,H)})},mount(u,w,S){var T=S==="/",k=!S,H;if(T&&L.root)throw new L.ErrnoError(10);if(!T&&!k){var Z=L.lookupPath(S,{follow_mount:!1});if(S=Z.path,H=Z.node,L.isMountpoint(H))throw new L.ErrnoError(10);if(!L.isDir(H.mode))throw new L.ErrnoError(54)}var gA={type:u,opts:w,mountpoint:S,mounts:[]},DA=u.mount(gA);return DA.mount=gA,gA.root=DA,T?L.root=DA:H&&(H.mounted=gA,H.mount&&H.mount.mounts.push(gA)),DA},unmount(u){var w=L.lookupPath(u,{follow_mount:!1});if(!L.isMountpoint(w.node))throw new L.ErrnoError(28);var S=w.node,T=S.mounted,k=L.getMounts(T);Object.keys(L.nameTable).forEach(Z=>{for(var gA=L.nameTable[Z];gA;){var DA=gA.name_next;k.includes(gA.mount)&&L.destroyNode(gA),gA=DA}}),S.mounted=null;var H=S.mount.mounts.indexOf(T);S.mount.mounts.splice(H,1)},lookup(u,w){return u.node_ops.lookup(u,w)},mknod(u,w,S){var T=L.lookupPath(u,{parent:!0}),k=T.node,H=oA.basename(u);if(!H||H==="."||H==="..")throw new L.ErrnoError(28);var Z=L.mayCreate(k,H);if(Z)throw new L.ErrnoError(Z);if(!k.node_ops.mknod)throw new L.ErrnoError(63);return k.node_ops.mknod(k,H,w,S)},create(u,w){return w=w!==void 0?w:438,w&=4095,w|=32768,L.mknod(u,w,0)},mkdir(u,w){return w=w!==void 0?w:511,w&=1023,w|=16384,L.mknod(u,w,0)},mkdirTree(u,w){for(var S=u.split("/"),T="",k=0;k"u"&&(S=w,w=438),w|=8192,L.mknod(u,w,S)},symlink(u,w){if(!Ee.resolve(u))throw new L.ErrnoError(44);var S=L.lookupPath(w,{parent:!0}),T=S.node;if(!T)throw new L.ErrnoError(44);var k=oA.basename(w),H=L.mayCreate(T,k);if(H)throw new L.ErrnoError(H);if(!T.node_ops.symlink)throw new L.ErrnoError(63);return T.node_ops.symlink(T,k,u)},rename(u,w){var S=oA.dirname(u),T=oA.dirname(w),k=oA.basename(u),H=oA.basename(w),Z,gA,DA;if(Z=L.lookupPath(u,{parent:!0}),gA=Z.node,Z=L.lookupPath(w,{parent:!0}),DA=Z.node,!gA||!DA)throw new L.ErrnoError(44);if(gA.mount!==DA.mount)throw new L.ErrnoError(75);var Ae=L.lookupNode(gA,k),ne=Ee.relative(u,T);if(ne.charAt(0)!==".")throw new L.ErrnoError(28);if(ne=Ee.relative(w,S),ne.charAt(0)!==".")throw new L.ErrnoError(55);var Be;try{Be=L.lookupNode(DA,H)}catch(Re){}if(Ae!==Be){var Ye=L.isDir(Ae.mode),ke=L.mayDelete(gA,k,Ye);if(ke)throw new L.ErrnoError(ke);if(ke=Be?L.mayDelete(DA,H,Ye):L.mayCreate(DA,H),ke)throw new L.ErrnoError(ke);if(!gA.node_ops.rename)throw new L.ErrnoError(63);if(L.isMountpoint(Ae)||Be&&L.isMountpoint(Be))throw new L.ErrnoError(10);if(DA!==gA&&(ke=L.nodePermissions(gA,"w"),ke))throw new L.ErrnoError(ke);L.hashRemoveNode(Ae);try{gA.node_ops.rename(Ae,DA,H),Ae.parent=DA}catch(Re){throw Re}finally{L.hashAddNode(Ae)}}},rmdir(u){var w=L.lookupPath(u,{parent:!0}),S=w.node,T=oA.basename(u),k=L.lookupNode(S,T),H=L.mayDelete(S,T,!0);if(H)throw new L.ErrnoError(H);if(!S.node_ops.rmdir)throw new L.ErrnoError(63);if(L.isMountpoint(k))throw new L.ErrnoError(10);S.node_ops.rmdir(S,T),L.destroyNode(k)},readdir(u){var w=L.lookupPath(u,{follow:!0}),S=w.node;if(!S.node_ops.readdir)throw new L.ErrnoError(54);return S.node_ops.readdir(S)},unlink(u){var w=L.lookupPath(u,{parent:!0}),S=w.node;if(!S)throw new L.ErrnoError(44);var T=oA.basename(u),k=L.lookupNode(S,T),H=L.mayDelete(S,T,!1);if(H)throw new L.ErrnoError(H);if(!S.node_ops.unlink)throw new L.ErrnoError(63);if(L.isMountpoint(k))throw new L.ErrnoError(10);S.node_ops.unlink(S,T),L.destroyNode(k)},readlink(u){var w=L.lookupPath(u),S=w.node;if(!S)throw new L.ErrnoError(44);if(!S.node_ops.readlink)throw new L.ErrnoError(28);return Ee.resolve(L.getPath(S.parent),S.node_ops.readlink(S))},stat(u,w){var S=L.lookupPath(u,{follow:!w}),T=S.node;if(!T)throw new L.ErrnoError(44);if(!T.node_ops.getattr)throw new L.ErrnoError(63);return T.node_ops.getattr(T)},lstat(u){return L.stat(u,!0)},chmod(u,w,S){var T;if(typeof u=="string"){var k=L.lookupPath(u,{follow:!S});T=k.node}else T=u;if(!T.node_ops.setattr)throw new L.ErrnoError(63);T.node_ops.setattr(T,{mode:w&4095|T.mode&-4096,timestamp:Date.now()})},lchmod(u,w){L.chmod(u,w,!0)},fchmod(u,w){var S=L.getStreamChecked(u);L.chmod(S.node,w)},chown(u,w,S,T){var k;if(typeof u=="string"){var H=L.lookupPath(u,{follow:!T});k=H.node}else k=u;if(!k.node_ops.setattr)throw new L.ErrnoError(63);k.node_ops.setattr(k,{timestamp:Date.now()})},lchown(u,w,S){L.chown(u,w,S,!0)},fchown(u,w,S){var T=L.getStreamChecked(u);L.chown(T.node,w,S)},truncate(u,w){if(w<0)throw new L.ErrnoError(28);var S;if(typeof u=="string"){var T=L.lookupPath(u,{follow:!0});S=T.node}else S=u;if(!S.node_ops.setattr)throw new L.ErrnoError(63);if(L.isDir(S.mode))throw new L.ErrnoError(31);if(!L.isFile(S.mode))throw new L.ErrnoError(28);var k=L.nodePermissions(S,"w");if(k)throw new L.ErrnoError(k);S.node_ops.setattr(S,{size:w,timestamp:Date.now()})},ftruncate(u,w){var S=L.getStreamChecked(u);if((S.flags&2097155)===0)throw new L.ErrnoError(28);L.truncate(S.node,w)},utime(u,w,S){var T=L.lookupPath(u,{follow:!0}),k=T.node;k.node_ops.setattr(k,{timestamp:Math.max(w,S)})},open(u,w,S){if(u==="")throw new L.ErrnoError(44);w=typeof w=="string"?qi(w):w,w&64?(S=typeof S>"u"?438:S,S=S&4095|32768):S=0;var T;if(typeof u=="object")T=u;else{u=oA.normalize(u);try{var k=L.lookupPath(u,{follow:!(w&131072)});T=k.node}catch(DA){}}var H=!1;if(w&64)if(T){if(w&128)throw new L.ErrnoError(20)}else T=L.mknod(u,S,0),H=!0;if(!T)throw new L.ErrnoError(44);if(L.isChrdev(T.mode)&&(w&=-513),w&65536&&!L.isDir(T.mode))throw new L.ErrnoError(54);if(!H){var Z=L.mayOpen(T,w);if(Z)throw new L.ErrnoError(Z)}w&512&&!H&&L.truncate(T,0),w&=-131713;var gA=L.createStream({node:T,path:L.getPath(T),flags:w,seekable:!0,position:0,stream_ops:T.stream_ops,ungotten:[],error:!1});return gA.stream_ops.open&&gA.stream_ops.open(gA),gA},close(u){if(L.isClosed(u))throw new L.ErrnoError(8);u.getdents&&(u.getdents=null);try{u.stream_ops.close&&u.stream_ops.close(u)}catch(w){throw w}finally{L.closeStream(u.fd)}u.fd=null},isClosed(u){return u.fd===null},llseek(u,w,S){if(L.isClosed(u))throw new L.ErrnoError(8);if(!u.seekable||!u.stream_ops.llseek)throw new L.ErrnoError(70);if(S!=0&&S!=1&&S!=2)throw new L.ErrnoError(28);return u.position=u.stream_ops.llseek(u,w,S),u.ungotten=[],u.position},read(u,w,S,T,k){if(T<0||k<0)throw new L.ErrnoError(28);if(L.isClosed(u))throw new L.ErrnoError(8);if((u.flags&2097155)===1)throw new L.ErrnoError(8);if(L.isDir(u.node.mode))throw new L.ErrnoError(31);if(!u.stream_ops.read)throw new L.ErrnoError(28);var H=typeof k<"u";if(!H)k=u.position;else if(!u.seekable)throw new L.ErrnoError(70);var Z=u.stream_ops.read(u,w,S,T,k);return H||(u.position+=Z),Z},write(u,w,S,T,k,H){if(T<0||k<0)throw new L.ErrnoError(28);if(L.isClosed(u))throw new L.ErrnoError(8);if((u.flags&2097155)===0)throw new L.ErrnoError(8);if(L.isDir(u.node.mode))throw new L.ErrnoError(31);if(!u.stream_ops.write)throw new L.ErrnoError(28);u.seekable&&u.flags&1024&&L.llseek(u,0,2);var Z=typeof k<"u";if(!Z)k=u.position;else if(!u.seekable)throw new L.ErrnoError(70);var gA=u.stream_ops.write(u,w,S,T,k,H);return Z||(u.position+=gA),gA},allocate(u,w,S){if(L.isClosed(u))throw new L.ErrnoError(8);if(w<0||S<=0)throw new L.ErrnoError(28);if((u.flags&2097155)===0)throw new L.ErrnoError(8);if(!L.isFile(u.node.mode)&&!L.isDir(u.node.mode))throw new L.ErrnoError(43);if(!u.stream_ops.allocate)throw new L.ErrnoError(138);u.stream_ops.allocate(u,w,S)},mmap(u,w,S,T,k){if((T&2)!==0&&(k&2)===0&&(u.flags&2097155)!==2)throw new L.ErrnoError(2);if((u.flags&2097155)===1)throw new L.ErrnoError(2);if(!u.stream_ops.mmap)throw new L.ErrnoError(43);if(!w)throw new L.ErrnoError(28);return u.stream_ops.mmap(u,w,S,T,k)},msync(u,w,S,T,k){return u.stream_ops.msync?u.stream_ops.msync(u,w,S,T,k):0},ioctl(u,w,S){if(!u.stream_ops.ioctl)throw new L.ErrnoError(59);return u.stream_ops.ioctl(u,w,S)},readFile(u,w={}){if(w.flags=w.flags||0,w.encoding=w.encoding||"binary",w.encoding!=="utf8"&&w.encoding!=="binary")throw new Error(`Invalid encoding type "${w.encoding}"`);var S,T=L.open(u,w.flags),k=L.stat(u),H=k.size,Z=new Uint8Array(H);return L.read(T,Z,0,H,0),w.encoding==="utf8"?S=ht(Z):w.encoding==="binary"&&(S=Z),L.close(T),S},writeFile(u,w,S={}){S.flags=S.flags||577;var T=L.open(u,S.flags,S.mode);if(typeof w=="string"){var k=new Uint8Array(LA(w)+1),H=dt(w,k,0,k.length);L.write(T,k,0,H,void 0,S.canOwn)}else if(ArrayBuffer.isView(w))L.write(T,w,0,w.byteLength,void 0,S.canOwn);else throw new Error("Unsupported data type");L.close(T)},cwd:()=>L.currentPath,chdir(u){var w=L.lookupPath(u,{follow:!0});if(w.node===null)throw new L.ErrnoError(44);if(!L.isDir(w.node.mode))throw new L.ErrnoError(54);var S=L.nodePermissions(w.node,"x");if(S)throw new L.ErrnoError(S);L.currentPath=w.path},createDefaultDirectories(){L.mkdir("/tmp"),L.mkdir("/home"),L.mkdir("/home/web_user")},createDefaultDevices(){L.mkdir("/dev"),L.registerDevice(L.makedev(1,3),{read:()=>0,write:(T,k,H,Z,gA)=>Z}),L.mkdev("/dev/null",L.makedev(1,3)),Ge.register(L.makedev(5,0),Ge.default_tty_ops),Ge.register(L.makedev(6,0),Ge.default_tty1_ops),L.mkdev("/dev/tty",L.makedev(5,0)),L.mkdev("/dev/tty1",L.makedev(6,0));var u=new Uint8Array(1024),w=0,S=()=>(w===0&&(w=de(u).byteLength),u[--w]);L.createDevice("/dev","random",S),L.createDevice("/dev","urandom",S),L.mkdir("/dev/shm"),L.mkdir("/dev/shm/tmp")},createSpecialDirectories(){L.mkdir("/proc");var u=L.mkdir("/proc/self");L.mkdir("/proc/self/fd"),L.mount({mount(){var w=L.createNode(u,"fd",16895,73);return w.node_ops={lookup(S,T){var k=+T,H=L.getStreamChecked(k),Z={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>H.path}};return Z.parent=Z,Z}},w}},{},"/proc/self/fd")},createStandardStreams(u,w,S){u?L.createDevice("/dev","stdin",u):L.symlink("/dev/tty","/dev/stdin"),w?L.createDevice("/dev","stdout",null,w):L.symlink("/dev/tty","/dev/stdout"),S?L.createDevice("/dev","stderr",null,S):L.symlink("/dev/tty1","/dev/stderr"),L.open("/dev/stdin",0),L.open("/dev/stdout",1),L.open("/dev/stderr",1)},staticInit(){[44].forEach(u=>{L.genericErrors[u]=new L.ErrnoError(u),L.genericErrors[u].stack=""}),L.nameTable=new Array(4096),L.mount(Le,{},"/"),L.createDefaultDirectories(),L.createDefaultDevices(),L.createSpecialDirectories(),L.filesystems={MEMFS:Le}},init(u,w,S){L.initialized=!0,L.createStandardStreams(u,w,S)},quit(){L.initialized=!1;for(var u=0;uthis.length-1||ke<0)){var Re=ke%this.chunkSize,ii=ke/this.chunkSize|0;return this.getter(ii)[Re]}}setDataGetter(ke){this.getter=ke}cacheLength(){var ke=new XMLHttpRequest;if(ke.open("HEAD",S,!1),ke.send(null),!(ke.status>=200&&ke.status<300||ke.status===304))throw new Error("Couldn't load "+S+". Status: "+ke.status);var Re=Number(ke.getResponseHeader("Content-length")),ii,xn=(ii=ke.getResponseHeader("Accept-Ranges"))&&ii==="bytes",q=(ii=ke.getResponseHeader("Content-Encoding"))&&ii==="gzip",fA=1024*1024;xn||(fA=Re);var PA=(pe,we)=>{if(pe>we)throw new Error("invalid range ("+pe+", "+we+") or no bytes requested!");if(we>Re-1)throw new Error("only "+Re+" bytes available! programmer error!");var it=new XMLHttpRequest;if(it.open("GET",S,!1),Re!==fA&&it.setRequestHeader("Range","bytes="+pe+"-"+we),it.responseType="arraybuffer",it.overrideMimeType&&it.overrideMimeType("text/plain; charset=x-user-defined"),it.send(null),!(it.status>=200&&it.status<300||it.status===304))throw new Error("Couldn't load "+S+". Status: "+it.status);return it.response!==void 0?new Uint8Array(it.response||[]):At(it.responseText||"",!0)},Ne=this;Ne.setDataGetter(pe=>{var we=pe*fA,it=(pe+1)*fA-1;if(it=Math.min(it,Re-1),typeof Ne.chunks[pe]>"u"&&(Ne.chunks[pe]=PA(we,it)),typeof Ne.chunks[pe]>"u")throw new Error("doXHR failed!");return Ne.chunks[pe]}),(q||!Re)&&(fA=Re=1,Re=this.getter(0).length,fA=Re,d("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Re,this._chunkSize=fA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var Z,gA}else var gA={isDevice:!1,url:S};var DA=L.createFile(u,w,gA,T,k);gA.contents?DA.contents=gA.contents:gA.url&&(DA.contents=null,DA.url=gA.url),Object.defineProperties(DA,{usedBytes:{get:function(){return this.contents.length}}});var Ae={},ne=Object.keys(DA.stream_ops);ne.forEach(Ye=>{var ke=DA.stream_ops[Ye];Ae[Ye]=(...Re)=>(L.forceLoadFile(DA),ke(...Re))});function Be(Ye,ke,Re,ii,xn){var q=Ye.node.contents;if(xn>=q.length)return 0;var fA=Math.min(q.length-xn,ii);if(q.slice)for(var PA=0;PA(L.forceLoadFile(DA),Be(Ye,ke,Re,ii,xn)),Ae.mmap=(Ye,ke,Re,ii,xn)=>{L.forceLoadFile(DA);var q=rn(ke);if(!q)throw new L.ErrnoError(48);return Be(Ye,M,q,ke,Re),{ptr:q,allocated:!0}},DA.stream_ops=Ae,DA}},gt={DEFAULT_POLLMASK:5,calculateAt(u,w,S){if(oA.isAbs(w))return w;var T;if(u===-100)T=L.cwd();else{var k=gt.getStreamFromFD(u);T=k.path}if(w.length==0){if(!S)throw new L.ErrnoError(44);return T}return oA.join2(T,w)},doStat(u,w,S){var T=u(w);G[S>>2]=T.dev,G[S+4>>2]=T.mode,U[S+8>>2]=T.nlink,G[S+12>>2]=T.uid,G[S+16>>2]=T.gid,G[S+20>>2]=T.rdev,j[S+24>>3]=BigInt(T.size),G[S+32>>2]=4096,G[S+36>>2]=T.blocks;var k=T.atime.getTime(),H=T.mtime.getTime(),Z=T.ctime.getTime();return j[S+40>>3]=BigInt(Math.floor(k/1e3)),U[S+48>>2]=k%1e3*1e3*1e3,j[S+56>>3]=BigInt(Math.floor(H/1e3)),U[S+64>>2]=H%1e3*1e3*1e3,j[S+72>>3]=BigInt(Math.floor(Z/1e3)),U[S+80>>2]=Z%1e3*1e3*1e3,j[S+88>>3]=BigInt(T.ino),0},doMsync(u,w,S,T,k){if(!L.isFile(w.node.mode))throw new L.ErrnoError(43);if(T&2)return 0;var H=v.slice(u,u+S);L.msync(w,H,k,S,T)},getStreamFromFD(u){var w=L.getStreamChecked(u);return w},varargs:void 0,getStr(u){var w=Me(u);return w}};function gi(u,w,S,T){try{if(w=gt.getStr(w),w=gt.calculateAt(u,w),S&-8)return-28;var k=L.lookupPath(w,{follow:!0}),H=k.node;if(!H)return-44;var Z="";return S&4&&(Z+="r"),S&2&&(Z+="w"),S&1&&(Z+="x"),Z&&L.nodePermissions(H,Z)?-2:0}catch(gA){if(typeof L>"u"||gA.name!=="ErrnoError")throw gA;return-gA.errno}}function sn(){var u=G[+gt.varargs>>2];return gt.varargs+=4,u}var gn=sn;function Kn(u,w,S){gt.varargs=S;try{var T=gt.getStreamFromFD(u);switch(w){case 0:{var k=sn();if(k<0)return-28;for(;L.streams[k];)k++;var H;return H=L.dupStream(T,k),H.fd}case 1:case 2:return 0;case 3:return T.flags;case 4:{var k=sn();return T.flags|=k,0}case 12:{var k=gn(),Z=0;return F[k+Z>>1]=2,0}case 13:case 14:return 0}return-28}catch(gA){if(typeof L>"u"||gA.name!=="ErrnoError")throw gA;return-gA.errno}}function ko(u,w){try{var S=gt.getStreamFromFD(u);return gt.doStat(L.stat,S.path,w)}catch(T){if(typeof L>"u"||T.name!=="ErrnoError")throw T;return-T.errno}}function eo(u,w,S){gt.varargs=S;try{var T=gt.getStreamFromFD(u);switch(w){case 21509:return T.tty?0:-59;case 21505:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tcgets){var k=T.tty.ops.ioctl_tcgets(T),H=gn();G[H>>2]=k.c_iflag||0,G[H+4>>2]=k.c_oflag||0,G[H+8>>2]=k.c_cflag||0,G[H+12>>2]=k.c_lflag||0;for(var Z=0;Z<32;Z++)M[H+Z+17]=k.c_cc[Z]||0;return 0}return 0}case 21510:case 21511:case 21512:return T.tty?0:-59;case 21506:case 21507:case 21508:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tcsets){for(var H=gn(),gA=G[H>>2],DA=G[H+4>>2],Ae=G[H+8>>2],ne=G[H+12>>2],Be=[],Z=0;Z<32;Z++)Be.push(M[H+Z+17]);return T.tty.ops.ioctl_tcsets(T.tty,w,{c_iflag:gA,c_oflag:DA,c_cflag:Ae,c_lflag:ne,c_cc:Be})}return 0}case 21519:{if(!T.tty)return-59;var H=gn();return G[H>>2]=0,0}case 21520:return T.tty?-28:-59;case 21531:{var H=gn();return L.ioctl(T,w,H)}case 21523:{if(!T.tty)return-59;if(T.tty.ops.ioctl_tiocgwinsz){var Ye=T.tty.ops.ioctl_tiocgwinsz(T.tty),H=gn();F[H>>1]=Ye[0],F[H+2>>1]=Ye[1]}return 0}case 21524:return T.tty?0:-59;case 21515:return T.tty?0:-59;default:return-28}}catch(ke){if(typeof L>"u"||ke.name!=="ErrnoError")throw ke;return-ke.errno}}function fo(u,w,S,T){try{w=gt.getStr(w);var k=T&256,H=T&4096;return T=T&-6401,w=gt.calculateAt(u,w,H),gt.doStat(k?L.lstat:L.stat,w,S)}catch(Z){if(typeof L>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}function Go(u,w,S,T){gt.varargs=T;try{w=gt.getStr(w),w=gt.calculateAt(u,w);var k=T?sn():0;return L.open(w,S,k).fd}catch(H){if(typeof L>"u"||H.name!=="ErrnoError")throw H;return-H.errno}}function co(u,w){try{return u=gt.getStr(u),gt.doStat(L.stat,u,w)}catch(S){if(typeof L>"u"||S.name!=="ErrnoError")throw S;return-S.errno}}var ta=()=>{KA("")},Ko=u=>u%4===0&&(u%100!==0||u%400===0),qo=[0,31,60,91,121,152,182,213,244,274,305,335],Co=[0,31,59,90,120,151,181,212,243,273,304,334],se=u=>{var w=Ko(u.getFullYear()),S=w?qo:Co,T=S[u.getMonth()]+u.getDate()-1;return T},Ci=9007199254740992,tn=-9007199254740992,ln=u=>uCi?NaN:Number(u);function So(u,w){u=ln(u);var S=new Date(u*1e3);G[w>>2]=S.getSeconds(),G[w+4>>2]=S.getMinutes(),G[w+8>>2]=S.getHours(),G[w+12>>2]=S.getDate(),G[w+16>>2]=S.getMonth(),G[w+20>>2]=S.getFullYear()-1900,G[w+24>>2]=S.getDay();var T=se(S)|0;G[w+28>>2]=T,G[w+36>>2]=-(S.getTimezoneOffset()*60);var k=new Date(S.getFullYear(),0,1),H=new Date(S.getFullYear(),6,1).getTimezoneOffset(),Z=k.getTimezoneOffset(),gA=(H!=Z&&S.getTimezoneOffset()==Math.min(Z,H))|0;G[w+32>>2]=gA}function la(u,w,S,T,k,H,Z){k=ln(k);try{if(isNaN(k))return 61;var gA=gt.getStreamFromFD(T),DA=L.mmap(gA,u,k,w,S),Ae=DA.ptr;return G[H>>2]=DA.allocated,U[Z>>2]=Ae,0}catch(ne){if(typeof L>"u"||ne.name!=="ErrnoError")throw ne;return-ne.errno}}function pi(u,w,S,T,k,H){H=ln(H);try{var Z=gt.getStreamFromFD(k);S&2&>.doMsync(u,Z,w,T,H)}catch(gA){if(typeof L>"u"||gA.name!=="ErrnoError")throw gA;return-gA.errno}}var to=(u,w,S)=>dt(u,v,w,S),Ja=(u,w,S,T)=>{var k=new Date().getFullYear(),H=new Date(k,0,1),Z=new Date(k,6,1),gA=H.getTimezoneOffset(),DA=Z.getTimezoneOffset(),Ae=Math.max(gA,DA);U[u>>2]=Ae*60,G[w>>2]=+(gA!=DA);var ne=ke=>{var Re=ke>=0?"-":"+",ii=Math.abs(ke),xn=String(Math.floor(ii/60)).padStart(2,"0"),q=String(ii%60).padStart(2,"0");return`UTC${Re}${xn}${q}`},Be=ne(gA),Ye=ne(DA);DADate.now(),Sa=()=>2147483648,kn=u=>{var w=b.buffer,S=(u-w.byteLength+65535)/65536|0;try{return b.grow(S),z(),1}catch(T){}},Mi=u=>{var w=v.length;u>>>=0;var S=Sa();if(u>S)return!1;for(var T=1;T<=4;T*=2){var k=w*(1+.2/T);k=Math.min(k,u+100663296);var H=Math.min(S,en(Math.max(u,k),65536)),Z=kn(H);if(Z)return!0}return!1},Ot={},pn=()=>s,io=()=>{if(!io.strings){var u=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",w={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:u,_:pn()};for(var S in Ot)Ot[S]===void 0?delete w[S]:w[S]=Ot[S];var T=[];for(var S in w)T.push(`${S}=${w[S]}`);io.strings=T}return io.strings},mo=(u,w)=>{for(var S=0;S{var S=0;return io().forEach((T,k)=>{var H=w+S;U[u+k*4>>2]=H,mo(T,H),S+=T.length+1}),0},VA=(u,w)=>{var S=io();U[u>>2]=S.length;var T=0;return S.forEach(k=>T+=k.length+1),U[w>>2]=T,0},me=u=>{g(u,new Rt(u))},IA=(u,w)=>{me(u)},SA=IA;function re(u){try{var w=gt.getStreamFromFD(u);return L.close(w),0}catch(S){if(typeof L>"u"||S.name!=="ErrnoError")throw S;return S.errno}}var Se=(u,w,S,T)=>{for(var k=0,H=0;H>2],gA=U[w+4>>2];w+=8;var DA=L.read(u,M,Z,gA,T);if(DA<0)return-1;if(k+=DA,DA>2]=H,0}catch(Z){if(typeof L>"u"||Z.name!=="ErrnoError")throw Z;return Z.errno}}function at(u,w,S,T){w=ln(w);try{if(isNaN(w))return 61;var k=gt.getStreamFromFD(u);return L.llseek(k,w,S),j[T>>3]=BigInt(k.position),k.getdents&&w===0&&S===0&&(k.getdents=null),0}catch(H){if(typeof L>"u"||H.name!=="ErrnoError")throw H;return H.errno}}var bt=(u,w,S,T)=>{for(var k=0,H=0;H>2],gA=U[w+4>>2];w+=8;var DA=L.write(u,M,Z,gA,T);if(DA<0)return-1;if(k+=DA,DA>2]=H,0}catch(Z){if(typeof L>"u"||Z.name!=="ErrnoError")throw Z;return Z.errno}}var ki=u=>{var w=i["_"+u];return w},Gi=(u,w)=>{M.set(u,w)},jt=u=>Un(u),Si=u=>{var w=LA(u)+1,S=jt(w);return to(u,S,w),S},ca=(u,w,S,T,k)=>{var H={string:Re=>{var ii=0;return Re!=null&&Re!==0&&(ii=Si(Re)),ii},array:Re=>{var ii=jt(Re.length);return Gi(Re,ii),ii}};function Z(Re){return w==="string"?Me(Re):w==="boolean"?!!Re:Re}var gA=ki(u),DA=[],Ae=0;if(T)for(var ne=0;ne(i._viz_set_y_invert=rt.A)(u),i._viz_set_reduce=u=>(i._viz_set_reduce=rt.B)(u),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=rt.C)(),i._free=u=>(i._free=rt.D)(u),i._malloc=u=>(i._malloc=rt.E)(u),i._viz_get_plugin_list=u=>(i._viz_get_plugin_list=rt.G)(u),i._viz_create_graph=(u,w,S)=>(i._viz_create_graph=rt.H)(u,w,S),i._viz_read_one_graph=u=>(i._viz_read_one_graph=rt.I)(u),i._viz_string_dup=(u,w)=>(i._viz_string_dup=rt.J)(u,w),i._viz_string_dup_html=(u,w)=>(i._viz_string_dup_html=rt.K)(u,w),i._viz_string_free=(u,w)=>(i._viz_string_free=rt.L)(u,w),i._viz_string_free_html=(u,w)=>(i._viz_string_free_html=rt.M)(u,w),i._viz_add_node=(u,w)=>(i._viz_add_node=rt.N)(u,w),i._viz_add_edge=(u,w,S)=>(i._viz_add_edge=rt.O)(u,w,S),i._viz_add_subgraph=(u,w)=>(i._viz_add_subgraph=rt.P)(u,w),i._viz_set_default_graph_attribute=(u,w,S)=>(i._viz_set_default_graph_attribute=rt.Q)(u,w,S),i._viz_set_default_node_attribute=(u,w,S)=>(i._viz_set_default_node_attribute=rt.R)(u,w,S),i._viz_set_default_edge_attribute=(u,w,S)=>(i._viz_set_default_edge_attribute=rt.S)(u,w,S),i._viz_set_attribute=(u,w,S)=>(i._viz_set_attribute=rt.T)(u,w,S),i._viz_free_graph=u=>(i._viz_free_graph=rt.U)(u),i._viz_create_context=()=>(i._viz_create_context=rt.V)(),i._viz_free_context=u=>(i._viz_free_context=rt.W)(u),i._viz_layout=(u,w,S)=>(i._viz_layout=rt.X)(u,w,S),i._viz_free_layout=(u,w)=>(i._viz_free_layout=rt.Y)(u,w),i._viz_reset_errors=()=>(i._viz_reset_errors=rt.Z)(),i._viz_render=(u,w,S)=>(i._viz_render=rt._)(u,w,S);var xi=(u,w)=>(xi=rt.$)(u,w),Yi=u=>(Yi=rt.aa)(u),Un=u=>(Un=rt.ba)(u),cn=()=>(cn=rt.ca)();i.ccall=ca,i.getValue=Qe,i.PATH=oA,i.UTF8ToString=Me,i.stringToUTF8=to,i.lengthBytesUTF8=LA,i.FS=L;var Mt,Vo;JA=function u(){Mt||xo(),Mt||(JA=u)};function xo(){if(hA>0||!Vo&&(Vo=1,eA(),hA>0))return;function u(){Mt||(Mt=1,i.calledRun=1,!R&&(dA(),n(i),iA()))}u()}return xo(),A=a,A}})(),tiA=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function dLA(t){return t.map(e=>{for(let A=0;A{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let i=t.PATH.join("/",A.name),n=` `;return t.FS.createPath("/",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function hLA(t,e){for(let A of e)t.FS.analyzePath(A).exists&&t.FS.unlink(A)}function uLA(t,e,A){let i;try{let n=t.lengthBytesUTF8(e);return i=t.ccall("malloc","number",["number"],[n+1]),t.stringToUTF8(e,i,n+1),t.ccall("viz_read_one_graph","number",["number"],[i])}finally{i&&t.ccall("free","number",["number"],[i])}}function fLA(t,e,A){let i=t.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return aiA(t,i,e),i}function aiA(t,e,A){riA(t,e,A),A.nodes&&A.nodes.forEach(i=>{if(typeof i.name>"u")throw new Error("nodes must have a name");let n=t.ccall("viz_add_node","number",["number","string"],[e,String(i.name)]);i.attributes&&oiA(t,e,n,i.attributes)}),A.edges&&A.edges.forEach(i=>{if(typeof i.tail>"u")throw new Error("edges must have a tail");if(typeof i.head>"u")throw new Error("edges must have a head");let n=t.ccall("viz_add_edge","number",["number","string","string"],[e,String(i.tail),String(i.head)]);i.attributes&&oiA(t,e,n,i.attributes)}),A.subgraphs&&A.subgraphs.forEach(i=>{let n=t.ccall("viz_add_subgraph","number",["number","string"],[e,typeof i.name<"u"?String(i.name):0]);aiA(t,n,i)})}function riA(t,e,A){if(A.graphAttributes)for(let[i,n]of Object.entries(A.graphAttributes))qy(t,e,n,o=>{t.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,i,o])});if(A.nodeAttributes)for(let[i,n]of Object.entries(A.nodeAttributes))qy(t,e,n,o=>{t.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,i,o])});if(A.edgeAttributes)for(let[i,n]of Object.entries(A.edgeAttributes))qy(t,e,n,o=>{t.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,i,o])})}function oiA(t,e,A,i){for(let[n,o]of Object.entries(i))qy(t,e,o,a=>{t.ccall("viz_set_attribute","number",["number","string","number"],[A,n,a])})}function qy(t,e,A,i){let n;if(typeof A=="object"&&"html"in A?n=t.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=t.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");i(n),typeof A=="object"&&"html"in A?t.ccall("viz_string_free_html","number",["number","number"],[e,n]):t.ccall("viz_string_free","number",["number","number"],[e,n])}var FF=class{constructor(e){this.module=e}get graphvizVersion(){return QLA(this.module)}get formats(){return iiA(this.module,"device")}get engines(){return iiA(this.module,"layout")}renderFormats(e,A,i={}){return niA(this.module,e,A,BA({engine:"dot"},i))}render(e,A={}){let i;A.format===void 0?i="dot":i=A.format;let n=niA(this.module,e,[i],BA({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[i]),n}renderString(e,A={}){let i=this.render(e,A);if(i.status!=="success")throw new Error(i.errors.find(n=>n.level=="error")?.message||"render failed");return i.output}renderSVGElement(e,A={}){let i=this.renderString(e,Ve(BA({},A),{format:"svg"})),n;return typeof A.trustedTypePolicy<"u"?n=A.trustedTypePolicy.createHTML(i):n=i,new DOMParser().parseFromString(n,"image/svg+xml").documentElement}renderJSON(e,A={}){let i=this.renderString(e,Ve(BA({},A),{format:"json"}));return JSON.parse(i)}};function siA(){return ILA().then(t=>new FF(t))}var Vy=class t{render(e){return ct(this,null,function*(){let A={format:"svg",engine:"dot"};return(yield siA()).renderString(e,A)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Wy=new wA("AudioPlayingService");var Zy=new wA("VideoService");var Xy=new wA("WebSocketService");var $y=class t{createMessagePartFromFile(e){return ct(this,null,function*(){return{inlineData:{displayName:e.name,data:yield this.readFileAsBytes(e),mimeType:e.type}}})}readFileAsBytes(e){return new Promise((A,i)=>{let n=new FileReader;n.onload=o=>{let a=o.target.result.split(",")[1];A(a)},n.onerror=i,n.readAsDataURL(e)})}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var Av=class t extends Np{sanitizer=h(LC);windowOpen(e,A,i,n){return e.open(A,i,n)}createObjectUrl(e){return URL.createObjectURL(e)}openBlobUrl(e){let A=this.createObjectUrl(e);return this.windowOpen(window,A,"_blank")}setAnchorHref(e,A){e.href=A}bypassSecurityTrustHtml(e){return this.sanitizer.bypassSecurityTrustHtml(e)}bypassSecurityTrustUrl(e){return this.sanitizer.bypassSecurityTrustUrl(e)}static \u0275fac=(()=>{let e;return function(i){return(e||(e=hi(t)))(i||t)}})();static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var ev=class t{constructor(e){this.http=e}apiServerDomain=kr.getApiServerBaseUrl();createSession(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(i,null)}return new Ti}listSessions(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(i).pipe(fe(n=>({items:n,nextPageToken:""})))}return oe({items:[],nextPageToken:""})}deleteSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.delete(n)}getSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.get(n)}importSession(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(n,{appName:A,userId:e,events:i})}return new Ti}canEdit(e,A){return oe(!0)}static \u0275fac=function(A){return new(A||t)(Do(ks))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var tv=class t{audioRecordingService=h(Ky);videoService=h(Zy);webSocketService=h(Xy);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}startAudioChat(n){return ct(this,arguments,function*({appName:e,userId:A,sessionId:i}){let o=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${o}://${kr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return ct(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let e=this.audioRecordingService.getCombinedAudioBuffer();if(!e)return;let A={blob:{mime_type:"audio/pcm",data:e}};this.webSocketService.sendMessage(A),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(o){return ct(this,arguments,function*({appName:e,userId:A,sessionId:i,videoContainer:n}){let a=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${a}://${kr.getWSServerUrl()}/run_live?app_name=${e}&user_id=${A}&session_id=${i}`),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(e){this.stopAudioStreaming(),this.stopVideoStreaming(e),this.webSocketService.closeConnection()}startVideoStreaming(e){return ct(this,null,function*(){try{yield this.videoService.startRecording(e),this.videoIntervalId=setInterval(()=>ct(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(A){console.error("Error accessing camera:",A)}})}sendCapturedFrame(){return ct(this,null,function*(){let e=yield this.videoService.getCapturedFrame();if(!e)return;let A={blob:{mime_type:"image/jpeg",data:e}};this.webSocketService.sendMessage(A)})}stopVideoStreaming(e){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(e)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var ynA=rf(wnA());var nv=class t{stc(e){return(0,ynA.default)(e)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var ov=class t{THEME_STORAGE_KEY="adk-theme-preference";currentTheme=jA(this.getInitialTheme());constructor(){pa(()=>{this.applyTheme(this.currentTheme())})}getInitialTheme(){let e=window.localStorage.getItem(this.THEME_STORAGE_KEY);return e==="light"||e==="dark"?e:"dark"}applyTheme(e){let A=document.documentElement;A.classList.remove("light-theme","dark-theme"),A.classList.add(`${e}-theme`),A.style.colorScheme=e,window.localStorage.setItem(this.THEME_STORAGE_KEY,e)}toggleTheme(){this.currentTheme.update(e=>e==="light"?"dark":"light")}setTheme(e){this.currentTheme.set(e)}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var av=class t{selectedTraceRowSource=new Jt(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new Jt(void 0);eventData$=this.eventDataSource.asObservable();hoveredMessageIndicesSource=new Jt([]);hoveredMessageIndices$=this.hoveredMessageIndicesSource.asObservable();messagesSource=new Jt([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}setHoveredMessages(e,A){if(!e){this.hoveredMessageIndicesSource.next([]);return}let i=e.attributes,n=i&&i["gcp.vertex.agent.event_id"],o=[];for(let[a,r]of this.messagesSource.value.entries())r.role!=="user"&&this.eventDataSource.value?.get(r.eventId)?.invocationId===A&&(!n||i["gcp.vertex.agent.event_id"]===r.eventId)&&o.push(a);this.hoveredMessageIndicesSource.next(o)}resetTraceService(){this.eventDataSource.next(void 0),this.messagesSource.next([]),this.hoveredMessageIndicesSource.next([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var rv=class t{_isSessionLoading=new Jt(!1);_isSessionListLoading=new Jt(!1);_isEventRequestResponseLoading=new Jt(!1);_isMessagesLoading=new Jt(!1);_newMessagesLoadedResponse=new $A;_newMessagesLoadingFailedResponse=new $A;featureFlagService=h(lr);isSessionLoading(){return this._isSessionLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsSessionLoading(e){this._isSessionLoading.next(e)}isSessionListLoading(){return this._isSessionListLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsSessionListLoading(e){this._isSessionListLoading.next(e)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(e){this._isEventRequestResponseLoading.next(e)}setIsMessagesLoading(e){this._isMessagesLoading.next(e)}isMessagesLoading(){return this._isMessagesLoading.pipe(xC(this.featureFlagService.isLoadingAnimationsEnabled()),fe(([e,A])=>e&&A),Ds({bufferSize:1,refCount:!0}))}lazyLoadMessages(e,A,i){throw new Error("Not implemented")}onNewMessagesLoaded(){return this._newMessagesLoadedResponse}onNewMessagesLoadingFailed(){return this._newMessagesLoadingFailedResponse}static \u0275fac=function(A){return new(A||t)};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var sv=class t{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(e){this.renderer=e.createRenderer(null,null)}createVideoElement(e){e?.nativeElement&&(this.clearVideoElement(e),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(e.nativeElement,this.videoElement))}startRecording(e){return ct(this,null,function*(){this.createVideoElement(e);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}getCapturedFrame(){return ct(this,null,function*(){try{let e=yield this.captureFrame();return this.blobToUint8Array(e)}catch(e){console.error("Error capturing frame:",e);return}})}blobToUint8Array(e){return ct(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return ct(this,null,function*(){return new Promise((e,A)=>{try{if(!this.videoElement){A(new Error("Video element not available"));return}let i=document.createElement("canvas");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(i){A(i)}})})}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||t)(Do(Dr))};static \u0275prov=TA({token:t,factory:t.\u0275fac,providedIn:"root"})};var yGA={url:"",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},vGA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",of=class t extends AL{constructor(e,A){if(super(),this._socket=null,e instanceof Ti)this.destination=A,this.source=e;else{let i=this._config=Object.assign({},yGA);if(this._output=new $A,typeof e=="string")i.url=e;else for(let n in e)e.hasOwnProperty(n)&&(i[n]=e[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new El}}lift(e){let A=new t(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new El),this._output=new $A}multiplex(e,A,i){let n=this;return new Ti(o=>{try{n.next(e())}catch(r){o.error(r)}let a=n.subscribe({next:r=>{try{i(r)&&o.next(r)}catch(s){o.error(s)}},error:r=>o.error(r),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(r){o.error(r)}a.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:i,binaryType:n}=this._config,o=this._output,a=null;try{a=A?new e(i,A):new e(i),this._socket=a,n&&(this._socket.binaryType=n)}catch(s){o.error(s);return}let r=new Rn(()=>{this._socket=null,a&&a.readyState===1&&a.close()});a.onopen=s=>{let{_socket:g}=this;if(!g){a.close(),this._resetState();return}let{openObserver:l}=this._config;l&&l.next(s);let C=this.destination;this.destination=ZF.create(I=>{if(a.readyState===1)try{let{serializer:d}=this._config;a.send(d(I))}catch(d){this.destination.error(d)}},I=>{let{closingObserver:d}=this._config;d&&d.next(void 0),I&&I.code?a.close(I.code,I.reason):o.error(new TypeError(vGA)),this._resetState()},()=>{let{closingObserver:I}=this._config;I&&I.next(void 0),a.close(),this._resetState()}),C&&C instanceof El&&r.add(C.subscribe(this.destination))},a.onerror=s=>{this._resetState(),o.error(s)},a.onclose=s=>{a===this._socket&&this._resetState();let{closeObserver:g}=this._config;g&&g.next(s),s.wasClean?o.complete():o.error(s)},a.onmessage=s=>{try{let{deserializer:g}=this._config;o.next(g(s))}catch(g){o.error(g)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var gv=class t{audioPlayingService=h(Wy);socket$;messages$=new Jt("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new $A;connect(e){this.socket$=new of({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingAudio(A),this.messages$.next(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",i=new Uint8Array(e),n=i.byteLength;for(let o=0;ot.json()).then(t=>{window.runtimeConfig=t,xL(UE,{providers:[sL(RL,yn,NL,xy,Fg,vr,Cs),{provide:Hg,useClass:ev},{provide:Ks,useClass:DE},{provide:sy,useClass:jy},{provide:Xy,useClass:gv},{provide:Uy,useValue:"./assets/audio-processor.js"},{provide:Ky,useClass:Jy},{provide:Wy,useClass:Gy},{provide:Zy,useClass:sv},{provide:Fp,useClass:tv},{provide:lB,useClass:zy},{provide:Uc,useClass:Hy},{provide:xp,useClass:_y},{provide:gB,useClass:Yy},{provide:$C,useClass:av},{provide:lr,useClass:Py},{provide:cB,useClass:Vy},{provide:CB,useClass:nv},{provide:Wr,useClass:Av},{provide:Rp,useClass:$y},{provide:LL,useValue:KL},{provide:GL,useValue:VtA},{provide:pE,useValue:Fy},...t.logo?[{provide:wy,useValue:Ny}]:[],{provide:Kc,useClass:Ly},{provide:py,useValue:Qc},dK(),_h(),{provide:Lp,useClass:wc},{provide:Tg,useClass:rv},{provide:gw,useClass:ov}]}).catch(e=>console.error(e))}); ================================================ FILE: cmd/launcher/web/webui/distr/polyfills-5CFQRCPP.js ================================================ var ce=globalThis;function te(t){return(ce.__Zone_symbol_prefix||"__zone_symbol__")+t}function ht(){let t=ce.performance;function n(I){t&&t.mark&&t.mark(I)}function a(I,s){t&&t.measure&&t.measure(I,s)}n("Zone");class e{static __symbol__=te;static assertZonePatched(){if(ce.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let s=e.current;for(;s.parent;)s=s.parent;return s}static get current(){return b.zone}static get currentTask(){return D}static __load_patch(s,i,r=!1){if(S.hasOwnProperty(s)){let E=ce[te("forceDuplicateZoneCheck")]===!0;if(!r&&E)throw Error("Already loaded patch: "+s)}else if(!ce["__Zone_disable_"+s]){let E="Zone:"+s;n(E),S[s]=i(ce,e,R),a(E,E)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(s,i){this._parent=s,this._name=i?i.name||"unnamed":"",this._properties=i&&i.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,i)}get(s){let i=this.getZoneWith(s);if(i)return i._properties[s]}getZoneWith(s){let i=this;for(;i;){if(i._properties.hasOwnProperty(s))return i;i=i._parent}return null}fork(s){if(!s)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,s)}wrap(s,i){if(typeof s!="function")throw new Error("Expecting function got: "+s);let r=this._zoneDelegate.intercept(this,s,i),E=this;return function(){return E.runGuarded(r,this,arguments,i)}}run(s,i,r,E){b={parent:b,zone:this};try{return this._zoneDelegate.invoke(this,s,i,r,E)}finally{b=b.parent}}runGuarded(s,i=null,r,E){b={parent:b,zone:this};try{try{return this._zoneDelegate.invoke(this,s,i,r,E)}catch(x){if(this._zoneDelegate.handleError(this,x))throw x}}finally{b=b.parent}}runTask(s,i,r){if(s.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");let E=s,{type:x,data:{isPeriodic:ee=!1,isRefreshable:M=!1}={}}=s;if(s.state===q&&(x===U||x===k))return;let he=s.state!=A;he&&E._transitionTo(A,d);let _e=D;D=E,b={parent:b,zone:this};try{x==k&&s.data&&!ee&&!M&&(s.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,E,i,r)}catch(Q){if(this._zoneDelegate.handleError(this,Q))throw Q}}finally{let Q=s.state;if(Q!==q&&Q!==X)if(x==U||ee||M&&Q===p)he&&E._transitionTo(d,A,p);else{let Te=E._zoneDelegates;this._updateTaskCount(E,-1),he&&E._transitionTo(q,A,q),M&&(E._zoneDelegates=Te)}b=b.parent,D=_e}}scheduleTask(s){if(s.zone&&s.zone!==this){let r=this;for(;r;){if(r===s.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);r=r.parent}}s._transitionTo(p,q);let i=[];s._zoneDelegates=i,s._zone=this;try{s=this._zoneDelegate.scheduleTask(this,s)}catch(r){throw s._transitionTo(X,p,q),this._zoneDelegate.handleError(this,r),r}return s._zoneDelegates===i&&this._updateTaskCount(s,1),s.state==p&&s._transitionTo(d,p),s}scheduleMicroTask(s,i,r,E){return this.scheduleTask(new g(F,s,i,r,E,void 0))}scheduleMacroTask(s,i,r,E,x){return this.scheduleTask(new g(k,s,i,r,E,x))}scheduleEventTask(s,i,r,E,x){return this.scheduleTask(new g(U,s,i,r,E,x))}cancelTask(s){if(s.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");if(!(s.state!==d&&s.state!==A)){s._transitionTo(V,d,A);try{this._zoneDelegate.cancelTask(this,s)}catch(i){throw s._transitionTo(X,V),this._zoneDelegate.handleError(this,i),i}return this._updateTaskCount(s,-1),s._transitionTo(q,V),s.runCount=-1,s}}_updateTaskCount(s,i){let r=s._zoneDelegates;i==-1&&(s._zoneDelegates=null);for(let E=0;EI.hasTask(i,r),onScheduleTask:(I,s,i,r)=>I.scheduleTask(i,r),onInvokeTask:(I,s,i,r,E,x)=>I.invokeTask(i,r,E,x),onCancelTask:(I,s,i,r)=>I.cancelTask(i,r)};class f{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(s,i,r){this._zone=s,this._parentDelegate=i,this._forkZS=r&&(r&&r.onFork?r:i._forkZS),this._forkDlgt=r&&(r.onFork?i:i._forkDlgt),this._forkCurrZone=r&&(r.onFork?this._zone:i._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:i._interceptZS),this._interceptDlgt=r&&(r.onIntercept?i:i._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this._zone:i._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:i._invokeZS),this._invokeDlgt=r&&(r.onInvoke?i:i._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this._zone:i._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:i._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?i:i._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this._zone:i._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:i._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?i:i._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this._zone:i._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:i._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?i:i._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this._zone:i._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:i._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?i:i._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this._zone:i._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;let E=r&&r.onHasTask,x=i&&i._hasTaskZS;(E||x)&&(this._hasTaskZS=E?r:c,this._hasTaskDlgt=i,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,r.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=i,this._scheduleTaskCurrZone=this._zone),r.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=i,this._invokeTaskCurrZone=this._zone),r.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=i,this._cancelTaskCurrZone=this._zone))}fork(s,i){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,s,i):new e(s,i)}intercept(s,i,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,s,i,r):i}invoke(s,i,r,E,x){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,s,i,r,E,x):i.apply(r,E)}handleError(s,i){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,s,i):!0}scheduleTask(s,i){let r=i;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,s,i),r||(r=i);else if(i.scheduleFn)i.scheduleFn(i);else if(i.type==F)z(i);else throw new Error("Task is missing scheduleFn.");return r}invokeTask(s,i,r,E){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,s,i,r,E):i.callback.apply(r,E)}cancelTask(s,i){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,s,i);else{if(!i.cancelFn)throw Error("Task is not cancelable");r=i.cancelFn(i)}return r}hasTask(s,i){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,s,i)}catch(r){this.handleError(s,r)}}_updateTaskCount(s,i){let r=this._taskCounts,E=r[s],x=r[s]=E+i;if(x<0)throw new Error("More tasks executed then were scheduled.");if(E==0||x==0){let ee={microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:s};this.hasTask(this._zone,ee)}}}class g{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(s,i,r,E,x,ee){if(this.type=s,this.source=i,this.data=E,this.scheduleFn=x,this.cancelFn=ee,!r)throw new Error("callback is not defined");this.callback=r;let M=this;s===U&&E&&E.useG?this.invoke=g.invokeTask:this.invoke=function(){return g.invokeTask.call(ce,M,this,arguments)}}static invokeTask(s,i,r){s||(s=this),K++;try{return s.runCount++,s.zone.runTask(s,i,r)}finally{K==1&&$(),K--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(q,p)}_transitionTo(s,i,r){if(this._state===i||this._state===r)this._state=s,s==q&&(this._zoneDelegates=null);else throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${r?" or '"+r+"'":""}, was '${this._state}'.`)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}let T=te("setTimeout"),y=te("Promise"),w=te("then"),_=[],P=!1,L;function H(I){if(L||ce[y]&&(L=ce[y].resolve(0)),L){let s=L[w];s||(s=L.then),s.call(L,I)}else ce[T](I,0)}function z(I){K===0&&_.length===0&&H($),I&&_.push(I)}function $(){if(!P){for(P=!0;_.length;){let I=_;_=[];for(let s=0;sb,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:z,showUncaughtError:()=>!e[te("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:H},b={parent:null,zone:new e(null,null)},D=null,K=0;function W(){}return a("Zone","Zone"),e}function dt(){let t=globalThis,n=t[te("forceDuplicateZoneCheck")]===!0;if(t.Zone&&(n||typeof t.Zone.__symbol__!="function"))throw new Error("Zone already loaded.");return t.Zone??=ht(),t.Zone}var pe=Object.getOwnPropertyDescriptor,Me=Object.defineProperty,Ae=Object.getPrototypeOf,_t=Object.create,Tt=Array.prototype.slice,je="addEventListener",He="removeEventListener",Ne=te(je),Ze=te(He),ae="true",le="false",ve=te("");function Ve(t,n){return Zone.current.wrap(t,n)}function xe(t,n,a,e,c){return Zone.current.scheduleMacroTask(t,n,a,e,c)}var j=te,we=typeof window<"u",be=we?window:void 0,Y=we&&be||globalThis,Et="removeAttribute";function Fe(t,n){for(let a=t.length-1;a>=0;a--)typeof t[a]=="function"&&(t[a]=Ve(t[a],n+"_"+a));return t}function gt(t,n){let a=t.constructor.name;for(let e=0;e{let y=function(){return T.apply(this,Fe(arguments,a+"."+c))};return fe(y,T),y})(f)}}}function et(t){return t?t.writable===!1?!1:!(typeof t.get=="function"&&typeof t.set>"u"):!0}var tt=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,De=!("nw"in Y)&&typeof Y.process<"u"&&Y.process.toString()==="[object process]",Ge=!De&&!tt&&!!(we&&be.HTMLElement),nt=typeof Y.process<"u"&&Y.process.toString()==="[object process]"&&!tt&&!!(we&&be.HTMLElement),Ce={},kt=j("enable_beforeunload"),Xe=function(t){if(t=t||Y.event,!t)return;let n=Ce[t.type];n||(n=Ce[t.type]=j("ON_PROPERTY"+t.type));let a=this||t.target||Y,e=a[n],c;if(Ge&&a===be&&t.type==="error"){let f=t;c=e&&e.call(this,f.message,f.filename,f.lineno,f.colno,f.error),c===!0&&t.preventDefault()}else c=e&&e.apply(this,arguments),t.type==="beforeunload"&&Y[kt]&&typeof c=="string"?t.returnValue=c:c!=null&&!c&&t.preventDefault();return c};function Ye(t,n,a){let e=pe(t,n);if(!e&&a&&pe(a,n)&&(e={enumerable:!0,configurable:!0}),!e||!e.configurable)return;let c=j("on"+n+"patched");if(t.hasOwnProperty(c)&&t[c])return;delete e.writable,delete e.value;let f=e.get,g=e.set,T=n.slice(2),y=Ce[T];y||(y=Ce[T]=j("ON_PROPERTY"+T)),e.set=function(w){let _=this;if(!_&&t===Y&&(_=Y),!_)return;typeof _[y]=="function"&&_.removeEventListener(T,Xe),g?.call(_,null),_[y]=w,typeof w=="function"&&_.addEventListener(T,Xe,!1)},e.get=function(){let w=this;if(!w&&t===Y&&(w=Y),!w)return null;let _=w[y];if(_)return _;if(f){let P=f.call(this);if(P)return e.set.call(this,P),typeof w[Et]=="function"&&w.removeAttribute(n),P}return null},Me(t,n,e),t[c]=!0}function rt(t,n,a){if(n)for(let e=0;efunction(g,T){let y=a(g,T);return y.cbIdx>=0&&typeof T[y.cbIdx]=="function"?xe(y.name,T[y.cbIdx],y,c):f.apply(g,T)})}function fe(t,n){t[j("OriginalDelegate")]=n}var $e=!1,Le=!1;function yt(){if($e)return Le;$e=!0;try{let t=be.navigator.userAgent;(t.indexOf("MSIE ")!==-1||t.indexOf("Trident/")!==-1||t.indexOf("Edge/")!==-1)&&(Le=!0)}catch{}return Le}function Je(t){return typeof t=="function"}function Ke(t){return typeof t=="number"}var pt={useG:!0},ne={},ot={},st=new RegExp("^"+ve+"(\\w+)(true|false)$"),it=j("propagationStopped");function ct(t,n){let a=(n?n(t):t)+le,e=(n?n(t):t)+ae,c=ve+a,f=ve+e;ne[t]={},ne[t][le]=c,ne[t][ae]=f}function vt(t,n,a,e){let c=e&&e.add||je,f=e&&e.rm||He,g=e&&e.listeners||"eventListeners",T=e&&e.rmAll||"removeAllListeners",y=j(c),w="."+c+":",_="prependListener",P="."+_+":",L=function(p,d,A){if(p.isRemoved)return;let V=p.callback;typeof V=="object"&&V.handleEvent&&(p.callback=k=>V.handleEvent(k),p.originalDelegate=V);let X;try{p.invoke(p,d,[A])}catch(k){X=k}let F=p.options;if(F&&typeof F=="object"&&F.once){let k=p.originalDelegate?p.originalDelegate:p.callback;d[f].call(d,A.type,k,F)}return X};function H(p,d,A){if(d=d||t.event,!d)return;let V=p||d.target||t,X=V[ne[d.type][A?ae:le]];if(X){let F=[];if(X.length===1){let k=L(X[0],V,d);k&&F.push(k)}else{let k=X.slice();for(let U=0;U{throw U})}}}let z=function(p){return H(this,p,!1)},$=function(p){return H(this,p,!0)};function J(p,d){if(!p)return!1;let A=!0;d&&d.useG!==void 0&&(A=d.useG);let V=d&&d.vh,X=!0;d&&d.chkDup!==void 0&&(X=d.chkDup);let F=!1;d&&d.rt!==void 0&&(F=d.rt);let k=p;for(;k&&!k.hasOwnProperty(c);)k=Ae(k);if(!k&&p[c]&&(k=p),!k||k[y])return!1;let U=d&&d.eventNameToString,S={},R=k[y]=k[c],b=k[j(f)]=k[f],D=k[j(g)]=k[g],K=k[j(T)]=k[T],W;d&&d.prepend&&(W=k[j(d.prepend)]=k[d.prepend]);function I(o,u){return u?typeof o=="boolean"?{capture:o,passive:!0}:o?typeof o=="object"&&o.passive!==!1?{...o,passive:!0}:o:{passive:!0}:o}let s=function(o){if(!S.isExisting)return R.call(S.target,S.eventName,S.capture?$:z,S.options)},i=function(o){if(!o.isRemoved){let u=ne[o.eventName],v;u&&(v=u[o.capture?ae:le]);let C=v&&o.target[v];if(C){for(let m=0;mre.zone.cancelTask(re);o.call(Ee,"abort",ie,{once:!0}),re.removeAbortListener=()=>Ee.removeEventListener("abort",ie)}if(S.target=null,me&&(me.taskData=null),Be&&(S.options.once=!0),typeof re.options!="boolean"&&(re.options=se),re.target=N,re.capture=Se,re.eventName=Z,B&&(re.originalDelegate=G),O?ge.unshift(re):ge.push(re),m)return N}};return k[c]=l(R,w,ee,M,F),W&&(k[_]=l(W,P,E,M,F,!0)),k[f]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=arguments[2],C=v?typeof v=="boolean"?!0:v.capture:!1,m=arguments[1];if(!m)return b.apply(this,arguments);if(V&&!V(b,m,o,arguments))return;let O=ne[u],N;O&&(N=O[C?ae:le]);let Z=N&&o[N];if(Z)for(let G=0;Gfunction(c,f){c[it]=!0,e&&e.apply(c,f)})}function Pt(t,n){n.patchMethod(t,"queueMicrotask",a=>function(e,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}var Re=j("zoneTask");function ke(t,n,a,e){let c=null,f=null;n+=e,a+=e;let g={};function T(w){let _=w.data;_.args[0]=function(){return w.invoke.apply(this,arguments)};let P=c.apply(t,_.args);return Ke(P)?_.handleId=P:(_.handle=P,_.isRefreshable=Je(P.refresh)),w}function y(w){let{handle:_,handleId:P}=w.data;return f.call(t,_??P)}c=ue(t,n,w=>function(_,P){if(Je(P[0])){let L={isRefreshable:!1,isPeriodic:e==="Interval",delay:e==="Timeout"||e==="Interval"?P[1]||0:void 0,args:P},H=P[0];P[0]=function(){try{return H.apply(this,arguments)}finally{let{handle:A,handleId:V,isPeriodic:X,isRefreshable:F}=L;!X&&!F&&(V?delete g[V]:A&&(A[Re]=null))}};let z=xe(n,P[0],L,T,y);if(!z)return z;let{handleId:$,handle:J,isRefreshable:q,isPeriodic:p}=z.data;if($)g[$]=z;else if(J&&(J[Re]=z,q&&!p)){let d=J.refresh;J.refresh=function(){let{zone:A,state:V}=z;return V==="notScheduled"?(z._state="scheduled",A._updateTaskCount(z,1)):V==="running"&&(z._state="scheduling"),d.call(this)}}return J??$??z}else return w.apply(t,P)}),f=ue(t,a,w=>function(_,P){let L=P[0],H;Ke(L)?(H=g[L],delete g[L]):(H=L?.[Re],H?L[Re]=null:H=L),H?.type?H.cancelFn&&H.zone.cancelTask(H):w.apply(t,P)})}function Rt(t,n){let{isBrowser:a,isMix:e}=n.getGlobalObjects();if(!a&&!e||!t.customElements||!("customElements"in t))return;let c=["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"];n.patchCallbacks(n,t.customElements,"customElements","define",c)}function Ct(t,n){if(Zone[n.symbol("patchEventTarget")])return;let{eventNames:a,zoneSymbolEventNames:e,TRUE_STR:c,FALSE_STR:f,ZONE_SYMBOL_PREFIX:g}=n.getGlobalObjects();for(let y=0;yf.target===t);if(e.length===0)return n;let c=e[0].ignoreProperties;return n.filter(f=>c.indexOf(f)===-1)}function Qe(t,n,a,e){if(!t)return;let c=lt(t,n,a);rt(t,c,e)}function Ie(t){return Object.getOwnPropertyNames(t).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}function Dt(t,n){if(De&&!nt||Zone[t.symbol("patchEvents")])return;let a=n.__Zone_ignore_on_properties,e=[];if(Ge){let c=window;e=e.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);let f=[];Qe(c,Ie(c),a&&a.concat(f),Ae(c))}e=e.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c{let a=n[t.__symbol__("legacyPatch")];a&&a()}),t.__load_patch("timers",n=>{let e="clear";ke(n,"set",e,"Timeout"),ke(n,"set",e,"Interval"),ke(n,"set",e,"Immediate")}),t.__load_patch("requestAnimationFrame",n=>{ke(n,"request","cancel","AnimationFrame"),ke(n,"mozRequest","mozCancel","AnimationFrame"),ke(n,"webkitRequest","webkitCancel","AnimationFrame")}),t.__load_patch("blocking",(n,a)=>{let e=["alert","prompt","confirm"];for(let c=0;cfunction(w,_){return a.current.run(g,n,_,y)})}}),t.__load_patch("EventTarget",(n,a,e)=>{wt(n,e),Ct(n,e);let c=n.XMLHttpRequestEventTarget;c&&c.prototype&&e.patchEventTarget(n,e,[c.prototype])}),t.__load_patch("MutationObserver",(n,a,e)=>{ye("MutationObserver"),ye("WebKitMutationObserver")}),t.__load_patch("IntersectionObserver",(n,a,e)=>{ye("IntersectionObserver")}),t.__load_patch("FileReader",(n,a,e)=>{ye("FileReader")}),t.__load_patch("on_property",(n,a,e)=>{Dt(e,n)}),t.__load_patch("customElements",(n,a,e)=>{Rt(n,e)}),t.__load_patch("XHR",(n,a)=>{w(n);let e=j("xhrTask"),c=j("xhrSync"),f=j("xhrListener"),g=j("xhrScheduled"),T=j("xhrURL"),y=j("xhrErrorBeforeScheduled");function w(_){let P=_.XMLHttpRequest;if(!P)return;let L=P.prototype;function H(R){return R[e]}let z=L[Ne],$=L[Ze];if(!z){let R=_.XMLHttpRequestEventTarget;if(R){let b=R.prototype;z=b[Ne],$=b[Ze]}}let J="readystatechange",q="scheduled";function p(R){let b=R.data,D=b.target;D[g]=!1,D[y]=!1;let K=D[f];z||(z=D[Ne],$=D[Ze]),K&&$.call(D,J,K);let W=D[f]=()=>{if(D.readyState===D.DONE)if(!b.aborted&&D[g]&&R.state===q){let s=D[a.__symbol__("loadfalse")];if(D.status!==0&&s&&s.length>0){let i=R.invoke;R.invoke=function(){let r=D[a.__symbol__("loadfalse")];for(let E=0;Efunction(R,b){return R[c]=b[2]==!1,R[T]=b[1],V.apply(R,b)}),X="XMLHttpRequest.send",F=j("fetchTaskAborting"),k=j("fetchTaskScheduling"),U=ue(L,"send",()=>function(R,b){if(a.current[k]===!0||R[c])return U.apply(R,b);{let D={target:R,url:R[T],isPeriodic:!1,args:b,aborted:!1},K=xe(X,d,D,p,A);R&&R[y]===!0&&!D.aborted&&K.state===q&&K.invoke()}}),S=ue(L,"abort",()=>function(R,b){let D=H(R);if(D&&typeof D.type=="string"){if(D.cancelFn==null||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(a.current[F]===!0)return S.apply(R,b)})}}),t.__load_patch("geolocation",n=>{n.navigator&&n.navigator.geolocation&>(n.navigator.geolocation,["getCurrentPosition","watchPosition"])}),t.__load_patch("PromiseRejectionEvent",(n,a)=>{function e(c){return function(f){at(n,c).forEach(T=>{let y=n.PromiseRejectionEvent;if(y){let w=new y(c,{promise:f.promise,reason:f.rejection});T.invoke(w)}})}}n.PromiseRejectionEvent&&(a[j("unhandledPromiseRejectionHandler")]=e("unhandledrejection"),a[j("rejectionHandledHandler")]=e("rejectionhandled"))}),t.__load_patch("queueMicrotask",(n,a,e)=>{Pt(n,e)})}function Ot(t){t.__load_patch("ZoneAwarePromise",(n,a,e)=>{let c=Object.getOwnPropertyDescriptor,f=Object.defineProperty;function g(h){if(h&&h.toString===Object.prototype.toString){let l=h.constructor&&h.constructor.name;return(l||"")+": "+JSON.stringify(h)}return h?h.toString():Object.prototype.toString.call(h)}let T=e.symbol,y=[],w=n[T("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")]!==!1,_=T("Promise"),P=T("then"),L="__creationTrace__";e.onUnhandledError=h=>{if(e.showUncaughtError()){let l=h&&h.rejection;l?console.error("Unhandled Promise rejection:",l instanceof Error?l.message:l,"; Zone:",h.zone.name,"; Task:",h.task&&h.task.source,"; Value:",l,l instanceof Error?l.stack:void 0):console.error(h)}},e.microtaskDrainDone=()=>{for(;y.length;){let h=y.shift();try{h.zone.runGuarded(()=>{throw h.throwOriginal?h.rejection:h})}catch(l){z(l)}}};let H=T("unhandledPromiseRejectionHandler");function z(h){e.onUnhandledError(h);try{let l=a[H];typeof l=="function"&&l.call(this,h)}catch{}}function $(h){return h&&typeof h.then=="function"}function J(h){return h}function q(h){return M.reject(h)}let p=T("state"),d=T("value"),A=T("finally"),V=T("parentPromiseValue"),X=T("parentPromiseState"),F="Promise.then",k=null,U=!0,S=!1,R=0;function b(h,l){return o=>{try{I(h,l,o)}catch(u){I(h,!1,u)}}}let D=function(){let h=!1;return function(o){return function(){h||(h=!0,o.apply(null,arguments))}}},K="Promise resolved with itself",W=T("currentTaskTrace");function I(h,l,o){let u=D();if(h===o)throw new TypeError(K);if(h[p]===k){let v=null;try{(typeof o=="object"||typeof o=="function")&&(v=o&&o.then)}catch(C){return u(()=>{I(h,!1,C)})(),h}if(l!==S&&o instanceof M&&o.hasOwnProperty(p)&&o.hasOwnProperty(d)&&o[p]!==k)i(o),I(h,o[p],o[d]);else if(l!==S&&typeof v=="function")try{v.call(o,u(b(h,l)),u(b(h,!1)))}catch(C){u(()=>{I(h,!1,C)})()}else{h[p]=l;let C=h[d];if(h[d]=o,h[A]===A&&l===U&&(h[p]=h[X],h[d]=h[V]),l===S&&o instanceof Error){let m=a.currentTask&&a.currentTask.data&&a.currentTask.data[L];m&&f(o,W,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m{try{let O=h[d],N=!!o&&A===o[A];N&&(o[V]=O,o[X]=C);let Z=l.run(m,void 0,N&&m!==q&&m!==J?[]:[O]);I(o,!0,Z)}catch(O){I(o,!1,O)}},o)}let E="function ZoneAwarePromise() { [native code] }",x=function(){},ee=n.AggregateError;class M{static toString(){return E}static resolve(l){return l instanceof M?l:I(new this(null),U,l)}static reject(l){return I(new this(null),S,l)}static withResolvers(){let l={};return l.promise=new M((o,u)=>{l.resolve=o,l.reject=u}),l}static any(l){if(!l||typeof l[Symbol.iterator]!="function")return Promise.reject(new ee([],"All promises were rejected"));let o=[],u=0;try{for(let m of l)u++,o.push(M.resolve(m))}catch{return Promise.reject(new ee([],"All promises were rejected"))}if(u===0)return Promise.reject(new ee([],"All promises were rejected"));let v=!1,C=[];return new M((m,O)=>{for(let N=0;N{v||(v=!0,m(Z))},Z=>{C.push(Z),u--,u===0&&(v=!0,O(new ee(C,"All promises were rejected")))})})}static race(l){let o,u,v=new this((O,N)=>{o=O,u=N});function C(O){o(O)}function m(O){u(O)}for(let O of l)$(O)||(O=this.resolve(O)),O.then(C,m);return v}static all(l){return M.allWithCallback(l)}static allSettled(l){return(this&&this.prototype instanceof M?this:M).allWithCallback(l,{thenCallback:u=>({status:"fulfilled",value:u}),errorCallback:u=>({status:"rejected",reason:u})})}static allWithCallback(l,o){let u,v,C=new this((Z,G)=>{u=Z,v=G}),m=2,O=0,N=[];for(let Z of l){$(Z)||(Z=this.resolve(Z));let G=O;try{Z.then(B=>{N[G]=o?o.thenCallback(B):B,m--,m===0&&u(N)},B=>{o?(N[G]=o.errorCallback(B),m--,m===0&&u(N)):v(B)})}catch(B){v(B)}m++,O++}return m-=2,m===0&&u(N),C}constructor(l){let o=this;if(!(o instanceof M))throw new Error("Must be an instanceof Promise.");o[p]=k,o[d]=[];try{let u=D();l&&l(u(b(o,U)),u(b(o,S)))}catch(u){I(o,!1,u)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return M}then(l,o){let u=this.constructor?.[Symbol.species];(!u||typeof u!="function")&&(u=this.constructor||M);let v=new u(x),C=a.current;return this[p]==k?this[d].push(C,v,l,o):r(this,C,v,l,o),v}catch(l){return this.then(null,l)}finally(l){let o=this.constructor?.[Symbol.species];(!o||typeof o!="function")&&(o=M);let u=new o(x);u[A]=A;let v=a.current;return this[p]==k?this[d].push(v,u,l,l):r(this,v,u,l,l),u}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;let he=n[_]=n.Promise;n.Promise=M;let _e=T("thenPatched");function Q(h){let l=h.prototype,o=c(l,"then");if(o&&(o.writable===!1||!o.configurable))return;let u=l.then;l[P]=u,h.prototype.then=function(v,C){return new M((O,N)=>{u.call(this,O,N)}).then(v,C)},h[_e]=!0}e.patchThen=Q;function Te(h){return function(l,o){let u=h.apply(l,o);if(u instanceof M)return u;let v=u.constructor;return v[_e]||Q(v),u}}return he&&(Q(he),ue(n,"fetch",h=>Te(h))),Promise[a.__symbol__("uncaughtPromiseErrors")]=y,M})}function Nt(t){t.__load_patch("toString",n=>{let a=Function.prototype.toString,e=j("OriginalDelegate"),c=j("Promise"),f=j("Error"),g=function(){if(typeof this=="function"){let _=this[e];if(_)return typeof _=="function"?a.call(_):Object.prototype.toString.call(_);if(this===Promise){let P=n[c];if(P)return a.call(P)}if(this===Error){let P=n[f];if(P)return a.call(P)}}return a.call(this)};g[e]=a,Function.prototype.toString=g;let T=Object.prototype.toString,y="[object Promise]";Object.prototype.toString=function(){return typeof Promise=="function"&&this instanceof Promise?y:T.call(this)}})}function Zt(t,n,a,e,c){let f=Zone.__symbol__(e);if(n[f])return;let g=n[f]=n[e];n[e]=function(T,y,w){return y&&y.prototype&&c.forEach(function(_){let P=`${a}.${e}::`+_,L=y.prototype;try{if(L.hasOwnProperty(_)){let H=t.ObjectGetOwnPropertyDescriptor(L,_);H&&H.value?(H.value=t.wrapWithCurrentZone(H.value,P),t._redefineProperty(y.prototype,_,H)):L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}else L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}catch{}}),g.call(n,T,y,w)},t.attachOriginToPatched(n[e],g)}function Lt(t){t.__load_patch("util",(n,a,e)=>{let c=Ie(n);e.patchOnProperties=rt,e.patchMethod=ue,e.bindArguments=Fe,e.patchMacroTask=mt;let f=a.__symbol__("BLACK_LISTED_EVENTS"),g=a.__symbol__("UNPATCHED_EVENTS");n[g]&&(n[f]=n[g]),n[f]&&(a[f]=a[g]=n[f]),e.patchEventPrototype=bt,e.patchEventTarget=vt,e.isIEOrEdge=yt,e.ObjectDefineProperty=Me,e.ObjectGetOwnPropertyDescriptor=pe,e.ObjectCreate=_t,e.ArraySlice=Tt,e.patchClass=ye,e.wrapWithCurrentZone=Ve,e.filterProperties=lt,e.attachOriginToPatched=fe,e._redefineProperty=Object.defineProperty,e.patchCallbacks=Zt,e.getGlobalObjects=()=>({globalSources:ot,zoneSymbolEventNames:ne,eventNames:c,isBrowser:Ge,isMix:nt,isNode:De,TRUE_STR:ae,FALSE_STR:le,ZONE_SYMBOL_PREFIX:ve,ADD_EVENT_LISTENER_STR:je,REMOVE_EVENT_LISTENER_STR:He})})}function It(t){Ot(t),Nt(t),Lt(t)}var ut=dt();It(ut);St(ut); ================================================ FILE: cmd/launcher/web/webui/distr/styles-YY6V3TJU.css ================================================ html,html.light-theme,html.dark-theme{--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px;--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}markdown p{margin-block-start:.5em;margin-block-end:.5em}.cdk-overlay-container{z-index:9999!important}.mat-mdc-menu-panel{z-index:10000!important}.mat-mdc-menu-panel,.mat-mdc-menu-panel .mat-mdc-menu-content{background-color:var(--mdc-dialog-container-color)!important}.mat-mdc-menu-item,.mat-mdc-menu-item .mdc-list-item__primary-text{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-menu-item:hover,.mat-mdc-menu-item:focus{background-color:var(--builder-tool-item-hover-background-color)!important}.mat-mdc-menu-item .mat-icon{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-snack-bar-container{--mdc-snackbar-container-color: var(--mdc-dialog-container-color) !important;--mdc-snackbar-supporting-text-color: var(--mdc-dialog-supporting-text-color) !important;--mat-snack-bar-button-color: var(--builder-text-link-color) !important}.mdc-snackbar__surface{background-color:var(--mdc-dialog-container-color)!important}.mdc-snackbar__label,.mat-mdc-snack-bar-label{color:var(--mdc-dialog-supporting-text-color)!important}.mat-mdc-snack-bar-action{color:var(--builder-text-link-color)!important}html.dark-theme{--mat-sys-primary: black;--mdc-checkbox-selected-icon-color: white;--mat-sys-background: #131314;--mat-tab-header-active-label-text-color: #8ab4f8;--mat-tab-header-active-hover-label-text-color: #8ab4f8;--mat-tab-header-active-focus-label-text-color: #8ab4f8;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #89b4f8;--mat-select-trigger-text-color: #8ab4f8;--mat-select-panel-background-color: #2b2b2f;--mat-option-label-text-color: #e8eaed;--mat-option-hover-state-layer-color: rgba(255, 255, 255, .08);--mat-option-focus-state-layer-color: rgba(255, 255, 255, .08);--mat-option-selected-state-layer-color: rgba(138, 180, 248, .24);--mat-form-field-container-text-color: white;--mdc-filled-text-field-input-text-color: white;--mdc-filled-text-field-label-text-color: #9aa0a6;--mdc-filled-text-field-container-color: #303030;--mdc-outlined-text-field-input-text-color: white;--mdc-outlined-text-field-label-text-color: #9aa0a6;--mat-form-field-state-layer-color: white;--mdc-dialog-supporting-text-color: #e8eaed;--mat-dialog-content-text-color: #e8eaed;--mat-expansion-container-text-color: #e8eaed;--mat-expansion-header-text-color: #e8eaed;--adk-web-text-color-light-gray: #c4c7c5}html.light-theme{--mat-sys-primary: #9AA0A6;--mdc-checkbox-selected-icon-color: #305f9d;--mat-sys-background: #ffffff;--mat-tab-header-active-label-text-color: #305f9d;--mat-tab-header-active-hover-label-text-color: #305f9d;--mat-tab-header-active-focus-label-text-color: #305f9d;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #305f9d;--mat-select-trigger-text-color: #202124;--mat-select-panel-background-color: #ffffff;--mat-option-label-text-color: #202124;--mat-option-hover-state-layer-color: rgba(0, 0, 0, .04);--mat-option-focus-state-layer-color: rgba(0, 0, 0, .04);--mat-option-selected-state-layer-color: rgba(48, 95, 157, .12);--mat-form-field-container-text-color: #202124;--mdc-filled-text-field-input-text-color: #202124;--mdc-filled-text-field-label-text-color: #5f5e5e;--mdc-filled-text-field-container-color: #f3f0f0;--mdc-outlined-text-field-input-text-color: #202124;--mdc-outlined-text-field-label-text-color: #5f5e5e;--mat-form-field-state-layer-color: #202124;--mdc-dialog-supporting-text-color: #202124;--mat-dialog-content-text-color: #202124;--mat-expansion-container-text-color: #202124;--mat-expansion-header-text-color: #202124;--adk-web-text-color-light-gray: #c4c7c5}html.dark-theme{--mdc-dialog-subhead-font-family: "Google Sans";--mdc-dialog-subhead-font-style: normal;--mdc-dialog-subhead-font-weight: 400;--mdc-dialog-subhead-font-size: 24px;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-color: #e3e3e3;--mat-dialog-container-color: #2b2b2f;--mat-dialog-subhead-color: white}html.light-theme{--mdc-dialog-subhead-font-family: "Google Sans";--mdc-dialog-subhead-font-style: normal;--mdc-dialog-subhead-font-weight: 400;--mdc-dialog-subhead-font-size: 24px;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-color: #202124;--mat-dialog-container-color: #ffffff;--mat-dialog-subhead-color: #202124}.mat-mdc-dialog-container .mat-mdc-dialog-title.mdc-dialog__title{font-family:var(--mdc-dialog-subhead-font-family);font-style:var(--mdc-dialog-subhead-font-style);font-weight:var(--mdc-dialog-subhead-font-weight);font-size:var(--mdc-dialog-subhead-font-size);line-height:var(--mdc-dialog-subhead-line-height);color:var(--mdc-dialog-subhead-color)}html.dark-theme{--chat-panel-function-event-button-background-color: white;--chat-panel-function-event-button-highlight-background-color: rgb( 15, 82, 35 );--chat-panel-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-panel-function-event-button-highlight-color: white;--long-running-response-input-text-color: #000;--long-running-response-input-caret-color: #000;--long-running-response-input-placeholder-color: rgba(0, 0, 0, .5);--long-running-response-icon-color: #000;--long-running-response-send-button-color: #000;--chat-panel-user-message-message-card-background-color: #004a77;--chat-panel-user-message-message-card-color: white;--chat-panel-bot-message-message-card-background-color: #303030;--chat-panel-bot-message-message-card-color: white;--chat-panel-bot-message-focus-within-message-card-background-color: #131314;--chat-panel-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-panel-message-textarea-background-color: #303030;--chat-panel-message-textarea-focus-background-color: #131314;--chat-panel-eval-compare-container-background-color: #484848;--chat-panel-actual-result-border-right-color: #8a8686;--chat-panel-eval-response-header-border-bottom-color: #8a8686;--chat-panel-header-expected-color: #44c265;--chat-panel-header-actual-color: #ff8983;--chat-panel-eval-pass-color: #44c265;--chat-panel-eval-fail-color: #ff8983;--chat-panel-input-field-textarea-color: white;--chat-panel-input-field-textarea-placeholder-color: #8e918f;--chat-panel-input-field-textarea-caret-color: white;--chat-panel-input-field-button-color: white;--chat-panel-input-field-button-background-color: rgb(51, 53, 55);--chat-panel-mat-mdc-mini-fab-background-color: white;--chat-panel-mat-mdc-mini-fab-mat-icon-color: black;--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-panel-delete-button-background-color: rgba(0, 0, 0, .7);--chat-panel-delete-button-color: white;--chat-panel-file-container-background-color: #1e1e1e;--chat-panel-thought-chip-background-color: #8ab4f8;--chat-panel-link-style-button-color: #007bff;--artifact-tab-download-button-background-color: #8ab4f8;--artifact-tab-white-separator-border-top-color: white;--artifact-tab-version-select-container-background-color: #212123;--artifact-tab-link-style-button-color: #007bff;--artifact-tab-link-style-button-hover-color: #0056b3;--artifact-tab-link-style-button-focus-outline-color: #007bff;--artifact-tab-link-style-button-active-color: #004085;--artifact-tab-link-style-button-disabled-color: #6c757d;--audio-player-container-background-color: #f0f0f0;--audio-player-container-box-shadow-color: rgba(0, 0, 0, .1);--audio-player-custom-controls-button-background-color: #007bff;--audio-player-custom-controls-button-color: white;--audio-player-custom-controls-button-hover-background-color: #0056b3;--chat-drawer-container-background-color: #131314;--chat-event-container-color: white;--chat-card-background-color: #131314;--chat-function-event-button-background-color: white;--chat-function-event-button-highlight-background-color: rgb(15, 82, 35);--chat-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-function-event-button-highlight-color: white;--chat-user-message-message-card-background-color: #004a77;--chat-user-message-message-card-color: white;--chat-bot-message-message-card-background-color: #303030;--chat-bot-message-message-card-color: white;--chat-bot-message-focus-within-message-card-background-color: #131314;--chat-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-message-textarea-background-color: #303030;--chat-message-textarea-focus-background-color: #131314;--chat-eval-compare-container-background-color: #484848;--chat-actual-result-border-right-color: #8a8686;--chat-eval-response-header-border-bottom-color: #8a8686;--chat-header-expected-color: #44c265;--chat-header-actual-color: #ff8983;--chat-eval-pass-color: #44c265;--chat-eval-fail-color: #ff8983;--chat-side-drawer-background-color: #1b1b1b;--chat-side-drawer-color: white;--chat-file-item-background-color: #eee;--chat-empty-state-container-color: #eee;--chat-warning-color: #ffc185;--chat-error-color: #ff4545;--chat-mat-mdc-unelevated-button-color: #202124;--chat-mat-mdc-unelevated-button-background-color: #8ab4f8;--chat-mdc-linear-progress-buffer-dots-background-color: white;--chat-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-segment-key-color: lightgray;--chat-bottom-resize-handler-background-color: #5f6368;--chat-readonly-badge-background-color: #ff8983;--chat-readonly-badge-color: #202124;--chat-trace-detail-container-background-color: #1b1b1b;--chat-toolbar-background-color: #1b1b1b;--chat-toolbar-edit-mode-background-color: #44c2651a;--chat-toolbar-session-text-color: #fdfdfd;--chat-toolbar-session-id-color: #9aa0a6;--chat-toolbar-icon-color: #c4c7c5;--chat-toolbar-new-session-color: #9aa0a6;--chat-toolbar-sse-toggle-label-text-color: #e8eaed;--chat-toolbar-sse-toggle-unselected-track-color: #5f6368;--chat-toolbar-sse-toggle-unselected-handle-color: #9aa0a6;--chat-toolbar-sse-toggle-selected-track-color: #8ab4f9;--chat-toolbar-sse-toggle-selected-handle-color: #1b73e8;--chat-toolbar-sse-toggle-track-outline-color: #1b73e8;--chat-mat-drawer-border-right-color: #444746;--edit-json-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--eval-tab-eval-set-actions-color: #9aa0a6;--eval-tab-empty-eval-info-background-color: #202124;--eval-tab-empty-eval-info-box-shadow-color1: rgba(0, 0, 0, .15);--eval-tab-empty-eval-info-box-shadow-color2: rgba(0, 0, 0, .3);--eval-tab-info-title-color: #e8eaed;--eval-tab-info-detail-color: #e8eaed;--eval-tab-info-create-color: #8ab4f8;--eval-tab-selected-eval-case-color: #8ab4f8;--eval-tab-save-session-btn-background-color1: rgba(138, 180, 248, .24);--eval-tab-save-session-btn-background-color2: #202124;--eval-tab-save-session-btn-text-color: #d2e3fc;--eval-tab-run-eval-btn-border-color: #5f6368;--eval-tab-run-eval-btn-color: #8ab4f8;--eval-tab-run-eval-btn-hover-background-color: #202124;--eval-tab-result-btn-border-color: #5f6368;--eval-tab-result-btn-hover-background-color: #202124;--eval-tab-result-btn-pass-color: #44c265;--eval-tab-result-btn-fail-color: #ff8983;--eval-tab-status-card-background-color: #2d2d2d;--eval-tab-status-card-timestamp-color: #e0e0e0;--eval-tab-status-card-metric-color: #bbb;--eval-tab-status-card-failed-color: #ff6b6b;--eval-tab-status-card-separator-color: #666;--eval-tab-status-card-passed-color: #63e6be;--eval-tab-status-card-action-mat-icon-color: #bdbdbd;--eval-tab-status-card-icon-color: #bdbdbd;--run-eval-config-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--run-eval-config-dialog-threshold-slider-active-track-color: #4285f4;--run-eval-config-dialog-threshold-slider-inactive-track-color: #616161;--run-eval-config-dialog-threshold-slider-handle-color: #4285f4;--run-eval-config-dialog-threshold-slider-ripple-color: #4285f4;--run-eval-config-dialog-mdc-slider-thumb-background-color: black;--event-tab-events-wrapper-color: #9aa0a6;--event-tab-event-index-color: #80868b;--event-tab-event-list-active-indicator-color: orange;--event-tab-event-list-list-item-container-color: #2b2b2f;--event-tab-mdc-list-item-border-color: #5f6368;--event-tab-mdc-list-item-hover-background-color: #1c1b1c;--trace-chart-trace-label-color: #e3e3e3;--trace-chart-trace-bar-background-color: #2f4d65;--trace-chart-trace-bar-color: #8dabbf;--trace-chart-trace-duration-color: #888;--trace-chart-vertical-line-background-color: #ccc;--trace-chart-horizontal-line-background-color: #ccc;--session-tab-session-wrapper-color: #9aa0a6;--session-tab-session-item-background-color: #303030;--session-tab-session-item-hover-background-color: #141414;--session-tab-session-item-current-background-color: #004a77;--session-tab-session-id-color: #e8eaed;--session-tab-session-date-color: #9aa0a6;--side-panel-button-filled-container-color: #89b4f8;--side-panel-button-filled-label-text-color: black;--side-panel-mat-icon-color: #bdc1c6;--side-panel-resize-handler-background-color: #5f6368;--side-panel-details-panel-container-background-color: #242424;--side-panel-details-content-color: white;--side-panel-powered-by-adk-color: grey;--side-panel-app-select-container-background-color: #212123;--side-panel-select-placeholder-text-color: #8ab4f8;--side-panel-select-enabled-trigger-text-color: #8ab4f8;--side-panel-select-enabled-arrow-color: #8ab4f8;--side-panel-app-name-option-color: #9aa0a6;--trace-tab-trace-title-color: #9aa0a6;--trace-tab-trace-label-color: #e3e3e3;--trace-tab-trace-bar-background-color: #2f4d65;--trace-tab-trace-bar-color: #8dabbf;--trace-tab-trace-duration-color: #888;--trace-tab-vertical-line-background-color: #ccc;--trace-tab-horizontal-line-background-color: #ccc;--trace-tab-trace-item-container-background-color: #333537;--trace-tab-trace-item-header-focus-state-layer-color: rgba(138, 180, 248, .12);--trace-tab-trace-item-header-description-color: #8e918f;--trace-tab-mat-expansion-panel-header-focus-background-color: #444746;--trace-tab-mat-expansion-panel-header-background-color: #444746;--trace-tab-mat-expansion-panel-header-hover-background-color: #444746;--trace-event-json-viewer-container-background-color: #1b1b1b;--trace-tree-trace-label-color: #e3e3e3;--trace-tree-trace-bar-background-color: #2f4d65;--trace-tree-trace-bar-color: #8dabbf;--trace-tree-short-trace-bar-duration-color: #8dabbf;--trace-tree-trace-duration-color: #888;--trace-tree-trace-row-hover-background-color: #3b3d3c;--trace-tree-trace-row-selected-background-color: #3b3d3c;--trace-tree-vertical-line-background-color: #ccc;--trace-tree-horizontal-line-background-color: #ccc;--trace-tree-invocation-id-container-color: #9aa0a6;--trace-tree-trace-row-left-span-div-color: white;--trace-tree-trace-row-left-is-event-row-color: #8ab4f8;--builder-container-background-color: #131314;--builder-panel-background-color: #202124;--builder-tabs-background-color: #202124;--builder-card-background-color: #303030;--builder-secondary-background-color: #333537;--builder-tertiary-background-color: #1b1b1b;--builder-hover-background-color: #141414;--builder-border-color: #444746;--builder-text-primary-color: #e8eaed;--builder-text-secondary-color: #9aa0a6;--builder-text-tertiary-color: #c4c7c5;--builder-text-muted-color: #5c5f5e;--builder-text-link-color: #aecbfa;--builder-breadcrumb-separator-color: #666;--builder-form-field-background-color: #333537;--builder-tool-chip-background-color: #303030;--builder-tool-chip-hover-color: #3c4043;--builder-callback-chip-background-color: #333537;--builder-callback-chip-text-color: #f1f3f4;--builder-callback-chip-type-color: #8f9aa6;--builder-callback-chip-name-color: #f5f7f9;--builder-expansion-background-color: #333537;--builder-expansion-header-description-color: #8e918f;--builder-expansion-hover-color: #444746;--builder-menu-background-color: #303030;--builder-menu-item-hover-color: #444746;--builder-menu-divider-color: #444746;--builder-button-primary-background-color: #8ab4f8;--builder-button-primary-text-color: #202124;--builder-button-primary-hover-color: #aecbfa;--builder-button-secondary-text-color: #9aa0a6;--builder-button-secondary-border-color: rgba(154, 160, 166, .3);--builder-button-secondary-hover-background-color: rgba(154, 160, 166, .1);--builder-button-secondary-hover-text-color: #e8eaed;--builder-add-button-background-color: rgba(138, 180, 248, .24);--builder-add-button-text-color: #d2e3fc;--builder-icon-color: #f1f3f4;--builder-assistant-panel-background-color: #2b2b2b;--builder-assistant-panel-header-background-color: #292929;--builder-assistant-panel-border-color: #3c3c3c;--builder-assistant-input-background-color: #1a1a1a;--builder-assistant-input-text-color: #e0e0e0;--builder-assistant-input-placeholder-color: #808080;--builder-assistant-user-message-background-color: #1a1a1a;--builder-assistant-user-message-border-color: #404040;--builder-assistant-user-message-text-color: #e3e3e3;--builder-assistant-bot-message-text-color: #d4d4d4;--builder-assistant-send-button-color: #888888;--builder-assistant-send-button-hover-color: #b0b0b0;--builder-assistant-send-button-disabled-color: #4a4a4a;--builder-canvas-container-background: linear-gradient(135deg, #0f0f0f 0%, #1a1a1a 100%);--builder-canvas-shadow: 0 8px 32px rgba(0, 0, 0, .4);--builder-canvas-header-background: linear-gradient(90deg, #1e1e1e 0%, #2a2a2a 100%);--builder-canvas-header-title-gradient: linear-gradient(45deg, #8ab4f8, #4285f4);--builder-canvas-workspace-background: #131314;--builder-canvas-instruction-background: rgba(19, 19, 20, .9);--builder-canvas-instruction-border: rgba(138, 180, 248, .2);--builder-canvas-node-background: rgba(85, 107, 116, .4);--builder-canvas-node-border: #474747;--builder-canvas-node-hover-border: #666;--builder-canvas-node-chip-outline: rgba(255, 255, 255, .1);--builder-canvas-node-badge-background: linear-gradient(135deg, rgba(0, 187, 234, .2), rgba(0, 78, 122, .4));--builder-canvas-group-background: #1c1c1c;--builder-canvas-group-border: #3e3e3e;--builder-canvas-handle-fill: rgba(0, 0, 0, 1);--builder-canvas-reconnect-handle-fill: rgba(0, 187, 234, .15);--builder-canvas-workflow-chip-background: rgba(0, 187, 234, .2);--builder-canvas-workflow-chip-border: rgba(0, 187, 234, .4);--builder-canvas-add-btn-background: radial-gradient(circle at 50% 50%, #1f2330 0%, #131314 100%);--builder-canvas-add-btn-hover-background: radial-gradient(circle at 50% 50%, #222a3a 0%, #16181d 100%);--builder-canvas-add-btn-shadow: 0 4px 12px rgba(0, 187, 234, .35);--builder-canvas-empty-group-background: rgba(255, 255, 255, .02);--builder-canvas-empty-group-border: rgba(0, 187, 234, .3);--builder-canvas-empty-group-hover-background: rgba(255, 255, 255, .04);--builder-canvas-empty-group-hover-border: rgba(0, 187, 234, .5);--builder-canvas-empty-group-btn-background: rgba(0, 187, 234, .1);--builder-canvas-empty-group-btn-hover-background: rgba(0, 187, 234, .2);--builder-button-background-color: rgba(138, 180, 248, .1);--builder-button-border-color: rgba(138, 180, 248, .3);--builder-button-text-color: #8ab4f8;--builder-button-hover-background-color: rgba(138, 180, 248, .2);--builder-button-hover-border-color: #8ab4f8;--builder-item-hover-color: rgba(138, 180, 248, .1);--builder-chip-background-color: rgba(138, 180, 248, .2);--builder-accent-color: #00bbea;--builder-tool-item-background-color: rgba(255, 255, 255, .05);--builder-tool-item-border-color: rgba(255, 255, 255, .1);--builder-tool-item-hover-background-color: rgba(255, 255, 255, .1);--mat-table-row-item-label-text-color: #fff;--mat-table-header-headline-color: #fff;--mat-progress-spinner-active-indicator-color: #a8c7fa;--mat-progress-spinner-size: 80}html.light-theme{--mat-button-outlined-label-text-color: black;--chat-panel-function-event-button-background-color: #f2f1ef;--chat-panel-function-event-button-highlight-border-color: #0f5223;--chat-panel-function-event-button-highlight-color: white;--long-running-response-input-text-color: #202124;--long-running-response-input-caret-color: #202124;--long-running-response-input-placeholder-color: rgba(0, 0, 0, .5);--long-running-response-icon-color: rgba(0, 0, 0, .7);--long-running-response-send-button-color: #305f9d;--chat-panel-user-message-message-card-background-color: #d5e3ff;--chat-panel-user-message-message-card-color: #202124;--chat-panel-bot-message-message-card-background-color: #f3f0f0;--chat-panel-bot-message-message-card-color: #202124;--chat-panel-bot-message-focus-within-message-card-background-color: #ffffff;--chat-panel-bot-message-focus-within-message-card-border-color: #305f9d;--chat-panel-message-textarea-background-color: #f3f0f0;--chat-panel-message-textarea-focus-background-color: #ffffff;--chat-panel-eval-compare-container-background-color: #e5e2e2;--chat-panel-actual-result-border-right-color: #c8c6c6;--chat-panel-eval-response-header-border-bottom-color: #c8c6c6;--chat-panel-header-expected-color: #0f5223;--chat-panel-header-actual-color: #ba1a1a;--chat-panel-eval-pass-color: #0f5223;--chat-panel-eval-fail-color: #ba1a1a;--chat-panel-input-field-textarea-color: #202124;--chat-panel-input-field-textarea-placeholder-color: #5f5e5e;--chat-panel-input-field-textarea-caret-color: #202124;--chat-panel-input-field-button-color: #202124;--chat-panel-input-field-button-background-color: #e5e2e2;--chat-panel-mat-mdc-mini-fab-background-color: #305f9d;--chat-panel-mat-mdc-mini-fab-mat-icon-color: white;--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color: #adabab;--chat-panel-delete-button-background-color: rgba(255, 255, 255, .9);--chat-panel-delete-button-color: #202124;--chat-panel-file-container-background-color: #f3f0f0;--chat-panel-thought-chip-background-color: #305f9d;--chat-panel-link-style-button-color: #305f9d;--artifact-tab-download-button-background-color: #305f9d;--artifact-tab-white-separator-border-top-color: #202124;--artifact-tab-version-select-container-background-color: #f3f0f0;--artifact-tab-link-style-button-color: #305f9d;--artifact-tab-link-style-button-hover-color: #0f4784;--artifact-tab-link-style-button-focus-outline-color: #305f9d;--artifact-tab-link-style-button-active-color: #003061;--artifact-tab-link-style-button-disabled-color: #929090;--audio-player-container-background-color: #f3f0f0;--audio-player-container-box-shadow-color: rgba(0, 0, 0, .1);--audio-player-custom-controls-button-background-color: #305f9d;--audio-player-custom-controls-button-color: white;--audio-player-custom-controls-button-hover-background-color: #0f4784;--chat-drawer-container-background-color: #ffffff;--chat-event-container-color: #202124;--chat-card-background-color: #ffffff;--chat-function-event-button-background-color: #202124;--chat-function-event-button-highlight-background-color: #0f5223;--chat-function-event-button-highlight-border-color: #0f5223;--chat-function-event-button-highlight-color: white;--chat-user-message-message-card-background-color: #d5e3ff;--chat-user-message-message-card-color: #202124;--chat-bot-message-message-card-background-color: #f3f0f0;--chat-bot-message-message-card-color: #202124;--chat-bot-message-focus-within-message-card-background-color: #ffffff;--chat-bot-message-focus-within-message-card-border-color: #305f9d;--chat-message-textarea-background-color: #f3f0f0;--chat-message-textarea-focus-background-color: #ffffff;--chat-eval-compare-container-background-color: #e5e2e2;--chat-actual-result-border-right-color: #c8c6c6;--chat-eval-response-header-border-bottom-color: #c8c6c6;--chat-header-expected-color: #0f5223;--chat-header-actual-color: #ba1a1a;--chat-eval-pass-color: #0f5223;--chat-eval-fail-color: #ba1a1a;--chat-side-drawer-background-color: #f3f0f0;--chat-side-drawer-color: #202124;--chat-file-item-background-color: #e5e2e2;--chat-empty-state-container-color: #202124;--chat-warning-color: #93000a;--chat-error-color: #ba1a1a;--chat-mat-mdc-unelevated-button-color: white;--chat-mat-mdc-unelevated-button-background-color: #305f9d;--chat-mdc-linear-progress-buffer-dots-background-color: #202124;--chat-mat-mdc-text-field-wrapper-border-color: #adabab;--chat-segment-key-color: #5f5e5e;--chat-bottom-resize-handler-background-color: #adabab;--chat-readonly-badge-background-color: #ba1a1a;--chat-readonly-badge-color: white;--chat-trace-detail-container-background-color: #f3f0f0;--chat-toolbar-background-color: #f3f0f0;--chat-toolbar-edit-mode-background-color: rgba(15, 82, 35, .1);--chat-toolbar-session-text-color: #202124;--chat-toolbar-session-id-color: #5f5e5e;--chat-toolbar-icon-color: #5f5e5e;--chat-toolbar-new-session-color: #5f5e5e;--chat-toolbar-sse-toggle-label-text-color: #202124;--chat-toolbar-sse-toggle-unselected-track-color: #c8c6c6;--chat-toolbar-sse-toggle-unselected-handle-color: #5f5e5e;--chat-toolbar-sse-toggle-selected-track-color: #82adf0;--chat-toolbar-sse-toggle-selected-handle-color: #305f9d;--chat-toolbar-sse-toggle-track-outline-color: #305f9d;--chat-mat-drawer-border-right-color: #c8c6c6;--edit-json-dialog-container-box-shadow-color: rgba(0, 0, 0, .2);--eval-tab-eval-set-actions-color: #5f5e5e;--eval-tab-empty-eval-info-background-color: #f3f0f0;--eval-tab-empty-eval-info-box-shadow-color1: rgba(0, 0, 0, .08);--eval-tab-empty-eval-info-box-shadow-color2: rgba(0, 0, 0, .15);--eval-tab-info-title-color: #202124;--eval-tab-info-detail-color: #202124;--eval-tab-info-create-color: #305f9d;--eval-tab-selected-eval-case-color: #305f9d;--eval-tab-save-session-btn-background-color1: rgba(48, 95, 157, .12);--eval-tab-save-session-btn-background-color2: #f3f0f0;--eval-tab-save-session-btn-text-color: #0f4784;--eval-tab-run-eval-btn-border-color: #adabab;--eval-tab-run-eval-btn-color: #305f9d;--eval-tab-run-eval-btn-hover-background-color: #f3f0f0;--eval-tab-result-btn-border-color: #adabab;--eval-tab-result-btn-hover-background-color: #f3f0f0;--eval-tab-result-btn-pass-color: #0f5223;--eval-tab-result-btn-fail-color: #ba1a1a;--eval-tab-status-card-background-color: #f3f0f0;--eval-tab-status-card-timestamp-color: #5f5e5e;--eval-tab-status-card-metric-color: #787777;--eval-tab-status-card-failed-color: #ba1a1a;--eval-tab-status-card-separator-color: #c8c6c6;--eval-tab-status-card-passed-color: #0f5223;--eval-tab-status-card-action-mat-icon-color: #5f5e5e;--eval-tab-status-card-icon-color: #5f5e5e;--run-eval-config-dialog-container-box-shadow-color: rgba(0, 0, 0, .2);--run-eval-config-dialog-threshold-slider-active-track-color: #305f9d;--run-eval-config-dialog-threshold-slider-inactive-track-color: #c8c6c6;--run-eval-config-dialog-threshold-slider-handle-color: #305f9d;--run-eval-config-dialog-threshold-slider-ripple-color: #305f9d;--run-eval-config-dialog-mdc-slider-thumb-background-color: white;--event-tab-events-wrapper-color: #5f5e5e;--event-tab-event-index-color: #787777;--event-tab-event-list-active-indicator-color: #ff5449;--event-tab-event-list-list-item-container-color: #f3f0f0;--event-tab-mdc-list-item-border-color: #c8c6c6;--event-tab-mdc-list-item-hover-background-color: #e5e2e2;--trace-chart-trace-label-color: #202124;--trace-chart-trace-bar-background-color: #a7c8ff;--trace-chart-trace-bar-color: #305f9d;--trace-chart-trace-duration-color: #787777;--trace-chart-vertical-line-background-color: #c8c6c6;--trace-chart-horizontal-line-background-color: #c8c6c6;--session-tab-session-wrapper-color: #5f5e5e;--session-tab-session-item-background-color: #f3f0f0;--session-tab-session-item-hover-background-color: #e5e2e2;--session-tab-session-item-current-background-color: #d5e3ff;--session-tab-session-id-color: #202124;--session-tab-session-date-color: #5f5e5e;--side-panel-button-filled-container-color: #305f9d;--side-panel-button-filled-label-text-color: white;--side-panel-mat-icon-color: #5f5e5e;--side-panel-resize-handler-background-color: #adabab;--side-panel-details-panel-container-background-color: #f3f0f0;--side-panel-details-content-color: #202124;--side-panel-powered-by-adk-color: #787777;--side-panel-app-select-container-background-color: #ffffff;--side-panel-select-placeholder-text-color: #305f9d;--side-panel-select-enabled-trigger-text-color: #305f9d;--side-panel-select-enabled-arrow-color: #305f9d;--side-panel-app-name-option-color: #5f5e5e;--trace-tab-trace-title-color: #5f5e5e;--trace-tab-trace-label-color: #202124;--trace-tab-trace-bar-background-color: #a7c8ff;--trace-tab-trace-bar-color: #305f9d;--trace-tab-trace-duration-color: #787777;--trace-tab-vertical-line-background-color: #c8c6c6;--trace-tab-horizontal-line-background-color: #c8c6c6;--trace-tab-trace-item-container-background-color: #f3f0f0;--trace-tab-trace-item-header-focus-state-layer-color: rgba(48, 95, 157, .12);--trace-tab-trace-item-header-description-color: #787777;--trace-tab-mat-expansion-panel-header-focus-background-color: #e5e2e2;--trace-tab-mat-expansion-panel-header-background-color: #e5e2e2;--trace-tab-mat-expansion-panel-header-hover-background-color: #e5e2e2;--trace-event-json-viewer-container-background-color: #ffffff;--trace-tree-trace-label-color: #202124;--trace-tree-trace-bar-background-color: #a7c8ff;--trace-tree-trace-bar-color: #305f9d;--trace-tree-short-trace-bar-duration-color: #305f9d;--trace-tree-trace-duration-color: #787777;--trace-tree-trace-row-hover-background-color: #e5e2e2;--trace-tree-trace-row-selected-background-color: #e5e2e2;--trace-tree-vertical-line-background-color: #c8c6c6;--trace-tree-horizontal-line-background-color: #c8c6c6;--trace-tree-invocation-id-container-color: #5f5e5e;--trace-tree-trace-row-left-span-div-color: #202124;--trace-tree-trace-row-left-is-event-row-color: #305f9d;--builder-container-background-color: #ffffff;--builder-panel-background-color: #f3f0f0;--builder-tabs-background-color: #f3f0f0;--builder-card-background-color: #ffffff;--builder-secondary-background-color: #e5e2e2;--builder-tertiary-background-color: #f3f0f0;--builder-hover-background-color: #dcd9d9;--builder-border-color: #c8c6c6;--builder-text-primary-color: #202124;--builder-text-secondary-color: #5f5e5e;--builder-text-tertiary-color: #787777;--builder-text-muted-color: #929090;--builder-text-link-color: #305f9d;--builder-breadcrumb-separator-color: #c8c6c6;--builder-form-field-background-color: #e5e2e2;--builder-tool-chip-background-color: #ffffff;--builder-tool-chip-hover-color: #e5e2e2;--builder-callback-chip-background-color: #e5e2e2;--builder-callback-chip-text-color: #202124;--builder-callback-chip-type-color: #5f5e5e;--builder-callback-chip-name-color: #202124;--builder-expansion-background-color: #e5e2e2;--builder-expansion-header-description-color: #787777;--builder-expansion-hover-color: #dcd9d9;--builder-menu-background-color: #ffffff;--builder-menu-item-hover-color: #e5e2e2;--builder-menu-divider-color: #c8c6c6;--builder-button-primary-background-color: #305f9d;--builder-button-primary-text-color: #ffffff;--builder-button-primary-hover-color: #0f4784;--builder-button-secondary-text-color: #5f5e5e;--builder-button-secondary-border-color: rgba(95, 94, 94, .3);--builder-button-secondary-hover-background-color: rgba(95, 94, 94, .1);--builder-button-secondary-hover-text-color: #202124;--builder-add-button-background-color: rgba(48, 95, 157, .12);--builder-add-button-text-color: #0f4784;--builder-icon-color: #202124;--builder-assistant-panel-background-color: #f3f0f0;--builder-assistant-panel-header-background-color: #e5e2e2;--builder-assistant-panel-border-color: #c8c6c6;--builder-assistant-input-background-color: #ffffff;--builder-assistant-input-text-color: #202124;--builder-assistant-input-placeholder-color: #929090;--builder-assistant-user-message-background-color: #d5e3ff;--builder-assistant-user-message-border-color: #a7c8ff;--builder-assistant-user-message-text-color: #202124;--builder-assistant-bot-message-text-color: #202124;--builder-assistant-send-button-color: #5f5e5e;--builder-assistant-send-button-hover-color: #305f9d;--builder-assistant-send-button-disabled-color: #c8c6c6;--builder-canvas-container-background: linear-gradient(135deg, #f8f9fa 0%, #e8eaed 100%);--builder-canvas-shadow: 0 8px 32px rgba(0, 0, 0, .1);--builder-canvas-header-background: linear-gradient(90deg, #ffffff 0%, #f3f0f0 100%);--builder-canvas-header-title-gradient: linear-gradient(45deg, #305f9d, #0f4784);--builder-canvas-workspace-background: #ffffff;--builder-canvas-instruction-background: rgba(255, 255, 255, .95);--builder-canvas-instruction-border: rgba(48, 95, 157, .3);--builder-canvas-node-background: rgba(229, 226, 226, .6);--builder-canvas-node-border: #c8c6c6;--builder-canvas-node-hover-border: #adabab;--builder-canvas-node-chip-outline: rgba(200, 198, 198, .3);--builder-canvas-node-badge-background: linear-gradient(135deg, rgba(48, 95, 157, .15), rgba(15, 71, 132, .2));--builder-canvas-group-background: #f3f0f0;--builder-canvas-group-border: #c8c6c6;--builder-canvas-handle-fill: rgba(255, 255, 255, 1);--builder-canvas-reconnect-handle-fill: rgba(48, 95, 157, .15);--builder-canvas-workflow-chip-background: rgba(48, 95, 157, .15);--builder-canvas-workflow-chip-border: rgba(48, 95, 157, .3);--builder-canvas-add-btn-background: radial-gradient(circle at 50% 50%, #ffffff 0%, #f8f9fa 100%);--builder-canvas-add-btn-hover-background: radial-gradient(circle at 50% 50%, #f3f0f0 0%, #e8eaed 100%);--builder-canvas-add-btn-shadow: 0 4px 12px rgba(48, 95, 157, .25);--builder-canvas-empty-group-background: rgba(48, 95, 157, .03);--builder-canvas-empty-group-border: rgba(48, 95, 157, .3);--builder-canvas-empty-group-hover-background: rgba(48, 95, 157, .06);--builder-canvas-empty-group-hover-border: rgba(48, 95, 157, .5);--builder-canvas-empty-group-btn-background: rgba(48, 95, 157, .1);--builder-canvas-empty-group-btn-hover-background: rgba(48, 95, 157, .2);--builder-button-background-color: rgba(48, 95, 157, .1);--builder-button-border-color: rgba(48, 95, 157, .3);--builder-button-text-color: #305f9d;--builder-button-hover-background-color: rgba(48, 95, 157, .2);--builder-button-hover-border-color: #305f9d;--builder-item-hover-color: rgba(48, 95, 157, .1);--builder-chip-background-color: rgba(48, 95, 157, .15);--builder-accent-color: #305f9d;--builder-tool-item-background-color: #f6f3f3;--builder-tool-item-border-color: #c8c6c6;--builder-tool-item-hover-background-color: #dcd9d9;--mat-progress-spinner-active-indicator-color: #305f9d;--mat-progress-spinner-size: 80}html.dark-theme{--mat-form-field-disabled-input-text-placeholder-color: orange;--mat-form-field-filled-active-indicator-color: red;--mat-form-field-outlined-outline-color: #cccccc;--mat-form-field-outlined-input-text-color: #cccccc;--mat-form-field-outlined-label-text-color: #cccccc;--mat-form-field-outlined-hover-label-text-color: #cccccc;--mat-form-field-outlined-focus-label-text-color: #cccccc;--mat-form-field-outlined-disabled-label-text-color: #cccccc;--mat-form-field-outlined-disabled-input-text-color: #cccccc;--mat-form-field-outlined-disabled-outline-color: #cccccc;--mat-form-field-outlined-caret-color: #cccccc}html.light-theme{--mat-form-field-disabled-input-text-placeholder-color: #ff8983;--mat-form-field-filled-active-indicator-color: #ba1a1a;--mat-form-field-outlined-outline-color: #787777;--mat-form-field-outlined-input-text-color: #202124;--mat-form-field-outlined-label-text-color: #5f5e5e;--mat-form-field-outlined-hover-label-text-color: #202124;--mat-form-field-outlined-focus-label-text-color: #305f9d;--mat-form-field-outlined-disabled-label-text-color: #929090;--mat-form-field-outlined-disabled-input-text-color: #929090;--mat-form-field-outlined-disabled-outline-color: #c8c6c6;--mat-form-field-outlined-caret-color: #305f9d}.mdc-line-ripple{display:none}.mat-mdc-tooltip{z-index:10000!important;max-width:300px}.mat-mdc-select-panel{background-color:var(--mat-select-panel-background-color)!important}html.light-theme .mat-expansion-panel{box-shadow:none!important;border:1px solid #e0e0e0;border-radius:4px!important}html.light-theme .mat-expansion-panel:not(:last-child){margin-bottom:8px}html.light-theme .mat-expansion-panel-header{border-bottom:none!important}html.dark-theme .mat-expansion-panel{box-shadow:none!important;border:1px solid #444746;border-radius:4px!important}html.dark-theme .mat-expansion-panel:not(:last-child){margin-bottom:8px}html.dark-theme .mat-expansion-panel-header{border-bottom:none!important}.wide-agent-dropdown-panel{padding:0!important}.wide-agent-dropdown-panel .search-option{position:sticky!important;top:0!important;z-index:1000!important;opacity:1!important;padding-top:8px;padding-bottom:8px}.wide-agent-dropdown-panel span{width:100%}html.dark-theme .wide-agent-dropdown-panel .search-option{background-color:#2b2b2f!important}html.dark-theme .wide-agent-dropdown-panel .search-option input{caret-color:#fff!important}html.light-theme .wide-agent-dropdown-panel .search-option{background-color:#fff!important}.function-args-tooltip .mdc-tooltip__surface{background-color:#333!important;color:#fff!important;border:2px solid #666!important;border-radius:2px!important;padding:8px 12px!important;font-family:Courier New,monospace!important;font-size:12px!important;white-space:pre-wrap!important;max-width:800px!important;line-height:1.2!important;box-shadow:0 2px 8px #0000004d!important}html.dark-theme{--chat-panel-event-number-label-color: rgba(255, 255, 255, .8)}html.light-theme{--chat-panel-event-number-label-color: #5f6368}.json-key{color:#9876aa;font-weight:600}.json-string{color:#6a8759}.json-number{color:#6897bb}.json-boolean{color:#cc7832}.json-null{color:gray}.json-tooltip-panel{background-color:#333!important;color:#fff!important;border:2px solid #666!important;border-radius:4px!important;padding:8px 12px!important;box-shadow:0 2px 8px #0000004d!important;max-width:800px!important} ================================================ FILE: cmd/launcher/web/webui/webui.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package webui provides a sublauncher that adds ADK Web UI capabilities. package webui import ( "embed" "flag" "fmt" "io/fs" "log" "net/http" "github.com/gorilla/mux" "google.golang.org/adk/cmd/launcher" weblauncher "google.golang.org/adk/cmd/launcher/web" "google.golang.org/adk/internal/cli/util" "google.golang.org/adk/server/adkrest/controllers" ) // webUIConfig contains parameters for launching ADK Web UI type webUIConfig struct { backendAddress string pathPrefix string } // webUILauncher can launch ADK Web UI type webUILauncher struct { flags *flag.FlagSet config *webUIConfig } // CommandLineSyntax implements web.Sublauncher. Returns the command-line syntax for the WebUI launcher. func (w *webUILauncher) CommandLineSyntax() string { return util.FormatFlagUsage(w.flags) } // Keyword implements web.Sublauncher. Returns the command-line keyword for WebUI launcher. func (w *webUILauncher) Keyword() string { return "webui" } // Parse implements web.Sublauncher. After parsing webui-specific arguments returns remaining unparsed arguments func (w *webUILauncher) Parse(args []string) ([]string, error) { err := w.flags.Parse(args) if err != nil || !w.flags.Parsed() { return nil, fmt.Errorf("failed to parse webui flags: %v", err) } restArgs := w.flags.Args() return restArgs, nil } // SetupSubrouters implements the web.Sublauncher interface. It adds the // WebUI subrouter to the main router. func (w *webUILauncher) SetupSubrouters(router *mux.Router, config *launcher.Config) error { w.AddSubrouter(router, w.config.pathPrefix, w.config.backendAddress) return nil } // SimpleDescription returns a simple description of the WebUI launcher. func (w *webUILauncher) SimpleDescription() string { return "starts ADK Web UI server which provides UI for interacting with ADK REST API" } // UserMessage implements the web.Sublauncher interface. It prints a message // to the user with the URL to access the WebUI. func (w *webUILauncher) UserMessage(webURL string, printer func(v ...any)) { printer(fmt.Sprintf(" webui: you can access API using %s%s", webURL, w.config.pathPrefix)) } // embed web UI files into the executable //go:embed distr/* var content embed.FS // AddSubrouter adds a subrouter to serve the ADK Web UI. func (w *webUILauncher) AddSubrouter(router *mux.Router, pathPrefix, backendAddress string) { // Setup serving of ADK Web UI rUI := router.Methods("GET").PathPrefix(pathPrefix).Subrouter() // generate /assets/config/runtime-config.json in the runtime. // It removes the need to prepare this file during deployment and update the distribution files. runtimeConfigResponse := struct { BackendUrl string `json:"backendUrl"` }{BackendUrl: backendAddress} rUI.Methods("GET").Path("/assets/config/runtime-config.json").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { controllers.EncodeJSONResponse(runtimeConfigResponse, http.StatusOK, w) }) // redirect the user from / to pathPrefix (/ui/) router.Methods("GET").Path("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, pathPrefix, http.StatusFound) }) // serve web ui from the embedded resources ui, err := fs.Sub(content, "distr") if err != nil { log.Fatalf("cannot prepare ADK Web UI files as embedded content: %v", err) } rUI.Methods("GET").Handler(http.StripPrefix(pathPrefix, http.FileServer(http.FS(ui)))) } // NewLauncher creates a new Sublauncher for the ADK Web UI. func NewLauncher() weblauncher.Sublauncher { config := &webUIConfig{} fs := flag.NewFlagSet("webui", flag.ContinueOnError) fs.StringVar(&config.backendAddress, "api_server_address", "http://localhost:8080/api", "ADK REST API server address as seen from the user browser. Please specify the whole URL, i.e. 'http://localhost:8080/api'.") config.pathPrefix = "/ui/" return &webUILauncher{ config: config, flags: fs, } } ================================================ FILE: examples/README.md ================================================ # ADK GO samples This folder hosts examples to test different features. The examples are usually minimal and simplistic to test one or a few scenarios. **Note**: This is different from the [google/adk-samples](https://github.com/google/adk-samples) repo, which hosts more complex e2e samples for customers to use or modify directly. # Launcher In many examples you can see such lines: ```go l := full.NewLauncher() err = l.ParseAndRun(ctx, config, os.Args[1:], universal.ErrorOnUnparsedArgs) if err != nil { log.Fatalf("run failed: %v\n\n%s", err, l.FormatSyntax()) } ``` it allows to decide, which launching options are supported in the run-time. `full.NewLauncher()` includes all major ways you can run the example: * console * restapi * a2a * webui (it can run standalone or with restapi or a2a). Run `go run ./example/quickstart/main.go help` for details As an alternative, you may want to use `prod.NewLauncher()` which only builds-in restapi and a2a launchers. ================================================ FILE: examples/a2a/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package main provides an example ADK agent that uses A2A. package main import ( "context" "log" "net" "net/http" "net/url" "os" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/remoteagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/server/adka2a" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) // newWeatherAgent creates a simple LLM-agent as in the quickstart example. func newWeatherAgent(ctx context.Context) agent.Agent { model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create a model: %v", err) } agent, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Tools: []tool.Tool{geminitool.GoogleSearch{}}, }) if err != nil { log.Fatalf("Failed to create an agent: %v", err) } return agent } // startWeatherAgentServer starts an HTTP server which exposes a weather agent using A2A (Agent-To-Agent) protocol. func startWeatherAgentServer() string { listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { log.Fatalf("Failed to bind to a port: %v", err) } baseURL := &url.URL{Scheme: "http", Host: listener.Addr().String()} log.Printf("Starting A2A server on %s", baseURL.String()) go func() { ctx := context.Background() agent := newWeatherAgent(ctx) agentPath := "/invoke" agentCard := &a2a.AgentCard{ Name: agent.Name(), Skills: adka2a.BuildAgentSkills(agent), PreferredTransport: a2a.TransportProtocolJSONRPC, URL: baseURL.JoinPath(agentPath).String(), Capabilities: a2a.AgentCapabilities{Streaming: true}, } mux := http.NewServeMux() mux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(agentCard)) executor := adka2a.NewExecutor(adka2a.ExecutorConfig{ RunnerConfig: runner.Config{ AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService(), }, }) requestHandler := a2asrv.NewHandler(executor) mux.Handle(agentPath, a2asrv.NewJSONRPCHandler(requestHandler)) err := http.Serve(listener, mux) log.Printf("A2A server stopped: %v", err) }() return baseURL.String() } func main() { ctx := context.Background() a2aServerAddress := startWeatherAgentServer() remoteAgent, err := remoteagent.NewA2A(remoteagent.A2AConfig{ Name: "A2A Weather agent", AgentCardSource: a2aServerAddress, }) if err != nil { log.Fatalf("Failed to create a remote agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(remoteAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/mcp/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides an example ADK agent that uses MCP tools. package main import ( "context" "fmt" "log" "os" "os/signal" "strings" "github.com/modelcontextprotocol/go-sdk/mcp" "golang.org/x/oauth2" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/tool" "google.golang.org/adk/tool/mcptoolset" ) // This example demonstrates 2 ways to use MCP tools with ADK: // To select between two, set AGENT_MODE="local" or "github" ("local" is default). // // 1. in-memory MCP server: // - define golang function (in this case -- GetWeather) // - register it as MCP tool in the in-memory MCP server, using mcp.NewServer and mcp.Tool // // 2. GitHub's remote MCP server (https://github.com/github/github-mcp-server): // - create http.Client with authenticated transport. In this case it's oauth2 transport with GitHub personal access token. // - use `export GITHUB_PAT=...` to set GitHub personal access token. type Input struct { City string `json:"city" jsonschema:"city name"` } type Output struct { WeatherSummary string `json:"weather_summary" jsonschema:"weather summary in the given city"` } func GetWeather(ctx context.Context, req *mcp.CallToolRequest, input Input) (*mcp.CallToolResult, Output, error) { return nil, Output{ WeatherSummary: fmt.Sprintf("Today in %q is sunny\n", input.City), }, nil } func localMCPTransport(ctx context.Context) mcp.Transport { clientTransport, serverTransport := mcp.NewInMemoryTransports() // Run in-memory MCP server. server := mcp.NewServer(&mcp.Implementation{Name: "weather_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "get_weather", Description: "returns weather in the given city"}, GetWeather) _, err := server.Connect(ctx, serverTransport, nil) if err != nil { log.Fatal(err) } return clientTransport } func githubMCPTransport(ctx context.Context) mcp.Transport { ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: os.Getenv("GITHUB_PAT")}, ) return &mcp.StreamableClientTransport{ Endpoint: "https://api.githubcopilot.com/mcp/", HTTPClient: oauth2.NewClient(ctx, ts), } } func main() { // Create context that cancels on interrupt signal (Ctrl+C) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } var transport mcp.Transport if strings.ToLower(os.Getenv("AGENT_MODE")) == "github" { transport = githubMCPTransport(ctx) } else { transport = localMCPTransport(ctx) } mcpToolSet, err := mcptoolset.New(mcptoolset.Config{ Transport: transport, }) if err != nil { log.Fatalf("Failed to create MCP tool set: %v", err) } // Create LLMAgent with MCP tool set a, err := llmagent.New(llmagent.Config{ Name: "helper_agent", Model: model, Description: "Helper agent.", Instruction: "You are a helpful assistant that helps users with various tasks.", Toolsets: []tool.Toolset{ mcpToolSet, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(a), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/quickstart/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides a quickstart ADK agent. package main import ( "context" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "Your SOLE purpose is to answer questions about the current time and weather in a specific city. You MUST refuse to answer any questions unrelated to time or weather.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(a), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/rest/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides an example ADK REST API server with an ADK agent. package main import ( "context" "log" "net/http" "os" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/model/gemini" "google.golang.org/adk/server/adkrest" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) func main() { ctx := context.Background() // Create a Gemini model model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } // Create an agent a, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } // Configure the ADK REST API Server restServer, err := adkrest.NewServer(adkrest.ServerConfig{ AgentLoader: agent.NewSingleLoader(a), SessionService: session.InMemoryService(), SSEWriteTimeout: 120 * time.Second, }) if err != nil { log.Fatalf("Failed to create REST API server: %v", err) } // Create a standard net/http ServeMux mux := http.NewServeMux() // Register the API handler at the /api/ path // You can use any HTTP server or router here - not tied to gorilla/mux mux.Handle("/api/", http.StripPrefix("/api", restServer)) // Add a simple health check endpoint mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) if _, err := w.Write([]byte("OK")); err != nil { log.Printf("Failed to write response: %v", err) } }) // Start the server log.Println("Starting server on :8080") log.Println("API available at http://localhost:8080/api/") log.Println("Health check at http://localhost:8080/health") if err := http.ListenAndServe(":8080", mux); err != nil { log.Fatalf("Server failed: %v", err) } } ================================================ FILE: examples/telemetry/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides a quickstart ADK agent with telemetry. package main import ( "context" "fmt" "log" "os" "go.opentelemetry.io/otel/sdk/resource" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/telemetry" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) func main() { if err := run(); err != nil { log.Fatal(err) } } func run() error { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { return fmt.Errorf("failed to create model: %w", err) } cfg := llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "Your SOLE purpose is to answer questions about the current time and weather in a specific city. You MUST refuse to answer any questions unrelated to time or weather.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, } a, err := llmagent.New(cfg) if err != nil { return fmt.Errorf("failed to create agent: %w", err) } r, err := resource.New(ctx, resource.WithAttributes( semconv.ServiceNameKey.String("weather-time-agent"), semconv.ServiceVersionKey.String("1.0.0"), )) if err != nil { return fmt.Errorf("failed to create resource: %w", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(a), TelemetryOptions: []telemetry.Option{ telemetry.WithResource(r), // Other telemetry options can be added here. }, } // Launcher automatically starts the telemetry. l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { return fmt.Errorf("run failed: %v\n\n%s", err, l.CommandLineSyntax()) } return nil } ================================================ FILE: examples/toolconfirmation/main.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides an example console app for tool confirmation. // The example shows requestVacationDays func which requires user confirmation. It uses ctx.ToolConfirmation() and ctx.RequestConfirmation() to define the confimation process. // This is the example for most advanced scenario which gives the full control how to define confirmation flow. // For simpler setup use `RequireConfirmation` or `RequireConfirmationProvider` in [functiontool.Config]. package main import ( "bufio" "context" "encoding/json" "fmt" "log" "os" "strconv" "strings" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/toolconfirmation" "google.golang.org/genai" ) // RequestVacationArgs defines the arguments for our long-running tool. type RequestVacationArgs struct { Days int `json:"days"` UserID string `json:"user_id"` } type ConfirmationPayload struct { DaysApproved int `json:"days_approved"` } // RequestVacationResults defines the *initial* output of our long-running tool. type RequestVacationResults struct { Status string `json:"status"` DaysApproved int `json:"days_approved"` RequestID string `json:"request_id"` } type VacationRequest struct { ID string UserID string Days int Status string // PENDING, APPROVED, REJECTED CallID string DaysApproved int Confirmation *toolconfirmation.ToolConfirmation } var ( // Stores the requests with a reqID key requestsByReqID = make(map[string]*VacationRequest) // Stores the requests with a callID key requestsByCallID = make(map[string]*VacationRequest) requestCounter = 0 ) func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{}) if err != nil { log.Fatalf("Failed to create model: %v", err) } vacationAgent, err := createRequestVacationDaysAgent(model) if err != nil { log.Fatalf("Failed to create vacation agent: %v", err) } sessionService := session.InMemoryService() session, err := sessionService.Create(ctx, &session.CreateRequest{AppName: appName, UserID: userID}) if err != nil { log.Fatalf("Failed to create session: %v", err) } reader := bufio.NewReader(os.Stdin) for { fmt.Println("\n--- Menu ---") fmt.Println("1: Chat with LLM") fmt.Println("2: Manage Vacation Requests") fmt.Println("3: Exit") fmt.Print("Choose an option: ") input, err := reader.ReadString('\n') if err != nil { fmt.Printf("Error reading input: %v\n", err) return } input = strings.TrimSpace(input) switch input { case "1": runChatSession(ctx, vacationAgent, sessionService, reader, session.Session.ID()) case "2": runVacationSession(ctx, vacationAgent, sessionService, reader, session.Session.ID()) case "3": fmt.Println("Exiting.") return default: fmt.Println("Invalid option. Please try again.") } } } // requestVacationDays simulates the *initiation* of a long-running ticket creation task. func requestVacationDays(ctx tool.Context, args RequestVacationArgs) (*RequestVacationResults, error) { log.Printf("TOOL_EXEC: 'requestVacationDays' called with days: %d for user %s (Call ID: %s)\n", args.Days, args.UserID, ctx.FunctionCallID()) if args.Days <= 0 { return nil, fmt.Errorf("invalid days to request %d", args.Days) } confirmation := ctx.ToolConfirmation() if confirmation == nil { requestID := fmt.Sprintf("req-%d", requestCounter) requestCounter++ req := &VacationRequest{ ID: requestID, UserID: args.UserID, Days: args.Days, Status: "PENDING", } // Store the pending request requestsByReqID[requestID] = req requestsByCallID[ctx.FunctionCallID()] = req err := ctx.RequestConfirmation( "Please approve or reject the tool call request_time_off() by responding with a FunctionResponse with an expected ToolConfirmation payload.", ConfirmationPayload{ DaysApproved: 0, }) if err != nil { return nil, err } return &RequestVacationResults{ Status: "Manager approval is required.", RequestID: requestID, }, nil } // This part normally wouldn't be reached in the first call req, ok := requestsByCallID[ctx.FunctionCallID()] if !ok { return nil, fmt.Errorf("unable to get request using payload %s and function call id %s", confirmation.Payload, ctx.FunctionCallID()) } req.Confirmation = confirmation if confirmation.Confirmed { jsonBytes, err := json.Marshal(confirmation.Payload) if err != nil { return nil, fmt.Errorf("error marshalling payload %s: %w", confirmation.Payload, err) } var payload ConfirmationPayload if err := json.Unmarshal(jsonBytes, &payload); err != nil { return nil, fmt.Errorf("error unmarshalling payload %s: %w", confirmation.Payload, err) } approvedDays := min(payload.DaysApproved, args.Days) req.Status = "APPROVED" req.DaysApproved = payload.DaysApproved requestsByReqID[req.ID] = req // Update status return &RequestVacationResults{ Status: "The time off request is accepted.", DaysApproved: approvedDays, RequestID: req.ID, }, nil } else { req.Status = "REJECTED" requestsByReqID[req.ID] = req // Update status req.DaysApproved = 0 return &RequestVacationResults{ Status: "The time off request is rejected.", DaysApproved: 0, RequestID: req.ID, }, nil } } func createRequestVacationDaysAgent(model model.LLM) (agent.Agent, error) { vacationTool, err := functiontool.New( functiontool.Config{ Name: "request_vacation_days", Description: "Request vacation days for a user. Returns a request ID for tracking.", }, requestVacationDays, ) if err != nil { return nil, fmt.Errorf("failed to create vacation tool: %w", err) } return llmagent.New(llmagent.Config{ Name: "vacation_agent", Model: model, Instruction: "You are a helpful assistant for requesting vacation days. When a user asks for time off, call the request_vacation_days tool, making sure to include the user's ID.", Tools: []tool.Tool{vacationTool}, }) } const ( userID = "user" // Default user for interactions appName = "console_app" ) // runTurn executes a single turn with the agent. func runTurn(ctx context.Context, r *runner.Runner, sessionID string, content *genai.Content) { fmt.Printf("\n--- Sending to Agent ---\n") for event, err := range r.Run(ctx, userID, sessionID, content, agent.RunConfig{ StreamingMode: agent.StreamingModeNone, }) { if err != nil { fmt.Printf("\nAGENT_ERROR: %v\n", err) continue } printEventSummary(event) if event.Content != nil { for _, part := range event.Content.Parts { fc := part.FunctionCall if fc != nil && fc.Name == toolconfirmation.FunctionCallName { originalFunctionCall, err := toolconfirmation.OriginalCallFrom(fc) if err != nil { continue } req, ok := requestsByCallID[originalFunctionCall.ID] if !ok { continue } fmt.Printf("Updating %s call id %s to %s\n", req.ID, req.CallID, fc.ID) req.CallID = fc.ID } } } } } func runChatSession(ctx context.Context, chatAgent agent.Agent, sessionService session.Service, reader *bufio.Reader, sessionID string) { fmt.Println("\n--- LLM Chat Mode ---") fmt.Println("Type 'back' to return to the main menu.") r, err := runner.New(runner.Config{AppName: appName, Agent: chatAgent, SessionService: sessionService}) if err != nil { log.Fatalf("Failed to create runner: %v", err) } for { fmt.Print("You: ") userInput, _ := reader.ReadString('\n') userInput = strings.TrimSpace(userInput) if strings.ToLower(userInput) == "back" { break } if userInput != "" { userMessage := genai.NewContentFromText(userInput, genai.RoleUser) runTurn(ctx, r, sessionID, userMessage) } } fmt.Println("Exiting LLM Chat Mode.") } func runVacationSession(ctx context.Context, vacationAgent agent.Agent, sessionService session.Service, reader *bufio.Reader, sessionID string) { fmt.Println("\n--- Vacation Request Mode ---") fmt.Println("Type 'back' to return to the main menu.") fmt.Println("Commands: 'approve ', 'reject '") displayVacationRequests() r, err := runner.New(runner.Config{AppName: appName, Agent: vacationAgent, SessionService: sessionService}) if err != nil { log.Fatalf("Failed to create runner: %v", err) } for { fmt.Print("Vacation Command: ") userInput, _ := reader.ReadString('\n') userInput = strings.TrimSpace(userInput) inputLower := strings.ToLower(userInput) if inputLower == "back" { break } if after, ok := strings.CutPrefix(inputLower, "approve "); ok { requestID := strings.TrimSpace(after) processApproval(ctx, r, sessionID, requestID, true, reader) } else if after, ok := strings.CutPrefix(inputLower, "reject "); ok { requestID := strings.TrimSpace(after) processApproval(ctx, r, sessionID, requestID, false, reader) } else if userInput != "" { // Allow free text to interact with the vacation agent userMessage := genai.NewContentFromText(userInput, genai.RoleUser) runTurn(ctx, r, sessionID, userMessage) } } fmt.Println("Exiting Vacation Request Mode.") } func displayVacationRequests() { fmt.Println("\n--- Pending Vacation Requests ---") if len(requestsByReqID) == 0 { fmt.Println("No pending requests.") return } for _, req := range requestsByReqID { fmt.Printf("ID: %s, Call ID: %s, User: %s, Days: %d, Status: %s, Days Approved: %d\n", req.ID, req.CallID, req.UserID, req.Days, req.Status, req.DaysApproved) } fmt.Println("-------------------------------") } func processApproval(ctx context.Context, r *runner.Runner, sessionID, requestID string, approved bool, reader *bufio.Reader) { req, exists := requestsByReqID[requestID] if !exists || req.Status != "PENDING" { fmt.Printf("Request ID %s not found or not pending.\n", requestID) return } daysApproved := 0 if approved { fmt.Printf("How many days to approve for %s (requested %d)? ", requestID, req.Days) daysInput, _ := reader.ReadString('\n') days, err := strconv.Atoi(strings.TrimSpace(daysInput)) if err != nil || days < 0 || days > req.Days { fmt.Println("Invalid number of days. Approval cancelled.") return } daysApproved = days fmt.Printf("Approving %d days for request %s.\n", daysApproved, requestID) } else { fmt.Printf("Rejecting request %s.\n", requestID) } payload := ConfirmationPayload{DaysApproved: daysApproved} funcResponse := &genai.FunctionResponse{ Name: toolconfirmation.FunctionCallName, ID: req.CallID, Response: map[string]any{ "confirmed": approved, "payload": payload, }, } appResponse := &genai.Content{ Role: string(genai.RoleUser), // Response comes from the app/user Parts: []*genai.Part{{FunctionResponse: funcResponse}}, } runTurn(ctx, r, sessionID, appResponse) fmt.Println("Processing complete.") displayVacationRequests() } // printEventSummary provides a readable log of agent and LLM interactions. func printEventSummary(event *session.Event) { if event.LLMResponse.Content != nil { for _, part := range event.LLMResponse.Content.Parts { author := event.Author if author == "" { author = "AGENT" } // Check for a text part. if part.Text != "" { fmt.Printf("[%s_TEXT]: %s\n", author, part.Text) } // Check for a function call part. if fc := part.FunctionCall; fc != nil { fmt.Printf("[%s_CALL]: %s(%v) Call ID: %s\n", author, fc.Name, fc.Args, fc.ID) } // Check for a function response part. if fr := part.FunctionResponse; fr != nil { fmt.Printf("[%s_RESPONSE]: %s(%v) Call ID: %s\n", author, fr.Name, fr.Response, fr.ID) } } } } ================================================ FILE: examples/tools/loadartifacts/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package provides an example ADK agent that loads and describes artifacts. package main import ( "bufio" "context" "fmt" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/artifact" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/loadartifactstool" ) // Note: you need to run the program from the loadartifacts directory // to fetch the image successfully. func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } llmagent, err := llmagent.New(llmagent.Config{ Name: "artifact_describer", Model: model, Description: "Agent to answer questions about artifacts.", Instruction: "When user asks about the artifact, load them and describe them.", Tools: []tool.Tool{ loadartifactstool.New(), }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } userID, appName := "test_user", "test_app" sessionService := session.InMemoryService() // Create session. resp, err := sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, }) if err != nil { log.Fatalf("Failed to create the session service: %v", err) } session := resp.Session artifactService := artifact.InMemoryService() // Populate artifacts that can be described later. imageBytes, err := os.ReadFile("animal_picture.png") if err != nil { log.Fatalf("Failed to read image file: %v", err) } genai.NewPartFromBytes(imageBytes, "image/png") _, err = artifactService.Save(ctx, &artifact.SaveRequest{ AppName: appName, UserID: userID, SessionID: session.ID(), FileName: "animal_picture.png", Part: genai.NewPartFromBytes(imageBytes, "image/png"), }) if err != nil { log.Fatalf("Failed to save artifact: %v", err) } _, err = artifactService.Save(ctx, &artifact.SaveRequest{ AppName: appName, UserID: userID, SessionID: session.ID(), FileName: "haiku.txt", Part: genai.NewPartFromText( "An old silent pond..." + "A frog jumps into the pond," + "splash! Silence again."), }) if err != nil { log.Fatalf("Failed to save artifact: %v", err) } r, err := runner.New(runner.Config{ AppName: appName, Agent: llmagent, SessionService: sessionService, ArtifactService: artifactService, }) if err != nil { log.Fatalf("Failed to create runner: %v", err) } reader := bufio.NewReader(os.Stdin) for { fmt.Print("\nUser -> ") userInput, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } userMsg := genai.NewContentFromText(userInput, genai.RoleUser) fmt.Print("\nAgent -> ") streamingMode := agent.StreamingModeSSE for event, err := range r.Run(ctx, userID, session.ID(), userMsg, agent.RunConfig{ StreamingMode: streamingMode, }) { if err != nil { fmt.Printf("\nAGENT_ERROR: %v\n", err) } else { if event.LLMResponse.Content == nil { continue } for _, p := range event.LLMResponse.Content.Parts { // if its running in streaming mode, don't print the non partial llmResponses if streamingMode != agent.StreamingModeSSE || event.LLMResponse.Partial { fmt.Print(p.Text) } } } } } } ================================================ FILE: examples/tools/loadmemory/main.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package main provides an example ADK agent that uses the load_memory and // preload_memory tools to retrieve memories from previous conversations. package main import ( "bufio" "context" "fmt" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/loadmemorytool" "google.golang.org/adk/tool/preloadmemorytool" ) func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } llmAgent, err := llmagent.New(llmagent.Config{ Name: "memory_assistant", Model: model, Description: "Agent that can recall information from memory.", Instruction: "You are a helpful assistant with access to memory. " + "Relevant memory may be preloaded automatically for each request. " + "If the preloaded context is not enough, use the load_memory tool " + "to search for additional relevant information. " + "If you find relevant memories, use them to provide informed responses.", Tools: []tool.Tool{ preloadmemorytool.New(), loadmemorytool.New(), }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } userID, appName := "test_user", "memory_app" sessionService := session.InMemoryService() memoryService := memory.InMemoryService() // Create a previous session with some conversation history to populate memory. previousSession, err := createPreviousSessionWithHistory(ctx, sessionService, appName, userID) if err != nil { log.Fatalf("Failed to create previous session: %v", err) } // Add the previous session to memory so it can be searched. if err := memoryService.AddSessionToMemory(ctx, previousSession); err != nil { log.Fatalf("Failed to add session to memory: %v", err) } fmt.Println("Memory populated with previous conversation about a trip to Tokyo.") fmt.Println("Memories will be preloaded automatically for each request.") fmt.Println("Try asking: 'What do you remember about my trip?'") // Create a new session for the current conversation. resp, err := sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, }) if err != nil { log.Fatalf("Failed to create session: %v", err) } currentSession := resp.Session r, err := runner.New(runner.Config{ AppName: appName, Agent: llmAgent, SessionService: sessionService, MemoryService: memoryService, }) if err != nil { log.Fatalf("Failed to create runner: %v", err) } reader := bufio.NewReader(os.Stdin) for { fmt.Print("\nUser -> ") userInput, err := reader.ReadString('\n') if err != nil { log.Fatal(err) } userMsg := genai.NewContentFromText(userInput, genai.RoleUser) fmt.Print("\nAgent -> ") streamingMode := agent.StreamingModeSSE for event, err := range r.Run(ctx, userID, currentSession.ID(), userMsg, agent.RunConfig{ StreamingMode: streamingMode, }) { if err != nil { fmt.Printf("\nAGENT_ERROR: %v\n", err) } else { if event.LLMResponse.Content == nil { continue } for _, p := range event.LLMResponse.Content.Parts { // If running in streaming mode, only print partial responses. if streamingMode != agent.StreamingModeSSE || event.LLMResponse.Partial { fmt.Print(p.Text) } } } } } } // createPreviousSessionWithHistory creates a session with pre-populated // conversation history that will be added to memory. func createPreviousSessionWithHistory( ctx context.Context, sessionService session.Service, appName, userID string, ) (session.Session, error) { resp, err := sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, }) if err != nil { return nil, fmt.Errorf("failed to create session: %w", err) } s := resp.Session // Add some conversation history about a trip to Tokyo. events := []struct { author string content string }{ {"user", "I just got back from an amazing trip to Tokyo!"}, {"model", "That sounds wonderful! Tokyo is such a vibrant city. What were the highlights of your trip?"}, {"user", "I visited the Senso-ji temple in Asakusa, it was beautiful. I also tried authentic ramen at a small shop in Shinjuku."}, {"model", "Senso-ji is one of Tokyo's oldest and most significant temples. The ramen in Shinjuku is legendary! Did you try any other Japanese cuisine?"}, {"user", "Yes! I had sushi at Tsukiji outer market and tried takoyaki in Shibuya. The food was incredible."}, {"model", "You really experienced the best of Tokyo's food scene! Tsukiji is famous for its fresh seafood. Did you get to see any other sights?"}, {"user", "I went to the top of Tokyo Skytree and saw Mount Fuji in the distance. The view was breathtaking."}, {"model", "Seeing Mount Fuji from Tokyo Skytree is a special experience, especially on a clear day. It sounds like you had an unforgettable trip!"}, } for _, e := range events { event := session.NewEvent("previous-session") event.Author = e.author event.LLMResponse = model.LLMResponse{ Content: genai.NewContentFromText(e.content, genai.Role(e.author)), } if err := sessionService.AppendEvent(ctx, s, event); err != nil { return nil, fmt.Errorf("failed to append event: %w", err) } } return s, nil } ================================================ FILE: examples/tools/multipletools/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package demonstrates a workaround for using Google Search tool with other tools. package main import ( "context" "log" "os" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/telemetry" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/geminitool" ) // Package main demonstrates a workaround for using multiple tool types (e.g., // Google Search and custom functions) in a single agent. This is necessary // due to limitations in the genai API. The approach is to wrap agents with // different tool types into sub-agents, which are then managed by a root agent. func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { log.Fatalf("Failed to create model: %v", err) } searchAgent, err := llmagent.New(llmagent.Config{ Name: "search_agent", Model: model, Description: "Does google search.", Instruction: "You're a specialist in Google Search.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } type Input struct { LineCount int `json:"lineCount"` } type Output struct { Poem string `json:"poem"` } handler := func(ctx tool.Context, input Input) (Output, error) { return Output{ Poem: strings.Repeat("A line of a poem,", input.LineCount) + "\n", }, nil } poemTool, err := functiontool.New(functiontool.Config{ Name: "poem", Description: "Returns poem", }, handler) if err != nil { log.Fatalf("Failed to create tool: %v", err) } poemAgent, err := llmagent.New(llmagent.Config{ Name: "poem_agent", Model: model, Description: "returns poem", Instruction: "You return poems.", Tools: []tool.Tool{ poemTool, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "root_agent", Model: model, Description: "You can do a google search and generate poems.", Instruction: "Answer questions about weather based on google search unless asked for a poem," + " for a poem generate it with a tool.", Tools: []tool.Tool{ agenttool.New(searchAgent, nil), agenttool.New(poemAgent, nil), }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(a), TelemetryOptions: []telemetry.Option{ telemetry.WithGenAICaptureMessageContent(true), }, } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/vertexai/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session/vertexai" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) const ( modelName = "gemini-2.5-flash" ) func main() { ctx := context.Background() projectID := os.Getenv("GOOGLE_CLOUD_PROJECT") if projectID == "" { log.Fatalf("Env var GOOGLE_CLOUD_PROJECT is not set") } location := os.Getenv("GOOGLE_CLOUD_LOCATION") if location == "" { log.Fatalf("Env var GOOGLE_CLOUD_LOCATION is not set") } engineID := os.Getenv("VERTEX_ENGINE_ID") if engineID == "" { log.Fatalf("Env var VERTEX_ENGINE_ID is not set") } rootAgent, err := createAgent() if err != nil { log.Fatalf("Failed to create agent: %v", err) } srvs, err := vertexai.NewSessionService(ctx, vertexai.VertexAIServiceConfig{ Location: location, ProjectID: projectID, ReasoningEngine: engineID, }) if err != nil { log.Fatalf("Failed to create session service: %v", err) } config := &launcher.Config{ SessionService: srvs, AgentLoader: agent.NewSingleLoader(rootAgent), } l := full.NewLauncher() err = l.Execute(ctx, config, os.Args[1:]) if err != nil { log.Fatalf("run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } func createAgent() (agent.Agent, error) { ctx := context.Background() model, err := gemini.NewModel(ctx, modelName, &genai.ClientConfig{}) if err != nil { return nil, err } agent, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, }) if err != nil { return nil, err } return agent, nil } ================================================ FILE: examples/vertexai/imagegenerator/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package main demonstrates how to create an agent that can generate images // using Vertex AI's Imagen model, save them as artifacts, and then save them // to the local filesystem. package main import ( "context" "log" "os" "path/filepath" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/artifact" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/loadartifactstool" ) func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.0-flash-001", nil) if err != nil { log.Fatalf("Failed to create model: %v", err) } generateImageTool, err := functiontool.New( functiontool.Config{ Name: "generate_image", Description: "Generates image and saves in artifact service.", }, generateImage) if err != nil { log.Fatalf("Failed to create generate image tool: %v", err) } saveImageTool, err := functiontool.New( functiontool.Config{ Name: "save_image_locally", Description: "Saves images locally based on the filename.", }, saveImage) if err != nil { log.Fatalf("Failed to create generate image tool: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "image_generator", Model: model, Description: "Agent to generate pictures, answers questions about it and saves it locally if asked.", Instruction: "You are an agent whose job is to generate an image, describe it and save it locally if asked." + " Also user will provide the filename and you should save it in the artifacts with that filename." + " When user ask to save image locally you can call save_image_locally to do it.", Tools: []tool.Tool{ loadartifactstool.New(), generateImageTool, saveImageTool, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ ArtifactService: artifact.InMemoryService(), AgentLoader: agent.NewSingleLoader(a), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } // This is a function tool to generate images using Vertex AI's Imagen model. func generateImage(ctx tool.Context, input generateImageInput) (generateImageResult, error) { client, err := genai.NewClient(ctx, &genai.ClientConfig{ Project: os.Getenv("GOOGLE_CLOUD_PROJECT"), Location: os.Getenv("GOOGLE_CLOUD_LOCATION"), Backend: genai.BackendVertexAI, }) if err != nil { return generateImageResult{}, err } response, err := client.Models.GenerateImages( ctx, "imagen-3.0-generate-002", input.Prompt, &genai.GenerateImagesConfig{NumberOfImages: 1}) if err != nil { return generateImageResult{}, err } _, err = ctx.Artifacts().Save(ctx, input.Filename, genai.NewPartFromBytes(response.GeneratedImages[0].Image.ImageBytes, "image/png")) if err != nil { return generateImageResult{}, err } return generateImageResult{Filename: input.Filename, Status: "success"}, nil } type generateImageInput struct { Prompt string `json:"prompt"` Filename string `json:"filename"` } type generateImageResult struct { Filename string `json:"filename"` Status string `json:"Status"` } // This is function tool that loads image from the artifacts service and // saves is to the local filesystem. func saveImage(ctx tool.Context, input saveImageInput) (saveImageResult, error) { filename := input.Filename resp, err := ctx.Artifacts().Load(ctx, filename) if err != nil { log.Printf("Failed to load artifact '%s': %v", filename, err) return saveImageResult{}, err } if resp.Part.InlineData == nil || len(resp.Part.InlineData.Data) == 0 { log.Printf("Artifact '%s' has no inline data", filename) return saveImageResult{}, err } // Ensure the filename has a .png extension for the local file. localFilename := filename if filepath.Ext(localFilename) != ".png" { localFilename += ".png" } // Create an "output" directory in the current working directory if it doesn't exist. outputDir := "output" if err := os.MkdirAll(outputDir, 0o755); err != nil { log.Printf("Failed to create output directory '%s': %v", outputDir, err) return saveImageResult{}, err } localPath := filepath.Join(outputDir, localFilename) err = os.WriteFile(localPath, resp.Part.InlineData.Data, 0o644) if err != nil { log.Printf("Failed to write image to local file '%s': %v", localPath, err) return saveImageResult{}, err } log.Printf("Successfully saved image to %s", localPath) return saveImageResult{Status: "success"}, nil } type saveImageInput struct { Filename string `json:"filename"` } type saveImageResult struct { Status string `json:"Status"` } ================================================ FILE: examples/vertexai/vertexengine/create_engine.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "fmt" "log" "os" aiplatform "cloud.google.com/go/aiplatform/apiv1" "cloud.google.com/go/aiplatform/apiv1/aiplatformpb" "google.golang.org/api/option" ) // main defines an example of how to initialize a vertex ai reasoning engine func main() { ctx := context.Background() projectID := os.Getenv("GOOGLE_CLOUD_PROJECT") if projectID == "" { log.Fatalf("Env var GOOGLE_CLOUD_PROJECT is not set") } location := os.Getenv("GOOGLE_CLOUD_LOCATION") if location == "" { log.Fatalf("Env var GOOGLE_CLOUD_LOCATION is not set") } err := createReasoningEngine(ctx, projectID, location, "adk-go", "A reasoning engine created by an adk go sample") if err != nil { log.Fatalf("Failed to create reasoning engine: %v", err) } } func createReasoningEngine(ctx context.Context, projectID, location, displayName, description string) error { // Construct the parent resource name parent := fmt.Sprintf("projects/%s/locations/%s", projectID, location) // Construct the regional endpoint endpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location) // Create the client client, err := aiplatform.NewReasoningEngineClient(ctx, option.WithEndpoint(endpoint)) if err != nil { return fmt.Errorf("failed to create ReasoningEngineClient: %w", err) } defer func() { if err := client.Close(); err != nil { log.Printf("Warning: failed to close client: %v", err) } }() // Define the ReasoningEngine object reasoningEngine := &aiplatformpb.ReasoningEngine{ DisplayName: displayName, Description: description, } // Create the request req := &aiplatformpb.CreateReasoningEngineRequest{ Parent: parent, ReasoningEngine: reasoningEngine, } // Call the CreateReasoningEngine method op, err := client.CreateReasoningEngine(ctx, req) if err != nil { return fmt.Errorf("failed to call CreateReasoningEngine: %w", err) } // Wait for the long-running operation to complete resp, err := op.Wait(ctx) if err != nil { return fmt.Errorf("failed to wait for operation: %w", err) } fmt.Printf("Successfully created ReasoningEngine: %s\n", resp.Name) return nil } ================================================ FILE: examples/web/agents/image_generator.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package agents contains sample agents to demonstate ADK Web Capabilities. package agents import ( "context" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/model" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/loadartifactstool" ) func generateImage(ctx tool.Context, input generateImageInput) (generateImageResult, error) { client, err := genai.NewClient(ctx, &genai.ClientConfig{ Project: os.Getenv("GOOGLE_CLOUD_PROJECT"), Location: os.Getenv("GOOGLE_CLOUD_LOCATION"), Backend: genai.BackendVertexAI, }) if err != nil { return generateImageResult{ Status: "fail", }, nil } response, err := client.Models.GenerateImages( ctx, "imagen-3.0-generate-002", input.Prompt, &genai.GenerateImagesConfig{NumberOfImages: 1}) if err != nil { return generateImageResult{ Status: "fail", }, nil } _, err = ctx.Artifacts().Save(ctx, input.Filename, genai.NewPartFromBytes(response.GeneratedImages[0].Image.ImageBytes, "image/png")) if err != nil { return generateImageResult{ Status: "fail", }, nil } return generateImageResult{ Status: "success", Filename: input.Filename, }, nil } type generateImageInput struct { Prompt string `json:"prompt"` Filename string `json:"filename"` } type generateImageResult struct { Filename string `json:"filename"` Status string `json:"Status"` } func GetImageGeneratorAgent(ctx context.Context, model model.LLM) agent.Agent { generateImageTool, err := functiontool.New( functiontool.Config{ Name: "generate_image", Description: "Generates image and saves in artifact service.", }, generateImage) if err != nil { log.Fatalf("Failed to create generate image tool: %v", err) } imageGeneratorAgent, err := llmagent.New(llmagent.Config{ Name: "image_generator", Model: model, Description: "Agent to generate pictures, answers questions about it and saves it locally if asked.", Instruction: "You are an agent whose job is to generate or edit an image based on the user's prompt.", Tools: []tool.Tool{ generateImageTool, loadartifactstool.New(), }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } return imageGeneratorAgent } ================================================ FILE: examples/web/agents/llmauditor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agents import ( "context" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/model" ) const EndMark = "---END-OF-EDIT---" const CriticPrompt = ` You are a professional investigative journalist, excelling at critical thinking and verifying information before printed to a highly-trustworthy publication. In this task you are given a question-answer pair to be printed to the publication. The publication editor tasked you to double-check the answer text. # Your task Your task involves three key steps: First, identifying all CLAIMS presented in the answer. Second, determining the reliability of each CLAIM. And lastly, provide an overall assessment. ## Step 1: Identify the CLAIMS Carefully read the provided answer text. Extract every distinct CLAIM made within the answer. A CLAIM can be a statement of fact about the world or a logical argument presented to support a point. ## Step 2: Verify each CLAIM For each CLAIM you identified in Step 1, perform the following: * Consider the Context: Take into account the original question and any other CLAIMS already identified within the answer. * Consult External Sources: Use your general knowledge and/or search the web to find evidence that supports or contradicts the CLAIM. Aim to consult reliable and authoritative sources. * Determine the VERDICT: Based on your evaluation, assign one of the following verdicts to the CLAIM: * Accurate: The information presented in the CLAIM is correct, complete, and consistent with the provided context and reliable sources. * Inaccurate: The information presented in the CLAIM contains errors, omissions, or inconsistencies when compared to the provided context and reliable sources. * Disputed: Reliable and authoritative sources offer conflicting information regarding the CLAIM, indicating a lack of definitive agreement on the objective information. * Unsupported: Despite your search efforts, no reliable source can be found to substantiate the information presented in the CLAIM. * Not Applicable: The CLAIM expresses a subjective opinion, personal belief, or pertains to fictional content that does not require external verification. * Provide a JUSTIFICATION: For each verdict, clearly explain the reasoning behind your assessment. Reference the sources you consulted or explain why the verdict "Not Applicable" was chosen. ## Step 3: Provide an overall assessment After you have evaluated each individual CLAIM, provide an OVERALL VERDICT for the entire answer text, and an OVERALL JUSTIFICATION for your overall verdict. Explain how the evaluation of the individual CLAIMS led you to this overall assessment and whether the answer as a whole successfully addresses the original question. # Tips Your work is iterative. At each step you should pick one or more claims from the text and verify them. Then, continue to the next claim or claims. You may rely on previous claims to verify the current claim. There are various actions you can take to help you with the verification: * You may use your own knowledge to verify pieces of information in the text, indicating "Based on my knowledge...". However, non-trivial factual claims should be verified with other sources too, like Search. Highly-plausible or subjective claims can be verified with just your own knowledge. * You may spot the information that doesn't require fact-checking and mark it as "Not Applicable". * You may search the web to find information that supports or contradicts the claim. * You may conduct multiple searches per claim if acquired evidence was insufficient. * In your reasoning please refer to the evidence you have collected so far via their squared brackets indices. * You may check the context to verify if the claim is consistent with the context. Read the context carefully to identify specific user instructions that the text should follow, facts that the text should be faithful to, etc. * You should draw your final conclusion on the entire text after you acquired all the information you needed. # Output format The last block of your output should be a Markdown-formatted list, summarizing your verification result. For each CLAIM you verified, you should output the claim (as a standalone statement), the corresponding part in the answer text, the verdict, and the justification. Here is the question and answer you are going to double check: ` const ReviserPrompt = ` You are a professional editor working for a highly-trustworthy publication. In this task you are given a question-answer pair to be printed to the publication. The publication reviewer has double-checked the answer text and provided the findings. Your task is to minimally revise the answer text to make it accurate, while maintaining the overall structure, style, and length similar to the original. The reviewer has identified CLAIMs (including facts and logical arguments) made in the answer text, and has verified whether each CLAIM is accurate, using the following VERDICTs: * Accurate: The information presented in the CLAIM is correct, complete, and consistent with the provided context and reliable sources. * Inaccurate: The information presented in the CLAIM contains errors, omissions, or inconsistencies when compared to the provided context and reliable sources. * Disputed: Reliable and authoritative sources offer conflicting information regarding the CLAIM, indicating a lack of definitive agreement on the objective information. * Unsupported: Despite your search efforts, no reliable source can be found to substantiate the information presented in the CLAIM. * Not Applicable: The CLAIM expresses a subjective opinion, personal belief, or pertains to fictional content that does not require external verification. Editing guidelines for each type of claim: * Accurate claims: There is no need to edit them. * Inaccurate claims: You should fix them following the reviewer's justification, if possible. * Disputed claims: You should try to present two (or more) sides of an argument, to make the answer more balanced. * Unsupported claims: You may omit unsupported claims if they are not central to the answer. Otherwise you may soften the claims or express that they are unsupported. * Not applicable claims: There is no need to edit them. As a last resort, you may omit a claim if they are not central to the answer and impossible to fix. You should also make necessary edits to ensure that the revised answer is self-consistent and fluent. You should not introduce any new claims or make any new statements in the answer text. Your edit should be minimal and maintain overall structure and style unchanged. Output format: * If the answer is accurate, you should output exactly the same answer text as you are given. * If the answer is inaccurate, disputed, or unsupported, then you should output your revised answer text. * After the answer, output a line of "---END-OF-EDIT---" and stop. Here are some examples of the task: === Example 1 === Question: Who was the first president of the US? Answer: George Washington was the first president of the United States. Findings: * Claim 1: George Washington was the first president of the United States. * Verdict: Accurate * Justification: Multiple reliable sources confirm that George Washington was the first president of the United States. * Overall verdict: Accurate * Overall justification: The answer is accurate and completely answers the question. Your expected response: George Washington was the first president of the United States. ---END-OF-EDIT--- === Example 2 === Question: What is the shape of the sun? Answer: The sun is cube-shaped and very hot. Findings: * Claim 1: The sun is cube-shaped. * Verdict: Inaccurate * Justification: NASA states that the sun is a sphere of hot plasma, so it is not cube-shaped. It is a sphere. * Claim 2: The sun is very hot. * Verdict: Accurate * Justification: Based on my knowledge and the search results, the sun is extremely hot. * Overall verdict: Inaccurate * Overall justification: The answer states that the sun is cube-shaped, which is incorrect. Your expected response: The sun is sphere-shaped and very hot. ---END-OF-EDIT--- Here are the question-answer pair and the reviewer-provided findings: ` func afterCritic(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if llmResponse == nil || llmResponse.Content == nil || llmResponse.Content.Parts == nil || llmResponse.GroundingMetadata == nil { return llmResponse, nil } references := []string{} for _, chunk := range llmResponse.GroundingMetadata.GroundingChunks { var title, uri, text string if chunk.RetrievedContext != nil { title = chunk.RetrievedContext.Title uri = chunk.RetrievedContext.URI text = chunk.RetrievedContext.Text } else if chunk.Web != nil { title = chunk.Web.Title uri = chunk.Web.URI } reference := "" parts := []string{} if title != "" { parts = append(parts, title) } if uri != "" { parts = append(parts, uri) } if text != "" { parts = append(parts, text) } if len(parts) > 0 { reference = "* " + strings.Join(parts, ": ") + "\n" } if reference != "" { references = append(references, reference) } } if len(references) > 0 { reference := "\n\nReference:\n\n" + strings.Join(references, "") llmResponse.Content.Parts = append(llmResponse.Content.Parts, &genai.Part{Text: reference}) } text_parts := []string{} for _, part := range llmResponse.Content.Parts { if part.Text != "" { text_parts = append(text_parts, part.Text) } } text := strings.Join(text_parts, "") if text != "" { llmResponse.Content.Parts = []*genai.Part{{Text: text}} } return llmResponse, nil } func afterReviser(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if llmResponse.Content == nil || llmResponse.Content.Parts == nil { return llmResponse, nil } for idx, part := range llmResponse.Content.Parts { if strings.Contains(part.Text, EndMark) { llmResponse.Content.Parts = llmResponse.Content.Parts[:idx] part.Text = strings.SplitN(part.Text, EndMark, 1)[0] } } return llmResponse, nil } func GetLLMAuditorAgent(ctx context.Context, model model.LLM) agent.Agent { criticAgent, err := llmagent.New(llmagent.Config{ Model: model, Name: "critic_agent", Instruction: CriticPrompt, AfterModelCallbacks: []llmagent.AfterModelCallback{ afterCritic, }, }, ) if err != nil { panic(err) } reviserAgent, err := llmagent.New(llmagent.Config{ Model: model, Name: "reviser_agent", Instruction: ReviserPrompt, AfterModelCallbacks: []llmagent.AfterModelCallback{ afterReviser, }, }, ) if err != nil { panic(err) } rootAgent, err := sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "llm_auditor", Description: "Evaluates LLM-generated answers.", SubAgents: []agent.Agent{ criticAgent, reviserAgent, }, }, }) if err != nil { panic(err) } return rootAgent } ================================================ FILE: examples/web/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "context" "log" "os" "github.com/a2aproject/a2a-go/a2asrv" "github.com/google/uuid" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/artifact" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/examples/web/agents" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" ) func saveReportfunc(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if llmResponse == nil || llmResponse.Content == nil || llmResponseError != nil { return llmResponse, llmResponseError } for _, part := range llmResponse.Content.Parts { _, err := ctx.Artifacts().Save(ctx, uuid.NewString(), part) if err != nil { return nil, err } } return llmResponse, llmResponseError } // AuthInterceptor sets 'user' name needed for both a2a and webui launchers which sharing the same sessions service. type AuthInterceptor struct { a2asrv.PassthroughCallInterceptor } // Before implements a before request callback. func (a *AuthInterceptor) Before(ctx context.Context, callCtx *a2asrv.CallContext, req *a2asrv.Request) (context.Context, error) { callCtx.User = &a2asrv.AuthenticatedUser{ UserName: "user", } return ctx, nil } func main() { ctx := context.Background() apiKey := os.Getenv("GOOGLE_API_KEY") model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{ APIKey: apiKey, }) if err != nil { log.Fatalf("Failed to create model: %v", err) } sessionService := session.InMemoryService() rootAgent, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: model, Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Tools: []tool.Tool{ geminitool.GoogleSearch{}, }, AfterModelCallbacks: []llmagent.AfterModelCallback{saveReportfunc}, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } llmAuditor := agents.GetLLMAuditorAgent(ctx, model) imageGeneratorAgent := agents.GetImageGeneratorAgent(ctx, model) agentLoader, err := agent.NewMultiLoader( rootAgent, llmAuditor, imageGeneratorAgent, ) if err != nil { log.Fatalf("Failed to create agent loader: %v", err) } artifactservice := artifact.InMemoryService() config := &launcher.Config{ ArtifactService: artifactservice, SessionService: sessionService, AgentLoader: agentLoader, A2AOptions: []a2asrv.RequestHandlerOption{ a2asrv.WithCallInterceptor(&AuthInterceptor{}), }, } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/workflowagents/loop/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package demonstrates a workflow agent that runs a loop agent. package main import ( "context" "iter" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func CustomAgentRun(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { Text: "Hello from MyAgent!\n", }, }, }, }, }, nil) } } func main() { ctx := context.Background() customAgent, err := agent.New(agent.Config{ Name: "my_custom_agent", Description: "A custom agent that responds with a greeting.", Run: CustomAgentRun, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } loopAgent, err := loopagent.New(loopagent.Config{ MaxIterations: 3, AgentConfig: agent.Config{ Name: "loop_agent", Description: "A loop agent that runs sub-agents", SubAgents: []agent.Agent{customAgent}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(loopAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/workflowagents/parallel/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package demonstrates a workflow agent that runs sub-agents in parallel. package main import ( "context" "fmt" "iter" "log" rand "math/rand/v2" "os" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func main() { ctx := context.Background() subAgent1, err := agent.New(agent.Config{ Name: "my_custom_agent_1", Description: "A custom agent that responds with a greeting.", Run: myAgent{id: 1}.Run, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } subAgent2, err := agent.New(agent.Config{ Name: "my_custom_agent_2", Description: "A custom agent that responds with a greeting.", Run: myAgent{id: 2}.Run, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } parallelAgent, err := parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "parallel_agent", Description: "A parallel agent that runs sub-agents", SubAgents: []agent.Agent{subAgent1, subAgent2}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(parallelAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } type myAgent struct { id int } func (a myAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { for range 3 { if !yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { Text: fmt.Sprintf("Hello from MyAgent id: %v!\n", a.id), }, }, }, }, }, nil) { return } r := 1 + rand.IntN(5) time.Sleep(time.Duration(r) * time.Second) } } } ================================================ FILE: examples/workflowagents/sequential/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package demonstrates a workflow agent that runs sub-agents sequentially. package main import ( "context" "fmt" "iter" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model" "google.golang.org/adk/session" ) type myAgent struct { id int } func (a myAgent) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { yield(&session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { Text: fmt.Sprintf("Hello from MyAgent id: %v!\n", a.id), }, }, }, }, }, nil) } } func main() { ctx := context.Background() myAgent1, err := agent.New(agent.Config{ Name: "my_custom_agent_1", Description: "A custom agent that responds with a greeting.", Run: myAgent{id: 1}.Run, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } myAgent2, err := agent.New(agent.Config{ Name: "my_custom_agent_2", Description: "A custom agent that responds with a greeting.", Run: myAgent{id: 2}.Run, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } sequentialAgent, err := sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "sequential_agent", Description: "A sequential agent that runs sub-agents", SubAgents: []agent.Agent{myAgent1, myAgent2}, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(sequentialAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: examples/workflowagents/sequentialCode/main.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package demonstrates a coding workflow agent that runs sub-agents sequentially. package main import ( "context" "log" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/cmd/launcher" "google.golang.org/adk/cmd/launcher/full" "google.golang.org/adk/model/gemini" ) func main() { ctx := context.Background() model, err := gemini.NewModel(ctx, "gemini-2.5-flash", &genai.ClientConfig{}) if err != nil { log.Fatalf("failed to create model: %s", err) } // --- 1. Define Sub-Agents for Each Pipeline Stage --- // Code Writer Agent // Takes the initial specification (from user query) and writes code. codeWriterAgent, err := llmagent.New(llmagent.Config{ Name: "CodeWriterAgent", Model: model, Instruction: `You are a Python Code Generator. Based *only* on the user's request, write Python code that fulfills the requirement. Output *only* the complete Python code block, enclosed in triple backticks ('''python ... '''). Do not add any other text before or after the code block.`, Description: "Writes initial Python code based on a specification.", OutputKey: "generated_code", // Stores output in state["generated_code"] }) if err != nil { log.Fatalf("failed to create codeWriterAgent: %s", err) } // Code Reviewer Agent // Takes the code generated by the previous agent (read from state) and provides feedback. codeReviewerAgent, err := llmagent.New(llmagent.Config{ Name: "CodeReviewerAgent", Model: model, Instruction: `You are an expert Python Code Reviewer. Your task is to provide constructive feedback on the provided code. **Code to Review:** '''python {generated_code} ''' **Review Criteria:** 1. **Correctness:** Does the code work as intended? Are there logic errors? 2. **Readability:** Is the code clear and easy to understand? Follows PEP 8 style guidelines? 3. **Efficiency:** Is the code reasonably efficient? Any obvious performance bottlenecks? 4. **Edge Cases:** Does the code handle potential edge cases or invalid inputs gracefully? 5. **Best Practices:** Does the code follow common Python best practices? **Output:** Provide your feedback as a concise, bulleted list. Focus on the most important points for improvement. If the code is excellent and requires no changes, simply state: "No major issues found." Output *only* the review comments or the "No major issues" statement.`, Description: "Reviews code and provides feedback.", OutputKey: "temp:review_comments", // Stores output in state["temp:review_comments"] }) if err != nil { log.Fatalf("failed to create codeReviewerAgent: %s", err) } // Code Refactorer Agent // Takes the original code and the review comments (read from state) and refactors the code. codeRefactorerAgent, err := llmagent.New(llmagent.Config{ Name: "CodeRefactorerAgent", Model: model, Instruction: `You are a Python Code Refactoring AI. Your goal is to improve the given Python code based on the provided review comments. **Original Code:** '''python {generated_code} ''' **Review Comments:** {temp:review_comments} **Task:** Carefully apply the suggestions from the review comments to refactor the original code. If the review comments state "No major issues found," return the original code unchanged. Ensure the final code is complete, functional, and includes necessary imports and docstrings. **Output:** Output *only* the final, refactored Python code block, enclosed in triple backticks ('''python ... '''). Do not add any other text before or after the code block.`, Description: "Refactors code based on review comments.", OutputKey: "refactored_code", // Stores output in state["refactored_code"] }) if err != nil { log.Fatalf("failed to create codeRefactorerAgent: %s", err) } // --- 2. Create the SequentialAgent --- // This agent orchestrates the pipeline by running the sub_agents in order. codePipelineAgent, err := sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "CodePipelineAgent", SubAgents: []agent.Agent{ codeWriterAgent, codeReviewerAgent, codeRefactorerAgent, }, Description: "Executes a sequence of code writing, reviewing, and refactoring.", }, }) if err != nil { log.Fatalf("failed to create codePipelineAgent: %s", err) } rootAgent := codePipelineAgent // The rootAgent can now be used by the ADK framework. log.Printf("Successfully created root agent: %s", rootAgent.Name()) config := &launcher.Config{ AgentLoader: agent.NewSingleLoader(rootAgent), } l := full.NewLauncher() if err = l.Execute(ctx, config, os.Args[1:]); err != nil { log.Fatalf("Run failed: %v\n\n%s", err, l.CommandLineSyntax()) } } ================================================ FILE: go.mod ================================================ module google.golang.org/adk go 1.25.0 require ( cloud.google.com/go v0.123.0 cloud.google.com/go/aiplatform v1.105.0 cloud.google.com/go/storage v1.56.1 github.com/a2aproject/a2a-go v0.3.10 github.com/awalterschulze/gographviz v2.0.3+incompatible github.com/glebarez/sqlite v1.8.0 github.com/google/go-cmp v0.7.0 github.com/google/jsonschema-go v0.4.2 github.com/google/safehtml v0.1.0 github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/mitchellh/mapstructure v1.5.0 github.com/modelcontextprotocol/go-sdk v1.4.1 github.com/spf13/cobra v1.8.1 go.opentelemetry.io/contrib/detectors/gcp v1.40.0 go.opentelemetry.io/otel v1.40.0 go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 go.opentelemetry.io/otel/log v0.16.0 go.opentelemetry.io/otel/sdk v1.40.0 go.opentelemetry.io/otel/trace v1.40.0 golang.org/x/oauth2 v0.34.0 golang.org/x/sync v0.19.0 google.golang.org/api v0.252.0 google.golang.org/genai v1.40.0 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 gorm.io/gorm v1.31.0 rsc.io/omap v1.2.0 rsc.io/ordered v1.1.1 ) require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go/auth v0.17.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect cloud.google.com/go/longrunning v0.7.0 // indirect cloud.google.com/go/monitoring v1.24.3 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/glebarez/go-sqlite v1.21.1 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/segmentio/asm v1.1.3 // indirect github.com/segmentio/encoding v0.5.4 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect go.opentelemetry.io/otel/metric v1.40.0 // indirect go.opentelemetry.io/otel/sdk/log v0.16.0 go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect golang.org/x/crypto v0.47.0 // indirect golang.org/x/net v0.49.0 // indirect golang.org/x/sys v0.41.0 // indirect golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.14.0 // indirect google.golang.org/genproto v0.0.0-20251014184007-4626949a642f // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 // indirect modernc.org/libc v1.22.3 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/sqlite v1.21.1 // indirect ) ================================================ FILE: go.sum ================================================ cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/aiplatform v1.105.0 h1:Tbc2iEp7vbzgk6Vs4QexfNo8/nl+E+Na+FEreRZdhcM= cloud.google.com/go/aiplatform v1.105.0/go.mod h1:4rwKOMdubQOND81AlO3EckcskvEFCYSzXKfn42GMm8k= cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4= cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/storage v1.56.1 h1:n6gy+yLnHn0hTwBFzNn8zJ1kqWfR91wzdM8hjRF4wP0= cloud.google.com/go/storage v1.56.1/go.mod h1:C9xuCZgFl3buo2HZU/1FncgvvOgTAs/rnh4gF4lMg0s= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo= github.com/a2aproject/a2a-go v0.3.10 h1:oiwxhxe6HlJiYupASW04aHixZeiZq1Y/fha2N1EWJyI= github.com/a2aproject/a2a-go v0.3.10/go.mod h1:I7Cm+a1oL+UT6zMoP+roaRE5vdfUa1iQGVN8aSOuZ0I= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY= github.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E= github.com/glebarez/sqlite v1.8.0 h1:02X12E2I/4C1n+v90yTqrjRa8yuo7c3KeHI3FRznCvc= github.com/glebarez/sqlite v1.8.0/go.mod h1:bpET16h1za2KOOMb8+jCp6UBP/iahDpfPQqSaYLTLx8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8= github.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8= github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modelcontextprotocol/go-sdk v1.4.1 h1:M4x9GyIPj+HoIlHNGpK2hq5o3BFhC+78PkEaldQRphc= github.com/modelcontextprotocol/go-sdk v1.4.1/go.mod h1:Bo/mS87hPQqHSRkMv4dQq1XCu6zv4INdXnFZabkNU6s= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc= github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg= github.com/segmentio/encoding v0.5.4 h1:OW1VRern8Nw6ITAtwSZ7Idrl3MXCFwXHPgqESYfvNt0= github.com/segmentio/encoding v0.5.4/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/detectors/gcp v1.40.0 h1:Awaf8gmW99tZTOWqkLCOl6aw1/rxAWVlHsHIZ3fT2sA= go.opentelemetry.io/contrib/detectors/gcp v1.40.0/go.mod h1:99OY9ZCqyLkzJLTh5XhECpLRSxcZl+ZDKBEO+jMBFR4= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0 h1:djrxvDxAe44mJUrKataUbOhCKhR3F8QCyWucO16hTQs= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.16.0/go.mod h1:dt3nxpQEiSoKvfTVxp3TUg5fHPLhKtbcnN3Z1I1ePD0= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= go.opentelemetry.io/otel/log v0.16.0 h1:DeuBPqCi6pQwtCK0pO4fvMB5eBq6sNxEnuTs88pjsN4= go.opentelemetry.io/otel/log v0.16.0/go.mod h1:rWsmqNVTLIA8UnwYVOItjyEZDbKIkMxdQunsIhpUMes= go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= go.opentelemetry.io/otel/sdk/log v0.16.0 h1:e/b4bdlQwC5fnGtG3dlXUrNOnP7c8YLVSpSfEBIkTnI= go.opentelemetry.io/otel/sdk/log v0.16.0/go.mod h1:JKfP3T6ycy7QEuv3Hj8oKDy7KItrEkus8XJE6EoSzw4= go.opentelemetry.io/otel/sdk/log/logtest v0.16.0 h1:/XVkpZ41rVRTP4DfMgYv1nEtNmf65XPPyAdqV90TMy4= go.opentelemetry.io/otel/sdk/log/logtest v0.16.0/go.mod h1:iOOPgQr5MY9oac/F5W86mXdeyWZGleIx3uXO98X2R6Y= go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw= go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg= go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.252.0 h1:xfKJeAJaMwb8OC9fesr369rjciQ704AjU/psjkKURSI= google.golang.org/api v0.252.0/go.mod h1:dnHOv81x5RAmumZ7BWLShB/u7JZNeyalImxHmtTHxqw= google.golang.org/genai v1.40.0 h1:kYxyQSH+vsib8dvsgyLJzsVEIv5k3ZmHJyVqdvGncmc= google.golang.org/genai v1.40.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk= google.golang.org/genproto v0.0.0-20251014184007-4626949a642f h1:vLd1CJuJOUgV6qijD7KT5Y2ZtC97ll4dxjTUappMnbo= google.golang.org/genproto v0.0.0-20251014184007-4626949a642f/go.mod h1:PI3KrSadr00yqfv6UDvgZGFsmLqeRIwt8x4p5Oo7CdM= google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409 h1:merA0rdPeUV3YIIfHHcH4qBkiQAc1nfCKSI7lB4cV2M= google.golang.org/genproto/googleapis/api v0.0.0-20260128011058-8636f8732409/go.mod h1:fl8J1IvUjCilwZzQowmw2b7HQB2eAuYBabMXzWurF+I= google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409 h1:H86B94AW+VfJWDqFeEbBPhEtHzJwJfTbgE2lZa54ZAQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260128011058-8636f8732409/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.31.0 h1:0VlycGreVhK7RF/Bwt51Fk8v0xLiiiFdbGDPIZQ7mJY= gorm.io/gorm v1.31.0/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= rsc.io/omap v1.2.0 h1:c1M8jchnHbzmJALzGLclfH3xDWXrPxSUHXzH5C+8Kdw= rsc.io/omap v1.2.0/go.mod h1:C8pkI0AWexHopQtZX+qiUeJGzvc8HkdgnsWK4/mAa00= rsc.io/ordered v1.1.1 h1:1kZM6RkTmceJgsFH/8DLQvkCVEYomVDJfBRLT595Uak= rsc.io/ordered v1.1.1/go.mod h1:evAi8739bWVBRG9aaufsjVc202+6okf8u2QeVL84BCM= ================================================ FILE: internal/agent/parentmap/map.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package parentmap import ( "context" "fmt" "google.golang.org/adk/agent" ) type Map map[string]agent.Agent // New creates parent map allowing to fetch agent's parent. // It ensures that agent can have at most one parent. // It ensures that the root node name is not referenced again in the agent tree func New(root agent.Agent) (Map, error) { res := make(map[string]agent.Agent) rootName := root.Name() pointerMap := map[agent.Agent]string{root: "is root agent"} var f func(cur agent.Agent) error f = func(cur agent.Agent) error { for _, subAgent := range cur.SubAgents() { if p, ok := pointerMap[subAgent]; ok { return fmt.Errorf("%q agent cannot have >1 parents, found: %q, %q", subAgent.Name(), p, cur.Name()) } if _, ok := res[subAgent.Name()]; ok || subAgent.Name() == rootName { return fmt.Errorf("agent names must be unique in the agent tree, found duplicate: %q", subAgent.Name()) } res[subAgent.Name()] = cur pointerMap[subAgent] = cur.Name() if err := f(subAgent); err != nil { return err } } return nil } return res, f(root) } // RootAgent returns the root of the agent tree. func (m Map) RootAgent(cur agent.Agent) agent.Agent { if cur == nil { return nil } for { parent := m[cur.Name()] if parent == nil { return cur } cur = parent } } func ToContext(ctx context.Context, parents Map) context.Context { return context.WithValue(ctx, mapCtxKey, parents) } func FromContext(ctx context.Context) Map { m, ok := ctx.Value(mapCtxKey).(Map) if !ok { return nil } return m } type ctxKey int const mapCtxKey ctxKey = 0 ================================================ FILE: internal/agent/parentmap/map_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package parentmap_test import ( "testing" "github.com/google/go-cmp/cmp" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/agent/parentmap" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" ) func TestNew(t *testing.T) { child1_1 := utils.Must(agent.New(agent.Config{ Name: "child1_1", })) child1 := utils.Must(agent.New(agent.Config{ Name: "child1", SubAgents: []agent.Agent{child1_1}, })) child2 := utils.Must(agent.New(agent.Config{ Name: "child2", })) root := utils.Must(agent.New(agent.Config{ Name: "root", SubAgents: []agent.Agent{child1, child2}, })) got, err := parentmap.New(root) if err != nil { t.Fatal(err) } want := parentmap.Map{ child1_1.Name(): child1, child1.Name(): root, child2.Name(): root, } agentNames := cmp.Transformer("agentNames", func(m parentmap.Map) map[string]string { if m == nil { return nil } res := make(map[string]string) for k, v := range m { res[k] = v.Name() } return res }) if diff := cmp.Diff(want, got, agentNames); diff != "" { t.Errorf("New() = %v, got %v diff (-want/+got): %v", got, want, diff) } } func TestMap_RootAgent(t *testing.T) { model := struct { model.LLM }{} nonLLM := utils.Must(agent.New(agent.Config{ Name: "mock", })) b := utils.Must(llmagent.New(llmagent.Config{ Name: "b", Model: model, SubAgents: []agent.Agent{nonLLM}, })) a := utils.Must(llmagent.New(llmagent.Config{ Name: "a", Model: model, SubAgents: []agent.Agent{b}, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "root", Model: model, SubAgents: []agent.Agent{a}, })) agentName := func(a agent.Agent) string { if a == nil { return "nil" } return a.Name() } parents, err := parentmap.New(root) if err != nil { t.Fatal(err) } for _, tc := range []struct { agent agent.Agent want agent.Agent }{ {root, root}, {a, root}, {b, root}, {nonLLM, root}, {nil, nil}, } { t.Run("agent="+agentName(tc.agent), func(t *testing.T) { gotRoot := parents.RootAgent(tc.agent) if got, want := agentName(gotRoot), agentName(tc.want); got != want { t.Errorf("rootAgent(%q) = %q, want %q", agentName(tc.agent), got, want) } }) } } ================================================ FILE: internal/agent/remoteagent/a2a_config.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package remoteagent import ( "context" "encoding/json" "fmt" "os" "strings" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2aclient/agentcard" ) // RemoteAgentState holds the internal state of a remote agent. type RemoteAgentState struct { // A2A holds the A2A configuration if remote agent is an A2A agent. A2A *A2AServerConfig } // A2AServerConfig is used to describe and configure a remote agent. type A2AServerConfig struct { // AgentCardSource can be either an http(s) URL or a local file path. If a2a.AgentCard // is not provided, the source is used to resolve the card during the first agent invocation. AgentCard *a2a.AgentCard AgentCardSource string // CardResolveOptions can be used to provide a set of agencard.Resolver configurations. CardResolveOptions []agentcard.ResolveOption // ClientFactory can be used to provide a set of a2aclient.Client configurations. ClientFactory *a2aclient.Factory } func CreateA2AClient(ctx context.Context, cfg *A2AServerConfig) (*a2a.AgentCard, *a2aclient.Client, error) { card, err := resolveAgentCard(ctx, cfg) if err != nil { return nil, nil, fmt.Errorf("agent card resolution failed: %w", err) } var client *a2aclient.Client if cfg.ClientFactory != nil { client, err = cfg.ClientFactory.CreateFromCard(ctx, card) } else { client, err = a2aclient.NewFromCard(ctx, card) } if err != nil { return nil, nil, fmt.Errorf("client creation failed: %w", err) } return card, client, nil } func resolveAgentCard(ctx context.Context, cfg *A2AServerConfig) (*a2a.AgentCard, error) { if cfg.AgentCard != nil { return cfg.AgentCard, nil } if strings.HasPrefix(cfg.AgentCardSource, "http://") || strings.HasPrefix(cfg.AgentCardSource, "https://") { card, err := agentcard.DefaultResolver.Resolve(ctx, cfg.AgentCardSource, cfg.CardResolveOptions...) if err != nil { return nil, fmt.Errorf("failed to fetch an agent card: %w", err) } return card, nil } fileBytes, err := os.ReadFile(cfg.AgentCardSource) if err != nil { return nil, fmt.Errorf("failed to read agent card from %q: %w", cfg.AgentCardSource, err) } var card a2a.AgentCard if err := json.Unmarshal(fileBytes, &card); err != nil { return nil, fmt.Errorf("failed to unmarshal an agent card: %w", err) } return &card, nil } ================================================ FILE: internal/agent/runconfig/run_config.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package runconfig import "context" type StreamingMode string const ( StreamingModeNone StreamingMode = "none" StreamingModeSSE StreamingMode = "sse" StreamingModeBidi StreamingMode = "bidi" ) type RunConfig struct { StreamingMode StreamingMode } func ToContext(ctx context.Context, cfg *RunConfig) context.Context { return context.WithValue(ctx, runConfigCtxKey, cfg) } func FromContext(ctx context.Context) *RunConfig { m, ok := ctx.Value(runConfigCtxKey).(*RunConfig) if !ok { return nil } return m } type ctxKey int const runConfigCtxKey ctxKey = 0 ================================================ FILE: internal/agent/state.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agent // holds Agent internal state type Agent interface { internal() *State } type State struct { AgentType Type Config any } type Type string const ( TypeLLMAgent Type = "LLMAgent" TypeLoopAgent Type = "LoopAgent" TypeSequentialAgent Type = "SequentialAgent" TypeParallelAgent Type = "ParallelAgent" TypeCustomAgent Type = "CustomAgent" TypeRemoteAgent Type = "RemoteAgent" ) func (s *State) internal() *State { return s } func Reveal(a Agent) *State { return a.internal() } ================================================ FILE: internal/artifact/artifacts.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact import ( "context" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" ) // Artifacts implements Artifacts type Artifacts struct { Service artifact.Service AppName string UserID string SessionID string } func (a *Artifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) { return a.Service.Save(ctx, &artifact.SaveRequest{ AppName: a.AppName, UserID: a.UserID, SessionID: a.SessionID, FileName: name, Part: data, }) } func (a *Artifacts) Load(ctx context.Context, name string) (*artifact.LoadResponse, error) { return a.Service.Load(ctx, &artifact.LoadRequest{ AppName: a.AppName, UserID: a.UserID, SessionID: a.SessionID, FileName: name, }) } func (a *Artifacts) LoadVersion(ctx context.Context, name string, version int) (*artifact.LoadResponse, error) { return a.Service.Load(ctx, &artifact.LoadRequest{ AppName: a.AppName, UserID: a.UserID, SessionID: a.SessionID, FileName: name, Version: int64(version), }) } func (a *Artifacts) List(ctx context.Context) (*artifact.ListResponse, error) { return a.Service.List(ctx, &artifact.ListRequest{ AppName: a.AppName, UserID: a.UserID, SessionID: a.SessionID, }) } var _ agent.Artifacts = (*Artifacts)(nil) ================================================ FILE: internal/artifact/artifacts_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package artifact_test import ( "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/artifact" artifactinternal "google.golang.org/adk/internal/artifact" ) func TestArtifacts(t *testing.T) { a := artifactinternal.Artifacts{ Service: artifact.InMemoryService(), AppName: "testApp", UserID: "testUser", SessionID: "testSession", } // Save part := genai.NewPartFromText("test data") _, err := a.Save(t.Context(), "testArtifact", part) if err != nil { t.Fatalf("Save failed: %v", err) } // Load loadResp, err := a.Load(t.Context(), "testArtifact") if err != nil { t.Fatalf("Load failed: %v", err) } if diff := cmp.Diff(part, loadResp.Part); diff != "" { t.Errorf("Loaded part differs from saved part (-want +got):\n%s", diff) } // List listResp, err := a.List(t.Context()) if err != nil { t.Fatalf("List failed: %v", err) } expectedFileNames := []string{"testArtifact"} if diff := cmp.Diff(expectedFileNames, listResp.FileNames); diff != "" { t.Errorf("List returned unexpected file names (-want +got):\n%s", diff) } } func TestArtifacts_WithLoadVersion(t *testing.T) { a := artifactinternal.Artifacts{ Service: artifact.InMemoryService(), AppName: "testApp", UserID: "testUser", SessionID: "testSession", } part := genai.NewPartFromText("test data") _, err := a.Save(t.Context(), "testArtifact", part) if err != nil { t.Fatalf("Save failed: %v", err) } part2 := genai.NewPartFromText("test data 2") _, err = a.Save(t.Context(), "testArtifact", part2) if err != nil { t.Fatalf("Save failed: %v", err) } loadResp, err := a.LoadVersion(t.Context(), "testArtifact", 0) if err != nil { t.Fatalf("Load failed: %v", err) } if diff := cmp.Diff(part2, loadResp.Part); diff != "" { t.Errorf("Loaded part differs from saved part (-want +got):\n%s", diff) } } func TestArtifacts_Errors(t *testing.T) { a := artifactinternal.Artifacts{ Service: artifact.InMemoryService(), AppName: "testApp", UserID: "testUser", SessionID: "testSession", } // Attempt to Load non-existent artifact _, err := a.Load(t.Context(), "nonExistentArtifact") if err == nil { t.Errorf("Load(\"nonExistentArtifact\") succeeded, want error") } // Attempt to LoadVersion non-existent artifact _, err = a.LoadVersion(t.Context(), "nonExistentArtifact", 0) if err == nil { t.Errorf("LoadVersion(\"nonExistentArtifact\", 0) succeeded, want error") } // Save an artifact to test LoadVersion with an invalid version part := genai.NewPartFromText("test data") if _, err := a.Save(t.Context(), "existsArtifact", part); err != nil { t.Fatalf("Save(\"existsArtifact\") failed: %v", err) } // Attempt to LoadVersion with a version number that doesn't exist _, err = a.LoadVersion(t.Context(), "existsArtifact", 99) if err == nil { t.Errorf("LoadVersion(\"existsArtifact\", 99) succeeded, want error") } } ================================================ FILE: internal/artifact/tests/service_suite.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tests import ( "context" "errors" "fmt" "io/fs" "slices" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/artifact" ) func TestArtifactService(t *testing.T, name string, factory func(t *testing.T) (artifact.Service, error)) { t.Run(fmt.Sprintf("Test%sArtifactService", name), func(t *testing.T) { ctx := t.Context() // Create the service using the factory for this sub-test srv, err := factory(t) if err != nil { t.Fatalf("Failed to set up service: %v", err) } testArtifactService(ctx, t, srv, name) }) t.Run(fmt.Sprintf("Test%sArtifactService_Empty", name), func(t *testing.T) { ctx := t.Context() // Create the service using the factory for this sub-test srv, err := factory(t) if err != nil { t.Fatalf("Failed to set up service: %v", err) } testArtifactService_Empty(ctx, t, srv, name) }) t.Run(fmt.Sprintf("Test%sArtifactService_UserScoped", name), func(t *testing.T) { ctx := t.Context() // Create the service using the factory for this sub-test srv, err := factory(t) if err != nil { t.Fatalf("Failed to set up service: %v", err) } testArtifactService_UserScoped(ctx, t, srv, name) }) } func testArtifactService(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) { appName := "testapp" userID := "testuser" sessionID := "testsession" // Save these artifacts for later subtests. testData := []struct { fileName string version int64 artifact *genai.Part }{ // file1. {"file1", 1, genai.NewPartFromBytes([]byte("file v1"), "text/plain")}, {"file1", 2, genai.NewPartFromBytes([]byte("file v2"), "text/plain")}, {"file1", 3, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, // file2. {"file2", 1, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, // file3. {"file3", 1, genai.NewPartFromText("file v1")}, } t.Log("Save file1 and file2") for i, data := range testData { wantVersion := data.version got, err := srv.Save(ctx, &artifact.SaveRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: data.fileName, Part: data.artifact, }) if err != nil || got.Version != wantVersion { t.Errorf("[%d] Save() = (%v, %v), want (%v, nil)", i, got.Version, err, wantVersion) continue } } t.Run(fmt.Sprintf("Load_%s", testSuffix), func(t *testing.T) { fileName := "file1" for _, tc := range []struct { name string version int64 want *genai.Part }{ {"latest", 0, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, {"ver=1", 1, genai.NewPartFromBytes([]byte("file v1"), "text/plain")}, {"ver=2", 2, genai.NewPartFromBytes([]byte("file v2"), "text/plain")}, } { got, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: fileName, Version: tc.version, }) if err != nil || !cmp.Equal(got.Part, tc.want) { t.Errorf("Load(%v) = (%v, %v), want (%v, nil)", tc.version, got.Part, err, tc.want) } } }) t.Run(fmt.Sprintf("List_%s", testSuffix), func(t *testing.T) { resp, err := srv.List(ctx, &artifact.ListRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("List() failed: %v", err) } got := resp.FileNames slices.Sort(got) want := []string{"file1", "file2", "file3"} // testData has two files. if diff := cmp.Diff(got, want); diff != "" { t.Errorf("List() = %v, want %v", got, want) } }) t.Run(fmt.Sprintf("Versions_%s", testSuffix), func(t *testing.T) { resp, err := srv.Versions(ctx, &artifact.VersionsRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", }) if err != nil { t.Fatalf("Versions() failed: %v", err) } got := resp.Versions slices.Sort(got) want := []int64{1, 2, 3} if diff := cmp.Diff(got, want); diff != "" { t.Errorf("Versions('file1') = %v, want %v", got, want) } }) t.Log("Delete file1 version 3") if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", Version: 3, }); err != nil { t.Fatalf("Delete(file1@v3) failed: %v", err) } t.Run(fmt.Sprintf("LoadAfterDeleteVersion3_%s", testSuffix), func(t *testing.T) { resp, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", }) if err != nil { t.Fatalf("Load('file1') failed: %v", err) } got := resp.Part want := genai.NewPartFromBytes([]byte("file v2"), "text/plain") if diff := cmp.Diff(got, want); diff != "" { t.Fatalf("Load('file1') = (%v, %v), want (%v, nil)", got, err, want) } }) if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", }); err != nil { t.Fatalf("Delete(file1) failed: %v", err) } t.Run(fmt.Sprintf("LoadAfterDelete_%s", testSuffix), func(t *testing.T) { got, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("Load('file1') = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) t.Run(fmt.Sprintf("ListAfterDelete_%s", testSuffix), func(t *testing.T) { resp, err := srv.List(ctx, &artifact.ListRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("List() failed: %v", err) } got := resp.FileNames slices.Sort(got) want := []string{"file2", "file3"} // testData has two files. if diff := cmp.Diff(got, want); diff != "" { t.Errorf("List() = %v, want %v", got, want) } }) t.Run(fmt.Sprintf("VersionsAfterDelete_%s", testSuffix), func(t *testing.T) { got, err := srv.Versions(ctx, &artifact.VersionsRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file1", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("Versions('file1') = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) // Clean up if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file2", }); err != nil { t.Fatalf("Delete(file2) failed: %v", err) } if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file3", }); err != nil { t.Fatalf("Delete(file3) failed: %v", err) } } func testArtifactService_UserScoped(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) { appName := "testapp" userID := "testuser" sessionID := "testsession" // Save these artifacts for later subtests. testData := []struct { fileName string version int64 artifact *genai.Part }{ // file1. {"user:file1", 1, genai.NewPartFromBytes([]byte("file v1"), "text/plain")}, {"user:file1", 2, genai.NewPartFromBytes([]byte("file v2"), "text/plain")}, {"user:file1", 3, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, // file2. {"file2", 1, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, // file3. {"user:file3", 1, genai.NewPartFromText("file v1")}, } t.Log("Save file1 and file2") for i, data := range testData { wantVersion := data.version got, err := srv.Save(ctx, &artifact.SaveRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: data.fileName, Part: data.artifact, }) if err != nil || got.Version != wantVersion { t.Errorf("[%d] Save() = (%v, %v), want (%v, nil)", i, got.Version, err, wantVersion) continue } } t.Run(fmt.Sprintf("Load_%s", testSuffix), func(t *testing.T) { fileName := "user:file1" for _, tc := range []struct { name string version int64 want *genai.Part }{ {"latest", 0, genai.NewPartFromBytes([]byte("file v3"), "text/plain")}, {"ver=1", 1, genai.NewPartFromBytes([]byte("file v1"), "text/plain")}, {"ver=2", 2, genai.NewPartFromBytes([]byte("file v2"), "text/plain")}, } { got, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: "'user' should be used instead", FileName: fileName, Version: tc.version, }) if err != nil || !cmp.Equal(got.Part, tc.want) { t.Errorf("Load(%v) = (%v, %v), want (%v, nil)", tc.version, got.Part, err, tc.want) } } }) t.Run(fmt.Sprintf("List_%s", testSuffix), func(t *testing.T) { resp, err := srv.List(ctx, &artifact.ListRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("List() failed: %v", err) } got := resp.FileNames want := []string{"file2", "user:file1", "user:file3"} // testData has two files. if diff := cmp.Diff(got, want); diff != "" { t.Errorf("List() = %v, want %v", got, want) } }) t.Run(fmt.Sprintf("Versions_%s", testSuffix), func(t *testing.T) { resp, err := srv.Versions(ctx, &artifact.VersionsRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", }) if err != nil { t.Fatalf("Versions() failed: %v", err) } got := resp.Versions slices.Sort(got) want := []int64{1, 2, 3} if diff := cmp.Diff(got, want); diff != "" { t.Errorf("Versions('user:file1') = %v, want %v", got, want) } }) t.Log("Delete user:file1 version 3") if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", Version: 3, }); err != nil { t.Fatalf("Delete(user:file1@v3) failed: %v", err) } t.Run(fmt.Sprintf("LoadAfterDeleteVersion3_%s", testSuffix), func(t *testing.T) { resp, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", }) if err != nil { t.Fatalf("Load('user:file1') failed: %v", err) } got := resp.Part want := genai.NewPartFromBytes([]byte("file v2"), "text/plain") if diff := cmp.Diff(got, want); diff != "" { t.Fatalf("Load('user:file1') = (%v, %v), want (%v, nil)", got, err, want) } }) if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", }); err != nil { t.Fatalf("Delete(user:file1) failed: %v", err) } t.Run(fmt.Sprintf("LoadAfterDelete_%s", testSuffix), func(t *testing.T) { got, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("Load('user:file1') = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) t.Run(fmt.Sprintf("ListAfterDelete_%s", testSuffix), func(t *testing.T) { resp, err := srv.List(ctx, &artifact.ListRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("List() failed: %v", err) } got := resp.FileNames slices.Sort(got) want := []string{"file2", "user:file3"} // testData has two files. if diff := cmp.Diff(got, want); diff != "" { t.Errorf("List() = %v, want %v", got, want) } }) t.Run(fmt.Sprintf("VersionsAfterDelete_%s", testSuffix), func(t *testing.T) { got, err := srv.Versions(ctx, &artifact.VersionsRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file1", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("Versions('user:file1') = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) // Clean up if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "file2", }); err != nil { t.Fatalf("Delete(file2) failed: %v", err) } if err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: "user:file3", }); err != nil { t.Fatalf("Delete(user:file3) failed: %v", err) } } func testArtifactService_Empty(ctx context.Context, t *testing.T, srv artifact.Service, testSuffix string) { t.Run(fmt.Sprintf("Load_%s", testSuffix), func(t *testing.T) { got, err := srv.Load(ctx, &artifact.LoadRequest{ AppName: "app", UserID: "user", SessionID: "session", FileName: "file", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("List() = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) t.Run(fmt.Sprintf("List_%s", testSuffix), func(t *testing.T) { _, err := srv.List(ctx, &artifact.ListRequest{ AppName: "app", UserID: "user", SessionID: "session", }) if err != nil { t.Fatalf("List() failed: %v", err) } }) t.Run(fmt.Sprintf("Delete_%s", testSuffix), func(t *testing.T) { err := srv.Delete(ctx, &artifact.DeleteRequest{ AppName: "app", UserID: "user", SessionID: "session", FileName: "file1", }) if err != nil { t.Fatalf("Delete() failed: %v", err) } }) t.Run(fmt.Sprintf("Versions_%s", testSuffix), func(t *testing.T) { got, err := srv.Versions(ctx, &artifact.VersionsRequest{ AppName: "app", UserID: "user", SessionID: "session", FileName: "file1", }) if !errors.Is(err, fs.ErrNotExist) { t.Fatalf("Versions() = (%v, %v), want error(%v)", got, err, fs.ErrNotExist) } }) } ================================================ FILE: internal/cli/util/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package util provides helper functions for execution of commands and presenting their stderr and stdout in uniform way. // Provides also a way to capture text generated by FlagSet as command line arguments' documentation (PrintDefaults) package util ================================================ FILE: internal/cli/util/flagset_helpers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package util import ( "flag" "strings" ) // FormatFlagUsage returns a string containing the usage information for the given FlagSet. func FormatFlagUsage(fs *flag.FlagSet) string { var b strings.Builder o := fs.Output() fs.SetOutput(&b) fs.PrintDefaults() fs.SetOutput(o) return b.String() } ================================================ FILE: internal/cli/util/oscmd.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package util import ( "errors" "fmt" "io" "os" "os/exec" "path" ) // Printer is a function printing its arguments type Printer func(a ...any) var ( Reset = "\033[0m" Red = "\033[31m" Green = "\033[32m" Yellow = "\033[33m" Blue = "\033[34m" Magenta = "\033[35m" Cyan = "\033[36m" Gray = "\033[37m" White = "\033[97m" ) // LogStartStop is a helper function which executes a particular command with logging func LogStartStop(msg string, command func(p Printer) error) error { fmt.Println(msg, ": "+Green+"Starting"+Reset) err := command(func(a ...any) { fmt.Println(" "+Green+"> "+Reset, a) }) fmt.Println() if err == nil { fmt.Println(msg, ": "+Green+"Finished successfully"+Reset) } else { fmt.Println(msg, ": "+Red+"Finished with error"+Reset) fmt.Println("Error:", err) } return err } type reprintableStream struct { prefix []byte clean bool stream io.Writer } // function Write is an interceptor of a stream adding some decorations func (s *reprintableStream) Write(p []byte) (total int, err error) { start := 0 err = nil if s.clean { _, err = s.stream.Write(s.prefix) if err != nil { return total, err } s.clean = false } for i, c := range p { if c == '\n' { _, err = s.stream.Write(p[start:i]) if err != nil { return len(p), err } _, err = s.stream.Write(s.prefix) if err != nil { return len(p), err } start = i + 1 } } if start < len(p) { _, err = s.stream.Write(p[start:]) } return len(p), err } func newReprintableStream(s io.Writer, prefix, color string) io.Writer { return &reprintableStream{prefix: []byte("\n " + color + prefix + " > " + Reset), stream: s, clean: true} } // function LogCommand runs a command pretty-printing its stdout and stderr func LogCommand(c *exec.Cmd, p Printer) error { p("Running : ", Yellow, c.Dir, Reset, " ", c) c.Stdout = newReprintableStream(os.Stdout, " ", Yellow) c.Stderr = newReprintableStream(os.Stdout, " ", Yellow) return c.Run() } func StripExtension(p, expected string) (string, error) { ex := path.Ext(p) if ex == "" { return "", errors.New("Cannot find extension in '" + p + "'") } if ex != expected { return "", errors.New("Unexpected extension. Found '" + ex + "' instead of '" + expected + "'") } return p[:len(p)-len(ex)], nil } ================================================ FILE: internal/cli/util/text_helpers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package util import "strings" func CenterString(s string, w int) string { sw := w - len(s) lw := sw / 2 rw := sw - lw return strings.Repeat(" ", lw) + s + strings.Repeat(" ", rw) } ================================================ FILE: internal/configurable/configurable.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package configurable import ( "context" "fmt" "os" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/internal/llminternal/googlellm" "google.golang.org/adk/model/gemini" "google.golang.org/adk/tool" ) // codeConfig represents a reference to a function or callback. // Equivalent to: common_configs.codeConfig type codeConfig struct { // Name of the function/method (e.g., "my_pkg.security.Check") Name string `yaml:"name"` // Optional params if your system supports parameterized callbacks Params map[string]any `yaml:"params,omitempty"` } // agentRefConfig represents a reference to a sub-agent. // Equivalent to: common_configs.agentRefConfig type agentRefConfig struct { // Path to another agent's YAML file ConfigPath string `yaml:"config_path,omitempty"` // OR an inline code reference Code string `yaml:"code,omitempty"` } type ToolConfig struct { // Name of the tool/method (e.g., "my_pkg.security.Check") Name string `yaml:"name"` // Optional params if your system supports parameterized callbacks Args map[string]any `yaml:"args,omitempty"` } // baseAgentConfig matches the Python baseAgentConfig Pydantic model. // // Usage: Do not use this struct directly for unmarshalling specific agents. // Embed it into concrete agent configs (see Example below). type baseAgentConfig struct { // Required. The class of the agent. // Default is "BaseAgent" in Python, but usually overridden by concrete agents. AgentClass string `yaml:"agent_class"` // Required. The name of the agent. Name string `yaml:"name"` // Optional. Description of the agent. Description string `yaml:"description,omitempty"` // Optional. List of sub-agents. SubAgents []agentRefConfig `yaml:"sub_agents,omitempty"` // Optional. Callbacks to run before execution. BeforeAgentCallbacks []codeConfig `yaml:"before_agent_callbacks,omitempty"` // Optional. Callbacks to run after execution. AfterAgentCallbacks []codeConfig `yaml:"after_agent_callbacks,omitempty"` // Path to the config file. ConfigPath string `yaml:"-"` // Handle extra fields (extra='allow'): // If you use this struct standalone, this map catches unknown fields. // However, the preferred pattern is to embed this struct in a concrete config // so specific fields are strongly typed. AdditionalProperties map[string]any `yaml:",inline"` } // llmAgentYAMLConfig is the concrete config for a specific agent. type llmAgentYAMLConfig struct { // 1. Embed baseAgentConfig with ",inline". // This pulls "name", "sub_agents", etc. to the top level of the YAML. baseAgentConfig `yaml:",inline"` // 2. Define the "extra" fields specific to this agent here. Model string `yaml:"model"` Instruction string `yaml:"instruction"` Tools []ToolConfig `yaml:"tools,omitempty"` DisallowTransferToPeers bool `yaml:"disallow_transfer_to_peers,omitempty"` DisallowTransferToParent bool `yaml:"disallow_transfer_to_parent,omitempty"` GenerateContentConfig *genai.GenerateContentConfig `yaml:"generate_content_config,omitempty"` } func (c *llmAgentYAMLConfig) toLLMAgentConfig(ctx context.Context) (*llmagent.Config, error) { if !googlellm.IsGeminiModel(c.Model) { return nil, fmt.Errorf("model %s is not supported", c.Model) } model, err := gemini.NewModel(ctx, c.Model, &genai.ClientConfig{ APIKey: os.Getenv("GOOGLE_API_KEY"), }) if err != nil { return nil, fmt.Errorf("failed to create model: %w", err) } subAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents) if err != nil { return nil, err } tools, toolsets, err := resolveTools(ctx, c.ConfigPath, c.Tools) if err != nil { return nil, err } beforeCallbacks, err := resolveCallbacks[agent.BeforeAgentCallback](ctx, c.BeforeAgentCallbacks) if err != nil { return nil, err } afterCallbacks, err := resolveCallbacks[agent.AfterAgentCallback](ctx, c.AfterAgentCallbacks) if err != nil { return nil, err } return &llmagent.Config{ Name: c.Name, Description: c.Description, SubAgents: subAgents, Model: model, Instruction: c.Instruction, DisallowTransferToPeers: c.DisallowTransferToPeers, DisallowTransferToParent: c.DisallowTransferToParent, Tools: tools, Toolsets: toolsets, GenerateContentConfig: c.GenerateContentConfig, BeforeAgentCallbacks: beforeCallbacks, AfterAgentCallbacks: afterCallbacks, }, nil } type loopAgentYAMLConfig struct { baseAgentConfig `yaml:",inline"` MaxIterations uint `yaml:"max_iterations"` } func (c *loopAgentYAMLConfig) toLoopAgentConfig(ctx context.Context) (*loopagent.Config, error) { subAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents) if err != nil { return nil, err } return &loopagent.Config{ AgentConfig: agent.Config{ Name: c.Name, Description: c.Description, SubAgents: subAgents, }, MaxIterations: c.MaxIterations, }, nil } // ParallelAgentYAMLConfig is the concrete config for a specific agent. type parallelAgentYAMLConfig struct { baseAgentConfig `yaml:",inline"` } func (c *parallelAgentYAMLConfig) toParallelAgentConfig(ctx context.Context) (*parallelagent.Config, error) { subAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents) if err != nil { return nil, err } return ¶llelagent.Config{ AgentConfig: agent.Config{ Name: c.Name, Description: c.Description, SubAgents: subAgents, }, }, nil } // SequentialAgentYAMLConfig is the concrete config for a specific agent. type sequentialAgentYAMLConfig struct { baseAgentConfig `yaml:",inline"` } func (c *sequentialAgentYAMLConfig) toSequentialAgentConfig(ctx context.Context) (*sequentialagent.Config, error) { subAgents, err := resolveSubAgents(ctx, c.ConfigPath, c.SubAgents) if err != nil { return nil, err } return &sequentialagent.Config{ AgentConfig: agent.Config{ Name: c.Name, Description: c.Description, SubAgents: subAgents, }, }, nil } func resolveSubAgents(ctx context.Context, parentPath string, refs []agentRefConfig) ([]agent.Agent, error) { var agents []agent.Agent for _, ref := range refs { if ref.ConfigPath != "" { a, err := ResolveAgentReference(ctx, parentPath, ref.ConfigPath) if err != nil { return nil, fmt.Errorf("failed to resolve agent reference %s: %w", ref.ConfigPath, err) } agents = append(agents, a) } else if ref.Code != "" { return nil, fmt.Errorf("inline code agent references are not yet supported for %s", ref.Code) } } return agents, nil } type contextKey string const parentPathKey contextKey = "parentPath" func resolveTools(ctx context.Context, parentPath string, toolConfigs []ToolConfig) ([]tool.Tool, []tool.Toolset, error) { var tools []tool.Tool var toolsets []tool.Toolset for _, tc := range toolConfigs { if tc.Name != "" { ctx = context.WithValue(ctx, parentPathKey, parentPath) a, ts, err := ResolveToolReference(ctx, tc.Name, tc.Args) if err != nil { return nil, nil, fmt.Errorf("failed to resolve tool reference %s: %w", tc.Name, err) } if a != nil { tools = append(tools, a) } if ts != nil { toolsets = append(toolsets, ts) } } } return tools, toolsets, nil } func resolveCallbacks[T any](ctx context.Context, callbacks []codeConfig) ([]T, error) { var cbs []T for _, ref := range callbacks { if ref.Name != "" { c, err := ResolveCallbackReference(ctx, ref.Name) if err != nil { return nil, fmt.Errorf("failed to resolve callback reference %s: %w", ref.Name, err) } cb, ok := c.(T) if !ok { return nil, fmt.Errorf("callback %s is of type %T and not %T", ref.Name, c, *new(T)) } cbs = append(cbs, cb) } } return cbs, nil } ================================================ FILE: internal/configurable/configurable_utils.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // configutils.go provides utility functions for working with configurable agents. package configurable import ( "context" "encoding/json" "fmt" "os" "os/exec" "path/filepath" "sync" "github.com/modelcontextprotocol/go-sdk/mcp" "gopkg.in/yaml.v3" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" "google.golang.org/adk/tool/exampletool" "google.golang.org/adk/tool/exitlooptool" "google.golang.org/adk/tool/geminitool" "google.golang.org/adk/tool/mcptoolset" ) type AgentFactory func(ctx context.Context, configBytes []byte, configPath string) (agent.Agent, error) type ToolFactory func(ctx context.Context, args map[string]any) (tool.Tool, error) type ToolsetFactory func(ctx context.Context, args map[string]any) (tool.Toolset, error) var ( registryMu sync.RWMutex registry = make(map[string]AgentFactory) agentRegistry = make(map[string]agent.Agent) toolRegistry = make(map[string]any) callbackRegistry = make(map[string]any) ) func init() { if err := Register("LlmAgent", newLLMAgent); err != nil { panic(err) } if err := Register("LoopAgent", newLoopAgent); err != nil { panic(err) } if err := Register("ParallelAgent", newParallelAgent); err != nil { panic(err) } if err := Register("SequentialAgent", newSequentialAgent); err != nil { panic(err) } err := RegisterToolFactory("exit_loop", func(_ context.Context, _ map[string]any) (tool.Tool, error) { return exitlooptool.New() }) if err != nil { panic(err) } err = RegisterToolFactory("google_search", func(_ context.Context, _ map[string]any) (tool.Tool, error) { return geminitool.GoogleSearch{}, nil }) if err != nil { panic(err) } err = RegisterToolFactory("url_context", func(_ context.Context, _ map[string]any) (tool.Tool, error) { return geminitool.New("url_context", "url context", &genai.Tool{URLContext: &genai.URLContext{}}), nil }) if err != nil { panic(err) } err = RegisterToolFactory("google_maps_grounding", func(_ context.Context, _ map[string]any) (tool.Tool, error) { return geminitool.New("google_maps_grounding", "google maps grounding", &genai.Tool{GoogleMaps: &genai.GoogleMaps{}}), nil }) if err != nil { panic(err) } err = RegisterToolFactory("AgentTool", func(ctx context.Context, args map[string]any) (tool.Tool, error) { if args == nil { return nil, fmt.Errorf("args is nil") } a, ok := args["agent"].(map[string]any) if !ok { return nil, fmt.Errorf("agent not found in args") } skipSummarization := false if ss, ok := a["skip_summarization"].(bool); ok { skipSummarization = ss } parentPath, ok := ctx.Value(parentPathKey).(string) if !ok { return nil, fmt.Errorf("parentPath not found in context") } if configPath, ok := a["config_path"].(string); ok { ag, err := ResolveAgentReference(ctx, parentPath, configPath) if err != nil { return nil, err } return agenttool.New(ag, &agenttool.Config{SkipSummarization: skipSummarization}), nil } else { return nil, fmt.Errorf("config_path not found in args") } }) if err != nil { panic(err) } err = RegisterToolFactory("LongRunningFunctionTool", func(ctx context.Context, args map[string]any) (tool.Tool, error) { if args == nil { return nil, fmt.Errorf("args is nil") } funcName, ok := args["func"].(string) if !ok { return nil, fmt.Errorf("func not found in args") } tool, _, err := ResolveToolReference(ctx, funcName, args) if err != nil { return nil, err } if tool == nil { return nil, fmt.Errorf("tool '%s' not found", funcName) } return tool, nil }) if err != nil { panic(err) } err = RegisterToolFactory("ExampleTool", func(ctx context.Context, args map[string]any) (tool.Tool, error) { if args == nil { return nil, fmt.Errorf("args is nil") } raw, ok := args["examples"] if !ok { return nil, fmt.Errorf("examples not found in args") } // 1. Cast the top-level 'examples' to a generic slice examplesSlice, ok := raw.([]any) if !ok { return nil, fmt.Errorf("examples is not a list") } // 2. Iterate and normalize the 'output' field for i, item := range examplesSlice { m, ok := item.(map[string]any) if !ok { continue } output := m["output"] if output == nil { continue } // Check if 'output' is NOT a slice. If it's a single object, // wrap it in a new slice []any{output} if _, isSlice := output.([]any); !isSlice { m["output"] = []any{output} examplesSlice[i] = m } } // 3. Now marshal/unmarshal as usual into your clean struct bytes, _ := json.Marshal(examplesSlice) var examples []*exampletool.Example if err := json.Unmarshal(bytes, &examples); err != nil { return nil, fmt.Errorf("failed to decode normalized examples: %w", err) } return exampletool.New(exampletool.ExampleToolConfig{ Examples: examples, }) }) if err != nil { panic(err) } err = RegisterToolsetFactory("McpToolset", func(ctx context.Context, args map[string]any) (tool.Toolset, error) { stdioConnectionParams, ok := args["stdio_connection_params"].(map[string]any) if !ok { return nil, fmt.Errorf("stdio_connection_params not found in args") } serverParams, ok := stdioConnectionParams["server_params"].(map[string]any) if !ok { return nil, fmt.Errorf("server_params not found in stdio_connection_params") } command, ok := serverParams["command"].(string) if !ok { return nil, fmt.Errorf("command not found in server_params") } serverArgs, ok := serverParams["args"].([]any) if !ok { return nil, fmt.Errorf("args not found in server_params") } toolFilter, ok := args["tool_filter"].([]any) if !ok { return nil, fmt.Errorf("tool_filter not found in args") } serverArgsStr := make([]string, len(serverArgs)) for i, arg := range serverArgs { serverArgsStr[i] = arg.(string) } toolFilterStr := make([]string, len(toolFilter)) for i, t := range toolFilter { toolFilterStr[i] = t.(string) } mcpSet, err := mcptoolset.New(mcptoolset.Config{ Transport: &mcp.CommandTransport{ Command: exec.Command(command, serverArgsStr...), }, ToolFilter: tool.StringPredicate(toolFilterStr), }) if err != nil { return nil, fmt.Errorf("failed to create mcp toolset: %v", err) } return mcpSet, nil }) if err != nil { panic(err) } } // Register allows concrete implementations to add themselves to the system. // This replaces Python's dynamic importlib logic. func Register(name string, factory AgentFactory) error { registryMu.Lock() defer registryMu.Unlock() if _, dup := registry[name]; dup { return fmt.Errorf("Register called twice for agent %s", name) } registry[name] = factory return nil } // RegisterToolFactory allows concrete implementations to add themselves to the system. func RegisterToolFactory(name string, factory ToolFactory) error { registryMu.Lock() defer registryMu.Unlock() if _, dup := toolRegistry[name]; dup { return fmt.Errorf("RegisterToolFactory called twice for tool %s", name) } toolRegistry[name] = factory return nil } func RegisterToolsetFactory(name string, factory ToolsetFactory) error { registryMu.Lock() defer registryMu.Unlock() if _, dup := toolRegistry[name]; dup { return fmt.Errorf("RegisterToolsetFactory called twice for toolset %s", name) } toolRegistry[name] = factory return nil } func RegisterCallback(name string, callback any) error { registryMu.Lock() defer registryMu.Unlock() if _, dup := callbackRegistry[name]; dup { return fmt.Errorf("RegisterCallback called twice for callback %s", name) } callbackRegistry[name] = callback return nil } // FromConfig builds an agent from a config file path. // Equivalent to: def from_config(config_path: str) -> BaseAgent func FromConfig(ctx context.Context, configPath string) (agent.Agent, error) { absPath, err := filepath.Abs(configPath) if err != nil { return nil, fmt.Errorf("failed to resolve absolute path: %w", err) } // 1. Read the file data, err := os.ReadFile(absPath) if err != nil { if os.IsNotExist(err) { return nil, fmt.Errorf("config file not found: %s", absPath) } return nil, err } // 2. Peek at the "agent_class" field to know which factory to use. var baseConfig baseAgentConfig if err := yaml.Unmarshal(data, &baseConfig); err != nil { return nil, fmt.Errorf("invalid YAML content: %w", err) } // Default fallback similar to Python's handling agentClass := baseConfig.AgentClass if agentClass == "" { agentClass = "LlmAgent" } // 3. Resolve the factory (The Go equivalent of _resolve_agent_class) registryMu.RLock() factory, exists := registry[agentClass] registryMu.RUnlock() if !exists { return nil, fmt.Errorf("invalid agent class '%s': not registered. Ensure the package is imported", agentClass) } // 4. Delegate creation to the specific factory. // We pass the raw data so the factory can unmarshal into its specific Config struct. return factory(ctx, data, absPath) } func ResolveToolReference(ctx context.Context, toolName string, args map[string]any) (tool.Tool, tool.Toolset, error) { if toolName == "" { return nil, nil, fmt.Errorf("tool name cannot be empty") } registryMu.RLock() if t, ok := toolRegistry[toolName]; ok { registryMu.RUnlock() if factory, ok := t.(ToolFactory); ok { tool, err := factory(ctx, args) return tool, nil, err } if toolsetFactory, ok := t.(ToolsetFactory); ok { toolset, err := toolsetFactory(ctx, args) return nil, toolset, err } return nil, nil, fmt.Errorf("tool '%s' is not a tool or toolset factory", toolName) } registryMu.RUnlock() return nil, nil, fmt.Errorf("tool '%s' not found", toolName) } func ResolveCallbackReference(ctx context.Context, callbackName string) (any, error) { if callbackName == "" { return nil, fmt.Errorf("callback name cannot be empty") } registryMu.RLock() if c, ok := callbackRegistry[callbackName]; ok { registryMu.RUnlock() return c, nil } registryMu.RUnlock() return nil, fmt.Errorf("callback '%s' not found", callbackName) } // ResolveAgentReference builds an agent from a reference config. func ResolveAgentReference(ctx context.Context, parentPath, refPath string) (agent.Agent, error) { if refPath == "" { return nil, fmt.Errorf("agent reference path cannot be empty") } targetPath := refPath // Handle relative paths if !filepath.IsAbs(refPath) { targetPath = filepath.Join(filepath.Dir(parentPath), refPath) } absPath, err := filepath.Abs(targetPath) if err != nil { return nil, fmt.Errorf("failed to resolve absolute path: %w", err) } registryMu.RLock() if a, ok := agentRegistry[absPath]; ok { registryMu.RUnlock() return a, nil } registryMu.RUnlock() a, err := FromConfig(ctx, absPath) if err != nil { return nil, err } registryMu.Lock() defer registryMu.Unlock() if existing, ok := agentRegistry[absPath]; ok { return existing, nil } agentRegistry[absPath] = a return a, nil } // NewLLMAgent is the factory function registered in the system. func newLLMAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) { var cfg llmAgentYAMLConfig // Unmarshal parses the shared fields (Name) into BaseAgentConfig // AND the specific fields (ModelName) into LLMAgentConfig simultaneously. if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("failed to parse LLM agent config: %w", err) } // Validation Logic (Pydantic equivalent) if cfg.Name == "" { return nil, fmt.Errorf("'name' is required") } if cfg.Model == "" { return nil, fmt.Errorf("'model' is required for LlmAgent") } cfg.ConfigPath = configPath agentConfig, err := cfg.toLLMAgentConfig(ctx) if err != nil { return nil, fmt.Errorf("failed to create LLM agent config: %w", err) } return llmagent.New(*agentConfig) } func newLoopAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) { var cfg loopAgentYAMLConfig // Unmarshal parses the shared fields (Name) into BaseAgentConfig // AND the specific fields (ModelName) into LLMAgentConfig simultaneously. if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("failed to parse Loop agent config: %w", err) } // Validation Logic (Pydantic equivalent) if cfg.Name == "" { return nil, fmt.Errorf("'name' is required") } cfg.ConfigPath = configPath agentConfig, err := cfg.toLoopAgentConfig(ctx) if err != nil { return nil, fmt.Errorf("failed to create Loop agent config: %w", err) } return loopagent.New(*agentConfig) } func newParallelAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) { var cfg parallelAgentYAMLConfig // Unmarshal parses the shared fields (Name) into BaseAgentConfig // AND the specific fields (ModelName) into LLMAgentConfig simultaneously. if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("failed to parse Parallel agent config: %w", err) } // Validation Logic (Pydantic equivalent) if cfg.Name == "" { return nil, fmt.Errorf("'name' is required") } cfg.ConfigPath = configPath agentConfig, err := cfg.toParallelAgentConfig(ctx) if err != nil { return nil, fmt.Errorf("failed to create Parallel agent config: %w", err) } return parallelagent.New(*agentConfig) } func newSequentialAgent(ctx context.Context, data []byte, configPath string) (agent.Agent, error) { var cfg sequentialAgentYAMLConfig // Unmarshal parses the shared fields (Name) into BaseAgentConfig // AND the specific fields (ModelName) into LLMAgentConfig simultaneously. if err := yaml.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("failed to parse Sequential agent config: %w", err) } // Validation Logic (Pydantic equivalent) if cfg.Name == "" { return nil, fmt.Errorf("'name' is required") } cfg.ConfigPath = configPath agentConfig, err := cfg.toSequentialAgentConfig(ctx) if err != nil { return nil, fmt.Errorf("failed to create Sequential agent config: %w", err) } return sequentialagent.New(*agentConfig) } ================================================ FILE: internal/configurable/conformance/callbacks.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package conformance import ( "errors" "fmt" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/configurable" "google.golang.org/adk/session" ) func beforeAgentCallback1(ctx agent.CallbackContext) (*genai.Content, error) { err := ctx.State().Set("before_agent_callback_state_key", "value1") return nil, err } func beforeAgentCallback2(ctx agent.CallbackContext) (*genai.Content, error) { val, err := ctx.State().Get("before_agent_callback_state_key") if err != nil { return nil, err } s, ok := val.(string) if !ok { return nil, fmt.Errorf("state value for 'before_agent_callback_state_key' is not a string, but %T", val) } err = ctx.State().Set("before_agent_callback_state_key", s+"+value2") return nil, err } func shortcutAgentExecution(ctx agent.CallbackContext) (*genai.Content, error) { val, err := ctx.State().Get("conversation_limit_reached") if err != nil { if !errors.Is(err, session.ErrStateKeyNotExist) { return nil, err } err = ctx.State().Set("conversation_limit_reached", "True") return nil, err } if limitReached, ok := val.(string); ok && limitReached == "True" { return &genai.Content{ Parts: []*genai.Part{ {Text: "Sorry, you have reached the limit of the conversation."}, }, Role: "model", }, nil } return nil, nil } func afterAgentCallback1(ctx agent.CallbackContext) (*genai.Content, error) { err := ctx.State().Set("after_agent_callback_state_key", "value1") return nil, err } func afterAgentCallback2(ctx agent.CallbackContext) (*genai.Content, error) { val, err := ctx.State().Get("after_agent_callback_state_key") if err != nil { return nil, err } s, ok := val.(string) if !ok { return nil, fmt.Errorf("state value for 'after_agent_callback_state_key' is not a string, but %T", val) } err = ctx.State().Set("after_agent_callback_state_key", s+"+value2") return nil, err } func RegisterCallbacks() error { err := configurable.RegisterCallback("callback_agent_001.callbacks.before_agent_callback1", agent.BeforeAgentCallback(beforeAgentCallback1)) if err != nil { return fmt.Errorf("error registering before agent callback 1: %w", err) } err = configurable.RegisterCallback("callback_agent_001.callbacks.before_agent_callback2", agent.BeforeAgentCallback(beforeAgentCallback2)) if err != nil { return fmt.Errorf("error registering before agent callback 2: %w", err) } err = configurable.RegisterCallback("callback_agent_002.callbacks.shortcut_agent_execution", agent.BeforeAgentCallback(shortcutAgentExecution)) if err != nil { return fmt.Errorf("error registering shortcut agent execution: %w", err) } err = configurable.RegisterCallback("callback_agent_003.callbacks.after_agent_callback1", agent.AfterAgentCallback(afterAgentCallback1)) if err != nil { return fmt.Errorf("error registering after agent callback 1: %w", err) } err = configurable.RegisterCallback("callback_agent_003.callbacks.after_agent_callback2", agent.AfterAgentCallback(afterAgentCallback2)) if err != nil { return fmt.Errorf("error registering after agent callback 2: %w", err) } return nil } ================================================ FILE: internal/configurable/conformance/functions.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package conformance import ( "context" "fmt" "hash/fnv" "math" "regexp" "google.golang.org/adk/internal/configurable" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) type ValidateEmailArgs struct { Email string `json:"email"` } var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`) func validateEmail(ctx tool.Context, args ValidateEmailArgs) (bool, error) { return emailRegex.MatchString(args.Email), nil } func getUserID(ctx tool.Context, args ValidateEmailArgs) (int, error) { valid, err := validateEmail(ctx, args) if err != nil { return 0, err } if !valid { return 0, fmt.Errorf("invalid email format provided") } // 1. Create a new FNV-1a 32-bit hasher h := fnv.New32a() // 2. Write the email string as bytes to the hasher h.Write([]byte(args.Email)) // 3. Get the resulting 32-bit unsigned integer result := h.Sum32() // 4. Modulo 10000 to keep it in range return int(result % 10000), nil } func createBooking(ctx tool.Context, args ValidateEmailArgs) (map[string]any, error) { userID, err := getUserID(ctx, args) if err != nil { return nil, err } return map[string]any{ "user_id": userID, "is_confirmed": true, "details": "Booking created for user " + args.Email, "user_id_type": "int", "is_confirmed_type": "bool", "details_type": "string", }, nil } type FlightPreferences struct { CabinClass string `json:"cabin_class"` MaxStops int `json:"max_stops"` PreferredAirline string `json:"preferred_airline"` FlexibleDates bool `json:"flexible_dates"` } type TripDetails struct { Origin string `json:"origin"` Destination string `json:"destination"` DepartureDate string `json:"departure_date"` ReturnDate string `json:"return_date"` } type SearchFlightsArgs struct { Trip TripDetails `json:"trip"` Preferences *FlightPreferences `json:"preferences"` } func searchFlights(ctx tool.Context, args SearchFlightsArgs) (map[string]any, error) { if args.Preferences == nil { args.Preferences = &FlightPreferences{ CabinClass: "Economy", MaxStops: 1, FlexibleDates: false, } } tripType := "one-way" if args.Trip.ReturnDate != "" { tripType = "round-trip" } result := map[string]any{ "trip_type": tripType, "route": args.Trip.Origin + " to " + args.Trip.Destination, "departure_date": args.Trip.DepartureDate, "return_date": args.Trip.ReturnDate, "cabin_class": args.Preferences.CabinClass, "max_stops": args.Preferences.MaxStops, "preferred_airline": args.Preferences.PreferredAirline, "flexible_dates": args.Preferences.FlexibleDates, "search_status": "completed", } airline := args.Preferences.PreferredAirline if airline == "" { airline = "Various Airlines" } stopsDesc := "direct" if args.Preferences.MaxStops > 0 { stopsDesc = fmt.Sprintf("up to %d stops", args.Preferences.MaxStops) } flights := []string{ fmt.Sprintf("%s - %s %s flight with %s", airline, tripType, args.Preferences.CabinClass, stopsDesc), fmt.Sprintf("Departure: %s", args.Trip.DepartureDate), } if args.Trip.ReturnDate != "" { flights = append(flights, fmt.Sprintf("Return: %s", args.Trip.ReturnDate)) } result["available_flights"] = flights return result, nil } type CalculateTripCostArgs struct { BaseFare float64 `json:"base_fare"` NumPassengers int `json:"num_passengers"` Insurance bool `json:"insurance"` BaggageCount *int `json:"baggage_count"` } func calculateTripCost(ctx tool.Context, args CalculateTripCostArgs) (map[string]any, error) { // Handle Python's default num_passengers=1 logic // In Go, if the caller passes 0, we should ensure at least 1 // or handle it based on your specific business logic. if args.NumPassengers <= 0 { args.NumPassengers = 1 } subtotal := args.BaseFare * float64(args.NumPassengers) // Add insurance (10% of base fare per passenger) insuranceCost := 0.0 if args.Insurance { insuranceCost = subtotal * 0.1 } // Add baggage fees baggageCost := 0.0 var displayBaggage any = nil if args.BaggageCount != nil { count := *args.BaggageCount displayBaggage = count // First bag free, $35 per additional bag per passenger chargeableBags := math.Max(0, float64(count-1)) baggageCost = chargeableBags * 35 * float64(args.NumPassengers) } total := subtotal + insuranceCost + baggageCost return map[string]any{ "base_fare": args.BaseFare, "num_passengers": args.NumPassengers, "subtotal": subtotal, "insurance_included": args.Insurance, "insurance_cost": insuranceCost, "baggage_count": displayBaggage, "baggage_cost": baggageCost, "total_cost": total, }, nil } type reimburseArgs struct { Purpose string `json:"purpose"` Amount float64 `json:"amount"` } func reimburse(ctx tool.Context, args reimburseArgs) (map[string]any, error) { return map[string]any{ "status": "ok", }, nil } type askForApprovalArgs struct { Purpose string `json:"purpose"` Amount float64 `json:"amount"` } func askForApproval(ctx tool.Context, args askForApprovalArgs) (map[string]any, error) { return map[string]any{ "status": "pending", "amount": args.Amount, "ticketId": "reimbursement-ticket-001", }, nil } func RegisterFunctions() error { validateEmailTool, err := functiontool.New(functiontool.Config{ Name: "validate_email", Description: "Checks if the provided string is a valid email format.", }, validateEmail) if err != nil { return fmt.Errorf("error creating validate email tool: %w", err) } getUserIDTool, err := functiontool.New(functiontool.Config{ Name: "get_user_id", Description: "Retrieves a user ID based on their email.", }, getUserID) if err != nil { return fmt.Errorf("error creating get user ID tool: %w", err) } createBookingTool, err := functiontool.New(functiontool.Config{ Name: "create_booking", Description: `Creates a booking for a user. Args: user_id: The unique identifier for the user. is_confirmed: Whether the booking is confirmed. details: Any additional details for the booking. Returns: A dictionary containing the booking information and the types of the received arguments. `, }, createBooking) if err != nil { return fmt.Errorf("error creating create booking tool: %w", err) } searchFlightsTool, err := functiontool.New(functiontool.Config{ Name: "search_flights", Description: `Search for flights based on trip details and preferences. This function demonstrates advanced parameter handling: - Pydantic models as parameters (trip, preferences) - Optional/nullable parameters (preferences, return_date, preferred_airline) - Default values (cabin_class, max_stops, flexible_dates) Args: trip: Core trip information including origin, destination, and dates. preferences: Optional flight preferences. If not provided, uses defaults. Returns: A dictionary containing search results and parameters received. `, }, searchFlights) if err != nil { return fmt.Errorf("error creating search flights tool: %w", err) } calculateTripCostTool, err := functiontool.New(functiontool.Config{ Name: "calculate_trip_cost", Description: `Calculate total trip cost with various optional charges. This function demonstrates: - Mix of required and optional parameters - Default values for common cases - Nullable parameter that affects calculation logic Args: base_fare: Base ticket price per passenger. num_passengers: Number of passengers (default: 1). insurance: Whether to add travel insurance (default: False). baggage_count: Number of checked bags per passenger, or None for carry-on only. Returns: A dictionary with cost breakdown. `, }, calculateTripCost) if err != nil { return fmt.Errorf("error creating calculate trip cost tool: %w", err) } reimburseTool, err := functiontool.New(functiontool.Config{ Name: "reimburse", Description: `Reimburse the amount of money to the employee.`, }, reimburse) if err != nil { return fmt.Errorf("error creating reimburse tool: %w", err) } askForApprovalTool, err := functiontool.New(functiontool.Config{ Name: "ask_for_approval", Description: `Ask for approval for the reimbursement.`, IsLongRunning: true, }, askForApproval) if err != nil { return fmt.Errorf("error creating ask for approval tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_002.tools.validate_email", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return validateEmailTool, nil }) if err != nil { return fmt.Errorf("error registering validate email tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_002.tools.get_user_id", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return getUserIDTool, nil }) if err != nil { return fmt.Errorf("error registering get user ID tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_002.tools.create_booking", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return createBookingTool, nil }) if err != nil { return fmt.Errorf("error registering create booking tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_004.tools.search_flights", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return searchFlightsTool, nil }) if err != nil { return fmt.Errorf("error registering search flights tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_004.tools.calculate_trip_cost", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return calculateTripCostTool, nil }) if err != nil { return fmt.Errorf("error registering calculate trip cost tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_009.tools.reimburse", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return reimburseTool, nil }) if err != nil { return fmt.Errorf("error registering reimburse tool: %w", err) } err = configurable.RegisterToolFactory("tools_agent_009.tools.ask_for_approval", func(ctx context.Context, _ map[string]any) (tool.Tool, error) { return askForApprovalTool, nil }) if err != nil { return fmt.Errorf("error registering ask for approval tool: %w", err) } return nil } ================================================ FILE: internal/configurable/conformance/loader.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package conformance import ( "fmt" "sort" "google.golang.org/adk/agent" ) type conformanceAgentLoader struct { agentMap map[string]agent.Agent agentsNames []string } // NewConformanceAgentLoader returns a new AgentLoader with the given root Agent and other agents. // Returns an error if more than one agent (including root) shares the same name func NewConformanceAgentLoader(agentMap map[string]agent.Agent) (agent.Loader, error) { agentsNames := make([]string, 0, len(agentMap)) for name := range agentMap { agentsNames = append(agentsNames, name) } sort.Strings(agentsNames) return &conformanceAgentLoader{ agentMap: agentMap, agentsNames: agentsNames, }, nil } // conformanceAgentLoader implements AgentLoader. Returns the list of all agents' names (including root agent) func (m *conformanceAgentLoader) ListAgents() []string { return m.agentsNames } // conformanceAgentLoader implements LoadAgent. Returns an agent with given name or error if no such an agent is found func (m *conformanceAgentLoader) LoadAgent(name string) (agent.Agent, error) { agent, ok := m.agentMap[name] if !ok { return nil, fmt.Errorf("agent %s not found. Please specify one of those: %v", name, m.ListAgents()) } return agent, nil } // conformanceAgentLoader implements LoadAgent. func (m *conformanceAgentLoader) RootAgent() agent.Agent { if len(m.agentsNames) == 0 { return nil } return m.agentMap[m.agentsNames[0]] } ================================================ FILE: internal/configurable/conformance/replayplugin/invocation_replay_state.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package replayplugin import ( "sync" "google.golang.org/adk/internal/configurable/conformance/replayplugin/recording" ) // invocationReplayState tracks per-invocation replay state to isolate concurrent runs. type invocationReplayState struct { testCasePath string userMessageIndex int recordings *recording.Recordings // Per-agent replay indices for parallel execution // key: agent_name -> current replay index for that agent agentReplayIndices map[string]int curIndex int mu sync.Mutex cond *sync.Cond } // newInvocationReplayState behaves as the constructor. func newInvocationReplayState(testCasePath string, userMessageIndex int, recs *recording.Recordings) *invocationReplayState { state := &invocationReplayState{ testCasePath: testCasePath, userMessageIndex: userMessageIndex, recordings: recs, agentReplayIndices: make(map[string]int), curIndex: 0, mu: sync.Mutex{}, } state.cond = sync.NewCond(&state.mu) return state } // GetTestCasePath returns the test case path. func (s *invocationReplayState) GetTestCasePath() string { return s.testCasePath } // GetUserMessageIndex returns the user message index. func (s *invocationReplayState) GetUserMessageIndex() int { return s.userMessageIndex } // GetRecordings returns the recordings object. func (s *invocationReplayState) GetRecordings() *recording.Recordings { return s.recordings } // GetAgentReplayIndex returns the index for the agent. // In Go, looking up a missing key returns the zero value (0), // so getOrDefault is intrinsic to the language for integers. func (s *invocationReplayState) GetAgentReplayIndex(agentName string) (int, bool) { s.mu.Lock() defer s.mu.Unlock() val, ok := s.agentReplayIndices[agentName] return val, ok } ================================================ FILE: internal/configurable/conformance/replayplugin/recording/recording.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package recording import ( "google.golang.org/genai" "google.golang.org/adk/model" ) // Recordings represents all recordings in chronological order. type Recordings struct { // Chronological list of all recordings. Recordings []Recording `yaml:"recordings"` } // Recording represents a single interaction recording, ordered by request timestamp. type Recording struct { // Index of the user message this recording belongs to (0-based). UserMessageIndex int `yaml:"usermessageindex"` // Name of the agent. AgentName string `yaml:"agentname"` // oneof fields - start // LLM request-response pair. LLMRecording *LLMRecording `yaml:"llmrecording,omitempty"` // Tool call-response pair. ToolRecording *ToolRecording `yaml:"toolrecording,omitempty"` // oneof fields - end // Index of the recording in the recordings list (0-based). Index int `yaml:"-"` } // LLMRecording represents a paired LLM request and response. type LLMRecording struct { // Required. The LLM request. LLMRequest *model.LLMRequest `yaml:"llmrequest,omitempty"` // Required. The LLM response. LLMResponse *model.LLMResponse `yaml:"llmresponse,omitempty"` } // ToolRecording represents a paired tool call and response. type ToolRecording struct { // Required. The tool call. ToolCall *genai.FunctionCall `yaml:"toolcall,omitempty"` // Required. The tool response. ToolResponse *genai.FunctionResponse `yaml:"toolresponse,omitempty"` } ================================================ FILE: internal/configurable/conformance/replayplugin/replay_plugin.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package replayplugin // Package replayplugin provides an ADK plugin for replaying recorded LLM and tool interactions. // // This plugin is primarily used for conformance testing, allowing deterministic execution // of agents by mocking LLM responses and tool outputs based on a pre-recorded session. // // The plugin operates by intercepting: // - BeforeRun: To initialize replay state from configuration. // - BeforeModel: To match LLM requests against recordings and return mock responses. // - BeforeTool: To match tool calls against recordings and return mock outputs. // - AfterRun: To clean up invocation state. // // Replay configuration is expected in the session state under the key "_adk_replay_config", // containing: // - "dir": Path to the directory containing "generated-recordings.yaml". // - "user_message_index": The index of the user message to replay. import ( "encoding/json" "fmt" "os" "path/filepath" "regexp" "strings" "sync" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "gopkg.in/yaml.v3" "google.golang.org/adk/agent" "google.golang.org/adk/internal/configurable/conformance/replayplugin/recording" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) // New creates an instance of the replay plugin. // // allowedBaseDir specifies the root directory from which recordings can be loaded. // Attempts to load recordings from outside this directory will result in an error. func New(allowedBaseDir string) (*plugin.Plugin, error) { p := &replayPlugin{ invocationStates: make(map[string]*invocationReplayState), allowedBaseDir: allowedBaseDir, } return plugin.New(plugin.Config{ Name: "replay_plugin", BeforeRunCallback: p.beforeRun, AfterRunCallback: p.afterRun, BeforeModelCallback: p.beforeModel, BeforeToolCallback: p.beforeTool, }) } // MustNew is like New but panics if there is an error. func MustNew(allowedBaseDir string) *plugin.Plugin { p, err := New(allowedBaseDir) if err != nil { panic(err) } return p } type replayPlugin struct { mu sync.Mutex // Mutex to protect the map invocationStates map[string]*invocationReplayState allowedBaseDir string } // beforeRun initializes the replay state for the current invocation if replay mode is enabled. func (p *replayPlugin) beforeRun(ctx agent.InvocationContext) (*genai.Content, error) { if ctx.Session() == nil { return nil, nil } on, err := p.isReplayModeOn(ctx.Session().State()) if err != nil { return nil, err } if !on { return nil, nil } _, err = p.loadInvocationState(ctx) if err != nil { return nil, err } return nil, nil } // beforeModel intercepts LLM requests, verifies them against the recording, and returns the recorded response. func (p *replayPlugin) beforeModel(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) { on, err := p.isReplayModeOn(ctx.State()) if err != nil { return nil, err } if !on { return nil, nil } invocationState, err := p.getInvocationState(ctx) if err != nil { return nil, err } agentName := ctx.AgentName() recording, err := p.verifyAndGetNextLLMRecordingForAgent(invocationState, agentName, req) if err != nil { return nil, err } return recording.LLMResponse, nil } // beforeTool intercepts tool calls, verifies them against the recording, and returns the recorded response. func (p *replayPlugin) beforeTool(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) { on, err := p.isReplayModeOn(ctx.State()) if err != nil { return nil, err } if !on { return nil, nil } invocationState, err := p.getInvocationState(ctx) if err != nil { return nil, err } agentName := ctx.AgentName() recording, err := p.verifyAndGetNextToolRecordingForAgent(invocationState, agentName, t, args) if err != nil { return nil, err } typeName := fmt.Sprintf("%T", t) if !strings.HasSuffix(typeName, "agentTool") { // TODO: support replay requests and responses from AgentTool. if ft, ok := t.(toolinternal.FunctionTool); ok { _, err := ft.Run(ctx, args) if err != nil { fmt.Println("Error calling tool:", err) } } } return recording.ToolResponse.Response, nil } // afterRun cleans up the invocation state. func (p *replayPlugin) afterRun(ctx agent.InvocationContext) { if ctx.Session() == nil { return } sessionState := ctx.Session().State() on, err := p.isReplayModeOn(sessionState) if err != nil || !on { return } p.mu.Lock() delete(p.invocationStates, ctx.InvocationID()) p.mu.Unlock() } // isReplayModeOn checks if replay mode is enabled in the session state and validates the configuration. func (p *replayPlugin) isReplayModeOn(sessionState session.State) (bool, error) { if sessionState == nil { return false, nil } configVal, err := sessionState.Get("_adk_replay_config") // If the key doesn't exist or there's an error, we treat it as disabled. if err != nil { return false, nil } config, ok := configVal.(map[string]any) if !ok { return false, nil } caseDirVal, ok := config["dir"] if !ok { return false, nil } caseDir, ok := caseDirVal.(string) if !ok || caseDir == "" { return false, nil } basePath, err := filepath.Abs(p.allowedBaseDir) if err != nil { return false, fmt.Errorf("invalid path format: %v", err) } requestedAbsPath, err := filepath.Abs(caseDir) if err != nil { return false, fmt.Errorf("invalid path format: %v", err) } rel, err := filepath.Rel(basePath, requestedAbsPath) if err != nil { return false, fmt.Errorf("invalid path format: %v", err) } if strings.HasPrefix(rel, "..") || filepath.IsAbs(rel) { return false, fmt.Errorf("replay config error: 'dir' is not within the allowed base directory") } msgIndexVal, ok := config["user_message_index"] if !ok || msgIndexVal == nil { return false, nil } return true, nil } // getInvocationState retrieves the replay state for the current invocation. func (p *replayPlugin) getInvocationState(ctx agent.CallbackContext) (*invocationReplayState, error) { invocationID := ctx.InvocationID() state, ok := p.invocationStates[invocationID] if !ok { return nil, fmt.Errorf("replay state not initialized. ensure before_run created it") } return state, nil } // loadInvocationState loads the recordings and initializes the replay state for the invocation. func (p *replayPlugin) loadInvocationState(ctx agent.InvocationContext) (*invocationReplayState, error) { invocationID := ctx.InvocationID() // 1. Extract Configuration // We assume ctx.State is map[string]any configVal, err := ctx.Session().State().Get("_adk_replay_config") if err != nil { return nil, fmt.Errorf("replay config error: %w", err) } config, ok := configVal.(map[string]any) if !ok { return nil, fmt.Errorf("replay config error: '_adk_replay_config' is not a valid map") } // 2. Validate Parameters // Safely extract 'dir' caseDir, ok := config["dir"].(string) if !ok || caseDir == "" { return nil, fmt.Errorf("replay config error: 'dir' parameter is missing or empty") } basePath, err := filepath.Abs(p.allowedBaseDir) if err != nil { return nil, fmt.Errorf("invalid path format: %v", err) } requestedAbsPath, err := filepath.Abs(caseDir) if err != nil { return nil, fmt.Errorf("invalid path format: %v", err) } rel, err := filepath.Rel(basePath, requestedAbsPath) if err != nil { return nil, fmt.Errorf("invalid path format: %v", err) } if strings.HasPrefix(rel, "..") || filepath.IsAbs(rel) { return nil, fmt.Errorf("replay config error: 'dir' is not within the allowed base directory") } // Safely extract 'user_message_index' // Note: JSON/YAML unmarshaling into 'any' often results in float64, // so we check for both int and float64 to be robust. var msgIndex int switch v := config["user_message_index"].(type) { case int: msgIndex = v case float64: msgIndex = int(v) default: return nil, fmt.Errorf("replay config error: 'user_message_index' is missing or not a number") } // 3. Load Recordings File recordingsPath := filepath.Join(requestedAbsPath, "generated-recordings.yaml") // Check if file exists if _, err := os.Stat(recordingsPath); os.IsNotExist(err) { return nil, fmt.Errorf("replay config error: recordings file not found: %s", recordingsPath) } // Read file data, err := os.ReadFile(recordingsPath) if err != nil { return nil, fmt.Errorf("failed to read recordings file: %w", err) } // Parse YAML var root yaml.Node if err := yaml.Unmarshal(data, &root); err != nil { return nil, fmt.Errorf("failed to parse recordings from %s: %w", recordingsPath, err) } removeUnderscores(&root) fixTypeMismatches(&root) var recordings recording.Recordings if err := root.Decode(&recordings); err != nil { return nil, fmt.Errorf("failed to decode recordings: %w", err) } // Add index to each recording, based on user message index. Used for parallel execution sync. index := 0 prevMessageId := 0 for i := range recordings.Recordings { if prevMessageId != recordings.Recordings[i].UserMessageIndex { prevMessageId = recordings.Recordings[i].UserMessageIndex index = 0 } recordings.Recordings[i].Index = index index++ } // 4. Create and Store State state := newInvocationReplayState(caseDir, msgIndex, &recordings) p.mu.Lock() p.invocationStates[invocationID] = state p.mu.Unlock() return state, nil } // getNextRecordingForAgent retrieves the next expected recording for the given agent. // It enforces ordering of events within the user message turn to ensure deterministic replay. func getNextRecordingForAgent(state *invocationReplayState, agentName string) (*recording.Recording, error) { // Get current agent index currentAgentIndex, ok := state.GetAgentReplayIndex(agentName) if !ok { currentAgentIndex = 0 } // Filter ALL recordings for this agent and user message index (strict order) agentRecordings := make([]*recording.Recording, 0) for _, recording := range state.recordings.Recordings { if recording.AgentName == agentName && recording.UserMessageIndex == state.userMessageIndex { agentRecordings = append(agentRecordings, &recording) } } // Check if we have enough recordings for this agent if currentAgentIndex >= len(agentRecordings) { return nil, fmt.Errorf("runtime sent more requests than expected for agent '%s' at user_message_index %d. Expected %d, but got request at index %d", agentName, state.userMessageIndex, len(agentRecordings), currentAgentIndex) } // Get the expected recording expectedRecording := agentRecordings[currentAgentIndex] // Wait for the current index to match the expected index // This ensures that we process recordings in the expected order, even if agents are executing in parallel state.mu.Lock() for state.curIndex != expectedRecording.Index { state.cond.Wait() } // FIXME: remove this sleep, move curIndex++ and state cond.Broadcast() to onEvent callback. // This sleep is here to make the replay deterministic, but it's not ideal. time.Sleep(time.Duration(expectedRecording.Index) * time.Millisecond * 10) state.agentReplayIndices[agentName]++ state.curIndex++ state.mu.Unlock() state.cond.Broadcast() return expectedRecording, nil } // verifyAndGetNextLLMRecordingForAgent ensures the next recording is an LLM request and matches the actual request. func (p *replayPlugin) verifyAndGetNextLLMRecordingForAgent(state *invocationReplayState, agentName string, llmRequest *model.LLMRequest) (*recording.LLMRecording, error) { currentAgentIndex, ok := state.GetAgentReplayIndex(agentName) if !ok { currentAgentIndex = 0 } expectedRecording, err := getNextRecordingForAgent(state, agentName) if err != nil { return nil, err } if expectedRecording.LLMRecording == nil { return nil, fmt.Errorf("expected LLM recording for agent '%s' at index %d, but found tool recording", agentName, currentAgentIndex) } // Strict verification of LLM request err = verifyLLMRequestMatch(expectedRecording.LLMRecording.LLMRequest, llmRequest, agentName, currentAgentIndex) if err != nil { return nil, err } return expectedRecording.LLMRecording, nil } // verifyLLMRequestMatch compares the expected LLM request from recording with the actual request. func verifyLLMRequestMatch(expectedLLMRequest, actualLLMRequest *model.LLMRequest, agentName string, agentIndex int) error { // Define options to ignore specific fields. opts := []cmp.Option{ cmpopts.IgnoreFields(genai.FunctionDeclaration{}, "ParametersJsonSchema", "ResponseJsonSchema", "Parameters", "Response"), cmpopts.IgnoreFields(model.LLMRequest{}, "Tools"), cmpopts.IgnoreFields(genai.GenerateContentConfig{}, "Labels"), cmpopts.EquateEmpty(), } if transferToolAny, ok := expectedLLMRequest.Tools["transfer_to_agent"]; ok { transferTool := transferToolAny.(*genai.FunctionDeclaration) transferTool.Description = `Transfer the question to another agent. This tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.` } if expectedLLMRequest.Config != nil { for _, tool := range expectedLLMRequest.Config.Tools { for _, funcDecl := range tool.FunctionDeclarations { if funcDecl.Name == "transfer_to_agent" { funcDecl.Description = `Transfer the question to another agent. This tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.` } } } } // Compare! // cmp.Diff returns an empty string if they are equal, otherwise a human-readable diff. if diff := cmp.Diff(expectedLLMRequest, actualLLMRequest, opts...); diff != "" { for _, content := range expectedLLMRequest.Contents { for _, part := range content.Parts { if part.Text != "" { part.Text = modifyString(part.Text) } } } if diff := cmp.Diff(expectedLLMRequest, actualLLMRequest, opts...); diff != "" { return fmt.Errorf("LLM request mismatch for agent '%s' (index %d):\n%s", agentName, agentIndex, diff) } } return nil } var ( // Matches either "parameters: " or "result: " followed by a JSON-like object/array dataBlockRegex = regexp.MustCompile(`(?i)(parameters|result):\s*([\{\[].*[\}\]])`) // Matches 'key' or 'value' but ignores apostrophes inside words like O'Malley quoteRegex = regexp.MustCompile(`'([^']*)'`) // Matches Python/Pseudo-JSON constants specifically as values nullRegex = regexp.MustCompile(`\bNone\b`) boolRegex = regexp.MustCompile(`\b(True|False)\b`) ) func modifyString(input string) string { // We use ReplaceAllStringFunc to process ONLY the captured data parts return dataBlockRegex.ReplaceAllStringFunc(input, func(fullMatch string) string { // Split label (e.g., "parameters:") from the data (e.g., "{'a': 1}") parts := dataBlockRegex.FindStringSubmatch(fullMatch) if len(parts) < 3 { return fullMatch } label := parts[1] rawData := parts[2] // Normalize Python-isms to JSON-isms // Replace single quotes with double quotes normalized := quoteRegex.ReplaceAllString(rawData, `"$1"`) // Replace None -> null normalized = nullRegex.ReplaceAllString(normalized, "null") // Replace True/False -> true/false normalized = boolRegex.ReplaceAllStringFunc(normalized, func(m string) string { return strings.ToLower(m) }) // Round-trip through JSON to validate and clean up var parsed any if err := json.Unmarshal([]byte(normalized), &parsed); err != nil { // If it's still not valid JSON, return the original match to avoid corruption return fullMatch } // Marshal back to a clean, standard JSON string fixedJSON, err := json.Marshal(parsed) if err != nil { return fullMatch } return fmt.Sprintf("%s: %s", label, string(fixedJSON)) }) } // verifyAndGetNextToolRecordingForAgent ensures the next recording is a tool call and matches the actual call. func (p *replayPlugin) verifyAndGetNextToolRecordingForAgent(state *invocationReplayState, agentName string, t tool.Tool, args map[string]any) (*recording.ToolRecording, error) { currentAgentIndex, ok := state.GetAgentReplayIndex(agentName) if !ok { currentAgentIndex = 0 } expectedRecording, err := getNextRecordingForAgent(state, agentName) if err != nil { return nil, err } if expectedRecording.ToolRecording == nil { return nil, fmt.Errorf("expected tool recording for agent '%s' at index %d, but found LLM recording", agentName, currentAgentIndex) } // Strict verification of tool call err = verifyToolCallMatch(expectedRecording.ToolRecording.ToolCall, t.Name(), args, agentName, currentAgentIndex) if err != nil { return nil, err } return expectedRecording.ToolRecording, nil } // verifyToolCallMatch compares the expected tool call from recording with the actual tool call. func verifyToolCallMatch(expectedToolCall *genai.FunctionCall, toolName string, toolArgs map[string]any, agentName string, agentIndex int) error { if expectedToolCall.Name != toolName { return fmt.Errorf("tool name mismatch for agent '%s' (index %d): expected '%s', got '%s'", agentName, agentIndex, expectedToolCall.Name, toolName) } if diff := cmp.Diff(expectedToolCall.Args, toolArgs); diff != "" { return fmt.Errorf("tool args mismatch for agent '%s' (index %d):\n%s", agentName, agentIndex, diff) } return nil } ================================================ FILE: internal/configurable/conformance/replayplugin/replay_plugin_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package replayplugin_test import ( "context" "iter" "os" "path/filepath" "testing" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/configurable/conformance/replayplugin" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/session" "google.golang.org/adk/tool/toolconfirmation" ) // TestReplayPlugin verifies the plugin's callback behavior and replay functionality. func TestReplayPlugin(t *testing.T) { // Setup per test setup := func(t *testing.T) (*plugin.Plugin, *MockSession, *MockState) { plugin := replayplugin.MustNew("/") sessionState := make(map[string]any) mockState := &MockState{data: sessionState} mockSession := &MockSession{state: mockState} return plugin, mockSession, mockState } t.Run("BeforeModelCallback_WithMatchingRecording_ReturnsRecordedResponse", func(t *testing.T) { plugin, mockSession, _ := setup(t) tempDir := t.TempDir() // 1. Create recording file recordingsYaml := ` recordings: - user_message_index: 0 agent_name: "test_agent" llm_recording: llm_request: model: "gemini-2.0-flash" contents: - role: "user" parts: - text: "Hello" llm_response: content: role: "model" parts: - text: "Recorded response" ` createRecordingsFile(t, tempDir, recordingsYaml) // 2. Setup replay config err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tempDir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error: %v", err) } // 3. Load recordings (BeforeRunCallback) invContext := &MockInvocationContext{ session: mockSession, invocationID: "test-invocation", } _, err = plugin.BeforeRunCallback()(invContext) if err != nil { t.Fatalf("unexpected error: %v", err) } // 4. Call BeforeModelCallback with matching request cbContext := &MockCallbackContext{ state: mockSession.State(), invocationID: "test-invocation", agentName: "test_agent", } request := &model.LLMRequest{ Model: "gemini-2.0-flash", Contents: []*genai.Content{ { Role: "user", Parts: []*genai.Part{{Text: "Hello"}}, }, }, } result, err := plugin.BeforeModelCallback()(cbContext, request) // 5. Verify if err != nil { t.Fatalf("unexpected error: %v", err) } if result == nil { t.Fatal("expected non-nil result") } if result.Content == nil { t.Fatal("expected non-nil result.Content") } if got := result.Content.Parts[0].Text; got != "Recorded response" { t.Errorf("expected %q, got %q", "Recorded response", got) } }) t.Run("BeforeModelCallback_RequestMismatch_ReturnsEmpty", func(t *testing.T) { plugin, mockSession, _ := setup(t) tempDir := t.TempDir() // 1. Create recording with DIFFERENT model recordingsYaml := ` recordings: - user_message_index: 0 agent_name: "test_agent" llm_recording: llm_request: model: "gemini-1.5-pro" contents: - role: "user" parts: - text: "Hello" ` createRecordingsFile(t, tempDir, recordingsYaml) // 2. Setup config err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tempDir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error: %v", err) } // 3. Load recordings invContext := &MockInvocationContext{ session: mockSession, invocationID: "test-invocation", } _, err = plugin.BeforeRunCallback()(invContext) if err != nil { t.Fatalf("unexpected error: %v", err) } // 4. Call with mismatched request (gemini-2.0-flash vs 1.5-pro) cbContext := &MockCallbackContext{ state: mockSession.State(), invocationID: "test-invocation", agentName: "test_agent", } request := &model.LLMRequest{ Model: "gemini-2.0-flash", Contents: []*genai.Content{ { Role: "user", Parts: []*genai.Part{{Text: "Hello"}}, }, }, } result, err := plugin.BeforeModelCallback()(cbContext, request) // 5. Verify result is nil (empty) and error is returned if err == nil { t.Fatal("expected error due to mismatch") } if result != nil { t.Errorf("expected nil result, got %v", result) } }) t.Run("BeforeToolCallback_WithMatchingRecording_ReturnsRecordedResponse", func(t *testing.T) { plugin, mockSession, _ := setup(t) tempDir := t.TempDir() // 1. Create recording with tool call recordingsYaml := ` recordings: - user_message_index: 0 agent_name: "test_agent" tool_recording: tool_call: name: "test_tool" args: param1: "value1" param2: 42 tool_response: name: "test_tool" response: result: "success" data: "recorded data" ` createRecordingsFile(t, tempDir, recordingsYaml) // 2. Setup config err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tempDir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error: %v", err) } // 3. Load recordings invContext := &MockInvocationContext{ session: mockSession, invocationID: "test-invocation", } _, err = plugin.BeforeRunCallback()(invContext) if err != nil { t.Fatalf("unexpected error: %v", err) } // 4. Call BeforeToolCallback mockTool := &MockTool{NameVal: "test_tool"} toolContext := &MockToolContext{ state: mockSession.State(), invocationID: "test-invocation", agentName: "test_agent", } toolArgs := map[string]any{"param1": "value1", "param2": 42} result, err := plugin.BeforeToolCallback()(toolContext, mockTool, toolArgs) // 5. Verify if err != nil { t.Fatalf("unexpected error: %v", err) } if result == nil { t.Fatal("expected non-nil result") } if got := result["result"]; got != "success" { t.Errorf("expected %q, got %q", "success", got) } if got := result["data"]; got != "recorded data" { t.Errorf("expected %q, got %q", "recorded data", got) } }) t.Run("BeforeToolCallback_ToolNameMismatch_ReturnsEmpty", func(t *testing.T) { plugin, mockSession, _ := setup(t) tempDir := t.TempDir() // 1. Recording expects "expected_tool" recordingsYaml := ` recordings: - user_message_index: 0 agent_name: "test_agent" tool_recording: tool_call: name: "expected_tool" args: param: "value" ` createRecordingsFile(t, tempDir, recordingsYaml) err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tempDir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error: %v", err) } invContext := &MockInvocationContext{session: mockSession, invocationID: "test-invocation"} _, err = plugin.BeforeRunCallback()(invContext) if err != nil { t.Fatalf("unexpected error: %v", err) } // 2. Call with "actual_tool" mockTool := &MockTool{NameVal: "actual_tool"} // Wrong name toolContext := &MockToolContext{ state: mockSession.State(), invocationID: "test-invocation", agentName: "test_agent", } result, err := plugin.BeforeToolCallback()(toolContext, mockTool, map[string]any{"param": "value"}) // 3. Verify nil result and error if err == nil { t.Fatal("expected error due to tool name mismatch") } if result != nil { t.Errorf("expected nil result, got %v", result) } }) t.Run("BeforeToolCallback_ToolArgsMismatch_ReturnsEmpty", func(t *testing.T) { plugin, mockSession, _ := setup(t) tempDir := t.TempDir() // 1. Recording expects "expected_value" recordingsYaml := ` recordings: - user_message_index: 0 agent_name: "test_agent" tool_recording: tool_call: name: "test_tool" args: param: "expected_value" ` createRecordingsFile(t, tempDir, recordingsYaml) err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tempDir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error: %v", err) } invContext := &MockInvocationContext{session: mockSession, invocationID: "test-invocation"} _, err = plugin.BeforeRunCallback()(invContext) if err != nil { t.Fatalf("unexpected error: %v", err) } // 2. Call with "actual_value" mockTool := &MockTool{NameVal: "test_tool"} toolContext := &MockToolContext{ state: mockSession.State(), invocationID: "test-invocation", agentName: "test_agent", } result, err := plugin.BeforeToolCallback()(toolContext, mockTool, map[string]any{"param": "actual_value"}) // 3. Verify nil result and error if err == nil { t.Fatal("expected error due to tool args mismatch") } if result != nil { t.Errorf("expected nil result, got %v", result) } }) } // --- Helpers & Mocks --- func createRecordingsFile(t *testing.T, dir, content string) { path := filepath.Join(dir, "generated-recordings.yaml") err := os.WriteFile(path, []byte(content), 0o644) if err != nil { t.Fatalf("unexpected error: %v", err) } } // Mock interfaces needed to replace Mockito // These should implement the interfaces defined in your main code. type MockState struct { data map[string]any } func (m *MockState) Set(key string, val any) error { m.data[key] = val; return nil } func (m *MockState) Get(key string) (any, error) { return m.data[key], nil } func (m *MockState) All() iter.Seq2[string, any] { return nil } // Assuming Session interface has a State() method type MockSession struct { state *MockState } func (m *MockSession) ID() string { return "mock-session-id" } func (m *MockSession) AppName() string { return "mock-app" } func (m *MockSession) UserID() string { return "mock-user" } func (m *MockSession) State() session.State { return m.state } func (m *MockSession) Events() session.Events { return nil } func (m *MockSession) LastUpdateTime() time.Time { return time.Now() } // MockInvocationContext type MockInvocationContext struct { session *MockSession invocationID string } func (m *MockInvocationContext) Session() session.Session { return m.session } func (m *MockInvocationContext) InvocationID() string { return m.invocationID } func (m *MockInvocationContext) Agent() agent.Agent { return nil } func (m *MockInvocationContext) Artifacts() agent.Artifacts { return nil } func (m *MockInvocationContext) Memory() agent.Memory { return nil } func (m *MockInvocationContext) Branch() string { return "" } func (m *MockInvocationContext) UserContent() *genai.Content { return nil } func (m *MockInvocationContext) RunConfig() *agent.RunConfig { return nil } // Use context? No, RunConfig struct. func (m *MockInvocationContext) EndInvocation() {} func (m *MockInvocationContext) Ended() bool { return false } func (m *MockInvocationContext) WithContext(ctx context.Context) agent.InvocationContext { return m } func (m *MockInvocationContext) Value(key any) any { return nil } func (m *MockInvocationContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } func (m *MockInvocationContext) Done() <-chan struct{} { return nil } func (m *MockInvocationContext) Err() error { return nil } // MockCallbackContext type MockCallbackContext struct { state session.State invocationID string agentName string } func (m *MockCallbackContext) State() session.State { return m.state } func (m *MockCallbackContext) ReadonlyState() session.ReadonlyState { return m.state } func (m *MockCallbackContext) InvocationID() string { return m.invocationID } func (m *MockCallbackContext) AgentName() string { return m.agentName } func (m *MockCallbackContext) AppName() string { return "mock-app" } func (m *MockCallbackContext) Branch() string { return "" } func (m *MockCallbackContext) SessionID() string { return "mock-session-id" } func (m *MockCallbackContext) UserID() string { return "mock-user" } func (m *MockCallbackContext) UserContent() *genai.Content { return nil } func (m *MockCallbackContext) Artifacts() agent.Artifacts { return nil } func (m *MockCallbackContext) Value(key any) any { return nil } func (m *MockCallbackContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } func (m *MockCallbackContext) Done() <-chan struct{} { return nil } func (m *MockCallbackContext) Err() error { return nil } // MockToolContext type MockToolContext struct { state session.State invocationID string agentName string } func (m *MockToolContext) State() session.State { return m.state } func (m *MockToolContext) ReadonlyState() session.ReadonlyState { return m.state } func (m *MockToolContext) InvocationID() string { return m.invocationID } func (m *MockToolContext) AgentName() string { return m.agentName } func (m *MockToolContext) FunctionCallID() string { return "mock-function-call-id" } func (m *MockToolContext) Actions() *session.EventActions { return nil } func (m *MockToolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { return nil, nil } func (m *MockToolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return nil } func (m *MockToolContext) RequestConfirmation(hint string, payload any) error { return nil } func (m *MockToolContext) AppName() string { return "mock-app" } func (m *MockToolContext) Branch() string { return "" } func (m *MockToolContext) SessionID() string { return "mock-session-id" } func (m *MockToolContext) UserID() string { return "mock-user" } func (m *MockToolContext) UserContent() *genai.Content { return nil } func (m *MockToolContext) Artifacts() agent.Artifacts { return nil } func (m *MockToolContext) Value(key any) any { return nil } func (m *MockToolContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } func (m *MockToolContext) Done() <-chan struct{} { return nil } func (m *MockToolContext) Err() error { return nil } // MockTool type MockTool struct { NameVal string } func (m *MockTool) Name() string { return m.NameVal } func (m *MockTool) Description() string { return "mock tool" } func (m *MockTool) IsLongRunning() bool { return false } func (m *MockTool) Run(ctx any, args map[string]any, toolCtx any) error { return nil } func TestReplayPlugin_PathValidation(t *testing.T) { // Create a temporary directory structure for testing path validation tempDir := t.TempDir() safeDir := filepath.Join(tempDir, "safe") if err := os.Mkdir(safeDir, 0o755); err != nil { t.Fatalf("failed to create safe dir: %v", err) } // Create a safe recordings file createRecordingsFile(t, safeDir, "recordings: []") // Initialize plugin with restricted base directory plugin := replayplugin.MustNew(safeDir) sessionState := make(map[string]any) mockState := &MockState{data: sessionState} mockSession := &MockSession{state: mockState} invContext := &MockInvocationContext{ session: mockSession, invocationID: "test-invocation", } tests := []struct { name string dir string expectError bool }{ { name: "ValidPath_InsideBaseDir", dir: safeDir, expectError: false, }, { name: "InvalidPath_ParentTraversal", dir: filepath.Join(safeDir, ".."), expectError: true, }, { name: "InvalidPath_OutsideBaseDir", dir: tempDir, // tempDir is parent of safeDir, so it's outside expectError: true, }, { name: "InvalidPath_AbsoluteOutside", dir: "/etc", // outside expectError: true, }, { name: "InvalidPath_RelativeTraversal", dir: "../", // Relative path traversing up expectError: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Set the config err := mockSession.State().Set("_adk_replay_config", map[string]any{ "dir": tt.dir, "user_message_index": 0, }) if err != nil { t.Fatalf("unexpected error setting config: %v", err) } // Run BeforeRunCallback _, err = plugin.BeforeRunCallback()(invContext) if tt.expectError { if err == nil { t.Errorf("expected error for dir %q, got nil", tt.dir) } } else { if err != nil { t.Errorf("unexpected error for dir %q: %v", tt.dir, err) } } }) } } ================================================ FILE: internal/configurable/conformance/replayplugin/yaml_utils.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package replayplugin import ( "strings" "gopkg.in/yaml.v3" ) var toIgnore = map[string]struct{}{"thought_signature": {}, "http_options": {}, "args": {}, "response": {}} func removeUnderscores(node *yaml.Node) { switch node.Kind { case yaml.DocumentNode, yaml.SequenceNode: // If it's a document or a list, just pass through to its children for _, child := range node.Content { removeUnderscores(child) } case yaml.MappingNode: // A MappingNode's content is a flat array alternating [key, value, key, value...] for i := 0; i < len(node.Content); i += 2 { keyNode := node.Content[i] valueNode := node.Content[i+1] if _, ok := toIgnore[keyNode.Value]; ok { continue } // Strip the underscore from the key (e.g., "first_name" -> "firstname") keyNode.Value = strings.ReplaceAll(keyNode.Value, "_", "") // Continue walking down into the value in case of nested objects removeUnderscores(valueNode) } } } func fixTypeMismatches(n *yaml.Node) { switch n.Kind { case yaml.DocumentNode, yaml.SequenceNode: for _, child := range n.Content { fixTypeMismatches(child) } case yaml.MappingNode: for i := 0; i < len(n.Content); i += 2 { keyNode := n.Content[i] valueNode := n.Content[i+1] switch keyNode.Value { case "systeminstruction": if valueNode.Kind == yaml.ScalarNode { val := valueNode.Value valueNode.Kind = yaml.MappingNode valueNode.Tag = "!!map" valueNode.Value = "" valueNode.Content = []*yaml.Node{ {Kind: yaml.ScalarNode, Value: "role"}, {Kind: yaml.ScalarNode, Tag: "!!str", Value: "user"}, {Kind: yaml.ScalarNode, Value: "parts"}, { Kind: yaml.SequenceNode, Tag: "!!seq", Content: []*yaml.Node{ { Kind: yaml.MappingNode, Tag: "!!map", Content: []*yaml.Node{ {Kind: yaml.ScalarNode, Value: "text"}, {Kind: yaml.ScalarNode, Tag: "!!str", Value: val}, }, }, }, }, } } } // Recurse into the value to catch nested structures fixTypeMismatches(valueNode) } } } ================================================ FILE: internal/context/callback_context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package context import ( "context" "iter" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/session" ) type internalArtifacts struct { agent.Artifacts eventActions *session.EventActions } func (ia *internalArtifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) { resp, err := ia.Artifacts.Save(ctx, name, data) if err != nil { return resp, err } if ia.eventActions != nil { if ia.eventActions.ArtifactDelta == nil { ia.eventActions.ArtifactDelta = make(map[string]int64) } // TODO: RWLock, check the version stored is newer in case multiple tools save the same file. ia.eventActions.ArtifactDelta[name] = resp.Version } return resp, nil } func NewCallbackContext(ctx agent.InvocationContext) agent.CallbackContext { return newCallbackContext(ctx, make(map[string]any), make(map[string]int64)) } func NewCallbackContextWithDelta(ctx agent.InvocationContext, stateDelta map[string]any, artifactDelta map[string]int64) agent.CallbackContext { return newCallbackContext(ctx, stateDelta, artifactDelta) } func newCallbackContext(ctx agent.InvocationContext, stateDelta map[string]any, artifactDelta map[string]int64) *callbackContext { rCtx := NewReadonlyContext(ctx) eventActions := &session.EventActions{StateDelta: stateDelta, ArtifactDelta: artifactDelta} return &callbackContext{ ReadonlyContext: rCtx, invocationCtx: ctx, eventActions: eventActions, artifacts: &internalArtifacts{ Artifacts: ctx.Artifacts(), eventActions: eventActions, }, } } // TODO: unify with agent.callbackContext type callbackContext struct { agent.ReadonlyContext artifacts *internalArtifacts invocationCtx agent.InvocationContext eventActions *session.EventActions } func (c *callbackContext) Artifacts() agent.Artifacts { return c.artifacts } func (c *callbackContext) AgentName() string { return c.invocationCtx.Agent().Name() } func (c *callbackContext) ReadonlyState() session.ReadonlyState { return c.invocationCtx.Session().State() } func (c *callbackContext) State() session.State { return &callbackContextState{ctx: c} } func (c *callbackContext) InvocationID() string { return c.invocationCtx.InvocationID() } func (c *callbackContext) UserContent() *genai.Content { return c.invocationCtx.UserContent() } type callbackContextState struct { ctx *callbackContext } func (c *callbackContextState) Get(key string) (any, error) { if c.ctx.eventActions != nil && c.ctx.eventActions.StateDelta != nil { if val, ok := c.ctx.eventActions.StateDelta[key]; ok { return val, nil } } return c.ctx.invocationCtx.Session().State().Get(key) } func (c *callbackContextState) Set(key string, val any) error { if c.ctx.eventActions != nil && c.ctx.eventActions.StateDelta != nil { c.ctx.eventActions.StateDelta[key] = val } return c.ctx.invocationCtx.Session().State().Set(key, val) } func (c *callbackContextState) All() iter.Seq2[string, any] { return c.ctx.invocationCtx.Session().State().All() } ================================================ FILE: internal/context/context_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package context import ( "context" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/adk/agent" ) func TestReadonlyContext(t *testing.T) { inv := NewInvocationContext(t.Context(), InvocationContextParams{}) readonly := NewReadonlyContext(inv) if got, ok := readonly.(agent.InvocationContext); ok { t.Errorf("ReadonlyContext(%+T) is unexpectedly an InvocationContext", got) } } func TestCallbackContext(t *testing.T) { inv := NewInvocationContext(t.Context(), InvocationContextParams{}) callback := NewCallbackContext(inv) if _, ok := callback.(agent.ReadonlyContext); !ok { t.Errorf("CallbackContext(%+T) is unexpectedly not a ReadonlyContext", callback) } if got, ok := callback.(agent.InvocationContext); ok { t.Errorf("CallbackContext(%+T) is unexpectedly an InvocationContext", got) } } type testKey struct{} func TestWithContext(t *testing.T) { baseCtx := t.Context() inv := NewInvocationContext(baseCtx, InvocationContextParams{ Branch: "test-branch", }) key := testKey{} val := "val" got := inv.WithContext(context.WithValue(baseCtx, key, val)) if got.Value(key) != val { t.Errorf("WithContext() did not update context") } if diff := cmp.Diff(inv, got, cmp.AllowUnexported(InvocationContext{}), cmpopts.IgnoreFields(InvocationContext{}, "Context")); diff != "" { t.Errorf("WithContext() mismatch (-want +got):\n%s", diff) } } ================================================ FILE: internal/context/invocation_context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package context import ( "context" "github.com/google/uuid" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/session" ) type InvocationContextParams struct { Artifacts agent.Artifacts Memory agent.Memory Session session.Session Branch string Agent agent.Agent UserContent *genai.Content RunConfig *agent.RunConfig EndInvocation bool InvocationID string } func NewInvocationContext(ctx context.Context, params InvocationContextParams) agent.InvocationContext { if params.InvocationID == "" { params.InvocationID = "e-" + uuid.NewString() } return &InvocationContext{ Context: ctx, params: params, } } type InvocationContext struct { context.Context params InvocationContextParams } func (c *InvocationContext) Artifacts() agent.Artifacts { return c.params.Artifacts } func (c *InvocationContext) Agent() agent.Agent { return c.params.Agent } func (c *InvocationContext) Branch() string { return c.params.Branch } func (c *InvocationContext) InvocationID() string { return c.params.InvocationID } func (c *InvocationContext) Memory() agent.Memory { return c.params.Memory } func (c *InvocationContext) Session() session.Session { return c.params.Session } func (c *InvocationContext) UserContent() *genai.Content { return c.params.UserContent } func (c *InvocationContext) RunConfig() *agent.RunConfig { return c.params.RunConfig } func (c *InvocationContext) EndInvocation() { c.params.EndInvocation = true } func (c *InvocationContext) Ended() bool { return c.params.EndInvocation } func (c *InvocationContext) WithContext(ctx context.Context) agent.InvocationContext { newCtx := *c newCtx.Context = ctx return &newCtx } var _ agent.InvocationContext = (*InvocationContext)(nil) ================================================ FILE: internal/context/readonly_context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package context import ( "context" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/session" ) func NewReadonlyContext(ctx agent.InvocationContext) agent.ReadonlyContext { return &ReadonlyContext{ Context: ctx, InvocationContext: ctx, } } type ReadonlyContext struct { context.Context InvocationContext agent.InvocationContext } // AppName implements agent.ReadonlyContext. func (c *ReadonlyContext) AppName() string { return c.InvocationContext.Session().AppName() } // Branch implements agent.ReadonlyContext. func (c *ReadonlyContext) Branch() string { return c.InvocationContext.Branch() } // SessionID implements agent.ReadonlyContext. func (c *ReadonlyContext) SessionID() string { return c.InvocationContext.Session().ID() } // UserID implements agent.ReadonlyContext. func (c *ReadonlyContext) UserID() string { return c.InvocationContext.Session().UserID() } func (c *ReadonlyContext) AgentName() string { return c.InvocationContext.Agent().Name() } func (c *ReadonlyContext) ReadonlyState() session.ReadonlyState { return c.InvocationContext.Session().State() } func (c *ReadonlyContext) InvocationID() string { return c.InvocationContext.InvocationID() } func (c *ReadonlyContext) UserContent() *genai.Content { return c.InvocationContext.UserContent() } ================================================ FILE: internal/converters/map_structure.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package converters import ( "encoding/json" ) // ToMapStructure converts any to map[string]any. // We can't use mapstructure library in a way compatible with ADK-python, because genai type fields // don't have proper field tags. // TODO(yarolegovich): field annotation PR for genai types. func ToMapStructure(data any) (map[string]any, error) { bytes, err := json.Marshal(data) if err != nil { return nil, err } var result map[string]any if err := json.Unmarshal(bytes, &result); err != nil { return nil, err } return result, nil } // FromMapStructure converts map[string]any to the type parameter T. // We can't use mapstructure library in a way compatible with ADK-python, because genai type fields // don't have proper field tags. // TODO(yarolegovich): field annotation PR for genai types. func FromMapStructure[T any](data map[string]any) (*T, error) { bytes, err := json.Marshal(data) if err != nil { return nil, err } var zero T if err := json.Unmarshal(bytes, &zero); err != nil { return nil, err } return &zero, nil } ================================================ FILE: internal/httprr/LICENSE ================================================ Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: internal/httprr/rr.go ================================================ // Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package httprr implements HTTP record and replay, mainly for use in tests. // // [Open] creates a new [RecordReplay]. Whether it is recording or replaying // is controlled by the -httprecord flag, which is defined by this package // only in test programs (built by “go test”). // See the [Open] documentation for more details. package httprr import ( "bufio" "bytes" "cmp" "context" "flag" "fmt" "io" "net/http" "os" "regexp" "strconv" "strings" "sync" "testing" ) var record = new(string) func init() { if testing.Testing() { record = flag.String("httprecord", "", "re-record traces for files matching `regexp`") } } // A RecordReplay is an [http.RoundTripper] that can operate in two modes: record and replay. // // In record mode, the RecordReplay invokes another RoundTripper // and logs the (request, response) pairs to a file. // // In replay mode, the RecordReplay responds to requests by finding // an identical request in the log and sending the logged response. type RecordReplay struct { file string // file being read or written real http.RoundTripper // real HTTP connection mu sync.Mutex reqScrub []func(*http.Request) error // scrubbers for logging requests respScrub []func(*bytes.Buffer) error // scrubbers for logging responses replay map[string]string // if replaying, the log record *os.File // if recording, the file being written writeErr error // if recording, any write error encountered } // ScrubReq adds new request scrubbing functions to rr. // // Before using a request as a lookup key or saving it in the record/replay log, // the RecordReplay calls each scrub function, in the order they were registered, // to canonicalize non-deterministic parts of the request and remove secrets. // Scrubbing only applies to a copy of the request used in the record/replay log; // the unmodified original request is sent to the actual server in recording mode. // A scrub function can assume that if req.Body is not nil, then it has type [*Body]. // // Calling ScrubReq adds to the list of registered request scrubbing functions; // it does not replace those registered by earlier calls. func (rr *RecordReplay) ScrubReq(scrubs ...func(req *http.Request) error) { rr.reqScrub = append(rr.reqScrub, scrubs...) } // ScrubResp adds new response scrubbing functions to rr. // // Before using a response as a lookup key or saving it in the record/replay log, // the RecordReplay calls each scrub function on a byte representation of the // response, in the order they were registered, to canonicalize non-deterministic // parts of the response and remove secrets. // // Calling ScrubResp adds to the list of registered response scrubbing functions; // it does not replace those registered by earlier calls. // // Clients should be careful when loading the bytes into [*http.Response] using // [http.ReadResponse]. This function can set [http.Response].Close to true even // when the original response had it false. See code in go/src/net/http.Response.Write // and go/src/net/http.Write for more info. func (rr *RecordReplay) ScrubResp(scrubs ...func(*bytes.Buffer) error) { rr.respScrub = append(rr.respScrub, scrubs...) } // Recording reports whether the rr is in recording mode. func (rr *RecordReplay) Recording() bool { return rr.record != nil } // Open opens a new record/replay log in the named file and // returns a [RecordReplay] backed by that file. // // By default Open expects the file to exist and contain a // previously-recorded log of (request, response) pairs, // which [RecordReplay.RoundTrip] consults to prepare its responses. // // If the command-line flag -httprecord is set to a non-empty // regular expression that matches file, then Open creates // the file as a new log. In that mode, [RecordReplay.RoundTrip] // makes actual HTTP requests using rt but then logs the requests and // responses to the file for replaying in a future run. func Open(file string, rt http.RoundTripper) (*RecordReplay, error) { record, err := Recording(file) if err != nil { return nil, err } if record { return create(file, rt) } return open(file, rt) } // Recording reports whether the "-httprecord" flag is set // for the given file. // It returns an error if the flag is set to an invalid value. func Recording(file string) (bool, error) { if *record != "" { re, err := regexp.Compile(*record) if err != nil { return false, fmt.Errorf("invalid -httprecord flag: %v", err) } if re.MatchString(file) { return true, nil } } return false, nil } // creates creates a new record-mode RecordReplay in the file. func create(file string, rt http.RoundTripper) (*RecordReplay, error) { f, err := os.Create(file) if err != nil { return nil, err } // Write header line. // Each round-trip will write a new request-response record. if _, err := fmt.Fprintf(f, "httprr trace v1\n"); err != nil { // unreachable unless write error immediately after os.Create f.Close() return nil, err } rr := &RecordReplay{ file: file, real: rt, record: f, } return rr, nil } // open opens a replay-mode RecordReplay using the data in the file. func open(file string, rt http.RoundTripper) (*RecordReplay, error) { // Note: To handle larger traces without storing entirely in memory, // could instead read the file incrementally, storing a map[hash]offsets // and then reread the relevant part of the file during RoundTrip. bdata, err := os.ReadFile(file) if err != nil { return nil, err } // Trace begins with header line. data := string(bdata) line, data, ok := strings.Cut(data, "\n") if !ok || line != "httprr trace v1" { return nil, fmt.Errorf("read %s: not an httprr trace", file) } replay := make(map[string]string) for data != "" { // Each record starts with a line of the form "n1 n2\n" // followed by n1 bytes of request encoding and // n2 bytes of response encoding. line, data, ok = strings.Cut(data, "\n") f1, f2, _ := strings.Cut(line, " ") n1, err1 := strconv.Atoi(f1) n2, err2 := strconv.Atoi(f2) if !ok || err1 != nil || err2 != nil || n1 > len(data) || n2 > len(data[n1:]) { return nil, fmt.Errorf("read %s: corrupt httprr trace", file) } var req, resp string req, resp, data = data[:n1], data[n1:n1+n2], data[n1+n2:] replay[req] = resp } rr := &RecordReplay{ file: file, real: rt, replay: replay, } return rr, nil } // Client returns an http.Client using rr as its transport. // It is a shorthand for: // // return &http.Client{Transport: rr} // // For more complicated uses, use rr or the [RecordReplay.RoundTrip] method directly. func (rr *RecordReplay) Client() *http.Client { return &http.Client{Transport: rr} } // A Body is an io.ReadCloser used as an HTTP request body. // In a Scrubber, if req.Body != nil, then req.Body is guaranteed // to have type *Body, making it easy to access the body to change it. type Body struct { Data []byte ReadOffset int } // Read reads from the body, implementing io.Reader. func (b *Body) Read(p []byte) (int, error) { n := copy(p, b.Data[b.ReadOffset:]) if n == 0 { return 0, io.EOF } b.ReadOffset += n return n, nil } // Close is a no-op, implementing io.Closer. func (b *Body) Close() error { return nil } // RoundTrip implements [http.RoundTripper]. // // If rr has been opened in record mode, RoundTrip passes the requests on to // the RoundTripper specified in the call to [Open] and then logs the // (request, response) pair to the underlying file. // // If rr has been opened in replay mode, RoundTrip looks up the request in the log // and then responds with the previously logged response. // If the log does not contain req, RoundTrip returns an error. func (rr *RecordReplay) RoundTrip(req *http.Request) (*http.Response, error) { reqWire, err := rr.reqWire(req) if err != nil { return nil, err } // If we're in replay mode, replay a response. if rr.replay != nil { return rr.replayRoundTrip(req, reqWire) } // Otherwise run a real round trip and save the request-response pair. // But if we've had a log write error already, don't bother. if err := rr.writeError(); err != nil { return nil, err } resp, err := rr.real.RoundTrip(req) if err != nil { return nil, err } // Encode resp and decode to get a copy for our caller. respWire, err := rr.respWire(resp) if err != nil { return nil, err } if err := rr.writeLog(reqWire, respWire); err != nil { return nil, err } return resp, nil } // reqWire returns the wire-format HTTP request key to be // used for request when saving to the log or looking up in a // previously written log. It consumes the original req.Body // but modifies req.Body to be an equivalent [*Body]. func (rr *RecordReplay) reqWire(req *http.Request) (string, error) { // rkey is the scrubbed request used as a lookup key. // Clone req including req.Body. rkey := req.Clone(context.Background()) if req.Body != nil { body, err := io.ReadAll(req.Body) req.Body.Close() if err != nil { return "", err } req.Body = &Body{Data: body} rkey.Body = &Body{Data: bytes.Clone(body)} } // Canonicalize and scrub request key. for _, scrub := range rr.reqScrub { if err := scrub(rkey); err != nil { return "", err } } // Now that scrubbers are done potentially modifying body, set length. if rkey.Body != nil { rkey.ContentLength = int64(len(rkey.Body.(*Body).Data)) } // Serialize rkey to produce the log entry. // Use WriteProxy instead of Write to preserve the URL's scheme. var key strings.Builder if err := rkey.WriteProxy(&key); err != nil { return "", err } return key.String(), nil } // respWire returns the wire-format HTTP response log entry. // It modifies resp but leaves an equivalent response in its place. func (rr *RecordReplay) respWire(resp *http.Response) (string, error) { var key bytes.Buffer if err := resp.Write(&key); err != nil { return "", err } resp2, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(key.Bytes())), resp.Request) if err != nil { // unreachable unless resp.Write does not round-trip with http.ReadResponse return "", err } *resp = *resp2 for _, scrub := range rr.respScrub { if err := scrub(&key); err != nil { return "", err } } return key.String(), nil } // replayRoundTrip implements RoundTrip using the replay log. func (rr *RecordReplay) replayRoundTrip(req *http.Request, reqLog string) (*http.Response, error) { respLog, ok := rr.replay[reqLog] if !ok { return nil, fmt.Errorf("cached HTTP response not found for:\n%s", reqLog) } resp, err := http.ReadResponse(bufio.NewReader(strings.NewReader(respLog)), req) if err != nil { return nil, fmt.Errorf("read %s: corrupt httprr trace: %v", rr.file, err) } return resp, nil } // writeError reports any previous log write error. func (rr *RecordReplay) writeError() error { rr.mu.Lock() defer rr.mu.Unlock() return rr.writeErr } // writeLog writes the request-response pair to the log. // If a write fails, writeLog arranges for rr.broken to return // an error and deletes the underlying log. func (rr *RecordReplay) writeLog(reqWire, respWire string) error { rr.mu.Lock() defer rr.mu.Unlock() if rr.writeErr != nil { // Unreachable unless concurrent I/O error. // Caller should have checked already. return rr.writeErr } _, err1 := fmt.Fprintf(rr.record, "%d %d\n", len(reqWire), len(respWire)) _, err2 := rr.record.WriteString(reqWire) _, err3 := rr.record.WriteString(respWire) if err := cmp.Or(err1, err2, err3); err != nil { rr.writeErr = err rr.record.Close() os.Remove(rr.file) return err } return nil } // Close closes the RecordReplay. // It is a no-op in replay mode. func (rr *RecordReplay) Close() error { if rr.writeErr != nil { return rr.writeErr } if rr.record != nil { return rr.record.Close() } return nil } ================================================ FILE: internal/httprr/rr_test.go ================================================ // Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package httprr import ( "bytes" "errors" "io" "net/http" "net/http/httptest" "os" "strings" "testing" "testing/iotest" ) func handler(w http.ResponseWriter, r *http.Request) { if strings.HasSuffix(r.URL.Path, "/redirect") { http.Error(w, "redirect me!", 304) return } if r.Method == "GET" { if r.Header.Get("Secret") != "key" { http.Error(w, "missing secret", 666) return } } if r.Method == "POST" { data, err := io.ReadAll(r.Body) if err != nil { panic(err) } if !strings.Contains(string(data), "my Secret") { http.Error(w, "missing body secret", 667) return } } } func always555(w http.ResponseWriter, r *http.Request) { http.Error(w, "should not be making HTTP requests", 555) } func dropPort(r *http.Request) error { if r.URL.Port() != "" { r.URL.Host = r.URL.Host[:strings.LastIndex(r.URL.Host, ":")] r.Host = r.Host[:strings.LastIndex(r.Host, ":")] } return nil } func dropSecretHeader(r *http.Request) error { r.Header.Del("Secret") return nil } func hideSecretBody(r *http.Request) error { if r.Body != nil { body := r.Body.(*Body) body.Data = []byte("redacted") } return nil } func doNothing(b *bytes.Buffer) error { return nil } func doRefresh(b *bytes.Buffer) error { s := b.String() b.Reset() _, _ = b.WriteString(s) return nil } func TestRecordReplay(t *testing.T) { dir := t.TempDir() file := dir + "/rr" // 4 passes: // 0: create // 1: open // 2: Open with -httprecord="r+" // 3: Open with -httprecord="" for pass := range 4 { start := open h := always555 *record = "" switch pass { case 0: start = create h = handler case 2: start = Open *record = "r+" h = handler case 3: start = Open } rr, err := start(file, http.DefaultTransport) if err != nil { t.Fatal(err) } if rr.Recording() { t.Log("RECORDING") } else { t.Log("REPLAYING") } rr.ScrubReq(dropPort, dropSecretHeader) rr.ScrubReq(hideSecretBody) rr.ScrubResp(doNothing, doRefresh) mustNewRequest := func(method, url string, body io.Reader) *http.Request { req, err := http.NewRequest(method, url, body) if err != nil { t.Helper() t.Fatal(err) } return req } mustDo := func(req *http.Request, status int) { resp, err := rr.Client().Do(req) if err != nil { t.Helper() t.Fatal(err) } body, _ := io.ReadAll(resp.Body) resp.Body.Close() if resp.StatusCode != status { t.Helper() t.Fatalf("%v: %s\n%s", req.URL, resp.Status, body) } } srv := httptest.NewServer(http.HandlerFunc(h)) defer srv.Close() req := mustNewRequest("GET", srv.URL+"/myrequest", nil) req.Header.Set("Secret", "key") mustDo(req, 200) req = mustNewRequest("POST", srv.URL+"/myrequest", strings.NewReader("my Secret")) mustDo(req, 200) req = mustNewRequest("GET", srv.URL+"/redirect", nil) mustDo(req, 304) if !rr.Recording() { req = mustNewRequest("GET", srv.URL+"/uncached", nil) resp, err := rr.Client().Do(req) if err == nil { body, _ := io.ReadAll(resp.Body) t.Fatalf("%v: %s\n%s", req.URL, resp.Status, body) } } if err := rr.Close(); err != nil { t.Fatal(err) } } data, err := os.ReadFile(file) if err != nil { t.Fatal(err) } if strings.Contains(string(data), "Secret") { t.Fatalf("rr file contains Secret:\n%s", data) } } var badResponseTrace = []byte("httprr trace v1\n" + "92 75\n" + "GET http://127.0.0.1/myrequest HTTP/1.1\r\n" + "Host: 127.0.0.1\r\n" + "User-Agent: Go-http-client/1.1\r\n" + "\r\n" + "HZZP/1.1 200 OK\r\n" + "Date: Wed, 12 Jun 2024 13:55:02 GMT\r\n" + "Content-Length: 0\r\n" + "\r\n") func TestErrors(t *testing.T) { dir := t.TempDir() makeTmpFile := func() string { f, err := os.CreateTemp(dir, "TestErrors") if err != nil { t.Fatalf("failed to create tmp file for test: %v", err) } name := f.Name() f.Close() return name } // -httprecord regexp parsing *record = "+" if _, err := Open(makeTmpFile(), nil); err == nil || !strings.Contains(err.Error(), "invalid -httprecord flag") { t.Errorf("did not diagnose bad -httprecord: err = %v", err) } *record = "" // invalid httprr trace if _, err := Open(makeTmpFile(), nil); err == nil || !strings.Contains(err.Error(), "not an httprr trace") { t.Errorf("did not diagnose invalid httprr trace: err = %v", err) } // corrupt httprr trace corruptTraceFile := makeTmpFile() os.WriteFile(corruptTraceFile, []byte("httprr trace v1\ngarbage\n"), 0o666) if _, err := Open(corruptTraceFile, nil); err == nil || !strings.Contains(err.Error(), "corrupt httprr trace") { t.Errorf("did not diagnose invalid httprr trace: err = %v", err) } // os.Create error creating trace if _, err := create("invalid\x00file", nil); err == nil { t.Errorf("did not report failure from os.Create: err = %v", err) } // os.ReadAll error reading trace if _, err := open("nonexistent", nil); err == nil { t.Errorf("did not report failure from os.ReadFile: err = %v", err) } // error reading body rr, err := create(makeTmpFile(), nil) if err != nil { t.Fatal(err) } if _, err := rr.Client().Post("http://127.0.0.1/nonexist", "x/error", iotest.ErrReader(errors.New("MY ERROR"))); err == nil || !strings.Contains(err.Error(), "MY ERROR") { t.Errorf("did not report failure from io.ReadAll(body): err = %v", err) } // error during request scrub rr.ScrubReq(func(*http.Request) error { return errors.New("SCRUB ERROR") }) if _, err := rr.Client().Get("http://127.0.0.1/nonexist"); err == nil || !strings.Contains(err.Error(), "SCRUB ERROR") { t.Errorf("did not report failure from scrub: err = %v", err) } rr.Close() // error during response scrub rr.ScrubResp(func(*bytes.Buffer) error { return errors.New("SCRUB ERROR") }) if _, err := rr.Client().Get("http://127.0.0.1/nonexist"); err == nil || !strings.Contains(err.Error(), "SCRUB ERROR") { t.Errorf("did not report failure from scrub: err = %v", err) } rr.Close() // error during rkey.WriteProxy rr, err = create(makeTmpFile(), nil) if err != nil { t.Fatal(err) } rr.ScrubReq(func(req *http.Request) error { req.URL = nil req.Host = "" return nil }) rr.ScrubResp(func(b *bytes.Buffer) error { b.Reset() return nil }) if _, err := rr.Client().Get("http://127.0.0.1/nonexist"); err == nil || !strings.Contains(err.Error(), "no Host or URL set") { t.Errorf("did not report failure from rkey.WriteProxy: err = %v", err) } rr.Close() // error during resp.Write rr, err = create(makeTmpFile(), badRespTransport{}) if err != nil { t.Fatal(err) } if _, err := rr.Client().Get("http://127.0.0.1/nonexist"); err == nil || !strings.Contains(err.Error(), "TRANSPORT ERROR") { t.Errorf("did not report failure from resp.Write: err = %v", err) } rr.Close() // error during Write logging request srv := httptest.NewServer(http.HandlerFunc(always555)) defer srv.Close() rr, err = create(makeTmpFile(), http.DefaultTransport) if err != nil { t.Fatal(err) } rr.ScrubReq(dropPort) rr.record.Close() // cause write error if _, err := rr.Client().Get(srv.URL + "/redirect"); err == nil || !strings.Contains(err.Error(), "file already closed") { t.Errorf("did not report failure from record write: err = %v", err) } rr.writeErr = errors.New("BROKEN ERROR") if _, err := rr.Client().Get(srv.URL + "/redirect"); err == nil || !strings.Contains(err.Error(), "BROKEN ERROR") { t.Errorf("did not report previous write failure: err = %v", err) } if err := rr.Close(); err == nil || !strings.Contains(err.Error(), "BROKEN ERROR") { t.Errorf("did not report write failure during close: err = %v", err) } // error during RoundTrip rr, err = create(makeTmpFile(), errTransport{errors.New("TRANSPORT ERROR")}) if err != nil { t.Fatal(err) } if _, err := rr.Client().Get(srv.URL); err == nil || !strings.Contains(err.Error(), "TRANSPORT ERROR") { t.Errorf("did not report failure from transport: err = %v", err) } rr.Close() // error during http.ReadResponse: trace is structurally okay but has malformed response inside tmpFile := makeTmpFile() if err := os.WriteFile(tmpFile, badResponseTrace, 0o666); err != nil { t.Fatal(err) } rr, err = Open(tmpFile, nil) if err != nil { t.Fatal(err) } if _, err := rr.Client().Get("http://127.0.0.1/myrequest"); err == nil || !strings.Contains(err.Error(), "corrupt httprr trace:") { t.Errorf("did not diagnose invalid httprr trace: err = %v", err) } rr.Close() } type errTransport struct{ err error } func (e errTransport) RoundTrip(req *http.Request) (*http.Response, error) { return nil, e.err } type badRespTransport struct{} func (badRespTransport) RoundTrip(req *http.Request) (*http.Response, error) { resp := new(http.Response) resp.Body = io.NopCloser(iotest.ErrReader(errors.New("TRANSPORT ERROR"))) return resp, nil } ================================================ FILE: internal/llminternal/agent.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) // holds LLMAgent internal state type Agent interface { internal() *State } type State struct { Model model.LLM Tools []tool.Tool Toolsets []tool.Toolset IncludeContents string GenerateContentConfig *genai.GenerateContentConfig Instruction string InstructionProvider InstructionProvider GlobalInstruction string GlobalInstructionProvider InstructionProvider DisallowTransferToParent bool DisallowTransferToPeers bool InputSchema *genai.Schema OutputSchema *genai.Schema OutputKey string } type InstructionProvider func(ctx agent.ReadonlyContext) (string, error) func (s *State) internal() *State { return s } func Reveal(a Agent) *State { return a.internal() } ================================================ FILE: internal/llminternal/agent_transfer.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "bytes" "fmt" "iter" "slices" "strings" "github.com/google/safehtml/template" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/agent/parentmap" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) // From src/google/adk/flows/llm_flows/auto_flow.py // // * SingleFlow // // SingleFlow is the LLM flow that handles tool calls. // // A single flow only considers the agent itself and its tools. // No sub-agents are allowed for a single flow, i.e., // DisallowTransferToParent == true && // DisallowTransferToPeers == true && // len(SubAgents) == 0 // // * AutoFlow // // Agent transfers are allowed in the following directions: // // 1. From parent to sub-agent. // 2. From sub-agent to parent. // 3. From sub-agent to its peer agent. // // Peer-agent transfers are only enabled when all the following conditions are met: // // - The parent agent is also an LLMAgent. // - This agent has DisallowTransferToPeers set to false (default). // // Depending on the target agent type, the transfer may be automatically // reversed. See python's Runner._find_agent_to_run method for which // agent will remain active to handle the next user message. // (src/google/adk/runners.py) // // TODO: implement it in the runners package and update this doc. func AgentTransferRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // TODO: support agent types other than LLMAgent, that have parent/subagents? agent := ctx.Agent() if !shouldUseAutoFlow(agent) { return } parents := parentmap.FromContext(ctx) targets := transferTargets(agent, parents[agent.Name()]) if len(targets) == 0 { return } // TODO(hyangah): why do we set this up in request processor // instead of registering this as a normal function tool of the Agent? transferToAgentTool := &TransferToAgentTool{} si, err := instructionsForTransferToAgent(agent, parents[agent.Name()], targets, transferToAgentTool) if err != nil { yield(nil, err) return } utils.AppendInstructions(req, si) err = appendTools(req, transferToAgentTool) if err != nil { yield(nil, err) } } } type TransferToAgentTool struct{} // Description implements tool.Tool. func (t *TransferToAgentTool) Description() string { return `Transfer the question to another agent. This tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.` } // Name implements tool.Tool. func (t *TransferToAgentTool) Name() string { return "transfer_to_agent" } // IsLongRunning implements tool.Tool. func (t *TransferToAgentTool) IsLongRunning() bool { return false } func (t *TransferToAgentTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{ Name: t.Name(), Description: t.Description(), Parameters: &genai.Schema{ Type: "object", Properties: map[string]*genai.Schema{ "agent_name": { Type: "string", Description: "the agent name to transfer to", }, }, Required: []string{"agent_name"}, }, } } // ProcessRequest implements types.Tool. func (t *TransferToAgentTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return appendTools(req, t) } // Run implements types.Tool. func (t *TransferToAgentTool) Run(ctx tool.Context, args any) (map[string]any, error) { if args == nil { return nil, fmt.Errorf("missing argument") } m, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("unexpected args type: %T", args) } agent, ok := m["agent_name"].(string) if !ok || agent == "" { return nil, fmt.Errorf("empty agent_name: %v", args) } ctx.Actions().TransferToAgent = agent return map[string]any{}, nil } var _ tool.Tool = (*TransferToAgentTool)(nil) func transferTargets(agent, parent agent.Agent) []agent.Agent { targets := slices.Clone(agent.SubAgents()) llmAgent := asLLMAgent(agent) llmParent := asLLMAgent(parent) if llmParent == nil { return targets } if !llmAgent.internal().DisallowTransferToParent { targets = append(targets, parent) } // For peer-agent transfers, it's only enabled when all below conditions are met: // - the parent agent is also of AutoFlow. // - DisallowTransferToPeers is false. if !llmAgent.internal().DisallowTransferToPeers { if shouldUseAutoFlow(parent) { for _, peer := range parent.SubAgents() { if peer.Name() != agent.Name() { targets = append(targets, peer) } } } } return targets } func asLLMAgent(agent agent.Agent) Agent { if agent == nil { return nil } if llmAgent, ok := agent.(Agent); ok { return llmAgent } return nil } func shouldUseAutoFlow(agent agent.Agent) bool { a := asLLMAgent(agent) if a == nil { return false } return len(agent.SubAgents()) != 0 || !a.internal().DisallowTransferToParent || !a.internal().DisallowTransferToPeers } // AppendTools appends the tools to the request. // Appending duplicate tools or nameless tools is an error. func appendTools(r *model.LLMRequest, tools ...tool.Tool) error { if r.Tools == nil { r.Tools = make(map[string]any) } var declarations []*genai.FunctionDeclaration for i, tool := range tools { if tool == nil || tool.Name() == "" { return fmt.Errorf("tools[%d] tool without name: %v", i, tool) } name := tool.Name() if _, ok := r.Tools[name]; ok { return fmt.Errorf("tools[%d] duplicate tool: %q", i, name) } r.Tools[name] = tool if fnTool, ok := tool.(toolinternal.FunctionTool); ok { if decl := fnTool.Declaration(); decl != nil { // TODO: verify for duplicates. declarations = append(declarations, decl) } } } if len(declarations) == 0 { return nil } if r.Config == nil { r.Config = &genai.GenerateContentConfig{} } // Find an existing genai.Tool with FunctionDeclarations var funcTool *genai.Tool for _, gt := range r.Config.Tools { if gt.FunctionDeclarations != nil { funcTool = gt break } } if funcTool != nil { funcTool.FunctionDeclarations = append(funcTool.FunctionDeclarations, declarations...) } else { r.Config.Tools = append(r.Config.Tools, &genai.Tool{ FunctionDeclarations: declarations, }) } return nil } var transferToAgentPromptTmpl = template.Must( template.New("transfer_to_agent_prompt").Parse(agentTransferInstructionTemplate)) func instructionsForTransferToAgent(curAgent, parent agent.Agent, targets []agent.Agent, transferTool tool.Tool) (string, error) { if asLLMAgent(curAgent).internal().DisallowTransferToParent { parent = nil } var buf bytes.Buffer if err := transferToAgentPromptTmpl.Execute(&buf, struct { AgentName string Parent agent.Agent Targets []agent.Agent ToolName string FormattedTargets string }{ AgentName: curAgent.Name(), Parent: parent, Targets: targets, ToolName: transferTool.Name(), FormattedTargets: formatTargets(targets), }); err != nil { return "", err } return buf.String(), nil } func formatTargets(targets []agent.Agent) string { availableAgentNames := make([]string, len(targets)) for i, t := range targets { availableAgentNames[i] = t.Name() } slices.Sort(availableAgentNames) formattedAgentNames := make([]string, len(availableAgentNames)) for i, name := range availableAgentNames { formattedAgentNames[i] = fmt.Sprintf("`%s`", name) } return strings.Join(formattedAgentNames, ", ") } // Prompt source: // flows/llm_flows/agent_transfer.py _build_target_agents_instructions. const agentTransferInstructionTemplate = ` You have a list of other agents to transfer to: {{range .Targets}} Agent name: {{.Name}} Agent description: {{.Description}} {{end}} If you are the best to answer the question according to your description, you can answer it. If another agent is better for answering the question according to its description, call ` + "`" + `{{.ToolName}}` + "`" + ` function to transfer the question to that agent. When transferring, do not generate any text other than the function call. **NOTE**: the only available agents for ` + "`" + `{{.ToolName}}` + "`" + ` function are {{.FormattedTargets}}. {{if .Parent}} If neither you nor the other agents are best for the question, transfer to your parent agent {{.Parent.Name}}. {{end}}` ================================================ FILE: internal/llminternal/agent_transfer_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "encoding/json" "slices" "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/internal/agent/parentmap" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) func TestAgentTransferRequestProcessor(t *testing.T) { curTool := &llminternal.TransferToAgentTool{} llm := &struct{ model.LLM }{} if curTool.Name() == "" || curTool.Description() == "" || curTool.Declaration() == nil { t.Fatalf("unexpected TransferToAgentTool: name=%q, desc=%q, decl=%v", curTool.Name(), curTool.Description(), curTool) } check := func(t *testing.T, curAgent, root agent.Agent, wantParent string, wantAgents, unwantAgents []string) { req := &model.LLMRequest{} parents, err := parentmap.New(root) if err != nil { t.Fatal(err) } ctx := icontext.NewInvocationContext(parentmap.ToContext(t.Context(), parents), icontext.InvocationContextParams{ Agent: curAgent, }) for ev, err := range llminternal.AgentTransferRequestProcessor(ctx, req, &llminternal.Flow{}) { if ev != nil { t.Fatal("AgentTransferRequestProcessor generated an unexpected event") } if err != nil { t.Fatalf("AgentTransferRequestProcessor failed: %v", err) } } // We don't expect transfer. Check AgentTransferRequestProcessor was no-op. if wantParent == "" && len(wantAgents) == 0 { if diff := cmp.Diff(&model.LLMRequest{}, req); diff != "" { t.Errorf("req was changed unexpectedly (-want, +got): %v", diff) } return } // We expect transfer. From here, it's true that either wantParent != "" or len(wantSubagents) > 0. // check tools dictionary. wantToolName := curTool.Name() gotRawTool, ok := req.Tools[wantToolName] if !ok { t.Errorf("req.Tools does not include %v: req.Tools = %v", wantToolName, req.Tools) } gotTool, ok := gotRawTool.(tool.Tool) if !ok { t.Errorf("failed to type convert tool %v, got %T", wantToolName, gotRawTool) } if gotTool.Name() != wantToolName { t.Errorf("unexpected name for tool, got: %v, want: %v", gotTool.Name(), wantToolName) } // check instructions. instructions := utils.TextParts(req.Config.SystemInstruction) if !slices.ContainsFunc(instructions, func(s string) bool { return strings.Contains(s, wantToolName) && strings.Contains(s, "You have a list of other agents to transfer to") }) { t.Errorf("instruction does not include agent transfer instruction, got: %s", strings.Join(instructions, "\n")) } if wantParent != "" && !slices.ContainsFunc(instructions, func(s string) bool { return strings.Contains(s, wantParent) }) { t.Errorf("instruction does not include parent agent, got: %s", strings.Join(instructions, "\n")) } if slices.Contains(instructions, curAgent.Name()) { t.Errorf("instruction should not suggest transfer to current agent, got: %s", strings.Join(instructions, "\n")) } if len(wantAgents) > 0 && !slices.ContainsFunc(instructions, func(s string) bool { return slices.ContainsFunc(wantAgents, func(sub string) bool { for _, subagent := range wantAgents { if !strings.Contains(s, subagent) { return false } } return true }) }) { t.Errorf("instruction does not include subagents, got: %s", strings.Join(instructions, "\n")) } if len(unwantAgents) > 0 && slices.ContainsFunc(instructions, func(s string) bool { return slices.ContainsFunc(unwantAgents, func(unwanted string) bool { for _, unwanted := range unwantAgents { if strings.Contains(s, unwanted) { return true } } return false }) }) { t.Errorf("instruction includes unwanted agents, got: %s", strings.Join(instructions, "\n")) } // check function declarations. wantToolDescription := curTool.Description() functions := utils.FunctionDecls(req.Config) if !slices.ContainsFunc(functions, func(f *genai.FunctionDeclaration) bool { return f.Name == wantToolName && strings.Contains(f.Description, wantToolDescription) && f.ParametersJsonSchema == nil }) { t.Errorf("AgentTransferRequestProcessor() did not append the function declaration, got: %v", stringify(functions)) } } t.Run("SoloAgent", func(t *testing.T) { agent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, })) check(t, agent, agent, "", nil, []string{"Current"}) }) t.Run("NotLLMAgent", func(t *testing.T) { a := utils.Must(agent.New(agent.Config{ Name: "mockAgent", })) check(t, a, a, "", nil, nil) }) t.Run("LLMAgentParent", func(t *testing.T) { testAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{testAgent}, })) check(t, testAgent, root, "Parent", nil, []string{"Current"}) }) t.Run("LLMAgentParentAndPeer", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{curAgent, peer}, })) check(t, curAgent, root, "Parent", []string{"Peer"}, []string{"Current"}) }) t.Run("LLMAgentSubagents", func(t *testing.T) { agent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, SubAgents: []agent.Agent{ utils.Must(agent.New(agent.Config{ Name: "Sub1", })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) check(t, agent, agent, "", []string{"Sub1", "Sub2"}, []string{"Current"}) }) t.Run("AgentWithParentAndPeersAndSubagents", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, SubAgents: []agent.Agent{ utils.Must(agent.New(agent.Config{ Name: "Sub1", })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) peer := utils.Must(agent.New(agent.Config{ Name: "Peer", })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{curAgent, peer}, })) check(t, curAgent, root, "Parent", []string{"Peer", "Sub1", "Sub2"}, []string{"Current"}) }) t.Run("NonLLMAgentSubagents", func(t *testing.T) { agent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, SubAgents: []agent.Agent{ utils.Must(agent.New(agent.Config{ Name: "Sub1", })), utils.Must(agent.New(agent.Config{ Name: "Sub2", })), }, })) check(t, agent, agent, "", []string{"Sub1", "Sub2"}, []string{"Current"}) }) t.Run("AgentWithDisallowTransferToParent", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToParent: true, SubAgents: []agent.Agent{ utils.Must(llmagent.New(llmagent.Config{ Name: "Sub1", Model: llm, })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{ curAgent, }, })) check(t, curAgent, root, "", []string{"Sub1", "Sub2"}, []string{"Parent", "Current"}) }) t.Run("AgentWithDisallowTransferToPeers", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToPeers: true, SubAgents: []agent.Agent{ utils.Must(agent.New(agent.Config{ Name: "Sub1", })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{ curAgent, peer, }, })) check(t, curAgent, root, "Parent", []string{"Sub1", "Sub2"}, []string{"Peer", "Current"}) }) t.Run("AgentWithDisallowTransferToParentAndPeers", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToParent: true, DisallowTransferToPeers: true, SubAgents: []agent.Agent{ utils.Must(agent.New(agent.Config{ Name: "Sub1", })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{peer, curAgent}, })) check(t, curAgent, root, "", []string{"Sub1", "Sub2"}, []string{"Parent", "Peer", "Current"}) }) t.Run("AgentWithDisallowTransfer", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToParent: true, DisallowTransferToPeers: true, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(llmagent.New(llmagent.Config{ Name: "Parent", Model: llm, SubAgents: []agent.Agent{curAgent, peer}, })) check(t, curAgent, root, "", nil, []string{"Parent", "Peer", "Current"}) }) t.Run("AgentWithParallelParent", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToParent: false, DisallowTransferToPeers: false, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "Parent", SubAgents: []agent.Agent{curAgent, peer}, }, })) check(t, curAgent, root, "", nil, []string{"Parent", "Peer", "Current"}) }) t.Run("AgentWithSequentialParent", func(t *testing.T) { curAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, DisallowTransferToParent: false, DisallowTransferToPeers: false, })) peer := utils.Must(llmagent.New(llmagent.Config{ Name: "Peer", Model: llm, })) root := utils.Must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "Parent", SubAgents: []agent.Agent{curAgent, peer}, }, })) check(t, curAgent, root, "", nil, []string{"Parent", "Peer", "Current"}) }) t.Run("AgentWithSequentialSubagent", func(t *testing.T) { seqSub := utils.Must(llmagent.New(llmagent.Config{ Name: "Sub3", Model: llm, })) agent := utils.Must(llmagent.New(llmagent.Config{ Name: "Current", Model: llm, SubAgents: []agent.Agent{ utils.Must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "Sub1", SubAgents: []agent.Agent{seqSub}, }, })), utils.Must(llmagent.New(llmagent.Config{ Name: "Sub2", Model: llm, })), }, })) check(t, agent, agent, "", []string{"Sub1", "Sub2"}, []string{"Current"}) }) } func TestAgentTransfer_ProcessRequest(t *testing.T) { // First Tool type Input struct { x int } var req model.LLMRequest handler := func(ctx tool.Context, input Input) (int, error) { return input.x, nil } identityTool, err := functiontool.New(functiontool.Config{ Name: "identity", Description: "returns the input value", }, handler) if err != nil { panic(err) } requestProcessor, ok := identityTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("identityTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("identityTool.ProcessRequest failed: %v", err) } // Second tool transferToAgentTool := &llminternal.TransferToAgentTool{} if err := transferToAgentTool.ProcessRequest(nil, &req); err != nil { t.Fatalf("transferToAgentTool.ProcessRequest failed: %v", err) } if len(req.Config.Tools) != 1 { t.Errorf("number of tools should be one, got: %d", len(req.Config.Tools)) } if len(req.Config.Tools[0].FunctionDeclarations) != 2 { t.Errorf("number of function declarations should be two, got: %d", len(req.Config.Tools[0].FunctionDeclarations)) } } func TestTransferToAgentToolRun(t *testing.T) { t.Run("Success", func(t *testing.T) { curTool := &llminternal.TransferToAgentTool{} invCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}) ctx := toolinternal.NewToolContext(invCtx, "", &session.EventActions{}, nil) wantAgentName := "TestAgent" args := map[string]any{"agent_name": wantAgentName} if _, err := curTool.Run(ctx, args); err != nil { t.Fatalf("Run(%v) failed: %v", args, err) } if got, want := ctx.Actions().TransferToAgent, wantAgentName; got != want { t.Errorf("Run(%v) did not set TransferToAgent, got %q, want %q", args, got, want) } }) t.Run("InvalidArguments", func(t *testing.T) { testCases := []struct { name string args map[string]any }{ {name: "NoAgentName", args: map[string]any{}}, {name: "NilArg", args: nil}, {name: "InvalidType", args: map[string]any{"agent_name": 123}}, {name: "InvalidValue", args: map[string]any{"agent_name": ""}}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { curTool := &llminternal.TransferToAgentTool{} ctx := toolinternal.NewToolContext(icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}), "", nil, nil) if got, err := curTool.Run(ctx, tc.args); err == nil { t.Fatalf("Run(%v) = (%v, %v), want error", tc.args, got, err) } }) } }) } func stringify(v any) string { s, _ := json.Marshal(v) return string(s) } ================================================ FILE: internal/llminternal/base_flow.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "context" "errors" "fmt" "iter" "maps" "slices" "strings" "sync" "github.com/google/uuid" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/agent/parentmap" "google.golang.org/adk/internal/agent/runconfig" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal/googlellm" "google.golang.org/adk/internal/plugininternal/plugincontext" "google.golang.org/adk/internal/telemetry" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/toolconfirmation" ) var ErrModelNotConfigured = errors.New("model not configured; ensure Model is set in llmagent.Config") type BeforeModelCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) type AfterModelCallback func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) type OnModelErrorCallback func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error) type BeforeToolCallback func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) type AfterToolCallback func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) type OnToolErrorCallback func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) type Flow struct { Model model.LLM Tools []tool.Tool RequestProcessors []func(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] ResponseProcessors []func(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error BeforeModelCallbacks []BeforeModelCallback AfterModelCallbacks []AfterModelCallback OnModelErrorCallbacks []OnModelErrorCallback BeforeToolCallbacks []BeforeToolCallback AfterToolCallbacks []AfterToolCallback OnToolErrorCallbacks []OnToolErrorCallback } var ( DefaultRequestProcessors = []func(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error]{ basicRequestProcessor, toolProcessor, authPreprocessor, RequestConfirmationRequestProcessor, instructionsRequestProcessor, identityRequestProcessor, ContentsRequestProcessor, // Some implementations of NL Planning mark planning contents as thoughts in the post processor. // Since these need to be unmarked, NL Planning should be after contentsRequestProcessor. nlPlanningRequestProcessor, // Code execution should be after contentsRequestProcessor as it mutates the contents // to optimize data files. codeExecutionRequestProcessor, outputSchemaRequestProcessor, AgentTransferRequestProcessor, removeDisplayNameIfExists, } DefaultResponseProcessors = []func(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error{ nlPlanningResponseProcessor, codeExecutionResponseProcessor, } ) func (f *Flow) Run(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { for { var lastEvent *session.Event for ev, err := range f.runOneStep(ctx) { if err != nil { yield(nil, err) return } // forward the event first. if !yield(ev, nil) { return } lastEvent = ev } if lastEvent == nil || lastEvent.IsFinalResponse() { return } if lastEvent.LLMResponse.Partial { // We may have reached max token limit during streaming mode. // TODO: handle Partial response in model level. CL 781377328 yield(nil, fmt.Errorf("TODO: last event is not final")) return } } } } func (f *Flow) runOneStep(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { if f.Model == nil { yield(nil, fmt.Errorf("agent %q: %w", ctx.Agent().Name(), ErrModelNotConfigured)) return } req := &model.LLMRequest{ Model: f.Model.Name(), } // Preprocess before calling the LLM. for ev, err := range f.preprocess(ctx, req) { if err != nil { yield(nil, err) return } if ev != nil { if !yield(ev, nil) { return } } } if ctx.Ended() { return } // Create event to pass to callback state delta stateDelta := make(map[string]any) artifactDelta := make(map[string]int64) // Calls the LLM. for resp, err := range f.callLLM(ctx, req, stateDelta, artifactDelta) { if err != nil { yield(nil, err) return } if err := f.postprocess(ctx, req, resp); err != nil { yield(nil, err) return } // Skip the model response event if there is no content and no error code. // This is needed for the code executor to trigger another loop according to // adk-python src/google/adk/flows/llm_flows/base_llm_flow.py BaseLlmFlow._postprocess_async. if resp.Content == nil && resp.ErrorCode == "" && !resp.Interrupted { continue } // TODO: temporarily convert tools := make(map[string]tool.Tool) for k, v := range req.Tools { tool, ok := v.(tool.Tool) if !ok { if !yield(nil, fmt.Errorf("unexpected tool type %T for tool %v", v, k)) { return } } tools[k] = tool } // Build the event and yield. modelResponseEvent := f.finalizeModelResponseEvent(ctx, resp, tools, stateDelta) if !yield(modelResponseEvent, nil) { return } // TODO: generate and yield an auth event if needed. if resp.Partial { continue } // Handle function calls. ev, err := f.handleFunctionCalls(ctx, tools, resp.LLMResponse, nil) if err != nil { yield(nil, err) return } if ev == nil { // nothing to yield/process. continue } toolConfirmationEvent := generateRequestConfirmationEvent(ctx, modelResponseEvent, ev) if toolConfirmationEvent != nil { if !yield(toolConfirmationEvent, nil) { return } } if !yield(ev, nil) { return } // If the model response is structured, yield it as a final model response event. outputSchemaResponse, err := retrieveStructuredModelResponse(ev) if err != nil { yield(nil, err) return } if outputSchemaResponse != "" { if !yield(createFinalModelResponseEvent(ctx, outputSchemaResponse), nil) { return } } // Actually handle "transfer_to_agent" tool. The function call sets the ev.Actions.TransferToAgent field. // We are following python's execution flow which is // BaseLlmFlow._postprocess_async // -> _postprocess_handle_function_calls_async // TODO(hakim): figure out why this isn't handled by the runner. if ev.Actions.TransferToAgent == "" { return } nextAgent := f.agentToRun(ctx, ev.Actions.TransferToAgent) if nextAgent == nil { yield(nil, fmt.Errorf("failed to find agent: %s", ev.Actions.TransferToAgent)) return } for ev, err := range nextAgent.Run(ctx) { if !yield(ev, err) || err != nil { // forward return } } } } } func (f *Flow) preprocess(ctx agent.InvocationContext, req *model.LLMRequest) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // apply request processor functions to the request in the configured order. for _, processor := range f.RequestProcessors { for ev, err := range processor(ctx, req, f) { if err != nil { yield(nil, err) return } if ev != nil { yield(ev, nil) } } } if f.Tools != nil { if err := toolPreprocess(ctx, req, f.Tools); err != nil { yield(nil, err) } } } } // toolPreprocess runs tool preprocess on the given request // If a tool set is encountered, it's expanded recursively in DFS fashion. // TODO: check need/feasibility of running this concurrently. func toolPreprocess(ctx agent.InvocationContext, req *model.LLMRequest, tools []tool.Tool) error { for _, t := range tools { requestProcessor, ok := t.(toolinternal.RequestProcessor) if !ok { return fmt.Errorf("tool %q does not implement RequestProcessor() method", t.Name()) } // TODO: how to prevent mutation on this? toolCtx := toolinternal.NewToolContext(ctx, "", &session.EventActions{}, nil) if err := requestProcessor.ProcessRequest(toolCtx, req); err != nil { return err } } return nil } func newResponseWithEventID(resp *model.LLMResponse) *responseWithEventID { return &responseWithEventID{resp, uuid.New().String()} } func (f *Flow) callLLM(ctx agent.InvocationContext, req *model.LLMRequest, stateDelta map[string]any, artifactDelta map[string]int64) iter.Seq2[*responseWithEventID, error] { return func(yield func(*responseWithEventID, error) bool) { pluginManager := pluginManagerFromContext(ctx) if pluginManager != nil { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := pluginManager.RunBeforeModelCallback(cctx, req) if callbackResponse != nil || callbackErr != nil { yield(newResponseWithEventID(callbackResponse), callbackErr) return } } for _, callback := range f.BeforeModelCallbacks { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := callback(cctx, req) if callbackResponse != nil || callbackErr != nil { yield(newResponseWithEventID(callbackResponse), callbackErr) return } } // TODO: Set _ADK_AGENT_NAME_LABEL_KEY in req.GenerateConfig.Labels // to help with slicing the billing reports on a per-agent basis. // TODO: RunLive mode when invocation_context.run_config.support_cfc is true. useStream := runconfig.FromContext(ctx).StreamingMode == runconfig.StreamingModeSSE for resp, err := range generateContent(ctx, f.Model, req, useStream) { if err != nil { cbResp, cbErr := f.runOnModelErrorCallbacks(ctx, req, stateDelta, artifactDelta, err) if cbErr != nil { yield(nil, cbErr) return } if cbResp == nil { yield(nil, err) return } resp = &responseWithEventID{ LLMResponse: cbResp, eventID: resp.eventID, } err = cbErr } // Function call ID is optional in genai API and some models do not use the field. // Set it in case after model callbacks use it. utils.PopulateClientFunctionCallID(resp.Content) callbackResp, callbackErr := f.runAfterModelCallbacks(ctx, resp.LLMResponse, stateDelta, artifactDelta, err) // TODO: check if we should stop iterator on the first error from stream or continue yielding next results. if callbackErr != nil { yield(nil, callbackErr) return } if callbackResp != nil { resp := &responseWithEventID{ LLMResponse: callbackResp, eventID: resp.eventID, } if !yield(resp, nil) { return } continue } // TODO: check if we should stop iterator on the first error from stream or continue yielding next results. if err != nil { yield(nil, err) return } if !yield(resp, nil) { return } } } } type responseWithEventID struct { *model.LLMResponse eventID string } // generateContent wraps the LLM call with tracing and logging. // The generate_content span should cover only calls to LLM. Plugins and callbacks should be outside of this span. func generateContent(ctx agent.InvocationContext, m model.LLM, req *model.LLMRequest, useStream bool) iter.Seq2[*responseWithEventID, error] { return func(yield func(*responseWithEventID, error) bool) { spanCtx, span := telemetry.StartGenerateContentSpan(ctx, telemetry.StartGenerateContentSpanParams{ ModelName: m.Name(), InvocationID: ctx.InvocationID(), }) ctx = ctx.WithContext(spanCtx) backend := googlellm.GetGoogleLLMVariant(m) // Log request before calling the model. telemetry.LogRequest(ctx, req, backend) var lastResponse responseWithEventID var lastErr error spanEnded := false endSpanAndTrackResult := func() { if spanEnded { // Return to avoid spamming the logs with "span already ended" errors. return } telemetry.TraceGenerateContentResult(span, telemetry.TraceGenerateContentResultParams{ Response: lastResponse.LLMResponse, EventID: lastResponse.eventID, Error: lastErr, }) span.End() spanEnded = true } // Ensure that the span is ended in case of error or if none final responses are yielded before the yield returns false. defer endSpanAndTrackResult() for resp, err := range m.GenerateContent(ctx, req, useStream) { response := newResponseWithEventID(resp) lastResponse = *response lastErr = err // Complete the span immediately to avoid capturing the upstream yield processing time. if err != nil { endSpanAndTrackResult() } else if !resp.Partial { // Log only final responses. telemetry.LogResponse(ctx, resp, backend) endSpanAndTrackResult() } if !yield(response, err) { return } } } } func (f *Flow) runAfterModelCallbacks(ctx agent.InvocationContext, llmResp *model.LLMResponse, stateDelta map[string]any, artifactDelta map[string]int64, llmErr error) (*model.LLMResponse, error) { pluginManager := pluginManagerFromContext(ctx) if pluginManager != nil { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := pluginManager.RunAfterModelCallback(cctx, llmResp, llmErr) if callbackResponse != nil || callbackErr != nil { return callbackResponse, callbackErr } } for _, callback := range f.AfterModelCallbacks { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := callback(cctx, llmResp, llmErr) if callbackResponse != nil || callbackErr != nil { return callbackResponse, callbackErr } } return nil, nil } func (f *Flow) runOnModelErrorCallbacks(ctx agent.InvocationContext, llmReq *model.LLMRequest, stateDelta map[string]any, artifactDelta map[string]int64, llmErr error) (*model.LLMResponse, error) { pluginManager := pluginManagerFromContext(ctx) if pluginManager != nil { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := pluginManager.RunOnModelErrorCallback(cctx, llmReq, llmErr) if callbackResponse != nil || callbackErr != nil { return callbackResponse, callbackErr } } for _, callback := range f.OnModelErrorCallbacks { cctx := icontext.NewCallbackContextWithDelta(ctx, stateDelta, artifactDelta) callbackResponse, callbackErr := callback(cctx, llmReq, llmErr) if callbackResponse != nil || callbackErr != nil { return callbackResponse, callbackErr } } return nil, nil } func (f *Flow) postprocess(ctx agent.InvocationContext, req *model.LLMRequest, resp *responseWithEventID) error { // apply response processor functions to the response in the configured order. for _, processor := range f.ResponseProcessors { if err := processor(ctx, req, resp.LLMResponse); err != nil { return err } } return nil } func (f *Flow) agentToRun(ctx agent.InvocationContext, agentName string) agent.Agent { // NOTE: in python, BaseLlmFlow._get_agent_to_run searches the entire agent // tree from the root_agent when processing _postprocess_handle_function_calls_async. // I think that is strange. In our version, we check the agents included in transferTarget. parents := parentmap.FromContext(ctx) agents := transferTargets(ctx.Agent(), parents[ctx.Agent().Name()]) for _, agent := range agents { if agent.Name() == agentName { return agent } } return nil } func (f *Flow) finalizeModelResponseEvent(ctx agent.InvocationContext, resp *responseWithEventID, tools map[string]tool.Tool, stateDelta map[string]any) *session.Event { // FunctionCall & FunctionResponse matching algorithm assumes non-empty function call IDs // but function call ID is optional in genai API and some models do not use the field. // Generate function call ids. (see functions.populate_client_function_call_id in python SDK) utils.PopulateClientFunctionCallID(resp.Content) ev := session.NewEvent(ctx.InvocationID()) ev.ID = resp.eventID // TODO change NewEvent to accept event id ev.Author = ctx.Agent().Name() ev.Branch = ctx.Branch() ev.LLMResponse = *resp.LLMResponse ev.Actions.StateDelta = stateDelta // Populate ev.LongRunningToolIDs ev.LongRunningToolIDs = findLongRunningFunctionCallIDs(resp.Content, tools) return ev } // findLongRunningFunctionCallIDs iterates over the FunctionCalls and // returns the callIDs of the long running functions func findLongRunningFunctionCallIDs(c *genai.Content, tools map[string]tool.Tool) []string { set := make(map[string]struct{}) // Iterate over function calls. for _, fc := range utils.FunctionCalls(c) { if tool, ok := tools[fc.Name]; ok && fc.ID != "" && tool.IsLongRunning() { // If the tool exists and is long-running, add its ID to the set. set[fc.ID] = struct{}{} } } // Transform the set (map keys) into a slice. return slices.Collect(maps.Keys(set)) } type fakeTool struct { name string } func (f *fakeTool) Name() string { return f.name } func (*fakeTool) Description() string { return "Tool not found" } func (*fakeTool) IsLongRunning() bool { return false } var _ tool.Tool = (*fakeTool)(nil) // newToolNotFoundError creates an error matching the specific Python format func newToolNotFoundError(toolName string, availableTools []string) error { joinedTools := strings.Join(availableTools, ", ") return fmt.Errorf(`tool '%s' not found. Available tools: %s Possible causes: 1. LLM hallucinated the function name - review agent instruction clarity 2. Tool not registered - verify agent.tools list 3. Name mismatch - check for typos Suggested fixes: - Review agent instruction to ensure tool usage is clear - Verify tool is included in agent.tools list - Check for typos in function name`, toolName, joinedTools) } // handleFunctionCalls calls the functions and returns the function response event. // // TODO: accept filters to include/exclude function calls. // TODO: check feasibility of running tool.Run concurrently. func (f *Flow) handleFunctionCalls(ctx agent.InvocationContext, toolsDict map[string]tool.Tool, resp *model.LLMResponse, toolConfirmations map[string]*toolconfirmation.ToolConfirmation) (mergedEvent *session.Event, err error) { fnCalls := utils.FunctionCalls(resp.Content) toolNames := slices.Collect(maps.Keys(toolsDict)) // Merged span for parallel tool calls - create only if there is more than one tool call. if len(fnCalls) > 1 { mergedCtx, mergedToolCallSpan := telemetry.StartTrace(ctx, "execute_tool (merged)") ctx = ctx.WithContext(mergedCtx) defer func() { telemetry.TraceMergedToolCallsResult(mergedToolCallSpan, mergedEvent, err) mergedToolCallSpan.End() }() } fnResponseEvents := make([]*session.Event, len(fnCalls)) var wg sync.WaitGroup for i, fnCall := range fnCalls { wg.Add(1) go func(i int, fnCall *genai.FunctionCall) { defer wg.Done() sctx, span := telemetry.StartExecuteToolSpan(ctx, telemetry.StartExecuteToolSpanParams{ ToolName: fnCall.Name, Args: fnCall.Args, }) defer span.End() toolCallCtx := ctx.WithContext(sctx) var confirmation *toolconfirmation.ToolConfirmation if toolConfirmations != nil { confirmation = toolConfirmations[fnCall.ID] } toolCtx := toolinternal.NewToolContext(toolCallCtx, fnCall.ID, &session.EventActions{StateDelta: make(map[string]any)}, confirmation) var result map[string]any curTool, found := toolsDict[fnCall.Name] if !found { err := newToolNotFoundError(fnCall.Name, toolNames) result, err = f.runOnToolErrorCallbacks(toolCtx, &fakeTool{name: fnCall.Name}, fnCall.Args, err) if err != nil { result = map[string]any{"error": err.Error()} } } else if funcTool, ok := curTool.(toolinternal.FunctionTool); !ok { err := newToolNotFoundError(fnCall.Name, toolNames) result, err = f.runOnToolErrorCallbacks(toolCtx, &fakeTool{name: fnCall.Name}, fnCall.Args, err) if err != nil { result = map[string]any{"error": err.Error()} } } else { result = f.callTool(toolCtx, funcTool, fnCall.Args) } // TODO: handle long-running tool. ev := session.NewEvent(ctx.InvocationID()) ev.LLMResponse = model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ ID: fnCall.ID, Name: fnCall.Name, Response: result, }, }, }, }, } ev.Author = ctx.Agent().Name() ev.Branch = ctx.Branch() ev.Actions = *toolCtx.Actions() traceTool := curTool if traceTool == nil { traceTool = &fakeTool{name: fnCall.Name} } var toolErr error resultErr := result["error"] if resultErr != nil { if err, ok := resultErr.(error); ok { toolErr = err } else if errStr, ok := resultErr.(string); ok { toolErr = errors.New(errStr) } } telemetry.TraceToolResult(span, telemetry.TraceToolResultParams{ Description: traceTool.Description(), ResponseEvent: ev, Error: toolErr, }) fnResponseEvents[i] = ev }(i, fnCall) } wg.Wait() mergedEvent, err = mergeParallelFunctionResponseEvents(fnResponseEvents) if err != nil { return mergedEvent, err } return mergedEvent, nil } func (f *Flow) runOnToolErrorCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any, err error) (map[string]any, error) { pluginManager := pluginManagerFromContext(toolCtx) if pluginManager != nil { result, err := pluginManager.RunOnToolErrorCallback(toolCtx, tool, fArgs, err) if result != nil || err != nil { return result, err } } return f.invokeOnToolErrorCallbacks(toolCtx, tool, fArgs, err) } func (f *Flow) callTool(toolCtx tool.Context, tool toolinternal.FunctionTool, fArgs map[string]any) map[string]any { var response map[string]any var err error pluginManager := pluginManagerFromContext(toolCtx) if pluginManager != nil { response, err = pluginManager.RunBeforeToolCallback(toolCtx, tool, fArgs) } if response == nil && err == nil { response, err = f.invokeBeforeToolCallbacks(toolCtx, tool, fArgs) } if response == nil && err == nil { response, err = tool.Run(toolCtx, fArgs) } var errorResponse map[string]any var cbErr error if err != nil && pluginManager != nil { errorResponse, cbErr = pluginManager.RunOnToolErrorCallback(toolCtx, tool, fArgs, err) } if err != nil && errorResponse == nil && cbErr == nil { errorResponse, cbErr = f.invokeOnToolErrorCallbacks(toolCtx, tool, fArgs, err) } if errorResponse != nil || cbErr != nil { response = errorResponse err = cbErr } var alteredResponse map[string]any var alteredErr error if pluginManager != nil { alteredResponse, alteredErr = pluginManager.RunAfterToolCallback(toolCtx, tool, fArgs, response, err) } if alteredResponse == nil && alteredErr == nil { alteredResponse, alteredErr = f.invokeAfterToolCallbacks(toolCtx, tool, fArgs, response, err) } if alteredResponse != nil || alteredErr != nil { response = alteredResponse err = alteredErr } if err != nil { return map[string]any{"error": err.Error()} } return response } func (f *Flow) invokeBeforeToolCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any) (map[string]any, error) { for _, callback := range f.BeforeToolCallbacks { result, err := callback(toolCtx, tool, fArgs) if err != nil { return nil, err } // When a list of callbacks is provided, the callbacks will be called in the // order they are listed while a callback returns nil. if result != nil { return result, nil } } return nil, nil } func (f *Flow) invokeAfterToolCallbacks(toolCtx tool.Context, tool toolinternal.FunctionTool, fArgs, fResult map[string]any, fErr error) (map[string]any, error) { for _, callback := range f.AfterToolCallbacks { result, err := callback(toolCtx, tool, fArgs, fResult, fErr) if err != nil { return nil, err } // When a list of callbacks is provided, the callbacks will be called in the // order they are listed while a callback returns nil. if result != nil { return result, nil } } // If no callback returned a result/error, return the original result/error. return fResult, fErr } func (f *Flow) invokeOnToolErrorCallbacks(toolCtx tool.Context, tool tool.Tool, fArgs map[string]any, fErr error) (map[string]any, error) { for _, callback := range f.OnToolErrorCallbacks { result, err := callback(toolCtx, tool, fArgs, fErr) if err != nil { return nil, err } // When a list of callbacks is provided, the callbacks will be called in the // order they are listed while a callback returns nil. if result != nil { return result, nil } } // If no callback returned a result/error, return the original result/error. return nil, fErr } func mergeParallelFunctionResponseEvents(events []*session.Event) (*session.Event, error) { switch len(events) { case 0: return nil, nil case 1: return events[0], nil } var parts []*genai.Part var actions *session.EventActions for _, ev := range events { if ev == nil || ev.LLMResponse.Content == nil { continue } parts = append(parts, ev.LLMResponse.Content.Parts...) actions = mergeEventActions(actions, &ev.Actions) } // reuse events[0] ev := events[0] ev.LLMResponse = model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: parts, }, } ev.Actions = *actions return ev, nil } func mergeEventActions(base, other *session.EventActions) *session.EventActions { // flows/llm_flows/functions.py merge_parallel_function_response_events if other == nil { return base } if base == nil { return other } if other.SkipSummarization { base.SkipSummarization = true } if other.TransferToAgent != "" { base.TransferToAgent = other.TransferToAgent } if other.Escalate { base.Escalate = true } if other.StateDelta != nil { base.StateDelta = deepMergeMap(base.StateDelta, other.StateDelta) } // TODO add similar logic for state if other.RequestedToolConfirmations != nil { if base.RequestedToolConfirmations == nil { base.RequestedToolConfirmations = make(map[string]toolconfirmation.ToolConfirmation) } maps.Copy(base.RequestedToolConfirmations, other.RequestedToolConfirmations) } return base } func deepMergeMap(dst, src map[string]any) map[string]any { if dst == nil { dst = make(map[string]any) } for key, value := range src { if srcMap, ok := value.(map[string]any); ok { if dstMap, ok := dst[key].(map[string]any); ok { dst[key] = deepMergeMap(dstMap, srcMap) continue } } dst[key] = value } return dst } func pluginManagerFromContext(ctx context.Context) pluginManager { m, ok := ctx.Value(plugincontext.PluginManagerCtxKey).(pluginManager) if !ok { return nil } return m } type pluginManager interface { RunBeforeModelCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) RunAfterModelCallback(cctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) RunOnModelErrorCallback(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error) RunBeforeToolCallback(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) RunAfterToolCallback(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) RunOnToolErrorCallback(ctx tool.Context, t tool.Tool, args map[string]any, err error) (map[string]any, error) } ================================================ FILE: internal/llminternal/base_flow_telemetry_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "context" "errors" "iter" "sync" "testing" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/log/global" sdklog "go.opentelemetry.io/otel/sdk/log" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "google.golang.org/genai" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/model" ) type mockModelForTest struct { name string generateContent func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] } func (m *mockModelForTest) Name() string { return m.name } func (m *mockModelForTest) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { if m.generateContent != nil { return m.generateContent(ctx, req, stream) } return func(yield func(*model.LLMResponse, error) bool) {} } func (m *mockModelForTest) Backend() genai.Backend { return genai.BackendGeminiAPI } var ( testExporter *tracetest.InMemoryExporter initTracer sync.Once ) func TestGenerateContentTracing(t *testing.T) { setupTestTracer(t) modelMock := &mockModelForTest{ name: "test-model", generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { // Yield partial response. if !yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 2, }, Partial: true, }, nil) { return } // Verify span NOT ended. gotSpans := testExporter.GetSpans() if len(gotSpans) != 0 { t.Errorf("expected 0 spans after partial response, got %d", len(gotSpans)) } // Yield final response. if !yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 10, CandidatesTokenCount: 20, }, Partial: false, }, nil) { return } // Verify span ENDED. gotSpans = testExporter.GetSpans() if len(gotSpans) != 1 { t.Errorf("expected 1 span after final response, got %d", len(gotSpans)) } // Yield final response - should not panic. if !yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 100, CandidatesTokenCount: 200, }, Partial: false, }, nil) { return } // Verify there is no new span. gotSpans = testExporter.GetSpans() if len(gotSpans) != 1 { t.Errorf("expected 1 span after final response, got %d", len(gotSpans)) } } }, } ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) for range generateContent(ctx, modelMock, &model.LLMRequest{}, true) { } // Verify that there is only single span. gotSpans := testExporter.GetSpans() if len(gotSpans) != 1 { t.Fatalf("expected 1 span, got %d", len(gotSpans)) } gotSpan := gotSpans[0] if gotSpan.Name != "generate_content test-model" { t.Errorf("expected span name %q, got %q", "generate_content test-model", gotSpan.Name) } // Verify span attributes. attrs := make(map[attribute.Key]string) for _, kv := range gotSpan.Attributes { attrs[kv.Key] = kv.Value.Emit() } if val := attrs[semconv.GenAIUsageInputTokensKey]; val != "10" { t.Errorf("expected input tokens 10, got %s", val) } if val := attrs[semconv.GenAIUsageOutputTokensKey]; val != "20" { t.Errorf("expected output tokens 20, got %s", val) } if val := attrs["gcp.vertexai.invocation_id"]; val != "" { t.Errorf("expected invocation id, got %s", val) } } func TestGenerateContentTracingNoFinalResponse(t *testing.T) { setupTestTracer(t) modelMock := &mockModelForTest{ name: "test-model", generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { // Yield partial response. if !yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 10, CandidatesTokenCount: 20, }, Partial: true, }, nil) { return } // Verify span NOT ended. gotSpans := testExporter.GetSpans() if len(gotSpans) != 0 { t.Errorf("expected 0 spans after partial response, got %d", len(gotSpans)) } } }, } ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) for range generateContent(ctx, modelMock, &model.LLMRequest{}, true) { } // Verify that there is only single span. gotSpans := testExporter.GetSpans() if len(gotSpans) != 1 { t.Fatalf("expected 1 span, got %d", len(gotSpans)) } gotSpan := gotSpans[0] if gotSpan.Name != "generate_content test-model" { t.Errorf("expected span name %q, got %q", "generate_content test-model", gotSpan.Name) } // Verify span attributes. attrs := make(map[attribute.Key]string) for _, kv := range gotSpan.Attributes { attrs[kv.Key] = kv.Value.Emit() } if val := attrs[semconv.GenAIUsageInputTokensKey]; val != "10" { t.Errorf("expected input tokens 10, got %s", val) } if val := attrs[semconv.GenAIUsageOutputTokensKey]; val != "20" { t.Errorf("expected output tokens 20, got %s", val) } } func TestGenerateContentTracingError(t *testing.T) { setupTestTracer(t) modelMock := &mockModelForTest{ name: "test-model", generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { // Yield partial response. if !yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 2, }, Partial: true, }, nil) { return } // Yield error. yield(nil, errors.New("test error")) // Verify span ended. gotSpans := testExporter.GetSpans() if len(gotSpans) != 1 { t.Errorf("expected 1 span after error, got %d", len(gotSpans)) } } }, } ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) for range generateContent(ctx, modelMock, &model.LLMRequest{}, true) { } // Verify that there is only single span. gotSpans := testExporter.GetSpans() if len(gotSpans) != 1 { t.Fatalf("expected 1 span, got %d", len(gotSpans)) } gotSpan := gotSpans[0] if gotSpan.Name != "generate_content test-model" { t.Errorf("expected span name %q, got %q", "generate_content test-model", gotSpan.Name) } if gotSpan.Status.Code != codes.Error { t.Errorf("expected span status %q, got %q", codes.Error, gotSpan.Status.Code) } if gotSpan.Status.Description != "test error" { t.Errorf("expected span status description %q, got %q", "test error", gotSpan.Status.Description) } } func setupTestTracer(t *testing.T) { t.Helper() initTracer.Do(func() { // internal/telemetry initializes the global tracer provider once at startup. // Subsequent calls to otel.SetTracerProvider don't update existing tracer providers, so we can override only once. testExporter = tracetest.NewInMemoryExporter() tp := sdktrace.NewTracerProvider( sdktrace.WithSyncer(testExporter), ) otel.SetTracerProvider(tp) }) // Reset the exporter before each test to avoid flakiness. testExporter.Reset() t.Cleanup(func() { testExporter.Reset() }) } type inMemoryLogExporter struct { records []sdklog.Record } func (e *inMemoryLogExporter) Export(ctx context.Context, records []sdklog.Record) error { e.records = append(e.records, records...) return nil } func (e *inMemoryLogExporter) Shutdown(ctx context.Context) error { return nil } func (e *inMemoryLogExporter) ForceFlush(ctx context.Context) error { return nil } func TestLoggingSpanIDPropagation(t *testing.T) { setupTestTracer(t) logExporter := setupLoggerProvider(t) var wantSpanID trace.SpanID modelMock := &mockModelForTest{ name: "test-model", generateContent: func(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { // Capture the span ID. wantSpanID = trace.SpanFromContext(ctx).SpanContext().SpanID() if !wantSpanID.IsValid() { t.Fatalf("expected span ID to be valid, got %q", wantSpanID) } return func(yield func(*model.LLMResponse, error) bool) { yield(&model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 2, }, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Response"}}, }, }, nil) } }, } req := &model.LLMRequest{ Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Role: "system", Parts: []*genai.Part{ {Text: "You are a helpful assistant."}, }, }, }, Contents: []*genai.Content{ { Role: "user", Parts: []*genai.Part{ {Text: "Hello"}, }, }, }, } ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) for range generateContent(ctx, modelMock, req, true) { } if len(logExporter.records) != 3 { t.Fatalf("expected 3 log records, got %d", len(logExporter.records)) } wantEvents := []string{ "gen_ai.system.message", "gen_ai.user.message", "gen_ai.choice", } for i, record := range logExporter.records { if got := record.SpanID(); got != wantSpanID { t.Errorf("record[%d]: expected span ID %q, got %q", i, wantSpanID, got) } if got := record.EventName(); got != wantEvents[i] { t.Errorf("record[%d]: expected event name %q, got %q", i, wantEvents[i], got) } } } func setupLoggerProvider(t *testing.T) *inMemoryLogExporter { logExporter := &inMemoryLogExporter{} provider := sdklog.NewLoggerProvider( sdklog.WithProcessor(sdklog.NewSimpleProcessor(logExporter)), ) originalProvider := global.GetLoggerProvider() global.SetLoggerProvider(provider) t.Cleanup(func() { global.SetLoggerProvider(originalProvider) }) return logExporter } ================================================ FILE: internal/llminternal/base_flow_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "errors" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) type mockFunctionTool struct { name string runFunc func(tool.Context, map[string]any) (map[string]any, error) } func (m *mockFunctionTool) Name() string { return m.name } func (m *mockFunctionTool) Description() string { return "mock tool" } func (m *mockFunctionTool) InputSchema() *genai.Schema { return nil } func (m *mockFunctionTool) OutputSchema() *genai.Schema { return nil } func (m *mockFunctionTool) IsLongRunning() bool { return false } func (m *mockFunctionTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return nil } func (m *mockFunctionTool) Run(ctx tool.Context, args any) (map[string]any, error) { if m.runFunc != nil { return m.runFunc(ctx, args.(map[string]any)) } return nil, nil } func (m *mockFunctionTool) Declaration() *genai.FunctionDeclaration { return nil } type testCase struct { name string tool toolinternal.FunctionTool args map[string]any beforeToolCallbacks []BeforeToolCallback afterToolCallbacks []AfterToolCallback onToolErrorCallbacks []OnToolErrorCallback want map[string]any } func TestCallTool(t *testing.T) { testCases := []testCase{ { name: "tool runs successfully", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, }, args: map[string]any{"key": "value"}, want: map[string]any{"result": "success"}, }, { name: "tool error", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return nil, errors.New("tool error") }, }, args: map[string]any{"key": "value"}, want: map[string]any{"error": "tool error"}, }, { name: "before callback returns result", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "intercepted"}, nil }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "2nd callback should not be called"}, nil }, }, want: map[string]any{"result": "intercepted"}, }, { name: "before callback returns error", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("before callback error") }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("unexpected error") }, }, want: map[string]any{"error": "before callback error"}, }, { name: "after callback modifies result", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "original"}, nil }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"result": "modified"}, nil }, }, want: map[string]any{"result": "modified"}, }, { name: "after callback handles error", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return nil, errors.New("tool error") }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return map[string]any{"result": "error handled"}, nil } return nil, nil }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"result": "unexpected output"}, nil }, }, want: map[string]any{"result": "error handled"}, }, { name: "after callback returns error", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, errors.New("after callback error") }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, errors.New("unexpected error") }, }, want: map[string]any{"error": "after callback error"}, }, { name: "no-op callbacks return func results", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, nil }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, nil }, }, want: map[string]any{"result": "success"}, }, { name: "before callback result passed to after callback", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "from_before"}, nil }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if val, ok := result["result"]; !ok || val != "from_before" { return nil, errors.New("unexpected result in after callback") } return map[string]any{"result": "from_after"}, nil }, }, want: map[string]any{"result": "from_after"}, }, { name: "before callback error passed to after callback", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in after callback") } return map[string]any{"result": "error_handled_in_after"}, nil }, }, want: map[string]any{"result": "error_handled_in_after"}, }, { name: "before callback error passed to on tool error callback", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { t.Error("unexpected error in on tool error callback") return nil, errors.New("unexpected error in on tool error callback") } return map[string]any{"result": "error_handled_in_on_tool_error_callback"}, nil }, }, want: map[string]any{"result": "error_handled_in_on_tool_error_callback"}, }, { name: "before callback error passed to on tool error callback and after tool called", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { t.Error("unexpected error in on tool error callback") return nil, errors.New("unexpected error in on tool error callback") } return map[string]any{"result": "error_handled_in_on_tool_error_callback"}, nil }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return nil, errors.New("unexpected error in after callback") } return map[string]any{"result": "from_after"}, nil }, }, want: map[string]any{"result": "from_after"}, }, { name: "before callback error passed to on tool error callback and passed to after tool called", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { t.Error("unexpected error in on tool error callback") return nil, errors.New("unexpected error in on tool error callback") } return nil, errors.New("error_from_on_tool_error") }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_on_tool_error" { return nil, errors.New("unexpected error in after callback") } return nil, errors.New("error_from_after_tool") }, }, want: map[string]any{"error": "error_from_after_tool"}, }, { name: "before callback error passed to on tool error callback and passed to after tool called and handled", tool: &mockFunctionTool{ name: "testTool", runFunc: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, }, beforeToolCallbacks: []BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { t.Error("unexpected error in on tool error callback") return nil, errors.New("unexpected error in on tool error callback") } return nil, errors.New("error_from_on_tool_error") }, }, afterToolCallbacks: []AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_on_tool_error" { return nil, errors.New("unexpected error in after callback") } return map[string]any{"result": "error_handled_in_on_tool_error_callback"}, nil }, }, want: map[string]any{"result": "error_handled_in_on_tool_error_callback"}, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { f := &Flow{ BeforeToolCallbacks: tc.beforeToolCallbacks, AfterToolCallbacks: tc.afterToolCallbacks, OnToolErrorCallbacks: tc.onToolErrorCallbacks, } ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}) got := f.callTool(toolinternal.NewToolContext(ctx, "", nil, nil), tc.tool, tc.args) if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("callTool() mismatch (-want +got):\n%s", diff) } }) } } func TestMergeEventActions(t *testing.T) { tests := []struct { name string base *session.EventActions other *session.EventActions want *session.EventActions }{ { name: "both nil", base: nil, other: nil, want: nil, }, { name: "other nil returns base", base: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, other: nil, want: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, }, { name: "base nil returns other", base: nil, other: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, want: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, }, { name: "state delta merged with non-overlapping keys", base: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, other: &session.EventActions{ StateDelta: map[string]any{"key2": "value2"}, }, want: &session.EventActions{ StateDelta: map[string]any{"key1": "value1", "key2": "value2"}, }, }, { name: "state delta merged with overlapping keys - later wins", base: &session.EventActions{ StateDelta: map[string]any{"key1": "original"}, }, other: &session.EventActions{ StateDelta: map[string]any{"key1": "overwritten"}, }, want: &session.EventActions{ StateDelta: map[string]any{"key1": "overwritten"}, }, }, { name: "state delta merged with nested map values", base: &session.EventActions{ StateDelta: map[string]any{ "outer": map[string]any{"key1": "value1", "key2": "value2"}, }, }, other: &session.EventActions{ StateDelta: map[string]any{ "outer": map[string]any{"key2": "updated", "key3": "value3"}, }, }, want: &session.EventActions{ StateDelta: map[string]any{ "outer": map[string]any{"key1": "value1", "key2": "updated", "key3": "value3"}, }, }, }, { name: "state delta merged with multiple keys from multiple tools", base: &session.EventActions{ StateDelta: map[string]any{"tool1_key": "tool1_value"}, }, other: &session.EventActions{ StateDelta: map[string]any{"tool2_key": "tool2_value", "tool3_key": "tool3_value"}, }, want: &session.EventActions{ StateDelta: map[string]any{ "tool1_key": "tool1_value", "tool2_key": "tool2_value", "tool3_key": "tool3_value", }, }, }, { name: "base has nil state delta, other has values", base: &session.EventActions{ SkipSummarization: true, }, other: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, }, want: &session.EventActions{ SkipSummarization: true, StateDelta: map[string]any{"key1": "value1"}, }, }, { name: "skip summarization merging - any true wins", base: &session.EventActions{ SkipSummarization: false, }, other: &session.EventActions{ SkipSummarization: true, }, want: &session.EventActions{ SkipSummarization: true, }, }, { name: "escalate merging - any true wins", base: &session.EventActions{ Escalate: false, }, other: &session.EventActions{ Escalate: true, }, want: &session.EventActions{ Escalate: true, }, }, { name: "transfer to agent - last wins", base: &session.EventActions{ TransferToAgent: "agent1", }, other: &session.EventActions{ TransferToAgent: "agent2", }, want: &session.EventActions{ TransferToAgent: "agent2", }, }, { name: "all fields merged correctly", base: &session.EventActions{ StateDelta: map[string]any{"key1": "value1"}, SkipSummarization: false, TransferToAgent: "agent1", Escalate: false, }, other: &session.EventActions{ StateDelta: map[string]any{"key2": "value2"}, SkipSummarization: true, TransferToAgent: "agent2", Escalate: true, }, want: &session.EventActions{ StateDelta: map[string]any{"key1": "value1", "key2": "value2"}, SkipSummarization: true, TransferToAgent: "agent2", Escalate: true, }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { got := mergeEventActions(tc.base, tc.other) if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("mergeEventActions() mismatch (-want +got):\n%s", diff) } }) } } ================================================ FILE: internal/llminternal/basic_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "fmt" "iter" "reflect" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // basicRequestProcessor populates the LLMRequest // with the agent's LLM generation configs. func basicRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { // reference: adk-python src/google/adk/flows/llm_flows/basic.py return func(yield func(*session.Event, error) bool) { llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return // do nothing. } state := llmAgent.internal() req.Config = clone(state.GenerateContentConfig) if req.Config == nil { req.Config = &genai.GenerateContentConfig{} } // Set OutputSchema directly if no tools are present or native combo support exists. // Otherwise, OutputSchemaRequestProcessor will be used to provide a tool-based workaround. if state.OutputSchema != nil && !needOutputSchemaProcessor(state) { req.Config.ResponseSchema = state.OutputSchema req.Config.ResponseMIMEType = "application/json" } // TODO: missing features // populate LLMRequest LiveConnectConfig setting } } // clone returns a deep copy of the src. // NOTE: this does not work for types with unexported fields. func clone[M any](src M) M { val := reflect.ValueOf(src) // Handle nil pointers if val.Kind() == reflect.Pointer && val.IsNil() { var zero M return zero } srcIsPointer := val.Kind() == reflect.Pointer // Dereference pointer to get the underlying value if srcIsPointer { val = val.Elem() } // Create a new instance of the same type newVal := reflect.New(val.Type()).Elem() // Recursively copy fields deepCopy(val, newVal) // Return as the original type if srcIsPointer { return newVal.Addr().Interface().(M) } return newVal.Interface().(M) } // deepCopy copies src to dst using reflect. func deepCopy(src, dst reflect.Value) { switch src.Kind() { case reflect.Struct: t := src.Type() for i := 0; i < src.NumField(); i++ { if !t.Field(i).IsExported() { panic(fmt.Sprintf("deepCopy: unexported field %q in type %q", t.Field(i).Name, t.Name())) } // Create a copy of the field and set it on the destination struct fieldCopy := reflect.New(src.Field(i).Type()).Elem() deepCopy(src.Field(i), fieldCopy) dst.Field(i).Set(fieldCopy) } case reflect.Slice: if src.IsNil() { return } dst.Set(reflect.MakeSlice(src.Type(), src.Len(), src.Cap())) for i := 0; i < src.Len(); i++ { // Create a copy of each element and set it in the new slice elemCopy := reflect.New(src.Index(i).Type()).Elem() deepCopy(src.Index(i), elemCopy) dst.Index(i).Set(elemCopy) } case reflect.Map: if src.IsNil() { return } dst.Set(reflect.MakeMap(src.Type())) for _, key := range src.MapKeys() { // Create copies of the key and value and set them in the new map keyCopy := reflect.New(key.Type()).Elem() deepCopy(key, keyCopy) valCopy := reflect.New(src.MapIndex(key).Type()).Elem() deepCopy(src.MapIndex(key), valCopy) dst.SetMapIndex(keyCopy, valCopy) } case reflect.Pointer: if src.IsNil() { return } // Create a new pointer and deep copy the underlying value newPtr := reflect.New(src.Elem().Type()) deepCopy(src.Elem(), newPtr.Elem()) dst.Set(newPtr) default: // For basic types, direct assignment is sufficient dst.Set(src) } } ================================================ FILE: internal/llminternal/clone_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "reflect" "testing" ) func TestClone(t *testing.T) { type testStruct struct { S string I int Sl []string M map[string]string P *int N *testStruct } testData := func() *testStruct { return &testStruct{ S: "test", I: 123, Sl: []string{"a", "b"}, M: map[string]string{"k": "v"}, P: func() *int { i := 456; return &i }(), N: &testStruct{ S: "nested", }, } } check := func(t *testing.T, original, cloned *testStruct) { if !reflect.DeepEqual(original, cloned) { t.Errorf("clone() = %+v, want %+v", cloned, original) } // Modify cloned and check if original is affected cloned.Sl[0] = "c" cloned.M["k"] = "v2" *cloned.P = 789 cloned.N.S = "nested2" if reflect.DeepEqual(original, cloned) { t.Errorf("clone() should not be affected by modifications to original") } if original.Sl[0] != "a" { t.Errorf("original slice was modified") } if original.M["k"] != "v" { t.Errorf("original map was modified") } if *original.P != 456 { t.Errorf("original pointer value was modified") } if original.N.S != "nested" { t.Errorf("original nested struct was modified") } } t.Run("pointer", func(t *testing.T) { original := testData() cloned := clone(original) check(t, original, cloned) }) t.Run("value", func(t *testing.T) { original := testData() cloned := clone(*original) check(t, original, &cloned) }) t.Run("interface", func(t *testing.T) { original := testData() cloned := clone(any(original)) typed, ok := cloned.(*testStruct) if !ok { t.Fatalf("clone failed with interface: %v", cloned) } check(t, original, typed) }) } func TestCloneNil(t *testing.T) { var original *int cloned := clone(original) if cloned != nil { t.Errorf("clone(nil) = %v, want nil", cloned) } } func TestCloneUnexported(t *testing.T) { type testStructUnexported struct { s string } original := &testStructUnexported{s: "test"} defer func() { if r := recover(); r == nil { t.Errorf("clone() did not panic on unexported field") } }() clone(original) } ================================================ FILE: internal/llminternal/contents_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "encoding/json" "fmt" "iter" "reflect" "slices" "sort" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // ContentRequestProcessor populates the LLMRequest's Contents based on // the InvocationContext that includes the previous events. func ContentsRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // TODO: implement (adk-python src/google/adk/flows/llm_flows/contents.py) - extract function call results, etc. llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { // Do nothing. return // In python, no error is yielded. } fn := buildContentsDefault // "" or "default". if llmAgent.internal().IncludeContents == "none" { // Include current turn context only (no conversation history) fn = buildContentsCurrentTurnContextOnly } var events []*session.Event if ctx.Session() != nil { for e := range ctx.Session().Events().All() { events = append(events, e) } } contents, err := fn(ctx.Agent().Name(), ctx.Branch(), events) if err != nil { yield(nil, err) return } req.Contents = append(req.Contents, contents...) } } // buildContentsDefault returns the contents for the LLM request by applying // filtering, rearrangement, and content processing to the given events. func buildContentsDefault(agentName, invocationBranch string, events []*session.Event) ([]*genai.Content, error) { // parse the events, leaving the contents and the function calls and responses from the current agent. var filtered []*session.Event for _, ev := range events { content := utils.Content(ev) // Skip events without content or generated neither by user nor // by model. // e.g. events purely for mutating session states. if content == nil || content.Role == "" || len(content.Parts) == 0 { // TODO: log a bad event with content but no Role is skipped // Note: python checks here if content.Parts[0] is an empty string and skip if so. // But unlike python that distinguishes None vs empty string, two cases are indistinguishable in Go. continue } // Skip events that do not belong to the current branch. // TODO: can we use a richer type for branch (e.g. []string) instead of using string prefix test? if !eventBelongsToBranch(invocationBranch, ev) { continue } if isAuthEvent(ev) { continue } if isOtherAgentReply(agentName, ev) { filtered = append(filtered, ConvertForeignEvent(ev)) } else { filtered = append(filtered, ev) } } // src/google/adk/flows/llm_flows/contents.py // - _rearrange_events_for_async_function_response filtered, err := rearrangeEventsForLatestFunctionResponse(filtered) if err != nil { return nil, err } // - _rearrange_events_for_async_function_responses_in_history filtered, err = rearrangeEventsForFunctionResponsesInHistory(filtered) if err != nil { return nil, err } var contents []*genai.Content for _, ev := range filtered { content := clone(utils.Content(ev)) if content == nil { continue } // gemini 3 in streaming returns a last response with an empty part. We need to filter it out. content.Parts = slices.DeleteFunc(content.Parts, func(p *genai.Part) bool { return p == nil || reflect.ValueOf(*p).IsZero() }) if len(content.Parts) == 0 { continue } utils.RemoveClientFunctionCallID(content) contents = append(contents, content) } return contents, nil } func eventBelongsToBranch(invocationBranch string, event *session.Event) bool { if invocationBranch == "" || event.Branch == "" { return true } if event.Branch == invocationBranch { return true } // We use dot to delimit branch nodes. To avoid simple prefix match // (e.g. agent_0 unexpectedly matching agent_00), require either perfect branch // match, or match prefix with an additional explicit '.' return strings.HasPrefix(invocationBranch, event.Branch+".") } // rearrangeEventsForLatestFunctionResponse // This function only acts if the very last event is a function response. // It searches backward for the matching call, deletes all intervening events, // and appends a single (merged) response. // If the latest function_response is for an async function_call, all events // between the initial function_call and the latest function_response will be removed. func rearrangeEventsForLatestFunctionResponse(events []*session.Event) ([]*session.Event, error) { if len(events) < 2 { return events, nil } lastEvent := events[len(events)-1] lastResponses := utils.FunctionResponses(lastEvent.Content) // No need to process, since the latest event is not function_response. if len(lastResponses) == 0 { return events, nil } // Create response id set responseIDs := make(map[string]struct{}) for _, res := range lastResponses { responseIDs[res.ID] = struct{}{} } // Check if its already in the correct position prevEvent := events[len(events)-2] prevCalls := utils.FunctionCalls(prevEvent.Content) if len(prevCalls) > 0 { for _, call := range prevCalls { if _, found := responseIDs[call.ID]; found { // The latest response is already matched with the immediately // preceding call event. The history is clean. Nothing to do. return events, nil } } } functionCallEventIdx := -1 var allCallIDsFromMatchingEvent map[string]struct{} SearchLoop: // A label to allow breaking out of the nested loop for idx := len(events) - 2; idx >= 0; idx-- { event := events[idx] calls := utils.FunctionCalls(event.Content) if len(calls) > 0 { for _, call := range calls { if _, found := responseIDs[call.ID]; found { // Match found. This is the event we're looking for. functionCallEventIdx = idx // Create a new set of all call IDs from this specific event allCallIDsFromMatchingEvent = make(map[string]struct{}) for _, c := range calls { allCallIDsFromMatchingEvent[c.ID] = struct{}{} } // Validation check // last response event should only contain the responses for the // function calls in the same function call event for respID := range responseIDs { if _, exists := allCallIDsFromMatchingEvent[respID]; !exists { return nil, fmt.Errorf( "validation failed: last response event has IDs not in the matching call event. Call IDs: %v, Response IDs: %v", allCallIDsFromMatchingEvent, responseIDs, ) } } // Update the tracked IDs to be ALL IDs from the call event responseIDs = allCallIDsFromMatchingEvent // Exit the search loop break SearchLoop } } } } if functionCallEventIdx == -1 { return nil, fmt.Errorf( "no function call event found for function responses ids: %v", responseIDs, ) } // Collect all function response events *between* the call and the last response. var responseEventsToMerge []*session.Event for i := functionCallEventIdx + 1; i < len(events)-1; i++ { event := events[i] responses := utils.FunctionResponses(event.Content) if len(responses) == 0 { continue } // Check if this event contains any response relevant to our call. isRelated := false for _, res := range responses { if _, exists := responseIDs[res.ID]; exists { isRelated = true break } } if isRelated { responseEventsToMerge = append(responseEventsToMerge, event) } } // Add the final response event itself to the list to be merged. responseEventsToMerge = append(responseEventsToMerge, events[len(events)-1]) resultEvents := events[:functionCallEventIdx+1] mergedEvent, err := mergeFunctionResponseEvents(responseEventsToMerge) if err != nil { return nil, err } resultEvents = append(resultEvents, mergedEvent) return resultEvents, nil } // rearrangeEventsForFunctionResponsesInHistory reorganizes an entire event history to ensure // every function call event is immediately followed by a single, consolidated // function response event. // // This function processes the whole slice of events to clean up and correctly // pair function calls with their corresponding responses, which is especially // useful for histories involving long running tool calls where // responses may not have originally been consecutive. It preserves all // non-tool-call events (like user messages) in their original order. // // It returns a new, correctly ordered slice of events or an error if the // history is malformed (e.g., a response is found without a corresponding call). func rearrangeEventsForFunctionResponsesInHistory(events []*session.Event) ([]*session.Event, error) { if len(events) < 2 { return events, nil } // Create a map to store the index of the event containing each function response. callIDToResponseEventIndex := make(map[string]int) for i, event := range events { responses := utils.FunctionResponses(event.Content) if len(responses) > 0 { for _, res := range responses { callIDToResponseEventIndex[res.ID] = i } } } // Rebuild the event list var resultEvents []*session.Event for _, event := range events { // If the event contains responses, skip it. It will be handled // when we process its corresponding call event. if len(utils.FunctionResponses(event.Content)) > 0 { continue } calls := utils.FunctionCalls(event.Content) if len(calls) == 0 { // This is a regular event (e.g., user message). Just append it. resultEvents = append(resultEvents, event) } else { // This is a function call event, append it and search for responses resultEvents = append(resultEvents, event) // Find the unique indices of all corresponding response events. // Using a map[int]struct{} as a set. responseEventIndicesSet := make(map[int]struct{}) for _, call := range calls { if index, found := callIDToResponseEventIndex[call.ID]; found { responseEventIndicesSet[index] = struct{}{} } } // If no responses were found for any calls in this event, continue. if len(responseEventIndicesSet) == 0 { continue } // If there's only one unique response event, append it directly. if len(responseEventIndicesSet) == 1 { for index := range responseEventIndicesSet { // A trick to get the single key resultEvents = append(resultEvents, events[index]) } } else { // Multiple response events exist for that function call so we merge them. // Collect and sort the indices to process events in order. var sortedIndices []int for index := range responseEventIndicesSet { sortedIndices = append(sortedIndices, index) } sort.Ints(sortedIndices) // Collect the actual event objects to be merged. eventsToMerge := make([]*session.Event, len(sortedIndices)) for i, index := range sortedIndices { eventsToMerge[i] = events[index] } // Merge the events and append the single result. mergedEvent, err := mergeFunctionResponseEvents(eventsToMerge) if err != nil { return nil, fmt.Errorf("failed to merge response events: %w", err) } resultEvents = append(resultEvents, mergedEvent) } } } return resultEvents, nil } // mergeFunctionResponseEvents merges a list of function response events into one. // // Its key goal is to ensure that a function call event is followed by a // single, consolidated response event containing all relevant parts. // // The input `functionResponseEvents` must meet several requirements: // 1. The list must be sorted in increasing order of timestamp. // 2. The first event is treated as the initial "base" response event. // 3. All later events must contain at least one response part related // to the original function call. // // The function returns a single merged event with the following properties: // 1. Function response parts from later events will replace any matching // (by function call ID) response parts from the initial event. // 2. All non-function-response parts (e.g., text) are appended to the // end of the part list. // // Caveat: This implementation doesn't support a parallel function call // event that contains async function calls of the same name. func mergeFunctionResponseEvents(functionResponseEvents []*session.Event) (*session.Event, error) { if len(functionResponseEvents) == 0 { return nil, fmt.Errorf("at least one function_response event is required") } // 1. Use the first event as the base mergedEvent := cloneEvent(functionResponseEvents[0]) if mergedEvent == nil { return nil, fmt.Errorf("mergedEvent based on the first event should not be nil") } if mergedEvent.Content == nil { return nil, fmt.Errorf("content for the first event should not be nil") } partsInMergedEvent := mergedEvent.LLMResponse.Content.Parts if len(partsInMergedEvent) == 0 { return nil, fmt.Errorf("there should be at least one function_response part") } // 2. Create an index (map) of function_response parts by their ID partIndicesInMergedEvent := make(map[string]int) for idx, part := range partsInMergedEvent { if part.FunctionResponse != nil { functionCallID := part.FunctionResponse.ID partIndicesInMergedEvent[functionCallID] = idx } } // 3. Merge subsequent events for _, event := range functionResponseEvents[1:] { if len(event.LLMResponse.Content.Parts) == 0 { return nil, fmt.Errorf("event should contain at least one part") } // 4. Update or Append parts for _, part := range event.LLMResponse.Content.Parts { if part.FunctionResponse != nil { functionCallID := part.FunctionResponse.ID // If we've seen this response ID before, replace it if idx, found := partIndicesInMergedEvent[functionCallID]; found { partsInMergedEvent[idx] = part } else { // Otherwise, append it and update the index partsInMergedEvent = append(partsInMergedEvent, part) partIndicesInMergedEvent[functionCallID] = len(partsInMergedEvent) - 1 } } else { // If it's not a function response, just append it partsInMergedEvent = append(partsInMergedEvent, part) } } } // Update the parts slice in the merged event in case it was reallocated mergedEvent.LLMResponse.Content.Parts = partsInMergedEvent return mergedEvent, nil } // buildContentsCurrentTurnContextOnly returns contents for the current turn only (no conversation history). // // When include_contents='none', we want to include: // - The current user input // - Tool calls and responses from the current turn // // But exclude conversation history from previous turns. // // In multi-agent scenarios, the "current turn" for an agent starts from an // actual user or from another agent. func buildContentsCurrentTurnContextOnly(agentName, branch string, events []*session.Event) ([]*genai.Content, error) { // Find the latest event that starts the current turn and process from there for i := len(events) - 1; i >= 0; i-- { event := events[i] if event.Author == "user" || isOtherAgentReply(agentName, event) { return buildContentsDefault(agentName, branch, events[i:]) } } // NOTE: in Python, it returns [] if there is no event authored by a user or another agent, // but that may be a bug. return buildContentsDefault(agentName, branch, events) } func isOtherAgentReply(currentAgentName string, ev *session.Event) bool { return ev.Author != currentAgentName && ev.Author != "user" } // ConvertForeignEvent converts an event authored by another agent as // a user-content event. // This is to provide another aget's output as context to the current agent, // so that the current agent can continue to respond, such as summarizing // the previous agent's reply, etc. func ConvertForeignEvent(ev *session.Event) *session.Event { content := utils.Content(ev) if content == nil || len(content.Parts) == 0 { return ev } converted := &genai.Content{ Role: "user", Parts: []*genai.Part{{Text: "For context:"}}, } for _, p := range content.Parts { switch { case p.Text != "": converted.Parts = append(converted.Parts, &genai.Part{ Text: fmt.Sprintf("[%s] said: %s", ev.Author, p.Text), }) case p.FunctionCall != nil: converted.Parts = append(converted.Parts, &genai.Part{ Text: fmt.Sprintf("[%s] called tool `%s` with parameters: %s", ev.Author, p.FunctionCall.Name, stringify(p.FunctionCall.Args)), }) case p.FunctionResponse != nil: converted.Parts = append(converted.Parts, &genai.Part{ Text: fmt.Sprintf("[%s] `%s` tool returned result: %v", ev.Author, p.FunctionResponse.Name, stringify(p.FunctionResponse.Response)), }) default: // fallback to the original part for non-text and non-functionCall parts. converted.Parts = append(converted.Parts, p) } } return &session.Event{ // made-up event. Don't go through types.NewEvent. Timestamp: ev.Timestamp, Author: "user", LLMResponse: model.LLMResponse{Content: converted}, Branch: ev.Branch, } } func stringify(v any) string { s, _ := json.Marshal(v) return string(s) } // requestEUCFunctionCallName is a special function to handle credential // request. const requestEUCFunctionCallName = "adk_request_credential" func isAuthEvent(ev *session.Event) bool { c := utils.Content(ev) if c == nil { return false } for _, p := range c.Parts { if p.FunctionCall != nil && p.FunctionCall.Name == requestEUCFunctionCallName { return true } if p.FunctionResponse != nil && p.FunctionResponse.Name == requestEUCFunctionCallName { return true } } return false } func cloneEvent(e *session.Event) *session.Event { if e == nil { return nil } // 1. Create a new Event instance newEvent := &session.Event{ ID: e.ID, Timestamp: e.Timestamp, InvocationID: e.InvocationID, Branch: e.Branch, Author: e.Author, Actions: e.Actions, } // 2. Deep copy the LongRunningToolIDs slice if e.LongRunningToolIDs != nil { newEvent.LongRunningToolIDs = make([]string, len(e.LongRunningToolIDs)) copy(newEvent.LongRunningToolIDs, e.LongRunningToolIDs) } // TODO check if copy parts is needed // 3. Deep copy the LLMResponse pointer struct and content if e.LLMResponse.Content != nil { newEvent.LLMResponse.Content = &genai.Content{ Parts: make([]*genai.Part, len(e.LLMResponse.Content.Parts)), Role: e.LLMResponse.Content.Role, } copy(newEvent.LLMResponse.Content.Parts, e.LLMResponse.Content.Parts) } return newEvent } ================================================ FILE: internal/llminternal/contents_processor_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "iter" "slices" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" ) type testModel struct { model.LLM } // Test behavior around Agent's IncludeContents. func TestContentsRequestProcessor_IncludeContents(t *testing.T) { const agentName = "testAgent" testModel := &testModel{} emptyEvent := []*session.Event{} helloAndGoodBye := []*session.Event{ { Author: "user", // Not in the current turn in multi-agent scenario. See buildContentsCurrentTurnContextOnly. LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", "user"), }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("good bye", "user"), }, }, } agentTransfer := []*session.Event{ { Author: "anotherAgent", // History. LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionCall("func1", nil, "model"), }, }, { Author: "anotherAgent", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionResponse("func1", nil, "user"), }, }, { Author: "anotherAgent", // Beginning of the current turn started by another agent. LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("transfer to testAgent", "model"), }, }, { Author: agentName, // See python flows/llm_flows/base_llm_flow.py BaseLlmFlow._run_one_step_async. LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionCall("func1", nil, "model"), }, }, } robot := []*session.Event{ { Author: agentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("do func1", "user"), }, }, { Author: agentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionCall("func1", nil, "model"), }, }, { Author: agentName, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromFunctionResponse("func1", nil, "user"), }, }, } t.Parallel() testCases := []struct { name string includeContents llmagent.IncludeContents events []*session.Event want []*genai.Content }{ { name: "empty", includeContents: "default", events: emptyEvent, }, { name: "empty", includeContents: "none", events: emptyEvent, }, { name: "helloAndGoodBye", includeContents: "", events: helloAndGoodBye, want: []*genai.Content{ genai.NewContentFromText("hello", "user"), genai.NewContentFromText("good bye", "user"), }, }, { name: "helloAndGoodBye", includeContents: "default", // default == "" events: helloAndGoodBye, want: []*genai.Content{ genai.NewContentFromText("hello", "user"), genai.NewContentFromText("good bye", "user"), }, }, { name: "helloAndGoodBye", includeContents: "none", events: helloAndGoodBye, want: []*genai.Content{ genai.NewContentFromText("good bye", "user"), }, }, { name: "agentTransfer", includeContents: "", events: agentTransfer, want: []*genai.Content{ // events from other agents are converted by convertForeignEvent. { Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[anotherAgent] called tool `func1` with parameters: null"}, }, Role: "user", }, { Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[anotherAgent] `func1` tool returned result: null"}, }, Role: "user", }, { Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[anotherAgent] said: transfer to testAgent"}, }, Role: "user", }, genai.NewContentFromFunctionCall("func1", nil, "model"), }, }, { name: "agentTransfer", includeContents: "none", events: agentTransfer, want: []*genai.Content{ { Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[anotherAgent] said: transfer to testAgent"}, }, Role: "user", }, genai.NewContentFromFunctionCall("func1", nil, "model"), }, }, { name: "robot", includeContents: "default", events: robot, want: []*genai.Content{ genai.NewContentFromText("do func1", "user"), genai.NewContentFromFunctionCall("func1", nil, "model"), genai.NewContentFromFunctionResponse("func1", nil, "user"), }, }, { name: "robot", includeContents: "none", events: robot, want: []*genai.Content{ genai.NewContentFromText("do func1", "user"), genai.NewContentFromFunctionCall("func1", nil, "model"), genai.NewContentFromFunctionResponse("func1", nil, "user"), }, }, } for _, tc := range testCases { t.Run(tc.name+"/include_contents="+string(tc.includeContents), func(t *testing.T) { testAgent := utils.Must(llmagent.New(llmagent.Config{ Name: agentName, Model: testModel, IncludeContents: tc.includeContents, })) ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: testAgent, Session: &fakeSession{ events: tc.events, }, }) req := &model.LLMRequest{} for ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) { if ev != nil { t.Fatal("ContentsRequestProcessor generated an unexpected event") } if err != nil { t.Fatalf("contentRequestProcessor failed: %v", err) } } got := req.Contents if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("LLMRequest after contentsRequestProcessor mismatch (-want +got):\n%s", diff) } }) } } func TestContentsRequestProcessor(t *testing.T) { const agentName = "testAgent" testModel := &testModel{} t.Parallel() testCases := []struct { name string branch string events []*session.Event want []*genai.Content }{ { name: "NilEvent", events: nil, want: nil, }, { name: "EmptyEvents", events: []*session.Event{}, want: nil, }, { name: "UserAndAgentEvents", events: []*session.Event{ { Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("Hello", "user"), }, }, { Author: "testAgent", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("Hi there", "model"), }, }, }, want: []*genai.Content{ genai.NewContentFromText("Hello", "user"), genai.NewContentFromText("Hi there", "model"), }, }, { name: "anotherAgentEvent", events: []*session.Event{ { Author: "anotherAgent", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("Foreign message", "model"), }, }, }, want: []*genai.Content{ { Role: "user", Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[anotherAgent] said: Foreign message"}, }, }, }, }, { name: "FilterByBranch", branch: "branch1.task1", events: []*session.Event{ { Author: "user", Branch: "branch1", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("In branch 1", "user"), }, }, { Author: "user", Branch: "branch1.task1", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("In branch 1 and task 1", "user"), }, }, { Author: "user", Branch: "branch12", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("In branch 12", "user"), }, }, { Author: "user", Branch: "branch2", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("In branch 2", "user"), }, }, { Author: "user", Branch: "", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("empty branch", "user"), }, }, }, want: []*genai.Content{ genai.NewContentFromText("In branch 1", "user"), genai.NewContentFromText("In branch 1 and task 1", "user"), genai.NewContentFromText("empty branch", "user"), }, }, { name: "AuthEvent", events: []*session.Event{ { Author: agentName, LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {FunctionCall: &genai.FunctionCall{Name: "adk_request_credential"}}, }, }, }, }, }, want: nil, }, { name: "EventWithoutContent", events: []*session.Event{ {Author: "user"}, }, want: nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { testAgent := utils.Must(llmagent.New(llmagent.Config{ Name: "testAgent", Model: testModel, })) ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: testAgent, Branch: tc.branch, Session: &fakeSession{ events: tc.events, }, }) req := &model.LLMRequest{} for ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) { if ev != nil { t.Fatal("ContentsRequestProcessor generated an unexpected event") } if err != nil { t.Fatalf("contentRequestProcessor failed: %v", err) } } got := req.Contents if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("LLMRequest after contentRequestProcessor mismatch (-want +got):\n%s", diff) } }) } } func TestConvertForeignEvent(t *testing.T) { t.Parallel() now := time.Now() testCases := []struct { name string event *session.Event want *session.Event }{ { name: "Text", event: &session.Event{ Timestamp: now, Author: "foreign", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("hello", "model"), }, Branch: "b", }, want: &session.Event{ Timestamp: now, Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[foreign] said: hello"}, }, }, }, Branch: "b", }, }, { name: "FunctionCall", event: &session.Event{ Timestamp: now, Author: "foreign", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {FunctionCall: &genai.FunctionCall{Name: "test", Args: map[string]any{"a": "b"}}}, }, }, }, Branch: "b", }, want: &session.Event{ Timestamp: now, Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[foreign] called tool `test` with parameters: {\"a\":\"b\"}"}, }, }, }, Branch: "b", }, }, { name: "FunctionResponse", event: &session.Event{ Timestamp: now, Author: "foreign", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {FunctionResponse: &genai.FunctionResponse{Name: "test", Response: map[string]any{"c": "d"}}}, }, }, }, Branch: "b", }, want: &session.Event{ Timestamp: now, Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{ {Text: "For context:"}, {Text: "[foreign] `test` tool returned result: {\"c\":\"d\"}"}, }, }, }, Branch: "b", }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := llminternal.ConvertForeignEvent(tc.event) if diff := cmp.Diff(tc.want, got, cmp.AllowUnexported(genai.FunctionCall{}, genai.FunctionResponse{})); diff != "" { t.Errorf("convertForeignEvent() mismatch (-want +got):\n%s", diff) } }) } } func TestContentsRequestProcessor_NonLLMAgent(t *testing.T) { testAgent := utils.Must(agent.New(agent.Config{ Name: "test_agent", })) ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: testAgent, }) req := &model.LLMRequest{} for ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) { if ev != nil { t.Fatal("ContentsRequestProcessor generated an unexpected event") } if err != nil { t.Fatalf("contentRequestProcessor failed: %v", err) } } got := req want := &model.LLMRequest{} if diff := cmp.Diff(want, got); diff != "" { t.Errorf("LLMRequest after contentRequestProcessor mismatch (-want +got):\n%s", diff) } } func TestContentsRequestProcessor_Rearrange(t *testing.T) { const agentName = "test_agent" testModel := &testModel{} // --- Reusable Test Data --- // Basic Call/Response fcBasic := &genai.FunctionCall{ ID: "call_123", Name: "search_tool", Args: map[string]any{"query": "test"}, } frBasic := &genai.FunctionResponse{ ID: "call_123", Name: "search_tool", Response: map[string]any{"results": []string{"item1", "item2"}}, } // LRO Call/Responses fcLRO := &genai.FunctionCall{ ID: "long_call_123", Name: "long_running_tool", Args: map[string]any{"task": "process"}, } frLROInter := &genai.FunctionResponse{ ID: "long_call_123", Name: "long_running_tool", Response: map[string]any{"status": "processing", "progress": 50}, } frLROFinal := &genai.FunctionResponse{ ID: "long_call_123", Name: "long_running_tool", Response: map[string]any{"status": "completed", "result": "done"}, } // Mixed LRO/Normal Calls/Responses fcLROMixed := &genai.FunctionCall{ ID: "lro_call_456", Name: "long_running_tool", Args: map[string]any{"task": "analyze"}, } fcNormalMixed := &genai.FunctionCall{ ID: "normal_call_789", Name: "search_tool", Args: map[string]any{"query": "test"}, } frLROInterMixed := &genai.FunctionResponse{ ID: "lro_call_456", Name: "long_running_tool", Response: map[string]any{"status": "processing", "progress": 25}, } frNormalMixed := &genai.FunctionResponse{ ID: "normal_call_789", Name: "search_tool", Response: map[string]any{"results": []string{"item1", "item2"}}, } frLROFinalMixed := &genai.FunctionResponse{ ID: "lro_call_456", Name: "long_running_tool", Response: map[string]any{"status": "completed", "analysis": "done"}, } // History LRO Call/Responses fcHistLRO := &genai.FunctionCall{ ID: "history_call_123", Name: "long_running_tool", Args: map[string]any{"task": "process"}, } frHistLROInter := &genai.FunctionResponse{ ID: "history_call_123", Name: "long_running_tool", Response: map[string]any{"status": "processing", "progress": 50}, } frHistLROFinal := &genai.FunctionResponse{ ID: "history_call_123", Name: "long_running_tool", Response: map[string]any{"status": "completed", "result": "done"}, } // History Mixed Call/Responses fcHistLROMixed := &genai.FunctionCall{ ID: "history_lro_123", Name: "long_running_tool", Args: map[string]any{"task": "analyze"}, } fcHistNormalMixed := &genai.FunctionCall{ ID: "history_normal_456", Name: "search_tool", Args: map[string]any{"query": "data"}, } frHistLROInterMixed := &genai.FunctionResponse{ ID: "history_lro_123", Name: "long_running_tool", Response: map[string]any{"status": "processing", "progress": 30}, } frHistNormalMixed := &genai.FunctionResponse{ ID: "history_normal_456", Name: "search_tool", Response: map[string]any{"results": []string{"result1", "result2"}}, } frHistLROFinalMixed := &genai.FunctionResponse{ ID: "history_lro_123", Name: "long_running_tool", Response: map[string]any{"status": "completed", "analysis": "finished"}, } // Preserve Content Call/Responses fcPreserve := &genai.FunctionCall{ ID: "preserve_test", Name: "long_running_tool", Args: map[string]any{"test": "value"}, } frPreserveInter := &genai.FunctionResponse{ ID: "preserve_test", Name: "long_running_tool", Response: map[string]any{"status": "processing"}, } frPreserveFinal := &genai.FunctionResponse{ ID: "preserve_test", Name: "long_running_tool", Response: map[string]any{"output": "preserved"}, } // Error Call/Response frOrphaned := &genai.FunctionResponse{ ID: "no_matching_call", Name: "orphaned_tool", Response: map[string]any{"error": "no matching call"}, } // --- Test Cases --- testCases := []struct { name string events []*session.Event want []*genai.Content wantErr string // Use string to check for specific error messages }{ { name: "NilEvent", events: nil, want: nil, }, { name: "EmptyEvents", events: []*session.Event{}, want: nil, }, { name: "EventWithoutContent", events: []*session.Event{ {Author: "user"}, }, want: nil, }, { name: "Basic function call no rearrangement", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Search for test", "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcBasic, "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frBasic, "user")}}, }, want: []*genai.Content{ genai.NewContentFromText("Search for test", "user"), NewContentFromFunctionCall(fcBasic, "model"), NewContentFromFunctionResponse(frBasic, "user"), }, }, { name: "Rearrangement with intermediate response", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Run long process", "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcLRO, "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROInter, "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Still processing...", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROFinal, "user")}}, }, want: []*genai.Content{ genai.NewContentFromText("Run long process", "user"), NewContentFromFunctionCall(fcLRO, "model"), NewContentFromFunctionResponse(frLROFinal, "user"), }, }, { name: "Rearrangement with mixed LRO and normal calls", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Analyze data and search for info", "user")}}, { Author: agentName, LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{FunctionCall: fcLROMixed}, {FunctionCall: fcNormalMixed}}, }, }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{{FunctionResponse: frLROInterMixed}, {FunctionResponse: frNormalMixed}}, }, }, }, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Analysis in progress, search completed", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frLROFinalMixed, "user")}}, }, want: []*genai.Content{ genai.NewContentFromText("Analyze data and search for info", "user"), {Role: "model", Parts: []*genai.Part{{FunctionCall: fcLROMixed}, {FunctionCall: fcNormalMixed}}}, {Role: "user", Parts: []*genai.Part{{FunctionResponse: frLROFinalMixed}, {FunctionResponse: frNormalMixed}}}, }, }, { name: "Rearrangement in history (non-final event)", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Start long process", "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: NewContentFromFunctionCall(fcHistLRO, "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROInter, "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Still processing...", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROFinal, "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Process completed successfully!", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Great! What's next?", "user")}}, }, want: []*genai.Content{ genai.NewContentFromText("Start long process", "user"), NewContentFromFunctionCall(fcHistLRO, "model"), NewContentFromFunctionResponse(frHistLROFinal, "user"), genai.NewContentFromText("Still processing...", "model"), genai.NewContentFromText("Process completed successfully!", "model"), genai.NewContentFromText("Great! What's next?", "user"), }, }, { name: "Mixed rearrangement in history (non-final event)", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Analyze and search simultaneously", "user")}}, { Author: agentName, LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{FunctionCall: fcHistLROMixed}, {FunctionCall: fcHistNormalMixed}}, }, }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{{FunctionResponse: frHistLROInterMixed}, {FunctionResponse: frHistNormalMixed}}, }, }, }, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Analysis continuing, search done", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: NewContentFromFunctionResponse(frHistLROFinalMixed, "user")}}, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Both tasks completed successfully!", "model")}}, {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Perfect! What should we do next?", "user")}}, }, want: []*genai.Content{ genai.NewContentFromText("Analyze and search simultaneously", "user"), {Role: "model", Parts: []*genai.Part{{FunctionCall: fcHistLROMixed}, {FunctionCall: fcHistNormalMixed}}}, {Role: "user", Parts: []*genai.Part{{FunctionResponse: frHistLROFinalMixed}, {FunctionResponse: frHistNormalMixed}}}, genai.NewContentFromText("Analysis continuing, search done", "model"), genai.NewContentFromText("Both tasks completed successfully!", "model"), genai.NewContentFromText("Perfect! What should we do next?", "user"), }, }, { name: "Rearrangement preserves mixed text parts", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Before function call", "user")}}, { Author: agentName, LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "I'll process this for you"}, {FunctionCall: fcPreserve}}, }, }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{{Text: "Intermediate prefix"}, {FunctionResponse: frPreserveInter}, {Text: "Processing..."}}, }, }, }, {Author: agentName, LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("Still working on it...", "model")}}, { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: "user", Parts: []*genai.Part{{Text: "Final prefix"}, {FunctionResponse: frPreserveFinal}, {Text: "Final suffix"}}, }, }, }, }, want: []*genai.Content{ genai.NewContentFromText("Before function call", "user"), {Role: "model", Parts: []*genai.Part{{Text: "I'll process this for you"}, {FunctionCall: fcPreserve}}}, {Role: "user", Parts: []*genai.Part{ {Text: "Intermediate prefix"}, {FunctionResponse: frPreserveFinal}, {Text: "Processing..."}, {Text: "Final prefix"}, {Text: "Final suffix"}, }}, }, }, { name: "Error on function response without matching call", events: []*session.Event{ {Author: "user", LLMResponse: model.LLMResponse{Content: &genai.Content{Role: "user", Parts: []*genai.Part{{Text: "Regular message"}}}}}, {Author: "user", LLMResponse: model.LLMResponse{Content: &genai.Content{Role: "user", Parts: []*genai.Part{{FunctionResponse: frOrphaned}}}}}, }, want: nil, wantErr: "no function call event found", }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { testAgent := utils.Must(llmagent.New(llmagent.Config{ Name: agentName, Model: testModel, })) ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: testAgent, Session: &fakeSession{ events: tc.events, }, }) req := &model.LLMRequest{} for ev, err := range llminternal.ContentsRequestProcessor(ctx, req, &llminternal.Flow{}) { if ev != nil { t.Fatal("ContentsRequestProcessor generated an unexpected event") } if tc.wantErr != "" { if err == nil { t.Fatal("ContentsRequestProcessor succeeded; expected an error") } if !strings.Contains(err.Error(), tc.wantErr) { t.Errorf("Expected error to contain %q, got: %v", tc.wantErr, err) } return // Test is done } if err != nil { t.Fatalf("ContentsRequestProcessor failed: %v", err) } } got := req.Contents if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("LLMRequest.Contents mismatch (-want +got):\n%s", diff) } }) } } // NewContentFromFunctionCall creates a new Content struct with a single FunctionCall part. // It assigns the provided role to the Content. func NewContentFromFunctionCall(fc *genai.FunctionCall, role string) *genai.Content { return &genai.Content{ Role: role, Parts: []*genai.Part{{FunctionCall: fc}}, } } // NewContentFromFunctionResponse creates a new Content struct with a single FunctionResponse part. // It assigns the provided role to the Content. func NewContentFromFunctionResponse(fr *genai.FunctionResponse, role string) *genai.Content { return &genai.Content{ Role: role, Parts: []*genai.Part{{FunctionResponse: fr}}, } } type fakeSession struct { events []*session.Event } func (s *fakeSession) State() session.State { return nil } func (s *fakeSession) Events() session.Events { return s } func (s *fakeSession) ID() string { return "" } func (s *fakeSession) AppName() string { return "" } func (s *fakeSession) UserID() string { return "" } func (s *fakeSession) LastUpdateTime() time.Time { return time.Time{} } func (s *fakeSession) All() iter.Seq[*session.Event] { return slices.Values(s.events) } func (s *fakeSession) Len() int { return len(s.events) } func (s *fakeSession) At(i int) *session.Event { return s.events[i] } var ( _ session.Session = (*fakeSession)(nil) _ session.Events = (*fakeSession)(nil) ) ================================================ FILE: internal/llminternal/converters/converters.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package converters import ( "google.golang.org/genai" "google.golang.org/adk/model" ) func Genai2LLMResponse(res *genai.GenerateContentResponse) *model.LLMResponse { usageMetadata := res.UsageMetadata if len(res.Candidates) > 0 && res.Candidates[0] != nil { candidate := res.Candidates[0] if (candidate.Content != nil && len(candidate.Content.Parts) > 0) || candidate.FinishReason == genai.FinishReasonStop { return &model.LLMResponse{ Content: candidate.Content, GroundingMetadata: candidate.GroundingMetadata, FinishReason: candidate.FinishReason, CitationMetadata: candidate.CitationMetadata, AvgLogprobs: candidate.AvgLogprobs, LogprobsResult: candidate.LogprobsResult, UsageMetadata: usageMetadata, ModelVersion: res.ModelVersion, } } return &model.LLMResponse{ ErrorCode: string(candidate.FinishReason), ErrorMessage: candidate.FinishMessage, GroundingMetadata: candidate.GroundingMetadata, FinishReason: candidate.FinishReason, CitationMetadata: candidate.CitationMetadata, AvgLogprobs: candidate.AvgLogprobs, LogprobsResult: candidate.LogprobsResult, UsageMetadata: usageMetadata, ModelVersion: res.ModelVersion, } } if res.PromptFeedback != nil { return &model.LLMResponse{ ErrorCode: string(res.PromptFeedback.BlockReason), ErrorMessage: res.PromptFeedback.BlockReasonMessage, UsageMetadata: usageMetadata, ModelVersion: res.ModelVersion, } } return &model.LLMResponse{ ErrorCode: "UNKNOWN_ERROR", ErrorMessage: "Unknown error.", UsageMetadata: usageMetadata, ModelVersion: res.ModelVersion, } } ================================================ FILE: internal/llminternal/file_uploads_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "iter" "google.golang.org/adk/agent" "google.golang.org/adk/internal/llminternal/googlellm" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // The Gemini API (non-Vertex) backend does not support the display_name parameter for file uploads, // so it must be removed to prevent request failures. func removeDisplayNameIfExists(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { if req.Contents == nil { return } llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return } if !googlellm.IsGeminiAPIVariant(llmAgent.internal().Model) { return } for _, content := range req.Contents { if content.Parts == nil { continue } for _, part := range content.Parts { if part.InlineData != nil { part.InlineData.DisplayName = "" } if part.FileData != nil { part.FileData.DisplayName = "" } } } } } ================================================ FILE: internal/llminternal/functions.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool/toolconfirmation" ) // generateRequestConfirmationEvent creates a new Event containing // adk_request_confirmation function calls based on the requested confirmations. // NOTE: The trigger for this in ADK Go is usually a tool.Context.RequestConfirmation call, // not parsing a function_response_event like in the Python example. // This function assumes you have a list of confirmations to process. func generateRequestConfirmationEvent( invocationContext agent.InvocationContext, functionCallEvent *session.Event, functionResponseEvent *session.Event, ) *session.Event { if functionResponseEvent == nil || len(functionResponseEvent.Actions.RequestedToolConfirmations) == 0 { return nil } if functionCallEvent == nil || functionCallEvent.Content == nil { return nil } parts := []*genai.Part{} longRunningToolIDs := []string{} functionCalls := make(map[string]*genai.FunctionCall, len(functionCallEvent.Content.Parts)) for _, call := range utils.FunctionCalls(functionCallEvent.Content) { functionCalls[call.ID] = call } for funcID, confirmation := range functionResponseEvent.Actions.RequestedToolConfirmations { originalFunctionCall, ok := functionCalls[funcID] if !ok || originalFunctionCall == nil { continue } // Prepare arguments for the adk_request_confirmation call args := map[string]any{ "originalFunctionCall": originalFunctionCall, "toolConfirmation": confirmation, } requestConfirmationFC := &genai.FunctionCall{ ID: utils.GenerateFunctionCallID(), Name: toolconfirmation.FunctionCallName, Args: args, } parts = append(parts, &genai.Part{ FunctionCall: requestConfirmationFC, }) longRunningToolIDs = append(longRunningToolIDs, requestConfirmationFC.ID) } if len(parts) == 0 { return nil } ev := session.NewEvent(invocationContext.InvocationID()) ev.Author = invocationContext.Agent().Name() ev.Branch = invocationContext.Branch() ev.LLMResponse = model.LLMResponse{ Content: &genai.Content{ Parts: parts, Role: genai.RoleModel, }, } ev.LongRunningToolIDs = longRunningToolIDs return ev } ================================================ FILE: internal/llminternal/functions_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool/toolconfirmation" ) type mockAgent struct { agent.Agent name string } func (m *mockAgent) Name() string { return m.name } type mockInvocationContext struct { agent.InvocationContext invocationID string agentName string branch string } func (m *mockInvocationContext) InvocationID() string { return m.invocationID } func (m *mockInvocationContext) Agent() agent.Agent { return &mockAgent{name: m.agentName} } func (m *mockInvocationContext) Branch() string { return m.branch } func TestGenerateRequestConfirmationEvent(t *testing.T) { confirmingFunctionCall := &genai.FunctionCall{ ID: "call_1", Name: "test_tool", Args: map[string]any{"arg": "val"}, } tests := []struct { name string invocationContext agent.InvocationContext functionCallEvent *session.Event functionResponseEvent *session.Event wantEvent *session.Event }{ { name: "no confirmation requested", invocationContext: &mockInvocationContext{ invocationID: "inv_1", agentName: "agent_1", }, functionCallEvent: &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ {FunctionCall: confirmingFunctionCall}, }, }, }, }, functionResponseEvent: &session.Event{ Actions: session.EventActions{ RequestedToolConfirmations: nil, }, }, wantEvent: nil, }, { name: "confirmation requested but no matching function call", invocationContext: &mockInvocationContext{ invocationID: "inv_1", agentName: "agent_1", }, functionCallEvent: &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ {FunctionCall: &genai.FunctionCall{ID: "other_call"}}, }, }, }, }, functionResponseEvent: &session.Event{ Actions: session.EventActions{ RequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{ "call_1": { Hint: "Are you sure?", }, }, }, }, wantEvent: nil, }, { name: "confirmation requested and matching function call", invocationContext: &mockInvocationContext{ invocationID: "inv_1", agentName: "agent_1", branch: "main", }, functionCallEvent: &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ {FunctionCall: confirmingFunctionCall}, }, }, }, }, functionResponseEvent: &session.Event{ Actions: session.EventActions{ RequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{ "call_1": { Hint: "Are you sure?", }, }, }, }, wantEvent: &session.Event{ InvocationID: "inv_1", Author: "agent_1", Branch: "main", Actions: session.EventActions{ StateDelta: map[string]any{}, ArtifactDelta: map[string]int64{}, }, LLMResponse: model.LLMResponse{ Content: &genai.Content{ Role: genai.RoleModel, Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: toolconfirmation.FunctionCallName, Args: map[string]any{ "originalFunctionCall": confirmingFunctionCall, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Are you sure?", }, }, }, }, }, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := generateRequestConfirmationEvent(tt.invocationContext, tt.functionCallEvent, tt.functionResponseEvent) if diff := cmp.Diff(tt.wantEvent, got, cmpopts.IgnoreFields(session.Event{}, "Timestamp", "LongRunningToolIDs", "ID"), cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), // Ignore generated IDs ); diff != "" { t.Errorf("generateRequestConfirmationEvent() mismatch (-want +got):\n%s", diff) } if got != nil { for _, s := range got.LongRunningToolIDs { if s == "" { t.Errorf("empty long running tool id") } } } }) } } // TestGenerateRequestConfirmationEventHasID verifies that the event returned // by generateRequestConfirmationEvent always has a non-empty ID. // // In Python ADK, every Event gets a UUID via model_post_init: // // def model_post_init(self, __context): // if not self.id: // self.id = Event.new_id() # str(uuid.uuid4()) // // In Go ADK, events must be created with session.NewEvent() to get an ID. // A raw &session.Event{} literal leaves ID as "" which breaks features // that rely on event IDs (e.g. time-travel restart_from_event_id). func TestGenerateRequestConfirmationEventHasID(t *testing.T) { confirmingFunctionCall := &genai.FunctionCall{ ID: "call_1", Name: "test_tool", Args: map[string]any{"arg": "val"}, } ctx := &mockInvocationContext{ invocationID: "inv_1", agentName: "agent_1", branch: "main", } functionCallEvent := &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ {FunctionCall: confirmingFunctionCall}, }, }, }, } functionResponseEvent := &session.Event{ Actions: session.EventActions{ RequestedToolConfirmations: map[string]toolconfirmation.ToolConfirmation{ "call_1": { Hint: "Are you sure?", }, }, }, } got := generateRequestConfirmationEvent(ctx, functionCallEvent, functionResponseEvent) if got == nil { t.Fatal("expected non-nil event") } if got.ID == "" { t.Error("event ID is empty; events must have a UUID for time-travel and session lookup") } if got.InvocationID != "inv_1" { t.Errorf("expected InvocationID=\"inv_1\", got %q", got.InvocationID) } } ================================================ FILE: internal/llminternal/googlellm/variant.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package googlellm import ( "regexp" "strconv" "strings" "google.golang.org/genai" "google.golang.org/adk/model" ) var geminiModelVersionRegex = regexp.MustCompile(`^gemini-(\d+(\.\d+)?)`) // GetGoogleLLMVariant returns the Google LLM variant used (GeminiAPI or VertexAI). func GetGoogleLLMVariant(llm model.LLM) genai.Backend { i, ok := llm.(GoogleLLM) if !ok { return genai.BackendUnspecified } return i.GetGoogleLLMVariant() } // GoogleLLM is an interface which allows to distinguish between Vertex AI and Gemini API models. type GoogleLLM interface { GetGoogleLLMVariant() genai.Backend } // IsGeminiModel returns true if the model is a Gemini model. func IsGeminiModel(model string) bool { return strings.HasPrefix(extractModelName(model), "gemini-") } // IsGemini25OrLower returns true if the model is a Gemini 2.5 or less. // These models do not support output schema with tools natively, so we need to use a processor to handle it. func IsGemini25OrLower(model string) bool { model = extractModelName(model) // extract the model version from model name - e.g. turn gemini-2.5-flash or gemini-2.5-flash-lite into 2.5 matches := geminiModelVersionRegex.FindStringSubmatch(model) if len(matches) < 2 { return false } version, err := strconv.ParseFloat(matches[1], 64) if err != nil { return false } return version <= 2.5 } // IsGeminiAPIVariant returns true if the model is a Gemini API model (not Vertex AI). func IsGeminiAPIVariant(llm model.LLM) bool { return GetGoogleLLMVariant(llm) == genai.BackendGeminiAPI } // NeedsOutputSchemaProcessor returns true if the Gemini model doesn't support output schema with tools natively and requires a processor to handle it. // Only Gemini 2.5 models and lower and only in Gemini API don't support natively, so we enable the processor for them. func NeedsOutputSchemaProcessor(llm model.LLM) bool { if llm == nil { return false } return IsGeminiModel(llm.Name()) && IsGeminiAPIVariant(llm) && IsGemini25OrLower(llm.Name()) } func extractModelName(model string) string { modelstring := model[strings.LastIndex(model, "/")+1:] return strings.ToLower(modelstring) } ================================================ FILE: internal/llminternal/googlellm/variant_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package googlellm import ( "testing" "google.golang.org/genai" "google.golang.org/adk/model" ) func TestIsGemini25OrLower(t *testing.T) { testCases := []struct { model string want bool }{ {"gemini-1.5-pro", true}, {"gemini-2.0-flash", true}, {"gemini-2.5-flash-lite", true}, {"gemini-2.0-flash-exp", true}, {"gemini-1.0-pro", true}, {"projects/p/locations/l/models/gemini-2.0-flash", true}, {"models/gemini-1.5-pro", true}, {"not-a-gemini-model", false}, {"gemini-2", true}, {"gemini-3.0", false}, {"gemini-3-pro", false}, } for _, tc := range testCases { got := IsGemini25OrLower(tc.model) if got != tc.want { t.Errorf("IsGemini25OrLower(%q) = %v, want %v", tc.model, got, tc.want) } } } func TestIsGeminiModel(t *testing.T) { testCases := []struct { model string want bool }{ {"gemini-1.5-pro", true}, {"models/gemini-2.0-flash", true}, {"claud-3.5-sonnet", false}, } for _, tc := range testCases { got := IsGeminiModel(tc.model) if got != tc.want { t.Errorf("IsGeminiModel(%q) = %v, want %v", tc.model, got, tc.want) } } } func TestNeedsOutputSchemaProcessor(t *testing.T) { testCases := []struct { name string model string variant genai.Backend want bool }{ {"Gemini2.0_Vertex", "gemini-2.0-flash", genai.BackendVertexAI, false}, {"Gemini2.0_GeminiAPI", "gemini-2.0-flash", genai.BackendGeminiAPI, true}, {"NonGemini_Vertex", "not-a-gemini", genai.BackendVertexAI, false}, {"Gemini3.0_GeminiAPI", "gemini-3.0", genai.BackendGeminiAPI, false}, {"Gemini3.0_Vertex", "gemini-3.0", genai.BackendVertexAI, false}, {"CustomGemini2", "gemini-2.0-hack", genai.BackendUnspecified, false}, {"CustomGemini3", "gemini-3.0-hack", genai.BackendUnspecified, false}, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := NeedsOutputSchemaProcessor(&mockGoogleLLM{ variant: tc.variant, nameVal: tc.model, }) if got != tc.want { t.Errorf("NeedsOutputSchemaProcessor(%q) = %v, want %v", tc.model, got, tc.want) } }) } } type mockGoogleLLM struct { model.LLM variant genai.Backend nameVal string } func (m *mockGoogleLLM) GetGoogleLLMVariant() genai.Backend { return m.variant } func (m *mockGoogleLLM) Name() string { return m.nameVal } var _ GoogleLLM = (*mockGoogleLLM)(nil) ================================================ FILE: internal/llminternal/handle_function_calls_async_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "context" "iter" "testing" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) type SleepArgs struct { DurationMS int `json:"duration_ms"` } type SleepResult struct { Success bool `json:"success"` } func sleepFunc(ctx tool.Context, input SleepArgs) (SleepResult, error) { time.Sleep(time.Duration(input.DurationMS) * time.Millisecond) return SleepResult{Success: true}, nil } // mockModel is a simple mock model that returns parallel tool calls. type mockModel struct { model.LLM Calls int } func (m *mockModel) Name() string { return "mock-model" } func (m *mockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, useStream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { m.Calls++ if m.Calls > 1 { // Second call should be the final response after tool execution. // Or we just return a final response if we don't want to loop. // For this test, we just need to trigger the tool calls once. yield(&model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("I am done."), }, Role: "model", }, Partial: false, }, nil) return } // First call returns parallel tool calls. yield(&model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ ID: "call_1", Name: "sleep", Args: map[string]any{"duration_ms": 500}, }, }, { FunctionCall: &genai.FunctionCall{ ID: "call_2", Name: "sleep", Args: map[string]any{"duration_ms": 500}, }, }, { FunctionCall: &genai.FunctionCall{ ID: "call_3", Name: "sleep", Args: map[string]any{"duration_ms": 500}, }, }, }, Role: "model", }, Partial: false, }, nil) } } func TestHandleFunctionCallsAsync(t *testing.T) { sleepTool, err := functiontool.New(functiontool.Config{ Name: "sleep", Description: "sleeps for a duration", }, sleepFunc) if err != nil { t.Fatal(err) } model := &mockModel{} a, err := llmagent.New(llmagent.Config{ Name: "tester", Description: "Tester agent", Instruction: "You are a tester agent.", Model: model, Tools: []tool.Tool{ sleepTool, }, }) if err != nil { t.Fatal(err) } sessionService := session.InMemoryService() _, err = sessionService.Create(t.Context(), &session.CreateRequest{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", }) if err != nil { t.Fatal(err) } r, err := runner.New(runner.Config{ Agent: a, SessionService: sessionService, AppName: "testApp", }) if err != nil { t.Fatal(err) } startTime := time.Now() it := r.Run(t.Context(), "testUser", "testSession", &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Test sleep"), }, Role: "user", }, agent.RunConfig{StreamingMode: agent.StreamingModeSSE}) events := []*session.Event{} for ev, err := range it { if err != nil { t.Fatal(err) } events = append(events, ev) } if len(events) != 3 { t.Errorf("Expected 3 events, got %d", len(events)) } elapsed := time.Since(startTime) t.Logf("Elapsed time: %v", elapsed) if len(events[0].Content.Parts) != 3 { t.Errorf("Expected first event to have 3 function calls, got %d", len(events[0].Content.Parts)) } if len(events[1].Content.Parts) != 3 { t.Errorf("Expected second event to have 3 function responses, got %d", len(events[1].Content.Parts)) } if len(events[2].Content.Parts) != 1 { t.Errorf("Expected third event to have 1 text part got %d", len(events[2].Content.Parts)) } // Since we are calling sleep 3 times for 500ms each, synchronous execution would take // ~1500ms, while asynchronous execution should take ~500ms. // We assert that the time is significantly less than 1500ms to verify async. // We also assert it's at least 500ms. if elapsed < 500*time.Millisecond { t.Errorf("Elapsed time %v is less than expected 500ms", elapsed) } if elapsed > 1000*time.Millisecond { t.Errorf("Elapsed time %v is greater than expected 1000ms for async execution", elapsed) } } ================================================ FILE: internal/llminternal/helpers_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "google.golang.org/adk/agent" ) // mockLLMAgent satisfies both agent.Agent (via embedding) and llminternal.Agent (via internal() implementation) type mockLLMAgent struct { agent.Agent s *State } var _ Agent = (*mockLLMAgent)(nil) func (m *mockLLMAgent) internal() *State { return m.s } ================================================ FILE: internal/llminternal/identity_request_processor.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "fmt" "iter" "strings" "google.golang.org/adk/agent" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // identityRequestProcessor gives the agent identity from the framework. func identityRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return // do nothing. } parts := []string{fmt.Sprintf("You are an agent. Your internal name is %q.", ctx.Agent().Name())} if description := ctx.Agent().Description(); description != "" { parts = append(parts, fmt.Sprintf("The description about you is %q.", description)) } si := strings.Join(parts, " ") utils.AppendInstructions(req, si) } } ================================================ FILE: internal/llminternal/identity_request_processor_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" ) func TestIdentityRequestProcessor(t *testing.T) { t.Parallel() tests := []struct { name string agent agent.Agent existingSI *genai.Content wantContains []string wantNotContain []string wantNoSI bool }{ { name: "InjectsNameOnly", agent: &mockLLMAgent{ Agent: utils.Must(agent.New(agent.Config{Name: "test_agent"})), s: &State{}, }, wantContains: []string{ "You are an agent.", "Your internal name is \"test_agent\".", }, wantNotContain: []string{ "The description about you is", }, }, { name: "InjectsNameAndDescription", agent: &mockLLMAgent{ Agent: utils.Must(agent.New(agent.Config{ Name: "helper_agent", Description: "A helpful assistant that answers questions", })), s: &State{}, }, wantContains: []string{ "You are an agent.", "Your internal name is \"helper_agent\".", "The description about you is \"A helpful assistant that answers questions\".", }, }, { name: "NoOpForNonLLMAgent", agent: utils.Must(agent.New(agent.Config{Name: "plain_agent"})), wantNoSI: true, }, { name: "EmptyDescription", agent: &mockLLMAgent{ Agent: utils.Must(agent.New(agent.Config{ Name: "empty_desc_agent", Description: "", })), s: &State{}, }, wantContains: []string{ "You are an agent.", "Your internal name is \"empty_desc_agent\".", }, wantNotContain: []string{ "The description about you is", }, }, { name: "AppendsToExistingInstructions", agent: &mockLLMAgent{ Agent: utils.Must(agent.New(agent.Config{Name: "append_agent"})), s: &State{}, }, existingSI: genai.NewContentFromText("Be concise.", genai.RoleUser), wantContains: []string{ "Be concise.", "You are an agent.", "Your internal name is \"append_agent\".", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Parallel() req := &model.LLMRequest{} if tt.existingSI != nil { req.Config = &genai.GenerateContentConfig{ SystemInstruction: tt.existingSI, } } ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Agent: tt.agent, }) iter := identityRequestProcessor(ctx, req, &Flow{}) var eventCount int for _, err := range iter { if err != nil { t.Fatalf("identityRequestProcessor() unexpected error: %v", err) } eventCount++ } if eventCount > 0 { t.Errorf("identityRequestProcessor() yielded %d events, want 0", eventCount) } if tt.wantNoSI { if req.Config != nil && req.Config.SystemInstruction != nil { t.Errorf("identityRequestProcessor() set SystemInstruction on non-LLM agent, got: %v", req.Config.SystemInstruction) } return } if req.Config == nil || req.Config.SystemInstruction == nil { t.Fatal("identityRequestProcessor() did not set SystemInstruction") } si := strings.Join(utils.TextParts(req.Config.SystemInstruction), " ") for _, want := range tt.wantContains { if !strings.Contains(si, want) { t.Errorf("SystemInstruction does not contain %q\ngot: %q", want, si) } } for _, notWant := range tt.wantNotContain { if strings.Contains(si, notWant) { t.Errorf("SystemInstruction unexpectedly contains %q\ngot: %q", notWant, si) } } }) } } ================================================ FILE: internal/llminternal/instruction_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "fmt" "iter" "regexp" "slices" "strings" "unicode" "google.golang.org/adk/agent" "google.golang.org/adk/internal/agent/parentmap" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // TODO: Remove this once state keywords are implemented and replace with those consts const ( appPrefix = "app:" userPrefix = "user:" tempPrefix = "temp:" ) // instructionsRequestProcessor configures req's instructions and global instructions for LLM flow. func instructionsRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return // do nothing. } parents := parentmap.FromContext(ctx) rootAgent := asLLMAgent(parents.RootAgent(ctx.Agent())) if rootAgent == nil { rootAgent = llmAgent } // Append global instructions. if err := appendGlobalInstructions(ctx, req, rootAgent.internal()); err != nil { yield(nil, fmt.Errorf("failed to append global instructions: %w", err)) return } // Append agent's instruction if err := appendInstructions(ctx, req, llmAgent.internal()); err != nil { yield(nil, fmt.Errorf("failed to append instructions: %w", err)) return } } } // The regex to find placeholders like {variable} or {artifact.file_name}. var placeholderRegex = regexp.MustCompile(`{+[^{}]*}+`) func appendInstructions(ctx agent.InvocationContext, req *model.LLMRequest, agentState *State) error { if agentState.InstructionProvider != nil { instruction, err := agentState.InstructionProvider(icontext.NewReadonlyContext(ctx)) if err != nil { return fmt.Errorf("failed to evaluate global instruction provider: %w", err) } utils.AppendInstructions(req, instruction) return nil } if agentState.Instruction == "" { return nil } inst, err := InjectSessionState(ctx, agentState.Instruction) if err != nil { return fmt.Errorf("failed to inject session state into instruction: %w", err) } utils.AppendInstructions(req, inst) return nil } func appendGlobalInstructions(ctx agent.InvocationContext, req *model.LLMRequest, agentState *State) error { if agentState.GlobalInstructionProvider != nil { instruction, err := agentState.GlobalInstructionProvider(icontext.NewReadonlyContext(ctx)) if err != nil { return fmt.Errorf("failed to evaluate global instruction provider: %w", err) } utils.AppendInstructions(req, instruction) return nil } if agentState.GlobalInstruction == "" { return nil } inst, err := InjectSessionState(ctx, agentState.GlobalInstruction) if err != nil { return fmt.Errorf("failed to inject session state into global instruction: %w", err) } utils.AppendInstructions(req, inst) return nil } // replaceMatch is the Go equivalent of the _replace_match async function in the Python code. func replaceMatch(ctx agent.InvocationContext, match string) (string, error) { // Trim curly braces: "{var_name}" -> "var_name" varName := strings.TrimSpace(strings.Trim(match, "{}")) optional := false if strings.HasSuffix(varName, "?") { optional = true varName = strings.TrimSuffix(varName, "?") } if after, ok := strings.CutPrefix(varName, "artifact."); ok { fileName := after if ctx.Artifacts() == nil { return "", fmt.Errorf("artifact service is not initialized") } resp, err := ctx.Artifacts().Load(ctx, fileName) if err != nil { if optional { // TODO: consistent logging approach in adk-go return "", nil } return "", fmt.Errorf("failed to load artifact %s: %w", fileName, err) } return resp.Part.Text, nil } if !isValidStateName(varName) { return match, nil // Return the original string if not a valid name } value, err := ctx.Session().State().Get(varName) if err != nil { if optional { // TODO: log error when !errors.Is(err, session.ErrStateKeyNotExist) return "", nil } return "", err } if value == nil { return "", nil } return fmt.Sprintf("%v", value), nil } // isIdentifier checks if a string is a valid Go identifier. // This is the equivalent of Python's `str.isidentifier()`. func isIdentifier(s string) bool { if s == "" { return false } for i, r := range s { if i == 0 { if !unicode.IsLetter(r) && r != '_' { return false } } else { if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '_' { return false } } } return true } // isValidStateName checks if the variable name is a valid state name. func isValidStateName(varName string) bool { parts := strings.Split(varName, ":") if len(parts) == 1 { return isIdentifier(varName) } if len(parts) == 2 { prefix := parts[0] + ":" validPrefixes := []string{appPrefix, userPrefix, tempPrefix} if slices.Contains(validPrefixes, prefix) { return isIdentifier(parts[1]) } } return false } // InjectSessionState populates values in an instruction template from a context. func InjectSessionState(ctx agent.InvocationContext, template string) (string, error) { // Find all matches, then iterate through them, building the result string. var result strings.Builder lastIndex := 0 matches := placeholderRegex.FindAllStringIndex(template, -1) for _, matchIndexes := range matches { startIndex, endIndex := matchIndexes[0], matchIndexes[1] // Append the text between the last match and this one result.WriteString(template[lastIndex:startIndex]) // Get the replacement for the current match matchStr := template[startIndex:endIndex] replacement, err := replaceMatch(ctx, matchStr) if err != nil { return "", err // Propagate the error } result.WriteString(replacement) lastIndex = endIndex } // Append any remaining text after the last match result.WriteString(template[lastIndex:]) return result.String(), nil } ================================================ FILE: internal/llminternal/instruction_processor_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "context" "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" artifactinternal "google.golang.org/adk/internal/artifact" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/session" ) func TestInjectSessionState(t *testing.T) { // Define the structure for our test cases testCases := []struct { name string // Name of the sub-test template string // Input template string state map[string]any // Initial session state artifacts map[string]*genai.Part // Artifacts for the mock service expectNilService bool // Flag to test with a nil artifact service want string // Expected successful output wantErr bool // Whether we expect an error wantErrMsg string // A substring of the expected error message }{ // Corresponds to: test_inject_session_state { name: "successful state injection", template: "Hello {user_name}, you are in {app_state} state.", state: map[string]any{"user_name": "Foo", "app_state": "active"}, want: "Hello Foo, you are in active state.", }, // Corresponds to: test_inject_session_state_with_artifact { name: "successful artifact injection", template: "The artifact content is: {artifact.my_file}", artifacts: map[string]*genai.Part{ "my_file": {Text: "This is my artifact content."}, }, want: "The artifact content is: This is my artifact content.", }, // Corresponds to: test_inject_session_state_with_optional_state // and test_inject_session_state_with_optional_missing_state_returns_empty { name: "optional missing state variable", template: "Optional value: {optional_value?}", state: map[string]any{}, want: "Optional value: ", }, // Corresponds to: test_inject_session_state_with_missing_state_raises_key_error { name: "missing required state variable", template: "Hello {missing_key}!", state: map[string]any{"user_name": "Foo"}, wantErr: true, wantErrMsg: "state key does not exist", }, // Corresponds to: test_inject_session_state_with_missing_artifact_raises_key_error { name: "missing required artifact", template: "The artifact content is: {artifact.missing_file}", artifacts: map[string]*genai.Part{ "my_file": {Text: "This is my artifact content."}, }, wantErr: true, wantErrMsg: "failed to load artifact missing_file: artifact not found: file does not exist", }, // Corresponds to: test_inject_session_state_with_invalid_state_name_returns_original { name: "invalid state name is not replaced", template: "Hello {invalid-key}!", state: map[string]any{"user_name": "Foo"}, want: "Hello {invalid-key}!", }, // Corresponds to: test_inject_session_state_with_invalid_prefix_state_name_returns_original { name: "invalid prefix state name is not replaced", template: "Hello {invalid:key}!", state: map[string]any{"user_name": "Foo"}, want: "Hello {invalid:key}!", }, // Corresponds to: test_inject_session_state_with_valid_prefix_state { name: "valid prefixed state variable", template: "Hello {app:user_name}!", state: map[string]any{"app:user_name": "Foo"}, want: "Hello Foo!", }, // Corresponds to: test_inject_session_state_with_none_state_value_returns_empty { name: "state value is nil", template: "Value: {test_key}", state: map[string]any{"test_key": nil}, want: "Value: ", }, // Corresponds to: test_inject_session_state_with_optional_missing_artifact_returns_empty { name: "optional missing artifact", template: "Optional artifact: {artifact.missing_file?}", artifacts: map[string]*genai.Part{ "my_file": {Text: "This is my artifact content."}, }, want: "Optional artifact: ", }, // Corresponds to: test_inject_session_state_artifact_service_not_initialized_raises_value_error { name: "artifact service not initialized", template: "The artifact content is: {artifact.my_file}", expectNilService: true, wantErr: true, wantErrMsg: "artifact service is not initialized", }, // Corresponds to: test_inject_session_state_with_empty_artifact_name_raises_key_error { name: "empty artifact name", template: "The artifact content is: {artifact.}", artifacts: map[string]*genai.Part{}, wantErr: true, wantErrMsg: "failed to load artifact : request validation failed: invalid load request: missing required fields: FileName", }, // Corresponds to: test_inject_session_state_with_multiple_variables_and_artifacts { name: "complex template with mixed variables and artifacts", template: ` Hello {user_name}, You are {user_age} years old. Your favorite color is {favorite_color}. The artifact says: {artifact.my_file} And another optional artifact: {artifact.other_file?} `, state: map[string]any{ "user_name": "Foo", "user_age": 30, "favorite_color": "blue", }, artifacts: map[string]*genai.Part{ "my_file": {Text: "This is my artifact content."}, }, want: ` Hello Foo, You are 30 years old. Your favorite color is blue. The artifact says: This is my artifact content. And another optional artifact: `, }, } // Iterate over the test cases for _, tc := range testCases { // t.Run creates a sub-test, which makes test output cleaner and more organized. t.Run(tc.name, func(t *testing.T) { // Setup, create inMemorySessionService, inMemoryArtifactService and wrappers. sessionService := session.InMemoryService() createResp, err := sessionService.Create(t.Context(), &session.CreateRequest{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", State: tc.state, }) if err != nil { t.Fatalf("Failed to create session: %v", err) } // Setup Artifacts var artifacts agent.Artifacts if !tc.expectNilService { artifacts = &artifactinternal.Artifacts{ Service: artifact.InMemoryService(), AppName: "testApp", UserID: "testUser", SessionID: "testSession", } } for filename, part := range tc.artifacts { if _, err := artifacts.Save(t.Context(), filename, part); err != nil { t.Fatalf("Failed to save artifact: %v", err) } } // Create invocation context ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Artifacts: artifacts, Session: createResp.Session, }) // --- Execution --- got, err := InjectSessionState(ctx, tc.template) // --- Assertion --- if tc.wantErr { if err == nil { t.Fatal("expected an error but got none") } if tc.wantErrMsg != "" && !strings.Contains(err.Error(), tc.wantErrMsg) { t.Errorf("expected error message to contain %q, but got %q", tc.wantErrMsg, err.Error()) } } else { if err != nil { t.Fatalf("did not expect an error but got: %v", err) } if got != tc.want { // Use %q to clearly show differences in strings, especially with whitespace. t.Errorf("got %q, want %q", got, tc.want) } } }) } } ================================================ FILE: internal/llminternal/other_processors.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "iter" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func nlPlanningRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { // TODO: implement (adk-python src/google/adk/flows/llm_flows/_nl_plnning.py) return func(yield func(*session.Event, error) bool) {} } func codeExecutionRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { // TODO: implement (adk-python src/google/adk/flows/llm_flows/_code_execution.py) return func(yield func(*session.Event, error) bool) {} } func authPreprocessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { // TODO: implement (adk-python src/google/adk/auth/auth_preprocessor.py) return func(yield func(*session.Event, error) bool) {} } func nlPlanningResponseProcessor(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error { // TODO: implement (adk-python src/google/adk/_nl_planning.py) return nil } func codeExecutionResponseProcessor(ctx agent.InvocationContext, req *model.LLMRequest, resp *model.LLMResponse) error { // TODO: implement (adk-python src/google/adk_code_execution.py) return nil } ================================================ FILE: internal/llminternal/outputschema_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "encoding/json" "fmt" "iter" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/llminternal/googlellm" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) const ( instructionForProcessor = "IMPORTANT: You have access to other tools, but you must provide " + "your final response using the set_model_response tool with the " + "required structured format. After using any other tools needed " + "to complete the task, always call set_model_response with your " + "final answer in the specified schema format." ) // outputSchemaRequestProcessor adds the set_model_response tool to handle structured output. func outputSchemaRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return } state := llmAgent.internal() // Check if we need the processor in the first place. if state.OutputSchema == nil || !needOutputSchemaProcessor(state) { return } // Add the set_model_response tool to handle structured output setResponseTool := &setModelResponseTool{schema: state.OutputSchema} if err := toolutils.PackTool(req, setResponseTool); err != nil { yield(nil, fmt.Errorf("failed to pack set_model_response tool: %w", err)) return } // Add instruction about using the set_model_response tool utils.AppendInstructions(req, instructionForProcessor) } } // createFinalModelResponseEvent creates a final model response event from set_model_response JSON. func createFinalModelResponseEvent(invocationContext agent.InvocationContext, response string) *session.Event { // Create a proper model response event finalEvent := session.NewEvent(invocationContext.InvocationID()) finalEvent.Author = invocationContext.Agent().Name() finalEvent.Branch = invocationContext.Branch() finalEvent.Content = &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: response}}, } return finalEvent } // retrieveStructuredModelResponse checks if function response contains set_model_response tool and extract JSON. func retrieveStructuredModelResponse(ev *session.Event) (string, error) { if ev == nil || ev.LLMResponse.Content == nil { return "", nil } for _, part := range ev.LLMResponse.Content.Parts { if part.FunctionResponse != nil && part.FunctionResponse.Name == "set_model_response" { bytes, err := json.Marshal(part.FunctionResponse.Response) if err != nil { return "", fmt.Errorf("failed to marshal set_model_response: %w", err) } return string(bytes), nil } } return "", nil } func needOutputSchemaProcessor(state *State) bool { if state == nil || state.Model == nil { return false } hasTools := len(state.Tools) > 0 || len(state.Toolsets) > 0 return hasTools && googlellm.NeedsOutputSchemaProcessor(state.Model) } // setModelResponseTool implements tool.Tool and toolinternal.FunctionTool. type setModelResponseTool struct { schema *genai.Schema } func (t *setModelResponseTool) Name() string { return "set_model_response" } func (t *setModelResponseTool) Description() string { return "Set your final response using the required output schema. Use this tool to provide your final structured answer instead of outputting text directly." } func (t *setModelResponseTool) IsLongRunning() bool { return false } func (t *setModelResponseTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{ Name: t.Name(), Description: t.Description(), ParametersJsonSchema: t.schema, } } func (t *setModelResponseTool) Run(ctx tool.Context, args any) (map[string]any, error) { m, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("unexpected args type for set_model_response: %T", args) } if err := utils.ValidateMapOnSchema(m, t.schema, false); err != nil { return nil, fmt.Errorf("invalid output schema: %w", err) } return m, nil } ================================================ FILE: internal/llminternal/outputschema_processor_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "context" "encoding/json" "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) type mockTool struct { name string } func (m *mockTool) Name() string { return m.name } func (m *mockTool) Description() string { return "mock tool" } func (m *mockTool) IsLongRunning() bool { return false } func (m *mockTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{Name: m.name} } func (m *mockTool) Run(ctx tool.Context, args any) (map[string]any, error) { return nil, nil } type mockLLM struct { model.LLM name string variant *genai.Backend } func (m *mockLLM) Name() string { return m.name } func (m *mockLLM) GetGoogleLLMVariant() genai.Backend { if m.variant != nil { return *m.variant } return genai.BackendGeminiAPI } func TestOutputSchemaRequestProcessor(t *testing.T) { schema := &genai.Schema{ Type: genai.TypeObject, Properties: map[string]*genai.Schema{ "answer": {Type: genai.TypeString}, }, Required: []string{"answer"}, } f := &Flow{} t.Run("InjectsToolAndInstructions", func(t *testing.T) { baseAgent := utils.Must(agent.New(agent.Config{Name: "SchemaAgent"})) mockAgent := &mockLLMAgent{ Agent: baseAgent, s: &State{ Model: &mockLLM{name: "gemini-2.5-flash"}, OutputSchema: schema, Tools: []tool.Tool{&mockTool{name: "other_tool"}}, }, } req := &model.LLMRequest{} ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: mockAgent, }) events := outputSchemaRequestProcessor(ctx, req, f) for _, err := range events { t.Fatalf("outputSchemaRequestProcessor() error = %v", err) } // Verify set_model_response tool is present if _, ok := req.Tools["set_model_response"]; !ok { t.Error("req.Tools['set_model_response'] missing") } // Verify instructions instructions := utils.TextParts(req.Config.SystemInstruction) found := false for _, s := range instructions { if strings.Contains(s, "set_model_response") && strings.Contains(s, "required structured format") { found = true break } } if !found { t.Errorf("Instruction about set_model_response not found. Instructions: %v", instructions) } }) t.Run("NoOpWhenNoTools", func(t *testing.T) { baseAgent := utils.Must(agent.New(agent.Config{Name: "SchemaAgentNoTools"})) mockAgent := &mockLLMAgent{ Agent: baseAgent, s: &State{ Model: &mockLLM{name: "gemini-2.5-flash"}, OutputSchema: schema, Tools: nil, // No tools -> optimization skips processor }, } req := &model.LLMRequest{} ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: mockAgent, }) events := outputSchemaRequestProcessor(ctx, req, f) for _, err := range events { t.Fatalf("outputSchemaRequestProcessor() error = %v", err) } if _, ok := req.Tools["set_model_response"]; ok { t.Error("set_model_response tool should NOT be added when no other tools are present") } }) t.Run("NoOpWhenNoSchema", func(t *testing.T) { baseAgent := utils.Must(agent.New(agent.Config{Name: "NoSchemaAgent"})) mockAgent := &mockLLMAgent{ Agent: baseAgent, s: &State{ Model: &mockLLM{name: "gemini-2.5-flash"}, OutputSchema: nil, Tools: []tool.Tool{&mockTool{name: "other_tool"}}, }, } req := &model.LLMRequest{} ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: mockAgent, }) events := outputSchemaRequestProcessor(ctx, req, f) for _, err := range events { t.Fatalf("outputSchemaRequestProcessor() error = %v", err) } if _, ok := req.Tools["set_model_response"]; ok { t.Error("set_model_response tool should NOT be added when no OutputSchema") } }) t.Run("NoOpWhenNativeSupportAvailable", func(t *testing.T) { // Native support = Vertex AI + Gemini 2.5+ llm := &mockLLM{ name: "gemini-2.5-flash", variant: func() *genai.Backend { x := genai.BackendVertexAI; return &x }(), } baseAgent := utils.Must(agent.New(agent.Config{Name: "VertexGemini2Agent"})) mockAgent := &mockLLMAgent{ Agent: baseAgent, s: &State{ Model: llm, OutputSchema: schema, Tools: []tool.Tool{&mockTool{name: "other_tool"}}, }, } req := &model.LLMRequest{} ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: mockAgent, }) events := outputSchemaRequestProcessor(ctx, req, f) for _, err := range events { t.Fatalf("outputSchemaRequestProcessor() error = %v", err) } if _, ok := req.Tools["set_model_response"]; ok { t.Error("set_model_response tool should NOT be added when native support is available") } }) } func TestCreateFinalModelResponseEvent(t *testing.T) { // Setup context a := utils.Must(agent.New(agent.Config{Name: "TestAgent"})) invCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: a, }) jsonResp := `{"answer": "value"}` event := createFinalModelResponseEvent(invCtx, jsonResp) if event.Author != "TestAgent" { t.Errorf("Author = %q, want TestAgent", event.Author) } if event.Content == nil || event.Content.Role != "model" { t.Errorf("Content Role mismatch or nil") } if event.Branch != invCtx.Branch() { t.Errorf("Branch = %q, want %q", event.Branch, invCtx.Branch()) } if event.InvocationID != invCtx.InvocationID() { t.Errorf("InvocationID = %q, want %q", event.InvocationID, invCtx.InvocationID()) } if len(event.Content.Parts) != 1 { t.Fatalf("Content Parts length = %d, want 1", len(event.Content.Parts)) } if got := event.Content.Parts[0].Text; got != jsonResp { t.Errorf("Content Text = %q, want %q", got, jsonResp) } } func TestGetStructuredModelResponse(t *testing.T) { t.Run("ExtractsResponse", func(t *testing.T) { event := &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: "set_model_response", Response: map[string]any{ "result": 123.0, }, }, }, }, }, }, } got, err := retrieveStructuredModelResponse(event) if err != nil { t.Fatalf("GetStructuredModelResponse error: %v", err) } // The JSON might be formatted differently, so unmarshal to compare var gotMap map[string]any if err := json.Unmarshal([]byte(got), &gotMap); err != nil { t.Fatalf("Result is not valid JSON: %v", err) } wantMap := map[string]any{"result": 123.0} if diff := cmp.Diff(wantMap, gotMap); diff != "" { t.Errorf("Extracted JSON mismatch (-want +got):\n%s", diff) } }) t.Run("NoResponseWhenNameMismatch", func(t *testing.T) { event := &session.Event{ LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: "other_tool", Response: map[string]any{"x": 1}, }, }, }, }, }, } got, err := retrieveStructuredModelResponse(event) if err != nil { t.Fatal("Expected nil for tool name mismatch, got error") } if got != "" { t.Errorf("Expected empty string, got %q", got) } }) t.Run("NilEvent", func(t *testing.T) { got, err := retrieveStructuredModelResponse(nil) if err != nil { t.Fatal("Expected nil for nil event, got error") } if got != "" { t.Error("expected empty string") } }) } func TestSetModelResponseTool(t *testing.T) { schema := &genai.Schema{ Type: genai.TypeObject, Properties: map[string]*genai.Schema{ "count": {Type: genai.TypeInteger}, }, Required: []string{"count"}, } toolInstance := &setModelResponseTool{schema: schema} // Check Description if !strings.Contains(toolInstance.Description(), "outputting text directly") { t.Errorf("Description should contain explicit instruction") } t.Run("RunSuccess", func(t *testing.T) { invCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) toolCtx := toolinternal.NewToolContext(invCtx, "", nil, nil) input := map[string]any{"count": 10.0} // JSON numbers often come as float64 got, err := toolInstance.Run(toolCtx, input) if err != nil { t.Fatalf("Run failed: %v", err) } if diff := cmp.Diff(input, got); diff != "" { t.Errorf("Output mismatch (-want +got):\n%s", diff) } }) t.Run("RunValidationFailure_Type", func(t *testing.T) { invCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) toolCtx := toolinternal.NewToolContext(invCtx, "", nil, nil) input := map[string]any{"count": "not a number"} _, err := toolInstance.Run(toolCtx, input) if err == nil { t.Error("Expected validation error for invalid type, got nil") } }) t.Run("RunValidationFailure_MissingRequired", func(t *testing.T) { invCtx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{}) toolCtx := toolinternal.NewToolContext(invCtx, "", nil, nil) input := map[string]any{"other": 123} _, err := toolInstance.Run(toolCtx, input) if err == nil { t.Error("Expected validation error for missing required field, got nil") } }) } ================================================ FILE: internal/llminternal/parallel_function_call_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "net/http" "path/filepath" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/httprr" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) type SumArgs struct { A int `json:"a"` // an integer to sum B int `json:"b"` // another integer to sum } type SumResult struct { Sum int `json:"sum"` // the sum of two integers } func sumFunc(ctx tool.Context, input SumArgs) (SumResult, error) { return SumResult{Sum: input.A + input.B}, nil } var expectedNonPartialLLMResponse25Flash = []*model.LLMResponse{ { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 2.0, "b": 3.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 4.0, "b": 5.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 6.0, "b": 7.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 5.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 9.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 13.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("The sum of 2 and 3 is 5.\nThe sum of 4 and 5 is 9.\nThe sum of 6 and 7 is 13."), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 10.0, "b": 20.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 40.0, "b": 50.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 60.0, "b": 70.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 30.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 90.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 130.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("The sum of 10 and 20 is 30.\nThe sum of 40 and 50 is 90.\nThe sum of 60 and 70 is 130."), }, Role: "model", }, }, } var expectedNonPartialLLMResponse3FlashPreview = []*model.LLMResponse{ { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 2.0, "b": 3.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 4.0, "b": 5.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 6.0, "b": 7.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 5.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 9.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 13.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13."), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 10.0, "b": 20.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 40.0, "b": 50.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 60.0, "b": 70.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 30.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 90.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 130.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("The sum of 10 and 20 is 30, the sum of 40 and 50 is 90, and the sum of 60 and 70 is 130."), }, Role: "model", }, }, } var expectedNonPartialLLMResponse3ProPreview = []*model.LLMResponse{ { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 2.0, "b": 3.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 4.0, "b": 5.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 6.0, "b": 7.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 5.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 9.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 13.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Here are the results of your additions:\n* 2 + 3 = 5\n* 4 + 5 = 9\n* 6 + 7 = 13"), {}, // empty part with thought signature }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 10.0, "b": 20.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 40.0, "b": 50.0, }), genai.NewPartFromFunctionCall("sum", map[string]any{ "a": 60.0, "b": 70.0, }), }, Role: "model", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 30.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 90.0, }), genai.NewPartFromFunctionResponse("sum", map[string]any{ "sum": 130.0, }), }, Role: "user", }, }, { Partial: false, Content: &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Here are the results for those additions:\n* 10 + 20 = 30\n* 40 + 50 = 90\n* 60 + 70 = 130"), {}, // empty part with thought signature }, Role: "model", }, }, } func TestParallelFunctionCalls(t *testing.T) { tests := []struct { name string modelName string wantLLMResponse []*model.LLMResponse }{ {"gemini-2.5-flash", "gemini-2.5-flash", expectedNonPartialLLMResponse25Flash}, {"gemini-3-flash-preview", "gemini-3-flash-preview", expectedNonPartialLLMResponse3FlashPreview}, {"gemini-3.1-pro-preview", "gemini-3.1-pro-preview", expectedNonPartialLLMResponse3ProPreview}, } for _, tt := range tests { t.Run("test_parallel_function_calls_"+tt.name, func(t *testing.T) { httpRecordFilename := filepath.Join("testdata", strings.ReplaceAll(t.Name(), "/", "_")+".httprr") baseTransport, err := testutil.NewGeminiTransport(httpRecordFilename) if err != nil { t.Fatal(err) } apiKey := "" if recording, _ := httprr.Recording(httpRecordFilename); !recording { apiKey = "fakekey" } cfg := &genai.ClientConfig{ HTTPClient: &http.Client{Transport: baseTransport}, APIKey: apiKey, } geminiModel, err := gemini.NewModel(t.Context(), tt.modelName, cfg) if err != nil { t.Fatal(err) } sumTool, err := functiontool.New(functiontool.Config{ Name: "sum", Description: "sums two integers", }, sumFunc) if err != nil { t.Fatal(err) } a, err := llmagent.New(llmagent.Config{ Name: "calculator", Description: "A calculator that can add two integers", Instruction: "You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.", Model: geminiModel, Tools: []tool.Tool{ sumTool, }, }) if err != nil { t.Fatal(err) } sessionService := session.InMemoryService() _, err = sessionService.Create(t.Context(), &session.CreateRequest{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", }) if err != nil { t.Fatal(err) } r, err := runner.New(runner.Config{ Agent: a, SessionService: sessionService, AppName: "testApp", }) if err != nil { t.Fatal(err) } it := r.Run(t.Context(), "testUser", "testSession", &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Can you add 2 and 3? Also 4 and 5? And 6 and 7?"), }, Role: "user", }, agent.RunConfig{StreamingMode: agent.StreamingModeSSE}) functionCalls := make([]*genai.FunctionCall, 0) functionResponses := make([]*genai.FunctionResponse, 0) functionCallsPartial := make([]*genai.FunctionCall, 0) functionResponsesPartial := make([]*genai.FunctionResponse, 0) nonPartialEvents := make([]*model.LLMResponse, 0) handleLoop := func(ev *session.Event) { if !ev.Partial { nonPartialEvents = append(nonPartialEvents, &ev.LLMResponse) } if ev.Content != nil { for _, part := range ev.Content.Parts { if part.FunctionCall != nil { if ev.Partial { functionCallsPartial = append(functionCallsPartial, part.FunctionCall) } else { functionCalls = append(functionCalls, part.FunctionCall) } } if part.FunctionResponse != nil { if ev.Partial { functionResponsesPartial = append(functionResponsesPartial, part.FunctionResponse) } else { functionResponses = append(functionResponses, part.FunctionResponse) } } } } } for ev, err := range it { if err != nil { t.Fatal(err) } handleLoop(ev) } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.Part{}, "ThoughtSignature"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID"), cmpopts.IgnoreFields(model.LLMResponse{}, "UsageMetadata"), } if len(functionCalls) != 3 || len(functionResponses) != 3 { t.Errorf("expected 3 function calls and 3 function responses, got %d function calls and %d function responses", len(functionCalls), len(functionResponses)) } if len(functionCallsPartial) != 3 || len(functionResponsesPartial) != 0 { t.Errorf("expected 3 partial function calls and 0 partial function responses, got %d partial function calls and %d partial function responses", len(functionCallsPartial), len(functionResponsesPartial)) } it = r.Run(t.Context(), "testUser", "testSession", &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"), }, Role: "user", }, agent.RunConfig{StreamingMode: agent.StreamingModeSSE}) for ev, err := range it { if err != nil { t.Fatal(err) } handleLoop(ev) } if len(functionCalls) != 6 || len(functionResponses) != 6 { t.Errorf("expected 6 function calls and 6 function responses, got %d function calls and %d function responses", len(functionCalls), len(functionResponses)) } if len(functionCallsPartial) != 6 || len(functionResponsesPartial) != 0 { t.Errorf("expected 6 partial function calls and 0 partial function responses, got %d partial function calls and %d partial function responses", len(functionCallsPartial), len(functionResponsesPartial)) } for i, ev := range nonPartialEvents { if diff := cmp.Diff(tt.wantLLMResponse[i], ev, ignoreFields...); diff != "" { t.Errorf("diff in the events: got event[%d]: %v, want: %v, diff: %v", i, ev, tt.wantLLMResponse[i], diff) } if i == 0 || i == 3 { if len(ev.Content.Parts[0].ThoughtSignature) == 0 { t.Errorf("expected non-empty thought signature, got empty") } } } }) } } ================================================ FILE: internal/llminternal/request_confirmation_processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "encoding/json" "fmt" "iter" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/toolconfirmation" ) type confirmedCall struct { confirmation *toolconfirmation.ToolConfirmation call genai.FunctionCall } func RequestConfirmationRequestProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { llmAgent := asLLMAgent(ctx.Agent()) if llmAgent == nil { return // In python, no error is yielded. } toolsmap := make(map[string]tool.Tool) for _, tool := range f.Tools { toolsmap[tool.Name()] = tool } var events []*session.Event if ctx.Session() != nil { for e := range ctx.Session().Events().All() { events = append(events, e) } } confirmationResponses := make(map[string]toolconfirmation.ToolConfirmation) confirmationEventIndex := -1 for k := len(events) - 1; k >= 0; k-- { event := events[k] // Find the first event authored by user if event.Author != "user" { continue } responses := utils.FunctionResponses(event.Content) if len(responses) == 0 { return } for _, funcResp := range responses { if funcResp.Name != toolconfirmation.FunctionCallName { continue } var tc toolconfirmation.ToolConfirmation if funcResp.Response != nil { resp, hasResponseKey := funcResp.Response["response"] // ADK web client will send a request that is always encapsulated in a 'response' key. if hasResponseKey && len(funcResp.Response) == 1 { if jsonString, ok := resp.(string); ok { err := json.Unmarshal([]byte(jsonString), &tc) if err != nil { yield(nil, fmt.Errorf("error 'response' key found but failed unmarshalling confirmation function response for event id %q: %w", event.ID, err)) return } } else { yield(nil, fmt.Errorf("error 'response' key found but value is not a string for confirmation function response for event id %q", event.ID)) return } } else { tempJSON, err := json.Marshal(funcResp.Response) if err != nil { yield(nil, fmt.Errorf("error failed marshalling confirmation function response for event id %q: %w", event.ID, err)) return } err = json.Unmarshal(tempJSON, &tc) if err != nil { yield(nil, fmt.Errorf("error failed unmarshalling confirmation function response for event id %q: %w", event.ID, err)) return } } } confirmationResponses[funcResp.ID] = tc } confirmationEventIndex = k break } if len(confirmationResponses) == 0 { return } // TODO could we skip events for >= confirmationEventIndex for k := len(events) - 2; k >= 0; k-- { event := events[k] // Find the system generated FunctionCall event requesting the tool confirmation calls := utils.FunctionCalls(event.Content) if len(calls) == 0 { continue } toolsToResumeByFunctionCallID := map[string]*confirmedCall{} for _, functionCall := range calls { confirmation, ok := confirmationResponses[functionCall.ID] if !ok { continue } originalFunctionCall, err := toolconfirmation.OriginalCallFrom(functionCall) if err != nil { continue } toolsToResumeByFunctionCallID[originalFunctionCall.ID] = &confirmedCall{ confirmation: &confirmation, call: *originalFunctionCall, } } if len(toolsToResumeByFunctionCallID) == 0 { continue } // TODO consider forward or backward pass instead of nested loops // Remove the tools that have already been confirmed. for j := len(events) - 1; j > confirmationEventIndex; j-- { event = events[j] responses := utils.FunctionResponses(event.Content) if len(responses) == 0 { continue } for _, resp := range responses { delete(toolsToResumeByFunctionCallID, resp.ID) } if len(toolsToResumeByFunctionCallID) == 0 { break } } if len(toolsToResumeByFunctionCallID) == 0 { continue } parts := make([]*genai.Part, 0) toolsToResumeConfirmation := make(map[string]*toolconfirmation.ToolConfirmation, len(toolsToResumeByFunctionCallID)) for callID, cc := range toolsToResumeByFunctionCallID { parts = append(parts, &genai.Part{FunctionCall: &cc.call}) toolsToResumeConfirmation[callID] = cc.confirmation } ev, err := f.handleFunctionCalls(ctx, toolsmap, &model.LLMResponse{ Content: &genai.Content{Parts: parts, Role: genai.RoleUser}, }, toolsToResumeConfirmation) if !yield(ev, err) { return } } } } ================================================ FILE: internal/llminternal/request_confirmation_processor_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "context" "encoding/json" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/protobuf/testing/protocmp" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/toolconfirmation" ) const ( mockToolName = "mock_tool" mockFunctionCallID = "mock_function_call_id" mockConfirmationFunctionCallID = "mock_confirmation_function_call_id" ) type mockTool struct { name string } func (m *mockTool) Name() string { return m.name } func (m *mockTool) Description() string { return "mock tool" } func (m *mockTool) IsLongRunning() bool { return false } func (m *mockTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{Name: m.name} } func (m *mockTool) Run(ctx tool.Context, args any) (map[string]any, error) { if ctx.ToolConfirmation() == nil || !ctx.ToolConfirmation().Confirmed { return map[string]any{"error": string("Tool execution not confirmed")}, nil } return map[string]any{"result": "Mock tool result with test"}, nil } func newMockLlmAgent() (agent.Agent, []tool.Tool, error) { testModel := &testModel{} tools := []tool.Tool{ &mockTool{name: "mock_tool"}, } agnt, err := llmagent.New(llmagent.Config{ Name: "testAgent", Model: testModel, Tools: tools, }) return agnt, tools, err } func createInvocationContext(t *testing.T, agnt agent.Agent, sess session.Session) agent.InvocationContext { t.Helper() ctx := icontext.NewInvocationContext(context.Background(), icontext.InvocationContextParams{ Agent: agnt, Session: sess, }) return ctx } func TestRequestConfirmationRequestProcessor(t *testing.T) { // 1. Setup shared data and helpers used across test cases originalFunctionCall := &genai.FunctionCall{ Name: mockToolName, Args: map[string]any{"param1": "test"}, ID: mockFunctionCallID, } originalCallMap := map[string]any{ "name": originalFunctionCall.Name, "args": originalFunctionCall.Args, "id": originalFunctionCall.ID, } // Helper to create input events for the "confirmation" scenarios createConfirmationEvents := func(confirmed bool) []*session.Event { toolConfirmation := toolconfirmation.ToolConfirmation{Confirmed: false, Hint: "test hint"} toolConfirmationArgs := map[string]any{ "originalFunctionCall": originalCallMap, "toolConfirmation": toolConfirmation, } userConfirmation := toolconfirmation.ToolConfirmation{Confirmed: confirmed} userConfirmationJSON, _ := json.Marshal(userConfirmation) // Ignoring err for brevity in test setup helpers userConfirmationResponse := map[string]any{ "response": string(userConfirmationJSON), } return []*session.Event{ { Author: "agent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: toolconfirmation.FunctionCallName, Args: toolConfirmationArgs, ID: mockConfirmationFunctionCallID, }, }, }, }, }, }, { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: toolconfirmation.FunctionCallName, ID: mockConfirmationFunctionCallID, Response: userConfirmationResponse, }, }, }, }, }, }, } } // 2. Define the test cases tests := []struct { name string events []*session.Event wantEvents []*session.Event }{ { name: "NoEvents", events: nil, wantEvents: nil, }, { name: "NoFunctionResponses", events: []*session.Event{ { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, }, }, wantEvents: nil, }, { name: "NoConfirmationFunctionResponse", events: []*session.Event{ { Author: "user", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: "other_function", Response: map[string]any{}, }, }, }, }, }, }, }, wantEvents: nil, }, { name: "Success", events: createConfirmationEvents(true), wantEvents: []*session.Event{ { Author: "testAgent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: mockToolName, ID: mockFunctionCallID, Response: map[string]any{"result": "Mock tool result with test"}, }, }, }, Role: "user", }, }, }, }, }, { name: "ToolNotConfirmed", events: createConfirmationEvents(false), wantEvents: []*session.Event{ { Author: "testAgent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: mockToolName, ID: mockFunctionCallID, Response: map[string]any{"error": "Tool execution not confirmed"}, }, }, }, Role: "user", }, }, }, }, }, } // 3. Execution Loop for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { agnt, tools, err := newMockLlmAgent() if err != nil { t.Fatalf("error creating mock llmagent: %v", err) } invocationContext := createInvocationContext(t, agnt, &fakeSession{ events: tt.events, }) llmRequest := &model.LLMRequest{} iter := llminternal.RequestConfirmationRequestProcessor(invocationContext, llmRequest, &llminternal.Flow{Tools: tools}) var gotEvents []*session.Event for event, err := range iter { if err != nil { t.Fatalf("RequestConfirmationRequestProcessor() unexpected error: %v", err) } gotEvents = append(gotEvents, event) } // Validate Count if len(gotEvents) != len(tt.wantEvents) { t.Errorf("RequestConfirmationRequestProcessor() got %d events, want %d", len(gotEvents), len(tt.wantEvents)) return } // Validate Content (only if we expected events) if len(tt.wantEvents) > 0 { ignoreFields := []cmp.Option{ protocmp.Transform(), cmpopts.IgnoreFields(session.Event{}, "ID"), cmpopts.IgnoreFields(session.Event{}, "Timestamp"), cmpopts.IgnoreFields(session.Event{}, "InvocationID"), cmpopts.IgnoreFields(session.EventActions{}, "StateDelta", "ArtifactDelta"), } if diff := cmp.Diff(tt.wantEvents, gotEvents, ignoreFields...); diff != "" { t.Errorf("RequestConfirmationRequestProcessor() event diff (-want +got):\n%s", diff) } } }) } } ================================================ FILE: internal/llminternal/stream_aggregator.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "context" "fmt" "iter" "maps" "reflect" "strings" "google.golang.org/genai" "google.golang.org/adk/internal/llminternal/converters" "google.golang.org/adk/model" ) // streamingResponseAggregator aggregates partial streaming responses. // It aggregates content from partial responses, and generates LlmResponses for // individual (partial) model responses, as well as for aggregated content. type streamingResponseAggregator struct { usageMetadata *genai.GenerateContentResponseUsageMetadata groundingMetadata *genai.GroundingMetadata citationMetadata *genai.CitationMetadata response *model.LLMResponse sequence []*genai.Part currentTextBuffer string currentTextIsThought bool finishReason genai.FinishReason currentFunctionName string currentFunctionID string currentFunctionArgs map[string]any currentFunctionThoughtSignature []byte } // NewStreamingResponseAggregator creates a new, initialized streamingResponseAggregator. func NewStreamingResponseAggregator() *streamingResponseAggregator { return &streamingResponseAggregator{} } // ProcessResponse transforms the GenerateContentResponse into an model.Response and yields that result, // also yielding an aggregated response if the GenerateContentResponse has zero parts or is audio data func (s *streamingResponseAggregator) ProcessResponse(ctx context.Context, genResp *genai.GenerateContentResponse) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { if len(genResp.Candidates) == 0 { // shouldn't happen? yield(nil, fmt.Errorf("empty response")) return } candidate := genResp.Candidates[0] resp := converters.Genai2LLMResponse(genResp) resp.TurnComplete = candidate.FinishReason != "" // Aggregate the response and check if an intermediate event to yield was created if aggrResp := s.aggregateResponse(resp); aggrResp != nil { if !yield(aggrResp, nil) { return // Consumer stopped } } // Yield the processed response if !yield(resp, nil) { return // Consumer stopped } } } func (s *streamingResponseAggregator) aggregateResponse(llmResponse *model.LLMResponse) *model.LLMResponse { s.response = llmResponse s.usageMetadata = llmResponse.UsageMetadata if llmResponse.GroundingMetadata != nil { s.groundingMetadata = llmResponse.GroundingMetadata } if llmResponse.CitationMetadata != nil { s.citationMetadata = llmResponse.CitationMetadata } if llmResponse.FinishReason != "" { s.finishReason = llmResponse.FinishReason } llmResponse.Partial = true if llmResponse.Content == nil { return nil } for _, part := range llmResponse.Content.Parts { // gemini 3 in streaming returns a last response with an empty part. We will filter it out. if reflect.ValueOf(*part).IsZero() { continue } if part.Text != "" { if s.currentTextBuffer != "" && part.Thought != s.currentTextIsThought { s.flushTextBufferToSequence() } if s.currentTextBuffer == "" { s.currentTextIsThought = part.Thought } s.currentTextBuffer += part.Text } else if part.FunctionCall != nil { // Process function call (handles both streaming Args and non-streaming Args s.processFunctionCallPart(part) } else { // Other non-text parts (bytes, etc.) // Flush any buffered text first, then add the non-text part s.flushTextBufferToSequence() s.sequence = append(s.sequence, part) } } return nil } func (s *streamingResponseAggregator) processFunctionCallPart(part *genai.Part) { if part.FunctionCall == nil { return } if part.FunctionCall.PartialArgs != nil || (part.FunctionCall.WillContinue != nil && *part.FunctionCall.WillContinue) { if len(part.ThoughtSignature) > 0 && s.currentFunctionThoughtSignature == nil { s.currentFunctionThoughtSignature = part.ThoughtSignature } s.processStreamingFunctionCallPart(part) } else { if part.FunctionCall.Name != "" { s.flushTextBufferToSequence() s.sequence = append(s.sequence, part) } } } // Process a streaming function call with partialArgs. func (s *streamingResponseAggregator) processStreamingFunctionCallPart(part *genai.Part) { if part.FunctionCall.Name != "" { s.currentFunctionName = part.FunctionCall.Name } if part.FunctionCall.ID != "" { s.currentFunctionID = part.FunctionCall.ID } for _, arg := range part.FunctionCall.PartialArgs { jsonPath := arg.JsonPath if jsonPath == "" { continue } value, ok := s.getValueFromPartialArg(arg, jsonPath) if !ok { continue } s.setValueByJSONPath(jsonPath, value) } if part.FunctionCall.WillContinue != nil && *part.FunctionCall.WillContinue { return } s.flushTextBufferToSequence() s.flushFunctionCallToSequence() } func (s *streamingResponseAggregator) getValueFromPartialArg(partialArg *genai.PartialArg, jsonPath string) (any, bool) { var value any var hasValue bool if partialArg.StringValue != "" { stringChunk := partialArg.StringValue hasValue = true // Clean up the JSONPath prefix pathWithoutPrefix := jsonPath if strings.HasPrefix(jsonPath, "$.") { pathWithoutPrefix = jsonPath[2:] } pathParts := strings.Split(pathWithoutPrefix, ".") // Try to get existing value by traversing the map var existingValue any = s.currentFunctionArgs for _, part := range pathParts { if m, ok := existingValue.(map[string]any); ok { if val, exists := m[part]; exists { existingValue = val continue } } // If we can't find the path or it's not a map, reset existingValue existingValue = nil break } // Append to existing string or set new value if str, ok := existingValue.(string); ok { value = str + stringChunk } else { value = stringChunk } } else if partialArg.NumberValue != nil { value = *partialArg.NumberValue hasValue = true } else if partialArg.BoolValue != nil { value = *partialArg.BoolValue hasValue = true } else if partialArg.NULLValue != "" { value = nil hasValue = true } return value, hasValue } func (s *streamingResponseAggregator) setValueByJSONPath(jsonPath string, value any) { // Initialize the map if it hasn't been already if s.currentFunctionArgs == nil { s.currentFunctionArgs = make(map[string]any) } // Remove leading "$." from jsonPath path := jsonPath if strings.HasPrefix(jsonPath, "$.") { path = jsonPath[2:] } // Split path into components pathParts := strings.Split(path, ".") if len(pathParts) == 0 || (len(pathParts) == 1 && pathParts[0] == "") { return // Handle empty path case } // Navigate to the correct location current := s.currentFunctionArgs // Iterate through all parts except the last one for _, part := range pathParts[:len(pathParts)-1] { next, exists := current[part] // If the path doesn't exist, or the existing value isn't a map, // create a new map at this node. nextMap, ok := next.(map[string]any) if !exists || !ok { nextMap = make(map[string]any) current[part] = nextMap } current = nextMap } // Set the final value at the last key lastKey := pathParts[len(pathParts)-1] current[lastKey] = value } func (s *streamingResponseAggregator) flushTextBufferToSequence() { // Check if buffer has content (strings.Builder.Len() is efficient) if s.currentTextBuffer != "" { s.sequence = append(s.sequence, &genai.Part{ Text: s.currentTextBuffer, Thought: s.currentTextIsThought, }) // Reset the buffer and the state s.currentTextBuffer = "" s.currentTextIsThought = false } } func (s *streamingResponseAggregator) flushFunctionCallToSequence() { if s.currentFunctionName != "" { fc := &genai.FunctionCall{ Name: s.currentFunctionName, Args: maps.Clone(s.currentFunctionArgs), ID: s.currentFunctionID, } fcPart := &genai.Part{ FunctionCall: fc, } if s.currentFunctionThoughtSignature != nil { fcPart.ThoughtSignature = s.currentFunctionThoughtSignature } s.sequence = append(s.sequence, fcPart) s.currentFunctionName = "" s.currentFunctionID = "" s.currentFunctionThoughtSignature = nil s.currentFunctionArgs = make(map[string]any) } } // Close generates an aggregated response at the end, if needed, // this should be called after all the model responses are processed. func (s *streamingResponseAggregator) Close() *model.LLMResponse { if s.response != nil { s.flushTextBufferToSequence() s.flushFunctionCallToSequence() errorCode := "" errorMessage := "" if s.finishReason != genai.FinishReasonStop { if s.response.ErrorCode != "" { errorCode = s.response.ErrorCode } else { errorCode = "error" } if s.response.ErrorMessage != "" { errorMessage = s.response.ErrorMessage } else { errorMessage = "error" } } return &model.LLMResponse{ Content: &genai.Content{ Parts: s.sequence, Role: genai.RoleModel, }, UsageMetadata: s.usageMetadata, GroundingMetadata: s.groundingMetadata, CitationMetadata: s.citationMetadata, ErrorCode: errorCode, ErrorMessage: errorMessage, } } return nil } ================================================ FILE: internal/llminternal/stream_aggregator_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal_test import ( "context" "iter" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) func ptr[T any](v T) *T { return &v } func TestProgressiveSSEStreamingFunctionCallArguments(t *testing.T) { aggregator := llminternal.NewStreamingResponseAggregator() ctx := t.Context() // Chunk 1: FC name + partial location argument ("New ") chunk1 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "get_weather", ID: "fc_001", PartialArgs: []*genai.PartialArg{ {JsonPath: "$.location", StringValue: "New "}, }, WillContinue: ptr(true), }, }, }, }, }, }, } // Chunk 2: Continue location argument ("York") chunk2 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ PartialArgs: []*genai.PartialArg{ {JsonPath: "$.location", StringValue: "York"}, }, WillContinue: ptr(true), }, }, }, }, }, }, } // Chunk 3: Add unit argument, FC complete chunk3 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ PartialArgs: []*genai.PartialArg{ {JsonPath: "$.unit", StringValue: "celsius"}, }, WillContinue: ptr(false), }, }, }, }, FinishReason: genai.FinishReasonStop, }, }, } var processedChunks []*model.LLMResponse for _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2, chunk3} { for resp, err := range aggregator.ProcessResponse(ctx, chunk) { if err != nil { t.Fatalf("unexpected error: %v", err) } if resp != nil { processedChunks = append(processedChunks, resp) } } } finalResponse := aggregator.Close() if finalResponse == nil { t.Fatal("expected final response from aggregator") } parts := finalResponse.Content.Parts if len(parts) != 1 { t.Fatalf("expected 1 part, got %d", len(parts)) } fcPart := parts[0] if fcPart.FunctionCall == nil { t.Fatal("expected function call part") } if fcPart.FunctionCall.Name != "get_weather" { t.Errorf("expected get_weather, got %s", fcPart.FunctionCall.Name) } if fcPart.FunctionCall.ID != "fc_001" { t.Errorf("expected fc_001, got %s", fcPart.FunctionCall.ID) } args := fcPart.FunctionCall.Args if args["location"] != "New York" { t.Errorf("expected location 'New York', got '%v'", args["location"]) } if args["unit"] != "celsius" { t.Errorf("expected unit 'celsius', got '%v'", args["unit"]) } } func TestProgressiveSSEPreservesThoughtSignature(t *testing.T) { aggregator := llminternal.NewStreamingResponseAggregator() ctx := t.Context() testThoughtSignature := []byte("test_signature_abc123") chunk := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "add_5_numbers", ID: "fc_003", PartialArgs: []*genai.PartialArg{ {JsonPath: "$.num1", NumberValue: ptr(10.0)}, {JsonPath: "$.num2", NumberValue: ptr(20.0)}, }, WillContinue: ptr(false), }, ThoughtSignature: testThoughtSignature, }, }, }, FinishReason: genai.FinishReasonStop, }, }, } for _, err := range aggregator.ProcessResponse(ctx, chunk) { if err != nil { t.Fatalf("unexpected error: %v", err) } } finalResponse := aggregator.Close() if finalResponse == nil { t.Fatal("expected final response") } parts := finalResponse.Content.Parts if len(parts) != 1 { t.Fatalf("expected 1 part, got %d", len(parts)) } fcPart := parts[0] if fcPart.FunctionCall == nil { t.Fatal("expected function call") } if fcPart.FunctionCall.Name != "add_5_numbers" { t.Errorf("expected add_5_numbers, got %s", fcPart.FunctionCall.Name) } if string(fcPart.ThoughtSignature) != string(testThoughtSignature) { t.Errorf("expected thought signature %s, got %s", string(testThoughtSignature), string(fcPart.ThoughtSignature)) } } func TestProgressiveSSEHandlesEmptyFunctionCall(t *testing.T) { aggregator := llminternal.NewStreamingResponseAggregator() ctx := t.Context() chunk1 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "concat_number_and_string", ID: "fc_001", PartialArgs: []*genai.PartialArg{ {JsonPath: "$.num", NumberValue: ptr(100.0)}, {JsonPath: "$.s", StringValue: "ADK"}, }, WillContinue: ptr(false), }, }, }, }, }, }, } chunk2 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{}, }, }, }, FinishReason: genai.FinishReasonStop, }, }, } for _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2} { for _, err := range aggregator.ProcessResponse(ctx, chunk) { if err != nil { t.Fatalf("unexpected error: %v", err) } } } finalResponse := aggregator.Close() if finalResponse == nil { t.Fatal("expected final response") } parts := finalResponse.Content.Parts if len(parts) != 1 { t.Fatalf("expected 1 part, got %d", len(parts)) } fcPart := parts[0] if fcPart.FunctionCall == nil { t.Fatal("expected function call") } if fcPart.FunctionCall.Name != "concat_number_and_string" { t.Errorf("expected concat_number_and_string, got %s", fcPart.FunctionCall.Name) } if fcPart.FunctionCall.ID != "fc_001" { t.Errorf("expected fc_001, got %s", fcPart.FunctionCall.ID) } args := fcPart.FunctionCall.Args if args["num"] != 100.0 { t.Errorf("expected num 100, got %v", args["num"]) } if args["s"] != "ADK" { t.Errorf("expected s 'ADK', got %v", args["s"]) } } func TestStreamingFCChunkWithWillContinueButNoPartialArgs(t *testing.T) { aggregator := llminternal.NewStreamingResponseAggregator() ctx := t.Context() chunk1 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "my_tool", ID: "fc_gemini3", WillContinue: ptr(true), }, ThoughtSignature: []byte("test_sig_123"), }, }, }, }, }, } chunk2 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ PartialArgs: []*genai.PartialArg{ {JsonPath: "$.document", StringValue: "Once upon "}, }, WillContinue: ptr(true), }, }, }, }, }, }, } chunk3 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ PartialArgs: []*genai.PartialArg{ {JsonPath: "$.document", StringValue: "a time..."}, }, WillContinue: ptr(true), }, }, }, }, }, }, } chunk4 := &genai.GenerateContentResponse{ Candidates: []*genai.Candidate{ { Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ WillContinue: ptr(false), }, }, }, }, FinishReason: genai.FinishReasonStop, }, }, } var processedChunks []*model.LLMResponse for _, chunk := range []*genai.GenerateContentResponse{chunk1, chunk2, chunk3, chunk4} { for resp, err := range aggregator.ProcessResponse(ctx, chunk) { if err != nil { t.Fatalf("unexpected error: %v", err) } if resp != nil { processedChunks = append(processedChunks, resp) } } } // Wait, we don't strictly test that intermediate chunks are marked partial because ProcessResponse behavior might differ. Let's just check the final result. finalResponse := aggregator.Close() if finalResponse == nil { t.Fatal("expected final response") } parts := finalResponse.Content.Parts if len(parts) != 1 { t.Fatalf("expected 1 part, got %d", len(parts)) } fcPart := parts[0] if fcPart.FunctionCall == nil { t.Fatal("expected function call") } if fcPart.FunctionCall.Name != "my_tool" { t.Errorf("expected my_tool, got %s", fcPart.FunctionCall.Name) } if fcPart.FunctionCall.ID != "fc_gemini3" { t.Errorf("expected fc_gemini3, got %s", fcPart.FunctionCall.ID) } if string(fcPart.ThoughtSignature) != "test_sig_123" { t.Errorf("expected thought signature test_sig_123, got %s", string(fcPart.ThoughtSignature)) } args := fcPart.FunctionCall.Args if args["document"] != "Once upon a time..." { t.Errorf("expected document 'Once upon a time...', got '%v'", args["document"]) } } type streamingMockModel struct { streamChunks []*model.LLMResponse callCount int } func (m *streamingMockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { m.callCount++ return func(yield func(*model.LLMResponse, error) bool) { if m.callCount > 1 { resp := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Task completed."}}, }, Partial: false, } yield(resp, nil) return } aggregator := llminternal.NewStreamingResponseAggregator() for _, chunk := range m.streamChunks { genResp := m.llmResponseToGenerateContentResponse(chunk) for processedChunk, err := range aggregator.ProcessResponse(ctx, genResp) { if err != nil { yield(nil, err) return } if processedChunk != nil { if !yield(processedChunk, nil) { return } } } } if finalResp := aggregator.Close(); finalResp != nil { yield(finalResp, nil) } } } func (m *streamingMockModel) Name() string { return "streaming-mock" } func (m *streamingMockModel) llmResponseToGenerateContentResponse(resp *model.LLMResponse) *genai.GenerateContentResponse { var candidates []*genai.Candidate if resp.Content != nil { candidates = append(candidates, &genai.Candidate{ Content: resp.Content, FinishReason: resp.FinishReason, }) } return &genai.GenerateContentResponse{ Candidates: candidates, UsageMetadata: resp.UsageMetadata, } } type GetWeatherArgs struct { Location string `json:"location"` } func getWeather(ctx tool.Context, args GetWeatherArgs) (map[string]any, error) { return map[string]any{ "temperature": 22, "condition": "sunny", "location": args.Location, }, nil } func TestProgressiveSSEStreamingFunctionCalls(t *testing.T) { response1 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Checking weather..."}}, }, } response2 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "get_weather", Args: map[string]any{"location": "Tokyo"}, }, }, }, }, } response3 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "get_weather", Args: map[string]any{"location": "New York"}, }, }, }, }, FinishReason: genai.FinishReasonStop, } mockModel := &streamingMockModel{ streamChunks: []*model.LLMResponse{response1, response2, response3}, } getWeatherTool, _ := functiontool.New(functiontool.Config{ Name: "get_weather", Description: "get weather for location", }, getWeather) ag, _ := llmagent.New(llmagent.Config{ Name: "weather_agent", Model: mockModel, Tools: []tool.Tool{getWeatherTool}, }) runner := testutil.NewTestAgentRunner(t, ag) cfg := agent.RunConfig{StreamingMode: agent.StreamingModeSSE} events, err := testutil.CollectEvents(runner.RunContentWithConfig(t, "session-1", genai.NewContentFromText("What is the weather?", "user"), cfg)) if err != nil { t.Fatalf("unexpected error: %v", err) } if len(events) != 6 { t.Fatalf("expected 6 events, got %d", len(events)) } if !events[0].Partial || events[0].LLMResponse.Content.Parts[0].Text != "Checking weather..." { t.Errorf("expected partial event 0 with text") } if !events[1].Partial || events[1].LLMResponse.Content.Parts[0].FunctionCall.Name != "get_weather" || events[1].LLMResponse.Content.Parts[0].FunctionCall.Args["location"] != "Tokyo" { t.Errorf("expected partial event 1 with function call 1") } if !events[2].Partial || events[2].LLMResponse.Content.Parts[0].FunctionCall.Name != "get_weather" || events[2].LLMResponse.Content.Parts[0].FunctionCall.Args["location"] != "New York" { t.Errorf("expected partial event 2 with function call 2") } if events[3].Partial || events[3].LLMResponse.Content.Parts[0].Text != "Checking weather..." || events[3].LLMResponse.Content.Parts[1].FunctionCall.Name != "get_weather" || events[3].LLMResponse.Content.Parts[2].FunctionCall.Name != "get_weather" { t.Errorf("expected final aggregated event 3 with FCs") } if events[4].Partial || events[4].LLMResponse.Content.Parts[0].FunctionResponse.Name != "get_weather" || events[4].LLMResponse.Content.Parts[1].FunctionResponse.Name != "get_weather" { t.Errorf("expected function response event 4") } resp1 := events[4].LLMResponse.Content.Parts[0].FunctionResponse.Response resp2 := events[4].LLMResponse.Content.Parts[1].FunctionResponse.Response if resp1["location"] != "Tokyo" || resp2["location"] != "New York" { if resp1["location"] != "New York" || resp2["location"] != "Tokyo" { t.Errorf("expected function responses to have Tokyo and New York, got %v and %v", resp1["location"], resp2["location"]) } } if events[5].Partial || len(events[5].LLMResponse.Content.Parts) == 0 || events[5].LLMResponse.Content.Parts[0].Text != "Task completed." { t.Errorf("expected task completed event 5") } } func TestProgressiveSSEPreservesPartOrdering(t *testing.T) { chunk1 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Initial thought part 1. ", Thought: true}}, }, } chunk2 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Initial thought part 2.", Thought: true}}, }, } chunk3 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Let me check Tokyo. "}}, }, } chunk4 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "And New York too."}}, }, } chunk5 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "get_weather", Args: map[string]any{"location": "Tokyo"}, }, }, }, }, } chunk6 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Now processing second thought part 1. ", Thought: true}}, }, } chunk7 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Second thought part 2.", Thought: true}}, }, } chunk8 := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "get_weather", Args: map[string]any{"location": "New York"}, }, }, }, }, FinishReason: genai.FinishReasonStop, } mockModel := &streamingMockModel{ streamChunks: []*model.LLMResponse{chunk1, chunk2, chunk3, chunk4, chunk5, chunk6, chunk7, chunk8}, } getWeatherTool, _ := functiontool.New(functiontool.Config{ Name: "get_weather", Description: "get weather for location", }, getWeather) ag, _ := llmagent.New(llmagent.Config{ Name: "ordering_test_agent", Model: mockModel, Tools: []tool.Tool{getWeatherTool}, }) runner := testutil.NewTestAgentRunner(t, ag) cfg := agent.RunConfig{StreamingMode: agent.StreamingModeSSE} events, err := testutil.CollectEvents(runner.RunContentWithConfig(t, "session-1", genai.NewContentFromText("What is the weather?", "user"), cfg)) if err != nil { t.Fatalf("unexpected error: %v", err) } var aggregatedEvent *session.Event for _, event := range events { if !event.Partial && event.Author == "ordering_test_agent" && event.Content != nil && len(event.Content.Parts) > 2 { aggregatedEvent = event break } } if aggregatedEvent == nil { t.Fatal("Should find an aggregated model event") } parts := aggregatedEvent.LLMResponse.Content.Parts if len(parts) != 5 { t.Fatalf("Expected 5 parts, got %d", len(parts)) } if !parts[0].Thought || parts[0].Text != "Initial thought part 1. Initial thought part 2." { t.Errorf("part 0 mismatch. got text: %q, thought: %v", parts[0].Text, parts[0].Thought) } if parts[1].Thought || parts[1].Text != "Let me check Tokyo. And New York too." { t.Errorf("part 1 mismatch. got text: %q, thought: %v", parts[1].Text, parts[1].Thought) } if parts[2].FunctionCall.Name != "get_weather" || parts[2].FunctionCall.Args["location"] != "Tokyo" { t.Errorf("part 2 mismatch. got FC: %v", parts[2].FunctionCall) } if !parts[3].Thought || parts[3].Text != "Now processing second thought part 1. Second thought part 2." { t.Errorf("part 3 mismatch. got text: %q, thought: %v", parts[3].Text, parts[3].Thought) } if parts[4].FunctionCall.Name != "get_weather" || parts[4].FunctionCall.Args["location"] != "New York" { t.Errorf("part 4 mismatch. got FC: %v", parts[4].FunctionCall) } } type partialFunctionCallMockModel struct{} func (m *partialFunctionCallMockModel) Name() string { return "partial-fc-mock" } func (m *partialFunctionCallMockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { hasFunctionResponse := false for _, content := range req.Contents { for _, part := range content.Parts { if part.FunctionResponse != nil { hasFunctionResponse = true break } } } if hasFunctionResponse { resp := &model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{{Text: "Function executed once."}}, }, Partial: false, } yield(resp, nil) return } if !yield(&model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "track_execution", Args: map[string]any{"call_id": "partial_1"}, }, }, }, }, Partial: true, }, nil) { return } if !yield(&model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "track_execution", Args: map[string]any{"call_id": "partial_2"}, }, }, }, }, Partial: true, }, nil) { return } if !yield(&model.LLMResponse{ Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "track_execution", Args: map[string]any{"call_id": "final"}, }, }, }, }, Partial: false, FinishReason: genai.FinishReasonStop, }, nil) { return } } } func TestPartialFunctionCallsNotExecutedInNoneStreamingMode(t *testing.T) { var executionLog []string mockModel := &partialFunctionCallMockModel{} type TrackExecutionArgs struct { CallID string `json:"call_id"` } trackExecution := func(ctx tool.Context, args TrackExecutionArgs) (string, error) { executionLog = append(executionLog, args.CallID) return "Executed: " + args.CallID, nil } trackTool, _ := functiontool.New(functiontool.Config{ Name: "track_execution", Description: "A tool that logs execution", }, trackExecution) ag, _ := llmagent.New(llmagent.Config{ Name: "partial_fc_test_agent", Model: mockModel, Tools: []tool.Tool{trackTool}, }) runner := testutil.NewTestAgentRunner(t, ag) cfg := agent.RunConfig{StreamingMode: agent.StreamingModeNone} // using mode None to ensure partial handling acts same events, err := testutil.CollectEvents(runner.RunContentWithConfig(t, "session-1", genai.NewContentFromText("Test partial FC handling", "user"), cfg)) if err != nil { t.Fatalf("unexpected error: %v", err) } if len(executionLog) != 1 { t.Fatalf("Expected 1 execution, got %d: %v", len(executionLog), executionLog) } if executionLog[0] != "final" { t.Errorf("Expected 'final' execution, got: %s", executionLog[0]) } partialEvents := 0 for _, event := range events { if event.Partial { partialEvents++ } } if partialEvents != 2 { t.Errorf("Expected 2 partial events, got %d", partialEvents) } functionResponseEvents := 0 for _, event := range events { if event.Content != nil { for _, p := range event.Content.Parts { if p.FunctionResponse != nil { functionResponseEvents++ break } } } } if functionResponseEvents != 1 { t.Errorf("Expected 1 function response event, got %d", functionResponseEvents) } } ================================================ FILE: internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-2.5-flash.httprr ================================================ httprr trace v1 1093 1473 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 847 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:39 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1217 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 2,"b": 3}},"thoughtSignature": "CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ=="},{"functionCall": {"name": "sum","args": {"a": 4,"b": 5}}},{"functionCall": {"name": "sum","args": {"a": 6,"b": 7}}}],"role": "model"},"finishReason": "STOP","index": 0,"finishMessage": "Model generated function call(s)."}],"usageMetadata": {"promptTokenCount": 171,"candidatesTokenCount": 54,"totalTokenCount": 302,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 171}],"thoughtsTokenCount": 77},"modelVersion": "gemini-2.5-flash","responseId": "ZiS5ae3fFoSAkdUPnfrxqQU"} 2024 1412 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1777 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"sum"},"thoughtSignature":"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ=="},{"functionCall":{"args":{"a":4,"b":5},"name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"sum","response":{"sum":5}}},{"functionResponse":{"name":"sum","response":{"sum":9}}},{"functionResponse":{"name":"sum","response":{"sum":13}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:39 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=271 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The sum of "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 338,"candidatesTokenCount": 3,"totalTokenCount": 341,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 338}]},"modelVersion": "gemini-2.5-flash","responseId": "ZyS5aZaqIYSAkdUP_fnxqQU"} data: {"candidates": [{"content": {"parts": [{"text": "2 and 3 is 5.\nThe sum of 4 and "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 338,"candidatesTokenCount": 18,"totalTokenCount": 356,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 338}]},"modelVersion": "gemini-2.5-flash","responseId": "ZyS5aZaqIYSAkdUP_fnxqQU"} data: {"candidates": [{"content": {"parts": [{"text": "5 is 9.\nThe sum of 6 and 7 is 13."}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 338,"candidatesTokenCount": 37,"totalTokenCount": 375,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 338}]},"modelVersion": "gemini-2.5-flash","responseId": "ZyS5aZaqIYSAkdUP_fnxqQU"} 2242 1479 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1995 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"sum"},"thoughtSignature":"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ=="},{"functionCall":{"args":{"a":4,"b":5},"name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"sum","response":{"sum":5}}},{"functionResponse":{"name":"sum","response":{"sum":9}}},{"functionResponse":{"name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"The sum of 2 and 3 is 5.\nThe sum of 4 and 5 is 9.\nThe sum of 6 and 7 is 13."}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:41 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1245 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 10,"b": 20}},"thoughtSignature": "CiQBvj72+xHfUSjY1Q+JRm0oddaC1zU0b6arnGetTB/NCDEg6F8KVgG+Pvb7UlT/wm74gxxi23x3jgRE1cPd2/FOdOxcntkcdQ5v+L4mTYfUu2sGLwXVNNnv9bUoyLpp+wSJ+o7AGBUW53UZFrLF2sqFfhHP49A92pLViInxCroBAb4+9vueuRpaSOxdDOvi0EEDDXFDCkCCBUk8FgFriWtuPuNd7duA+ladgBMxodC7eMP0QyetPmx/QKCGJE+4t3h1oyK8kOKMqFFjP2z29TDo2988zhi41NCF4tS0yL6s3nUl/QD/76u83NbETV+uFs3qEbJI9aPftOrRVds2NBRiyJeKfcB8SutblxGghc+fUS0XimvFhdoqL6t74tH/EsS+srJlVTGX4dM7d2Pmdq6Pcz00H2mlCPLbCksBvj72+5+YQntTIc43ewrEbHPiXDZfocwp7AweHd0Oj6+//JjI01VYrGXe5wDXlApu+aSfMmngFS/jM1p6bJPXJRKyiaPlzou6C/U="},{"functionCall": {"name": "sum","args": {"a": 40,"b": 50}}},{"functionCall": {"name": "sum","args": {"a": 60,"b": 70}}}],"role": "model"},"finishReason": "STOP","index": 0,"finishMessage": "Model generated function call(s)."}],"usageMetadata": {"promptTokenCount": 334,"candidatesTokenCount": 60,"totalTokenCount": 470,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 334}],"thoughtsTokenCount": 76},"modelVersion": "gemini-2.5-flash","responseId": "ZyS5aaH2NpyjnsEP_d3zkQY"} 3181 1421 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 2934 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"name":"sum"},"thoughtSignature":"CmIBvj72+4pAeKnGzc+2rNwOgLyF3mo/fgOg3Nblgmuo9Mi8ln6O1N7n44cra26xGGff6ytv5zn/rtbUZtxEbAH/r2gaff8IVDzP9yg6eVn5b8Q9KgZ+9eXgqwUyyPhvgtX7xQrTAQG+Pvb7ebaQHoDzFqzNxQvrfKM5M065iUMaAZAz2UJGxPPlIax4lob1+E303FYme/2SenXsgqKTZ7i4NYjhs9QfwQbOfd3dYbZZ1RZyDKU6RX+PYzt4TJ2NzayUos42UHDW+vCftrntl7paR1azuiu+Tr7RqqVeBng6yvwkmzJTHSXZrurGRLwNbzeCijEC4O5OPZepbdtiCo1AKP9Tc5tTeVWaTY1K8/ps5usoAgPQkOMWl9QQwjNSYW/ER7oHzkRidxQzabT1DG8FOKK98VIySfwKSwG+Pvb7U2KAVMyij4xiu5gkeZR0jguuRR7+QWThUIzNNL/Y/fLgP9i8nS5Gpdus5o97y66e2VlUZgBbMXiieDrIbSPlEcbuubkHzQ=="},{"functionCall":{"args":{"a":4,"b":5},"name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"sum","response":{"sum":5}}},{"functionResponse":{"name":"sum","response":{"sum":9}}},{"functionResponse":{"name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"The sum of 2 and 3 is 5.\nThe sum of 4 and 5 is 9.\nThe sum of 6 and 7 is 13."}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":10,"b":20},"name":"sum"},"thoughtSignature":"CiQBvj72+xHfUSjY1Q+JRm0oddaC1zU0b6arnGetTB/NCDEg6F8KVgG+Pvb7UlT/wm74gxxi23x3jgRE1cPd2/FOdOxcntkcdQ5v+L4mTYfUu2sGLwXVNNnv9bUoyLpp+wSJ+o7AGBUW53UZFrLF2sqFfhHP49A92pLViInxCroBAb4+9vueuRpaSOxdDOvi0EEDDXFDCkCCBUk8FgFriWtuPuNd7duA+ladgBMxodC7eMP0QyetPmx/QKCGJE+4t3h1oyK8kOKMqFFjP2z29TDo2988zhi41NCF4tS0yL6s3nUl/QD/76u83NbETV+uFs3qEbJI9aPftOrRVds2NBRiyJeKfcB8SutblxGghc+fUS0XimvFhdoqL6t74tH/EsS+srJlVTGX4dM7d2Pmdq6Pcz00H2mlCPLbCksBvj72+5+YQntTIc43ewrEbHPiXDZfocwp7AweHd0Oj6+//JjI01VYrGXe5wDXlApu+aSfMmngFS/jM1p6bJPXJRKyiaPlzou6C/U="},{"functionCall":{"args":{"a":40,"b":50},"name":"sum"}},{"functionCall":{"args":{"a":60,"b":70},"name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"name":"sum","response":{"sum":30}}},{"functionResponse":{"name":"sum","response":{"sum":90}}},{"functionResponse":{"name":"sum","response":{"sum":130}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:41 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=375 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The sum of "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 509,"candidatesTokenCount": 3,"totalTokenCount": 512,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 509}]},"modelVersion": "gemini-2.5-flash","responseId": "aSS5acO0CfXk7M8PsJHAsQI"} data: {"candidates": [{"content": {"parts": [{"text": "10 and 20 is 30.\nThe sum of "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 509,"candidatesTokenCount": 18,"totalTokenCount": 527,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 509}]},"modelVersion": "gemini-2.5-flash","responseId": "aSS5acO0CfXk7M8PsJHAsQI"} data: {"candidates": [{"content": {"parts": [{"text": "40 and 50 is 90.\nThe sum of 60 and 70 is 130."}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 509,"candidatesTokenCount": 46,"totalTokenCount": 555,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 509}]},"modelVersion": "gemini-2.5-flash","responseId": "aSS5acO0CfXk7M8PsJHAsQI"} ================================================ FILE: internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-3-flash-preview.httprr ================================================ httprr trace v1 1099 2311 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 847 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:42 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1104 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"b": 3,"a": 2},"id": "3ae8iwca"},"thoughtSignature": "EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk="}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 16,"totalTokenCount": 222,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 45},"modelVersion": "gemini-3-flash-preview","responseId": "aiS5abqwJJf7nsEPuIy3wQQ"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 4,"b": 5},"id": "up3kf30e"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 32,"totalTokenCount": 238,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 45},"modelVersion": "gemini-3-flash-preview","responseId": "aiS5abqwJJf7nsEPuIy3wQQ"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"b": 7,"a": 6},"id": "ycroch25"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 48,"totalTokenCount": 254,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 45},"modelVersion": "gemini-3-flash-preview","responseId": "aiS5abqwJJf7nsEPuIy3wQQ"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 48,"totalTokenCount": 254,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 45},"modelVersion": "gemini-3-flash-preview","responseId": "aiS5abqwJJf7nsEPuIy3wQQ"} 1918 1764 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1665 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"3ae8iwca","name":"sum"},"thoughtSignature":"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk="},{"functionCall":{"args":{"a":4,"b":5},"id":"up3kf30e","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"ycroch25","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"3ae8iwca","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"up3kf30e","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"ycroch25","name":"sum","response":{"sum":13}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:43 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1232 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The sum"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 2,"totalTokenCount": 238,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}]},"modelVersion": "gemini-3-flash-preview","responseId": "ayS5abiBOIGzkdUPttS9wAQ"} data: {"candidates": [{"content": {"parts": [{"text": " of 2 and 3 is 5, the sum of 4 and"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 18,"totalTokenCount": 254,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}]},"modelVersion": "gemini-3-flash-preview","responseId": "ayS5abiBOIGzkdUPttS9wAQ"} data: {"candidates": [{"content": {"parts": [{"text": " 5 is 9, and the sum of 6 and 7 is 13."}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 38,"totalTokenCount": 274,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}]},"modelVersion": "gemini-3-flash-preview","responseId": "ayS5abiBOIGzkdUPttS9wAQ"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 281,"candidatesTokenCount": 38,"totalTokenCount": 319,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 281}]},"modelVersion": "gemini-3-flash-preview","responseId": "ayS5abiBOIGzkdUPttS9wAQ"} 2138 2509 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1885 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"3ae8iwca","name":"sum"},"thoughtSignature":"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk="},{"functionCall":{"args":{"a":4,"b":5},"id":"up3kf30e","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"ycroch25","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"3ae8iwca","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"up3kf30e","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"ycroch25","name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13."}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:45 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1324 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 10,"b": 20},"id": "to7c5o31"},"thoughtSignature": "EvUCCvICAb4+9vvPcHezYjAM+dPVIaGQOAMn5M6STamapCVVfguQGZpzFbuKSAshItSRvLBweSrybnG3JEtPI7Pk1DW7y04z1upmBUjkE99fC5bi8EYBpr3qkLJ4cGgO2r8PQbR5NbUEjcNAwBg32hMEerc5kJca7KQYYknU08Ft0/u7peN4JlfW8z97YI7Pp6h7xIWSWNCV03mY3zudV7E2fgLrfB8tNGbFO9Nw3uEIOoVucfU2+AM4DBi0f3tET9kyZh4MEmXfKWzfceImj5hF1EKWnj1Qbue1LuDKTBWe8WJSMQQmfTiGE0mdMBcf6+1HuEEvixx9e9jLC+xkgnOBBQDlBJi75ZZ2Mn5GIYITJWU7GCu+g9Bm7/bVjidyWezp8I8lp1b73ppdxBaXJMRH7m/UcfKI8SySi8q4RdpyWsCVqvakYRNqqNcMVnq5nEzGZYWQMPfeR56cdRIhDKAIawV5dXXbwHajS2jtkq8iW0QqoN6P0w=="}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 308,"candidatesTokenCount": 18,"totalTokenCount": 432,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 308}],"thoughtsTokenCount": 106},"modelVersion": "gemini-3-flash-preview","responseId": "bSS5acb2Fr6vnsEPyL-o6Qc"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 40,"b": 50},"id": "4v64pue3"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 308,"candidatesTokenCount": 36,"totalTokenCount": 450,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 308}],"thoughtsTokenCount": 106},"modelVersion": "gemini-3-flash-preview","responseId": "bSS5acb2Fr6vnsEPyL-o6Qc"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 60,"b": 70},"id": "dwwo765i"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 308,"candidatesTokenCount": 54,"totalTokenCount": 468,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 308}],"thoughtsTokenCount": 106},"modelVersion": "gemini-3-flash-preview","responseId": "bSS5acb2Fr6vnsEPyL-o6Qc"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 308,"candidatesTokenCount": 54,"totalTokenCount": 468,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 308}],"thoughtsTokenCount": 106},"modelVersion": "gemini-3-flash-preview","responseId": "bSS5acb2Fr6vnsEPyL-o6Qc"} 3153 2103 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 2900 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"3ae8iwca","name":"sum"},"thoughtSignature":"EukBCuYBAb4+9vt/vxxSqnu1O2VmsspptIIuZ5UI1XKt5qIGVw+l6Wp8gHTOskqE5v3VzNm9TnfsQQoZiWn9SnbjHsEB8zT4ABquQukeRIimRFRDehFQR0+Q8d1Ycq/8nu9h9pPtATCiVhb7L705JKNsMPhSk/k8i3XDw/jhFa11w9YWuCP2/nsul7SZP1/AfDJRroE/3/J5U8vUXnBFgmh9ZOAqEpTQvro03WSEEXy7XL5E5lMuPBEu/9CcH+N1OX32GeV0JQgZFA1vnh6DYJRwmWAbqEYqBZj8ruO7cY6FRIKagh+o7gVb+dk="},{"functionCall":{"args":{"a":4,"b":5},"id":"up3kf30e","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"ycroch25","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"3ae8iwca","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"up3kf30e","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"ycroch25","name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"The sum of 2 and 3 is 5, the sum of 4 and 5 is 9, and the sum of 6 and 7 is 13."}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":10,"b":20},"id":"to7c5o31","name":"sum"},"thoughtSignature":"EvUCCvICAb4+9vvPcHezYjAM+dPVIaGQOAMn5M6STamapCVVfguQGZpzFbuKSAshItSRvLBweSrybnG3JEtPI7Pk1DW7y04z1upmBUjkE99fC5bi8EYBpr3qkLJ4cGgO2r8PQbR5NbUEjcNAwBg32hMEerc5kJca7KQYYknU08Ft0/u7peN4JlfW8z97YI7Pp6h7xIWSWNCV03mY3zudV7E2fgLrfB8tNGbFO9Nw3uEIOoVucfU2+AM4DBi0f3tET9kyZh4MEmXfKWzfceImj5hF1EKWnj1Qbue1LuDKTBWe8WJSMQQmfTiGE0mdMBcf6+1HuEEvixx9e9jLC+xkgnOBBQDlBJi75ZZ2Mn5GIYITJWU7GCu+g9Bm7/bVjidyWezp8I8lp1b73ppdxBaXJMRH7m/UcfKI8SySi8q4RdpyWsCVqvakYRNqqNcMVnq5nEzGZYWQMPfeR56cdRIhDKAIawV5dXXbwHajS2jtkq8iW0QqoN6P0w=="},{"functionCall":{"args":{"a":40,"b":50},"id":"4v64pue3","name":"sum"}},{"functionCall":{"args":{"a":60,"b":70},"id":"dwwo765i","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"to7c5o31","name":"sum","response":{"sum":30}}},{"functionResponse":{"id":"4v64pue3","name":"sum","response":{"sum":90}}},{"functionResponse":{"id":"dwwo765i","name":"sum","response":{"sum":130}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:46 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=885 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "The sum of "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 392,"candidatesTokenCount": 4,"totalTokenCount": 396,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 392}]},"modelVersion": "gemini-3-flash-preview","responseId": "biS5aeW-FbyNkdUPpfGxwQY"} data: {"candidates": [{"content": {"parts": [{"text": "10 and 20 is 30, the sum of 4"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 392,"candidatesTokenCount": 20,"totalTokenCount": 412,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 392}]},"modelVersion": "gemini-3-flash-preview","responseId": "biS5aeW-FbyNkdUPpfGxwQY"} data: {"candidates": [{"content": {"parts": [{"text": "0 and 50 is 90, and the sum of 60 and 70 is 1"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 392,"candidatesTokenCount": 44,"totalTokenCount": 436,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 392}]},"modelVersion": "gemini-3-flash-preview","responseId": "biS5aeW-FbyNkdUPpfGxwQY"} data: {"candidates": [{"content": {"parts": [{"text": "30."}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 392,"candidatesTokenCount": 47,"totalTokenCount": 439,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 392}]},"modelVersion": "gemini-3-flash-preview","responseId": "biS5aeW-FbyNkdUPpfGxwQY"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 498,"candidatesTokenCount": 47,"totalTokenCount": 545,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 498}]},"modelVersion": "gemini-3-flash-preview","responseId": "biS5aeW-FbyNkdUPpfGxwQY"} ================================================ FILE: internal/llminternal/testdata/TestParallelFunctionCalls_test_parallel_function_calls_gemini-3.1-pro-preview.httprr ================================================ httprr trace v1 1099 3079 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 847 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:50 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=3944 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 2,"b": 3},"id": "okz0loqw"},"thoughtSignature": "EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk="}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 16,"totalTokenCount": 381,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 204},"modelVersion": "gemini-3.1-pro-preview","responseId": "ciS5aZnUG9KqkdUP5eK_kAY"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"b": 5,"a": 4},"id": "55jh6i4d"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 32,"totalTokenCount": 397,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 204},"modelVersion": "gemini-3.1-pro-preview","responseId": "ciS5aZnUG9KqkdUP5eK_kAY"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 6,"b": 7},"id": "c3oxmvnd"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 48,"totalTokenCount": 413,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 204},"modelVersion": "gemini-3.1-pro-preview","responseId": "ciS5aZnUG9KqkdUP5eK_kAY"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 161,"candidatesTokenCount": 48,"totalTokenCount": 413,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 161}],"thoughtsTokenCount": 204},"modelVersion": "gemini-3.1-pro-preview","responseId": "ciS5aZnUG9KqkdUP5eK_kAY"} 2682 2324 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 2429 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"okz0loqw","name":"sum"},"thoughtSignature":"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk="},{"functionCall":{"args":{"a":4,"b":5},"id":"55jh6i4d","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"c3oxmvnd","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"okz0loqw","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"55jh6i4d","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"c3oxmvnd","name":"sum","response":{"sum":13}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:53 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=2570 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "Here are the results of your additions:\n* 2 +"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 13,"totalTokenCount": 324,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}],"thoughtsTokenCount": 75},"modelVersion": "gemini-3.1-pro-preview","responseId": "dSS5ab-cA-vgnsEP8_61wAQ"} data: {"candidates": [{"content": {"parts": [{"text": " 3 = 5\n* 4 + 5 = 9\n* 6 + 7 = "}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 37,"totalTokenCount": 348,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}],"thoughtsTokenCount": 75},"modelVersion": "gemini-3.1-pro-preview","responseId": "dSS5ab-cA-vgnsEP8_61wAQ"} data: {"candidates": [{"content": {"parts": [{"text": "13"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 236,"candidatesTokenCount": 39,"totalTokenCount": 350,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 236}],"thoughtsTokenCount": 75},"modelVersion": "gemini-3.1-pro-preview","responseId": "dSS5ab-cA-vgnsEP8_61wAQ"} data: {"candidates": [{"content": {"parts": [{"text": "","thoughtSignature": "EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg=="}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 440,"candidatesTokenCount": 39,"totalTokenCount": 554,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 440}],"thoughtsTokenCount": 75},"modelVersion": "gemini-3.1-pro-preview","responseId": "dSS5ab-cA-vgnsEP8_61wAQ"} 3362 2765 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 3109 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"okz0loqw","name":"sum"},"thoughtSignature":"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk="},{"functionCall":{"args":{"a":4,"b":5},"id":"55jh6i4d","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"c3oxmvnd","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"okz0loqw","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"55jh6i4d","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"c3oxmvnd","name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"Here are the results of your additions:\n* 2 + 3 = 5\n* 4 + 5 = 9\n* 6 + 7 = 13"},{"thoughtSignature":"EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg=="}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:56 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=3577 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 10,"b": 20},"id": "cxk8o6f8"},"thoughtSignature": "ErcECrQEAb4+9vsZQeAMGNLLD6TBwEoFKx96WY+FK1pPtIvlrhOPDj2iojUru29Bzxj8Qfx77fx4594Oqs+C1+yYTt9kTxsFxt1SXRjepUUKjm0WLYs0LpkP46czdNaaR7rGdlgs3RJ85TNi2Sz11qrBnet4Jyl+O+Hbq49czNjl+dKpN4DhqnOPZqsaWN9m5uIGhlt17Q5CibXZApNTEUy/SqQKKzEvjbTUo4Z99f4Pw4cxw6YttaJEUiyVutnFQ+l0hoQu5HgQzKsSu4oOX6JsyQSktECvQI4R+LU2z64WgcIbv7TlcpDxmcyH7huWfNRnSCZ2UCIBZp5IUOjJIPQwpD+ElwcenyBVY6Mfk0kLex0O909631z5rump25yZlN5R330RmuNav7eXeFs6UMoiq1DsGWUipwzG4PAPEWUJPChgzttUdBPgxleTArdOw2+c1+rS7OUcaHRpmu9BfGEZgvFEff4yCwlC6Hw9dHDRgTDTuXF0AXQOT4mipXBNpaCo0JqNzFf63TALLS80Qh98uqyhHSfXYzQRTd5VBUpwIDQkB5P/7IPrkMlKGeweKOHNK2JtBlAuqBQTmXalWo3UMX9IZf0W/Q+UCRJHGoMHa7Q9xzP/bmSkO897H3VS+FbEVR4eKL0fQaHO6D4LsEGBPfUZVuc+BiCDjyRzavdXm1CYuGqwZK9LyRLEsG20+fgccDXSFCFVVi0eaUKGt3Ws+h9ALL9KrAjgSBSrFG0M8/caAXczwmk8"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 309,"candidatesTokenCount": 18,"totalTokenCount": 481,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 309}],"thoughtsTokenCount": 154},"modelVersion": "gemini-3.1-pro-preview","responseId": "eCS5adbAKNC9kdUPwpj9gAI"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 40,"b": 50},"id": "f801pusn"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 309,"candidatesTokenCount": 36,"totalTokenCount": 499,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 309}],"thoughtsTokenCount": 154},"modelVersion": "gemini-3.1-pro-preview","responseId": "eCS5adbAKNC9kdUPwpj9gAI"} data: {"candidates": [{"content": {"parts": [{"functionCall": {"name": "sum","args": {"a": 60,"b": 70},"id": "szrp1it3"}}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 309,"candidatesTokenCount": 54,"totalTokenCount": 517,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 309}],"thoughtsTokenCount": 154},"modelVersion": "gemini-3.1-pro-preview","responseId": "eCS5adbAKNC9kdUPwpj9gAI"} data: {"candidates": [{"content": {"parts": [{"text": ""}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 309,"candidatesTokenCount": 54,"totalTokenCount": 517,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 309}],"thoughtsTokenCount": 154},"modelVersion": "gemini-3.1-pro-preview","responseId": "eCS5adbAKNC9kdUPwpj9gAI"} 4633 2335 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 4380 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 3? Also 4 and 5? And 6 and 7?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":2,"b":3},"id":"okz0loqw","name":"sum"},"thoughtSignature":"EqYGCqMGAb4+9vv52GL4uROrsj4WLU0dMpALbUuH2pF13Xi6KloBtUSDw1WJLbPldKOEU1Zqf0jO7rthZuoAl7jGZTuQpRDIRkhwuVY8mKIUzgeBR6Z68wVty1jQf9j+XVxJ7l/axwicTn6cOJOzZ66K3AeFqeWM2jNE/5eoJezmWCOAxgg/Cf70AwChH7YgetDR4F+VvWav91zlx95scApzG9LaS+ihvoRzjSKRPyR2WQgtUvi+m+PvzBaLUNcYR0XZZaKXWMzLI5vnw+NeJq0h04gNTJmAHJOsQ5DjVWp703Aoh5fN8z56UO6HgMrYrIr91fJhGI2bVDKq7G5CeFj1HiFD4z4na+xmgndsEZHrj6/6JKu+2Xe2LL7iTVdi9vsv/yeQCLDC6eIbEDT7Mpda3e61Q1x+LwhMEP7LMp8lTBzcQuNxXBAcRglHC+6wIifmWwlKK1UbyEg1Fz+PctdShrhZBfs/GHPsVZdGRyzgTxa3E0cEHEfbBThtkFMmaCLUAzLXBQMs92+HpgJmXRj3iSOjlePh2PutnlHxsKLI2rs7oKOoc8XSqZt2PAoO5T6l7cgjjKbEPhKtHyKlCCekyFUggwOt1ju4U30ztmnsFM6wB0K/qA9PoQrD7AdrtdUENI0Oe/rISTj6qTviNzvMOWuRlv0L3DWsqwdAfhrseXbuTCndAixDuLMIaUsApIyqIG1/0qF1KjJRo/VXjGKyFr027Io1LjZXrHkyRrRgXntU1/v2Ys0K6SfhbluRkUFOV8AuOhm/z5UVdfObKx0GEnyOXnY9megaOnCKBmYnpv5TXyddeS+b6wEXRMaf/6eXM1Yjvvpq3iXw18cgk+z0U1LsI9u2Doq2tozBMoqEGM/bzIAVwt9nsZakcbGgUX8Y7gu+PZlTJVsrAYLsCkKD//6pxE7UdCYPdeyGIxwqefxF2LD/DugQIL7y+HgES2IgFSjyTnRjzV2pyXGtxiBBxDoT7sIMaUJciNlpwgwVmS2c5PYDOIp1Dmbw6zc8k2R3xapBFYZOqBJHu8bGWm5zsI/lmFZ0uYo7EDElbhyvQBuifbnAKDk="},{"functionCall":{"args":{"a":4,"b":5},"id":"55jh6i4d","name":"sum"}},{"functionCall":{"args":{"a":6,"b":7},"id":"c3oxmvnd","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"okz0loqw","name":"sum","response":{"sum":5}}},{"functionResponse":{"id":"55jh6i4d","name":"sum","response":{"sum":9}}},{"functionResponse":{"id":"c3oxmvnd","name":"sum","response":{"sum":13}}}],"role":"user"},{"parts":[{"text":"Here are the results of your additions:\n* 2 + 3 = 5\n* 4 + 5 = 9\n* 6 + 7 = 13"},{"thoughtSignature":"EsICCr8CAb4+9vvi0hPdbkZGP+O32Dk8jBZLVhTDxNt/Wg68DhD2sv8f2czbtpO2pwTh4nbLUfEWwG8RZqdJ3O5HZHBgesXVAFgGwmkAIMGLMaLQeuuSOjg91/ejYt4RlyEHPzO9bxVY7BxidtbUv2MkvEx2v9aLs8HwqvMNKy+me6Hy2SOZdeceMKHLBS6Or19NCY1bznX2AG0l3T/uDs2lFWmGlgEXYsIFNeXQvXKID1pkagWC9OiMVWPCYOKN6s7OdrAx/oyrK8Anm9WdtCB7HCuIqAcx9L75S8VtHrFfHd8dr/Pj5Lnwb1VBDxvLU/7251WQgeAgm0CjFNR7RICmFzMHyR2i2mMxeFKI7SQScoXb71nb4HehJxcHAYNwpDUWq4Q5E5Ehhyrz8dCpBooTdoVl1d5Pjw2L7W0in6AiyhA7yg=="}],"role":"model"},{"parts":[{"text":"Great, now can you add 10 and 20? Also 40 and 50? And 60 and 70?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"a":10,"b":20},"id":"cxk8o6f8","name":"sum"},"thoughtSignature":"ErcECrQEAb4+9vsZQeAMGNLLD6TBwEoFKx96WY+FK1pPtIvlrhOPDj2iojUru29Bzxj8Qfx77fx4594Oqs+C1+yYTt9kTxsFxt1SXRjepUUKjm0WLYs0LpkP46czdNaaR7rGdlgs3RJ85TNi2Sz11qrBnet4Jyl+O+Hbq49czNjl+dKpN4DhqnOPZqsaWN9m5uIGhlt17Q5CibXZApNTEUy/SqQKKzEvjbTUo4Z99f4Pw4cxw6YttaJEUiyVutnFQ+l0hoQu5HgQzKsSu4oOX6JsyQSktECvQI4R+LU2z64WgcIbv7TlcpDxmcyH7huWfNRnSCZ2UCIBZp5IUOjJIPQwpD+ElwcenyBVY6Mfk0kLex0O909631z5rump25yZlN5R330RmuNav7eXeFs6UMoiq1DsGWUipwzG4PAPEWUJPChgzttUdBPgxleTArdOw2+c1+rS7OUcaHRpmu9BfGEZgvFEff4yCwlC6Hw9dHDRgTDTuXF0AXQOT4mipXBNpaCo0JqNzFf63TALLS80Qh98uqyhHSfXYzQRTd5VBUpwIDQkB5P/7IPrkMlKGeweKOHNK2JtBlAuqBQTmXalWo3UMX9IZf0W/Q+UCRJHGoMHa7Q9xzP/bmSkO897H3VS+FbEVR4eKL0fQaHO6D4LsEGBPfUZVuc+BiCDjyRzavdXm1CYuGqwZK9LyRLEsG20+fgccDXSFCFVVi0eaUKGt3Ws+h9ALL9KrAjgSBSrFG0M8/caAXczwmk8"},{"functionCall":{"args":{"a":40,"b":50},"id":"f801pusn","name":"sum"}},{"functionCall":{"args":{"a":60,"b":70},"id":"szrp1it3","name":"sum"}}],"role":"model"},{"parts":[{"functionResponse":{"id":"cxk8o6f8","name":"sum","response":{"sum":30}}},{"functionResponse":{"id":"f801pusn","name":"sum","response":{"sum":90}}},{"functionResponse":{"id":"szrp1it3","name":"sum","response":{"sum":130}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator assistant. You will recieve requests to add two integers. Respond with the sum of the two integers and you must use the sum tool to calculate the sum.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"A calculator that can add two integers\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"sums two integers","name":"sum","parametersJsonSchema":{"additionalProperties":false,"properties":{"a":{"type":"integer"},"b":{"type":"integer"}},"required":["a","b"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"sum":{"type":"integer"}},"required":["sum"],"type":"object"}}]}]}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 17 Mar 2026 09:52:59 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=2791 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "Here are the results for those additions:\n* 10 +"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 393,"candidatesTokenCount": 14,"totalTokenCount": 487,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 393}],"thoughtsTokenCount": 80},"modelVersion": "gemini-3.1-pro-preview","responseId": "eyS5aY3aJf65nsEPzPaAoQM"} data: {"candidates": [{"content": {"parts": [{"text": " 20 = 30\n* 40 + 50 = 90\n* 6"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 393,"candidatesTokenCount": 38,"totalTokenCount": 511,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 393}],"thoughtsTokenCount": 80},"modelVersion": "gemini-3.1-pro-preview","responseId": "eyS5aY3aJf65nsEPzPaAoQM"} data: {"candidates": [{"content": {"parts": [{"text": "0 + 70 = 130"}],"role": "model"},"index": 0}],"usageMetadata": {"promptTokenCount": 393,"candidatesTokenCount": 48,"totalTokenCount": 521,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 393}],"thoughtsTokenCount": 80},"modelVersion": "gemini-3.1-pro-preview","responseId": "eyS5aY3aJf65nsEPzPaAoQM"} data: {"candidates": [{"content": {"parts": [{"text": "","thoughtSignature": "EsMCCsACAb4+9vsz1Lyx7TgiQyKVq3Bd/Zp4Yb+u7+COuc+BrIYdmHit3Af7++ds/aicQ51M+mD7+7TQySuE96fsb2a7Iv/xCMzWdAqBJs2Ynpox7MQQxACeVOX34ozgPfAC60LSDkNQYbnwYq1PHjV0T0Ig67+UUjucfh+pfiDriZNRRmLHEXJIn2m5PU53nnyr2dQIUU08ebT8G4SqdOI0PLFab4RELwRWJ3i5RlWxrKYwJJohefG5xDtZMWAjJHcqN8FuyQ/D74dW/0X/qPHGVq/NkVFVH0LUMq5+yB2hOrXgjGATrKg1nu+GF6vOEo+QmGOnyLv4rtmQ2bTj6Tfw/sFkhLwHs9vVOCAnohW/fkXFkCXpq9zcab1a/Q/v+TwMqy5WF0UTuPcJ/3cL+TUhfTSQqT6Pa8zTDVh0yVBXPSrQ78E="}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 547,"candidatesTokenCount": 48,"totalTokenCount": 675,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 547}],"thoughtsTokenCount": 80},"modelVersion": "gemini-3.1-pro-preview","responseId": "eyS5aY3aJf65nsEPzPaAoQM"} ================================================ FILE: internal/llminternal/tools_processor.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package llminternal import ( "fmt" "iter" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // ContentRequestProcessor populates the LLMRequest's Contents based on // the InvocationContext that includes the previous events. func toolProcessor(ctx agent.InvocationContext, req *model.LLMRequest, f *Flow) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { if f.Tools != nil { return } llmAgent, ok := ctx.Agent().(Agent) if !ok { yield(nil, fmt.Errorf("agent %v is not an LLMAgent", ctx.Agent().Name())) return } tools := Reveal(llmAgent).Tools for _, toolSet := range Reveal(llmAgent).Toolsets { tsTools, err := toolSet.Tools(icontext.NewReadonlyContext(ctx)) if err != nil { yield(nil, fmt.Errorf("failed to extract tools from the tool set %q: %w", toolSet.Name(), err)) return } tools = append(tools, tsTools...) } f.Tools = tools } } ================================================ FILE: internal/memory/memory.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memory import ( "context" "google.golang.org/adk/memory" "google.golang.org/adk/session" ) type Memory struct { Service memory.Service SessionID string UserID string AppName string } func (a *Memory) AddSessionToMemory(ctx context.Context, session session.Session) error { return a.Service.AddSessionToMemory(ctx, session) } func (a *Memory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { return a.Service.SearchMemory(ctx, &memory.SearchRequest{ AppName: a.AppName, UserID: a.UserID, Query: query, }) } ================================================ FILE: internal/memory/memory_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memory_test import ( "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" imemory "google.golang.org/adk/internal/memory" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestMemory_AddAndSearch(t *testing.T) { appName, userID, sessionID := "testApp", "testUser", "sess1" memoryService := imemory.Memory{ Service: memory.InMemoryService(), UserID: userID, AppName: appName, SessionID: sessionID, } content1 := genai.NewContentFromText("The quick brown fox", genai.RoleUser) content2 := genai.NewContentFromText("jumps over the lazy dog", genai.RoleUser) events := []*session.Event{ { Timestamp: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC), Author: "user1", LLMResponse: model.LLMResponse{ Content: content1, }, }, { Timestamp: time.Date(2025, 1, 1, 10, 5, 0, 0, time.UTC), Author: "user1", LLMResponse: model.LLMResponse{ Content: content2, }, }, } sessionService := session.InMemoryService() createResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("Failed to create session: %v", err) } session := createResponse.Session for _, event := range events { if err := sessionService.AppendEvent(t.Context(), session, event); err != nil { t.Fatalf("Failed to append event: %v", err) } } if err := memoryService.AddSessionToMemory(t.Context(), session); err != nil { t.Fatalf("AddSessionToMemory failed: %v", err) } // Expected MemoryEntry items entry1 := memory.Entry{ Content: content1, Author: "user1", Timestamp: time.Date(2025, 1, 1, 10, 0, 0, 0, time.UTC), } entry2 := memory.Entry{ Content: content2, Author: "user1", Timestamp: time.Date(2025, 1, 1, 10, 5, 0, 0, time.UTC), } tests := []struct { name string query string want *memory.SearchResponse }{ { name: "match first entry", query: "fox", want: &memory.SearchResponse{ Memories: []memory.Entry{entry1}, }, }, { name: "match second entry", query: "DOG", // Search should be case-insensitive want: &memory.SearchResponse{ Memories: []memory.Entry{entry2}, }, }, { name: "match both entries (any word)", query: "quick dog", want: &memory.SearchResponse{ Memories: []memory.Entry{entry1, entry2}, }, }, { name: "match word in both", query: "the", want: &memory.SearchResponse{ Memories: []memory.Entry{entry1, entry2}, }, }, { name: "no match", query: "unrelated", want: &memory.SearchResponse{}, }, { name: "empty query", query: "", want: &memory.SearchResponse{}, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { got, err := memoryService.SearchMemory(t.Context(), tc.query) if err != nil { t.Fatalf("SearchMemory(%q) failed: %v", tc.query, err) } if diff := cmp.Diff(tc.want, got, cmpopts.EquateEmpty()); diff != "" { t.Errorf("SearchMemory(%q) returned diff (-want +got):\n%s", tc.query, diff) } }) } } func TestMemory_Search_NoData(t *testing.T) { memory := imemory.Memory{ Service: memory.InMemoryService(), UserID: "testUser", AppName: "testApp", SessionID: "sess2", } got, err := memory.SearchMemory(t.Context(), "any query") if err != nil { t.Fatalf("SearchMemory() failed: %v", err) } if len(got.Memories) != 0 { t.Errorf("SearchMemory() on empty memory returned %d items, want 0", len(got.Memories)) } } func TestMemory_Search_Isolation(t *testing.T) { memService := memory.InMemoryService() appName := "testApp" userID1, sessionID1 := "user1", "sess1" memory1 := imemory.Memory{ Service: memService, UserID: userID1, AppName: appName, SessionID: sessionID1, } content1 := genai.NewContentFromText("Content for user1", genai.RoleUser) sessionService := session.InMemoryService() createResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{ AppName: appName, UserID: userID1, SessionID: sessionID1, }) if err != nil { t.Fatalf("Failed to create session: %v", err) } storedSession := createResponse.Session if err := sessionService.AppendEvent(t.Context(), storedSession, &session.Event{ Timestamp: time.Now(), Author: "user1", LLMResponse: model.LLMResponse{Content: content1}, }); err != nil { t.Fatalf("Failed to append event: %v", err) } if err := memory1.AddSessionToMemory(t.Context(), storedSession); err != nil { t.Fatalf("AddSessionToMemory failed: %v", err) } // Add data for User2 userID2, sessionID2 := "user2", "sess2" memory2 := imemory.Memory{ Service: memService, UserID: userID2, AppName: "testApp", SessionID: sessionID2, } content2 := genai.NewContentFromText("Content for user2", genai.RoleUser) createResponse2, err := sessionService.Create(t.Context(), &session.CreateRequest{ AppName: appName, UserID: userID2, SessionID: sessionID2, }) if err != nil { t.Fatalf("Failed to create session: %v", err) } storedSession2 := createResponse2.Session if err := sessionService.AppendEvent(t.Context(), storedSession2, &session.Event{ Timestamp: time.Now(), Author: "user2", LLMResponse: model.LLMResponse{Content: content2}, }); err != nil { t.Fatalf("Failed to append event: %v", err) } if err := memory2.AddSessionToMemory(t.Context(), storedSession2); err != nil { t.Fatalf("AddSessionToMemory failed: %v", err) } // User1 search should only find user1's content got1, err := memory1.SearchMemory(t.Context(), "Content") if err != nil { t.Fatalf("memory1.SearchMemory failed: %v", err) } if len(got1.Memories) != 1 { t.Errorf("memory1.SearchMemory returned %d items, want 1", len(got1.Memories)) } else if diff := cmp.Diff(content1, got1.Memories[0].Content); diff != "" { t.Errorf("memory1.SearchMemory returned diff (-want +got):\n%s", diff) } // User2 search should only find user2's content got2, err := memory2.SearchMemory(t.Context(), "Content") if err != nil { t.Fatalf("memory2.SearchMemory failed: %v", err) } if len(got2.Memories) != 1 { t.Errorf("memory2.SearchMemory returned %d items, want 1", len(got2.Memories)) } else if diff := cmp.Diff(content2, got2.Memories[0].Content); diff != "" { t.Errorf("memory2.SearchMemory returned diff (-want +got):\n%s", diff) } } ================================================ FILE: internal/plugininternal/plugin_manager.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package plugininternal import ( "context" "fmt" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/plugininternal/plugincontext" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) type PluginConfig struct { Plugins []*plugin.Plugin CloseTimeout time.Duration } // PluginManager manages the registration and execution of plugins. type PluginManager struct { plugins []*plugin.Plugin closeTimeout time.Duration } // NewPluginManager creates a new PluginManager. func NewPluginManager(cfg PluginConfig) (*PluginManager, error) { pm := &PluginManager{ closeTimeout: cfg.CloseTimeout, plugins: make([]*plugin.Plugin, 0, len(cfg.Plugins)), } // Register plugins defined in the config for _, p := range cfg.Plugins { err := pm.registerPlugin(p) if err != nil { return nil, err } } return pm, nil } // RegisterPlugin adds a new plugin to the manager. func (pm *PluginManager) registerPlugin(plugin *plugin.Plugin) error { if plugin == nil { return fmt.Errorf("cannot register nil plugin") } for _, p := range pm.plugins { if p.Name() == plugin.Name() { return fmt.Errorf("plugin with name '%s' already registered", plugin.Name()) } } pm.plugins = append(pm.plugins, plugin) return nil } // RunOnUserMessageCallback runs the OnUserMessageCallback for all plugins. func (pm *PluginManager) RunOnUserMessageCallback(cctx agent.InvocationContext, userMessage *genai.Content) (*genai.Content, error) { for _, plugin := range pm.plugins { callback := plugin.OnUserMessageCallback() if callback != nil { newContent, err := callback(cctx, userMessage) if err != nil { return nil, err } if newContent != nil { return newContent, nil // Early exit } } } return nil, nil } // RunBeforeRunCallback runs the BeforeRunCallback for all plugins. func (pm *PluginManager) RunBeforeRunCallback(cctx agent.InvocationContext) (*genai.Content, error) { for _, plugin := range pm.plugins { callback := plugin.BeforeRunCallback() if callback != nil { newContent, err := callback(cctx) if err != nil { return nil, err } if newContent != nil { return newContent, nil // Early exit } } } return nil, nil } // RunAfterRunCallback runs the AfterRunCallback for all plugins. func (pm *PluginManager) RunAfterRunCallback(cctx agent.InvocationContext) { for _, plugin := range pm.plugins { callback := plugin.AfterRunCallback() if callback != nil { callback(cctx) } } } // RunOnEventCallback runs the OnEventCallback for all plugins. func (pm *PluginManager) RunOnEventCallback(cctx agent.InvocationContext, event *session.Event) (*session.Event, error) { for _, plugin := range pm.plugins { callback := plugin.OnEventCallback() if callback != nil { newEvent, err := callback(cctx, event) if err != nil { return nil, err } if newEvent != nil { return newEvent, nil // Early exit } } } return nil, nil } // RunBeforeAgentCallback runs the BeforeAgentCallback for all plugins. func (pm *PluginManager) RunBeforeAgentCallback(cctx agent.CallbackContext) (*genai.Content, error) { for _, plugin := range pm.plugins { callback := plugin.BeforeAgentCallback() if callback != nil { newContent, err := callback(cctx) if err != nil { return nil, err } if newContent != nil { return newContent, nil // Early exit } } } return nil, nil } // RunAfterAgentCallback runs the AfterAgentCallback for all plugins. func (pm *PluginManager) RunAfterAgentCallback(cctx agent.CallbackContext) (*genai.Content, error) { for _, plugin := range pm.plugins { callback := plugin.AfterAgentCallback() if callback != nil { newContent, err := callback(cctx) if err != nil { return nil, err } if newContent != nil { return newContent, nil // Early exit } } } return nil, nil } // RunBeforeToolCallback runs the BeforeToolCallback for all plugins. func (pm *PluginManager) RunBeforeToolCallback(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { for _, plugin := range pm.plugins { callback := plugin.BeforeToolCallback() if callback != nil { newArgs, err := callback(ctx, tool, args) if err != nil { return nil, err } if newArgs != nil { return newArgs, nil // Early exit } } } return nil, nil } // RunAfterToolCallback runs the AfterToolCallback for all plugins. func (pm *PluginManager) RunAfterToolCallback(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { for _, plugin := range pm.plugins { callback := plugin.AfterToolCallback() if callback != nil { newResult, err := callback(ctx, tool, args, result, err) if err != nil { return nil, err } if newResult != nil { return newResult, nil // Early exit } } } return nil, nil } // RunOnToolErrorCallback runs the OnToolErrorCallback for all plugins. func (pm *PluginManager) RunOnToolErrorCallback(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { for _, plugin := range pm.plugins { callback := plugin.OnToolErrorCallback() if callback != nil { newResult, err := callback(ctx, tool, args, err) if err != nil { return nil, err } if newResult != nil { return newResult, nil // Early exit } } } return nil, nil } // RunBeforeModelCallback runs the BeforeModelCallback for all plugins. func (pm *PluginManager) RunBeforeModelCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { for _, plugin := range pm.plugins { callback := plugin.BeforeModelCallback() if callback != nil { newResponse, err := callback(cctx, llmRequest) if err != nil { return nil, err } if newResponse != nil { return newResponse, nil // Early exit } } } return nil, nil } // RunAfterModelCallback runs the AfterModelCallback for all plugins. func (pm *PluginManager) RunAfterModelCallback(cctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { for _, plugin := range pm.plugins { callback := plugin.AfterModelCallback() if callback != nil { newResponse, err := callback(cctx, llmResponse, llmResponseError) if err != nil { return nil, err } if newResponse != nil { return newResponse, nil // Early exit } } } return nil, nil } // RunOnModelErrorCallback runs the OnModelErrorCallback for all plugins. func (pm *PluginManager) RunOnModelErrorCallback(cctx agent.CallbackContext, llmRequest *model.LLMRequest, llmResponseError error) (*model.LLMResponse, error) { for _, plugin := range pm.plugins { callback := plugin.OnModelErrorCallback() if callback != nil { newResponse, err := callback(cctx, llmRequest, llmResponseError) if err != nil { return nil, err } if newResponse != nil { return newResponse, nil // Early exit } } } return nil, nil } // Close calls the CloseFunc on all registered plugins. func (pm *PluginManager) Close() error { var errors []error for _, plugin := range pm.plugins { if err := plugin.Close(); err != nil { errors = append(errors, fmt.Errorf("error closing plugin '%s': %w", plugin.Name(), err)) } } if len(errors) > 0 { return fmt.Errorf("failed to close plugins: %v", errors) } return nil } func ToContext(ctx context.Context, cfg *PluginManager) context.Context { return context.WithValue(ctx, plugincontext.PluginManagerCtxKey, cfg) } ================================================ FILE: internal/plugininternal/plugincontext/context.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package plugincontext type ctxKey int const PluginManagerCtxKey ctxKey = 0 ================================================ FILE: internal/sessionutils/utils.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package sessionutils import ( "maps" "strings" ) const ( appPrefix = "app:" userPrefix = "user:" tempPrefix = "temp:" ) // ExtractStateDeltas splits a single state delta map into three separate maps // for app, user, and session states based on key prefixes. // Temporary keys (starting with TempStatePrefix) are ignored. func ExtractStateDeltas(delta map[string]any) ( appStateDelta, userStateDelta, sessionStateDelta map[string]any, ) { // Initialize the maps to be returned. appStateDelta = make(map[string]any) userStateDelta = make(map[string]any) sessionStateDelta = make(map[string]any) if delta == nil { return appStateDelta, userStateDelta, sessionStateDelta } for key, value := range delta { if cleanKey, found := strings.CutPrefix(key, appPrefix); found { appStateDelta[cleanKey] = value } else if cleanKey, found := strings.CutPrefix(key, userPrefix); found { userStateDelta[cleanKey] = value } else if !strings.HasPrefix(key, tempPrefix) { // This key belongs to the session state, as long as it's not temporary. sessionStateDelta[key] = value } } return appStateDelta, userStateDelta, sessionStateDelta } // MergeStates combines app, user, and session state maps into a single map // for client-side responses, adding the appropriate prefixes back. func MergeStates(appState, userState, sessionState map[string]any) map[string]any { // Pre-allocate map capacity for efficiency. totalSize := len(appState) + len(userState) + len(sessionState) mergedState := make(map[string]any, totalSize) maps.Copy(mergedState, sessionState) for key, value := range appState { mergedState[appPrefix+key] = value } for key, value := range userState { mergedState[userPrefix+key] = value } return mergedState } ================================================ FILE: internal/style_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package internal_test import ( "flag" "fmt" "os" "path/filepath" "strings" "testing" "time" ) const copyrightHeaderTmpl = `// Copyright %d Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ` const validStartYear = 2025 var fixError = flag.Bool("fix", false, "fix detected problems (e.g. add missing copyright headers)") func TestCopyrightHeader(t *testing.T) { // Start test from the parent directory, root of the module. t.Chdir("..") ignore := map[string]bool{ // Skip directories that are not relevant for copyright checks. // The followings were copied from golang.org/x/tools. "internal/jsonschema": true, "internal/util": true, // The following was copied from golang.org/x/oscar. "internal/httprr": true, // Contains vendored dependencies, not subject to copyright checks. "vendor": true, } _ = filepath.Walk(".", func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { if ignore[path] { return filepath.SkipDir } return nil } if !strings.HasSuffix(path, ".go") { return nil } hasHeader, err := hasCopyrightHeader(path) switch { case err != nil: t.Errorf("failed to check file %q: %v", path, err) case !hasHeader && !*fixError: t.Errorf("file %q does not have the copyright header", path) case !hasHeader && *fixError: t.Logf("updating file %q with copyright header", path) if err := addCopyrightHeader(path); err != nil { t.Errorf("failed to update file %q: %v", path, err) } } return nil }) } func hasCopyrightHeader(path string) (bool, error) { content, err := os.ReadFile(path) if err != nil { return false, err } contentStr := string(content) currentYear := time.Now().UTC().Year() for year := validStartYear; year <= currentYear; year++ { expectedHeader := fmt.Sprintf(copyrightHeaderTmpl, year) if strings.HasPrefix(contentStr, expectedHeader) { return true, nil } } return false, nil } func addCopyrightHeader(path string) error { content, err := os.ReadFile(path) if err != nil { return err } currentYearHeader := fmt.Sprintf(copyrightHeaderTmpl, time.Now().UTC().Year()) newContent := []byte(currentYearHeader) newContent = append(newContent, content...) return os.WriteFile(path, newContent, 0o644) } ================================================ FILE: internal/telemetry/converters.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "fmt" "go.opentelemetry.io/otel/log" ) // toLogValue converts a JSON value to a log.Value. // From [encoding/json.Unmarshal] documentation: // To unmarshal JSON into an interface value, // Unmarshal stores one of these in the interface value: // // - bool, for JSON booleans // - float64, for JSON numbers // - string, for JSON strings // - []any, for JSON arrays // - map[string]any, for JSON objects // - nil for JSON null func toLogValue(v any) log.Value { switch val := v.(type) { case nil: return log.Value{} case string: return log.StringValue(val) case bool: return log.BoolValue(val) case float64: return log.Float64Value(val) case int: return log.IntValue(val) case []any: values := make([]log.Value, 0, len(val)) for _, item := range val { values = append(values, toLogValue(item)) } return log.SliceValue(values...) case map[string]any: kvs := make([]log.KeyValue, 0, len(val)) for k, v := range val { kvs = append(kvs, log.KeyValue{Key: k, Value: toLogValue(v)}) } return log.MapValue(kvs...) default: // Fallback for other types return log.StringValue(fmt.Sprintf("%v", val)) } } // FromLogValue converts a log.Value to golang type. See [toLogValue] for more details. func FromLogValue(v log.Value) any { switch v.Kind() { case log.KindString: return v.AsString() case log.KindInt64: return v.AsInt64() case log.KindFloat64: return v.AsFloat64() case log.KindBool: return v.AsBool() case log.KindBytes: return v.AsBytes() case log.KindMap: m := make(map[string]any) for _, kv := range v.AsMap() { m[kv.Key] = FromLogValue(kv.Value) } return m case log.KindSlice: s := make([]any, 0) for _, v := range v.AsSlice() { s = append(s, FromLogValue(v)) } return s case log.KindEmpty: return nil default: // Try to handle this as gracefully as possible. // // Don't panic here. The goal here is to have developers find this // first if a slog.Kind is is not handled. It is // preferable to have user's open issue asking why their attributes // have a "unhandled: " prefix than say that their code is panicking. return fmt.Sprintf("", v.Kind()) } } ================================================ FILE: internal/telemetry/converters_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "testing" "github.com/google/go-cmp/cmp" ) func TestConvertersRoundTrip(t *testing.T) { tests := []struct { name string val any want any }{ { name: "nil", val: nil, want: nil, }, { name: "string", val: "hello", want: "hello", }, { name: "bool", val: true, want: true, }, { name: "float64", val: 123.456, want: 123.456, }, { name: "int to int64", val: int(123), want: int64(123), }, { name: "slice of mixed types", val: []any{1.0, true, "foo"}, want: []any{1.0, true, "foo"}, }, { name: "map", val: map[string]any{ "foo": "bar", "baz": 123.0, }, want: map[string]any{ "foo": "bar", "baz": 123.0, }, }, { name: "nested structure", val: map[string]any{ "list": []any{ map[string]any{"a": 1.0}, }, }, want: map[string]any{ "list": []any{ map[string]any{"a": 1.0}, }, }, }, { name: "fallback for unsupported type", val: struct{ A int }{A: 1}, want: "{1}", }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { // Convert to log.Value val := toLogValue(tc.val) // Convert back to any got := FromLogValue(val) // Assert that result is the same as the expected want if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("Round trip conversion mismatch (-want +got):\n%s", diff) } }) } } ================================================ FILE: internal/telemetry/logger.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "context" "encoding/json" "strings" "sync/atomic" "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/log/global" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "google.golang.org/genai" "google.golang.org/adk/internal/version" "google.golang.org/adk/model" ) // genAICaptureMessageContent is true if message content should be elided. False by default. var genAICaptureMessageContent atomic.Bool // SetGenAICaptureMessageContent sets whether message content should be elided. func SetGenAICaptureMessageContent(capture bool) { genAICaptureMessageContent.Store(capture) } // getGenAICaptureMessageContent returns whether message content should be elided. func getGenAICaptureMessageContent() bool { return genAICaptureMessageContent.Load() } const elidedContent = "" var otelLogger = global.GetLoggerProvider().Logger( systemName, log.WithSchemaURL(semconv.SchemaURL), log.WithInstrumentationVersion(version.Version), ) // LogRequest logs the request to the model - the system message and user messages. // It iterates over the request contents and logs each as a separate event. // Check [logSystemMessage] and [logUserMessage] for emitted event details. func LogRequest(ctx context.Context, req *model.LLMRequest, backend genai.Backend) { genAISystem := variantToGenAISystem(backend) logSystemMessage(ctx, req, genAISystem) for _, content := range req.Contents { logUserMessage(ctx, content, genAISystem) } } // LogResponse logs the inference result. // Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aichoice. // NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are: // * The spec embeds the "content" field to be under the "message" key, but it's added directly in body. // * The "tool_calls" field is required if available in the spec, but it's omitted. func LogResponse(ctx context.Context, resp *model.LLMResponse, backend genai.Backend) { record := log.Record{} record.SetEventName("gen_ai.choice") var finishReason string var content *genai.Content if resp != nil { finishReason = string(resp.FinishReason) if resp.Content != nil { content = resp.Content } } kvs := []log.KeyValue{ // ADK internal data model only supports single candidate, even though the implementations can return multiple candidates. Hardcoding index to 0. log.Int("index", 0), {Key: "content", Value: contentToLogValue(content)}, } if finishReason != "" { kvs = append(kvs, log.String("finish_reason", finishReason)) } record.SetBody(log.MapValue(kvs...)) genAISystem := variantToGenAISystem(backend) if genAISystem != nil { record.AddAttributes(*genAISystem) } otelLogger.Emit(ctx, record) } // logSystemMessage logs the system message from the request. // Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aisystemmessage. // NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are: // * The spec requires a "role" body field, but it's ommited. func logSystemMessage(ctx context.Context, req *model.LLMRequest, genAISystem *log.KeyValue) { record := log.Record{} record.SetEventName("gen_ai.system.message") record.SetBody(log.MapValue( log.KeyValue{Key: "content", Value: extractSystemMessage(req)}, )) if genAISystem != nil { record.AddAttributes(*genAISystem) } otelLogger.Emit(ctx, record) } // logUserMessage logs the user message from the request. // Semconv reference: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/gen-ai/gen-ai-events.md#event-gen_aiusermessage. // NOTE: The current implementation doesn't fully follow the spec, but aims for consistency with ADK Python. The differences are: // * The spec requires a "role" body field, but it's ommited. If the role is set in [genai.Content], then it will be available in body.content.role. func logUserMessage(ctx context.Context, content *genai.Content, genAISystem *log.KeyValue) { record := log.Record{} record.SetEventName("gen_ai.user.message") record.SetBody(log.MapValue( log.KeyValue{Key: "content", Value: toLogValue(contentToJSONLikeValue(content))}, )) if genAISystem != nil { record.AddAttributes(*genAISystem) } otelLogger.Emit(ctx, record) } // Ref: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/registry/attributes/gen-ai.md#gen-ai-system well-known values. func variantToGenAISystem(variant genai.Backend) *log.KeyValue { if variant == genai.BackendVertexAI { val := log.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI) return &val } if variant == genai.BackendGeminiAPI { val := log.KeyValueFromAttribute(semconv.GenAISystemGCPGemini) return &val } return nil } // extractSystemMessage extracts the system message from the request config and concatenates it into a single string. // If the content is elided, it returns the elided content string. func extractSystemMessage(req *model.LLMRequest) log.Value { if !getGenAICaptureMessageContent() { return log.StringValue(elidedContent) } if req == nil || req.Config == nil || req.Config.SystemInstruction == nil { return log.Value{} } var text []string for _, p := range req.Config.SystemInstruction.Parts { if p.Text != "" { text = append(text, p.Text) } } content := strings.Join(text, "\n") return log.StringValue(content) } func contentToLogValue(c *genai.Content) log.Value { return toLogValue(contentToJSONLikeValue(c)) } // contentToJSONLikeValue converts a genai.Content to a JSON, which is then converted to a log.Value. func contentToJSONLikeValue(c *genai.Content) any { if !getGenAICaptureMessageContent() { return elidedContent } if c == nil { return nil } // Marshall to JSON first to preserve the json key names, omit null fields, etc. b, err := json.Marshal(c) if err != nil { return "" } var m map[string]any if err := json.Unmarshal(b, &m); err != nil { return "" } return m } ================================================ FILE: internal/telemetry/logger_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "context" "strings" "testing" "github.com/google/go-cmp/cmp" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/log" sdklog "go.opentelemetry.io/otel/sdk/log" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "google.golang.org/genai" "google.golang.org/adk/model" ) func TestLogRequest(t *testing.T) { type wantEvent struct { name string body any // can be map[string]any or string (for elided) attrs []log.KeyValue } tests := []struct { name string backend genai.Backend captureMessageContent bool req *model.LLMRequest wantEvents []wantEvent }{ { name: "RequestWithSystemAndUserMessages", captureMessageContent: true, req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Role: "system", Parts: []*genai.Part{ {Text: "System instruction part 1"}, {Text: "System instruction part 2"}, }, }, }, Contents: []*genai.Content{ // Messages from previous turns. { Role: "user", Parts: []*genai.Part{ {Text: "Previous user message part 1"}, {Text: "Previous user message part 2"}, }, }, { Role: "agent", Parts: []*genai.Part{ {Text: "Previous agent message part 1"}, {Text: "Previous agent message part 2"}, }, }, // New message. { Role: "user", Parts: []*genai.Part{ {Text: "User message part 1"}, {Text: "User message part 2"}, }, }, }, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": "System instruction part 1\nSystem instruction part 2", }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": map[string]any{ "role": "user", "parts": []any{ map[string]any{"text": "Previous user message part 1"}, map[string]any{"text": "Previous user message part 2"}, }, }, }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": map[string]any{ "role": "agent", "parts": []any{ map[string]any{"text": "Previous agent message part 1"}, map[string]any{"text": "Previous agent message part 2"}, }, }, }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": map[string]any{ "role": "user", "parts": []any{ map[string]any{"text": "User message part 1"}, map[string]any{"text": "User message part 2"}, }, }, }, }, }, }, { name: "RequestWithNilConfigAndContents", captureMessageContent: true, req: &model.LLMRequest{ Config: nil, Contents: nil, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": nil, }, }, }, }, { name: "RequestWithNilContentsGeminiBackend", captureMessageContent: true, backend: genai.BackendGeminiAPI, req: &model.LLMRequest{ Config: nil, Contents: nil, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": nil, }, attrs: []log.KeyValue{ log.KeyValueFromAttribute(semconv.GenAISystemGCPGemini), }, }, }, }, { name: "RequestWithNilContentsVertexBackend", captureMessageContent: true, backend: genai.BackendVertexAI, req: &model.LLMRequest{ Config: nil, Contents: nil, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": nil, }, attrs: []log.KeyValue{ log.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI), }, }, }, }, { name: "RequestWithEmptyConfigAndUserContentWithoutParts", captureMessageContent: true, req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ // Config without system instruction. }, Contents: []*genai.Content{ // Content without parts. {Role: "user"}, }, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": nil, }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": map[string]any{ "role": "user", }, }, }, }, }, { name: "ElidedRequest", captureMessageContent: false, req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Role: "system", Parts: []*genai.Part{ {Text: "System instruction"}, }, }, }, Contents: []*genai.Content{ {Role: "user", Parts: []*genai.Part{{Text: "Hello"}}}, }, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": "", }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": "", }, }, }, }, { name: "ElidedRequestWithNilConfigAndContents", captureMessageContent: false, req: &model.LLMRequest{ Config: nil, Contents: nil, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": "", }, }, }, }, { name: "ElidedRequestWithEmptyConfigAndUserContentWithoutParts", captureMessageContent: false, req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ // Config without system instruction. }, Contents: []*genai.Content{ // Content without parts. {Role: "user"}, }, }, wantEvents: []wantEvent{ { name: "gen_ai.system.message", body: map[string]any{ "content": "", }, }, { name: "gen_ai.user.message", body: map[string]any{ "content": "", }, }, }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { ctx := t.Context() exporter := setup(t, tc.captureMessageContent) LogRequest(ctx, tc.req, tc.backend) if len(exporter.records) != len(tc.wantEvents) { var records strings.Builder for _, r := range exporter.records { records.WriteString(r.EventName()) records.WriteString("\n") } t.Fatalf("expected %d records, got %d, got events:\n%s", len(tc.wantEvents), len(exporter.records), records.String()) } for i, want := range tc.wantEvents { gotRecord := exporter.records[i] if gotRecord.EventName() != want.name { t.Errorf("record[%d]: expected event %q, got %q", i, want.name, gotRecord.EventName()) } gotBody := toGoValue(gotRecord.Body()) if diff := cmp.Diff(want.body, gotBody); diff != "" { t.Errorf("record[%d] body mismatch (-want +got):\n%s", i, diff) } var gotAttrs []log.KeyValue gotRecord.WalkAttributes(func(kv log.KeyValue) bool { gotAttrs = append(gotAttrs, kv) return true }) if diff := cmp.Diff(want.attrs, gotAttrs); diff != "" { t.Errorf("record[%d] attributes mismatch (-want +got):\n%s", i, diff) } } }) } } func TestLogResponse(t *testing.T) { tests := []struct { name string resp *model.LLMResponse backend genai.Backend captureMessageContent bool wantName string wantBody map[string]any wantAttrs []log.KeyValue }{ { name: "Response", captureMessageContent: true, resp: &model.LLMResponse{ FinishReason: genai.FinishReasonStop, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {Text: "Text part 1"}, {Text: "Text part 2"}, }, }, }, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "finish_reason": "STOP", "content": map[string]any{ "role": "model", "parts": []any{ map[string]any{"text": "Text part 1"}, map[string]any{"text": "Text part 2"}, }, }, }, }, { name: "ResponseGeminiBackend", captureMessageContent: true, backend: genai.BackendGeminiAPI, resp: &model.LLMResponse{ FinishReason: genai.FinishReasonStop, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {Text: "Text"}, }, }, }, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "finish_reason": "STOP", "content": map[string]any{ "role": "model", "parts": []any{ map[string]any{"text": "Text"}, }, }, }, wantAttrs: []log.KeyValue{ log.KeyValueFromAttribute(semconv.GenAISystemGCPGemini), }, }, { name: "ResponseVertexBackend", captureMessageContent: true, backend: genai.BackendVertexAI, resp: &model.LLMResponse{ FinishReason: genai.FinishReasonStop, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {Text: "Text part 1"}, {Text: "Text part 2"}, }, }, }, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "finish_reason": "STOP", "content": map[string]any{ "role": "model", "parts": []any{ map[string]any{"text": "Text part 1"}, map[string]any{"text": "Text part 2"}, }, }, }, wantAttrs: []log.KeyValue{ log.KeyValueFromAttribute(semconv.GenAISystemGCPVertexAI), }, }, { name: "ResponseWithFunctionCall", captureMessageContent: true, resp: &model.LLMResponse{ FinishReason: genai.FinishReasonStop, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {Thought: true, Text: "Call tools"}, {FunctionCall: &genai.FunctionCall{Name: "myTool1", ID: "id1", Args: map[string]any{"arg1": "val1"}}}, {FunctionCall: &genai.FunctionCall{Name: "myTool2", ID: "id2", Args: map[string]any{"arg2": "val2"}}}, }, }, }, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "finish_reason": "STOP", "content": map[string]any{ "role": "model", "parts": []any{ map[string]any{ "text": "Call tools", "thought": true, }, map[string]any{"functionCall": map[string]any{ "name": "myTool1", "id": "id1", "args": map[string]any{"arg1": "val1"}, }}, map[string]any{"functionCall": map[string]any{ "name": "myTool2", "id": "id2", "args": map[string]any{"arg2": "val2"}, }}, }, }, }, }, { name: "NilResponse", captureMessageContent: true, resp: nil, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "content": nil, }, }, { name: "ElidedResponse", captureMessageContent: false, resp: &model.LLMResponse{ FinishReason: genai.FinishReasonStop, Content: &genai.Content{ Role: "model", Parts: []*genai.Part{ {Text: "Response part 1"}, {Text: "Response part 2"}, }, }, }, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "finish_reason": "STOP", "content": "", }, }, { name: "ElidedNilResponse", captureMessageContent: false, resp: nil, wantName: "gen_ai.choice", wantBody: map[string]any{ "index": int64(0), "content": "", }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { exporter := setup(t, tc.captureMessageContent) LogResponse(t.Context(), tc.resp, tc.backend) if len(exporter.records) != 1 { var records strings.Builder for _, r := range exporter.records { records.WriteString(r.EventName()) records.WriteString("\n") } t.Fatalf("expected 1 record, got %d, got events:\n%s", len(exporter.records), records.String()) } record := exporter.records[0] if record.EventName() != tc.wantName { t.Errorf("expected event %q, got %q", tc.wantName, record.EventName()) } got := toGoValue(record.Body()) if diff := cmp.Diff(tc.wantBody, got); diff != "" { t.Errorf("Body mismatch (-want +got):\n%s", diff) } var gotAttrs []log.KeyValue record.WalkAttributes(func(kv log.KeyValue) bool { gotAttrs = append(gotAttrs, kv) return true }) if diff := cmp.Diff(tc.wantAttrs, gotAttrs); diff != "" { t.Errorf("attributes mismatch (-want +got):\n%s", diff) } }) } } func TestSpanIDPropagation(t *testing.T) { ctx, span := otel.Tracer("test").Start(context.Background(), "test") defer span.End() exporter := setup(t, false) req := &model.LLMRequest{ Config: &genai.GenerateContentConfig{ SystemInstruction: &genai.Content{ Role: "system", Parts: []*genai.Part{ {Text: "You are a helpful assistant."}, }, }, }, Contents: []*genai.Content{ { Role: "user", Parts: []*genai.Part{ {Text: "Hello"}, }, }, }, } LogRequest(ctx, req, genai.BackendVertexAI) LogResponse(ctx, &model.LLMResponse{}, genai.BackendVertexAI) if len(exporter.records) != 3 { t.Fatalf("expected 3 records, got %d", len(exporter.records)) } wantSpanID := span.SpanContext().SpanID() for _, record := range exporter.records { if got := record.SpanID(); got != wantSpanID { t.Errorf("expected span ID %q, got %q", wantSpanID, got) } } } func setup(t *testing.T, elided bool) *inMemoryExporter { exporter := &inMemoryExporter{} provider := sdklog.NewLoggerProvider( sdklog.WithProcessor(sdklog.NewSimpleProcessor(exporter)), ) originalLogger := otelLogger otelLogger = provider.Logger("test") t.Cleanup(func() { otelLogger = originalLogger }) original := getGenAICaptureMessageContent() SetGenAICaptureMessageContent(elided) t.Cleanup(func() { SetGenAICaptureMessageContent(original) }) return exporter } type inMemoryExporter struct { records []sdklog.Record } func (e *inMemoryExporter) Export(ctx context.Context, records []sdklog.Record) error { e.records = append(e.records, records...) return nil } func (e *inMemoryExporter) Shutdown(ctx context.Context) error { return nil } func (e *inMemoryExporter) ForceFlush(ctx context.Context) error { return nil } // toGoValue converts a log.Value to a Go value for easier testing. // log.Value is not comparable by design, so we need to transform it to another form. func toGoValue(v log.Value) any { switch v.Kind() { case log.KindBool: return v.AsBool() case log.KindFloat64: return v.AsFloat64() case log.KindInt64: return v.AsInt64() case log.KindString: return v.AsString() case log.KindBytes: return v.AsBytes() case log.KindSlice: var s []any for _, v := range v.AsSlice() { s = append(s, toGoValue(v)) } return s case log.KindMap: m := make(map[string]any) for _, kv := range v.AsMap() { m[kv.Key] = toGoValue(kv.Value) } return m default: return nil } } ================================================ FILE: internal/telemetry/telemetry.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package telemetry implements telemetry for ADK. // // WARNING: telemetry provided by ADK (internal/telemetry package) may change (e.g. attributes and their names) // because we're in process to standardize and unify telemetry across all ADKs. package telemetry import ( "context" "encoding/json" "fmt" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "google.golang.org/adk/internal/version" "google.golang.org/adk/model" "google.golang.org/adk/session" ) const ( systemName = "gcp.vertex.agent" executeToolName = "execute_tool" mergeToolName = "(merged tools)" ) var ( gcpVertexAgentToolCallArgsName = attribute.Key("gcp.vertex.agent.tool_call_args") gcpVertexAgentEventID = attribute.Key("gcp.vertex.agent.event_id") gcpVertexAgentToolResponseName = attribute.Key("gcp.vertex.agent.tool_response") gcpVertexAgentInvocationID = attribute.Key("gcp.vertex.agent.invocation_id") ) // tracer is the tracer instance for ADK go. var tracer trace.Tracer = otel.GetTracerProvider().Tracer( systemName, trace.WithInstrumentationVersion(version.Version), trace.WithSchemaURL(semconv.SchemaURL), ) type agent interface { Name() string Description() string } // StartInvokeAgentSpan starts a new semconv invoke_agent span. // It returns a new context with the span and the span itself. func StartInvokeAgentSpan(ctx context.Context, agent agent, sessionID, invocationID string) (context.Context, trace.Span) { agentName := agent.Name() spanCtx, span := tracer.Start(ctx, fmt.Sprintf("invoke_agent %s", agentName), trace.WithAttributes( gcpVertexAgentInvocationID.String(invocationID), // used by adk-web semconv.GenAIOperationNameInvokeAgent, semconv.GenAIAgentDescription(agent.Description()), semconv.GenAIAgentName(agentName), semconv.GenAIConversationID(sessionID), )) return spanCtx, span } type TraceAgentResultParams struct { ResponseEvent *session.Event Error error } // TraceAgentResult records the result of the agent invocation, including status and error. func TraceAgentResult(span trace.Span, params TraceAgentResultParams) { recordErrorAndStatus(span, params.Error) } // StartGenerateContentSpanParams contains parameters for [StartGenerateContentSpan]. type StartGenerateContentSpanParams struct { // ModelName is the name of the model being used for generation. ModelName string // InvocationID is the ID of the invocation. InvocationID string } // StartGenerateContentSpan starts a new semconv generate_content span. func StartGenerateContentSpan(ctx context.Context, params StartGenerateContentSpanParams) (context.Context, trace.Span) { modelName := params.ModelName spanCtx, span := tracer.Start(ctx, fmt.Sprintf("generate_content %s", modelName), trace.WithAttributes( // Used by adk-web, can be removed once it reads the invocation id from invoke_agent span. gcpVertexAgentInvocationID.String(params.InvocationID), semconv.GenAIOperationNameGenerateContent, semconv.GenAIRequestModel(modelName), )) return spanCtx, span } type TraceGenerateContentResultParams struct { Response *model.LLMResponse EventID string Error error } // TraceGenerateContentResult records the result of the generate_content operation, including token usage and finish reason. func TraceGenerateContentResult(span trace.Span, params TraceGenerateContentResultParams) { recordErrorAndStatus(span, params.Error) if params.Response == nil { return } span.SetAttributes( gcpVertexAgentEventID.String(params.EventID), semconv.GenAIResponseFinishReasons(string(params.Response.FinishReason)), ) if params.Response.UsageMetadata != nil { span.SetAttributes( semconv.GenAIUsageInputTokens(int(params.Response.UsageMetadata.PromptTokenCount)), semconv.GenAIUsageOutputTokens(int(params.Response.UsageMetadata.CandidatesTokenCount)), ) } } // StartExecuteToolSpanParams contains parameters for [StartExecuteToolSpan]. type StartExecuteToolSpanParams struct { // ToolName is the name of the tool being executed. ToolName string // Args is the arguments of the tool call. Args map[string]any } // StartExecuteToolSpan starts a new semconv execute_tool span. func StartExecuteToolSpan(ctx context.Context, params StartExecuteToolSpanParams) (context.Context, trace.Span) { toolName := params.ToolName spanCtx, span := tracer.Start(ctx, fmt.Sprintf("execute_tool %s", toolName), trace.WithAttributes( semconv.GenAIOperationNameExecuteTool, semconv.GenAIToolName(toolName), gcpVertexAgentToolCallArgsName.String(safeSerialize(params.Args)))) return spanCtx, span } type TraceToolResultParams struct { // ToolDescription is a brief description of the tool's purpose. Description string ResponseEvent *session.Event Error error } // TraceToolResult records the tool execution events. func TraceToolResult(span trace.Span, params TraceToolResultParams) { recordErrorAndStatus(span, params.Error) attributes := []attribute.KeyValue{ semconv.GenAIOperationNameKey.String(executeToolName), semconv.GenAIToolDescriptionKey.String(params.Description), } toolCallID := "" toolResponse := "" if params.ResponseEvent != nil { attributes = append(attributes, gcpVertexAgentEventID.String(params.ResponseEvent.ID)) if params.ResponseEvent.LLMResponse.Content != nil { responseParts := params.ResponseEvent.LLMResponse.Content.Parts if len(responseParts) > 0 { functionResponse := responseParts[0].FunctionResponse if functionResponse != nil { if functionResponse.ID != "" { toolCallID = functionResponse.ID } if functionResponse.Response != nil { toolResponse = safeSerialize(functionResponse.Response) } } } } } attributes = append(attributes, semconv.GenAIToolCallIDKey.String(toolCallID)) attributes = append(attributes, gcpVertexAgentToolResponseName.String(toolResponse)) span.SetAttributes(attributes...) } func recordErrorAndStatus(span trace.Span, err error) { if err == nil { return } span.RecordError(err) span.SetStatus(codes.Error, err.Error()) } // WrapYield wraps a yield function to add tracing of values returned by iterators. Read [iter.Seq2] for more information about yield. // Limitations: // * if yield is called multiple times, then the span will be finalized with the values from the last call. // // Parameters: // // span: The OpenTelemetry span to be managed. // yield: The original yield function `func(T, error) bool`. // finalizeSpan: A function `func(trace.Span, T, error)` called just before the span is ended to record final attributes. // // Returns: // // wrapped: A wrapped yield function with the same signature as the original. // endSpan: A function to be called via `defer` to ensure the span is finalized with capture data and ended. func WrapYield[T any](span trace.Span, yield func(T, error) bool, finalizeSpan func(trace.Span, T, error)) (wrapped func(T, error) bool, endSpan func()) { var val T var err error wrapped = func(v T, e error) bool { val = v err = e return yield(v, e) } endSpan = func() { finalizeSpan(span, val, err) span.End() } return wrapped, endSpan } // StartTrace starts a new span with the given name. func StartTrace(ctx context.Context, traceName string) (context.Context, trace.Span) { return tracer.Start(ctx, traceName) } // TraceMergedToolCallsResult records the result of the merged tool calls, including status and tool execution events. func TraceMergedToolCallsResult(span trace.Span, fnResponseEvent *session.Event, err error) { recordErrorAndStatus(span, err) attributes := []attribute.KeyValue{ semconv.GenAIOperationNameKey.String(executeToolName), semconv.GenAIToolNameKey.String(mergeToolName), semconv.GenAIToolDescriptionKey.String(mergeToolName), gcpVertexAgentToolCallArgsName.String("N/A"), gcpVertexAgentToolResponseName.String(safeSerialize(fnResponseEvent)), } if fnResponseEvent != nil { attributes = append(attributes, gcpVertexAgentEventID.String(fnResponseEvent.ID)) } span.SetAttributes(attributes...) } func safeSerialize(obj any) string { dump, err := json.Marshal(obj) if err != nil { return "" } return string(dump) } ================================================ FILE: internal/telemetry/telemetry_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "context" "errors" "fmt" "testing" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestWrapYield(t *testing.T) { t.Parallel() var finalized bool finalizeFn := func(span trace.Span, val string, err error) { if val != "test" { t.Errorf("unexpected value in finalizeFn: got %q, want %q", val, "test") } if !errors.Is(err, errTest) { t.Errorf("unexpected error in finalizeFn: got %v, want %v", err, errTest) } finalized = true } yieldFn := func(val string, err error) bool { if val != "test" { t.Errorf("unexpected value in yieldFn: got %q, want %q", val, "test") } if !errors.Is(err, errTest) { t.Errorf("unexpected error in yieldFn: got %v, want %v", err, errTest) } return true } _, span := noop.NewTracerProvider().Tracer("test").Start(context.Background(), "test") wrappedYield, endSpan := WrapYield(span, yieldFn, finalizeFn) if !wrappedYield("test", errTest) { t.Error("wrappedYield should have returned true") } endSpan() if !finalized { t.Error("finalizeFn was not called") } } func TestWrapYield_MultipleCalls(t *testing.T) { t.Parallel() var finalized bool finalizeFn := func(span trace.Span, val string, err error) { if val != "last" { t.Errorf("unexpected value in finalizeFn: got %q, want %q", val, "last") } if !errors.Is(err, errTest) { t.Errorf("unexpected error in finalizeFn: got %v, want %v", err, errTest) } finalized = true } yieldFn := func(val string, err error) bool { return true } _, span := noop.NewTracerProvider().Tracer("test").Start(context.Background(), "test") wrappedYield, endSpan := WrapYield(span, yieldFn, finalizeFn) wrappedYield("first", nil) wrappedYield("", fmt.Errorf("some error")) wrappedYield("last", errTest) endSpan() if !finalized { t.Error("finalizeFn was not called") } } var errTest = errors.New("test error") type mockAgent struct{} func (a *mockAgent) Name() string { return "test-agent" } func (a *mockAgent) Description() string { return "test-agent-description" } func TestInvokeAgent(t *testing.T) { sessionID := "test-session" invocationID := "test-invocation-id" agent := &mockAgent{} tests := []struct { name string resultParams TraceAgentResultParams wantName string wantStatus codes.Code wantAttrs map[attribute.Key]string }{ { name: "Success", resultParams: TraceAgentResultParams{ ResponseEvent: session.NewEvent("test-invocation-id"), }, wantName: "invoke_agent test-agent", wantStatus: codes.Unset, wantAttrs: map[attribute.Key]string{ semconv.GenAIOperationNameKey: "invoke_agent", semconv.GenAIAgentNameKey: "test-agent", semconv.GenAIAgentDescriptionKey: "test-agent-description", semconv.GenAIConversationIDKey: "test-session", gcpVertexAgentInvocationID: invocationID, }, }, { name: "Error", resultParams: TraceAgentResultParams{ Error: errTest, }, wantName: "invoke_agent test-agent", wantStatus: codes.Error, wantAttrs: map[attribute.Key]string{ semconv.GenAIOperationNameKey: "invoke_agent", semconv.GenAIAgentNameKey: "test-agent", semconv.GenAIAgentDescriptionKey: "test-agent-description", semconv.GenAIConversationIDKey: "test-session", gcpVertexAgentInvocationID: invocationID, }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { exporter := setupTestTracer(t) ctx := t.Context() _, span := StartInvokeAgentSpan(ctx, agent, sessionID, invocationID) TraceAgentResult(span, tc.resultParams) span.End() spans := exporter.GetSpans() if len(spans) != 1 { t.Fatalf("expected 1 span, got %d", len(spans)) } gotSpan := spans[0] if gotSpan.Name != tc.wantName { t.Errorf("expected span name %q, got %q", tc.wantName, gotSpan.Name) } if gotSpan.Status.Code != tc.wantStatus { t.Errorf("expected status %v, got %v", tc.wantStatus, gotSpan.Status.Code) } if tc.resultParams.Error != nil { if gotSpan.Status.Description != tc.resultParams.Error.Error() { t.Errorf("expected status description %q, got %q", tc.resultParams.Error.Error(), gotSpan.Status.Description) } } if tc.wantAttrs != nil { gotAttrs := attributesToMap(gotSpan.Attributes) for k, v := range tc.wantAttrs { if gotAttrs[k] != v { t.Errorf("attribute %q: got %q, want %q", k, gotAttrs[k], v) } } } }) } } func TestGenerateContent(t *testing.T) { invocationID := "test-invocation-id" tests := []struct { name string startParams StartGenerateContentSpanParams resultParams TraceGenerateContentResultParams wantName string wantStatus codes.Code wantAttrs map[attribute.Key]string }{ { name: "Success", startParams: StartGenerateContentSpanParams{ ModelName: "test-model", InvocationID: invocationID, }, resultParams: TraceGenerateContentResultParams{ Response: &model.LLMResponse{ UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 10, CandidatesTokenCount: 20, }, FinishReason: genai.FinishReasonStop, }, }, wantName: "generate_content test-model", wantStatus: codes.Unset, wantAttrs: map[attribute.Key]string{ semconv.GenAIOperationNameKey: "generate_content", semconv.GenAIRequestModelKey: "test-model", semconv.GenAIUsageInputTokensKey: "10", semconv.GenAIUsageOutputTokensKey: "20", semconv.GenAIResponseFinishReasonsKey: "[\"STOP\"]", gcpVertexAgentInvocationID: invocationID, }, }, { name: "Error", startParams: StartGenerateContentSpanParams{ ModelName: "test-model", InvocationID: invocationID, }, resultParams: TraceGenerateContentResultParams{ Error: errTest, }, wantName: "generate_content test-model", wantStatus: codes.Error, wantAttrs: map[attribute.Key]string{ semconv.GenAIOperationNameKey: "generate_content", semconv.GenAIRequestModelKey: "test-model", gcpVertexAgentInvocationID: invocationID, }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { exporter := setupTestTracer(t) ctx := t.Context() _, span := StartGenerateContentSpan(ctx, tc.startParams) TraceGenerateContentResult(span, tc.resultParams) span.End() spans := exporter.GetSpans() if len(spans) != 1 { t.Fatalf("expected 1 span, got %d", len(spans)) } gotSpan := spans[0] if gotSpan.Name != tc.wantName { t.Errorf("expected span name %q, got %q", tc.wantName, gotSpan.Name) } if gotSpan.Status.Code != tc.wantStatus { t.Errorf("expected status %v, got %v", tc.wantStatus, gotSpan.Status.Code) } if tc.resultParams.Error != nil { if gotSpan.Status.Description != tc.resultParams.Error.Error() { t.Errorf("expected status description %q, got %q", tc.resultParams.Error.Error(), gotSpan.Status.Description) } } if tc.wantAttrs != nil { gotAttrs := attributesToMap(gotSpan.Attributes) for k, v := range tc.wantAttrs { if gotAttrs[k] != v { t.Errorf("attribute %q: got %q, want %q", k, gotAttrs[k], v) } } } }) } } func TestExecuteTool(t *testing.T) { tests := []struct { name string startParams StartExecuteToolSpanParams resultParams TraceToolResultParams wantName string wantStatus codes.Code wantAttrs map[attribute.Key]string }{ { name: "Success", startParams: StartExecuteToolSpanParams{ ToolName: "test-tool", Args: map[string]any{"arg": "val"}, }, resultParams: TraceToolResultParams{ Description: "tool-description", ResponseEvent: &session.Event{ID: "test-event"}, }, wantName: "execute_tool test-tool", wantStatus: codes.Unset, wantAttrs: map[attribute.Key]string{ semconv.GenAIOperationNameKey: "execute_tool", semconv.GenAIToolNameKey: "test-tool", semconv.GenAIToolDescriptionKey: "tool-description", }, }, { name: "Error", startParams: StartExecuteToolSpanParams{ ToolName: "test-tool", }, resultParams: TraceToolResultParams{ Description: "tool-description", Error: errTest, }, wantName: "execute_tool test-tool", wantStatus: codes.Error, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { exporter := setupTestTracer(t) ctx := t.Context() _, span := StartExecuteToolSpan(ctx, tc.startParams) TraceToolResult(span, tc.resultParams) span.End() spans := exporter.GetSpans() if len(spans) != 1 { t.Fatalf("expected 1 span, got %d", len(spans)) } gotSpan := spans[0] if gotSpan.Name != tc.wantName { t.Errorf("expected span name %q, got %q", tc.wantName, gotSpan.Name) } if gotSpan.Status.Code != tc.wantStatus { t.Errorf("expected status %v, got %v", tc.wantStatus, gotSpan.Status.Code) } if tc.resultParams.Error != nil { if gotSpan.Status.Description != tc.resultParams.Error.Error() { t.Errorf("expected status description %q, got %q", tc.resultParams.Error.Error(), gotSpan.Status.Description) } } if tc.wantAttrs != nil { gotAttrs := attributesToMap(gotSpan.Attributes) for k, v := range tc.wantAttrs { if gotAttrs[k] != v { t.Errorf("attribute %q: got %q, want %q", k, gotAttrs[k], v) } } } }) } } func setupTestTracer(t *testing.T) *tracetest.InMemoryExporter { t.Helper() exporter := tracetest.NewInMemoryExporter() tp := sdktrace.NewTracerProvider( sdktrace.WithSyncer(exporter), ) originalTracer := tracer tracer = tp.Tracer("test") t.Cleanup(func() { tracer = originalTracer }) return exporter } func attributesToMap(attrs []attribute.KeyValue) map[attribute.Key]string { m := make(map[attribute.Key]string, len(attrs)) for _, attr := range attrs { m[attr.Key] = attr.Value.Emit() } return m } ================================================ FILE: internal/testutil/genai.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package testutil import ( "bytes" "encoding/json" "fmt" "net/http" "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/internal/httprr" ) // NewGeminiTransport returns the genai.ClientConfig configured for record and replay. func NewGeminiTransport(rrfile string) (http.RoundTripper, error) { rr, err := httprr.Open(rrfile, http.DefaultTransport) if err != nil { return nil, fmt.Errorf("httprr.Open(%q) failed: %w", rrfile, err) } rr.ScrubReq(scrubGeminiRequest) return rr, nil } func scrubGeminiRequest(req *http.Request) error { delete(req.Header, "x-goog-api-key") // genai does not canonicalize req.Header.Del("X-Goog-Api-Key") // in case it starts delete(req.Header, "x-goog-api-client") // contains version numbers req.Header.Del("X-Goog-Api-Client") delete(req.Header, "user-agent") // contains google-genai-sdk and gl-go version numbers req.Header.Del("User-Agent") if ctype := req.Header.Get("Content-Type"); ctype == "application/json" || strings.HasPrefix(ctype, "application/json;") { // Canonicalize JSON body. // google.golang.org/protobuf/internal/encoding.json // goes out of its way to randomize the JSON encodings // of protobuf messages by adding or not adding spaces // after commas. Derandomize by compacting the JSON. b := req.Body.(*httprr.Body) var buf bytes.Buffer if err := json.Compact(&buf, b.Data); err == nil { b.Data = buf.Bytes() } } return nil } // NewGeminiTestClientConfig returns the genai.ClientConfig configured for record and replay. func NewGeminiTestClientConfig(t *testing.T, rrfile string) *genai.ClientConfig { t.Helper() rr, err := NewGeminiTransport(rrfile) if err != nil { t.Fatal(err) } apiKey := "" if recording, _ := httprr.Recording(rrfile); !recording { apiKey = "fakekey" } return &genai.ClientConfig{ HTTPClient: &http.Client{Transport: rr}, APIKey: apiKey, } } ================================================ FILE: internal/testutil/test_agent_runner.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package testutil import ( "context" "errors" "fmt" "iter" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) type TestAgentRunner struct { agent agent.Agent sessionService session.Service lastSession session.Session initSessionState map[string]any appName string // TODO: move runner definition to the adk package and it's a part of public api, but the logic to the internal runner runner *runner.Runner } func (r *TestAgentRunner) session(t *testing.T, appName, userID, sessionID string) (session.Session, error) { ctx := t.Context() if last := r.lastSession; last != nil && last.ID() == sessionID { resp, err := r.sessionService.Get(ctx, &session.GetRequest{ AppName: "test_app", UserID: "test_user", SessionID: sessionID, }) r.lastSession = resp.Session return resp.Session, err } resp, err := r.sessionService.Create(ctx, &session.CreateRequest{ AppName: "test_app", UserID: "test_user", SessionID: sessionID, State: r.initSessionState, }) r.lastSession = resp.Session return resp.Session, err } func (r *TestAgentRunner) SetInitSessionState(state map[string]any) { r.initSessionState = state } func (r *TestAgentRunner) Run(t *testing.T, sessionID, newMessage string) iter.Seq2[*session.Event, error] { t.Helper() var content *genai.Content if newMessage != "" { content = genai.NewContentFromText(newMessage, genai.RoleUser) } return r.RunContent(t, sessionID, content) } func (r *TestAgentRunner) RunContent(t *testing.T, sessionID string, content *genai.Content) iter.Seq2[*session.Event, error] { t.Helper() return r.RunContentWithConfig(t, sessionID, content, agent.RunConfig{}) } func (r *TestAgentRunner) RunContentWithConfig(t *testing.T, sessionID string, content *genai.Content, cfg agent.RunConfig) iter.Seq2[*session.Event, error] { t.Helper() ctx := t.Context() userID := "test_user" session, err := r.session(t, r.appName, userID, sessionID) if err != nil { t.Fatalf("failed to get/create session: %v", err) } return r.runner.Run(ctx, userID, session.ID(), content, cfg) } // NewTestAgentRunner creates a new TestAgentRunner for the given agent as root // initSessionState will be used to init all sessions created by this runner. func NewTestAgentRunner(t *testing.T, agent agent.Agent) *TestAgentRunner { appName := "test_app" sessionService := session.InMemoryService() runner, err := runner.New(runner.Config{ AppName: appName, Agent: agent, SessionService: sessionService, }) if err != nil { t.Fatal(err) } return &TestAgentRunner{ agent: agent, sessionService: sessionService, appName: appName, runner: runner, } } // NewTestAgentRunner creates a new TestAgentRunner for the given agent as root // initSessionState will be used to init all sessions created by this runner. func NewTestAgentRunnerWithPluginManager(t *testing.T, agent agent.Agent, pluginConfig runner.PluginConfig) *TestAgentRunner { appName := "test_app" sessionService := session.InMemoryService() runner, err := runner.New(runner.Config{ AppName: appName, Agent: agent, SessionService: sessionService, PluginConfig: pluginConfig, }) if err != nil { t.Fatal(err) } return &TestAgentRunner{ agent: agent, sessionService: sessionService, appName: appName, runner: runner, } } type MockModel struct { Requests []*model.LLMRequest Responses []*genai.Content StreamResponsesCount int } var errNoModelData = errors.New("no data") func (m *MockModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { if stream { return m.GenerateStream(ctx, req) } return func(yield func(*model.LLMResponse, error) bool) { resp, err := m.Generate(ctx, req) yield(resp, err) } } // GenerateContent implements llm.Model. func (m *MockModel) Generate(ctx context.Context, req *model.LLMRequest) (*model.LLMResponse, error) { m.Requests = append(m.Requests, req) if len(m.Responses) == 0 { return nil, errNoModelData } resp := &model.LLMResponse{ Content: m.Responses[0], } m.Responses = m.Responses[1:] return resp, nil } func (m *MockModel) GenerateStream(ctx context.Context, req *model.LLMRequest) iter.Seq2[*model.LLMResponse, error] { aggregator := llminternal.NewStreamingResponseAggregator() return func(yield func(*model.LLMResponse, error) bool) { streamResponsesCount := m.StreamResponsesCount if streamResponsesCount == 0 { streamResponsesCount = 1 } for i := 0; i < streamResponsesCount; i++ { if len(m.Responses) == 0 { break } resp := &genai.GenerateContentResponse{Candidates: []*genai.Candidate{{Content: m.Responses[0], FinishReason: genai.FinishReasonStop}}} m.Responses = m.Responses[1:] for llmResponse, err := range aggregator.ProcessResponse(ctx, resp) { if !yield(llmResponse, err) { return // Consumer stopped } } } if closeResult := aggregator.Close(); closeResult != nil { yield(closeResult, nil) } } } // Name implements llm.Model. func (m *MockModel) Name() string { return "mock" } var _ model.LLM = (*MockModel)(nil) // CollectEvents collects all event from the llm response until encountering an error. // It returns all collected events and the last error. func CollectEvents(stream iter.Seq2[*session.Event, error]) ([]*session.Event, error) { var events []*session.Event for ev, err := range stream { if err != nil { return events, err } if ev == nil || ev.LLMResponse.Content == nil { return events, fmt.Errorf("unexpected empty event: %v", ev) } events = append(events, ev) } return events, nil } // CollectParts collects all parts from the llm response until encountering an error. // It returns all collected parts and the last error. func CollectParts(stream iter.Seq2[*session.Event, error]) ([]*genai.Part, error) { var parts []*genai.Part for ev, err := range stream { if err != nil { return parts, err } if ev == nil || ev.LLMResponse.Content == nil { return parts, fmt.Errorf("unexpected empty event: %v", ev) } parts = append(parts, ev.LLMResponse.Content.Parts...) } return parts, nil } // CollectTextParts collects all text parts from the llm response until encountering an error. // It returns all collected text parts and the last error. func CollectTextParts(stream iter.Seq2[*session.Event, error]) ([]string, error) { var texts []string for ev, err := range stream { if err != nil { return texts, err } if ev == nil || ev.LLMResponse.Content == nil { return texts, fmt.Errorf("unexpected empty event: %v", ev) } for _, p := range ev.LLMResponse.Content.Parts { if p.Text != "" { texts = append(texts, p.Text) } } } return texts, nil } ================================================ FILE: internal/toolinternal/context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package toolinternal import ( "context" "fmt" "github.com/google/uuid" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" contextinternal "google.golang.org/adk/internal/context" "google.golang.org/adk/memory" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/toolconfirmation" ) type internalArtifacts struct { agent.Artifacts eventActions *session.EventActions } func (ia *internalArtifacts) Save(ctx context.Context, name string, data *genai.Part) (*artifact.SaveResponse, error) { resp, err := ia.Artifacts.Save(ctx, name, data) if err != nil { return resp, err } if ia.eventActions != nil { if ia.eventActions.ArtifactDelta == nil { ia.eventActions.ArtifactDelta = make(map[string]int64) } // TODO: RWLock, check the version stored is newer in case multiple tools save the same file. ia.eventActions.ArtifactDelta[name] = resp.Version } return resp, nil } func NewToolContext(ctx agent.InvocationContext, functionCallID string, actions *session.EventActions, confirmation *toolconfirmation.ToolConfirmation) tool.Context { if functionCallID == "" { functionCallID = uuid.NewString() } if actions == nil { actions = &session.EventActions{StateDelta: make(map[string]any)} } if actions.StateDelta == nil { actions.StateDelta = make(map[string]any) } if actions.ArtifactDelta == nil { actions.ArtifactDelta = make(map[string]int64) } cbCtx := contextinternal.NewCallbackContextWithDelta(ctx, actions.StateDelta, actions.ArtifactDelta) return &toolContext{ CallbackContext: cbCtx, invocationContext: ctx, functionCallID: functionCallID, eventActions: actions, artifacts: &internalArtifacts{ Artifacts: ctx.Artifacts(), eventActions: actions, }, toolConfirmation: confirmation, } } type toolContext struct { agent.CallbackContext invocationContext agent.InvocationContext functionCallID string eventActions *session.EventActions artifacts *internalArtifacts toolConfirmation *toolconfirmation.ToolConfirmation } func (c *toolContext) Artifacts() agent.Artifacts { return c.artifacts } func (c *toolContext) FunctionCallID() string { return c.functionCallID } func (c *toolContext) Actions() *session.EventActions { return c.eventActions } func (c *toolContext) AgentName() string { return c.invocationContext.Agent().Name() } func (c *toolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { if c.invocationContext.Memory() == nil { return nil, fmt.Errorf("memory service is not set") } return c.invocationContext.Memory().SearchMemory(ctx, query) } func (c *toolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return c.toolConfirmation } func (c *toolContext) RequestConfirmation(hint string, payload any) error { if c.functionCallID == "" { return fmt.Errorf("error function call id not set when requesting confirmation for tool") } if c.eventActions.RequestedToolConfirmations == nil { c.eventActions.RequestedToolConfirmations = make(map[string]toolconfirmation.ToolConfirmation) } c.eventActions.RequestedToolConfirmations[c.functionCallID] = toolconfirmation.ToolConfirmation{ Hint: hint, Confirmed: false, Payload: payload, } // SkipSummarization stops the agent loop after this tool call. Without it, // the function response event becomes lastEvent and IsFinalResponse() returns // false (hasFunctionResponses == true), causing the loop to continue. // This matches the behavior of the built-in RequireConfirmation path in // functiontool (function.go). c.eventActions.SkipSummarization = true return nil } ================================================ FILE: internal/toolinternal/context_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package toolinternal import ( "testing" "google.golang.org/adk/agent" contextinternal "google.golang.org/adk/internal/context" "google.golang.org/adk/session" ) func TestToolContext(t *testing.T) { inv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{}) toolCtx := NewToolContext(inv, "fn1", &session.EventActions{}, nil) if _, ok := toolCtx.(agent.ReadonlyContext); !ok { t.Errorf("ToolContext(%+T) is unexpectedly not a ReadonlyContext", toolCtx) } if _, ok := toolCtx.(agent.CallbackContext); !ok { t.Errorf("ToolContext(%+T) is unexpectedly not a CallbackContext", toolCtx) } } func TestRequestConfirmation_SetsSkipSummarization(t *testing.T) { inv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{}) actions := &session.EventActions{} toolCtx := NewToolContext(inv, "fn1", actions, nil) err := toolCtx.RequestConfirmation("please confirm", map[string]any{"key": "value"}) if err != nil { t.Fatalf("RequestConfirmation returned unexpected error: %v", err) } if !actions.SkipSummarization { t.Error("RequestConfirmation did not set SkipSummarization to true") } if actions.RequestedToolConfirmations == nil { t.Fatal("RequestConfirmation did not set RequestedToolConfirmations") } tc, ok := actions.RequestedToolConfirmations["fn1"] if !ok { t.Fatal("RequestConfirmation did not set confirmation for function call ID 'fn1'") } if tc.Hint != "please confirm" { t.Errorf("expected hint 'please confirm', got %q", tc.Hint) } if tc.Confirmed { t.Error("expected Confirmed to be false") } } func TestRequestConfirmation_AutoGeneratesIDWhenEmpty(t *testing.T) { inv := contextinternal.NewInvocationContext(t.Context(), contextinternal.InvocationContextParams{}) actions := &session.EventActions{} // NewToolContext auto-generates a UUID when functionCallID is empty. toolCtx := NewToolContext(inv, "", actions, nil) err := toolCtx.RequestConfirmation("hint", nil) if err != nil { t.Fatalf("RequestConfirmation returned unexpected error: %v", err) } if !actions.SkipSummarization { t.Error("SkipSummarization should be set even with auto-generated function call ID") } if len(actions.RequestedToolConfirmations) != 1 { t.Fatalf("expected 1 confirmation entry, got %d", len(actions.RequestedToolConfirmations)) } for _, tc := range actions.RequestedToolConfirmations { if tc.Hint != "hint" { t.Errorf("expected hint 'hint', got %q", tc.Hint) } if tc.Confirmed { t.Error("expected Confirmed to be false") } } } ================================================ FILE: internal/toolinternal/tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package tool defines internal-only interfaces and logic for tools. package toolinternal import ( "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) type FunctionTool interface { tool.Tool Declaration() *genai.FunctionDeclaration Run(ctx tool.Context, args any) (result map[string]any, err error) } type RequestProcessor interface { ProcessRequest(ctx tool.Context, req *model.LLMRequest) error } ================================================ FILE: internal/toolinternal/toolutils/toolutils.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package tool defines internal-only interfaces and logic for tools. package toolutils import ( "fmt" "google.golang.org/genai" "google.golang.org/adk/model" ) type Tool interface { Name() string Declaration() *genai.FunctionDeclaration } // The PackTool ensures that in case there is a usage of multiple function tools, // all of them are consolidated into one genai tool that has all the function declarations // provided by the tools. So, if there is already a tool with a function declaration, // it appends another to it; otherwise, it creates a new genai tool. func PackTool(req *model.LLMRequest, tool Tool) error { if req.Tools == nil { req.Tools = make(map[string]any) } name := tool.Name() if _, ok := req.Tools[name]; ok { return fmt.Errorf("duplicate tool: %q", name) } req.Tools[name] = tool if req.Config == nil { req.Config = &genai.GenerateContentConfig{} } if decl := tool.Declaration(); decl == nil { return nil } // Find an existing genai.Tool with FunctionDeclarations var funcTool *genai.Tool for _, tool := range req.Config.Tools { if tool != nil && tool.FunctionDeclarations != nil { funcTool = tool break } } if funcTool == nil { req.Config.Tools = append(req.Config.Tools, &genai.Tool{ FunctionDeclarations: []*genai.FunctionDeclaration{tool.Declaration()}, }) } else { funcTool.FunctionDeclarations = append(funcTool.FunctionDeclarations, tool.Declaration()) } return nil } ================================================ FILE: internal/typeutil/convert.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package typeutil is a collection of type handling utility functions. package typeutil import ( "encoding/json" "github.com/google/jsonschema-go/jsonschema" ) // ConvertToWithJSONSchema converts the given value to another type using json marshal/unmarshal. // If non-nil resolvedSchema is provided, validation against the resolvedSchema will run // during the conversion. func ConvertToWithJSONSchema[From, To any](v From, resolvedSchema *jsonschema.Resolved) (To, error) { var zero To rawArgs, err := json.Marshal(v) if err != nil { return zero, err } if resolvedSchema != nil { // See https://github.com/google/jsonschema-go/issues/23: in order to // validate, we must validate against a map[string]any. Struct validation // does not work as it cannot account for `omitempty` or custom marshalling. var m map[string]any if err := json.Unmarshal(rawArgs, &m); err != nil { return zero, err } if err := resolvedSchema.Validate(m); err != nil { return zero, err } } var typed To if err := json.Unmarshal(rawArgs, &typed); err != nil { return zero, err } return typed, nil } ================================================ FILE: internal/utils/schema_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package utils import ( "reflect" "testing" "google.golang.org/genai" ) func TestMatchType(t *testing.T) { tests := []struct { name string value any schema *genai.Schema isInput bool wantMatch bool wantErr bool }{ { name: "nil schema", value: "test", schema: nil, isInput: true, wantMatch: false, wantErr: true, }, { name: "nil value", value: nil, schema: &genai.Schema{Type: genai.TypeString}, isInput: true, wantMatch: false, wantErr: false, }, { name: "string match", value: "test", schema: &genai.Schema{Type: genai.TypeString}, isInput: true, wantMatch: true, wantErr: false, }, { name: "string mismatch", value: 123.0, schema: &genai.Schema{Type: genai.TypeString}, isInput: true, wantMatch: false, wantErr: false, }, { name: "integer match", value: 123.0, schema: &genai.Schema{Type: genai.TypeInteger}, isInput: true, wantMatch: true, wantErr: false, }, { name: "integer mismatch float", value: 123.45, schema: &genai.Schema{Type: genai.TypeInteger}, isInput: true, wantMatch: false, wantErr: false, }, { name: "integer mismatch type", value: "123", schema: &genai.Schema{Type: genai.TypeInteger}, isInput: true, wantMatch: false, wantErr: false, }, { name: "number match", value: 123.45, schema: &genai.Schema{Type: genai.TypeNumber}, isInput: true, wantMatch: true, wantErr: false, }, { name: "number mismatch", value: "123.45", schema: &genai.Schema{Type: genai.TypeNumber}, isInput: true, wantMatch: false, wantErr: false, }, { name: "boolean match", value: true, schema: &genai.Schema{Type: genai.TypeBoolean}, isInput: true, wantMatch: true, wantErr: false, }, { name: "boolean mismatch", value: "true", schema: &genai.Schema{Type: genai.TypeBoolean}, isInput: true, wantMatch: false, wantErr: false, }, { name: "array match", value: []any{"a", "b"}, schema: &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}}, isInput: true, wantMatch: true, wantErr: false, }, { name: "array mismatch type", value: "not an array", schema: &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}}, isInput: true, wantMatch: false, wantErr: false, }, { name: "array mismatch item type", value: []any{"a", 1.0}, schema: &genai.Schema{Type: genai.TypeArray, Items: &genai.Schema{Type: genai.TypeString}}, isInput: true, wantMatch: false, wantErr: false, }, { name: "array missing items", value: []any{"a", "b"}, schema: &genai.Schema{Type: genai.TypeArray}, isInput: true, wantMatch: false, wantErr: true, }, { name: "object match", value: map[string]any{"foo": "bar"}, schema: &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{"foo": {Type: genai.TypeString}}}, isInput: true, wantMatch: true, wantErr: false, }, { name: "object mismatch type", value: "not an object", schema: &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{"foo": {Type: genai.TypeString}}}, isInput: true, wantMatch: false, wantErr: false, }, { name: "object mismatch property type", value: map[string]any{"foo": 123.0}, schema: &genai.Schema{Type: genai.TypeObject, Properties: map[string]*genai.Schema{"foo": {Type: genai.TypeString}}}, isInput: true, wantMatch: false, wantErr: true, // This will fail ValidateMapOnSchema, which returns error }, { name: "unsupported type", value: 123, schema: &genai.Schema{Type: "UNSUPPORTED"}, isInput: true, wantMatch: false, wantErr: true, }, { name: "lowercase type in schema", value: "test", schema: &genai.Schema{Type: "string"}, isInput: true, wantMatch: true, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotMatch, err := matchType(tt.value, tt.schema, tt.isInput) if (err != nil) != tt.wantErr { t.Errorf("matchType() error = %v, wantErr %v", err, tt.wantErr) return } if gotMatch != tt.wantMatch { t.Errorf("matchType() = %v, want %v", gotMatch, tt.wantMatch) } }) } } func TestValidateMapOnSchema(t *testing.T) { schema := &genai.Schema{ Type: genai.TypeObject, Properties: map[string]*genai.Schema{ "str_field": {Type: genai.TypeString}, "int_field": {Type: genai.TypeInteger}, }, Required: []string{"str_field"}, } schemaNilProps := &genai.Schema{ Type: genai.TypeObject, } tests := []struct { name string args map[string]any schema *genai.Schema isInput bool wantErr bool }{ { name: "valid map", args: map[string]any{"str_field": "hello", "int_field": 123.0}, schema: schema, isInput: true, wantErr: false, }, { name: "valid map with only required fields", args: map[string]any{"str_field": "hello"}, schema: schema, isInput: true, wantErr: false, }, { name: "missing required field", args: map[string]any{"int_field": 123.0}, schema: schema, isInput: true, wantErr: true, }, { name: "extra field", args: map[string]any{"str_field": "hello", "extra": "field"}, schema: schema, isInput: true, wantErr: true, }, { name: "type mismatch", args: map[string]any{"str_field": 123.0}, schema: schema, isInput: true, wantErr: true, }, { name: "nil schema", args: map[string]any{"str_field": "hello"}, schema: nil, isInput: true, wantErr: true, }, { name: "nil properties and no args", args: map[string]any{}, schema: schemaNilProps, isInput: true, wantErr: false, }, { name: "nil properties and some args", args: map[string]any{"some": "arg"}, schema: schemaNilProps, isInput: true, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := ValidateMapOnSchema(tt.args, tt.schema, tt.isInput); (err != nil) != tt.wantErr { t.Errorf("ValidateMapOnSchema() error = %v, wantErr %v", err, tt.wantErr) } }) } } func TestValidateOutputSchema(t *testing.T) { schema := &genai.Schema{ Type: genai.TypeObject, Properties: map[string]*genai.Schema{ "result": {Type: genai.TypeString}, }, Required: []string{"result"}, } tests := []struct { name string output string schema *genai.Schema wantOutput map[string]any wantErr bool }{ { name: "valid output", output: `{"result": "success"}`, schema: schema, wantOutput: map[string]any{"result": "success"}, wantErr: false, }, { name: "invalid json", output: `{"result": "success"`, schema: schema, wantOutput: nil, wantErr: true, }, { name: "schema mismatch", output: `{"wrong_key": "failure"}`, schema: schema, wantOutput: nil, wantErr: true, }, { name: "nil schema", output: `{"result": "success"}`, schema: nil, wantOutput: nil, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotOutput, err := ValidateOutputSchema(tt.output, tt.schema) if (err != nil) != tt.wantErr { t.Errorf("ValidateOutputSchema() error = %v, wantErr %v", err, tt.wantErr) return } if !tt.wantErr && !reflect.DeepEqual(gotOutput, tt.wantOutput) { t.Errorf("ValidateOutputSchema() = %v, want %v", gotOutput, tt.wantOutput) } }) } } ================================================ FILE: internal/utils/schema_utils.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package utils import ( "encoding/json" "fmt" "math" "reflect" "strings" "google.golang.org/genai" ) // matchType checks if the value matches the schema type. func matchType(value any, schema *genai.Schema, isInput bool) (bool, error) { if schema == nil { return false, fmt.Errorf("schema is nil") } if value == nil { return false, nil } // Convert type to upper case to match the type in the schema. switch genai.Type(strings.ToUpper(string(schema.Type))) { case genai.TypeString: _, ok := value.(string) return ok, nil case genai.TypeInteger: f, ok := value.(float64) if !ok { return false, nil } return f == math.Trunc(f), nil case genai.TypeBoolean: _, ok := value.(bool) return ok, nil case genai.TypeNumber: _, ok := value.(float64) return ok, nil case genai.TypeArray: val := reflect.ValueOf(value) if val.Kind() != reflect.Slice { return false, nil } if schema.Items == nil { return false, fmt.Errorf("array schema missing items definition") } for i := 0; i < val.Len(); i++ { ok, err := matchType(val.Index(i).Interface(), schema.Items, isInput) if err != nil { return false, fmt.Errorf("array item %d: %w", i, err) } if !ok { return false, nil } } return true, nil case genai.TypeObject: obj, ok := value.(map[string]any) if !ok { return false, nil } err := ValidateMapOnSchema(obj, schema, isInput) return err == nil, err default: return false, fmt.Errorf("unsupported type: %s", schema.Type) } } // ValidateMapOnSchema validates a map against a schema. func ValidateMapOnSchema(args map[string]any, schema *genai.Schema, isInput bool) error { if schema == nil { return fmt.Errorf("schema cannot be nil") } properties := schema.Properties if properties == nil { properties = make(map[string]*genai.Schema) } argType := "input" if !isInput { argType = "output" } for key, value := range args { propSchema, exists := properties[key] if !exists { // Note: OpenAPI schemas can allow additional properties. This implementation assumes strictness. return fmt.Errorf("%s arg: '%q' does not exist in schema properties", argType, key) } ok, err := matchType(value, propSchema, isInput) if err != nil { return fmt.Errorf("%s arg: '%q' validation failed: %w", argType, key, err) } if !ok { return fmt.Errorf("%s arg: '%q' type mismatch, expected schema type %s, got value %v of type %T", argType, key, propSchema.Type, value, value) } } for _, requiredKey := range schema.Required { if _, exists := args[requiredKey]; !exists { return fmt.Errorf("%q args does not contain required key: '%q'", argType, requiredKey) } } return nil } // ValidateOutputSchema validates an output JSON string against a schema. func ValidateOutputSchema(output string, schema *genai.Schema) (map[string]any, error) { if schema == nil { return nil, fmt.Errorf("schema cannot be nil") } var outputMap map[string]any err := json.Unmarshal([]byte(output), &outputMap) if err != nil { return nil, fmt.Errorf("failed to parse output JSON: %w", err) } if err := ValidateMapOnSchema(outputMap, schema, false); err != nil { // isInput = false return nil, err } return outputMap, nil } ================================================ FILE: internal/utils/utils.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package utils import ( "strings" "github.com/google/uuid" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // TODO: split in proper files/packages. const afFunctionCallIDPrefix = "adk-" // PopulateClientFunctionCallID sets the function call ID field if it is empty. // Since the ID field is optional, some models don't fill the field, but // the LLMAgent depends on the IDs to map FunctionCall and FunctionResponse events // in the event stream. func PopulateClientFunctionCallID(c *genai.Content) { for _, fn := range FunctionCalls(c) { if fn.ID == "" { fn.ID = GenerateFunctionCallID() } } } // GenerateFunctionCallID generates a new function call ID. func GenerateFunctionCallID() string { return afFunctionCallIDPrefix + uuid.NewString() } // RemoveClientFunctionCallID removes the function call ID field that was set // by populateClientFunctionCallID. This is necessary when FunctionCall or // FunctionResponse are sent back to the model. func RemoveClientFunctionCallID(c *genai.Content) { for _, fn := range FunctionCalls(c) { if strings.HasPrefix(fn.ID, afFunctionCallIDPrefix) { fn.ID = "" } } for _, fn := range FunctionResponses(c) { if strings.HasPrefix(fn.ID, afFunctionCallIDPrefix) { fn.ID = "" } } } // Content is a convenience function that returns the genai.Content // in the event. func Content(ev *session.Event) *genai.Content { if ev == nil { return nil } return ev.LLMResponse.Content } // Belows are useful utilities that help working with genai.Content // included in types.Event. // TODO: Use generics. // FunctionCalls extracts all FunctionCall parts from the content. func FunctionCalls(c *genai.Content) (ret []*genai.FunctionCall) { if c == nil { return nil } for _, p := range c.Parts { if p.FunctionCall != nil { ret = append(ret, p.FunctionCall) } } return ret } // FunctionResponses extracts all FunctionResponse parts from the content. func FunctionResponses(c *genai.Content) (ret []*genai.FunctionResponse) { if c == nil { return nil } for _, p := range c.Parts { if p.FunctionResponse != nil { ret = append(ret, p.FunctionResponse) } } return ret } // TextParts extracts all Text parts from the content. func TextParts(c *genai.Content) (ret []string) { if c == nil { return nil } for _, p := range c.Parts { if p.Text != "" { ret = append(ret, p.Text) } } return ret } // FunctionDecls extracts all Function declarations from the GenerateContentConfig. func FunctionDecls(c *genai.GenerateContentConfig) (ret []*genai.FunctionDeclaration) { if c == nil { return nil } for _, t := range c.Tools { ret = append(ret, t.FunctionDeclarations...) } return ret } func Must[T agent.Agent](a T, err error) T { if err != nil { panic(err) } return a } // AppendInstructions appends instructions to the [genai.GenerateContentConfig.SystemInstruction] system instruction. func AppendInstructions(r *model.LLMRequest, instructions ...string) { if len(instructions) == 0 { return } inst := strings.Join(instructions, "\n\n") if r.Config == nil { r.Config = &genai.GenerateContentConfig{} } if r.Config.SystemInstruction == nil { r.Config.SystemInstruction = genai.NewContentFromText(inst, genai.RoleUser) return } if len(r.Config.SystemInstruction.Parts) > 0 && r.Config.SystemInstruction.Parts[len(r.Config.SystemInstruction.Parts)-1].Text != "" { r.Config.SystemInstruction.Parts[len(r.Config.SystemInstruction.Parts)-1].Text += "\n\n" + inst return } r.Config.SystemInstruction.Parts = append(r.Config.SystemInstruction.Parts, genai.NewPartFromText(inst)) } ================================================ FILE: internal/utils/utils_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package utils_test import "testing" func TestNothing(t *testing.T) { // To make it buildable. } ================================================ FILE: internal/version/version.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package version // Version exposes the current ADK Go version, used for llm request tagging const Version = "0.6.0" ================================================ FILE: memory/inmemory.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memory import ( "context" "maps" "strings" "sync" "time" "google.golang.org/genai" "google.golang.org/adk/session" ) // InMemoryService returns a new in-memory implementation of the memory service. Thread-safe. func InMemoryService() Service { return &inMemoryService{ store: make(map[key]map[sessionID][]value), } } type key struct { appName, userID string } type sessionID string type value struct { id string content *genai.Content author string timestamp time.Time customMetadata map[string]any // precomputed set of words in the content for simple keyword matching. words map[string]struct{} } // inMemoryService is an in-memory implementation of Service. type inMemoryService struct { mu sync.RWMutex store map[key]map[sessionID][]value } func (s *inMemoryService) AddSessionToMemory(ctx context.Context, curSession session.Session) error { var values []value for event := range curSession.Events().All() { if event.LLMResponse.Content == nil { continue } words := make(map[string]struct{}) for _, part := range event.LLMResponse.Content.Parts { if part.Text == "" { continue } maps.Copy(words, extractWords(part.Text)) } if len(words) == 0 { continue } values = append(values, value{ id: event.ID, content: event.LLMResponse.Content, author: event.Author, timestamp: event.Timestamp, customMetadata: event.CustomMetadata, words: words, }) } k := key{ appName: curSession.AppName(), userID: curSession.UserID(), } s.mu.Lock() defer s.mu.Unlock() v, ok := s.store[k] if !ok { v = map[sessionID][]value{} s.store[k] = v } sid := sessionID(curSession.ID()) v[sid] = values return nil } func (s *inMemoryService) SearchMemory(ctx context.Context, req *SearchRequest) (*SearchResponse, error) { queryWords := extractWords(req.Query) k := key{ appName: req.AppName, userID: req.UserID, } s.mu.RLock() values, ok := s.store[k] s.mu.RUnlock() if !ok { return &SearchResponse{}, nil } res := &SearchResponse{} for _, events := range values { for _, e := range events { if checkMapsIntersect(e.words, queryWords) { res.Memories = append(res.Memories, Entry{ ID: e.id, Content: e.content, Author: e.author, Timestamp: e.timestamp, CustomMetadata: e.customMetadata, }) } } } return res, nil } func checkMapsIntersect(m1, m2 map[string]struct{}) bool { if len(m1) == 0 || len(m2) == 0 { return false } // Iterate over the smaller map. if len(m1) > len(m2) { m1, m2 = m2, m1 } for k := range m1 { if _, ok := m2[k]; ok { return true } } return false } func extractWords(text string) map[string]struct{} { res := make(map[string]struct{}) for s := range strings.SplitSeq(text, " ") { if s == "" { continue } res[strings.ToLower(s)] = struct{}{} } return res } ================================================ FILE: memory/inmemory_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package memory_test import ( "iter" "slices" "testing" "time" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func Test_inMemoryService_SearchMemory(t *testing.T) { tests := []struct { name string initSessions []session.Session req *memory.SearchRequest wantResp *memory.SearchResponse wantErr bool }{ { name: "find events", initSessions: []session.Session{ makeSession(t, "app1", "user1", "sess1", []*session.Event{ { ID: "event1", Author: "user1", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("The Quick brown fox", genai.RoleUser), CustomMetadata: map[string]any{"key": "value"}, }, Timestamp: must(time.Parse(time.RFC3339, "2023-10-01T10:00:00Z")), }, { LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("jumps over the lazy dog", genai.RoleModel), }, }, }), makeSession(t, "app1", "user1", "sess2", []*session.Event{ { Author: "test-bot", LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("hello world", genai.RoleModel)}, Timestamp: must(time.Parse(time.RFC3339, "2023-10-02T10:00:00Z")), }, }), makeSession(t, "app1", "user1", "sess3", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("test text", genai.RoleUser)}}, }), }, req: &memory.SearchRequest{ AppName: "app1", UserID: "user1", Query: "quick hello", }, wantResp: &memory.SearchResponse{ Memories: []memory.Entry{ { ID: "event1", Content: genai.NewContentFromText("The Quick brown fox", genai.RoleUser), Author: "user1", Timestamp: must(time.Parse(time.RFC3339, "2023-10-01T10:00:00Z")), CustomMetadata: map[string]any{"key": "value"}, }, { Content: genai.NewContentFromText("hello world", genai.RoleModel), Author: "test-bot", Timestamp: must(time.Parse(time.RFC3339, "2023-10-02T10:00:00Z")), }, }, }, }, { name: "no leakage for different appName", initSessions: []session.Session{ makeSession(t, "app1", "user1", "sess3", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("test text", genai.RoleUser)}}, }), }, req: &memory.SearchRequest{ AppName: "other_app", UserID: "user1", Query: "test text", }, wantResp: &memory.SearchResponse{}, }, { name: "no leakage for different user", initSessions: []session.Session{ makeSession(t, "app1", "user1", "sess3", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("test text", genai.RoleUser)}}, }), }, req: &memory.SearchRequest{ AppName: "app1", UserID: "test_user", Query: "test text", }, wantResp: &memory.SearchResponse{}, }, { name: "no matches", initSessions: []session.Session{ makeSession(t, "app1", "user1", "sess3", []*session.Event{ {LLMResponse: model.LLMResponse{Content: genai.NewContentFromText("test text", genai.RoleUser)}}, }), }, req: &memory.SearchRequest{ AppName: "app1", UserID: "test_user", Query: "something different", }, wantResp: &memory.SearchResponse{}, }, { name: "lookup on empty store", req: &memory.SearchRequest{ AppName: "app1", UserID: "test_user", Query: "something different", }, wantResp: &memory.SearchResponse{}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := memory.InMemoryService() for _, session := range tt.initSessions { if err := s.AddSessionToMemory(t.Context(), session); err != nil { t.Fatalf("inMemoryService.AddSessionToMemory() error = %v", err) } } got, err := s.SearchMemory(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("inMemoryService.SearchMemory() error = %v, wantErr %v", err, tt.wantErr) } if diff := cmp.Diff(tt.wantResp, got, sortMemories); diff != "" { t.Errorf("inMemoryiService.SearchMemory() mismatch (-want +got):\n%s", diff) } }) } } func makeSession(t *testing.T, appName, userID, sessionID string, events []*session.Event) session.Session { t.Helper() return &testSession{ appName: appName, userID: userID, sessionID: sessionID, events: events, } } var sortMemories = cmp.Transformer("Sort", func(in *memory.SearchResponse) *memory.SearchResponse { slices.SortFunc(in.Memories, func(m1, m2 memory.Entry) int { return m1.Timestamp.Compare(m2.Timestamp) }) return in }) type testSession struct { appName, userID, sessionID string events []*session.Event } func (s *testSession) ID() string { return s.sessionID } func (s *testSession) AppName() string { return s.appName } func (s *testSession) UserID() string { return s.userID } func (s *testSession) Events() session.Events { return s } func (s *testSession) All() iter.Seq[*session.Event] { return slices.Values(s.events) } func (s *testSession) Len() int { return len(s.events) } func (s *testSession) At(i int) *session.Event { return s.events[i] } func (s *testSession) State() session.State { panic("not implemented") } func (s *testSession) LastUpdateTime() time.Time { panic("not implemented") } func must[V any](v V, err error) V { if err != nil { panic(err) } return v } ================================================ FILE: memory/service.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package memory defines the entities to interact with agent memory (long-term knowledge). package memory import ( "context" "time" "google.golang.org/genai" "google.golang.org/adk/session" ) // Service is a definition of the memory service. // // The service ingests sessions into memory so that it can be used for // user queries across user-scoped sessions. type Service interface { // AddSession adds a session to the memory service. // // A session can be added multiple times during its lifetime. AddSessionToMemory(ctx context.Context, s session.Session) error // SearchMemory returns memory entries relevant to the given query. // Empty slice is returned if there are no matches. SearchMemory(ctx context.Context, req *SearchRequest) (*SearchResponse, error) } // SearchRequest represents a request for memory search. type SearchRequest struct { Query string UserID string AppName string } // SearchResponse represents the response from a memory search. type SearchResponse struct { Memories []Entry } // Entry represents a single memory entry. type Entry struct { // ID is the unique identifier of the memory. ID string // Content contains the main content of the memory. Content *genai.Content // Author of the memory. Author string // Timestamp shows when the original content of this memory happened. // This string will be forwarded to LLM. Preferred format is ISO 8601 format. Timestamp time.Time // CustomMetadata contains optional custom metadata associated with the memory. CustomMetadata map[string]any } ================================================ FILE: model/apigee/apigee.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package apigee provides an LLM implementation for calling Apigee proxy. package apigee import ( "context" "fmt" "iter" "net/http" "os" "strings" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" ) const ( apigeeProxyURLEnvVar = "APIGEE_PROXY_URL" googleGenaiUseVertexAIEnvVar = "GOOGLE_GENAI_USE_VERTEXAI" projectEnvVar = "GOOGLE_CLOUD_PROJECT" locationEnvVar = "GOOGLE_CLOUD_LOCATION" ) type modelInfo struct { modelID string apiVersion string isVertexAI bool } type apigeeModel struct { delegate model.LLM name string } // Config contains the configuration for the Apigee LLM. type Config struct { ModelName string ProxyURL string CustomHeaders http.Header HTTPClient *http.Client // For testing only. } // Option is a function that configures the Apigee LLM. type Option func(*Config) // WithProxyURL sets the proxy URL for the Apigee LLM. func WithProxyURL(proxyURL string) Option { return func(c *Config) { c.ProxyURL = proxyURL } } // WithCustomHeaders sets the custom headers for the Apigee LLM. func WithCustomHeaders(headers http.Header) Option { return func(c *Config) { c.CustomHeaders = headers } } // WithHTTPClient sets the HTTP client for the Apigee LLM. This is for testing only. func WithHTTPClient(client *http.Client) Option { return func(c *Config) { c.HTTPClient = client } } // NewModel creates and initializes a new model instance that satisfies the // model.LLM interface, backed by the Apigee proxy. func NewModel(ctx context.Context, modelName string, opts ...Option) (*apigeeModel, error) { cfg := &Config{ ModelName: modelName, } for _, opt := range opts { opt(cfg) } if !strings.HasPrefix(cfg.ModelName, "apigee/") { return nil, fmt.Errorf("invalid model string: %s", cfg.ModelName) } mi, err := parseModelName(cfg.ModelName) if err != nil { return nil, err } proxyURL := resolveProxyURL(cfg.ProxyURL) if proxyURL == "" { return nil, fmt.Errorf("%s environment variable not set", apigeeProxyURLEnvVar) } httpOptions := generateHTTPOptions(proxyURL, mi.apiVersion, cfg.CustomHeaders) backendType := backendType(mi.isVertexAI) clientConfig, err := generateClientConfig(mi.isVertexAI, backendType, httpOptions, cfg.HTTPClient) if err != nil { return nil, err } delegate, err := gemini.NewModel(ctx, mi.modelID, clientConfig) if err != nil { return nil, err } return &apigeeModel{ delegate: delegate, name: cfg.ModelName, }, nil } func (m *apigeeModel) Name() string { return m.name } // GenerateContent calls the underlying model. func (m *apigeeModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return m.delegate.GenerateContent(ctx, req, stream) } func parseModelName(modelName string) (*modelInfo, error) { if !strings.HasPrefix(modelName, "apigee/") { return nil, fmt.Errorf("invalid model string: %s", modelName) } modelPart := strings.TrimPrefix(modelName, "apigee/") if modelPart == "" { return nil, fmt.Errorf("invalid model string: %s", modelName) } components := strings.Split(modelPart, "/") info := &modelInfo{} info.isVertexAI = !strings.HasPrefix(modelName, "apigee/gemini/") && (strings.HasPrefix(modelName, "apigee/vertex_ai/") || isEnabled(googleGenaiUseVertexAIEnvVar)) validated := false if len(components) == 1 { info.modelID = components[0] validated = true } else if len(components) == 2 { if components[0] == "vertex_ai" || components[0] == "gemini" { info.modelID = components[1] validated = true } else if strings.HasPrefix(components[0], "v") { info.apiVersion = components[0] info.modelID = components[1] validated = true } } else if len(components) == 3 { if (components[0] == "vertex_ai" || components[0] == "gemini") && strings.HasPrefix(components[1], "v") { info.apiVersion = components[1] info.modelID = components[2] validated = true } } if !validated { return nil, fmt.Errorf("invalid model string: %s", modelName) } return info, nil } func resolveProxyURL(proxyURL string) string { if proxyURL != "" { return proxyURL } return os.Getenv(apigeeProxyURLEnvVar) } func generateHTTPOptions(proxyURL, apiVersion string, customHeaders http.Header) *genai.HTTPOptions { httpOptions := &genai.HTTPOptions{ BaseURL: proxyURL, } if customHeaders != nil { httpOptions.Headers = make(http.Header) for k, v := range customHeaders { httpOptions.Headers[k] = v } } if apiVersion != "" { httpOptions.APIVersion = apiVersion } return httpOptions } func backendType(isVertexAI bool) genai.Backend { if isVertexAI { return genai.BackendVertexAI } return genai.BackendGeminiAPI } // isEnabled returns true if the environment variable is set to "true" or "1". func isEnabled(envVarName string) bool { val := os.Getenv(envVarName) return strings.ToLower(val) == "true" || val == "1" } func generateClientConfig(isVertexAI bool, backendType genai.Backend, httpOptions *genai.HTTPOptions, httpClient *http.Client) (*genai.ClientConfig, error) { clientConfig := &genai.ClientConfig{ HTTPOptions: *httpOptions, Backend: backendType, } project := os.Getenv(projectEnvVar) location := os.Getenv(locationEnvVar) if isVertexAI { if project == "" { return nil, fmt.Errorf("%s environment variable must be set", projectEnvVar) } if location == "" { return nil, fmt.Errorf("%s environment variable must be set", locationEnvVar) } clientConfig.Project = project clientConfig.Location = location } if httpClient != nil { clientConfig.HTTPClient = httpClient } return clientConfig, nil } ================================================ FILE: model/apigee/apigee_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package apigee import ( "context" "fmt" "io" "net/http" "os" "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/model" ) const proxyURL = "https://test.apigee.net" // roundTripFunc is an adapter to allow the use of ordinary functions as http.RoundTrippers. type roundTripFunc func(req *http.Request) (*http.Response, error) // RoundTrip executes the round trip. func (f roundTripFunc) RoundTrip(req *http.Request) (*http.Response, error) { return f(req) } // newTestClient returns an *http.Client with the Transport replaced by the provided roundTripFunc. func newTestClient(fn roundTripFunc) *http.Client { return &http.Client{ Transport: fn, } } func TestNewModelWithValidModelStrings(t *testing.T) { validModelStrings := []string{ "apigee/gemini-1.5-flash", "apigee/v1/gemini-1.5-flash", "apigee/vertex_ai/gemini-1.5-flash", "apigee/gemini/v1/gemini-1.5-flash", "apigee/vertex_ai/v1beta/gemini-1.5-flash", } ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") for _, modelName := range validModelStrings { t.Run(modelName, func(t *testing.T) { if strings.Contains(modelName, "vertex_ai") { t.Setenv("GOOGLE_CLOUD_PROJECT", "test-project") t.Setenv("GOOGLE_CLOUD_LOCATION", "test-location") } else { if err := os.Unsetenv("GOOGLE_CLOUD_PROJECT"); err != nil { t.Errorf("failed to unset GOOGLE_CLOUD_PROJECT: %v", err) } if err := os.Unsetenv("GOOGLE_CLOUD_LOCATION"); err != nil { t.Errorf("failed to unset GOOGLE_CLOUD_LOCATION: %v", err) } } client := newTestClient(func(req *http.Request) (*http.Response, error) { // Check if the request URL is what we expect if req.URL.String() != "https://www.google.com" { t.Errorf("Unexpected URL: got %s, want https://www.google.com", req.URL.String()) return nil, fmt.Errorf("unexpected URL: %s", req.URL.String()) } // Return a mock response return &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("Mock Google")), Header: http.Header{"Content-Type": []string{"text/html"}}, }, nil }) _, err := NewModel(ctx, modelName, WithProxyURL(proxyURL), WithHTTPClient(client)) if err != nil { t.Errorf("NewModel(%q) returned an unexpected error: %v", modelName, err) } }) } } func TestNewModelWithInvalidModelStrings(t *testing.T) { invalidModelStrings := []string{ "apigee/openai/v1/gpt", "apigee/", "apigee", "gemini-pro", "apigee/vertex_ai/v1/model/extra", "apigee/unknown/model", } ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") for _, modelName := range invalidModelStrings { t.Run(modelName, func(t *testing.T) { _, err := NewModel(ctx, modelName, WithProxyURL(proxyURL)) if err == nil { t.Errorf("NewModel(%q) did not return an error for invalid model string", modelName) } }) } } func TestParseModelName(t *testing.T) { testCases := []struct { name string modelName string vertexEnv string want *modelInfo wantErr bool }{ { name: "simple", modelName: "apigee/gemini-1.5-flash", vertexEnv: "", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "", isVertexAI: false}, }, { name: "simple vertex env", modelName: "apigee/gemini-1.5-flash", vertexEnv: "true", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "", isVertexAI: true}, }, { name: "v1", modelName: "apigee/v1/gemini-1.5-flash", vertexEnv: "", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "v1", isVertexAI: false}, }, { name: "vertex", modelName: "apigee/vertex_ai/gemini-1.5-flash", vertexEnv: "", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "", isVertexAI: true}, }, { name: "gemini v1", modelName: "apigee/gemini/v1/gemini-1.5-flash", vertexEnv: "", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "v1", isVertexAI: false}, }, { name: "vertex v1beta", modelName: "apigee/vertex_ai/v1beta/gemini-1.5-flash", vertexEnv: "", want: &modelInfo{modelID: "gemini-1.5-flash", apiVersion: "v1beta", isVertexAI: true}, }, { name: "invalid openai", modelName: "apigee/openai/v1/gpt", wantErr: true, }, { name: "invalid trailing slash", modelName: "apigee/", wantErr: true, }, { name: "invalid extra parts", modelName: "apigee/vertex_ai/v1/model/extra", wantErr: true, }, { name: "invalid unknown", modelName: "apigee/unknown/model", wantErr: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { if tc.vertexEnv != "" { t.Setenv(googleGenaiUseVertexAIEnvVar, tc.vertexEnv) } else { if err := os.Unsetenv(googleGenaiUseVertexAIEnvVar); err != nil { t.Errorf("failed to unset %s: %v", googleGenaiUseVertexAIEnvVar, err) } } got, err := parseModelName(tc.modelName) if (err != nil) != tc.wantErr { t.Errorf("parseModelName(%q) error = %v, wantErr %v", tc.modelName, err, tc.wantErr) return } if !tc.wantErr { if !cmp.Equal(got, tc.want, cmp.AllowUnexported(modelInfo{})) { t.Errorf("parseModelName(%q) = %+v, want %+v", tc.modelName, got, tc.want) } } }) } } func TestNewModelWithCustomHeaders(t *testing.T) { ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") headers := http.Header{} headers.Set("X-Custom-Header", "custom-value") _, err := NewModel(ctx, "apigee/gemini-1.5-flash", WithProxyURL(proxyURL), WithCustomHeaders(headers)) if err != nil { t.Fatalf("NewModel() returned an unexpected error: %v", err) } } func TestNewModelWithoutProxyURL(t *testing.T) { ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") if err := os.Unsetenv(apigeeProxyURLEnvVar); err != nil { t.Errorf("failed to unset %s: %v", apigeeProxyURLEnvVar, err) } _, err := NewModel(ctx, "apigee/gemini-1.5-flash") if err == nil { t.Errorf("NewModel() did not return an error when proxy URL is not set") } t.Setenv(apigeeProxyURLEnvVar, "https://env.proxy.url") _, err = NewModel(ctx, "apigee/gemini-1.5-flash") if err != nil { t.Fatalf("NewModel() returned an unexpected error: %v", err) } } func TestNewModelVertexMissingProjectOrLocation(t *testing.T) { ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") t.Setenv(googleGenaiUseVertexAIEnvVar, "true") if err := os.Unsetenv(projectEnvVar); err != nil { t.Errorf("failed to unset %s: %v", projectEnvVar, err) } if err := os.Unsetenv(locationEnvVar); err != nil { t.Errorf("failed to unset %s: %v", locationEnvVar, err) } _, err := NewModel(ctx, "apigee/gemini-1.5-flash", WithProxyURL(proxyURL)) if err == nil || !strings.Contains(err.Error(), projectEnvVar) { t.Errorf("NewModel() with vertex enabled but no project env var should fail") } t.Setenv(projectEnvVar, "test-project") _, err = NewModel(ctx, "apigee/gemini-1.5-flash", WithProxyURL(proxyURL)) if err == nil || !strings.Contains(err.Error(), locationEnvVar) { t.Errorf("NewModel() with vertex enabled but no location env var should fail") } } // test GenerateContent func TestGenerateContent(t *testing.T) { ctx := context.Background() t.Setenv("GOOGLE_API_KEY", "test-key") t.Setenv(googleGenaiUseVertexAIEnvVar, "true") t.Setenv(projectEnvVar, "test-project") t.Setenv(locationEnvVar, "test-location") client := newTestClient(func(req *http.Request) (*http.Response, error) { // Check if the request URL is what we expect if req.URL.String() != "https://test.apigee.net/v1/models/gemini-1.5-flash:generateContent" && req.URL.String() != "https://test.apigee.net/v1/models/gemini-1.5-flash:streamGenerateContent?alt=sse" { t.Errorf("Unexpected URL: got %s, want https://test.apigee.net/v1/models/gemini-1.5-flash:generateContent or https://test.apigee.net/v1/models/gemini-1.5-flash:streamGenerateContent?alt=sse", req.URL.String()) return nil, fmt.Errorf("unexpected URL: %s", req.URL.String()) } // Return a mock response return &http.Response{ StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("{\"candidates\":[{\"content\":{\"parts\":[{\"text\":\"Paris\"}]}}]}")), Header: http.Header{"Content-Type": []string{"application/json"}}, }, nil }) apigeeModel, err := NewModel(ctx, "apigee/gemini/v1/gemini-1.5-flash", WithProxyURL(proxyURL), WithHTTPClient(client)) if err != nil { t.Fatalf("NewModel() returned an unexpected error: %v", err) } req := &model.LLMRequest{ Contents: genai.Text("What is the capital of France? One word."), Config: &genai.GenerateContentConfig{ Temperature: new(float32), }, } responses := apigeeModel.GenerateContent(ctx, req, false) for resp, err := range responses { if err != nil || resp.Content == nil || len(resp.Content.Parts) == 0 { t.Errorf("GenerateContent() returned an unexpected error or empty response: %v", err) } } } ================================================ FILE: model/gemini/gemini.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package gemini implements the [model.LLM] interface for Gemini models. package gemini import ( "context" "fmt" "iter" "net/http" "runtime" "strings" "google.golang.org/genai" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/llminternal/converters" "google.golang.org/adk/internal/llminternal/googlellm" "google.golang.org/adk/internal/version" "google.golang.org/adk/model" ) // TODO: test coverage type geminiModel struct { client *genai.Client name string versionHeaderValue string } // NewModel returns [model.LLM], backed by the Gemini API. // // It uses the provided context and configuration to initialize the underlying // [genai.Client]. The modelName specifies which Gemini model to target // (e.g., "gemini-2.5-flash"). // // An error is returned if the [genai.Client] fails to initialize. func NewModel(ctx context.Context, modelName string, cfg *genai.ClientConfig) (model.LLM, error) { // Create a copy of the config to avoid mutating the caller's config // or the underlying http.Client. if cfg != nil { cfgCopy := *cfg if cfg.HTTPClient != nil { clientCopy := *cfg.HTTPClient cfgCopy.HTTPClient = &clientCopy } cfg = &cfgCopy } client, err := genai.NewClient(ctx, cfg) if err != nil { return nil, err } if client.ClientConfig().HTTPClient != nil { client.ClientConfig().HTTPClient.Transport = &mergeHeadersInterceptor{ base: client.ClientConfig().HTTPClient.Transport, } } // Create header value once, when the model is created headerValue := fmt.Sprintf("google-adk/%s gl-go/%s", version.Version, strings.TrimPrefix(runtime.Version(), "go")) return &geminiModel{ name: modelName, client: client, versionHeaderValue: headerValue, }, nil } func (m *geminiModel) Name() string { return m.name } // GenerateContent calls the underlying model. func (m *geminiModel) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { m.maybeAppendUserContent(req) if req.Config == nil { req.Config = &genai.GenerateContentConfig{} } if req.Config.HTTPOptions == nil { req.Config.HTTPOptions = &genai.HTTPOptions{} } if req.Config.HTTPOptions.Headers == nil { req.Config.HTTPOptions.Headers = make(http.Header) } m.addHeaders(req.Config.HTTPOptions.Headers) if stream { return m.generateStream(ctx, req) } return func(yield func(*model.LLMResponse, error) bool) { resp, err := m.generate(ctx, req) yield(resp, err) } } // addHeaders sets the x-goog-api-client and user-agent headers func (m *geminiModel) addHeaders(headers http.Header) { headers.Set("x-goog-api-client", m.versionHeaderValue) headers.Set("user-agent", m.versionHeaderValue) } // modelName returns the model name to use for the API call. // It prefers req.Model (which can be set by BeforeModelCallback), // falling back to the construction-time name if unset. func (m *geminiModel) modelName(req *model.LLMRequest) string { if req.Model != "" { return req.Model } return m.name } // generate calls the model synchronously returning result from the first candidate. func (m *geminiModel) generate(ctx context.Context, req *model.LLMRequest) (*model.LLMResponse, error) { resp, err := m.client.Models.GenerateContent(ctx, m.modelName(req), req.Contents, req.Config) if err != nil { return nil, fmt.Errorf("failed to call model: %w", err) } if len(resp.Candidates) == 0 { // shouldn't happen? return nil, fmt.Errorf("empty response") } return converters.Genai2LLMResponse(resp), nil } // generateStream returns a stream of responses from the model. func (m *geminiModel) generateStream(ctx context.Context, req *model.LLMRequest) iter.Seq2[*model.LLMResponse, error] { aggregator := llminternal.NewStreamingResponseAggregator() return func(yield func(*model.LLMResponse, error) bool) { for resp, err := range m.client.Models.GenerateContentStream(ctx, m.modelName(req), req.Contents, req.Config) { if err != nil { yield(nil, err) return } for llmResponse, err := range aggregator.ProcessResponse(ctx, resp) { if !yield(llmResponse, err) { return // Consumer stopped } } } if closeResult := aggregator.Close(); closeResult != nil { yield(closeResult, nil) } } } // maybeAppendUserContent appends a user content, so that model can continue to output. func (m *geminiModel) maybeAppendUserContent(req *model.LLMRequest) { if len(req.Contents) == 0 { req.Contents = append(req.Contents, genai.NewContentFromText("Handle the requests as specified in the System Instruction.", "user")) } if last := req.Contents[len(req.Contents)-1]; last != nil && last.Role != "user" { req.Contents = append(req.Contents, genai.NewContentFromText("Continue processing previous requests as instructed. Exit or provide a summary if no more outputs are needed.", "user")) } } // mergeHeadersInterceptor is a http.RoundTripper that merges headers from the request // with the model's headers before delegating to the base transport. type mergeHeadersInterceptor struct { base http.RoundTripper } func (h *mergeHeadersInterceptor) RoundTrip(req *http.Request) (*http.Response, error) { for _, headerName := range []string{"x-goog-api-client", "user-agent"} { if values := req.Header.Values(headerName); len(values) > 0 { req.Header.Set(headerName, strings.Join(values, " ")) } } if h.base == nil { return http.DefaultTransport.RoundTrip(req) } return h.base.RoundTrip(req) } func (m *geminiModel) GetGoogleLLMVariant() genai.Backend { if m == nil || m.client == nil { return genai.BackendUnspecified } return m.client.ClientConfig().Backend } var _ googlellm.GoogleLLM = &geminiModel{} ================================================ FILE: model/gemini/gemini_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package gemini import ( "fmt" "iter" "net/http" "path/filepath" "strconv" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/internal/httprr" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" ) //go:generate go test -httprecord=testdata/.*\.httprr func TestModel_Generate(t *testing.T) { tests := []struct { name string modelName string req *model.LLMRequest want *model.LLMResponse wantErr bool }{ { name: "ok", modelName: "gemini-2.5-flash", req: &model.LLMRequest{ Contents: genai.Text("What is the capital of France? One word."), Config: &genai.GenerateContentConfig{ Temperature: new(float32), }, }, want: &model.LLMResponse{ Content: genai.NewContentFromText("Paris", genai.RoleModel), UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ CandidatesTokenCount: 1, CandidatesTokensDetails: nil, PromptTokenCount: 11, PromptTokensDetails: []*genai.ModalityTokenCount{{Modality: "TEXT", TokenCount: 11}}, ThoughtsTokenCount: 34, TotalTokenCount: 46, }, ModelVersion: "gemini-2.5-flash", FinishReason: "STOP", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { httpRecordFilename := filepath.Join("testdata", strings.ReplaceAll(t.Name(), "/", "_")+".httprr") testModel, err := NewModel(t.Context(), tt.modelName, testutil.NewGeminiTestClientConfig(t, httpRecordFilename)) if err != nil { t.Fatal(err) } for got, err := range testModel.GenerateContent(t.Context(), tt.req, false) { if (err != nil) != tt.wantErr { t.Errorf("Model.Generate() error = %v, wantErr %v", err, tt.wantErr) return } if diff := cmp.Diff(tt.want, got, cmpopts.IgnoreFields(model.LLMResponse{}, "AvgLogprobs")); diff != "" { t.Errorf("Model.Generate() = %v, want %v\ndiff(-want +got):\n%v", got, tt.want, diff) } } }) } } func TestModel_GenerateStream(t *testing.T) { tests := []struct { name string modelName string req *model.LLMRequest want string wantErr bool }{ { name: "ok", modelName: "gemini-2.5-flash", req: &model.LLMRequest{ Contents: genai.Text("What is the capital of France? One word."), Config: &genai.GenerateContentConfig{ Temperature: new(float32), }, }, want: "Paris", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { httpRecordFilename := filepath.Join("testdata", strings.ReplaceAll(t.Name(), "/", "_")+".httprr") model, err := NewModel(t.Context(), tt.modelName, testutil.NewGeminiTestClientConfig(t, httpRecordFilename)) if err != nil { t.Fatal(err) } // Transforms the stream into strings, concatenating the text value of the response parts got, err := readResponse(model.GenerateContent(t.Context(), tt.req, true)) if (err != nil) != tt.wantErr { t.Errorf("Model.GenerateStream() error = %v, wantErr %v", err, tt.wantErr) return } if diff := cmp.Diff(tt.want, got.PartialText); diff != "" { t.Errorf("Model.GenerateStream() = %v, want %v\ndiff(-want +got):\n%v", got.PartialText, tt.want, diff) } // Since we are expecting GenerateStream to aggregate partial events, the text should be the same if diff := cmp.Diff(tt.want, got.FinalText); diff != "" { t.Errorf("Model.GenerateStream() = %v, want %v\ndiff(-want +got):\n%v", got.FinalText, tt.want, diff) } }) } } func TestModel_TrackingHeaders(t *testing.T) { tests := []struct { name string useVertex bool }{ {"vertex_enabled", true}, {"vertex_disabled", false}, } for _, tt := range tests { t.Run("verifies_headers_are_set_"+tt.name, func(t *testing.T) { t.Setenv("GOOGLE_GENAI_USE_VERTEXAI", strconv.FormatBool(tt.useVertex)) httpRecordFilename := filepath.Join("testdata", strings.ReplaceAll(t.Name(), "/", "_")+".httprr") baseTransport, err := testutil.NewGeminiTransport(httpRecordFilename) if err != nil { t.Fatal(err) } headersChecked := false interceptor := &headerInterceptor{ base: baseTransport, check: func(req *http.Request) { headersChecked = true // Verify that standard tracking headers are present. // The exact expected values for these may need adjustment based on // the specific implementation of the tracking logic. if len(req.Header.Values("User-Agent")) != 1 { t.Errorf("User-Agent header should have exactly one value, but got %v", req.Header.Values("User-Agent")) } if len(req.Header.Values("x-goog-api-client")) != 1 { t.Errorf("x-goog-api-client header should have exactly one value, but got %v", req.Header.Values("x-goog-api-client")) } if ua := req.Header.Get("User-Agent"); !strings.Contains(ua, "google-adk/") || !strings.Contains(ua, "gl-go/") { t.Errorf("User-Agent header should contain both 'google-adk/' and 'gl-go/', but got: %q", ua) } if xgac := req.Header.Get("x-goog-api-client"); !strings.Contains(xgac, "google-adk/") || !strings.Contains(xgac, "gl-go/") { t.Errorf("x-goog-api-client header should contain both 'google-adk/' and 'gl-go/', but got: %q", xgac) } }, } apiKey := "" if recording, _ := httprr.Recording(httpRecordFilename); !recording { apiKey = "fakekey" } cfg := &genai.ClientConfig{ HTTPClient: &http.Client{Transport: interceptor}, APIKey: apiKey, } geminiModel, err := NewModel(t.Context(), "gemini-2.0-flash", cfg) if err != nil { t.Fatal(err) } // Trigger a request to fire the interceptor. // We don't strictly care about the success of the call, only that it was attempted with headers. req := &model.LLMRequest{Contents: genai.Text("ping")} for _, err := range geminiModel.GenerateContent(t.Context(), req, false) { if err != nil { t.Logf("GenerateContent finished with error (expected if no recording exists): %v", err) } } if !headersChecked { t.Error("HTTP request was not intercepted; headers not verified") } }) } } // TestModel_NoSideEffects verifies that NewModel does not modify the passed http.Client. func TestModel_NoSideEffects(t *testing.T) { // Create a custom transport to identify the client originalTransport := &http.Transport{} httpClient := &http.Client{ Transport: originalTransport, } cfg := &genai.ClientConfig{ HTTPClient: httpClient, APIKey: "fake-api-key", } // We expect NewModel to fail because of the fake API key (or network), // but we only care about the side effects on httpClient. _, _ = NewModel(t.Context(), "gemini-2.0-flash", cfg) if httpClient.Transport != originalTransport { t.Errorf("NewModel modified the passed http.Client.Transport; got %v, want %v", httpClient.Transport, originalTransport) } } func TestModel_RespectsRequestModel(t *testing.T) { tests := []struct { name string constructorName string reqModel string wantInURL string }{ { name: "uses_constructor_name_when_req_model_empty", constructorName: "gemini-2.5-flash", reqModel: "", wantInURL: "gemini-2.5-flash", }, { name: "uses_req_model_when_set", constructorName: "gemini-2.5-flash", reqModel: "gemini-2.0-flash", wantInURL: "gemini-2.0-flash", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var capturedURL string interceptor := &headerInterceptor{ check: func(req *http.Request) { capturedURL = req.URL.Path }, } cfg := &genai.ClientConfig{ HTTPClient: &http.Client{Transport: interceptor}, APIKey: "fakekey", } geminiModel, err := NewModel(t.Context(), tt.constructorName, cfg) if err != nil { t.Fatal(err) } req := &model.LLMRequest{ Model: tt.reqModel, Contents: genai.Text("ping"), } for range geminiModel.GenerateContent(t.Context(), req, false) { } if capturedURL == "" { t.Fatal("HTTP request was not intercepted") } if !strings.Contains(capturedURL, tt.wantInURL) { t.Errorf("URL path = %q, want it to contain %q", capturedURL, tt.wantInURL) } }) } } // TextResponse holds the concatenated text from a response stream, // separated into partial and final parts. type TextResponse struct { // PartialText is the full text concatenated from all partial (streaming) responses. PartialText string // FinalText is the full text concatenated from all final (non-partial) responses. FinalText string } // readResponse transforms a sequence into a TextResponse, concatenating the text value of the response parts // depending on the readPartial value it will only concatenate the text of partial events or the text of non partial events func readResponse(s iter.Seq2[*model.LLMResponse, error]) (TextResponse, error) { var partialBuilder, finalBuilder strings.Builder var result TextResponse for resp, err := range s { if err != nil { // Return what we have so far, along with the error. result.PartialText = partialBuilder.String() result.FinalText = finalBuilder.String() return result, err } if resp.Content == nil || len(resp.Content.Parts) == 0 { return result, fmt.Errorf("encountered an empty response: %v", resp) } text := resp.Content.Parts[0].Text if resp.Partial { partialBuilder.WriteString(text) } else { finalBuilder.WriteString(text) } } result.PartialText = partialBuilder.String() result.FinalText = finalBuilder.String() return result, nil } // headerInterceptor is a http.RoundTripper that executes a check function on the request // before delegating to the base transport. type headerInterceptor struct { base http.RoundTripper check func(*http.Request) } func (h *headerInterceptor) RoundTrip(req *http.Request) (*http.Response, error) { if h.check != nil { h.check(req) } if h.base == nil { return http.DefaultTransport.RoundTrip(req) } return h.base.RoundTrip(req) } ================================================ FILE: model/gemini/testdata/TestModel_GenerateStream_ok.httprr ================================================ httprr trace v1 375 769 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 129 Content-Type: application/json {"contents":[{"parts":[{"text":"What is the capital of France? One word."}],"role":"user"}],"generationConfig":{"temperature":0}}HTTP/2.0 200 OK Connection: close Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Disposition: attachment Content-Type: text/event-stream Date: Fri, 20 Feb 2026 12:38:32 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=786 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"content": {"parts": [{"text": "Paris"}],"role": "model"},"finishReason": "STOP","index": 0}],"usageMetadata": {"promptTokenCount": 11,"candidatesTokenCount": 1,"totalTokenCount": 45,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 11}],"thoughtsTokenCount": 33},"modelVersion": "gemini-2.5-flash","responseId": "yFWYabnBB8Wg1e8P3ZTdiAY"} ================================================ FILE: model/gemini/testdata/TestModel_Generate_ok.httprr ================================================ httprr trace v1 361 904 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 129 Content-Type: application/json {"contents":[{"parts":[{"text":"What is the capital of France? One word."}],"role":"user"}],"generationConfig":{"temperature":0}}HTTP/2.0 200 OK Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: application/json; charset=UTF-8 Date: Fri, 20 Feb 2026 12:38:32 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1173 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Paris" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 11, "candidatesTokenCount": 1, "totalTokenCount": 46, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 11 } ], "thoughtsTokenCount": 34 }, "modelVersion": "gemini-2.5-flash", "responseId": "xlWYafXAOKSf1e8PpcODiAg" } ================================================ FILE: model/gemini/testdata/TestModel_TrackingHeaders_verifies_headers_are_set_vertex_disabled.httprr ================================================ httprr trace v1 309 930 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 78 Content-Type: application/json {"contents":[{"parts":[{"text":"ping"}],"role":"user"}],"generationConfig":{}}HTTP/2.0 200 OK Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: application/json; charset=UTF-8 Date: Fri, 20 Feb 2026 12:38:35 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=2945 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Pong! How can I help you today?" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 2, "candidatesTokenCount": 9, "totalTokenCount": 469, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 2 } ], "thoughtsTokenCount": 458 }, "modelVersion": "gemini-2.5-flash", "responseId": "yFWYaYucO4a4vr0PqICv0Aw" } ================================================ FILE: model/gemini/testdata/TestModel_TrackingHeaders_verifies_headers_are_set_vertex_enabled.httprr ================================================ httprr trace v1 312 1269 POST https://aiplatform.googleapis.com/v1beta1/publishers/google/models/gemini-2.0-flash:generateContent HTTP/1.1 Host: aiplatform.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 78 Content-Type: application/json {"contents":[{"parts":[{"text":"ping"}],"role":"user"}],"generationConfig":{}}HTTP/2.0 401 Unauthorized Content-Type: application/json; charset=UTF-8 Date: Mon, 02 Mar 2026 09:40:38 GMT Server: scaffolding on HTTPServer2 Vary: Origin Vary: X-Origin Vary: Referer Www-Authenticate: Bearer realm="https://accounts.google.com/" X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "error": { "code": 401, "message": "API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal. See https://cloud.google.com/docs/authentication", "status": "UNAUTHENTICATED", "details": [ { "@type": "type.googleapis.com/google.rpc.DebugInfo", "detail": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project." }, { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "CREDENTIALS_MISSING", "domain": "googleapis.com", "metadata": { "method": "google.cloud.aiplatform.v1beta1.PredictionService.GenerateContent", "service": "aiplatform.googleapis.com" } } ] } } ================================================ FILE: model/llm.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package model defines the interfaces and data structures for interacting with LLMs. package model import ( "context" "iter" "google.golang.org/genai" ) // LLM provides the access to the underlying LLM. type LLM interface { Name() string GenerateContent(ctx context.Context, req *LLMRequest, stream bool) iter.Seq2[*LLMResponse, error] } // LLMRequest is the raw LLM request. type LLMRequest struct { Model string Contents []*genai.Content Config *genai.GenerateContentConfig Tools map[string]any `json:"-"` } // LLMResponse is the raw LLM response. // It provides the first candidate response from the model if available. type LLMResponse struct { Content *genai.Content CitationMetadata *genai.CitationMetadata GroundingMetadata *genai.GroundingMetadata UsageMetadata *genai.GenerateContentResponseUsageMetadata CustomMetadata map[string]any LogprobsResult *genai.LogprobsResult ModelVersion string // Partial indicates whether the content is part of a unfinished content stream. // Only used for streaming mode and when the content is plain text. // The Runner fully processes only the final non-partial event, partial // events are simply forwarded downstream (eg. to UI for display). Partial bool // Indicates whether the response from the model is complete. // Only used for streaming mode. TurnComplete bool // Flag indicating that LLM was interrupted when generating the content. // Usually it is due to user interruption during a bidi streaming. Interrupted bool ErrorCode string ErrorMessage string FinishReason genai.FinishReason AvgLogprobs float64 } ================================================ FILE: model/llm_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package model_test import ( "reflect" "testing" "google.golang.org/genai" "google.golang.org/adk/internal/llminternal/converters" "google.golang.org/adk/model" ) const ( FinishReasonStop genai.FinishReason = "STOP" FinishReasonSafety genai.FinishReason = "SAFETY" FinishReasonRecitation genai.FinishReason = "RECITATION" ) const ( BlockedReasonSafety genai.BlockedReason = "SAFETY" ) func TestCreateResponse(t *testing.T) { // Pre-defined complex structs for reuse emptyLogprobs := &genai.LogprobsResult{ ChosenCandidates: []*genai.LogprobsResultCandidate{}, TopCandidates: []*genai.LogprobsResultTopCandidates{}, } concreteLogprobs := &genai.LogprobsResult{ ChosenCandidates: []*genai.LogprobsResultCandidate{ {Token: "The", LogProbability: -0.1, TokenID: 123}, {Token: " capital", LogProbability: -0.5, TokenID: 456}, {Token: " of", LogProbability: -0.2, TokenID: 789}, }, TopCandidates: []*genai.LogprobsResultTopCandidates{ {Candidates: []*genai.LogprobsResultCandidate{{Token: "The"}, {Token: "A"}, {Token: "This"}}}, {Candidates: []*genai.LogprobsResultCandidate{{Token: " capital"}, {Token: " city"}, {Token: " main"}}}, }, } partialLogprobs := &genai.LogprobsResult{ ChosenCandidates: []*genai.LogprobsResultCandidate{ {Token: "Hello", LogProbability: -0.05, TokenID: 111}, {Token: " world", LogProbability: -0.8, TokenID: 222}, }, TopCandidates: []*genai.LogprobsResultTopCandidates{}, } citationMeta := &genai.CitationMetadata{ Citations: []*genai.Citation{{StartIndex: 0, EndIndex: 10, URI: "https://example.com"}}, } testCases := []struct { name string input genai.GenerateContentResponse want model.LLMResponse }{ { name: "CreateWithLogprobs", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.75, LogprobsResult: emptyLogprobs, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.75, LogprobsResult: emptyLogprobs, }, }, { name: "CreateWithoutLogprobs", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, }, }, { name: "CreateErrorCaseWithLogprobs", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ FinishReason: FinishReasonSafety, FinishMessage: "Safety filter triggered", AvgLogprobs: -2.1, }}, }, want: model.LLMResponse{ ErrorCode: string(FinishReasonSafety), ErrorMessage: "Safety filter triggered", AvgLogprobs: -2.1, FinishReason: FinishReasonSafety, }, }, { name: "CreateNoCandidates", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{}, PromptFeedback: &genai.GenerateContentResponsePromptFeedback{ BlockReason: BlockedReasonSafety, BlockReasonMessage: "Prompt blocked for safety", }, }, want: model.LLMResponse{ ErrorCode: string(BlockedReasonSafety), ErrorMessage: "Prompt blocked for safety", }, }, { name: "CreateWithConcreteLogprobsResult", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "The capital of France is Paris."}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.27, LogprobsResult: concreteLogprobs, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "The capital of France is Paris."}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.27, LogprobsResult: concreteLogprobs, }, }, { name: "CreateWithPartial*genai.LogprobsResult", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Hello world"}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.425, LogprobsResult: partialLogprobs, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Hello world"}}}, FinishReason: FinishReasonStop, AvgLogprobs: -0.425, LogprobsResult: partialLogprobs, }, }, { name: "CreateWithCitationMetadata", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, CitationMetadata: citationMeta, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, CitationMetadata: citationMeta, }, }, { name: "CreateWithoutCitationMetadata", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, }}, }, want: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{{Text: "Response text"}}}, FinishReason: FinishReasonStop, }, }, { name: "CreateErrorCaseWithCitationMetadata", input: genai.GenerateContentResponse{ Candidates: []*genai.Candidate{{ FinishReason: FinishReasonRecitation, FinishMessage: "Response blocked due to recitation triggered", CitationMetadata: citationMeta, }}, }, want: model.LLMResponse{ ErrorCode: string(FinishReasonRecitation), ErrorMessage: "Response blocked due to recitation triggered", CitationMetadata: citationMeta, FinishReason: FinishReasonRecitation, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := converters.Genai2LLMResponse(&tc.input) if tc.want.AvgLogprobs != got.AvgLogprobs { t.Errorf("AvgLogprobs mismatch: want %f, got %f", tc.want.AvgLogprobs, got.AvgLogprobs) } if got.ErrorCode != tc.want.ErrorCode { t.Errorf("ErrorCode mismatch: want %v, got %v", tc.want.ErrorCode, got.ErrorCode) } if got.ErrorMessage != tc.want.ErrorMessage { t.Errorf("ErrorMessage mismatch: want '%s', got '%s'", tc.want.ErrorMessage, got.ErrorMessage) } if got.FinishReason != tc.want.FinishReason { t.Errorf("FinishReason mismatch: want %s, got %s", tc.want.FinishReason, got.FinishReason) } // Use DeepEqual for complex nested structs if !reflect.DeepEqual(got.Content, tc.want.Content) { t.Errorf("Content mismatch: want %+v, got %+v", tc.want.Content, got.Content) } if !reflect.DeepEqual(got.LogprobsResult, tc.want.LogprobsResult) { t.Errorf("*genai.LogprobsResult mismatch: want %+v, got %+v", tc.want.LogprobsResult, got.LogprobsResult) } if !reflect.DeepEqual(got.CitationMetadata, tc.want.CitationMetadata) { t.Errorf("CitationMetadata mismatch: want %+v, got %+v", tc.want.CitationMetadata, got.CitationMetadata) } }) } } ================================================ FILE: plugin/functioncallmodifier/integration_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package functioncallmodifier_test import ( "fmt" "path/filepath" "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model/gemini" "google.golang.org/adk/plugin" "google.golang.org/adk/plugin/functioncallmodifier" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" "google.golang.org/adk/tool/functiontool" ) //go:generate go test -v -httprecord=testdata/.*\.httprr func TestPluginCallbackIntegration(t *testing.T) { functionTool, err := functiontool.New(functiontool.Config{ Name: "other_tool", }, okFunc) if err != nil { t.Fatalf("functiontool.New failed: %v", err) } testCases := []struct { name string tools func(agent.Agent) []tool.Tool wantSkillStateValue string wantRationaleStateValue string shouldHaveSkillState bool shouldHaveRationaleState bool }{ { name: "no relevant tools", tools: func(a agent.Agent) []tool.Tool { return []tool.Tool{functionTool} }, shouldHaveSkillState: false, shouldHaveRationaleState: false, }, { name: "agent tool default schema", tools: func(a agent.Agent) []tool.Tool { agentToolDefault := agenttool.New(a, nil) return []tool.Tool{agentToolDefault} }, wantSkillStateValue: "add", wantRationaleStateValue: "The user wants to add two numbers, and the calculator tool has an 'add' skill that can perform this operation. Providing the request as '2+2' and explicitly setting the skill_id to 'add' should allow the calculator to correctly perform the addition.", shouldHaveSkillState: true, shouldHaveRationaleState: true, }, { name: "transfer to agent tool", tools: func(a agent.Agent) []tool.Tool { return []tool.Tool{} }, wantSkillStateValue: "add", wantRationaleStateValue: "The user is asking to add two numbers, and the calculator agent has an add skill.", shouldHaveSkillState: true, shouldHaveRationaleState: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { httpRecordFilename := filepath.Join("testdata", strings.ReplaceAll(t.Name(), "/", "_")+".httprr") model, err := gemini.NewModel(t.Context(), "gemini-2.5-flash", testutil.NewGeminiTestClientConfig(t, httpRecordFilename)) if err != nil { t.Fatalf("gemini.NewModel failed: %v", err) } calc, err := llmagent.New(llmagent.Config{ Name: "calculator", Description: "calculator agent\n Skills: add, subtract, multiply, divide", Instruction: "You are a calculator agent. You can calculate numbers.", Model: model, }) if err != nil { t.Fatalf("NewLLMAgent calculator failed: %v", err) } tools := tc.tools(calc) subAgents := []agent.Agent{} if len(tools) == 0 { subAgents = append(subAgents, calc) } a, err := llmagent.New(llmagent.Config{ Name: "transfer_agent", Description: "transfer agent", Instruction: "You are a transfer agent. You can transfer to other agents using your tools.", Model: model, Tools: tools, SubAgents: subAgents, }) if err != nil { t.Fatalf("NewLLMAgent failed: %v", err) } functionCallModifierPlugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{ Predicate: func(toolName string) bool { return toolName == "transfer_to_agent" || toolName == "calculator" }, Args: map[string]*genai.Schema{ "skill_id": { Description: "The specific skill to be utilized by the agent.", Type: "STRING", }, "rationale": { Description: "The reasoning behind selecting this agent and skill.", Type: "STRING", }, }, OverrideDescription: func(originalDescription string) string { return fmt.Sprintf("This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s", originalDescription) }, }) if err != nil { t.Fatalf("New plugin failed: %v", err) } pluginConfig := runner.PluginConfig{ Plugins: []*plugin.Plugin{functionCallModifierPlugin}, } appName := "test_app" sessionService := session.InMemoryService() _, err = sessionService.Create(t.Context(), &session.CreateRequest{ AppName: appName, UserID: "id", SessionID: "test_session", }) if err != nil { t.Fatalf("sessionService.Create failed: %v", err) } r, err := runner.New(runner.Config{ AppName: appName, Agent: a, SessionService: sessionService, PluginConfig: pluginConfig, }) if err != nil { t.Fatalf("NewRunner failed: %v", err) } msg := genai.NewContentFromText("Can you add 2 and 2?", "user") stream := r.Run(t.Context(), "id", "test_session", msg, agent.RunConfig{StreamingMode: agent.StreamingModeNone}) events, err := testutil.CollectEvents(stream) if err != nil { t.Fatalf("CollectEvents failed: %v", err) } fcId := "" // check function calls don't include skill_id and rationale for _, event := range events { for _, part := range event.Content.Parts { if part.FunctionCall != nil { fc := part.FunctionCall if fc.Args["skill_id"] != nil || fc.Args["rationale"] != nil { t.Errorf("function call includes skill_id or rationale: %v", fc) } fcId = fc.ID } } } // check if state includes skill_id and rationale resp, err := sessionService.Get(t.Context(), &session.GetRequest{ AppName: appName, UserID: "id", SessionID: "test_session", }) if err != nil { t.Fatalf("sessionService.Get failed: %v", err) } skillIdKey := fmt.Sprintf("%s/skill_id", fcId) skillId, err := resp.Session.State().Get(skillIdKey) if tc.shouldHaveSkillState { if err != nil { t.Fatalf("State().Get(%q) unexpected error: %v", skillIdKey, err) } if skillId != tc.wantSkillStateValue { t.Errorf("want skill_id %q, got %q", tc.wantSkillStateValue, skillId) } } else { if err == nil { t.Errorf("unexpectedly found skill_id in state with value: %q", skillId) } else if err != session.ErrStateKeyNotExist { t.Fatalf("State().Get(%q) unexpected error when expecting key not to exist: %v", skillIdKey, err) } } rationaleKey := fmt.Sprintf("%s/rationale", fcId) rationale, err := resp.Session.State().Get(rationaleKey) if tc.shouldHaveRationaleState { if err != nil { t.Fatalf("State().Get(%q) unexpected error: %v", rationaleKey, err) } if rationale != tc.wantRationaleStateValue { t.Errorf("want rationale %q, got %q", tc.wantRationaleStateValue, rationale) } } else { if err == nil { t.Errorf("unexpectedly found rationale in state with value: %q", rationale) } else if err != session.ErrStateKeyNotExist { t.Fatalf("State().Get(%q) unexpected error when expecting key not to exist: %v", rationaleKey, err) } } }) } } ================================================ FILE: plugin/functioncallmodifier/plugin.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package functioncallmodifier provides a plugin to modify function calls. package functioncallmodifier import ( "fmt" "maps" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/plugin" ) type FunctionCallModifierConfig struct { Predicate func(toolName string) bool Args map[string]*genai.Schema OverrideDescription func(originalDescription string) string } // NewPlugin creates a FunctionCallModifierPlugin. func NewPlugin(cfg FunctionCallModifierConfig) (*plugin.Plugin, error) { return plugin.New(plugin.Config{ Name: "FunctionCallModifierPlugin", BeforeModelCallback: beforeModelCallback(cfg), AfterModelCallback: afterModelCallback(cfg), }) } // MustNewPlugin is like NewPlugin but panics if there is an error. func MustNewPlugin(cfg FunctionCallModifierConfig) *plugin.Plugin { p, err := NewPlugin(cfg) if err != nil { panic(err) } return p } func beforeModelCallback(cfg FunctionCallModifierConfig) func(agent.CallbackContext, *model.LLMRequest) (*model.LLMResponse, error) { return func(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) { if req.Config == nil || len(req.Config.Tools) == 0 { return nil, nil } for _, tool := range req.Config.Tools { if tool.FunctionDeclarations == nil { continue } for _, decl := range tool.FunctionDeclarations { _, exists := req.Tools[decl.Name] if !exists { continue } shouldAddArgs := cfg.Predicate(decl.Name) if shouldAddArgs { if decl.Parameters == nil { decl.Parameters = &genai.Schema{Type: "OBJECT", Properties: map[string]*genai.Schema{}} } if decl.Parameters.Properties == nil { decl.Parameters.Properties = map[string]*genai.Schema{} } maps.Copy(decl.Parameters.Properties, cfg.Args) if cfg.OverrideDescription != nil { decl.Description = cfg.OverrideDescription(decl.Description) } } } } return nil, nil } } func afterModelCallback(cfg FunctionCallModifierConfig) func(agent.CallbackContext, *model.LLMResponse, error) (*model.LLMResponse, error) { return func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { if llmResponseError != nil { return nil, llmResponseError // Pass through error } if llmResponse == nil || llmResponse.Content == nil || len(llmResponse.Content.Parts) == 0 { return llmResponse, nil // No function calls to process } for _, part := range llmResponse.Content.Parts { if fc := part.FunctionCall; fc != nil { if !cfg.Predicate(fc.Name) { continue } for name := range cfg.Args { arg, hasArg := fc.Args[name] if !hasArg { continue } delete(fc.Args, name) stateKey := fmt.Sprintf("%s/%s", fc.ID, name) if err := ctx.State().Set(stateKey, arg); err != nil { return nil, fmt.Errorf("failed to set state: %w", err) } } } } return nil, nil } } ================================================ FILE: plugin/functioncallmodifier/plugin_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package functioncallmodifier_test import ( "context" "errors" "fmt" "maps" "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/plugin/functioncallmodifier" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" "google.golang.org/adk/tool/functiontool" ) type SimpleArgs struct { Num int } func okFunc(_ tool.Context, _ SimpleArgs) (string, error) { return "ok", nil } func TestBeforeModelCallback(t *testing.T) { invCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}) ctx := icontext.NewCallbackContextWithDelta(invCtx, nil, nil) transferTool := &llminternal.TransferToAgentTool{} transferToolDecl := transferTool.Declaration() agentToolDefault := createAgentTool(t, "agent_default", "desc", nil) agentToolDefaultDecl := agentToolDefault.(toolinternal.FunctionTool).Declaration() functionTool, err := functiontool.New(functiontool.Config{ Name: "other_tool", }, okFunc) if err != nil { t.Fatalf("functiontool.New failed: %v", err) } testCases := []struct { name string req *model.LLMRequest wantParams map[string]bool checkTools []string }{ { name: "no relevant tools", req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ Tools: []*genai.Tool{{ FunctionDeclarations: []*genai.FunctionDeclaration{{Name: "other_tool"}}, }}, }, Tools: map[string]any{"other_tool": functionTool}, }, }, { name: "agent tool default schema", req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ Tools: []*genai.Tool{{ FunctionDeclarations: []*genai.FunctionDeclaration{agentToolDefaultDecl}, }}, }, Tools: map[string]any{"agent_default": agentToolDefault}, }, wantParams: map[string]bool{"request": true, "skill_id": true, "rationale": true}, checkTools: []string{"agent_default"}, }, { name: "transfer to agent tool", req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ Tools: []*genai.Tool{{ FunctionDeclarations: []*genai.FunctionDeclaration{transferToolDecl}, }}, }, Tools: map[string]any{"transfer_to_agent": transferTool}, }, wantParams: map[string]bool{"agent_name": true, "skill_id": true, "rationale": true}, checkTools: []string{"transfer_to_agent"}, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { plugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{ Predicate: func(toolName string) bool { return toolName == "transfer_to_agent" || toolName == "agent_default" }, Args: map[string]*genai.Schema{ "skill_id": { Description: "The specific skill to be utilized by the agent.", Type: "STRING", }, "rationale": { Description: "The reasoning behind selecting this agent and skill.", Type: "STRING", }, }, OverrideDescription: func(originalDescription string) string { return fmt.Sprintf("This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s", originalDescription) }, }) if err != nil { t.Fatalf("New plugin failed: %v", err) } // Clone req to avoid modification across test cases currentReq := cloneLLMRequest(t, tc.req) beforeModelCallback := plugin.BeforeModelCallback() if _, err := beforeModelCallback(ctx, currentReq); err != nil { t.Fatalf("BeforeModelCallback failed: %v", err) } for _, toolName := range tc.checkTools { decl := findDeclaration(currentReq, toolName) if decl == nil { t.Errorf("Tool %s: Declaration not found in request", toolName) continue } if len(decl.Parameters.Properties) != len(tc.wantParams) { t.Errorf("Tool %s: Expected %d parameters, got %d", toolName, len(tc.wantParams), len(decl.Parameters.Properties)) } params := make(map[string]bool) for k := range decl.Parameters.Properties { params[k] = true } if diff := cmp.Diff(tc.wantParams, params); diff != "" { t.Errorf("Tool %s: Parameter mismatch (-want +got):\n%s", toolName, diff) } if !strings.Contains(decl.Description, "skill-based orchestration") { t.Errorf("Tool %s: Description not updated", toolName) } } }) } } func TestAfterModelCallback(t *testing.T) { testCases := []struct { name string content *genai.Content originalDecls map[string]*genai.FunctionDeclaration wantArgs map[string]any wantSkillStateKey string wantSkillStateValue string wantRationaleStateKey string wantRationaleStateValue string shouldHaveSkillState bool shouldHaveRationaleState bool }{ { name: "no function calls", content: &genai.Content{Parts: []*genai.Part{{Text: "hello"}}}, originalDecls: map[string]*genai.FunctionDeclaration{}, shouldHaveSkillState: false, shouldHaveRationaleState: false, }, { name: "unmodified function call", content: &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{Name: "other_tool", Args: map[string]any{"foo": "bar"}}}}}, originalDecls: map[string]*genai.FunctionDeclaration{}, wantArgs: map[string]any{"foo": "bar"}, shouldHaveSkillState: false, shouldHaveRationaleState: false, }, { name: "agent tool with skill and rationale", content: &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: "fcId", Name: "test_agent", Args: map[string]any{"request": "do", "skill_id": "s1", "rationale": "r1"}}}}}, originalDecls: map[string]*genai.FunctionDeclaration{"test_agent": {Name: "test_agent"}}, wantArgs: map[string]any{"request": "do"}, wantSkillStateKey: "fcId/skill_id", wantSkillStateValue: "s1", wantRationaleStateKey: "fcId/rationale", wantRationaleStateValue: "r1", shouldHaveSkillState: true, shouldHaveRationaleState: true, }, { name: "agent tool with only skill_id", content: &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: "fcId", Name: "test_agent", Args: map[string]any{"request": "do", "skill_id": "s1"}}}}}, originalDecls: map[string]*genai.FunctionDeclaration{"test_agent": {Name: "test_agent"}}, wantArgs: map[string]any{"request": "do"}, wantSkillStateKey: "fcId/skill_id", wantSkillStateValue: "s1", shouldHaveSkillState: true, shouldHaveRationaleState: false, }, { name: "agent tool without skill/rationale", content: &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: "fcId", Name: "test_agent", Args: map[string]any{"request": "do"}}}}}, originalDecls: map[string]*genai.FunctionDeclaration{"test_agent": {Name: "test_agent"}}, wantArgs: map[string]any{"request": "do"}, shouldHaveSkillState: false, shouldHaveRationaleState: false, }, { name: "transfer tool with skill and rationale", content: &genai.Content{Parts: []*genai.Part{{FunctionCall: &genai.FunctionCall{ID: "fcId", Name: "transfer_to_agent", Args: map[string]any{"agent_name": "a1", "skill_id": "s2", "rationale": "r2"}}}}}, originalDecls: map[string]*genai.FunctionDeclaration{"transfer_to_agent": {Name: "transfer_to_agent"}}, wantArgs: map[string]any{"agent_name": "a1"}, wantSkillStateKey: "fcId/skill_id", wantSkillStateValue: "s2", wantRationaleStateKey: "fcId/rationale", wantRationaleStateValue: "r2", shouldHaveSkillState: true, shouldHaveRationaleState: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { plugin, err := functioncallmodifier.NewPlugin(functioncallmodifier.FunctionCallModifierConfig{ Predicate: func(toolName string) bool { return toolName == "transfer_to_agent" || toolName == "test_agent" }, Args: map[string]*genai.Schema{ "skill_id": { Description: "The specific skill to be utilized by the agent.", Type: "STRING", }, "rationale": { Description: "The reasoning behind selecting this agent and skill.", Type: "STRING", }, }, OverrideDescription: func(originalDescription string) string { return fmt.Sprintf("This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. %s", originalDescription) }, }) if err != nil { t.Fatalf("New plugin failed: %v", err) } service := session.InMemoryService() sesResp, err := service.Create(context.Background(), &session.CreateRequest{AppName: "test", UserID: "user", SessionID: "ses1"}) if err != nil { t.Fatalf("Failed to create session: %v", err) } invCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Session: sesResp.Session, }) ctx := icontext.NewCallbackContextWithDelta(invCtx, nil, nil) afterModelCallback := plugin.AfterModelCallback() if _, err := afterModelCallback(ctx, &model.LLMResponse{Content: tc.content}, nil); err != nil { t.Fatalf("AfterModelCallback failed: %v", err) } // Check if args are pruned if len(tc.content.Parts) > 0 { part := tc.content.Parts[0] if part.FunctionCall != nil && tc.wantArgs != nil { if diff := cmp.Diff(tc.wantArgs, part.FunctionCall.Args); diff != "" { t.Errorf("Args mismatch (-want +got):\n%s", diff) } } } // Check session state skillStateValue, err := sesResp.Session.State().Get(tc.wantSkillStateKey) if tc.shouldHaveSkillState { if err != nil { t.Errorf("State().Get(%q) unexpected error: %v", tc.wantSkillStateKey, err) } else { gotState, ok := skillStateValue.(string) if !ok { t.Errorf("State value for key %s is not string: %T", tc.wantSkillStateKey, skillStateValue) } else if diff := cmp.Diff(tc.wantSkillStateValue, gotState); diff != "" { t.Errorf("State value mismatch for key %s (-want +got):\n%s", tc.wantSkillStateKey, diff) } } } else { // Should NOT have state if tc.wantSkillStateKey != "" { _, err := sesResp.Session.State().Get(tc.wantSkillStateKey) if err == nil { // Key WAS found, which is unexpected t.Errorf("Unexpected state key %s found", tc.wantSkillStateKey) } else if !errors.Is(err, session.ErrStateKeyNotExist) { // Unexpected error other than not existing t.Errorf("State().Get(%q) unexpected error when expecting key not to exist: %v", tc.wantSkillStateKey, err) } } } rationaleStateValue, err := sesResp.Session.State().Get(tc.wantRationaleStateKey) if tc.shouldHaveRationaleState { if err != nil { t.Errorf("State().Get(%q) unexpected error: %v", tc.wantRationaleStateKey, err) } else { gotState, ok := rationaleStateValue.(string) if !ok { t.Errorf("State value for key %s is not string: %T", tc.wantRationaleStateKey, rationaleStateValue) } else if diff := cmp.Diff(tc.wantRationaleStateValue, gotState); diff != "" { t.Errorf("State value mismatch for key %s (-want +got):\n%s", tc.wantRationaleStateKey, diff) } } } else { // Should NOT have state if tc.wantRationaleStateKey != "" { _, err := sesResp.Session.State().Get(tc.wantRationaleStateKey) if err == nil { // Key WAS found, which is unexpected t.Errorf("Unexpected state key %s found", tc.wantRationaleStateKey) } else if !errors.Is(err, session.ErrStateKeyNotExist) { // Unexpected error other than not existing t.Errorf("State().Get(%q) unexpected error when expecting key not to exist: %v", tc.wantRationaleStateKey, err) } } } }) } } // Mock agent for testing agenttool type mockAgent struct { agent.Agent name string description string inputSchema *genai.Schema } func (m *mockAgent) Name() string { return m.name } func (m *mockAgent) Description() string { return m.description } func (m *mockAgent) InputSchema() *genai.Schema { return m.inputSchema } func createAgentTool(t *testing.T, name, desc string, schema *genai.Schema) tool.Tool { t.Helper() tA := agenttool.New(&mockAgent{name: name, description: desc, inputSchema: schema}, nil) return tA } func findDeclaration(req *model.LLMRequest, toolName string) *genai.FunctionDeclaration { if req.Config == nil { return nil } for _, tool := range req.Config.Tools { for _, decl := range tool.FunctionDeclarations { if decl.Name == toolName { return decl } } } return nil } func cloneLLMRequest(t *testing.T, req *model.LLMRequest) *model.LLMRequest { t.Helper() newReq := &model.LLMRequest{ Tools: make(map[string]any), } if req.Config != nil { newReq.Config = &genai.GenerateContentConfig{} for _, tool := range req.Config.Tools { newTool := &genai.Tool{} for _, decl := range tool.FunctionDeclarations { newDecl := *decl // Shallow copy of declaration if decl.Parameters != nil { newParams := *decl.Parameters // Shallow copy of Schema newParams.Properties = make(map[string]*genai.Schema) for k, v := range decl.Parameters.Properties { prop := *v newParams.Properties[k] = &prop } newDecl.Parameters = &newParams } newTool.FunctionDeclarations = append(newTool.FunctionDeclarations, &newDecl) } newReq.Config.Tools = append(newReq.Config.Tools, newTool) } } // Shallow copy of tool instances maps.Copy(newReq.Tools, req.Tools) return newReq } ================================================ FILE: plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_agent_tool_default_schema.httprr ================================================ httprr trace v1 1101 1715 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 869 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\n Skills: add, subtract, multiply, divide","name":"calculator","parameters":{"properties":{"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"request":{"type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["request"],"type":"OBJECT"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:49 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=962 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "calculator", "args": { "skill_id": "add", "request": "2 + 2", "rationale": "The user is asking to add two numbers, and the calculator tool has an 'add' skill that can perform this operation." } }, "thoughtSignature": "CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 165, "candidatesTokenCount": 52, "totalTokenCount": 298, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 165 } ], "thoughtsTokenCount": 81 }, "modelVersion": "gemini-2.5-flash", "responseId": "LCawaZ-6Bd7ensEP5rH1kAw" } 590 544 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 344 Content-Type: application/json {"contents":[{"parts":[{"text":"2 + 2"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator agent. You can calculate numbers.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"calculator agent\\n Skills: add, subtract, multiply, divide\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:09:49 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=686 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"finishReason": "UNEXPECTED_TOOL_CALL","index": 0}],"usageMetadata": {"promptTokenCount": 50,"totalTokenCount": 50,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 50}]}} 1853 2362 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1620 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"2 + 2"},"name":"calculator"},"thoughtSignature":"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM="}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\n Skills: add, subtract, multiply, divide","name":"calculator","parameters":{"properties":{"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"request":{"type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["request"],"type":"OBJECT"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:51 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1602 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "calculator", "args": { "skill_id": "add", "request": "add 2 and 2", "rationale": "The user wants to add 2 and 2. The calculator tool with the \"add\" skill can perform this operation." } }, "thoughtSignature": "Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 217, "candidatesTokenCount": 54, "totalTokenCount": 459, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 217 } ], "thoughtsTokenCount": 188 }, "modelVersion": "gemini-2.5-flash", "responseId": "LSawaYq0LfH3nsEP2v-88AQ" } 596 544 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 350 Content-Type: application/json {"contents":[{"parts":[{"text":"add 2 and 2"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator agent. You can calculate numbers.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"calculator agent\\n Skills: add, subtract, multiply, divide\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:09:51 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=616 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"finishReason": "UNEXPECTED_TOOL_CALL","index": 0}],"usageMetadata": {"promptTokenCount": 52,"totalTokenCount": 52,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 52}]}} 3262 3170 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 3029 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"2 + 2"},"name":"calculator"},"thoughtSignature":"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM="}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"add 2 and 2"},"name":"calculator"},"thoughtSignature":"Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\n Skills: add, subtract, multiply, divide","name":"calculator","parameters":{"properties":{"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"request":{"type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["request"],"type":"OBJECT"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:55 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=3295 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "calculator", "args": { "rationale": "The user wants to add two numbers, and the calculator tool has an 'add' skill that can perform this operation. Providing the request as '2+2' and explicitly setting the skill_id to 'add' should allow the calculator to correctly perform the addition.", "request": "2+2", "skill_id": "add" } }, "thoughtSignature": "CrQKAb4+9vsHtyTo1nFULUKtvO66j3fZQoZhe7BVlgQ5jJOI4OJk7G/mDXeq5RGaUnloSH+S55e6wxRWzjtSaCkumrvNYnCLf8iKqy9Anz979Its9x6Fc3lBT0BHKhkGboq7FLuixWOVdgKM68GYDkIY/qYUg+koPL4nQo22tPNaRG0P94MEaglrTtPbSCDsCSpq8YFshLBT4Yago871D++bJnThzCBvOKD0eRnQnx7Pz+nHbWntijrvA9gTQ39UMJ7dduCJAYHw3L01F4hODoDn/McB/Rh7RNhZmUycqxRMwQI0eR1eUgzgkNeMcl3+iS1Q/Vt9BINp3PTjH7OQcO8233jItueR0u6lNtc75RYfGnbk1ydG873CHTnV3RT2Lfpag8g+pn5TIoDv2yKdP4u2nHviZs4SVDGFOH28/idoQhSiH8j6w9kgYRHiMvProJmytTihggqyFs6dHZo632RKu2lm3bl0rFG/UdVMNZEK6nqNwF2e7ksqqY2wwy1z/P/nXNuFzqV34pRplQtYPYXanvXdb5wHwt0zsA4bPD+ba8TVspCzkrMZVNs9+EUyK/jx+hDGRbyMRX52TRFPbVYYzAhJVB4QcTxMxRB0ATO2YYkpzr7hUeFQ9dxqsXIuMW/RqP+A4343JpGOd1IMZN9w0DiorYiYv6RO34Gu/IlvA4flqfsGTznL9szU8lZ1lMV8C9k7Buyx9vpwAcHbmt/QojAqj/uIxH6P1dbfCaob6sNXtjqlAI+mS2mDs+sZkkYxwtvDy/JZtNksm2eubD5mIMHp1Ca2xmBG5hWnq+2z2IreiywUVHdB8GaI6Pb0e2+vVk1jl09OVVTYebcFl7Q/2l9pV4IPoCwNnbqkbT2zdV6UEQtlp2ge+Ayd7mPSDdZto31Hk+HlmWr767s6zlP/5G3YcLN+FiJllFBRo2kvzpNfFCWHsuwn6cAiq4JvuHgXwZNNJaXueUU5YpbgfRN45cHozFX3G7M+cN4ld+ndxyD4pru1Z1APh/wXMjLfmSAjzmwZ45h13l8RV6AkazAvle1g/zVvqL1GwYYucpIBHnwOpH77xg7TUiTp/ZOng/FhaNBC3JXy4lTz6RgTpwc4tFtPogOTxUORZIOSgFWN6OQyDia9FNoodXe3UT/esUqCoJNGu+clQ1VhDr0bKW2vrJpRSkWpYMLiZeXNT/PSmqwwN3kil3SxHd3CtJpC9q/VzC4k8dJFzrbQLTwIs8kfzH0Epk732AhK5l9n7EM2OiS6+Wzlw/z2+HZbXl+MHzy+i3mBuyhqCLHm49pJKhI4Ou/O2Q/+w55T3qhS8sgyxK93ybAmdtH37XaL5JBwLRDZhsAAjw2LQJ015iqKPQQAlAwMmF/1+FIcAwPMr9rJtXKPK/BaFLUNC0YuCKr3Q6HHjv8HP+SVejjz7N9hwmu5MXcFt/zkWwbi8iY95kLpaQ/svNtTWp8cOveq23PDt8oVx7RwU07OaW5ej43Nfs09ALRT9XpjajJe8HrTgoOQjJlqAJjv7yCD9Y/+y3IdRXNSE0D3oz8A8HMC/x7lZwLh/ztPVGBP7ezKRxSDKUOTT8onjlhF789hO6X6Xw6Z9Q5PM4M7DG2oXRQcjftlw/PFrxxnl5W0Dxwb9UappLw5tZLtBUZlk7q1lCciKUpXN9VPFXC3XTMqKOWPDnRbdbUdcitPUkiH3rgQy0OV+0g2iHNLhBgIkR5Ei9pFpZht8UPHyd/qFN3Z8RusYxVE0sxc0rM7OI6vKm6xbloT5VBTepDKHhWn" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 271, "candidatesTokenCount": 80, "totalTokenCount": 657, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 271 } ], "thoughtsTokenCount": 306 }, "modelVersion": "gemini-2.5-flash", "responseId": "LyawafntOumakdUP6ZHlkQo" } 588 544 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 342 Content-Type: application/json {"contents":[{"parts":[{"text":"2+2"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator agent. You can calculate numbers.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"calculator agent\\n Skills: add, subtract, multiply, divide\"."}],"role":"user"}}HTTP/2.0 200 OK Connection: close Content-Disposition: attachment Content-Type: text/event-stream Date: Tue, 10 Mar 2026 14:09:55 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=562 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 data: {"candidates": [{"finishReason": "UNEXPECTED_TOOL_CALL","index": 0}],"usageMetadata": {"promptTokenCount": 49,"totalTokenCount": 49,"promptTokensDetails": [{"modality": "TEXT","tokenCount": 49}]}} 5331 2901 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 5098 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"2 + 2"},"name":"calculator"},"thoughtSignature":"CtUCAb4+9vstWkvxauzjmusQV16aWpo/PQ7OMXTl2AAfjcNHrf66VJ+K+vjBB7b/Xc+uQ0ka6jVfHXyert4j2BFnwyrpmmW7Kyrle00NJfDippgXt+eXzPmEQHNLdBbgSSHBSVoRVUV8lRChvlTgACd4ihfJkBi4LA5xutfgcrpe6E/juxhdxO0eBRT/JVLsdVxCCKWogFG+4Bhm7HFpqZvEbALMnRbkEb9lNPI5bKkx0UdwzTFuJCzT8SVcs8a8XGBsaxhMj0gypaidLAy2DyDJOCVTfglxQIn6W+6jF+3OGDFr77o281+RbpfN1iP3BD+A7GUfr9Fn8KE3dyMrzKTfvrvfmvZLABLQEyaVUXUpkF7vgpQFaAi3SjSbv/R9VYmFeAFma9lH3jXcyzTbVfl2VfqR29nEwlHsP/44ECn1j0ZE3r+9aarV7d/nteIt60QLP3pPUIM="}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"add 2 and 2"},"name":"calculator"},"thoughtSignature":"Cr0GAb4+9vv8+09t2pLVTIf043HQXo7KHDiVeK5PoGfqTtNzSgeThEgZuPRE1B+hTr7FnqC77t8OQfHBt1GAmeNtaY0pncAqo6gLv/2/q/nLgOiwdjHMkv9WagOVCr5H/mNnR+zaYI1zzOXpeWkTQQUBaaOdGqo21LBUTUbjzvXVG3uhcZDVW7v7vkiSEFd1cWwJs6acP3UhQMSNT4M8EU8NVmSBd0eIqAcYhNkQYRkxXFuEh3MP+mJFk3w4XyhpIuQgpGp9tFoASKdm0PyCD0YxPbOc+NdBaMcknJxV/rzaorT2iZE39eHgeuveuAU9k6+zo6AXNVuPu+BHrAvRsvt51gH2Je3Lyh4pHsvmYUOSE4vqY1rWC8rdcFgRqsKi8GhKsmI3NK57r0z/f/UlAn3x+Xr5bILB58gp5HQLNAMpmaxZRlIVe3Szz7WXsGu+XIHfUXGgqniC7Dqnl3Y5UEelpeZiIj9+ZnrHXhxssmXT4qRJH0KnAOZ/m9RPsfN8QwYASeq8XA88zhizOvhYHsQSi61HXBU9ZjYND3iXHs/jk09azjS/A9jrxckrcGq2InGpb/+gzwx7rFwMINThItWbHP1EHHP1gt4J47eUJjIQWv0wIvjy5pv1WVUie/mY/QBqCSb0uGMwyGgmrZjC/hv+J7zdZrvnAG9iyNDn4bWz8SiIk/XHJBA7te+akcIQlobIwh5RkOnEf3qURBVNW97qJD2usw1Kl3NIt+5nwTqQpbtDMbMzDuUXQ5lJEnRkQa+tPs8t775QQ3SQN2lXXrUN/DI6EpYLAVlQNnsSiLE9uCkr6y3h2xkxyd1MFETOCIjMMjtZXQiiiDoBxfkzOhlrNE1uKFnCg3q8pavpZ5RoRRO5xyiKGAcXChLMBpGSIekeL4n9NqDRj6QaCv8MhudePqCePwBunypF4W7myDpg91AQsP6Mju8rEGTsRJyaDP26ewfVfhaFYJZxJYxZNtZsTSHiSN/6EJYJqinxhtAqLY6gxwjFXN0SreJr6P6dH1vKizraNa+CwxOSLfidtwnWpobUEBRv2knXrRkSlaVjkJ+Zx1DkqX5qEK0rv+gqat2/8ZmLWhVhAb7vmgHlyA=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"},{"parts":[{"functionCall":{"args":{"request":"2+2"},"name":"calculator"},"thoughtSignature":"CrQKAb4+9vsHtyTo1nFULUKtvO66j3fZQoZhe7BVlgQ5jJOI4OJk7G/mDXeq5RGaUnloSH+S55e6wxRWzjtSaCkumrvNYnCLf8iKqy9Anz979Its9x6Fc3lBT0BHKhkGboq7FLuixWOVdgKM68GYDkIY/qYUg+koPL4nQo22tPNaRG0P94MEaglrTtPbSCDsCSpq8YFshLBT4Yago871D++bJnThzCBvOKD0eRnQnx7Pz+nHbWntijrvA9gTQ39UMJ7dduCJAYHw3L01F4hODoDn/McB/Rh7RNhZmUycqxRMwQI0eR1eUgzgkNeMcl3+iS1Q/Vt9BINp3PTjH7OQcO8233jItueR0u6lNtc75RYfGnbk1ydG873CHTnV3RT2Lfpag8g+pn5TIoDv2yKdP4u2nHviZs4SVDGFOH28/idoQhSiH8j6w9kgYRHiMvProJmytTihggqyFs6dHZo632RKu2lm3bl0rFG/UdVMNZEK6nqNwF2e7ksqqY2wwy1z/P/nXNuFzqV34pRplQtYPYXanvXdb5wHwt0zsA4bPD+ba8TVspCzkrMZVNs9+EUyK/jx+hDGRbyMRX52TRFPbVYYzAhJVB4QcTxMxRB0ATO2YYkpzr7hUeFQ9dxqsXIuMW/RqP+A4343JpGOd1IMZN9w0DiorYiYv6RO34Gu/IlvA4flqfsGTznL9szU8lZ1lMV8C9k7Buyx9vpwAcHbmt/QojAqj/uIxH6P1dbfCaob6sNXtjqlAI+mS2mDs+sZkkYxwtvDy/JZtNksm2eubD5mIMHp1Ca2xmBG5hWnq+2z2IreiywUVHdB8GaI6Pb0e2+vVk1jl09OVVTYebcFl7Q/2l9pV4IPoCwNnbqkbT2zdV6UEQtlp2ge+Ayd7mPSDdZto31Hk+HlmWr767s6zlP/5G3YcLN+FiJllFBRo2kvzpNfFCWHsuwn6cAiq4JvuHgXwZNNJaXueUU5YpbgfRN45cHozFX3G7M+cN4ld+ndxyD4pru1Z1APh/wXMjLfmSAjzmwZ45h13l8RV6AkazAvle1g/zVvqL1GwYYucpIBHnwOpH77xg7TUiTp/ZOng/FhaNBC3JXy4lTz6RgTpwc4tFtPogOTxUORZIOSgFWN6OQyDia9FNoodXe3UT/esUqCoJNGu+clQ1VhDr0bKW2vrJpRSkWpYMLiZeXNT/PSmqwwN3kil3SxHd3CtJpC9q/VzC4k8dJFzrbQLTwIs8kfzH0Epk732AhK5l9n7EM2OiS6+Wzlw/z2+HZbXl+MHzy+i3mBuyhqCLHm49pJKhI4Ou/O2Q/+w55T3qhS8sgyxK93ybAmdtH37XaL5JBwLRDZhsAAjw2LQJ015iqKPQQAlAwMmF/1+FIcAwPMr9rJtXKPK/BaFLUNC0YuCKr3Q6HHjv8HP+SVejjz7N9hwmu5MXcFt/zkWwbi8iY95kLpaQ/svNtTWp8cOveq23PDt8oVx7RwU07OaW5ej43Nfs09ALRT9XpjajJe8HrTgoOQjJlqAJjv7yCD9Y/+y3IdRXNSE0D3oz8A8HMC/x7lZwLh/ztPVGBP7ezKRxSDKUOTT8onjlhF789hO6X6Xw6Z9Q5PM4M7DG2oXRQcjftlw/PFrxxnl5W0Dxwb9UappLw5tZLtBUZlk7q1lCciKUpXN9VPFXC3XTMqKOWPDnRbdbUdcitPUkiH3rgQy0OV+0g2iHNLhBgIkR5Ei9pFpZht8UPHyd/qFN3Z8RusYxVE0sxc0rM7OI6vKm6xbloT5VBTepDKHhWn"}],"role":"model"},{"parts":[{"functionResponse":{"name":"calculator","response":{"error":"error from sub-agent \"calculator\" (code: \"UNEXPECTED_TOOL_CALL\", message: \"\")"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. calculator agent\n Skills: add, subtract, multiply, divide","name":"calculator","parameters":{"properties":{"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"request":{"type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["request"],"type":"OBJECT"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:58 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=2769 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "I am sorry, I cannot fulfill this request. The calculator tool is not working as expected. I am getting an error when I try to use it.", "thoughtSignature": "CoILAb4+9vudz1XnXdU/nJydig4ktLc5tKK93RRRSGAw17B7QsvCelCuj1MmbmIp0Y4MBE/LsPl4zB2hBMBqgkZdctxik+0oAYyGKoK2VG2FW9xRz+7pRt4v0nFIjZxfuzYSN9ZTzhuu+N15zRS1Ft5yQiJi4BL5SqaFjq30nYNIngIetdFS6ulIP6Fy358MmStiZIezI3XG1dhxPEbIF1Q+oV94UUW9NBXxN50WR0Y5qeAYV/DrvCU2mZRdleXdUmcSv8V+URipKHrPlAlSdL2jdZUEexr+OjL1LBNJ1G+mqYLVk5gOuD1PBFBqCNlwqbflAgWUbfVzCWjcf7ej0jQQ5/Ek3YtxolG+cPUPrU5t7MkTM5BPhoxSE/q5k8/qAaMK06eaSfhGnyhXen2bi1+WjTKiqPlXV6avPDGaEibI2NTFcNeu13/FeeQV2CJSn5/HFItJONpqJJUW/izGlk4374IdENn0HTFK1Y+ap8FJEMJfIXk3NnYpC0K3NgAqOFsWTprK0mWqqadhTJcTnKrZ63rNuPnGWiUisnGSZvNzIFDwY6ADxy8m+ojaALoTDkSC3MexqS1hNQTNBrCuLESW/dkH6LLz0yL6E8k1hclQ0UJsN/HKZk88BgGVZc9ZE84ES5ksE9UMzGYUc6fuxqdwlzbpNfLBOloW8H7l/5Nkdo1QphyMzjfUX0XIoYUIHzjIqy98jWnmWtMipvuKjGVhi4uvX/RJu+lex5xhHadSPRsjbt44+C4g8myGGY/VWzX4fI4F1Q45034RZ4svqeqRldm//ePrWWo6U08bgA2ADOkunLfy62DER3VgmlmLxdA9c9+qf0N3vFiKEmu6jB4IiVPMFSsGAJnq1iID6xy8TwxXoBQkUoHT/ukmPIPJlQ7ghlOkR8ES1c3fQgn9wIaB58p/N6xMsOocflczFvvMuqfALUy3ysCYnuZeSpThOX9MBZfkaNrsgAgjR7oQSSrWg58aFXz1dCFAvulnxgMVKqkAN1yJF9q6aI9NUwViX9OtXY+CJM3TNpVRuQjMBqG3iYDNkvibpzHJr/9fW8qFY4S6yOOFBv/FNGGhN2n+Qd9THqFRo1AnbLJi0U0wefHdrKg/VwO+BwZ14KVfun6mlxR/mmWOaNSABlFfnh0rNnx1Y+Oh6JozQcuKmhGo7SGZYbI5iwMtHzD0tJloOaxZJ4FbCTSaoANiv3SR3rWXJ5FlKQ7WCziePJ3tYADz3J/r+rsBjLix3TiRTIdfKOZJhqC+KViszSCDutEdqJ/V2Iy77FJWTIJmnqHQ9xh8v5pGEsId8aevdW2C58a5Qf+C2VFjRdGvuU+MFKPCUzVAhL1ICc2qhNjLK1t2RcY8hv6kVkQycb11S4llv6y8v8tSzdXRia4TySeMDB7CMAyo8wzuOUzssa7+jy7ChUx2bX++deT6E9Jq2m4OfyuVwYvV/duFWuEbi/Dhu1HdNoGKdrCx0n2a5+vO9g83FAGyMcD0P/kv+fNnvCPOVZDTZZc2dECvenvISWijaZTU/Z6+fQCG3IM2FJIL7OLzP+4Nko9JLZF3z3EQErNN94pc/ZGmxk4YmMs++q3D/sC2Jf/BF8fA8qFrgtgc7l3r1NiplJV7IgIKLD5HLWYIHikjem2i1u3RLAIv2hR0HPgs4uErheBWpvj7QvnAja+CzePzBZHMZjdYEXqzM0I/Jwt3OcUkEO6Iq39NZ5i7rrAYJnvmPUHylR9BfvWSEhdWYaVWmXaPG1gABMmgQ/FL+5QAa6D1KfB4U+0DJP0x9Xco5FQE135ZPBpLFkJ+SnYnxDetZtx01TM/78l56jCmomSfh5HZ6tC2xDVtqTnjV9P79ZzeNRROlqlzbQJY+dbuwWsRBSOqNH+N" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 322, "candidatesTokenCount": 31, "totalTokenCount": 672, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 322 } ], "thoughtsTokenCount": 319 }, "modelVersion": "gemini-2.5-flash", "responseId": "MyawaZWNNPzLkdUPsrHY4Ak" } ================================================ FILE: plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_no_relevant_tools.httprr ================================================ httprr trace v1 799 1427 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 567 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"name":"other_tool","parametersJsonSchema":{"additionalProperties":false,"properties":{"Num":{"type":"integer"}},"required":["Num"],"type":"object"},"responseJsonSchema":{"type":"string"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:48 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=783 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "2 + 2 = 4", "thoughtSignature": "CpADAb4+9vt+i6+qQR9zvUte0JZ0M5mqvUhdXgi2bUStUEEqH545LXdrNyIc9r2VrrE8QCS9rO3AOH4uoa60V3gxcATTMry6j/rHwuza2udWz9q65/YEJljJ4hbz9Uri399vsCHsJnz+81Cb9BJB9Stt9q0R6Yo6jDFV+oNfmw7UZej+SocDq6YvltlrwzboLYN5FYhWhoPnY0GobaNLfu8sgOKSyDqh0D0K5W5RV9ByiZUd2tlJv03Hy9H+XSEXS5r1WyX6xh5jhioTp16+ORB2okWACdzxysRrP+sxGEtBeeF2LXRhVwOCmHp8XIxlN/I/qnj0at8XjoVeEeLqqr+z7QBcT0lu68k7pVh11n7CkFmlhgyeXD/33PSO8JIlLWRejywf0NpyUafI4ftLX57xkfaDxAaBK+wy1UiR1tek8Ab9rRIPPqKOqi1iyQUn/0n8jTNOoxoIgpqE42ZxyKPUN0M1fRntnfHgWxhUTqRNBGU7oYemx9MRsmWob14FE9vt1YKUZhqzUSU8htO6Oq3cqw==" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 83, "candidatesTokenCount": 7, "totalTokenCount": 166, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 83 } ], "thoughtsTokenCount": 76 }, "modelVersion": "gemini-2.5-flash", "responseId": "KyawacSTEqvzkdUPlY6CsAU" } ================================================ FILE: plugin/functioncallmodifier/testdata/TestPluginCallbackIntegration_transfer_to_agent_tool.httprr ================================================ httprr trace v1 1870 1661 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1637 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a transfer agent. You can transfer to other agents using your tools.\n\nYou are an agent. Your internal name is \"transfer_agent\". The description about you is \"transfer agent\".\n\n\nYou have a list of other agents to transfer to:\n\n\nAgent name: calculator\nAgent description: calculator agent\n Skills: add, subtract, multiply, divide\n\n\nIf you are the best to answer the question according to your description,\nyou can answer it.\n\nIf another agent is better for answering the question according to its\ndescription, call `transfer_to_agent` function to transfer the question to that\nagent. When transferring, do not generate any text other than the function\ncall.\n\n**NOTE**: the only available agents for `transfer_to_agent` function are\n`calculator`.\n"}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. Transfer the question to another agent.\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.","name":"transfer_to_agent","parameters":{"properties":{"agent_name":{"description":"the agent name to transfer to","type":"string"},"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["agent_name"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 16:41:17 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=879 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "transfer_to_agent", "args": { "rationale": "The user is asking to add two numbers, and the calculator agent has an add skill.", "skill_id": "add", "agent_name": "calculator" } }, "thoughtSignature": "CrkCAb4+9vuVxYErwo4K564nvFRtZJ5vSCa5BzbEJaYf0xzMasZk38U10MtlOTi99gVWdxlT8dMVfKF2BYIu5FBeuudfzZsDrNs+hGvvYx+k+MAmGi7wYCP+0DtD6vdzrkxpedfYh0bFsUkNNp0jF05wgqh0g4MwzdKf4C9WUvqKpkSUk41SXUaEeVNlNfbTtX+wHJT/Tw3MDFGAssWWlomNsmbjPJMDEP3ozhmvrA5iHm/lGZdGMoBpUU67TPhiFJnqCcQqFMrlkNQJtzhoksTlwhb9pc/GlOqlLma4DmEbBdNLtECU77j8RGshuK0I7cspHuVb6I3MIWSCr61k0A54UvcNmBkC55tyA0JBTpBVe64Y7Dw/jO1d3xuLN/Yt7pIVdglCV47FKJHIEP4LK3RleJHi50Hj+J4PdA==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 330, "candidatesTokenCount": 47, "totalTokenCount": 436, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 330 } ], "thoughtsTokenCount": 59 }, "modelVersion": "gemini-2.5-flash", "responseId": "rEmwaZamPOmakdUP45HlkQo" } 2247 1254 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 2014 Content-Type: application/json {"contents":[{"parts":[{"text":"Can you add 2 and 2?"}],"role":"user"},{"parts":[{"text":"For context:"},{"text":"[transfer_agent] called tool `transfer_to_agent` with parameters: {\"agent_name\":\"calculator\"}"}],"role":"user"},{"parts":[{"text":"For context:"},{"text":"[transfer_agent] `transfer_to_agent` tool returned result: {}"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"You are a calculator agent. You can calculate numbers.\n\nYou are an agent. Your internal name is \"calculator\". The description about you is \"calculator agent\\n Skills: add, subtract, multiply, divide\".\n\n\nYou have a list of other agents to transfer to:\n\n\nAgent name: transfer_agent\nAgent description: transfer agent\n\n\nIf you are the best to answer the question according to your description,\nyou can answer it.\n\nIf another agent is better for answering the question according to its\ndescription, call `transfer_to_agent` function to transfer the question to that\nagent. When transferring, do not generate any text other than the function\ncall.\n\n**NOTE**: the only available agents for `transfer_to_agent` function are\n`transfer_agent`.\n\nIf neither you nor the other agents are best for the question, transfer to your parent agent transfer_agent.\n"}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"This tool can now optionally accept skill_id and rationale parameters to guide skill-based orchestration. Transfer the question to another agent.\nThis tool hands off control to another agent when it's more suitable to answer the user's question according to the agent's description.","name":"transfer_to_agent","parameters":{"properties":{"agent_name":{"description":"the agent name to transfer to","type":"string"},"rationale":{"description":"The reasoning behind selecting this agent and skill.","type":"STRING"},"skill_id":{"description":"The specific skill to be utilized by the agent.","type":"STRING"}},"required":["agent_name"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 16:41:18 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=847 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "2 plus 2 is 4.", "thoughtSignature": "CooCAb4+9vuh3wN99g1wzITVbxOvpWDIn36qoIUkUOy2L68xaVznt2SqQkYLw6W36gial9UelP09PlXYlDJFP4/zZA61mpZJu6noT5snlF2YL/Ygr7XpZ4W6AAtNSSL9hd43tUpLZd58Xktyiosvy2D54dNy1gtKxKkEBCo+0OQr++cFGEAmrkOwfYAxSss1vN+FbG95fI+SpFlulaseBQ+PQmBkJkibK7vk1vdrVqLcgUpxYKzxZaLyS0kbnfSCdh/Ssa8BHsG+u666gVHF/H59ifepCyEZ9wDxYCsWj/L2giI1Qf0ffv0b/bz7fwWx3ysPR5sh8hT7x233ryIgNUoNWp7nx3I3peleTb8=" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 400, "candidatesTokenCount": 8, "totalTokenCount": 459, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 400 } ], "thoughtsTokenCount": 51 }, "modelVersion": "gemini-2.5-flash", "responseId": "rUmwaZLzNJaxkdUP58PwoAk" } ================================================ FILE: plugin/loggingplugin/logging_plugin.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package loggingplugin import ( "fmt" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) // New creates an instance of the logging plugin. // // This plugin helps print all critical events in the console. It is not a // replacement of existing logging in ADK. It rather helps terminal based // debugging by showing all logs in the console, and serves as a simple demo for // everyone to leverage when developing new plugins. // // This plugin helps users track the invocation status by logging: // - User messages and invocation context // - Agent execution flow // - LLM requests and responses // - Tool calls with arguments and results // - Events and final responses // - Errors during model and tool execution func New(name string) (*plugin.Plugin, error) { if name == "" { name = "logging_plugin" } p := &loggingPlugin{name: name} return plugin.New(plugin.Config{ Name: name, OnUserMessageCallback: p.onUserMessage, BeforeRunCallback: p.beforeRun, OnEventCallback: p.onEvent, AfterRunCallback: p.afterRun, BeforeAgentCallback: p.beforeAgent, AfterAgentCallback: p.afterAgent, BeforeModelCallback: p.beforeModel, AfterModelCallback: p.afterModel, OnModelErrorCallback: p.onModelError, BeforeToolCallback: p.beforeTool, AfterToolCallback: p.afterTool, OnToolErrorCallback: p.onToolError, }) } // MustNew is like New but panics if there is an error. func MustNew(name string) *plugin.Plugin { p, err := New(name) if err != nil { panic(err) } return p } type loggingPlugin struct { name string } func (p *loggingPlugin) log(msg string) { // ANSI color codes: \033[90m for grey, \033[0m to reset fmt.Printf("\033[90m[%s] %s\033[0m\n", p.name, msg) } func (p *loggingPlugin) formatContent(content *genai.Content, maxLength int) string { if content == nil || len(content.Parts) == 0 { return "None" } var parts []string for _, part := range content.Parts { if part.Text != "" { text := strings.TrimSpace(part.Text) if len(text) > maxLength { text = text[:maxLength] + "..." } parts = append(parts, fmt.Sprintf("text: '%s'", text)) } else if part.FunctionCall != nil { parts = append(parts, fmt.Sprintf("function_call: %s", part.FunctionCall.Name)) } else if part.FunctionResponse != nil { parts = append(parts, fmt.Sprintf("function_response: %s", part.FunctionResponse.Name)) } else if part.CodeExecutionResult != nil { parts = append(parts, "code_execution_result") } else { parts = append(parts, "other_part") } } return strings.Join(parts, " | ") } func (p *loggingPlugin) formatArgs(args map[string]any, maxLength int) string { if len(args) == 0 { return "{}" } formatted := fmt.Sprintf("%v", args) if len(formatted) > maxLength { formatted = formatted[:maxLength] + "...}" } return formatted } func (p *loggingPlugin) onUserMessage(ctx agent.InvocationContext, userMessage *genai.Content) (*genai.Content, error) { p.log("🚀 USER MESSAGE RECEIVED") p.log(fmt.Sprintf(" Invocation ID: %s", ctx.InvocationID())) p.log(fmt.Sprintf(" Session ID: %s", ctx.Session().ID())) p.log(fmt.Sprintf(" User ID: %s", ctx.Session().UserID())) p.log(fmt.Sprintf(" App Name: %s", ctx.Session().AppName())) agentName := "Unknown" if ctx.Agent() != nil { agentName = ctx.Agent().Name() } p.log(fmt.Sprintf(" Root Agent: %s", agentName)) p.log(fmt.Sprintf(" User Content: %s", p.formatContent(userMessage, 200))) if ctx.Branch() != "" { p.log(fmt.Sprintf(" Branch: %s", ctx.Branch())) } return nil, nil } func (p *loggingPlugin) beforeRun(ctx agent.InvocationContext) (*genai.Content, error) { p.log("🏃 INVOCATION STARTING") p.log(fmt.Sprintf(" Invocation ID: %s", ctx.InvocationID())) agentName := "Unknown" if ctx.Agent() != nil { agentName = ctx.Agent().Name() } p.log(fmt.Sprintf(" Starting Agent: %s", agentName)) return nil, nil } func (p *loggingPlugin) onEvent(ctx agent.InvocationContext, event *session.Event) (*session.Event, error) { p.log("📢 EVENT YIELDED") p.log(fmt.Sprintf(" Event ID: %s", event.ID)) p.log(fmt.Sprintf(" Author: %s", event.Author)) p.log(fmt.Sprintf(" Content: %s", p.formatContent(event.Content, 200))) p.log(fmt.Sprintf(" Final Response: %v", event.IsFinalResponse())) var funcCalls []string var funcResponses []string if event.Content != nil { for _, part := range event.Content.Parts { if part.FunctionCall != nil { funcCalls = append(funcCalls, part.FunctionCall.Name) } if part.FunctionResponse != nil { funcResponses = append(funcResponses, part.FunctionResponse.Name) } } } if len(funcCalls) > 0 { p.log(fmt.Sprintf(" Function Calls: %v", funcCalls)) } if len(funcResponses) > 0 { p.log(fmt.Sprintf(" Function Responses: %v", funcResponses)) } if len(event.LongRunningToolIDs) > 0 { p.log(fmt.Sprintf(" Long Running Tools: %v", event.LongRunningToolIDs)) } return nil, nil } func (p *loggingPlugin) afterRun(ctx agent.InvocationContext) { p.log("✅ INVOCATION COMPLETED") p.log(fmt.Sprintf(" Invocation ID: %s", ctx.InvocationID())) agentName := "Unknown" if ctx.Agent() != nil { agentName = ctx.Agent().Name() } p.log(fmt.Sprintf(" Final Agent: %s", agentName)) } func (p *loggingPlugin) beforeAgent(ctx agent.CallbackContext) (*genai.Content, error) { p.log("🤖 AGENT STARTING") p.log(fmt.Sprintf(" Agent Name: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Invocation ID: %s", ctx.InvocationID())) if ctx.Branch() != "" { p.log(fmt.Sprintf(" Branch: %s", ctx.Branch())) } return nil, nil } func (p *loggingPlugin) afterAgent(ctx agent.CallbackContext) (*genai.Content, error) { p.log("🤖 AGENT COMPLETED") p.log(fmt.Sprintf(" Agent Name: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Invocation ID: %s", ctx.InvocationID())) return nil, nil } func (p *loggingPlugin) beforeModel(ctx agent.CallbackContext, req *model.LLMRequest) (*model.LLMResponse, error) { p.log("🧠 LLM REQUEST") modelName := "default" if req.Model != "" { modelName = req.Model } p.log(fmt.Sprintf(" Model: %s", modelName)) p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) if req.Config != nil && req.Config.SystemInstruction != nil && len(req.Config.SystemInstruction.Parts) > 0 { // Assuming SystemInstruction is a Content object with parts sysInstruction := "" for _, part := range req.Config.SystemInstruction.Parts { sysInstruction += part.Text } if len(sysInstruction) > 200 { sysInstruction = sysInstruction[:200] + "..." } p.log(fmt.Sprintf(" System Instruction: '%s'", sysInstruction)) } if len(req.Tools) > 0 { var toolNames []string for name := range req.Tools { toolNames = append(toolNames, name) } p.log(fmt.Sprintf(" Available Tools: %v", toolNames)) } return nil, nil } func (p *loggingPlugin) afterModel(ctx agent.CallbackContext, resp *model.LLMResponse, err error) (*model.LLMResponse, error) { p.log("🧠 LLM RESPONSE") p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) // If error passed in, log it if err != nil { p.log(fmt.Sprintf(" ❌ ERROR - %v", err)) return nil, nil // Return nil, nil to propagate original error } if resp != nil { if resp.ErrorCode != "" { p.log(fmt.Sprintf(" ❌ ERROR - Code: %s", resp.ErrorCode)) p.log(fmt.Sprintf(" Error Message: %s", resp.ErrorMessage)) } else { p.log(fmt.Sprintf(" Content: %s", p.formatContent(resp.Content, 200))) if resp.Partial { p.log(fmt.Sprintf(" Partial: %v", resp.Partial)) } // TurnComplete is a boolean in Go model p.log(fmt.Sprintf(" Turn Complete: %v", resp.TurnComplete)) } if resp.UsageMetadata != nil { p.log(fmt.Sprintf(" Token Usage - Input: %d, Output: %d", resp.UsageMetadata.PromptTokenCount, resp.UsageMetadata.CandidatesTokenCount)) } } return nil, nil } func (p *loggingPlugin) onModelError(ctx agent.CallbackContext, req *model.LLMRequest, err error) (*model.LLMResponse, error) { p.log("🧠 LLM ERROR") p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Error: %v", err)) return nil, nil } func (p *loggingPlugin) beforeTool(ctx tool.Context, t tool.Tool, args map[string]any) (map[string]any, error) { p.log("🔧 TOOL STARTING") p.log(fmt.Sprintf(" Tool Name: %s", t.Name())) p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Function Call ID: %s", ctx.FunctionCallID())) p.log(fmt.Sprintf(" Arguments: %s", p.formatArgs(args, 300))) return nil, nil } func (p *loggingPlugin) afterTool(ctx tool.Context, t tool.Tool, args, result map[string]any, err error) (map[string]any, error) { p.log("🔧 TOOL COMPLETED") p.log(fmt.Sprintf(" Tool Name: %s", t.Name())) p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Function Call ID: %s", ctx.FunctionCallID())) if err != nil { p.log(fmt.Sprintf(" Error: %v", err)) } else { p.log(fmt.Sprintf(" Result: %s", p.formatArgs(result, 300))) } return nil, nil } func (p *loggingPlugin) onToolError(ctx tool.Context, t tool.Tool, args map[string]any, err error) (map[string]any, error) { p.log("🔧 TOOL ERROR") p.log(fmt.Sprintf(" Tool Name: %s", t.Name())) p.log(fmt.Sprintf(" Agent: %s", ctx.AgentName())) p.log(fmt.Sprintf(" Function Call ID: %s", ctx.FunctionCallID())) p.log(fmt.Sprintf(" Arguments: %s", p.formatArgs(args, 300))) p.log(fmt.Sprintf(" Error: %v", err)) return nil, nil } ================================================ FILE: plugin/plugin.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package plugin provides. package plugin import ( "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/session" ) type Config struct { Name string OnUserMessageCallback OnUserMessageCallback OnEventCallback OnEventCallback BeforeRunCallback BeforeRunCallback AfterRunCallback AfterRunCallback BeforeAgentCallback agent.BeforeAgentCallback AfterAgentCallback agent.AfterAgentCallback BeforeModelCallback llmagent.BeforeModelCallback AfterModelCallback llmagent.AfterModelCallback OnModelErrorCallback llmagent.OnModelErrorCallback BeforeToolCallback llmagent.BeforeToolCallback AfterToolCallback llmagent.AfterToolCallback OnToolErrorCallback llmagent.OnToolErrorCallback CloseFunc func() error } func New(cfg Config) (*Plugin, error) { p := &Plugin{ name: cfg.Name, onUserMessageCallback: cfg.OnUserMessageCallback, onEventCallback: cfg.OnEventCallback, beforeRunCallback: cfg.BeforeRunCallback, afterRunCallback: cfg.AfterRunCallback, beforeAgentCallback: cfg.BeforeAgentCallback, afterAgentCallback: cfg.AfterAgentCallback, beforeModelCallback: cfg.BeforeModelCallback, afterModelCallback: cfg.AfterModelCallback, onModelErrorCallback: cfg.OnModelErrorCallback, beforeToolCallback: cfg.BeforeToolCallback, afterToolCallback: cfg.AfterToolCallback, onToolErrorCallback: cfg.OnToolErrorCallback, closeFunc: cfg.CloseFunc, } // Ensure closeFunc is never nil so p.Close() doesn't panic if p.closeFunc == nil { p.closeFunc = func() error { return nil } } return p, nil } type Plugin struct { name string onUserMessageCallback OnUserMessageCallback onEventCallback OnEventCallback beforeRunCallback BeforeRunCallback afterRunCallback AfterRunCallback beforeAgentCallback agent.BeforeAgentCallback afterAgentCallback agent.AfterAgentCallback beforeModelCallback llmagent.BeforeModelCallback afterModelCallback llmagent.AfterModelCallback onModelErrorCallback llmagent.OnModelErrorCallback beforeToolCallback llmagent.BeforeToolCallback afterToolCallback llmagent.AfterToolCallback onToolErrorCallback llmagent.OnToolErrorCallback closeFunc func() error } // Name returns the name of the plugin. func (p *Plugin) Name() string { return p.name } // Close safely calls the internal close function. func (p *Plugin) Close() error { return p.closeFunc() } // --- Accessors --- func (p *Plugin) OnUserMessageCallback() OnUserMessageCallback { return p.onUserMessageCallback } func (p *Plugin) OnEventCallback() OnEventCallback { return p.onEventCallback } func (p *Plugin) BeforeRunCallback() BeforeRunCallback { return p.beforeRunCallback } func (p *Plugin) AfterRunCallback() AfterRunCallback { return p.afterRunCallback } func (p *Plugin) BeforeAgentCallback() agent.BeforeAgentCallback { return p.beforeAgentCallback } func (p *Plugin) AfterAgentCallback() agent.AfterAgentCallback { return p.afterAgentCallback } func (p *Plugin) BeforeModelCallback() llmagent.BeforeModelCallback { return p.beforeModelCallback } func (p *Plugin) AfterModelCallback() llmagent.AfterModelCallback { return p.afterModelCallback } func (p *Plugin) OnModelErrorCallback() llmagent.OnModelErrorCallback { return p.onModelErrorCallback } func (p *Plugin) BeforeToolCallback() llmagent.BeforeToolCallback { return p.beforeToolCallback } func (p *Plugin) AfterToolCallback() llmagent.AfterToolCallback { return p.afterToolCallback } func (p *Plugin) OnToolErrorCallback() llmagent.OnToolErrorCallback { return p.onToolErrorCallback } type OnUserMessageCallback func(agent.InvocationContext, *genai.Content) (*genai.Content, error) type BeforeRunCallback func(agent.InvocationContext) (*genai.Content, error) type AfterRunCallback func(agent.InvocationContext) type OnEventCallback func(agent.InvocationContext, *session.Event) (*session.Event, error) ================================================ FILE: plugin/plugin_manager_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package plugin_test import ( "errors" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/runner" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) type testCase struct { name string tool func(tool.Context, map[string]any) (map[string]any, error) args map[string]any beforeToolCallbacks []llmagent.BeforeToolCallback afterToolCallbacks []llmagent.AfterToolCallback onToolErrorCallbacks []llmagent.OnToolErrorCallback want map[string]any dontRunBeforeCanonicalCallback bool dontRunAfterCanonicalCallback bool dontRunOnErrorCanonicalCallback bool } func TestCallTool(t *testing.T) { testCases := []testCase{ { name: "tool runs successfully", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, args: map[string]any{"key": "value"}, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "success"}, }, { name: "tool error", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return nil, errors.New("tool error") }, args: map[string]any{"key": "value"}, want: map[string]any{"error": "tool error"}, }, { name: "before callback returns result", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "intercepted"}, nil }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "2nd callback should not be called"}, nil }, }, dontRunOnErrorCanonicalCallback: true, dontRunBeforeCanonicalCallback: true, want: map[string]any{"result": "intercepted"}, }, { name: "before callback returns error", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("before callback error") }, func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("unexpected error") }, }, dontRunBeforeCanonicalCallback: true, want: map[string]any{"error": "before callback error"}, }, { name: "after callback modifies result", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "original"}, nil }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return map[string]any{"result": "modified"}, nil }, }, dontRunAfterCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "modified"}, }, { name: "after callback handles error and are run in symmetrical order", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return nil, errors.New("tool error") }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return map[string]any{"result": "error handled"}, nil } return nil, nil }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { t.Errorf("unexpected call to after tool callback") return map[string]any{"result": "unexpected output"}, nil }, }, dontRunAfterCanonicalCallback: true, want: map[string]any{"result": "error handled"}, }, { name: "after callback returns error and are run in symmetrical order", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, errors.New("after callback error") }, func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { t.Errorf("unexpected call to after tool callback") return nil, errors.New("unexpected error") }, }, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, want: map[string]any{"error": "after callback error"}, }, { name: "no-op callbacks return func results", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { return map[string]any{"result": "success"}, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, nil }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { return nil, nil }, }, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "success"}, }, { name: "before callback result passed to after callback", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return map[string]any{"result": "from_before"}, nil }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if val, ok := result["result"]; !ok || val != "from_before" { return nil, errors.New("unexpected result in after callback") } return map[string]any{"result": "from_after"}, nil }, }, dontRunOnErrorCanonicalCallback: true, dontRunBeforeCanonicalCallback: true, dontRunAfterCanonicalCallback: true, want: map[string]any{"result": "from_after"}, }, { name: "before callback error passed to after callback", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in after callback") } return map[string]any{"result": "error_handled_in_after"}, nil }, }, dontRunBeforeCanonicalCallback: true, dontRunAfterCanonicalCallback: true, want: map[string]any{"result": "error_handled_in_after"}, }, { name: "before callback error passed to on tool error callback", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []llmagent.OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in on tool error callback") } return map[string]any{"result": "error_handled_in_on_tool_error_callback"}, nil }, }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "error_handled_in_on_tool_error_callback"}, }, { name: "before callback error passed to on tool error callback and after tool called", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []llmagent.OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in on tool error callback") } return map[string]any{"result": "error_handled_in_on_tool_error_callback"}, nil }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err != nil { return nil, errors.New("unexpected error in after callback") } return map[string]any{"result": "from_after"}, nil }, }, dontRunAfterCanonicalCallback: true, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "from_after"}, }, { name: "before callback error passed to on tool error callback and passed to after tool called", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []llmagent.OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in on tool error callback") } return nil, errors.New("error_from_on_tool_error") }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_on_tool_error" { return nil, errors.New("unexpected error in after callback") } return nil, errors.New("error_from_after_tool") }, }, dontRunAfterCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunBeforeCanonicalCallback: true, want: map[string]any{"error": "error_from_after_tool"}, }, { name: "before callback error passed to on tool error callback and passed to after tool called and handled", tool: func(ctx tool.Context, args map[string]any) (map[string]any, error) { t.Error("tool should not be called") return nil, nil }, beforeToolCallbacks: []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { return nil, errors.New("error_from_before") }, }, onToolErrorCallbacks: []llmagent.OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_before" { return nil, errors.New("unexpected error in on tool error callback") } return nil, errors.New("error_from_on_tool_error") }, }, afterToolCallbacks: []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil || err.Error() != "error_from_on_tool_error" { return nil, errors.New("unexpected error in after tool callback") } return map[string]any{"result": "error_handled_in_after_tool_callback"}, nil }, }, dontRunAfterCanonicalCallback: true, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, want: map[string]any{"result": "error_handled_in_after_tool_callback"}, }, } for _, tc := range testCases { t.Run(fmt.Sprintf("%s_plugin", tc.name), func(t *testing.T) { maxLen := max(len(tc.beforeToolCallbacks), len(tc.afterToolCallbacks), len(tc.onToolErrorCallbacks)) var plugins []*plugin.Plugin for i := range maxLen { var currentBefore llmagent.BeforeToolCallback var currentAfter llmagent.AfterToolCallback var currentError llmagent.OnToolErrorCallback // 2. Bounds checks: Only assign if i is within the slice limits if i < len(tc.beforeToolCallbacks) { currentBefore = tc.beforeToolCallbacks[i] } if i < len(tc.afterToolCallbacks) { currentAfter = tc.afterToolCallbacks[i] } if i < len(tc.onToolErrorCallbacks) { currentError = tc.onToolErrorCallbacks[i] } p, err := plugin.New(plugin.Config{ Name: fmt.Sprintf("plugin-%d", i), BeforeToolCallback: currentBefore, AfterToolCallback: currentAfter, OnToolErrorCallback: currentError, }) if err != nil { t.Errorf("failed to initialize plugin: %v", err) } plugins = append(plugins, p) } model := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromFunctionCall("testTool", tc.args, genai.RoleModel), }, } ft, err := functiontool.New(functiontool.Config{ Name: "testTool", }, tc.tool) if err != nil { t.Errorf("failed to function tool: %v", err) } onToolErrorCallbacksCalled := false beforeToolCallbacksCalled := false afterToolCallbacksCalled := false onToolErrorCallbacks := []llmagent.OnToolErrorCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { onToolErrorCallbacksCalled = true if tc.dontRunOnErrorCanonicalCallback { t.Error("on tool error should not be called") } return nil, nil }, } beforeToolCallbacks := []llmagent.BeforeToolCallback{ func(ctx tool.Context, tool tool.Tool, args map[string]any) (map[string]any, error) { beforeToolCallbacksCalled = true if tc.dontRunBeforeCanonicalCallback { t.Error("before Tool Callback should not be called") } return nil, nil }, } afterToolCallbacks := []llmagent.AfterToolCallback{ func(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { afterToolCallbacksCalled = true if tc.dontRunAfterCanonicalCallback { t.Error("after Tool Callback should not be called") } return nil, nil }, } agent, err := llmagent.New(llmagent.Config{ Name: "test_agent", Model: model, Tools: []tool.Tool{ft}, OnToolErrorCallbacks: onToolErrorCallbacks, BeforeToolCallbacks: beforeToolCallbacks, AfterToolCallbacks: afterToolCallbacks, }) if err != nil { t.Fatalf("failed to create LLM Agent: %v", err) } testRunner := testutil.NewTestAgentRunnerWithPluginManager(t, agent, runner.PluginConfig{ Plugins: plugins, }) stream := testRunner.Run(t, "session", "user input") parts, err := testutil.CollectParts(stream) if err != nil && err.Error() != "no data" { t.Fatalf("agent returned (%v, %v), want result", parts, err) } var got map[string]any for _, part := range parts { if part.FunctionResponse != nil { got = part.FunctionResponse.Response } } if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("callTool() mismatch (-want +got):\n%s", diff) } if onToolErrorCallbacksCalled == false && tc.dontRunOnErrorCanonicalCallback == false { t.Error("on tool error should be called") } if beforeToolCallbacksCalled == false && tc.dontRunBeforeCanonicalCallback == false { t.Error("before tool should be called") } if afterToolCallbacksCalled == false && tc.dontRunAfterCanonicalCallback == false { t.Error("after tool should be called") } }) } } func TestModelCallbacks(t *testing.T) { t.Parallel() for _, tc := range []struct { name string llmResponses []*genai.Content beforeModelCallbacks []llmagent.BeforeModelCallback afterModelCallbacks []llmagent.AfterModelCallback onModelErrorCallback []llmagent.OnModelErrorCallback wantTexts []string wantErr error dontRunBeforeCanonicalCallback bool dontRunAfterCanonicalCallback bool dontRunOnErrorCanonicalCallback bool }{ { name: "before model callback doesn't modify anything", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, wantTexts: []string{ "hello from model", }, }, { name: "before model callback returns an error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "before model callback returns new LLMResponse", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, nil }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("unexpected text", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantTexts: []string{ "hello from before_model_callback", }, }, { name: "before model callback returns both new LLMResponse and error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "after model callback doesn't modify anything", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, wantTexts: []string{ "hello from model", }, }, { name: "after model callback returns new LLMResponse and are run in symmetrical order", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, nil }, func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("unexpected text", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantTexts: []string{ "hello from after_model_callback", }, }, { name: "after model callback returns error and are run in symmetrical order", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "after model callback returns both new LLMResponse and error", afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, fmt.Errorf("error from after_model_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "on model error callback is not called", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("on_model_error_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunOnErrorCanonicalCallback: true, wantTexts: []string{ "hello from model", }, }, { name: "on model error callback changes message", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{}, dontRunOnErrorCanonicalCallback: true, wantTexts: []string{ "hello from on_model_error_callback", }, }, { name: "on model error callback changes err", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{}, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "on model error callback returns both new LLMResponse and error", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, }, llmResponses: []*genai.Content{}, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "on model error callback does not process before model callback error", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return nil, fmt.Errorf("before_model_callback_error: %w", http.ErrNoCookie) }, }, onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, { name: "on model error callback does not process before model callback message", beforeModelCallbacks: []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from before_model_callback", genai.RoleModel), }, nil }, }, onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, fmt.Errorf("error from on_model_error_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{ genai.NewContentFromText("hello from model", genai.RoleModel), }, dontRunBeforeCanonicalCallback: true, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantTexts: []string{ "hello from before_model_callback", }, }, { name: "after error callback process on model error callback message", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from on_model_error_callback", genai.RoleModel), }, nil }, }, afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return &model.LLMResponse{ Content: genai.NewContentFromText("hello from after_model_callback", genai.RoleModel), }, nil }, }, llmResponses: []*genai.Content{}, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantTexts: []string{ "hello from after_model_callback", }, }, { name: "after error callback does not process on model error callback error", onModelErrorCallback: []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from on_model_error_callback: %w", http.ErrNoCookie) }, }, afterModelCallbacks: []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { return nil, fmt.Errorf("error from after_model_callback: %w", http.ErrHijacked) }, }, llmResponses: []*genai.Content{}, dontRunOnErrorCanonicalCallback: true, dontRunAfterCanonicalCallback: true, wantErr: http.ErrNoCookie, }, } { t.Run(tc.name, func(t *testing.T) { maxLen := max(len(tc.beforeModelCallbacks), len(tc.afterModelCallbacks), len(tc.onModelErrorCallback)) var plugins []*plugin.Plugin for i := range maxLen { var currentBefore llmagent.BeforeModelCallback var currentAfter llmagent.AfterModelCallback var currentError llmagent.OnModelErrorCallback // 2. Bounds checks: Only assign if i is within the slice limits if i < len(tc.beforeModelCallbacks) { currentBefore = tc.beforeModelCallbacks[i] } if i < len(tc.afterModelCallbacks) { currentAfter = tc.afterModelCallbacks[i] } if i < len(tc.onModelErrorCallback) { currentError = tc.onModelErrorCallback[i] } p, err := plugin.New(plugin.Config{ Name: fmt.Sprintf("plugin-%d", i), BeforeModelCallback: currentBefore, AfterModelCallback: currentAfter, OnModelErrorCallback: currentError, }) if err != nil { t.Errorf("failed to initialize plugin: %v", err) } plugins = append(plugins, p) } onModelErrorCallbacksCalled := false beforeModelCallbacksCalled := false afterModelCallbacksCalled := false onModelErrorCallbacks := []llmagent.OnModelErrorCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest, llmError error) (*model.LLMResponse, error) { onModelErrorCallbacksCalled = true if tc.dontRunOnErrorCanonicalCallback { t.Error("on model error should not be called") } return nil, nil }, } beforeModelCallbacks := []llmagent.BeforeModelCallback{ func(ctx agent.CallbackContext, llmRequest *model.LLMRequest) (*model.LLMResponse, error) { beforeModelCallbacksCalled = true if tc.dontRunBeforeCanonicalCallback { t.Error("before model Callback should not be called") } return nil, nil }, } afterModelCallbacks := []llmagent.AfterModelCallback{ func(ctx agent.CallbackContext, llmResponse *model.LLMResponse, llmResponseError error) (*model.LLMResponse, error) { afterModelCallbacksCalled = true if tc.dontRunAfterCanonicalCallback { t.Error("after model Callback should not be called") } return nil, nil }, } testLLM := &testutil.MockModel{ Responses: tc.llmResponses, } a, err := llmagent.New(llmagent.Config{ Name: "hello_world_agent", Model: testLLM, OnModelErrorCallbacks: onModelErrorCallbacks, BeforeModelCallbacks: beforeModelCallbacks, AfterModelCallbacks: afterModelCallbacks, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } runner := testutil.NewTestAgentRunnerWithPluginManager(t, a, runner.PluginConfig{ Plugins: plugins, }) stream := runner.Run(t, "test_session", "") texts, err := testutil.CollectTextParts(stream) if tc.wantErr != nil && !errors.Is(err, tc.wantErr) { t.Fatalf("stream = (%q, %v), want (_, %v)", texts, err, tc.wantErr) } if (err != nil) != (tc.wantErr != nil) { t.Fatalf("unexpected result from agent, got error: %v, want error: %v", err, tc.wantErr) } if diff := cmp.Diff(tc.wantTexts, texts); diff != "" { t.Fatalf("unexpected result from agent, want: %v, got: %v, diff: %v", tc.wantTexts, texts, diff) } if onModelErrorCallbacksCalled == false && tc.dontRunOnErrorCanonicalCallback == false { t.Error("on model error should be called") } if beforeModelCallbacksCalled == false && tc.dontRunBeforeCanonicalCallback == false { t.Error("before model should be called") } if afterModelCallbacksCalled == false && tc.dontRunAfterCanonicalCallback == false { t.Error("after model should be called") } }) } } ================================================ FILE: plugin/plugin_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package plugin import ( "errors" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" ) func TestNew(t *testing.T) { mockOnUserMsg := func(agent.InvocationContext, *genai.Content) (*genai.Content, error) { return nil, nil } mockCloseErr := errors.New("close error") tests := []struct { name string cfg Config validate func(*testing.T, *Plugin) expectCloseErr error }{ { name: "Successfully maps all fields", cfg: Config{ OnUserMessageCallback: mockOnUserMsg, }, validate: func(t *testing.T, p *Plugin) { if p.OnUserMessageCallback() == nil { t.Error("OnUserMessageCallback was not mapped correctly") } // Verify Close() is safe even if we didn't provide a CloseFunc if err := p.Close(); err != nil { t.Errorf("Expected nil error from default close, got %v", err) } }, }, { name: "Safety: Handles nil CloseFunc gracefully", cfg: Config{ // No CloseFunc provided }, validate: func(t *testing.T, p *Plugin) { // This should not panic defer func() { if r := recover(); r != nil { t.Errorf("Plugin.Close() panicked with nil CloseFunc") } }() if err := p.Close(); err != nil { t.Errorf("Expected nil error, got %v", err) } }, }, { name: "Functionality: Executes provided CloseFunc", cfg: Config{ CloseFunc: func() error { return mockCloseErr }, }, validate: func(t *testing.T, p *Plugin) { err := p.Close() if err != mockCloseErr { t.Errorf("Expected error '%v', got '%v'", mockCloseErr, err) } }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p, err := New(tt.cfg) if err != nil { t.Fatalf("New() returned unexpected error: %v", err) } if p == nil { t.Fatal("New() returned nil Plugin") } if tt.validate != nil { tt.validate(t, p) } }) } } ================================================ FILE: plugin/retryandreflect/exceeded.md ================================================ The tool `{{.ToolName}}` has failed consecutively {{.MaxRetries}} times and the retry limit has been exceeded. **Last Error:** ``` {{.ErrorDetails}} ``` **Last Arguments Used:** ```json {{.ArgsSummary}} ``` **Final Instruction:** **Do not attempt to use the `{{.ToolName}}` tool again for this task.** You must now try a different approach. Acknowledge the failure and devise a new strategy, potentially using other available tools or informing the user that the task cannot be completed. ================================================ FILE: plugin/retryandreflect/plugin.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package retryandreflect provides a plugin that provides self-healing, // concurrent-safe error recovery for tool failures. // // This is the Go version of the Python plugin. // See https://github.com/google/adk-py/blob/main/google/adk/plugins/retry_and_reflect_plugin.py package retryandreflect import ( "bytes" "encoding/json" "errors" "fmt" "strings" "sync" "text/template" "google.golang.org/adk/plugin" "google.golang.org/adk/tool" _ "embed" ) //go:embed reflection.md var reflection string var reflectionTemplate = template.Must(template.New("ReflectionTemplate").Parse(reflection)) //go:embed exceeded.md var exceeded string var exceededTemplate = template.Must(template.New("ExceededTemplate").Parse(exceeded)) const ( reflectAndRetryResponseType = "ERROR_HANDLED_BY_REFLECT_AND_RETRY_PLUGIN" globalScopeKey = "__global_reflect_and_retry_scope__" ) // TrackingScope defines the lifecycle scope for tracking tool failure counts. type TrackingScope string const ( // Invocation tracks failures per-invocation. Invocation TrackingScope = "invocation" // Global tracks failures globally across all turns and users. Global TrackingScope = "global" ) type retryAndReflect struct { mu sync.Mutex maxRetries int errorIfRetryExceeded bool scope TrackingScope scopedFailureCounters map[string]map[string]int } // PluginOption is an option for configuring the ReflectAndRetryToolPlugin. type PluginOption func(*retryAndReflect) // WithMaxRetries sets the maximum number of retries for a tool. func WithMaxRetries(maxRetries int) PluginOption { return func(r *retryAndReflect) { r.maxRetries = maxRetries } } // WithErrorIfRetryExceeded sets whether to return an error if the retry limit is exceeded. // If set to true, then the original error is returned, otherwise instead of the original error, // the plugin will return a new instruction "createToolRetryExceedMsg" telling LLM to stop using this tool for the current task. func WithErrorIfRetryExceeded(errorIfRetryExceeded bool) PluginOption { return func(r *retryAndReflect) { r.errorIfRetryExceeded = errorIfRetryExceeded } } // WithTrackingScope sets the tracking scope for tool failures. func WithTrackingScope(scope TrackingScope) PluginOption { return func(r *retryAndReflect) { r.scope = scope } } // New creates a new reflect and retry tool plugin. func New(opts ...PluginOption) (*plugin.Plugin, error) { r := &retryAndReflect{ maxRetries: 3, // A sensible default errorIfRetryExceeded: false, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } for _, opt := range opts { opt(r) } if r.maxRetries < 0 { return nil, fmt.Errorf("maxRetries must be a non-negative integer") } return plugin.New(plugin.Config{ Name: "RetryAndReflectPlugin", AfterToolCallback: r.afterTool, OnToolErrorCallback: r.onToolError, }) } // MustNew creates a new reflect and retry tool plugin and panics if it fails. func MustNew(opts ...PluginOption) *plugin.Plugin { p, err := New(opts...) if err != nil { panic(err) } return p } func (r *retryAndReflect) afterTool(ctx tool.Context, tool tool.Tool, args, result map[string]any, err error) (map[string]any, error) { if err == nil { isReflectResponse := false if rt, ok := result["response_type"].(string); ok && rt == reflectAndRetryResponseType { isReflectResponse = true } // On success, reset the failure count for this specific tool within its scope. // But do not reset if OnToolErrorCallback just produced a reflection response. if !isReflectResponse { r.resetFailuresForTool(ctx, tool.Name()) } } return nil, nil } func (r *retryAndReflect) onToolError(ctx tool.Context, tool tool.Tool, args map[string]any, err error) (map[string]any, error) { return r.handleToolError(ctx, tool, args, err) } func (r *retryAndReflect) handleToolError(ctx tool.Context, failedTool tool.Tool, args map[string]any, err error) (map[string]any, error) { // skip if the error is tool.ErrConfirmationRequired. if errors.Is(err, tool.ErrConfirmationRequired) || errors.Is(err, tool.ErrConfirmationRejected) { return nil, nil } if r.maxRetries == 0 { if r.errorIfRetryExceeded { return nil, err } return r.createToolRetryExceedMsg(failedTool, args, err), nil } scopeKey := r.scopeKey(ctx) r.mu.Lock() defer r.mu.Unlock() toolFailureCounter, ok := r.scopedFailureCounters[scopeKey] if !ok { toolFailureCounter = make(map[string]int) r.scopedFailureCounters[scopeKey] = toolFailureCounter } currentRetries := toolFailureCounter[failedTool.Name()] + 1 toolFailureCounter[failedTool.Name()] = currentRetries if currentRetries <= r.maxRetries { return r.createToolReflectionResponse(failedTool, args, err, currentRetries), nil } // Max Retry exceeded if r.errorIfRetryExceeded { return nil, err } return r.createToolRetryExceedMsg(failedTool, args, err), nil } func (r *retryAndReflect) scopeKey(ctx tool.Context) string { if r.scope == Global { return globalScopeKey } return ctx.InvocationID() } func (r *retryAndReflect) resetFailuresForTool(ctx tool.Context, toolName string) { scopeKey := r.scopeKey(ctx) r.mu.Lock() defer r.mu.Unlock() if scope, ok := r.scopedFailureCounters[scopeKey]; ok { delete(scope, toolName) if len(scope) == 0 { delete(r.scopedFailureCounters, scopeKey) } } } func (r *retryAndReflect) formatErrorDetails(err error) string { return fmt.Sprintf("%T: %v", err, err) } func (r *retryAndReflect) formatToolArgs(toolArgs map[string]any) string { argsBytes, err := json.MarshalIndent(toolArgs, "", " ") if err != nil { return fmt.Sprintf("%+v", toolArgs) } return string(argsBytes) } // templateData represents the variables in the templates. type templateData struct { ToolName string ErrorDetails string ArgsSummary string RetryCount int MaxRetries int } func (r *retryAndReflect) createToolReflectionResponse(tool tool.Tool, toolArgs map[string]any, toolErr error, retryCount int) map[string]any { argsSummary := r.formatToolArgs(toolArgs) errorDetails := r.formatErrorDetails(toolErr) d := templateData{ ToolName: tool.Name(), ErrorDetails: errorDetails, ArgsSummary: argsSummary, RetryCount: retryCount, MaxRetries: r.maxRetries, } var buf bytes.Buffer err := reflectionTemplate.Execute(&buf, d) if err != nil { return nil } return map[string]any{ "response_type": reflectAndRetryResponseType, "error_type": fmt.Sprintf("%T", toolErr), "error_details": toolErr.Error(), "retry_count": retryCount, "reflection_guidance": strings.TrimSpace(buf.String()), } } func (r *retryAndReflect) createToolRetryExceedMsg(tool tool.Tool, toolArgs map[string]any, toolErr error) map[string]any { argsSummary := r.formatToolArgs(toolArgs) errorDetails := r.formatErrorDetails(toolErr) d := templateData{ ToolName: tool.Name(), ErrorDetails: errorDetails, ArgsSummary: argsSummary, } var buf bytes.Buffer err := exceededTemplate.Execute(&buf, d) if err != nil { return nil } return map[string]any{ "response_type": reflectAndRetryResponseType, "error_type": fmt.Sprintf("%T", toolErr), "error_details": toolErr.Error(), "retry_count": r.maxRetries, "reflection_guidance": strings.TrimSpace(buf.String()), } } ================================================ FILE: plugin/retryandreflect/plugin_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package retryandreflect import ( "errors" "strings" "testing" "google.golang.org/adk/tool" ) type mockTool struct { name string } func (m *mockTool) Name() string { return m.name } func (m *mockTool) Description() string { return "" } func (m *mockTool) IsLongRunning() bool { return false } type mockContext struct { tool.Context invocationID string } func (m *mockContext) InvocationID() string { return m.invocationID } func TestNewOptions(t *testing.T) { tests := []struct { name string opts []PluginOption wantErr bool }{ { name: "defaults", }, { name: "custom options", opts: []PluginOption{ WithMaxRetries(5), WithErrorIfRetryExceeded(true), WithTrackingScope(Global), }, }, { name: "negative max retries", opts: []PluginOption{ WithMaxRetries(-1), }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p, err := New(tt.opts...) if (err != nil) != tt.wantErr { t.Fatalf("New() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantErr { return } if p.Name() != "RetryAndReflectPlugin" { t.Errorf("expected plugin name RetryAndReflectPlugin, got %s", p.Name()) } if p.AfterToolCallback() == nil { t.Errorf("expected AfterToolCallback to be set") } if p.OnToolErrorCallback() == nil { t.Errorf("expected OnToolErrorCallback to be set") } }) } } func TestRetryAndReflect_SuccessResets(t *testing.T) { r := &retryAndReflect{ maxRetries: 3, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } ctx := &mockContext{invocationID: "inv1"} tl := &mockTool{name: "test-tool"} args := map[string]any{"arg1": "val1"} err := errors.New("some error") // Fail twice _, _ = r.onToolError(ctx, tl, args, err) _, _ = r.onToolError(ctx, tl, args, err) if count := r.scopedFailureCounters["inv1"]["test-tool"]; count != 2 { t.Errorf("expected count 2, got %d", count) } // Succeed _, _ = r.afterTool(ctx, tl, args, nil, nil) if _, ok := r.scopedFailureCounters["inv1"]["test-tool"]; ok { t.Errorf("expected failure count to be reset") } } func TestRetryAndReflect_AfterToolNoResetOnReflection(t *testing.T) { r := &retryAndReflect{ maxRetries: 3, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } ctx := &mockContext{invocationID: "inv1"} tl := &mockTool{name: "test-tool"} args := map[string]any{"arg1": "val1"} err := errors.New("some error") // Fail once res, _ := r.onToolError(ctx, tl, args, err) if count := r.scopedFailureCounters["inv1"]["test-tool"]; count != 1 { t.Errorf("expected count 1, got %d", count) } // AfterTool is called with the result of onToolError _, _ = r.afterTool(ctx, tl, args, res, nil) if count := r.scopedFailureCounters["inv1"]["test-tool"]; count != 1 { t.Errorf("expected failure count NOT to be reset, got %d", count) } } func TestRetryAndReflect_MaxRetries(t *testing.T) { r := &retryAndReflect{ maxRetries: 2, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } ctx := &mockContext{invocationID: "inv1"} tl := &mockTool{name: "test-tool"} args := map[string]any{"arg1": "val1"} err := errors.New("fail") // 1st retry res, _ := r.onToolError(ctx, tl, args, err) if res["retry_count"] != 1 { t.Errorf("expected retry_count 1, got %v", res["retry_count"]) } if res["response_type"] != reflectAndRetryResponseType { t.Errorf("expected reflectAndRetryResponseType") } // 2nd retry res, _ = r.onToolError(ctx, tl, args, err) if res["retry_count"] != 2 { t.Errorf("expected retry_count 2, got %v", res["retry_count"]) } // 3rd time - exceed res, _ = r.onToolError(ctx, tl, args, err) if res["retry_count"] != 2 { // It returns maxRetries in createToolRetryExceedMsg t.Errorf("expected retry_count 2 (max), got %v", res["retry_count"]) } if !strings.Contains(res["reflection_guidance"].(string), "exceeded") { t.Errorf("expected guidance to mention exceeded, got %v", res["reflection_guidance"]) } } func TestRetryAndReflect_ErrorIfRetryExceeded(t *testing.T) { r := &retryAndReflect{ maxRetries: 1, errorIfRetryExceeded: true, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } ctx := &mockContext{invocationID: "inv1"} tl := &mockTool{name: "test-tool"} err := errors.New("fail") // 1st retry _, _ = r.onToolError(ctx, tl, nil, err) // 2nd time - exceed, should return error _, gotErr := r.onToolError(ctx, tl, nil, err) if gotErr != err { t.Errorf("expected error %v, got %v", err, gotErr) } } func TestRetryAndReflect_Scopes(t *testing.T) { rInvocation := &retryAndReflect{ maxRetries: 3, scope: Invocation, scopedFailureCounters: make(map[string]map[string]int), } rGlobal := &retryAndReflect{ maxRetries: 3, scope: Global, scopedFailureCounters: make(map[string]map[string]int), } ctx1 := &mockContext{invocationID: "inv1"} ctx2 := &mockContext{invocationID: "inv2"} tl := &mockTool{name: "test-tool"} err := errors.New("fail") // Invocation scope _, _ = rInvocation.onToolError(ctx1, tl, nil, err) if rInvocation.scopedFailureCounters["inv1"]["test-tool"] != 1 { t.Errorf("expected 1 failure in inv1") } _, _ = rInvocation.onToolError(ctx2, tl, nil, err) if rInvocation.scopedFailureCounters["inv2"]["test-tool"] != 1 { t.Errorf("expected 1 failure in inv2") } // Global scope _, _ = rGlobal.onToolError(ctx1, tl, nil, err) if rGlobal.scopedFailureCounters[globalScopeKey]["test-tool"] != 1 { t.Errorf("expected 1 failure in global scope") } _, _ = rGlobal.onToolError(ctx2, tl, nil, err) if rGlobal.scopedFailureCounters[globalScopeKey]["test-tool"] != 2 { t.Errorf("expected 2 failures in global scope") } } ================================================ FILE: plugin/retryandreflect/reflection.md ================================================ The call to tool `{{.ToolName}}` failed. **Error Details:** ``` {{.ErrorDetails}} ``` **Tool Arguments Used:** ```json {{.ArgsSummary}} ``` **Reflection Guidance:** This is retry attempt **{{.RetryCount}} of {{.MaxRetries}}**. Analyze the error and the arguments you provided. Do not repeat the exact same call. Consider the following before your next attempt: 1. **Invalid Parameters**: Does the error suggest that one or more arguments are incorrect, badly formatted, or missing? Review the tool's schema and your arguments. 2. **State or Preconditions**: Did a previous step fail or not produce the necessary state/resource for this tool to succeed? 3. **Alternative Approach**: Is this the right tool for the job? Could another tool or a different sequence of steps achieve the goal? 4. **Simplify the Task**: Can you break the problem down into smaller, simpler steps? 5. **Wrong Function Name**: Does the error indicates the tool is not found? Please check again and only use available tools. Formulate a new plan based on your analysis and try a corrected or different approach. ================================================ FILE: runner/runner.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package runner provides a runtime for ADK agents. package runner import ( "context" "fmt" "iter" "log" "time" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/internal/agent/parentmap" "google.golang.org/adk/internal/agent/runconfig" artifactinternal "google.golang.org/adk/internal/artifact" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" imemory "google.golang.org/adk/internal/memory" "google.golang.org/adk/internal/plugininternal" "google.golang.org/adk/internal/utils" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/plugin" "google.golang.org/adk/session" ) // Config is used to create a [Runner]. type Config struct { AppName string // Root agent which starts the execution. Agent agent.Agent SessionService session.Service // optional ArtifactService artifact.Service // optional MemoryService memory.Service // optional PluginConfig PluginConfig // optional AutoCreateSession bool } type PluginConfig struct { Plugins []*plugin.Plugin CloseTimeout time.Duration } type RunOption func(*runOptions) type runOptions struct { stateDelta map[string]any } // WithStateDelta sets a state delta for the run invocation. func WithStateDelta(delta map[string]any) RunOption { return func(o *runOptions) { o.stateDelta = delta } } // New creates a new [Runner]. func New(cfg Config) (*Runner, error) { if cfg.Agent == nil { return nil, fmt.Errorf("root agent is required") } if cfg.SessionService == nil { return nil, fmt.Errorf("session service is required") } parents, err := parentmap.New(cfg.Agent) if err != nil { return nil, fmt.Errorf("failed to create agent tree: %w", err) } pluginManager, err := plugininternal.NewPluginManager(plugininternal.PluginConfig{ Plugins: cfg.PluginConfig.Plugins, CloseTimeout: cfg.PluginConfig.CloseTimeout, }) if err != nil { return nil, fmt.Errorf("failed to create plugin manager: %w", err) } return &Runner{ appName: cfg.AppName, rootAgent: cfg.Agent, sessionService: cfg.SessionService, artifactService: cfg.ArtifactService, memoryService: cfg.MemoryService, parents: parents, pluginManager: pluginManager, autoCreateSession: cfg.AutoCreateSession, }, nil } // Runner manages the execution of the agent within a session, handling message // processing, event generation, and interaction with various services like // artifact storage, session management, and memory. type Runner struct { appName string rootAgent agent.Agent sessionService session.Service artifactService artifact.Service memoryService memory.Service parents parentmap.Map pluginManager *plugininternal.PluginManager autoCreateSession bool } // Run runs the agent for the given user input, yielding events from agents. // For each user message it finds the proper agent within an agent tree to // continue the conversation within the session. func (r *Runner) Run(ctx context.Context, userID, sessionID string, msg *genai.Content, cfg agent.RunConfig, opts ...RunOption) iter.Seq2[*session.Event, error] { // TODO(hakim): we need to validate whether cfg is compatible with the Agent. // see adk-python/src/google/adk/runners.py Runner._new_invocation_context. // TODO: setup tracer. return func(yield func(*session.Event, error) bool) { options := runOptions{} for _, opt := range opts { opt(&options) } var storedSession session.Session getResp, err := r.sessionService.Get(ctx, &session.GetRequest{ AppName: r.appName, UserID: userID, SessionID: sessionID, }) if err != nil { if !r.autoCreateSession { yield(nil, err) return } createResp, err := r.sessionService.Create(ctx, &session.CreateRequest{ AppName: r.appName, UserID: userID, SessionID: sessionID, }) if err != nil { yield(nil, err) return } storedSession = createResp.Session } else { storedSession = getResp.Session } agentToRun, err := r.findAgentToRun(storedSession, msg) if err != nil { yield(nil, err) return } ctx = parentmap.ToContext(ctx, r.parents) ctx = runconfig.ToContext(ctx, &runconfig.RunConfig{ StreamingMode: runconfig.StreamingMode(cfg.StreamingMode), }) ctx = plugininternal.ToContext(ctx, r.pluginManager) var artifacts agent.Artifacts if r.artifactService != nil { artifacts = &artifactinternal.Artifacts{ Service: r.artifactService, SessionID: storedSession.ID(), AppName: storedSession.AppName(), UserID: storedSession.UserID(), } } var memoryImpl agent.Memory = nil if r.memoryService != nil { memoryImpl = &imemory.Memory{ Service: r.memoryService, SessionID: storedSession.ID(), UserID: storedSession.UserID(), AppName: storedSession.AppName(), } } ctx := icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{ Artifacts: artifacts, Memory: memoryImpl, Session: storedSession, Agent: agentToRun, UserContent: msg, RunConfig: &cfg, }) ctx, err = r.appendMessageToSession(ctx, storedSession, msg, cfg.SaveInputBlobsAsArtifacts, r.pluginManager, options.stateDelta) if err != nil { yield(nil, err) return } pluginManager := r.pluginManager if pluginManager != nil { // Defer the after run callbacks to perform global cleanup tasks or finalizing logs and metrics data. // This does NOT emit any event. defer pluginManager.RunAfterRunCallback(ctx) earlyExitResult, err := pluginManager.RunBeforeRunCallback(ctx) if earlyExitResult != nil || err != nil { earlyExitEvent := session.NewEvent(ctx.InvocationID()) earlyExitEvent.Author = "user" earlyExitEvent.LLMResponse = model.LLMResponse{ Content: msg, } if err := r.sessionService.AppendEvent(ctx, storedSession, earlyExitEvent); err != nil { yield(nil, fmt.Errorf("failed to add event to session: %w", err)) return } yield(earlyExitEvent, err) return } } for event, err := range agentToRun.Run(ctx) { if err != nil { if !yield(event, err) { return } continue } if pluginManager != nil { modifiedEvent, err := pluginManager.RunOnEventCallback(ctx, event) if err != nil { if !yield(nil, err) { return } continue } if modifiedEvent != nil { event = modifiedEvent } } // only commit non-partial event to a session service if !event.LLMResponse.Partial { if err := r.sessionService.AppendEvent(ctx, storedSession, event); err != nil { yield(nil, fmt.Errorf("failed to add event to session: %w", err)) return } } if !yield(event, nil) { return } } } } func (r *Runner) appendMessageToSession(ctx agent.InvocationContext, storedSession session.Session, msg *genai.Content, saveInputBlobsAsArtifacts bool, pluginManager *plugininternal.PluginManager, stateDelta map[string]any) (agent.InvocationContext, error) { if msg == nil { return ctx, nil } if pluginManager != nil { modifiedMsg, err := pluginManager.RunOnUserMessageCallback(ctx, msg) if err != nil { return ctx, fmt.Errorf("error running on run user message callback : %w", err) } if modifiedMsg != nil { msg = modifiedMsg // update ctx user message ctx = icontext.NewInvocationContext(ctx, icontext.InvocationContextParams{ Artifacts: ctx.Artifacts(), Memory: ctx.Memory(), Session: ctx.Session(), Agent: ctx.Agent(), UserContent: msg, RunConfig: ctx.RunConfig(), InvocationID: ctx.InvocationID(), }) } } artifactsService := ctx.Artifacts() if artifactsService != nil && saveInputBlobsAsArtifacts { for i, part := range msg.Parts { if part.InlineData == nil { continue } fileName := fmt.Sprintf("artifact_%s_%d", ctx.InvocationID(), i) if _, err := artifactsService.Save(ctx, fileName, part); err != nil { return ctx, fmt.Errorf("failed to save artifact %s: %w", fileName, err) } // Replace the part with a text placeholder msg.Parts[i] = &genai.Part{ Text: fmt.Sprintf("Uploaded file: %s. It has been saved to the artifacts", fileName), } } } event := session.NewEvent(ctx.InvocationID()) event.Author = "user" event.LLMResponse = model.LLMResponse{ Content: msg, } if stateDelta != nil { event.Actions.StateDelta = stateDelta } if err := r.sessionService.AppendEvent(ctx, storedSession, event); err != nil { return ctx, fmt.Errorf("failed to append event to sessionService: %w", err) } return ctx, nil } // findAgentToRun returns the agent that should handle the next request based on // session history. func (r *Runner) findAgentToRun(session session.Session, msg *genai.Content) (agent.Agent, error) { if event := handleUserFunctionCallResponse(session.Events(), msg); event != nil { subAgent := findAgent(r.rootAgent, event.Author) if subAgent != nil { return subAgent, nil } log.Printf("Function call from an unknown agent: %s, event id: %s", event.Author, event.ID) } events := session.Events() for i := events.Len() - 1; i >= 0; i-- { event := events.At(i) if event.Author == "user" { continue } subAgent := findAgent(r.rootAgent, event.Author) // Agent not found, continue looking for the other event. if subAgent == nil { log.Printf("Event from an unknown agent: %s, event id: %s", event.Author, event.ID) continue } if r.isTransferableAcrossAgentTree(subAgent) { return subAgent, nil } } // Falls back to root agent if no suitable agents are found in the session. return r.rootAgent, nil } // handleUserFunctionCallResponse finds the function call event that matches the function response id // delivered by the user in the latest event. func handleUserFunctionCallResponse(events session.Events, msg *genai.Content) *session.Event { if events.Len() == 0 { return nil } functionResponses := utils.FunctionResponses(msg) if len(functionResponses) == 0 { return nil } // This assumes that even if user provides multiple function responses, all the function calls // were made by the same agent. Otherwise it would be impossible to rearrange session events // such that every function response has a corresponding call filtering by author. callID := functionResponses[0].ID for i := events.Len() - 1; i >= 0; i-- { event := events.At(i) for _, part := range utils.FunctionCalls(event.Content) { if part.ID == callID { return event } } } return nil } // checks if the agent and its parent chain allow transfer up the tree. func (r *Runner) isTransferableAcrossAgentTree(agentToRun agent.Agent) bool { for curAgent := agentToRun; curAgent != nil; curAgent = r.parents[curAgent.Name()] { llmAgent, ok := curAgent.(llminternal.Agent) if !ok { return false } if llminternal.Reveal(llmAgent).DisallowTransferToParent { return false } } return true } func findAgent(curAgent agent.Agent, targetName string) agent.Agent { if curAgent == nil || curAgent.Name() == targetName { return curAgent } for _, subAgent := range curAgent.SubAgents() { if agent := findAgent(subAgent, targetName); agent != nil { return agent } } return nil } ================================================ FILE: runner/runner_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package runner import ( "bytes" "context" "fmt" "iter" "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/artifact" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestRunner_findAgentToRun(t *testing.T) { t.Parallel() appName, userID, sessionID := "test", "userID", "sessionID" agentTree := agentTree(t) tests := []struct { name string rootAgent agent.Agent session session.Session userMessage *genai.Content wantAgent agent.Agent wantErr bool }{ { name: "last event from agent allowing transfer", session: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{ { Author: "allows_transfer_agent", }, }), rootAgent: agentTree.root, wantAgent: agentTree.allowsTransferAgent, }, { name: "last event from agent not allowing transfer", session: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{ { Author: "no_transfer_agent", }, }), rootAgent: agentTree.root, wantAgent: agentTree.root, }, { name: "no events from agents, call root", session: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{}), rootAgent: agentTree.root, wantAgent: agentTree.root, }, { name: "last event from user with function response", session: createSession(t, t.Context(), appName, userID, sessionID, []*session.Event{ { Author: agentTree.noTransferAgent.Name(), LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "fn_name", ID: "fn_id", }, }, }, }, }, }, { Author: agentTree.root.Name(), }, }), userMessage: genai.NewContentFromParts([]*genai.Part{{ FunctionResponse: &genai.FunctionResponse{ Name: "fn_name", ID: "fn_id", }, }}, genai.RoleUser), rootAgent: agentTree.root, wantAgent: agentTree.noTransferAgent, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { r := &Runner{ rootAgent: tt.rootAgent, } gotAgent, err := r.findAgentToRun(tt.session, tt.userMessage) if (err != nil) != tt.wantErr { t.Errorf("Runner.findAgentToRun() error = %v, wantErr %v", err, tt.wantErr) return } if tt.wantAgent != gotAgent { t.Errorf("Runner.findAgentToRun() = %+v, want %+v", gotAgent.Name(), tt.wantAgent.Name()) } }) } } func Test_findAgent(t *testing.T) { agentTree := agentTree(t) oneAgent := must(llmagent.New(llmagent.Config{ Name: "test", })) tests := []struct { name string root agent.Agent target string wantAgent agent.Agent }{ { name: "ok", root: agentTree.root, target: agentTree.allowsTransferAgent.Name(), wantAgent: agentTree.allowsTransferAgent, }, { name: "finds in one node tree", root: oneAgent, target: oneAgent.Name(), wantAgent: oneAgent, }, { name: "doesn't fail if agent is missing in the tree", root: agentTree.root, target: "random", wantAgent: nil, }, { name: "doesn't fail on the empty tree", root: nil, target: "random", wantAgent: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if gotAgent := findAgent(tt.root, tt.target); gotAgent != tt.wantAgent { t.Errorf("Runner.findAgent() = %+v, want %+v", gotAgent.Name(), tt.wantAgent.Name()) } }) } } func Test_isTransferrableAcrossAgentTree(t *testing.T) { tests := []struct { name string agent agent.Agent want bool }{ { name: "disallow for agent with DisallowTransferToParent", agent: must(llmagent.New(llmagent.Config{ Name: "test", DisallowTransferToParent: true, })), want: false, }, { name: "disallow for non-LLM agent", agent: must(agent.New(agent.Config{ Name: "test", })), want: false, }, { name: "allow for the default LLM agent", agent: must(llmagent.New(llmagent.Config{ Name: "test", })), want: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { runner, err := New(Config{ AppName: "testApp", Agent: tt.agent, SessionService: session.InMemoryService(), }) if err != nil { t.Fatal(err) } if got := runner.isTransferableAcrossAgentTree(tt.agent); got != tt.want { t.Errorf("isTransferrableAcrossAgentTree() = %v, want %v", got, tt.want) } }) } } func TestRunner_SaveInputBlobsAsArtifacts(t *testing.T) { ctx := context.Background() appName := "testApp" userID := "testUser" sessionID := "testSession" sessionService := session.InMemoryService() artifactService := artifact.InMemoryService() testAgent := must(agent.New(agent.Config{ Name: "test_agent", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // no-op, we are testing logic before agent run. } }, })) r, err := New(Config{ AppName: appName, Agent: testAgent, SessionService: sessionService, }) if err != nil { t.Fatalf("New() error = %v", err) } r.artifactService = artifactService _, err = sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("sessionService.Create() error = %v", err) } // Blob data, the message is saved only when inline data is present. blobData := []byte("this is not blob data - René Magritte") msg := &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("here is a file"), {InlineData: &genai.Blob{MIMEType: "application/octet-stream", Data: blobData}}, }, Role: genai.RoleUser, } cfg := agent.RunConfig{ SaveInputBlobsAsArtifacts: true, } // Consume the iterator from Run. The agent itself does nothing, but the runner // will save the artifact before calling the agent. for _, err := range r.Run(ctx, userID, sessionID, msg, cfg) { if err != nil { t.Fatalf("r.Run() returned an error: %v", err) } } listResp, err := artifactService.List(ctx, &artifact.ListRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("artifactService.List() error = %v", err) } if len(listResp.FileNames) != 1 { t.Fatalf("expected 1 artifact, got %d", len(listResp.FileNames)) } savedFileName := listResp.FileNames[0] if !strings.HasPrefix(savedFileName, "artifact_") { t.Errorf("saved file name should start with 'artifact_', got %q", savedFileName) } loadResp, err := artifactService.Load(ctx, &artifact.LoadRequest{ AppName: appName, UserID: userID, SessionID: sessionID, FileName: savedFileName, }) if err != nil { t.Fatalf("artifactService.Load() error = %v", err) } if !bytes.Equal(loadResp.Part.InlineData.Data, blobData) { t.Errorf("loaded artifact data does not match original blob data") } getResponse, err := sessionService.Get(ctx, &session.GetRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("sessionService.Get() error = %v", err) } events := getResponse.Session.Events() if events.Len() == 0 { t.Fatal("no events in session") } userEvent := events.At(0) if userEvent.Author != "user" { t.Fatalf("expected first event to be from user, got %s", userEvent.Author) } // The part with InlineData should be replaced. if len(userEvent.LLMResponse.Content.Parts) != 2 { t.Fatalf("expected 2 parts in user message event, got %d", len(userEvent.LLMResponse.Content.Parts)) } partWithBlob := userEvent.LLMResponse.Content.Parts[1] if partWithBlob.InlineData != nil { t.Errorf("InlineData was not removed from the message part in the session") } expectedText := fmt.Sprintf("Uploaded file: %s. It has been saved to the artifacts", savedFileName) if partWithBlob.Text != expectedText { t.Errorf("unexpected text in placeholder part. got %q, want %q", partWithBlob.Text, expectedText) } } // creates agentTree for tests and returns references to the agents func agentTree(t *testing.T) agentTreeStruct { t.Helper() sub1 := must(llmagent.New(llmagent.Config{ Name: "no_transfer_agent", DisallowTransferToParent: true, })) sub2 := must(llmagent.New(llmagent.Config{ Name: "allows_transfer_agent", })) parent := must(llmagent.New(llmagent.Config{ Name: "root", SubAgents: []agent.Agent{sub1, sub2}, })) return agentTreeStruct{ root: parent, noTransferAgent: sub1, allowsTransferAgent: sub2, } } type agentTreeStruct struct { root, noTransferAgent, allowsTransferAgent agent.Agent } func must[T agent.Agent](a T, err error) T { if err != nil { panic(err) } return a } func createSession(t *testing.T, ctx context.Context, sessionID, appName, userID string, events []*session.Event) session.Session { t.Helper() service := session.InMemoryService() resp, err := service.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatal(err) } for _, event := range events { if err := service.AppendEvent(ctx, resp.Session, event); err != nil { t.Fatal(err) } } return resp.Session } func TestRunner_AutoCreateSession(t *testing.T) { t.Parallel() appName := "testApp" userID := "testUser" sessionID := "testSession" testAgent := must(agent.New(agent.Config{ Name: "test_agent", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { // no-op, we are testing logic before agent run. } }, })) tests := []struct { name string autoCreateSession bool setupSession bool wantErr bool }{ { name: "auto_create_true_session_missing", autoCreateSession: true, setupSession: false, wantErr: false, }, { name: "auto_create_false_session_missing", autoCreateSession: false, setupSession: false, wantErr: true, }, { name: "auto_create_false_session_exists", autoCreateSession: false, setupSession: true, wantErr: false, }, { name: "auto_create_true_session_exists", autoCreateSession: true, setupSession: true, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() sessionService := session.InMemoryService() if tt.setupSession { _, err := sessionService.Create(ctx, &session.CreateRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Fatalf("failed to setup session: %v", err) } } r, err := New(Config{ AppName: appName, Agent: testAgent, SessionService: sessionService, AutoCreateSession: tt.autoCreateSession, }) if err != nil { t.Fatalf("New() error = %v", err) } msg := &genai.Content{Parts: []*genai.Part{{Text: "hello"}}} gotError := false for _, err := range r.Run(ctx, userID, sessionID, msg, agent.RunConfig{}) { if err != nil { gotError = true } } if gotError != tt.wantErr { t.Errorf("Runner.Run() error = %v, wantErr %v", gotError, tt.wantErr) } // If we expected success, verify session exists/persists if !tt.wantErr { _, err = sessionService.Get(ctx, &session.GetRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { t.Errorf("expected session to exist, but got error: %v", err) } } }) } } ================================================ FILE: scripts/adk-web/Dockerfile ================================================ # Stage 1: Clone the repository FROM node:iron-trixie AS downloader RUN apt-get update && apt-get install -y git # Trigger re-clone when the main branch changes. ADD https://api.github.com/repos/google/adk-web/git/refs/heads/main version.json RUN git clone -b main https://github.com/google/adk-web /adk-web && rm version.json # Stage 2: Build the application FROM node:iron-trixie AS builder WORKDIR /adk-web # Copy package files first to leverage Docker cache for npm install. # This ensures that npm install is only re-run if package.json or package-lock.json changes, # and not when other source files change. COPY --from=downloader /adk-web/package*.json ./ RUN npm install # Copy the rest of the source code COPY --from=downloader /adk-web ./ RUN npm run build ================================================ FILE: scripts/adk-web/update-adk-web.sh ================================================ #!/bin/sh # This scripts pulls the latest version of adk-web. # It uses the latest version from https://github.com/google/adk-web and builds it in a docker container. # Use directory of the script for references SCRIPT_DIR="$(dirname "$0")" OUTPUT_DIR="${SCRIPT_DIR}/../../cmd/launcher/web/webui/distr/" CONTAINER_BUILD_DIR="adk-web/dist/agent_framework_web/browser" if ! docker build -t adk-web-builder:latest "${SCRIPT_DIR}"; then echo "Failed to build container. Stopping the update." exit 1 fi CONTAINER_ID=$(docker create adk-web-builder:latest) if [ $? -ne 0 ]; then echo "Failed to create container. Stopping the update." exit 1 fi trap "docker rm -f ${CONTAINER_ID}" EXIT echo "Cleaning up the output directory." rm -rf "${OUTPUT_DIR}" echo "Copying the built files from the container to the output directory." docker cp "${CONTAINER_ID}":/${CONTAINER_BUILD_DIR}/. "${OUTPUT_DIR}" echo "Done." ================================================ FILE: server/adka2a/agent_card.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "fmt" "regexp" "slices" "strings" "github.com/a2aproject/a2a-go/a2a" "google.golang.org/adk/agent" "google.golang.org/adk/agent/workflowagents/loopagent" iagent "google.golang.org/adk/internal/agent" "google.golang.org/adk/internal/llminternal" ) // BuildAgentSkills attempts to create a list of [a2a.AgentSkill]s based on agent descriptions and types. // This information can be used in [a2a.AgentCard] to help clients understand agent capabilities. func BuildAgentSkills(agent agent.Agent) []a2a.AgentSkill { return slices.Concat(buildPrimarySkills(agent), buildSubAgentSkills(agent)) } func buildPrimarySkills(agent agent.Agent) []a2a.AgentSkill { if llmAgent, ok := agent.(llminternal.Agent); ok { return buildLLMAgentSkills(agent, llminternal.Reveal(llmAgent)) } else { return buildNonLLMAgentSkills(agent) } } func buildSubAgentSkills(agent agent.Agent) []a2a.AgentSkill { subAgents := agent.SubAgents() result := make([]a2a.AgentSkill, 0, len(agent.SubAgents())) for _, sub := range subAgents { skills := buildPrimarySkills(sub) for _, subSkill := range skills { skill := a2a.AgentSkill{ ID: fmt.Sprintf("%s_%s", sub.Name(), subSkill.ID), Name: fmt.Sprintf("%s: %s", sub.Name(), subSkill.Name), Description: subSkill.Description, Tags: slices.Concat([]string{fmt.Sprintf("sub_agent:%s", sub.Name())}, subSkill.Tags), } result = append(result, skill) } } return result } func buildLLMAgentSkills(agent agent.Agent, llmState *llminternal.State) []a2a.AgentSkill { skills := []a2a.AgentSkill{ { ID: agent.Name(), Name: "model", Description: buildDescriptionFromInstructions(agent, llmState), Tags: []string{"llm"}, }, } if len(llmState.Tools) > 0 { for _, tool := range llmState.Tools { description := tool.Description() if description == "" { description = fmt.Sprintf("Tool: %s", tool.Name()) } skills = append(skills, a2a.AgentSkill{ ID: fmt.Sprintf("%s-%s", agent.Name(), tool.Name()), Name: tool.Name(), Description: description, Tags: []string{"llm", "tools"}, }) } } // TODO(yarolegovich): mention planning and code-execution skills once supported (and if configured) return skills } func buildNonLLMAgentSkills(agent agent.Agent) []a2a.AgentSkill { state := getInternalState(agent) skills := []a2a.AgentSkill{ { ID: agent.Name(), Name: getAgentSkillName(state), Description: buildAgentDescription(agent, state), Tags: []string{getAgentTypeTag(state)}, }, } subAgents := agent.SubAgents() if len(subAgents) > 0 { descriptions := make([]string, len(subAgents)) for i, sub := range subAgents { if sub.Description() != "" { descriptions[i] = sub.Description() } else { descriptions[i] = "No description" } } skills = append(skills, a2a.AgentSkill{ ID: fmt.Sprintf("%s-sub-agents", agent.Name()), Name: "sub-agents", Description: fmt.Sprintf("Orchestrates: %s", strings.Join(descriptions, "; ")), Tags: []string{getAgentTypeTag(state), "orchestration"}, }) } return skills } func buildAgentDescription(agent agent.Agent, state *iagent.State) string { descriptionParts := []string{} if agent.Description() != "" { descriptionParts = append(descriptionParts, agent.Description()) } if len(agent.SubAgents()) > 0 { switch state.AgentType { case iagent.TypeLoopAgent: descriptionParts = append(descriptionParts, buildLoopAgentDescription(agent, state)) case iagent.TypeParallelAgent: descriptionParts = append(descriptionParts, buildParallelAgentDescription(agent)) case iagent.TypeSequentialAgent: descriptionParts = append(descriptionParts, buildSequentialAgentDescription(agent)) } } if len(descriptionParts) > 0 { return strings.Join(descriptionParts, " ") } else { return getDefaultAgentDescription(state) } } func buildSequentialAgentDescription(agnt agent.Agent) string { subAgents := agnt.SubAgents() descriptions := make([]string, len(subAgents)) for i, sub := range subAgents { subDescription := sub.Description() if subDescription == "" { subDescription = fmt.Sprintf("execute the %s agent", sub.Name()) } switch i { case 0: descriptions[i] = fmt.Sprintf("First, this agent will %s.", subDescription) case len(subAgents) - 1: descriptions[i] = fmt.Sprintf("Finally, this agent will %s.", subDescription) default: descriptions[i] = fmt.Sprintf("Then, this agent will %s.", subDescription) } } return strings.Join(descriptions, " ") } func buildParallelAgentDescription(agnt agent.Agent) string { subAgents := agnt.SubAgents() descriptions := make([]string, len(subAgents)) for i, sub := range subAgents { subDescription := sub.Description() if subDescription == "" { subDescription = fmt.Sprintf("execute the %s agent", sub.Name()) } switch i { case 0: descriptions[i] = fmt.Sprintf("This agent will %s", subDescription) case len(subAgents) - 1: descriptions[i] = fmt.Sprintf("and %s", subDescription) default: descriptions[i] = fmt.Sprintf(", %s", subDescription) } } return fmt.Sprintf("%s simultaneously.", strings.Join(descriptions, " ")) } func buildLoopAgentDescription(agnt agent.Agent, state *iagent.State) string { llmConfig, ok := state.Config.(loopagent.Config) if !ok { return "" } maxIterations := "unlimited" if llmConfig.MaxIterations > 0 { maxIterations = fmt.Sprintf("%d", llmConfig.MaxIterations) } subAgents := agnt.SubAgents() descriptions := make([]string, len(subAgents)) for i, sub := range subAgents { subDescription := sub.Description() if subDescription == "" { subDescription = fmt.Sprintf("execute the %s agent", sub.Name()) } switch i { case 0: descriptions[i] = fmt.Sprintf("This agent will %s", subDescription) case len(subAgents) - 1: descriptions[i] = fmt.Sprintf("and %s", subDescription) default: descriptions[i] = fmt.Sprintf(", %s", subDescription) } } return fmt.Sprintf("%s in a loop (max %s iterations).", strings.Join(descriptions, " "), maxIterations) } func buildDescriptionFromInstructions(agent agent.Agent, llmState *llminternal.State) string { state := getInternalState(agent) descriptionParts := []string{} if agent.Description() != "" { descriptionParts = append(descriptionParts, agent.Description()) } if llmState.Instruction != "" { descriptionParts = append(descriptionParts, replacePronouns(llmState.Instruction)) } if llmState.GlobalInstruction != "" { descriptionParts = append(descriptionParts, replacePronouns(llmState.GlobalInstruction)) } description := getDefaultAgentDescription(state) if len(descriptionParts) > 0 { description = strings.Join(descriptionParts, " ") } return description } // Replaces pronouns and conjugate common verbs for agent description. // Examples: "You are" -> "I am", "your" -> "my" func replacePronouns(instruction string) string { substitutions := []struct { original string target string }{ // Keep sorted by len(original) DESC to ensure longer phrases are matched first // which prevents "you" in "you are" from being replaced on its own. {"you were", "I was"}, {"you are", "I am"}, {"you're", "I am"}, {"you've", "I have"}, {"yours", "mine"}, {"your", "my"}, {"you", "I"}, } for _, sub := range substitutions { pattern := regexp.MustCompile(fmt.Sprintf(`(?i)\b%s\b`, sub.original)) instruction = pattern.ReplaceAllString(instruction, sub.target) } return instruction } func getDefaultAgentDescription(state *iagent.State) string { switch state.AgentType { case iagent.TypeLoopAgent: return "A loop workflow agent" case iagent.TypeSequentialAgent: return "A sequential workflow agent" case iagent.TypeParallelAgent: return "A parallel workflow agent" case iagent.TypeLLMAgent: return "An LLM-based agent" default: return "A custom agent" } } func getAgentTypeTag(state *iagent.State) string { switch state.AgentType { case iagent.TypeLoopAgent: return "loop_workflow" case iagent.TypeSequentialAgent: return "sequential_workflow" case iagent.TypeParallelAgent: return "parallel_workflow" case iagent.TypeLLMAgent: return "llm_agent" default: return "custom_agent" } } func getAgentSkillName(state *iagent.State) string { if state.AgentType == iagent.TypeLLMAgent { return "model" } if isWorkflowAgent(state) { return "workflow" } return "custom" } func getInternalState(agent agent.Agent) *iagent.State { if agent, ok := agent.(iagent.Agent); ok { return iagent.Reveal(agent) } else { return &iagent.State{AgentType: iagent.TypeCustomAgent} } } func isWorkflowAgent(state *iagent.State) bool { workflowAgents := []iagent.Type{iagent.TypeLoopAgent, iagent.TypeSequentialAgent, iagent.TypeParallelAgent} return slices.Contains(workflowAgents, state.AgentType) } ================================================ FILE: server/adka2a/agent_card_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" "google.golang.org/adk/tool" "google.golang.org/adk/tool/geminitool" "google.golang.org/adk/tool/loadartifactstool" ) func must[T agent.Agent](a T, err error) T { if err != nil { panic(err) } return a } func TestGetAgentSkills_LLMAgent(t *testing.T) { googleSearch, loadArtifacts := geminitool.GoogleSearch{}, loadartifactstool.New() testCases := []struct { name string agent agent.Agent want []a2a.AgentSkill }{ { name: "custom agent", agent: must(agent.New(agent.Config{Name: "Test", Description: "Test test"})), want: []a2a.AgentSkill{{ ID: "Test", Description: "Test test", Name: "custom", Tags: []string{"custom_agent"}, }}, }, { name: "llm with instruction", agent: must(llmagent.New(llmagent.Config{ Name: "Test LLM", Description: "Test llm.", Instruction: "You're a helpful agent, only respond with useful information.", })), want: []a2a.AgentSkill{{ ID: "Test LLM", Description: "Test llm. I am a helpful agent, only respond with useful information.", Name: "model", Tags: []string{"llm"}, }}, }, { name: "llm with tools", agent: must(llmagent.New(llmagent.Config{ Name: "Test LLM", Description: "Test llm.", Tools: []tool.Tool{loadArtifacts, googleSearch}, })), want: []a2a.AgentSkill{ { ID: "Test LLM", Description: "Test llm.", Name: "model", Tags: []string{"llm"}, }, { ID: "Test LLM-" + loadArtifacts.Name(), Name: loadArtifacts.Name(), Description: loadArtifacts.Description(), Tags: []string{"llm", "tools"}, }, { ID: "Test LLM-" + googleSearch.Name(), Name: googleSearch.Name(), Description: googleSearch.Description(), Tags: []string{"llm", "tools"}, }, }, }, { name: "empty loop agent", agent: must(loopagent.New(loopagent.Config{ AgentConfig: agent.Config{Name: "Test", Description: "Test test."}, })), want: []a2a.AgentSkill{ {ID: "Test", Description: "Test test.", Name: "workflow", Tags: []string{"loop_workflow"}}, }, }, { name: "loop agent", agent: must(loopagent.New(loopagent.Config{ AgentConfig: agent.Config{ Name: "Test", Description: "Test test.", SubAgents: []agent.Agent{ must(agent.New(agent.Config{Name: "Inner 1", Description: "Inner 1 description"})), must(agent.New(agent.Config{Name: "Inner 2", Description: "Inner 2 description"})), }, }, MaxIterations: 5, })), want: []a2a.AgentSkill{ { ID: "Test", Description: "Test test. This agent will Inner 1 description and Inner 2 description in a loop (max 5 iterations).", Name: "workflow", Tags: []string{"loop_workflow"}, }, { ID: "Test-sub-agents", Description: "Orchestrates: Inner 1 description; Inner 2 description", Name: "sub-agents", Tags: []string{"loop_workflow", "orchestration"}, }, { ID: "Inner 1_Inner 1", Description: "Inner 1 description", Name: "Inner 1: custom", Tags: []string{"sub_agent:Inner 1", "custom_agent"}, }, { ID: "Inner 2_Inner 2", Description: "Inner 2 description", Name: "Inner 2: custom", Tags: []string{"sub_agent:Inner 2", "custom_agent"}, }, }, }, { name: "unlimited loop agent", agent: must(loopagent.New(loopagent.Config{ AgentConfig: agent.Config{ Name: "Test", Description: "Test test.", SubAgents: []agent.Agent{ must(agent.New(agent.Config{Name: "Inner 1", Description: "Inner 1 description"})), }, }, })), want: []a2a.AgentSkill{ { ID: "Test", Description: "Test test. This agent will Inner 1 description in a loop (max unlimited iterations).", Name: "workflow", Tags: []string{"loop_workflow"}, }, { ID: "Test-sub-agents", Description: "Orchestrates: Inner 1 description", Name: "sub-agents", Tags: []string{"loop_workflow", "orchestration"}, }, { ID: "Inner 1_Inner 1", Description: "Inner 1 description", Name: "Inner 1: custom", Tags: []string{"sub_agent:Inner 1", "custom_agent"}, }, }, }, { name: "empty sequential agent", agent: must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{Name: "Test", Description: "Test test."}, })), want: []a2a.AgentSkill{ {ID: "Test", Description: "Test test.", Name: "workflow", Tags: []string{"sequential_workflow"}}, }, }, { name: "sequential agent", agent: must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "Test", Description: "Test test.", SubAgents: []agent.Agent{ must(agent.New(agent.Config{Name: "Inner 1", Description: "Inner 1 description"})), must(agent.New(agent.Config{Name: "Inner 2", Description: "Inner 2 description"})), }, }, })), want: []a2a.AgentSkill{ { ID: "Test", Description: "Test test. First, this agent will Inner 1 description. Finally, this agent will Inner 2 description.", Name: "workflow", Tags: []string{"sequential_workflow"}, }, { ID: "Test-sub-agents", Description: "Orchestrates: Inner 1 description; Inner 2 description", Name: "sub-agents", Tags: []string{"sequential_workflow", "orchestration"}, }, { ID: "Inner 1_Inner 1", Description: "Inner 1 description", Name: "Inner 1: custom", Tags: []string{"sub_agent:Inner 1", "custom_agent"}, }, { ID: "Inner 2_Inner 2", Description: "Inner 2 description", Name: "Inner 2: custom", Tags: []string{"sub_agent:Inner 2", "custom_agent"}, }, }, }, { name: "empty parallel agent", agent: must(parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{Name: "Test", Description: "Test test."}, })), want: []a2a.AgentSkill{ {ID: "Test", Description: "Test test.", Name: "workflow", Tags: []string{"parallel_workflow"}}, }, }, { name: "parallel agent", agent: must(parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "Test", Description: "Test test.", SubAgents: []agent.Agent{ must(agent.New(agent.Config{Name: "Inner 1", Description: "Inner 1 description"})), must(agent.New(agent.Config{Name: "Inner 2", Description: "Inner 2 description"})), }, }, })), want: []a2a.AgentSkill{ { ID: "Test", Description: "Test test. This agent will Inner 1 description and Inner 2 description simultaneously.", Name: "workflow", Tags: []string{"parallel_workflow"}, }, { ID: "Test-sub-agents", Description: "Orchestrates: Inner 1 description; Inner 2 description", Name: "sub-agents", Tags: []string{"parallel_workflow", "orchestration"}, }, { ID: "Inner 1_Inner 1", Description: "Inner 1 description", Name: "Inner 1: custom", Tags: []string{"sub_agent:Inner 1", "custom_agent"}, }, { ID: "Inner 2_Inner 2", Description: "Inner 2 description", Name: "Inner 2: custom", Tags: []string{"sub_agent:Inner 2", "custom_agent"}, }, }, }, { name: "deep subagents", agent: must(parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: "Test", Description: "Test test.", SubAgents: []agent.Agent{ must(loopagent.New(loopagent.Config{ AgentConfig: agent.Config{ Name: "Nested", Description: "Nested loop", SubAgents: []agent.Agent{ must(llmagent.New(llmagent.Config{ Name: "Test LLM", Description: "Test llm", Tools: []tool.Tool{loadArtifacts}, })), must(sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: "Leaf", Description: "Leaf agent", SubAgents: []agent.Agent{ must(agent.New(agent.Config{Name: "Leaf", Description: "leaf"})), }, }, })), }, }, })), }, }, })), want: []a2a.AgentSkill{ { ID: "Test", Description: "Test test. This agent will Nested loop simultaneously.", Name: "workflow", Tags: []string{"parallel_workflow"}, }, { ID: "Test-sub-agents", Description: "Orchestrates: Nested loop", Name: "sub-agents", Tags: []string{"parallel_workflow", "orchestration"}, }, { ID: "Nested_Nested", Description: "Nested loop This agent will Test llm and Leaf agent in a loop (max unlimited iterations).", Name: "Nested: workflow", Tags: []string{"sub_agent:Nested", "loop_workflow"}, }, { Description: "Orchestrates: Test llm; Leaf agent", ID: "Nested_Nested-sub-agents", Name: "Nested: sub-agents", Tags: []string{"sub_agent:Nested", "loop_workflow", "orchestration"}, }, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got := BuildAgentSkills(tc.agent) if diff := cmp.Diff(tc.want, got); diff != "" { t.Errorf("BuildAgentSkills() wrong result (+got,-want)\ngot = %+v\nwant = %+v\ndiff = %s", got, tc.want, diff) } }) } } func TestReplacePronouns(t *testing.T) { testCases := []struct { input string want string }{ { input: "you are an agent. you were an agent, you're an agent, you've tasks, your tasks", want: "I am an agent. I was an agent, I am an agent, I have tasks, my tasks", }, { input: "You should do your work and it will be yours.", want: "I should do my work and it will be mine.", }, { input: "YOU should do YOUR work and it will be YOURS.", want: "I should do my work and it will be mine.", }, { input: "You should do Your work and it will be Yours.", want: "I should do my work and it will be mine.", }, { input: "This is a test message without pronouns.", want: "This is a test message without pronouns.", }, { input: "youth, yourself, yourname", want: "youth, yourself, yourname", }, { input: "You are a helpful chatbot", want: "I am a helpful chatbot", }, { input: "Your task is to be helpful", want: "my task is to be helpful", }, { input: "you you you", want: "I I I", }, } for _, tc := range testCases { got := replacePronouns(tc.input) if got != tc.want { t.Errorf("replacePronouns(%q) = %q, want %q", tc.input, got, tc.want) } } } ================================================ FILE: server/adka2a/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package adka2a allows to expose ADK agents via A2A. package adka2a ================================================ FILE: server/adka2a/events.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "fmt" "maps" "github.com/a2aproject/a2a-go/a2a" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/session" ) // NewRemoteAgentEvent create a new Event authored by the agent running in the provided invocation context. func NewRemoteAgentEvent(ctx agent.InvocationContext) *session.Event { event := session.NewEvent(ctx.InvocationID()) event.Author = ctx.Agent().Name() event.Branch = ctx.Branch() return event } // EventToMessage converts the provided session event to A2A message. func EventToMessage(event *session.Event) (*a2a.Message, error) { if event == nil { return nil, nil } parts, err := ToA2AParts(event.Content.Parts, event.LongRunningToolIDs) if err != nil { return nil, fmt.Errorf("part conversion failed: %w", err) } eventMeta, err := toEventMeta(invocationMeta{}, event) if err != nil { return nil, fmt.Errorf("event metadata conversion failed: %w", err) } var role a2a.MessageRole if event.Author == "user" { role = a2a.MessageRoleUser } else { role = a2a.MessageRoleAgent } msg := a2a.NewMessage(role, parts...) msg.Metadata = setActionsMeta(msg.Metadata, event.Actions) maps.Copy(msg.Metadata, eventMeta) return msg, nil } // ToSessionEvent converts the provided a2a event to session event authored by the agent running in the provided invocation context. func ToSessionEvent(ctx agent.InvocationContext, event a2a.Event) (*session.Event, error) { return ToSessionEventWithParts(ctx, event, nil) } // ToSessionEventWithParts converts the provided a2a event to session event with custom part converter. func ToSessionEventWithParts(ctx agent.InvocationContext, event a2a.Event, partConverter A2APartConverter) (*session.Event, error) { if partConverter == nil { partConverter = func(ctx context.Context, a2aEvent a2a.Event, part a2a.Part) (*genai.Part, error) { return ToGenAIPart(part) } } switch v := event.(type) { case *a2a.Task: return taskToEvent(ctx, v, partConverter) case *a2a.Message: return messageToEvent(ctx, v, partConverter) case *a2a.TaskArtifactUpdateEvent: if len(v.Artifact.Parts) == 0 { return nil, nil } if IsPartial(v.Metadata) && v.LastChunk { // Partial ADK artifact reset return nil, nil } event, err := artifactUpdateEventToEvent(ctx, v, partConverter) if err != nil { return nil, fmt.Errorf("artifact update event conversion failed: %w", err) } if len(event.Content.Parts) == 0 { return nil, nil } event.LongRunningToolIDs = getLongRunningToolIDs(v.Artifact.Parts, event.Content.Parts) if err := processA2AMeta(v, event); err != nil { return nil, fmt.Errorf("metadata processing failed: %w", err) } if partial, ok := v.Metadata[metadataPartialKey].(bool); ok { event.Partial = partial } else { // append=false, lastChunk=false: emitted as partial, caller restarts aggregation // append=false, lastChunk=true: emitted as non partial, caller drops aggregation // append=true, lastChunk=false: emitted as partial, caller updates aggregation // append=true, lastChunk=true: emitted as partial, caller updates and emits aggregation as non-partial event.Partial = v.Append || !v.LastChunk } return event, nil case *a2a.TaskStatusUpdateEvent: if v.Final { return finalTaskStatusUpdateToEvent(ctx, v, partConverter) } if v.Status.Message == nil { return nil, nil } event, err := messageToEvent(ctx, v.Status.Message, partConverter) event.TurnComplete = false if err != nil { return nil, fmt.Errorf("custom metadata conversion failed: %w", err) } if len(event.Content.Parts) == 0 { return nil, nil } if err := processA2AMeta(v, event); err != nil { return nil, fmt.Errorf("metadata processing failed: %w", err) } for _, part := range event.Content.Parts { part.Thought = true } event.Partial = true return event, nil default: return nil, fmt.Errorf("unknown event type: %T", v) } } // ToCustomMetadata creates a session event custom metadata with A2A task and context IDs in it. func ToCustomMetadata(taskID a2a.TaskID, ctxID string) map[string]any { if taskID == "" && ctxID == "" { return nil } result := make(map[string]any) if taskID != "" { result[customMetaTaskIDKey] = string(taskID) } if ctxID != "" { result[customMetaContextIDKey] = ctxID } return result } // GetA2ATaskInfo returns A2A task and context IDs if they are present in session event custom metadata. func GetA2ATaskInfo(event *session.Event) (a2a.TaskID, string) { var taskID a2a.TaskID var contextID string if event == nil || event.CustomMetadata == nil { return taskID, contextID } if tid, ok := event.CustomMetadata[customMetaTaskIDKey].(string); ok { taskID = a2a.TaskID(tid) } if ctxID, ok := event.CustomMetadata[customMetaContextIDKey].(string); ok { contextID = ctxID } return taskID, contextID } func messageToEvent(ctx agent.InvocationContext, msg *a2a.Message, partConverter A2APartConverter) (*session.Event, error) { if ctx == nil { return nil, fmt.Errorf("InvocationContext not provided") } if msg == nil { return nil, nil } var parts []*genai.Part for _, part := range msg.Parts { genaiPart, err := partConverter(ctx, msg, part) if err != nil { return nil, fmt.Errorf("failed to convert message part: %w", err) } if genaiPart != nil { parts = append(parts, genaiPart) } } event := NewRemoteAgentEvent(ctx) if len(parts) > 0 { event.Content = genai.NewContentFromParts(parts, toGenAIRole(msg.Role)) } if err := processA2AMeta(msg, event); err != nil { return nil, fmt.Errorf("metadata processing failed: %w", err) } event.TurnComplete = true return event, nil } func artifactUpdateEventToEvent(ctx agent.InvocationContext, update *a2a.TaskArtifactUpdateEvent, partConverter A2APartConverter) (*session.Event, error) { if ctx == nil { return nil, fmt.Errorf("InvocationContext not provided") } if update == nil { return nil, nil } parts, err := convertParts(ctx, update, update.Artifact.Parts, partConverter) if err != nil { return nil, fmt.Errorf("failed to convert artifact parts: %w", err) } event := NewRemoteAgentEvent(ctx) event.Content = genai.NewContentFromParts(parts, genai.RoleModel) return event, nil } func taskToEvent(ctx agent.InvocationContext, task *a2a.Task, partConverter A2APartConverter) (*session.Event, error) { if ctx == nil { return nil, fmt.Errorf("InvocationContext not provided") } var parts []*genai.Part var longRunningToolIDs []string for _, artifact := range task.Artifacts { artifactParts, err := convertParts(ctx, task, artifact.Parts, partConverter) if err != nil { return nil, fmt.Errorf("failed to convert artifact parts: %w", err) } lrtIDs := getLongRunningToolIDs(artifact.Parts, artifactParts) parts = append(parts, artifactParts...) longRunningToolIDs = append(longRunningToolIDs, lrtIDs...) } event := NewRemoteAgentEvent(ctx) if task.Status.Message != nil { msgParts, err := convertParts(ctx, task, task.Status.Message.Parts, partConverter) if err != nil { return nil, fmt.Errorf("failed to convert status message parts: %w", err) } lrtIDs := getLongRunningToolIDs(task.Status.Message.Parts, msgParts) if task.Status.State == a2a.TaskStateFailed && len(msgParts) == 1 && msgParts[0].Text != "" { event.ErrorMessage = msgParts[0].Text } else { parts = append(parts, msgParts...) } longRunningToolIDs = append(longRunningToolIDs, lrtIDs...) } isTerminal := task.Status.State.Terminal() || task.Status.State == a2a.TaskStateInputRequired if len(parts) == 0 && !isTerminal { return nil, nil } if len(parts) > 0 { event.Content = genai.NewContentFromParts(parts, genai.RoleModel) } if task.Status.State == a2a.TaskStateInputRequired { event.LongRunningToolIDs = longRunningToolIDs } if err := processA2AMeta(task, event); err != nil { return nil, fmt.Errorf("metadata processing failed: %w", err) } event.TurnComplete = isTerminal return event, nil } func finalTaskStatusUpdateToEvent(ctx agent.InvocationContext, update *a2a.TaskStatusUpdateEvent, partConverter A2APartConverter) (*session.Event, error) { if update == nil { return nil, nil } event := NewRemoteAgentEvent(ctx) var parts []*genai.Part var err error if update.Status.Message != nil { parts, err = convertParts(ctx, update, update.Status.Message.Parts, partConverter) if err != nil { return nil, fmt.Errorf("failed to convert status message parts: %w", err) } } if update.Status.State == a2a.TaskStateFailed && len(parts) == 1 && parts[0].Text != "" { event.ErrorMessage = parts[0].Text } else if len(parts) > 0 { event.Content = genai.NewContentFromParts(parts, genai.RoleModel) } if err := processA2AMeta(update, event); err != nil { return nil, fmt.Errorf("metadata processing failed: %w", err) } if update.Status.Message != nil { event.LongRunningToolIDs = getLongRunningToolIDs(update.Status.Message.Parts, parts) } event.TurnComplete = true return event, nil } func getLongRunningToolIDs(parts []a2a.Part, converted []*genai.Part) []string { var ids []string for i, part := range parts { dp, ok := part.(a2a.DataPart) if !ok { continue } if longRunning, ok := dp.Metadata[a2aDataPartMetaLongRunningKey].(bool); ok && longRunning { fnCall := converted[i] if fnCall.FunctionCall == nil { // TODO(yarolegovich): log a warning continue } ids = append(ids, fnCall.FunctionCall.ID) } } return ids } func toGenAIRole(role a2a.MessageRole) genai.Role { if role == a2a.MessageRoleUser { return genai.RoleUser } else { return genai.RoleModel } } func toEventActions(meta map[string]any) session.EventActions { if meta == nil { return session.EventActions{} } var result session.EventActions result.Escalate, _ = meta[metadataEscalateKey].(bool) result.TransferToAgent, _ = meta[metadataTransferToAgentKey].(string) return result } func convertParts(ctx agent.InvocationContext, event a2a.Event, parts []a2a.Part, partConverter A2APartConverter) ([]*genai.Part, error) { var genaiParts []*genai.Part for _, part := range parts { genaiPart, err := partConverter(ctx, event, part) if err != nil { return nil, fmt.Errorf("failed to convert part: %w", err) } if genaiPart != nil { genaiParts = append(genaiParts, genaiPart) } } return genaiParts, nil } ================================================ FILE: server/adka2a/events_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestToSessionEvent(t *testing.T) { t.Parallel() taskID, contextID, branch, agentName := a2a.NewTaskID(), a2a.NewContextID(), "main", "a2a agent" a2aAgent, err := agent.New(agent.Config{Name: agentName}) if err != nil { t.Fatalf("failed to create an agent: %v", err) } testCases := []struct { name string input a2a.Event want *session.Event longRunningFunctionIDs []string }{ { name: "message", input: &a2a.Message{ Parts: []a2a.Part{a2a.TextPart{Text: "foo"}}, TaskID: taskID, ContextID: contextID, Metadata: map[string]any{ metadataGroundingKey: map[string]any{"sourceFlaggingUris": []any{map[string]any{"sourceId": "id1"}}}, metadataUsageKey: map[string]any{"candidatesTokenCount": float64(12), "thoughtsTokenCount": float64(42)}, metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}, metadataTransferToAgentKey: "a-2", metadataEscalateKey: true, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{{Text: "foo"}}, genai.RoleModel), UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, CustomMetadata: map[string]any{ "nested": map[string]any{"key": "value"}, customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, Actions: session.EventActions{Escalate: true, TransferToAgent: "a-2"}, }, }, { name: "nil values", input: &a2a.Message{ Parts: []a2a.Part{a2a.TextPart{Text: "foo"}}, TaskID: taskID, ContextID: contextID, Metadata: map[string]any{ metadataGroundingKey: nil, metadataUsageKey: nil, metadataCustomMetaKey: nil, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{{Text: "foo"}}, genai.RoleModel), CustomMetadata: map[string]any{customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID}, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, { name: "message with no parts", input: &a2a.Message{ TaskID: taskID, ContextID: contextID, }, want: &session.Event{ LLMResponse: model.LLMResponse{ CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, { name: "task", input: &a2a.Task{ ID: taskID, ContextID: contextID, Artifacts: []*a2a.Artifact{ { // long running key is ignored for non-input-required states ID: a2a.NewArtifactID(), Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "args": map[string]any{"city": "Warsaw"}, "name": "GetWeather"}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true}, }, }, }, {ID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: "foo"}}}, {ID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: "bar"}}}, }, Status: a2a.TaskStatus{ State: a2a.TaskStateCompleted, Message: a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "done"}), }, Metadata: map[string]any{ metadataGroundingKey: map[string]any{"sourceFlaggingUris": []any{map[string]any{"sourceId": "id1"}}}, metadataUsageKey: map[string]any{"candidatesTokenCount": float64(12), "thoughtsTokenCount": float64(42)}, metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}, metadataEscalateKey: true, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ { FunctionCall: &genai.FunctionCall{ ID: "get_weather", Args: map[string]any{"city": "Warsaw"}, Name: "GetWeather", }, }, {Text: "foo"}, {Text: "bar"}, {Text: "done"}, }, genai.RoleModel), UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, CustomMetadata: map[string]any{ "nested": map[string]any{"key": "value"}, customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, Actions: session.EventActions{Escalate: true}, }, }, { name: "terminal task with no parts", input: &a2a.Task{ ID: taskID, ContextID: contextID, Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, }, want: &session.Event{ LLMResponse: model.LLMResponse{ CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, { name: "non-terminal task with no parts", input: &a2a.Task{ ID: taskID, ContextID: contextID, Status: a2a.TaskStatus{State: a2a.TaskStateSubmitted}, }, want: nil, }, { name: "task in input required", input: &a2a.Task{ ID: taskID, ContextID: contextID, Artifacts: []*a2a.Artifact{ { ID: a2a.NewArtifactID(), Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "args": map[string]any{"city": "Warsaw"}, "name": "GetWeather"}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true}, }, }, }, }, Status: a2a.TaskStatus{State: a2a.TaskStateInputRequired}, Metadata: map[string]any{metadataEscalateKey: true}, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ { FunctionCall: &genai.FunctionCall{ ID: "get_weather", Args: map[string]any{"city": "Warsaw"}, Name: "GetWeather", }, }, }, genai.RoleModel), CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, LongRunningToolIDs: []string{"get_weather"}, Author: agentName, Branch: branch, Actions: session.EventActions{Escalate: true}, }, }, { name: "artifact update", input: &a2a.TaskArtifactUpdateEvent{ TaskID: taskID, ContextID: contextID, Artifact: &a2a.Artifact{ ID: a2a.NewArtifactID(), Parts: a2a.ContentParts{a2a.TextPart{Text: "foo"}, a2a.TextPart{Text: "bar"}}, }, Metadata: map[string]any{ metadataGroundingKey: map[string]any{"sourceFlaggingUris": []any{map[string]any{"sourceId": "id1"}}}, metadataUsageKey: map[string]any{"candidatesTokenCount": float64(12), "thoughtsTokenCount": float64(42)}, metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ {Text: "foo"}, {Text: "bar"}, }, genai.RoleModel), GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, CustomMetadata: map[string]any{ "nested": map[string]any{"key": "value"}, customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, Partial: true, }, Author: agentName, Branch: branch, }, }, { name: "artifact update with no parts is skipped", input: &a2a.TaskArtifactUpdateEvent{ TaskID: taskID, ContextID: contextID, Artifact: &a2a.Artifact{ ID: a2a.NewArtifactID(), Parts: []a2a.Part{}, }, }, want: nil, }, { name: "artifact update with long running tool call", input: &a2a.TaskArtifactUpdateEvent{ TaskID: taskID, ContextID: contextID, Artifact: &a2a.Artifact{ ID: a2a.NewArtifactID(), Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "args": map[string]any{"city": "Warsaw"}, "name": "GetWeather"}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true}, }, }, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ { FunctionCall: &genai.FunctionCall{ ID: "get_weather", Args: map[string]any{"city": "Warsaw"}, Name: "GetWeather", }, }, }, genai.RoleModel), CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, Partial: true, }, LongRunningToolIDs: []string{"get_weather"}, Author: agentName, Branch: branch, }, }, { name: "final task status update with message", input: &a2a.TaskStatusUpdateEvent{ TaskID: taskID, ContextID: contextID, Final: true, Status: a2a.TaskStatus{ Message: &a2a.Message{ Parts: []a2a.Part{a2a.TextPart{Text: "foo"}}, }, }, Metadata: map[string]any{ metadataGroundingKey: map[string]any{"sourceFlaggingUris": []any{map[string]any{"sourceId": "id1"}}}, metadataUsageKey: map[string]any{"candidatesTokenCount": float64(12), "thoughtsTokenCount": float64(42)}, metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}, metadataEscalateKey: true, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{{Text: "foo"}}, genai.RoleModel), CustomMetadata: map[string]any{ "nested": map[string]any{"key": "value"}, customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, GroundingMetadata: &genai.GroundingMetadata{SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}}, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{CandidatesTokenCount: 12, ThoughtsTokenCount: 42}, }, Actions: session.EventActions{Escalate: true}, Author: agentName, Branch: branch, }, }, { name: "final task status update without message", input: &a2a.TaskStatusUpdateEvent{TaskID: taskID, ContextID: contextID, Final: true}, want: &session.Event{ LLMResponse: model.LLMResponse{ CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, { name: "non final task status update message is a thought", input: &a2a.TaskStatusUpdateEvent{ TaskID: taskID, ContextID: contextID, Status: a2a.TaskStatus{ State: a2a.TaskStateCompleted, Message: &a2a.Message{ Parts: []a2a.Part{a2a.TextPart{Text: "foo"}}, }, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{{Text: "foo", Thought: true}}, genai.RoleModel), CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, Partial: true, }, Author: agentName, Branch: branch, }, }, { name: "non-final task status update without message is skipped", input: &a2a.TaskStatusUpdateEvent{TaskID: taskID, ContextID: contextID}, want: nil, }, { name: "task status failed with single-part message", input: &a2a.TaskStatusUpdateEvent{ TaskID: taskID, ContextID: contextID, Final: true, Status: a2a.TaskStatus{ State: a2a.TaskStateFailed, Message: &a2a.Message{Parts: []a2a.Part{a2a.TextPart{Text: "failed with an error"}}}, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ ErrorMessage: "failed with an error", CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, { name: "task with multiple artifacts and mixed long-running tools", input: &a2a.Task{ ID: taskID, ContextID: contextID, Artifacts: []*a2a.Artifact{ { ID: "artifact-1", Parts: []a2a.Part{ a2a.TextPart{Text: "Checking weather..."}, a2a.DataPart{ Data: map[string]any{"id": "tool_1", "name": "GetWeather", "args": map[string]any{"city": "London"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, }, }, { ID: "artifact-2", Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "tool_2", "name": "GetNews", "args": map[string]any{"topic": "tech"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, }, }, }, Status: a2a.TaskStatus{State: a2a.TaskStateInputRequired}, }, want: &session.Event{ LLMResponse: model.LLMResponse{ Content: genai.NewContentFromParts([]*genai.Part{ {Text: "Checking weather..."}, {FunctionCall: &genai.FunctionCall{ID: "tool_1", Name: "GetWeather", Args: map[string]any{"city": "London"}}}, {FunctionCall: &genai.FunctionCall{ID: "tool_2", Name: "GetNews", Args: map[string]any{"topic": "tech"}}}, }, genai.RoleModel), CustomMetadata: map[string]any{ customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID, }, TurnComplete: true, }, LongRunningToolIDs: []string{"tool_1", "tool_2"}, Author: agentName, Branch: branch, }, }, { name: "task with single-part text status", input: &a2a.Task{ ID: taskID, ContextID: contextID, Status: a2a.TaskStatus{ State: a2a.TaskStateFailed, Message: &a2a.Message{Parts: []a2a.Part{a2a.TextPart{Text: "failed with an error"}}}, }, }, want: &session.Event{ LLMResponse: model.LLMResponse{ ErrorMessage: "failed with an error", CustomMetadata: map[string]any{customMetaTaskIDKey: string(taskID), customMetaContextIDKey: contextID}, TurnComplete: true, }, Author: agentName, Branch: branch, }, }, } ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID"), cmpopts.IgnoreFields(session.Event{}, "Timestamp"), cmpopts.IgnoreFields(session.Event{}, "InvocationID"), cmpopts.IgnoreFields(session.EventActions{}, "StateDelta"), } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { ictx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{Branch: branch, Agent: a2aAgent}) got, err := ToSessionEvent(ictx, tc.input) if err != nil { t.Errorf("ToSessionEvent() error = %v, want nil", err) } if diff := cmp.Diff(tc.want, got, ignoreFields...); diff != "" { t.Errorf("ToSessionEvent() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", got, tc.want, diff) } }) } } func TestToSessionEventWithParts_NilResultFiltered(t *testing.T) { taskID, contextID, branch, agentName := a2a.NewTaskID(), a2a.NewContextID(), "main", "a2a agent" a2aAgent, err := agent.New(agent.Config{Name: agentName}) if err != nil { t.Fatalf("failed to create an agent: %v", err) } keepPart := a2a.TextPart{Text: "KEEP"} dropPart := a2a.TextPart{Text: "DROP"} filterConverter := func(ctx context.Context, ev a2a.Event, p a2a.Part) (*genai.Part, error) { if tp, ok := p.(a2a.TextPart); ok && tp.Text == "DROP" { return nil, nil } return ToGenAIPart(p) } testCases := []struct { name string input a2a.Event }{ { name: "task event", input: &a2a.Task{ ID: taskID, ContextID: contextID, Artifacts: []*a2a.Artifact{{Parts: []a2a.Part{keepPart, dropPart}}}, Status: a2a.TaskStatus{ State: a2a.TaskStateCompleted, Message: &a2a.Message{Parts: []a2a.Part{keepPart, dropPart}}, }, }, }, { name: "message event", input: &a2a.Message{ Parts: []a2a.Part{keepPart, dropPart}, }, }, { name: "artifact update event", input: &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: []a2a.Part{keepPart, dropPart}}, }, }, { name: "status update event", input: &a2a.TaskStatusUpdateEvent{ TaskID: taskID, ContextID: contextID, Final: true, Status: a2a.TaskStatus{ Message: &a2a.Message{Parts: []a2a.Part{keepPart, dropPart}}, }, }, }, } ictx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{Branch: branch, Agent: a2aAgent}) for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { got, err := ToSessionEventWithParts(ictx, tc.input, filterConverter) if err != nil { t.Fatalf("ToSessionEventWithParts() error = %v", err) } if got == nil { t.Fatal("got event is nil, expected valid event with filtered parts") } parts := got.LLMResponse.Content.Parts for _, p := range parts { if p == nil { t.Fatalf("got nil part, want it filtered out.") } if p.Text != "KEEP" { t.Errorf("got %s, want 'KEEP'", p.Text) } } }) } } ================================================ FILE: server/adka2a/executor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "errors" "fmt" "slices" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2asrv" "github.com/a2aproject/a2a-go/a2asrv/eventqueue" "github.com/a2aproject/a2a-go/log" "google.golang.org/genai" "google.golang.org/adk/agent" iremoteagent "google.golang.org/adk/internal/agent/remoteagent" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) // BeforeExecuteCallback is the callback which will be called before an execution is started. type BeforeExecuteCallback func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error) // AfterEventCallback is the callback which will be called after an ADK event is converted to an A2A event. type AfterEventCallback func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error // AfterExecuteCallback is the callback which will be called after an execution resolved into a completed or failed task. type AfterExecuteCallback func(ctx ExecutorContext, finalEvent *a2a.TaskStatusUpdateEvent, err error) error // A2APartConverter is a custom converter for converting A2A parts to GenAI parts. // Implementations should generally remember to leverage adka2a.ToGenAiPart for default conversions // nil returns are considered intentionally dropped parts. type A2APartConverter func(ctx context.Context, a2aEvent a2a.Event, part a2a.Part) (*genai.Part, error) // GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts. // Implementations should generally remember to leverage adka2a.ToA2APart for default conversions // nil returns are considered intentionally dropped parts. type GenAIPartConverter func(ctx context.Context, adkEvent *session.Event, part *genai.Part) (a2a.Part, error) // A2AExecutionCleanupCallback is a callback which will be called after an execution or cancellatio has completed or failed. type A2AExecutionCleanupCallback func(ctx context.Context, reqCtx *a2asrv.RequestContext, subAgentCards []*a2a.AgentCard, result a2a.SendMessageResult, cause error) // OutputMode controls how artifacts are produced. type OutputMode string const ( // OutputArtifactPerRun produces a single artifact per [runner.Runner.Run]. OutputArtifactPerRun OutputMode = "artifact-per-run" // OutputArtifactPerEvent produces an artifact per non-partial [session.Event]. // While agent is emitting events an artifact is build incrementally (parts are append to it). // The next partial event replaces accumulated contents and seals the artifact, meaning // the next event from this agent will create a new artifact. OutputArtifactPerEvent OutputMode = "artifact-per-event" ) // ExecutorConfig allows to configure Executor. type ExecutorConfig struct { // RunnerConfig is the configuration which will be used for [runner.New] during A2A Execute invocation. RunnerConfig runner.Config // RunConfig is the configuration which will be passed to [runner.Runner.Run] during A2A Execute invocation. RunConfig agent.RunConfig // BeforeExecuteCallback is the callback which will be called before an execution is started. // It can be used to instrument a context or prevent the execution by returning an error. BeforeExecuteCallback BeforeExecuteCallback // AfterEventCallback is the callback which will be called after an ADK event is successfully converted to an A2A event. // This gives an opportunity to enrich the event with additional metadata or abort the execution by returning an error. // The callback is not invoked for errors originating from ADK or event processing. Such errors are converted to // TaskStatusUpdateEvent-s with TaskStateFailed state. If needed these can be intercepted using AfterExecuteCallback. AfterEventCallback AfterEventCallback // AfterExecuteCallback is the callback which will be called after an execution resolved into a completed or failed task. // This gives an opportunity to enrich the event with additional metadata or log it. AfterExecuteCallback AfterExecuteCallback // A2APartConverter is a custom converter for converting A2A parts to GenAI parts. // Implementations should generally remember to leverage [adka2a.ToGenAiPart] for default conversions // nil returns are considered intentionally dropped parts. A2APartConverter A2APartConverter // GenAIPartConverter is a custom converter for converting GenAI parts to A2A parts. // Implementations should generally remember to leverage [adka2a.ToA2APart] for default conversions // nil returns are considered intentionally dropped parts. GenAIPartConverter GenAIPartConverter // OutputMode controls how artifacts are produced. Can be [OutputArtifactPerRun] or [OutputArtifactPerEvent]. // Defaults to [OutputArtifactPerRun]. OutputMode OutputMode // A2AExecutionCleanupCallback is a callback which will be called after an execution or cancellation has completed or failed. // If not provided, the default behavior is to log the failure cause, if any. A2AExecutionCleanupCallback A2AExecutionCleanupCallback } var _ a2asrv.AgentExecutor = (*Executor)(nil) // Executor invokes an ADK agent and translates [session.Event]-s to [a2a.Event]-s according to the following rules: // - If the input doesn't reference any a2a.Task, produce a Task with TaskStateSubmitted state. // - Right before runner.Runner invocation, produce TaskStatusUpdateEvent with TaskStateWorking. // - For every session.Event produce a TaskArtifactUpdateEvent{Append=true} with transformed parts. // - After the last session.Event is processed produce an empty TaskArtifactUpdateEvent{Append=true} with LastChunk=true, // if at least one artifact update was produced during the run. // - If there was an LLMResponse with non-zero error code, produce a TaskStatusUpdateEvent with TaskStateFailed. // Else if there was an LLMResponse with long-running tool invocation, produce a TaskStatusUpdateEvent with TaskStateInputRequired. // Else produce a TaskStatusUpdateEvent with TaskStateCompleted. type Executor struct { config ExecutorConfig } // NewExecutor creates an initialized [Executor] instance. func NewExecutor(config ExecutorConfig) *Executor { return &Executor{config: config} } func (e *Executor) Execute(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { msg := reqCtx.Message if msg == nil { return fmt.Errorf("message not provided") } content, err := toGenAIContent(ctx, msg, e.config.A2APartConverter) if err != nil { return fmt.Errorf("a2a message conversion failed: %w", err) } runnerCfg, executorPlugin, err := withExecutorPlugin(e.config.RunnerConfig) if err != nil { return fmt.Errorf("failed to install a2a-executor plugin: %w", err) } r, err := runner.New(runnerCfg) if err != nil { return fmt.Errorf("failed to create a runner: %w", err) } if e.config.BeforeExecuteCallback != nil { ctx, err = e.config.BeforeExecuteCallback(ctx, reqCtx) if err != nil { return fmt.Errorf("before execute: %w", err) } } if event, err := handleInputRequired(reqCtx, content); event != nil || err != nil { if err != nil { return err } return queue.Write(ctx, event) } if reqCtx.StoredTask == nil { event := a2a.NewSubmittedTask(reqCtx, msg) if err := queue.Write(ctx, event); err != nil { return fmt.Errorf("failed to submit a task: %w", err) } } invocationMeta := toInvocationMeta(ctx, e.config, reqCtx) err = e.prepareSession(ctx, invocationMeta) if err != nil { event := toTaskFailedUpdateEvent(reqCtx, err, invocationMeta.eventMeta) execCtx := newExecutorContext(ctx, invocationMeta, executorPlugin, content) return e.writeFinalTaskStatus(execCtx, queue, nil, event, err) } event := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateWorking, nil) event.Metadata = invocationMeta.eventMeta if err := queue.Write(ctx, event); err != nil { return err } var artifactTransform eventToArtifactTransform if e.config.OutputMode == OutputArtifactPerEvent { artifactTransform = newArtifactMaker(reqCtx) } else { artifactTransform = newLegacyArtifactMaker(reqCtx) } processor := newEventProcessor(reqCtx, invocationMeta, e.config.GenAIPartConverter, artifactTransform) executorContext := newExecutorContext(ctx, invocationMeta, executorPlugin, content) return e.process(executorContext, r, processor, queue) } func (e *Executor) Cancel(ctx context.Context, reqCtx *a2asrv.RequestContext, queue eventqueue.Queue) error { event := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateCanceled, nil) event.Final = true return queue.Write(ctx, event) } func (e *Executor) Cleanup(ctx context.Context, reqCtx *a2asrv.RequestContext, result a2a.SendMessageResult, cause error) { remoteSubagents := findRemoteSubagents(e.config.RunnerConfig.Agent) // If task was in input-required and got successfully cancelled - run the cleanup logic if reqCtx.StoredTask != nil && reqCtx.StoredTask.Status.State == a2a.TaskStateInputRequired { if task, ok := result.(*a2a.Task); ok && task.Status.State == a2a.TaskStateCanceled && reqCtx.Message == nil { if err := e.cancelChildInputRequiredTasks(ctx, reqCtx, reqCtx.StoredTask.Status, remoteSubagents); err != nil { log.Warn(ctx, "failed to cancel subagent tasks waiting for input", "cause", err) } } } if e.config.A2AExecutionCleanupCallback != nil { subAgentCards := make([]*a2a.AgentCard, len(remoteSubagents)) for i, subagent := range remoteSubagents { subAgentCards[i] = subagent.config.AgentCard } e.config.A2AExecutionCleanupCallback(ctx, reqCtx, subAgentCards, result, cause) } else if cause != nil { if reqCtx.Message != nil { log.Warn(ctx, "execution failed", "error", cause) } else { log.Warn(ctx, "cancellation failed", "error", cause) } } } func (e *Executor) cancelChildInputRequiredTasks(ctx context.Context, reqCtx *a2asrv.RequestContext, status a2a.TaskStatus, subagents []remoteAgent) error { if len(subagents) == 0 { return nil } meta := toInvocationMeta(ctx, e.config, reqCtx) getSessionResponse, err := e.config.RunnerConfig.SessionService.Get(ctx, &session.GetRequest{ AppName: e.config.RunnerConfig.AppName, UserID: meta.userID, SessionID: meta.sessionID, }) if err != nil { return fmt.Errorf("failed to get a session: %w", err) } tasksToCancel, err := getSubagentTasksToCancel(ctx, status, getSessionResponse.Session) if err != nil { return fmt.Errorf("subtask search failed: %w", err) } if len(tasksToCancel) == 0 { return nil } var failures []error clientCache := map[string]*a2aclient.Client{} for _, task := range tasksToCancel { // TODO(yarolegovich): run in parallel (how to limit?) remoteSubagentIdx := slices.IndexFunc(subagents, func(a remoteAgent) bool { return a.agent.Name() == task.agentName }) if remoteSubagentIdx < 0 { continue } remoteSubagent := subagents[remoteSubagentIdx] client, ok := clientCache[task.agentName] if !ok { _, newClient, err := iremoteagent.CreateA2AClient(ctx, remoteSubagent.config) if err != nil { failures = append(failures, fmt.Errorf("failed to create A2A client: %w", err)) continue } clientCache[task.agentName] = newClient client = newClient } _, err = client.CancelTask(ctx, &a2a.TaskIDParams{ID: task.taskID}) if err != nil { failures = append(failures, fmt.Errorf("failed to cancel task: %w", err)) continue } } for _, client := range clientCache { if err := client.Destroy(); err != nil { failures = append(failures, fmt.Errorf("client destroy failed: %w", err)) } } return errors.Join(failures...) } // Processing failures should be delivered as Task failed events. An error is returned from this method if an event write fails. func (e *Executor) process(ctx ExecutorContext, r *runner.Runner, processor *eventProcessor, q eventqueue.Queue) error { meta := processor.meta for adkEvent, adkErr := range r.Run(ctx, meta.userID, meta.sessionID, ctx.UserContent(), e.config.RunConfig) { if adkErr != nil { event := processor.makeTaskFailedEvent(fmt.Errorf("agent run failed: %w", adkErr), nil) return e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), event, adkErr) } a2aEvent, pErr := processor.process(ctx, adkEvent) if pErr == nil && a2aEvent != nil && e.config.AfterEventCallback != nil { pErr = e.config.AfterEventCallback(ctx, adkEvent, a2aEvent) } if pErr != nil { event := processor.makeTaskFailedEvent(fmt.Errorf("processor failed: %w", pErr), adkEvent) return e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), event, pErr) } if a2aEvent != nil { if err := q.Write(ctx, a2aEvent); err != nil { return fmt.Errorf("event write failed: %w", err) } } } finalStatus := processor.makeFinalStatusUpdate() return e.writeFinalTaskStatus(ctx, q, processor.makeFinalArtifactUpdate(), finalStatus, nil) } func (e *Executor) writeFinalTaskStatus( ctx ExecutorContext, queue eventqueue.Queue, partialReset *a2a.TaskArtifactUpdateEvent, status *a2a.TaskStatusUpdateEvent, err error, ) error { if e.config.AfterExecuteCallback != nil { if err = e.config.AfterExecuteCallback(ctx, status, err); err != nil { return fmt.Errorf("after execute: %w", err) } } if partialReset != nil { if err := queue.Write(ctx, partialReset); err != nil { return fmt.Errorf("partial artifact update write failed: %w", err) } } if err := queue.Write(ctx, status); err != nil { return fmt.Errorf("%q state update event write failed: %w", status.Status.State, err) } return nil } func (e *Executor) prepareSession(ctx context.Context, meta invocationMeta) error { service := e.config.RunnerConfig.SessionService _, err := service.Get(ctx, &session.GetRequest{ AppName: e.config.RunnerConfig.AppName, UserID: meta.userID, SessionID: meta.sessionID, }) if err == nil { return nil } _, err = service.Create(ctx, &session.CreateRequest{ AppName: e.config.RunnerConfig.AppName, UserID: meta.userID, SessionID: meta.sessionID, State: make(map[string]any), }) if err != nil { return fmt.Errorf("failed to create a session: %w", err) } return nil } ================================================ FILE: server/adka2a/executor_context.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "iter" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/genai" "google.golang.org/adk/session" ) // ExecutorContext provides read-only information about the context of an A2A agent execution. // An execution starts with a user message and ends with a task in a terminal or input-required state. type ExecutorContext interface { context.Context // SessionID is ID of the session. It is passed as contextID in A2A request. SessionID() string // UserID is ID of the user who made the request. The information is either extracted from [a2asrv.CallContext] // or derived from session ID for unauthenticated requests. UserID() string // AgentName is the name of the root agent. AgentName() string // ReadonlyState provides a view of the current session state. ReadonlyState() session.ReadonlyState // Events provides a readonly view of the current session events. Events() session.Events // UserContent is a converted A2A message which is passed to runner.Run. UserContent() *genai.Content // RequestContext containts information about the original A2A Request, the current task and related tasks. RequestContext() *a2asrv.RequestContext } type executorContext struct { context.Context meta invocationMeta plugin *executorPlugin userContent *genai.Content } func newExecutorContext(ctx context.Context, meta invocationMeta, plugin *executorPlugin, userContent *genai.Content) ExecutorContext { return &executorContext{ Context: ctx, meta: meta, plugin: plugin, userContent: userContent, } } func (ec *executorContext) SessionID() string { return ec.meta.sessionID } func (ec *executorContext) UserID() string { return ec.meta.userID } func (ec *executorContext) AgentName() string { return ec.meta.agentName } func (ec *executorContext) ReadonlyState() session.ReadonlyState { session := ec.plugin.invocationSession if session == nil { return emptySessionState{} } return session.State() } func (ec *executorContext) Events() session.Events { session := ec.plugin.invocationSession if session == nil { return emptySessionEvents{} } return session.Events() } func (ec *executorContext) RequestContext() *a2asrv.RequestContext { return ec.meta.reqCtx } func (ec *executorContext) UserContent() *genai.Content { return ec.userContent } type emptySessionState struct{} func (emptySessionState) Get(string) (any, error) { return nil, session.ErrStateKeyNotExist } func (emptySessionState) All() iter.Seq2[string, any] { return func(yield func(string, any) bool) {} } type emptySessionEvents struct{} func (emptySessionEvents) At(i int) *session.Event { return nil } func (emptySessionEvents) All() iter.Seq[*session.Event] { return func(yield func(*session.Event) bool) {} } func (emptySessionEvents) Len() int { return 0 } ================================================ FILE: server/adka2a/executor_plugin.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "slices" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/plugin" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) type executorPlugin struct { plugin *plugin.Plugin invocationSession session.Session } func withExecutorPlugin(cfg runner.Config) (runner.Config, *executorPlugin, error) { executorPlugin, err := newExecutorPlugin() if err != nil { return cfg, nil, err } cfg.PluginConfig.Plugins = append(slices.Clone(cfg.PluginConfig.Plugins), executorPlugin.plugin) return cfg, executorPlugin, nil } func newExecutorPlugin() (*executorPlugin, error) { execPlugin := &executorPlugin{} plugin, err := plugin.New(plugin.Config{ Name: "a2a-executor", BeforeRunCallback: func(ic agent.InvocationContext) (*genai.Content, error) { execPlugin.invocationSession = ic.Session() return nil, nil }, }) if err != nil { return nil, err } execPlugin.plugin = plugin return execPlugin, nil } ================================================ FILE: server/adka2a/executor_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "fmt" "iter" "net/http/httptest" "testing" "time" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2aclient" "github.com/a2aproject/a2a-go/a2asrv" "github.com/a2aproject/a2a-go/a2asrv/eventqueue" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" ) type testQueue struct { eventqueue.Queue events []a2a.Event writeErr *eventIndex } func (q *testQueue) Write(_ context.Context, e a2a.Event) error { if q.writeErr != nil && q.writeErr.i == len(q.events) { return fmt.Errorf("queue write failed") } q.events = append(q.events, e) return nil } type testSessionService struct { session.Service createErr bool } func (s *testSessionService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) { if s.createErr { return nil, fmt.Errorf("session creation failed") } return s.Service.Create(ctx, req) } func newEventReplayAgent(events []*session.Event, failWith error) (agent.Agent, error) { return agent.New(agent.Config{ Name: "test", Run: func(agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { for _, event := range events { if !yield(event, nil) { return } } if failWith != nil { yield(nil, failWith) } } }, }) } func newInMemoryQueue(t *testing.T) eventqueue.Queue { t.Helper() qm := eventqueue.NewInMemoryManager() q, err := qm.GetOrCreate(t.Context(), "test") if err != nil { t.Fatalf("qm.GetOrCreate() error = %v", err) } return q } type eventIndex struct{ i int } func TestExecutor_Execute(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} hiMsg := a2a.NewMessage(a2a.MessageRoleUser, a2a.TextPart{Text: "hi"}) hiMsgForTask := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: "hi"}) testCases := []struct { name string request *a2a.MessageSendParams events []*session.Event wantEvents []a2a.Event createSessionFails bool agentRunFails error queueWriteFails *eventIndex wantErr bool }{ { name: "no message", request: &a2a.MessageSendParams{}, wantErr: true, }, { name: "malformed data", request: &a2a.MessageSendParams{Message: a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.FilePart{ File: a2a.FileBytes{Bytes: "(*_*)"}, // malformed base64 })}, wantErr: true, }, { name: "session setup fails", request: &a2a.MessageSendParams{Message: hiMsgForTask}, createSessionFails: true, wantEvents: []a2a.Event{ newFinalStatusUpdate( task, a2a.TaskStateFailed, a2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: "failed to create a session: session creation failed"}), ), }, }, { name: "success for a new task", request: &a2a.MessageSendParams{Message: hiMsg}, events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, wantEvents: []a2a.Event{ a2a.NewSubmittedTask(task, hiMsg), a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), a2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: ", world!"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "success for existing task", request: &a2a.MessageSendParams{Message: hiMsgForTask}, events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), a2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: ", world!"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "queue write fails", request: &a2a.MessageSendParams{Message: hiMsgForTask}, queueWriteFails: &eventIndex{0}, wantErr: true, }, { name: "llm fails", request: &a2a.MessageSendParams{Message: hiMsgForTask}, events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: model.LLMResponse{ErrorCode: "418", ErrorMessage: "I'm a teapot"}}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), a2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: ", world!"}), toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "418", ErrorMessage: "I'm a teapot"}), map[string]any{ToA2AMetaKey("error_code"): "418"}, ), }, }, { name: "agent run fails", request: &a2a.MessageSendParams{Message: hiMsgForTask}, events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, }, agentRunFails: fmt.Errorf("OOF"), wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), newFinalStatusUpdate( task, a2a.TaskStateFailed, a2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: "agent run failed: OOF"}), ), }, }, { name: "agent run and queue write fail", request: &a2a.MessageSendParams{Message: hiMsgForTask}, events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, }, queueWriteFails: &eventIndex{2}, agentRunFails: fmt.Errorf("OOF"), wantErr: true, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), }, }, } for _, tc := range testCases { ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(a2a.Message{}, "ID"), cmpopts.IgnoreFields(a2a.Artifact{}, "ID"), cmpopts.IgnoreFields(a2a.TaskStatus{}, "Timestamp"), cmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, "Metadata"), cmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, "Metadata"), } t.Run(tc.name, func(t *testing.T) { agent, err := newEventReplayAgent(tc.events, tc.agentRunFails) if err != nil { t.Fatalf("newEventReplayAgent() error = %v, want nil", err) } sessionService := &testSessionService{Service: session.InMemoryService(), createErr: tc.createSessionFails} runnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService} executor := NewExecutor(ExecutorConfig{RunnerConfig: runnerConfig}) queue := &testQueue{Queue: newInMemoryQueue(t), writeErr: tc.queueWriteFails} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: tc.request.Message} if tc.request.Message != nil && tc.request.Message.TaskID == task.ID { reqCtx.StoredTask = task } err = executor.Execute(t.Context(), reqCtx, queue) if err != nil && !tc.wantErr { t.Fatalf("executor.Execute() error = %v, want nil", err) } if err == nil && tc.wantErr { t.Fatalf("executor.Execute() produced %d events, want error", len(queue.events)) } if tc.wantEvents != nil { if diff := cmp.Diff(tc.wantEvents, queue.events, ignoreFields...); diff != "" { t.Fatalf("executor.Execute() wrong events (+got,-want):\ngot = %v\nwant = %v\ndiff = %s", queue.events, tc.wantEvents, diff) } } }) } } func TestExecutor_Cancel(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} executor := NewExecutor(ExecutorConfig{}) reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID} queue := &testQueue{Queue: newInMemoryQueue(t)} reqCtx.StoredTask = task err := executor.Cancel(t.Context(), reqCtx, queue) if err != nil { t.Fatalf("executor.Cancel() error = %v, want nil", err) } if len(queue.events) != 1 { t.Fatalf("executor.Cancel() produced %d events, want 1", queue.events) } event := queue.events[0].(*a2a.TaskStatusUpdateEvent) if event.Status.State != a2a.TaskStateCanceled { t.Fatalf("executor.Cancel() = %v, want a single TaskStateCanceled update", event) } } func TestExecutor_SessionReuse(t *testing.T) { ctx := t.Context() agent, err := newEventReplayAgent([]*session.Event{}, nil) if err != nil { t.Fatalf("newEventReplayAgent() error = %v, want nil", err) } sessionService := session.InMemoryService() task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} req := &a2a.MessageSendParams{Message: a2a.NewMessageForTask(a2a.MessageRoleUser, task)} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: req.Message} runnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService} config := ExecutorConfig{RunnerConfig: runnerConfig} executor := NewExecutor(config) queue := newInMemoryQueue(t) err = executor.Execute(ctx, reqCtx, queue) if err != nil { t.Fatalf("executor.Execute() error = %v, want nil", err) } err = executor.Execute(ctx, reqCtx, queue) if err != nil { t.Fatalf("executor.Execute() error = %v, want nil", err) } meta := toInvocationMeta(ctx, config, reqCtx) sessions, err := sessionService.List(ctx, &session.ListRequest{AppName: runnerConfig.AppName, UserID: meta.userID}) if err != nil { t.Fatalf("sessionService.List() error = %v, want nil", err) } if len(sessions.Sessions) != 1 { t.Fatalf("sessionService.List() got %d sessions, want 1", sessions.Sessions) } reqCtx.ContextID = a2a.NewContextID() otherContextMeta := toInvocationMeta(ctx, config, reqCtx) if meta.sessionID == otherContextMeta.sessionID { t.Fatal("want sessionID to be different for different contextIDs") } } func TestExecutor_Callbacks(t *testing.T) { type contextKeyType struct{} task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} hiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: "hi"}) testCases := []struct { name string createSessionFails bool events []*session.Event beforeExecution BeforeExecuteCallback afterEvent AfterEventCallback afterExecution AfterExecuteCallback wantEvents []a2a.Event wantErr error }{ { name: "abort execution", beforeExecution: func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error) { return nil, fmt.Errorf("aborted") }, wantErr: fmt.Errorf("aborted"), }, { name: "instrument context", beforeExecution: func(ctx context.Context, reqCtx *a2asrv.RequestContext) (context.Context, error) { return context.WithValue(ctx, contextKeyType{}, "bar"), nil }, afterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error { text, _ := ctx.Value(contextKeyType{}).(string) finalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: text}) return nil }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), newFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "bar"})), }, }, { name: "intercept processing failure", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello, world!"))}, }, afterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error { return fmt.Errorf("fail!") }, afterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error { finalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "bar"}) return nil }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), newFinalStatusUpdate(task, a2a.TaskStateFailed, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "bar"})), }, }, { name: "intercept session setup failure", createSessionFails: true, afterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error { eventCount := 0 for range ctx.ReadonlyState().All() { eventCount++ } finalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: fmt.Sprintf("%d events", eventCount)}) return nil }, wantEvents: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateFailed, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "0 events"}))}, }, { name: "enrich event", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, afterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error { processed.Artifact.Parts = append(processed.Artifact.Parts, a2a.TextPart{Text: " (enriched)"}) return nil }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}, a2a.TextPart{Text: " (enriched)"}), a2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: ", world!"}, a2a.TextPart{Text: " (enriched)"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "can access session events", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, afterExecution: func(ctx ExecutorContext, finalUpdate *a2a.TaskStatusUpdateEvent, err error) error { eventCount := ctx.Events().Len() finalUpdate.Status.Message = a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: fmt.Sprintf("event count = %d", eventCount)}) return nil }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), a2a.NewArtifactEvent(task, a2a.TextPart{Text: "Hello"}), a2a.NewArtifactUpdateEvent(task, a2a.NewArtifactID(), a2a.TextPart{Text: ", world!"}), newFinalStatusUpdate(task, a2a.TaskStateCompleted, a2a.NewMessage(a2a.MessageRoleAgent, a2a.TextPart{Text: "event count = 3"}), ), }, }, { name: "abort execution", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText(", world!"))}, }, afterEvent: func(ctx ExecutorContext, event *session.Event, processed *a2a.TaskArtifactUpdateEvent) error { return fmt.Errorf("abort execution") }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), toTaskFailedUpdateEvent(task, fmt.Errorf("processor failed: abort execution"), nil), }, }, } for _, tc := range testCases { ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(a2a.Message{}, "ID"), cmpopts.IgnoreFields(a2a.Artifact{}, "ID"), cmpopts.IgnoreFields(a2a.TaskStatus{}, "Timestamp"), cmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, "Metadata"), cmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, "Metadata"), } t.Run(tc.name, func(t *testing.T) { agent, err := newEventReplayAgent(tc.events, nil) if err != nil { t.Fatalf("newEventReplayAgent() error = %v, want nil", err) } sessionService := &testSessionService{Service: session.InMemoryService(), createErr: tc.createSessionFails} runnerConfig := runner.Config{AppName: agent.Name(), Agent: agent, SessionService: sessionService} executor := NewExecutor(ExecutorConfig{ RunnerConfig: runnerConfig, BeforeExecuteCallback: tc.beforeExecution, AfterEventCallback: tc.afterEvent, AfterExecuteCallback: tc.afterExecution, }) queue := &testQueue{Queue: newInMemoryQueue(t)} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} err = executor.Execute(t.Context(), reqCtx, queue) if err != nil && tc.wantErr == nil { t.Fatalf("executor.Execute() error = %v, want nil", err) } if err == nil && tc.wantErr != nil { t.Fatalf("executor.Execute() error = nil, want %v", tc.wantErr) } if tc.wantEvents != nil { if diff := cmp.Diff(tc.wantEvents, queue.events, ignoreFields...); diff != "" { t.Fatalf("executor.Execute() wrong events (+got,-want):\ngot = %v\nwant = %v\ndiff = %s", queue.events, tc.wantEvents, diff) } } }) } } func startA2AServer(agentExecutor a2asrv.AgentExecutor) *httptest.Server { requestHandler := a2asrv.NewHandler(agentExecutor) return httptest.NewServer(a2asrv.NewJSONRPCHandler(requestHandler)) } func TestExecutor_Cancel_AfterEvent(t *testing.T) { sessionService := session.InMemoryService() channel := make(chan struct{}) agent, err := agent.New(agent.Config{ Name: "test", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { return func(yield func(*session.Event, error) bool) { defer close(channel) <-ctx.Done() yield(nil, ctx.Err()) } }, }) if err != nil { t.Fatalf("agent.New() error = %v, want nil", err) } executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{ AppName: agent.Name(), Agent: agent, SessionService: sessionService, }, }) server := startA2AServer(executor) defer server.Close() card := &a2a.AgentCard{ Name: "test", URL: server.URL, PreferredTransport: a2a.TransportProtocolJSONRPC, } client, err := a2aclient.NewFromCard(t.Context(), card) if err != nil { t.Fatalf("a2aclient.NewFromCard() error = %v, want nil", err) } msgId := a2a.NewMessageID() blocking := false result, sendErr := client.SendMessage(t.Context(), &a2a.MessageSendParams{ Message: &a2a.Message{ID: string(msgId), Parts: []a2a.Part{a2a.TextPart{Text: "TEST"}}, Role: a2a.MessageRoleUser}, Config: &a2a.MessageSendConfig{Blocking: &blocking}, }) if sendErr != nil { t.Fatalf("client.SendMessage() error = %v, want nil", sendErr) } taskID := result.TaskInfo().TaskID task, err := client.CancelTask(t.Context(), &a2a.TaskIDParams{ID: taskID}) if err != nil { t.Fatalf("client.CancelTask() error = %v, want nil", err) } if task.Status.State != a2a.TaskStateCanceled { t.Fatalf("executor.Cancel() state = %v, want %v", task.Status.State, a2a.TaskStateCanceled) } // Verify that execution context is closed select { case <-channel: t.Log("Agent successfully unblocked") case <-time.After(1 * time.Second): t.Fatal("Agent did not unblock") } } func TestExecutor_Converters(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} hiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: "hi"}) t.Run("A2APartConverter", func(t *testing.T) { t.Run("modify input", func(t *testing.T) { var receivedText string agent, err := agent.New(agent.Config{ Name: "test", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { if parts := ctx.UserContent().Parts; len(parts) > 0 { receivedText = parts[0].Text } return func(yield func(*session.Event, error) bool) {} }, }) if err != nil { t.Fatalf("agent.New() error = %v", err) } executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()}, A2APartConverter: func(ctx context.Context, evt a2a.Event, part a2a.Part) (*genai.Part, error) { if p, ok := part.(a2a.TextPart); ok && p.Text == "hi" { return genai.NewPartFromText("HELLO"), nil } return nil, nil }, }) reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} if err := executor.Execute(t.Context(), reqCtx, newInMemoryQueue(t)); err != nil { t.Fatalf("executor.Execute() error = %v", err) } if receivedText != "HELLO" { t.Errorf("received text = %q, want %q", receivedText, "HELLO") } }) t.Run("filter input", func(t *testing.T) { var receivedParts int agent, err := agent.New(agent.Config{ Name: "test", Run: func(ctx agent.InvocationContext) iter.Seq2[*session.Event, error] { receivedParts = len(ctx.UserContent().Parts) return func(yield func(*session.Event, error) bool) {} }, }) if err != nil { t.Fatalf("agent.New() error = %v", err) } executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()}, A2APartConverter: func(ctx context.Context, evt a2a.Event, part a2a.Part) (*genai.Part, error) { return nil, nil }, }) reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} if err := executor.Execute(t.Context(), reqCtx, newInMemoryQueue(t)); err != nil { t.Fatalf("executor.Execute() error = %v", err) } if receivedParts != 0 { t.Errorf("received parts count = %d, want 0", receivedParts) } }) }) t.Run("GenAIPartConverter", func(t *testing.T) { agentEvents := []*session.Event{ {LLMResponse: model.LLMResponse{ Content: &genai.Content{Parts: []*genai.Part{genai.NewPartFromText("world")}}, }}, } t.Run("modify output", func(t *testing.T) { agent, err := newEventReplayAgent(agentEvents, nil) if err != nil { t.Fatalf("newEventReplayAgent() error = %v", err) } executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()}, GenAIPartConverter: func(ctx context.Context, evt *session.Event, part *genai.Part) (a2a.Part, error) { if part.Text == "world" { return a2a.TextPart{Text: "WORLD"}, nil } return a2a.TextPart{Text: part.Text}, nil }, }) queue := &testQueue{Queue: newInMemoryQueue(t)} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} if err := executor.Execute(t.Context(), reqCtx, queue); err != nil { t.Fatalf("executor.Execute() error = %v", err) } found := false for _, e := range queue.events { if ae, ok := e.(*a2a.TaskArtifactUpdateEvent); ok { for _, p := range ae.Artifact.Parts { if tp, ok := p.(a2a.TextPart); ok && tp.Text == "WORLD" { found = true } } } } if !found { t.Errorf("did not find 'WORLD' in events: %v", queue.events) } }) t.Run("filter output", func(t *testing.T) { agent, err := newEventReplayAgent(agentEvents, nil) if err != nil { t.Fatalf("newEventReplayAgent() error = %v", err) } executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()}, GenAIPartConverter: func(ctx context.Context, evt *session.Event, part *genai.Part) (a2a.Part, error) { return nil, nil }, }) queue := &testQueue{Queue: newInMemoryQueue(t)} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} if err := executor.Execute(t.Context(), reqCtx, queue); err != nil { t.Fatalf("executor.Execute() error = %v", err) } for _, e := range queue.events { if ae, ok := e.(*a2a.TaskArtifactUpdateEvent); ok { if len(ae.Artifact.Parts) != 0 { t.Errorf("found %d parts but expected 0", len(ae.Artifact.Parts)) } } } }) }) } func TestExecutor_OutputArtifactPerEvent(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} hiMsg := a2a.NewMessageForTask(a2a.MessageRoleUser, task, a2a.TextPart{Text: "hi"}) testCases := []struct { name string events []*session.Event wantEvents []a2a.Event wantArtifactMeta []map[string]any }{ { name: "single artifact per event chain", events: []*session.Event{ {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("Hello, ")), Author: "agent"}, {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("world!")), Author: "agent"}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello, world!")), Author: "agent"}, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Hello, "}}}, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "world!"}}}, Append: true, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Hello, world!"}}}, Append: false, LastChunk: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "multiple authors", events: []*session.Event{ {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("Agent1: H")), Author: "agent1"}, {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("Agent2: W")), Author: "agent2"}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Agent1: Hello")), Author: "agent1"}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Agent2: World")), Author: "agent2"}, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Agent1: H"}}}, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Agent2: W"}}}, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Agent1: Hello"}}}, Append: false, LastChunk: true, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "Agent2: World"}}}, Append: false, LastChunk: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "metadata and thoughts", events: []*session.Event{ { LLMResponse: modelPartialResponseFromParts(&genai.Part{Text: "Thinking...", Thought: true}), Author: "agent", InvocationID: "inv1", }, { LLMResponse: modelResponseFromParts(genai.NewPartFromText("Done")), Author: "agent", InvocationID: "inv1", }, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{ Parts: a2a.ContentParts{a2a.TextPart{ Text: "Thinking...", Metadata: map[string]any{ToA2AMetaKey("thought"): true}, }}, }, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{ Parts: a2a.ContentParts{a2a.TextPart{Text: "Done"}}, }, Append: false, LastChunk: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, wantArtifactMeta: []map[string]any{ {ToA2AMetaKey("invocation_id"): "inv1"}, {ToA2AMetaKey("invocation_id"): "inv1"}, }, }, { name: "mixed segments", events: []*session.Event{ { LLMResponse: modelResponseFromParts( &genai.Part{Text: "Thought part", Thought: true}, genai.NewPartFromText("Text part"), ), Author: "agent", }, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{ Parts: a2a.ContentParts{ a2a.TextPart{ Text: "Thought part", Metadata: map[string]any{ToA2AMetaKey("thought"): true}, }, a2a.TextPart{Text: "Text part"}, }, }, Append: false, LastChunk: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "sequential distinct artifact chains", events: []*session.Event{ {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("1.a")), Author: "agent"}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("1.final")), Author: "agent"}, {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("2.a")), Author: "agent"}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("2.final")), Author: "agent"}, }, wantEvents: []a2a.Event{ a2a.NewStatusUpdateEvent(task, a2a.TaskStateWorking, nil), &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "1.a"}}}, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "1.final"}}}, Append: false, LastChunk: true, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "2.a"}}}, Append: false, LastChunk: false, }, &a2a.TaskArtifactUpdateEvent{ Artifact: &a2a.Artifact{Parts: a2a.ContentParts{a2a.TextPart{Text: "2.final"}}}, Append: false, LastChunk: true, }, newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { agent, _ := newEventReplayAgent(tc.events, nil) executor := NewExecutor(ExecutorConfig{ RunnerConfig: runner.Config{AppName: agent.Name(), Agent: agent, SessionService: session.InMemoryService()}, OutputMode: OutputArtifactPerEvent, }) queue := &testQueue{Queue: newInMemoryQueue(t)} reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID, Message: hiMsg, StoredTask: task} if err := executor.Execute(t.Context(), reqCtx, queue); err != nil { t.Fatalf("executor.Execute() error = %v", err) } ignoreOptions := []cmp.Option{ cmpopts.IgnoreFields(a2a.Message{}, "ID"), cmpopts.IgnoreFields(a2a.Artifact{}, "ID", "Metadata"), // checked manually cmpopts.IgnoreFields(a2a.TaskStatus{}, "Timestamp"), cmpopts.IgnoreFields(a2a.TaskStatusUpdateEvent{}, "Metadata", "TaskID", "ContextID"), cmpopts.IgnoreFields(a2a.TaskArtifactUpdateEvent{}, "Metadata", "TaskID", "ContextID"), } if len(queue.events) != len(tc.wantEvents) { t.Fatalf("got %d events, want %d", len(queue.events), len(tc.wantEvents)) } authorToID, lastFinishedID := make(map[string]a2a.ArtifactID), make(map[string]a2a.ArtifactID) artifactCount := 0 for i := range queue.events { got := queue.events[i] want := tc.wantEvents[i] if diff := cmp.Diff(want, got, ignoreOptions...); diff != "" { t.Errorf("event[%d] mismatch (-want +got):\n%s", i, diff) } // Metadata check for cases that care about it if ge, ok := got.(*a2a.TaskArtifactUpdateEvent); ok { if artifactCount < len(tc.wantArtifactMeta) { wantMeta := tc.wantArtifactMeta[artifactCount] for k, v := range wantMeta { if gotV := ge.Artifact.Metadata[k]; gotV != v { t.Errorf("event[%d] Metadata[%s] = %v, want %v", i, k, gotV, v) } } } artifactCount++ } // Custom check for ArtifactID consistency if ge, ok := got.(*a2a.TaskArtifactUpdateEvent); ok { author := tc.events[i-1].Author // i-1 because first event is TaskStatusUpdateEvent if id, ok := authorToID[author]; ok { if ge.Artifact.ID != id { t.Errorf("event[%d] expected ArtifactID %v, got %v", i, id, ge.Artifact.ID) } } else { // New artifact stream started for this author if prevID, ok := lastFinishedID[author]; ok { if ge.Artifact.ID == prevID { t.Errorf("event[%d] expected NEW ArtifactID, but got same as previous chain: %v", i, ge.Artifact.ID) } } authorToID[author] = ge.Artifact.ID } if !tc.events[i-1].Partial { // Stream ended for this author lastFinishedID[author] = ge.Artifact.ID delete(authorToID, author) } } } }) } } ================================================ FILE: server/adka2a/input_required.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "fmt" "slices" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "github.com/a2aproject/a2a-go/log" "google.golang.org/genai" "google.golang.org/adk/session" ) type inputRequiredProcessor struct { reqCtx *a2asrv.RequestContext event *a2a.TaskStatusUpdateEvent partConverter GenAIPartConverter // handles possible duplication in partial and non-partial events addedParts []*genai.Part } func newInputRequiredProcessor(reqCtx *a2asrv.RequestContext, partConverter GenAIPartConverter) *inputRequiredProcessor { return &inputRequiredProcessor{reqCtx: reqCtx, partConverter: partConverter} } // process handles long-running function tool calls by accumulating them for the final task status update. // If a part was incorporated into the final task status update the original event is modified to not include it, // so that parts are not duplicated in the response. func (p *inputRequiredProcessor) process(ctx context.Context, event *session.Event) (*session.Event, error) { resp := event.LLMResponse if resp.Content == nil { return event, nil } var longRunningCallIDs []string var inputRequiredParts []*genai.Part var remainingParts []*genai.Part for _, part := range resp.Content.Parts { callID := "" if part.FunctionCall != nil && slices.Contains(event.LongRunningToolIDs, part.FunctionCall.ID) { callID = part.FunctionCall.ID } if p.isLongRunningResponse(event, part) { callID = part.FunctionResponse.ID } if callID == "" { remainingParts = append(remainingParts, part) continue } added := slices.ContainsFunc(p.addedParts, func(p *genai.Part) bool { if part.FunctionCall != nil && p.FunctionCall != nil && part.FunctionCall.ID == p.FunctionCall.ID { return true } return part.FunctionResponse != nil && p.FunctionResponse != nil && part.FunctionResponse.ID == p.FunctionResponse.ID }) if added { continue } p.addedParts = append(p.addedParts, part) inputRequiredParts = append(inputRequiredParts, part) longRunningCallIDs = append(longRunningCallIDs, callID) } if len(inputRequiredParts) > 0 { a2aParts, err := p.convertParts(ctx, event, inputRequiredParts, longRunningCallIDs) if err != nil { return nil, fmt.Errorf("failed to convert input required parts to A2A parts: %w", err) } if p.event != nil { p.event.Status.Message.Parts = append(p.event.Status.Message.Parts, a2aParts...) } else { msg := a2a.NewMessage(a2a.MessageRoleAgent, a2aParts...) ev := a2a.NewStatusUpdateEvent(p.reqCtx, a2a.TaskStateInputRequired, msg) ev.Final = true p.event = ev } } if len(remainingParts) == len(resp.Content.Parts) { return event, nil } modifiedEvent := *event newContent := *resp.Content newContent.Parts = remainingParts modifiedEvent.LLMResponse.Content = &newContent return &modifiedEvent, nil } func (p *inputRequiredProcessor) convertParts(ctx context.Context, event *session.Event, parts []*genai.Part, longRunningCallIDs []string) ([]a2a.Part, error) { if p.partConverter == nil { return ToA2AParts(parts, longRunningCallIDs) } converted := make([]a2a.Part, 0, len(parts)) for _, part := range parts { cp, err := p.partConverter(ctx, event, part) if err != nil { return nil, err } if cp == nil { continue } converted = append(converted, cp) } return converted, nil } func (p *inputRequiredProcessor) isLongRunningResponse(event *session.Event, part *genai.Part) bool { if part.FunctionResponse == nil { return false } id := part.FunctionResponse.ID if slices.Contains(event.LongRunningToolIDs, id) { return true } if p.event == nil { return false } for _, part := range p.event.Status.Message.Parts { if dp, ok := part.(a2a.DataPart); ok { if typeVal, ok := dp.Metadata[a2aDataPartMetaTypeKey]; ok && typeVal == a2aDataPartTypeFunctionCall { if callID, ok := dp.Data["id"].(string); ok && callID == id { return true } } } } return false } // handleInputRequired checks if the input message contains responses to all function calls // that happened during the previous invocation and were recorded in the Task input-required state message. // If a non-nil event is returned the invoking code needs to use the event as the result of the execution func handleInputRequired(reqCtx *a2asrv.RequestContext, content *genai.Content) (*a2a.TaskStatusUpdateEvent, error) { if reqCtx.StoredTask == nil { return nil, nil } task, statusMsg := reqCtx.StoredTask, reqCtx.StoredTask.Status.Message if task.Status.State != a2a.TaskStateInputRequired || statusMsg == nil { return nil, nil } taskParts, err := ToGenAIParts(statusMsg.Parts) if err != nil { return nil, fmt.Errorf("failed to parse task status message: %w", err) } for _, statusPart := range taskParts { if statusPart.FunctionCall == nil { continue } hasMatchingResponse := slices.ContainsFunc(content.Parts, func(p *genai.Part) bool { return p.FunctionResponse != nil && p.FunctionResponse.ID == statusPart.FunctionCall.ID }) if !hasMatchingResponse { parts := makeInputMissingErrorMessage(statusMsg.Parts, statusPart.FunctionCall.ID) msg := a2a.NewMessageForTask(a2a.MessageRoleAgent, reqCtx.StoredTask, parts...) event := a2a.NewStatusUpdateEvent(reqCtx, a2a.TaskStateInputRequired, msg) event.Final = true return event, nil } } return nil, nil } func getSubagentTasksToCancel(ctx context.Context, status a2a.TaskStatus, session session.Session) ([]subagentTask, error) { pendingCallIDs, err := getPendingLongRunningCallIDs(status) if err != nil { return nil, fmt.Errorf("malformed task status: %w", err) } if len(pendingCallIDs) == 0 { return nil, nil } foundCalls := 0 var tasksToCancel []subagentTask events := session.Events() for i := events.Len() - 1; i >= 0; i-- { event := events.At(i) if event.Content != nil { if slices.ContainsFunc(event.Content.Parts, func(p *genai.Part) bool { return p.FunctionCall != nil && slices.Contains(pendingCallIDs, p.FunctionCall.ID) }) { foundCalls++ if taskID, _ := GetA2ATaskInfo(event); taskID != "" { tasksToCancel = append(tasksToCancel, subagentTask{agentName: event.Author, taskID: a2a.TaskID(taskID)}) } } } if foundCalls == len(pendingCallIDs) { break } } if foundCalls < len(pendingCallIDs) { log.Warn(ctx, "could not find all function calls from status message", "found", foundCalls, "total", len(pendingCallIDs)) } return tasksToCancel, nil } func getPendingLongRunningCallIDs(status a2a.TaskStatus) ([]string, error) { statusMsg := status.Message if status.State != a2a.TaskStateInputRequired || statusMsg == nil { return nil, nil } taskParts, err := ToGenAIParts(statusMsg.Parts) if err != nil { return nil, fmt.Errorf("failed to parse task status message: %w", err) } var callIDs []string for _, statusPart := range taskParts { if statusPart.FunctionCall != nil { callIDs = append(callIDs, statusPart.FunctionCall.ID) } } return callIDs, nil } func makeInputMissingErrorMessage(inputRequiredParts []a2a.Part, callID string) []a2a.Part { errPart := a2a.TextPart{ Text: fmt.Sprintf("no input provided for function call ID %q", callID), Metadata: map[string]any{"validation_error": true}, } var preservedParts []a2a.Part for _, p := range inputRequiredParts { if meta := p.Meta(); meta != nil { if v, ok := meta["validation_error"].(bool); ok && v { continue } } preservedParts = append(preservedParts, p) } return append(preservedParts, errPart) } type subagentTask struct { agentName string taskID a2a.TaskID } ================================================ FILE: server/adka2a/metadata.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "maps" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/adk/internal/converters" "google.golang.org/adk/session" ) var ( customMetaTaskIDKey = ToADKMetaKey("task_id") customMetaContextIDKey = ToADKMetaKey("context_id") metadataEscalateKey = ToA2AMetaKey("escalate") metadataTransferToAgentKey = ToA2AMetaKey("transfer_to_agent") metadataErrorCodeKey = ToA2AMetaKey("error_code") metadataCitationKey = ToA2AMetaKey("citation_metadata") metadataGroundingKey = ToA2AMetaKey("grounding_metadata") metadataUsageKey = ToA2AMetaKey("usage_metadata") metadataCustomMetaKey = ToA2AMetaKey("custom_metadata") metadataPartialKey = ToA2AMetaKey("partial") ) // ToA2AMetaKey adds a prefix used to differentiage ADK-related values stored in Metadata an A2A event. func ToA2AMetaKey(key string) string { return "adk_" + key } // ToADKMetaKey adds a prefix used to differentiage A2A-related values stored in custom metadata of an ADK session event. func ToADKMetaKey(key string) string { return "a2a:" + key } type invocationMeta struct { userID string sessionID string agentName string reqCtx *a2asrv.RequestContext eventMeta map[string]any } func toInvocationMeta(ctx context.Context, config ExecutorConfig, reqCtx *a2asrv.RequestContext) invocationMeta { userID, sessionID := "A2A_USER_"+reqCtx.ContextID, reqCtx.ContextID // a2a sdk attaches authn info to the call context, use it when provided if callCtx, ok := a2asrv.CallContextFrom(ctx); ok { if callCtx.User != nil && callCtx.User.Name() != "" { userID = callCtx.User.Name() } } meta := map[string]any{ ToA2AMetaKey("app_name"): config.RunnerConfig.AppName, ToA2AMetaKey("user_id"): userID, ToA2AMetaKey("session_id"): sessionID, } return invocationMeta{ userID: userID, sessionID: sessionID, agentName: config.RunnerConfig.Agent.Name(), eventMeta: meta, reqCtx: reqCtx, } } func toEventMeta(meta invocationMeta, event *session.Event) (map[string]any, error) { result := make(map[string]any) maps.Copy(result, meta.eventMeta) for k, v := range map[string]string{ "invocation_id": event.InvocationID, "author": event.Author, "branch": event.Branch, } { if v != "" { result[ToA2AMetaKey(k)] = v } } if err := addMeta(result, metadataCitationKey, event.CitationMetadata); err != nil { return nil, err } if err := addMeta(result, metadataGroundingKey, event.GroundingMetadata); err != nil { return nil, err } if err := addMeta(result, metadataUsageKey, event.UsageMetadata); err != nil { return nil, err } if event.CustomMetadata != nil { result[metadataCustomMetaKey] = event.CustomMetadata } if event.LLMResponse.ErrorCode != "" { result[metadataErrorCodeKey] = event.LLMResponse.ErrorCode } return result, nil } func setActionsMeta(meta map[string]any, actions session.EventActions) map[string]any { if actions.TransferToAgent == "" && !actions.Escalate { // if meta was nil, it should remain nil return meta } if meta == nil { meta = map[string]any{} } if actions.Escalate { meta[metadataEscalateKey] = true } if actions.TransferToAgent != "" { meta[metadataTransferToAgentKey] = actions.TransferToAgent } return meta } func processA2AMeta(a2aEvent a2a.Event, event *session.Event) error { taskInfo, meta := a2aEvent.TaskInfo(), a2aEvent.Meta() if au, ok := a2aEvent.(*a2a.TaskArtifactUpdateEvent); ok && len(au.Artifact.Metadata) > 0 { if meta == nil { meta = make(map[string]any) } maps.Copy(meta, au.Artifact.Metadata) } if err := processMeta(metadataCitationKey, meta, &event.CitationMetadata); err != nil { return err } if err := processMeta(metadataGroundingKey, meta, &event.GroundingMetadata); err != nil { return err } if err := processMeta(metadataUsageKey, meta, &event.UsageMetadata); err != nil { return err } event.CustomMetadata = ToCustomMetadata(taskInfo.TaskID, taskInfo.ContextID) if um, ok := meta[metadataCustomMetaKey].(map[string]any); ok { if event.CustomMetadata == nil { event.CustomMetadata = make(map[string]any) } maps.Copy(event.CustomMetadata, um) } if ec, ok := meta[metadataErrorCodeKey].(string); ok { event.LLMResponse.ErrorCode = ec } event.Actions = toEventActions(a2aEvent.Meta()) return nil } func addMeta(result map[string]any, key string, data any) error { if data == nil { return nil } v, err := converters.ToMapStructure(data) if err != nil { return err } if v == nil { return nil } result[key] = v return nil } func processMeta[T any](key string, meta map[string]any, target **T) error { if m, ok := meta[key].(map[string]any); ok { converted, err := converters.FromMapStructure[T](m) if err != nil { return err } *target = converted } return nil } ================================================ FILE: server/adka2a/metadata_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func TestMetadataTwoWayConversion(t *testing.T) { testCases := []struct { name string event *session.Event a2aMeta map[string]any }{ { name: "error code", event: &session.Event{ LLMResponse: model.LLMResponse{ErrorCode: "102"}, }, a2aMeta: map[string]any{metadataErrorCodeKey: "102"}, }, { name: "custom metadata", event: &session.Event{ LLMResponse: model.LLMResponse{CustomMetadata: map[string]any{"nested": map[string]any{"key": "value"}}}, }, a2aMeta: map[string]any{metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}}, }, { name: "usage", event: &session.Event{ LLMResponse: model.LLMResponse{UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ CacheTokensDetails: []*genai.ModalityTokenCount{{Modality: "text", TokenCount: 1}}, PromptTokenCount: 1, ToolUsePromptTokenCount: 1, }}, }, a2aMeta: map[string]any{metadataUsageKey: map[string]any{ "cacheTokensDetails": []any{map[string]any{"modality": "text", "tokenCount": float64(1)}}, "promptTokenCount": float64(1), "toolUsePromptTokenCount": float64(1), }}, }, { name: "grounding", event: &session.Event{ LLMResponse: model.LLMResponse{GroundingMetadata: &genai.GroundingMetadata{ RetrievalQueries: []string{"hello"}, RetrievalMetadata: &genai.RetrievalMetadata{GoogleSearchDynamicRetrievalScore: 23.3}, }}, }, a2aMeta: map[string]any{ metadataGroundingKey: map[string]any{ "retrievalQueries": []any{string("hello")}, "retrievalMetadata": map[string]any{"googleSearchDynamicRetrievalScore": 23.3}, }, }, }, { name: "actions", event: &session.Event{Actions: session.EventActions{TransferToAgent: "another", Escalate: true}}, a2aMeta: map[string]any{metadataTransferToAgentKey: "another", metadataEscalateKey: true}, }, { name: "composite", event: &session.Event{ LLMResponse: model.LLMResponse{ GroundingMetadata: &genai.GroundingMetadata{ SourceFlaggingUris: []*genai.GroundingMetadataSourceFlaggingURI{{SourceID: "id1"}}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ CandidatesTokenCount: 12, ThoughtsTokenCount: 42, }, CustomMetadata: map[string]any{ "nested": map[string]any{"key": "value"}, }, }, Actions: session.EventActions{TransferToAgent: "another", Escalate: true}, }, a2aMeta: map[string]any{ metadataGroundingKey: map[string]any{"sourceFlaggingUris": []any{map[string]any{"sourceId": "id1"}}}, metadataUsageKey: map[string]any{"candidatesTokenCount": float64(12), "thoughtsTokenCount": float64(42)}, metadataCustomMetaKey: map[string]any{"nested": map[string]any{"key": "value"}}, metadataTransferToAgentKey: "another", metadataEscalateKey: true, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { meta, err := toEventMeta(invocationMeta{}, tc.event) if err != nil { t.Errorf("toEventMeta() error = %v, want nil", err) } meta = setActionsMeta(meta, tc.event.Actions) if diff := cmp.Diff(tc.a2aMeta, meta); diff != "" { t.Errorf("toEventMeta() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", meta, tc.a2aMeta, diff) } event := &session.Event{} err = processA2AMeta(&a2a.TaskStatusUpdateEvent{Metadata: meta}, event) if err != nil { t.Errorf("processA2AMeta() error = %v, want nil", err) } if diff := cmp.Diff(tc.event, event); diff != "" { t.Errorf("processA2AMeta() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", event, tc.event, diff) } }) } } ================================================ FILE: server/adka2a/parts.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "encoding/base64" "encoding/json" "fmt" "maps" "slices" "github.com/a2aproject/a2a-go/a2a" "google.golang.org/genai" "google.golang.org/adk/internal/converters" ) var ( a2aDataPartMetaTypeKey = ToA2AMetaKey("type") a2aDataPartMetaLongRunningKey = ToA2AMetaKey("is_long_running") ) const ( a2aDataPartTypeFunctionCall = "function_call" a2aDataPartTypeFunctionResponse = "function_response" a2aDataPartTypeCodeExecResult = "code_execution_result" a2aDataPartTypeCodeExecutableCode = "executable_code" ) // IsPartial takes metadata of an A2A object (eg. a2a.Part, a2a.Artifact) and returs true if // it was marked as partial based on the ADK partial flag set on the original ADK object. func IsPartial(meta map[string]any) bool { if meta == nil { return false } isPartial, _ := meta[metadataPartialKey].(bool) return isPartial } // IsPartialFlagSet takes metadata of an A2A object (eg. a2a.Part, a2a.Artifact) and returs true if // the ADK partial flag was set on it. func IsPartialFlagSet(meta map[string]any) bool { if meta == nil { return false } _, isSet := meta[metadataPartialKey].(bool) return isSet } // ToA2APart converts the provided genai part to A2A equivalent. Long running tool IDs are used for attaching metadata to // the relevant data parts. func ToA2APart(part *genai.Part, longRunningToolIDs []string) (a2a.Part, error) { parts, err := ToA2AParts([]*genai.Part{part}, longRunningToolIDs) if err != nil { return nil, err } return parts[0], nil } // ToA2AParts converts the provided genai parts to A2A equivalents. Long running tool IDs are used for attaching metadata to // the relevant data parts. func ToA2AParts(parts []*genai.Part, longRunningToolIDs []string) ([]a2a.Part, error) { result := make([]a2a.Part, len(parts)) for i, part := range parts { if part.Text != "" { r := a2a.TextPart{Text: part.Text} if part.Thought { r.Metadata = map[string]any{ToA2AMetaKey("thought"): true} } result[i] = r } else if part.InlineData != nil || part.FileData != nil { r, err := toA2AFilePart(part) if err != nil { return nil, err } result[i] = r } else { r, err := toA2ADataPart(part, longRunningToolIDs) if err != nil { return nil, err } result[i] = r } } return result, nil } func updatePartsMetadata(parts []a2a.Part, update map[string]any) { for i, part := range parts { var meta map[string]any switch p := part.(type) { case a2a.TextPart: if p.Metadata == nil { p.Metadata = make(map[string]any) parts[i] = p } meta = p.Metadata case a2a.FilePart: if p.Metadata == nil { p.Metadata = make(map[string]any) parts[i] = p } meta = p.Metadata case a2a.DataPart: if p.Metadata == nil { p.Metadata = make(map[string]any) parts[i] = p } meta = p.Metadata default: // TODO: log unknown part type warning (should never happen) continue } maps.Copy(meta, update) } } func toA2AFilePart(v *genai.Part) (a2a.FilePart, error) { if v == nil || (v.FileData == nil && v.InlineData == nil) { return a2a.FilePart{}, fmt.Errorf("not a file part: %v", v) } if v.FileData != nil { return a2a.FilePart{ File: a2a.FileURI{ FileMeta: a2a.FileMeta{ Name: v.FileData.DisplayName, MimeType: v.FileData.MIMEType, }, URI: v.FileData.FileURI, }, }, nil } part := a2a.FilePart{ File: a2a.FileBytes{ FileMeta: a2a.FileMeta{ Name: v.InlineData.DisplayName, MimeType: v.InlineData.MIMEType, }, Bytes: base64.StdEncoding.EncodeToString(v.InlineData.Data), }, } if v.VideoMetadata != nil { data, err := converters.ToMapStructure(v.VideoMetadata) if err != nil { return a2a.FilePart{}, err } part.Metadata = map[string]any{"video_metadata": data} } return part, nil } func toA2ADataPart(part *genai.Part, longRunningToolIDs []string) (a2a.Part, error) { if part.CodeExecutionResult != nil { data, err := converters.ToMapStructure(part.CodeExecutionResult) if err != nil { return nil, err } return a2a.DataPart{ Data: data, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult}, }, nil } if part.FunctionResponse != nil { data, err := converters.ToMapStructure(part.FunctionResponse) if err != nil { return nil, err } return a2a.DataPart{ Data: data, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse}, }, nil } if part.ExecutableCode != nil { data, err := converters.ToMapStructure(part.ExecutableCode) if err != nil { return nil, err } return a2a.DataPart{ Data: data, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode}, }, nil } if part.FunctionCall != nil { data, err := converters.ToMapStructure(part.FunctionCall) if err != nil { return nil, err } return a2a.DataPart{ Data: data, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: slices.Contains(longRunningToolIDs, part.FunctionCall.ID), }, }, nil } mapStruct, err := converters.ToMapStructure(part) if err != nil { return nil, err } return a2a.DataPart{Data: mapStruct}, nil } func toGenAIContent(ctx context.Context, msg *a2a.Message, converter A2APartConverter) (*genai.Content, error) { if converter == nil { parts, err := ToGenAIParts(msg.Parts) if err != nil { return nil, err } return genai.NewContentFromParts(parts, toGenAIRole(msg.Role)), nil } parts := make([]*genai.Part, 0, len(msg.Parts)) for _, part := range msg.Parts { cp, err := converter(ctx, a2a.Event(msg), part) if err != nil { return nil, err } if cp == nil { continue } parts = append(parts, cp) } return genai.NewContentFromParts(parts, toGenAIRole(msg.Role)), nil } // ToGenAIPart converts the provided A2A part to a genai equivalent. func ToGenAIPart(part a2a.Part) (*genai.Part, error) { parts, err := ToGenAIParts([]a2a.Part{part}) if err != nil { return nil, err } return parts[0], nil } // ToGenAIParts converts the provided A2A parts to genai equivalents. func ToGenAIParts(parts []a2a.Part) ([]*genai.Part, error) { result := make([]*genai.Part, len(parts)) for i, part := range parts { switch v := part.(type) { case a2a.TextPart: r := genai.NewPartFromText(v.Text) if v.Metadata != nil { if thought, ok := v.Metadata[ToA2AMetaKey("thought")].(bool); ok { r.Thought = thought } } result[i] = r case a2a.DataPart: r, err := toGenAIDataPart(v) if err != nil { return nil, err } result[i] = r case a2a.FilePart: r, err := toGenAIFilePart(v) if err != nil { return nil, err } result[i] = r default: return nil, fmt.Errorf("unknown part type: %T", v) } } return result, nil } func toGenAIFilePart(part a2a.FilePart) (*genai.Part, error) { switch v := part.File.(type) { case a2a.FileBytes: bytes, err := base64.StdEncoding.DecodeString(v.Bytes) if err != nil { return nil, err } data := &genai.Blob{Data: bytes, MIMEType: v.MimeType, DisplayName: v.Name} return &genai.Part{InlineData: data}, nil case a2a.FileURI: data := &genai.FileData{FileURI: v.URI, MIMEType: v.MimeType, DisplayName: v.Name} return &genai.Part{FileData: data}, nil default: return nil, fmt.Errorf("unknown file content type: %T", v) } } func toGenAIDataPart(part a2a.DataPart) (*genai.Part, error) { if part.Metadata == nil { return toGenAITextPart(part) } adkMetaType, ok := part.Metadata[a2aDataPartMetaTypeKey] if !ok { return toGenAITextPart(part) } bytes, err := json.Marshal(part.Data) if err != nil { return nil, err } switch adkMetaType { case a2aDataPartTypeCodeExecResult: var val genai.CodeExecutionResult if err := json.Unmarshal(bytes, &val); err != nil { return nil, err } return &genai.Part{CodeExecutionResult: &val}, nil case a2aDataPartTypeFunctionCall: var val genai.FunctionCall if err := json.Unmarshal(bytes, &val); err != nil { return nil, err } return &genai.Part{FunctionCall: &val}, nil case a2aDataPartTypeCodeExecutableCode: var val genai.ExecutableCode if err := json.Unmarshal(bytes, &val); err != nil { return nil, err } return &genai.Part{ExecutableCode: &val}, nil case a2aDataPartTypeFunctionResponse: var val genai.FunctionResponse if err := json.Unmarshal(bytes, &val); err != nil { return nil, err } return &genai.Part{FunctionResponse: &val}, nil default: return &genai.Part{Text: string(bytes)}, nil } } func toGenAITextPart(part a2a.DataPart) (*genai.Part, error) { bytes, err := json.Marshal(part.Data) if err != nil { return nil, err } return &genai.Part{Text: string(bytes)}, nil } ================================================ FILE: server/adka2a/parts_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/google/go-cmp/cmp" "google.golang.org/genai" ) func TestPartsTwoWayConversion(t *testing.T) { testCases := []struct { name string a2aPart a2a.Part genaiPart *genai.Part longRunningFunctionIDs []string }{ { name: "text", a2aPart: a2a.TextPart{Text: "Hello"}, genaiPart: &genai.Part{Text: "Hello"}, }, { name: "thought", a2aPart: a2a.TextPart{Text: "Hello", Metadata: map[string]any{ToA2AMetaKey("thought"): true}}, genaiPart: &genai.Part{Text: "Hello", Thought: true}, }, { name: "file uri", a2aPart: a2a.FilePart{ File: a2a.FileURI{URI: "ftp://cat.com", FileMeta: a2a.FileMeta{MimeType: "image/jpeg", Name: "cat.jpeg"}}, }, genaiPart: &genai.Part{ FileData: &genai.FileData{FileURI: "ftp://cat.com", MIMEType: "image/jpeg", DisplayName: "cat.jpeg"}, }, }, { name: "file bytes", a2aPart: a2a.FilePart{ File: a2a.FileBytes{Bytes: "/w==", FileMeta: a2a.FileMeta{MimeType: "image/jpeg", Name: "cat.jpeg"}}, }, genaiPart: &genai.Part{ InlineData: &genai.Blob{Data: []byte{0xfF}, MIMEType: "image/jpeg", DisplayName: "cat.jpeg"}, }, }, { name: "function call", a2aPart: a2a.DataPart{ Data: map[string]any{ "id": "get_weather", "args": map[string]any{"city": "Warsaw"}, "name": "GetWeather", }, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: false, }, }, genaiPart: &genai.Part{ FunctionCall: &genai.FunctionCall{ ID: "get_weather", Args: map[string]any{"city": "Warsaw"}, Name: "GetWeather", }, }, }, { name: "long running function call", a2aPart: a2a.DataPart{ Data: map[string]any{ "id": "get_weather", "args": map[string]any{"city": "Warsaw"}, "name": "GetWeather", }, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, genaiPart: &genai.Part{ FunctionCall: &genai.FunctionCall{ ID: "get_weather", Args: map[string]any{"city": "Warsaw"}, Name: "GetWeather", }, }, longRunningFunctionIDs: []string{"get_weather"}, }, { name: "function response", a2aPart: a2a.DataPart{ Data: map[string]any{ "id": "get_weather", "scheduling": string(genai.FunctionResponseSchedulingInterrupt), "response": map[string]any{"temperature": "7C"}, "name": "GetWeather", }, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse}, }, genaiPart: &genai.Part{ FunctionResponse: &genai.FunctionResponse{ ID: "get_weather", Scheduling: genai.FunctionResponseSchedulingInterrupt, Response: map[string]any{"temperature": "7C"}, Name: "GetWeather", }, }, }, { name: "code execution result", a2aPart: a2a.DataPart{ Data: map[string]any{"outcome": string(genai.OutcomeOK), "output": "4"}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult}, }, genaiPart: &genai.Part{ CodeExecutionResult: &genai.CodeExecutionResult{ Outcome: genai.OutcomeOK, Output: "4", }, }, }, { name: "code execution result", a2aPart: a2a.DataPart{ Data: map[string]any{"code": "print(2+2)", "language": string(genai.LanguagePython)}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode}, }, genaiPart: &genai.Part{ ExecutableCode: &genai.ExecutableCode{ Code: "print(2+2)", Language: genai.LanguagePython, }, }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { toA2A, err := ToA2AParts([]*genai.Part{tc.genaiPart}, tc.longRunningFunctionIDs) if err != nil { t.Errorf("toA2AParts() error = %v, want nil", err) } if diff := cmp.Diff([]a2a.Part{tc.a2aPart}, toA2A); diff != "" { t.Errorf("toA2AParts() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", toA2A, tc.a2aPart, diff) } toGenAI, err := ToGenAIParts([]a2a.Part{tc.a2aPart}) if err != nil { t.Errorf("toGenAIParts() error = %v, want nil", err) } if diff := cmp.Diff([]*genai.Part{tc.genaiPart}, toGenAI); diff != "" { t.Errorf("toGenAIParts() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", toA2A, tc.a2aPart, diff) } }) } } func TestPartsOneWayConversion(t *testing.T) { part := a2a.DataPart{Data: map[string]any{"arbitrary": "data"}} wantGenAI := &genai.Part{Text: `{"arbitrary":"data"}`} gotGenAI, err := ToGenAIParts([]a2a.Part{part}) if err != nil { t.Fatalf("toGenAI() error = %v, want nil", err) } if diff := cmp.Diff([]*genai.Part{wantGenAI}, gotGenAI); diff != "" { t.Fatalf("toGenAI() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotGenAI, part, diff) } wantA2A := a2a.TextPart{Text: `{"arbitrary":"data"}`} gotA2A, err := ToA2AParts(gotGenAI, nil) if err != nil { t.Fatalf("toA2AParts() error = %v, want nil", err) } if diff := cmp.Diff([]a2a.Part{wantA2A}, gotA2A); diff != "" { t.Fatalf("toA2AParts() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotA2A, wantA2A, diff) } } ================================================ FILE: server/adka2a/processor.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "context" "fmt" "maps" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/adk/model" "google.golang.org/adk/session" ) type eventToArtifactTransform interface { transform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error) makeFinalUpdate() *a2a.TaskArtifactUpdateEvent } type eventProcessor struct { reqCtx *a2asrv.RequestContext meta invocationMeta partConverter GenAIPartConverter // terminalActions is used to keep track of escalate and agent transfer actions on processed events. // It is then gets passed to caller through with metadata of a terminal event. // This is done to make sure the caller processes it, since intermediate events without parts might be ignored. terminalActions session.EventActions // failedEvent is used to postpone sending a terminal event until the whole ADK response is saved as an A2A artifact. // Will be sent as the final Task status update if not nil. failedEvent *a2a.TaskStatusUpdateEvent // inputRequiredProcessor is used to postpone sending input-required in response to long-running function tool calls. // inputRequiredProcessor.event will be sent as the final Task status update if failedEvent is nil. inputRequiredProcessor *inputRequiredProcessor // eventToArtifact is used to convert ADK events to A2A TaskArtifactUpdateEvents. eventToArtifact eventToArtifactTransform } func newEventProcessor( reqCtx *a2asrv.RequestContext, meta invocationMeta, converter GenAIPartConverter, transform eventToArtifactTransform, ) *eventProcessor { return &eventProcessor{ inputRequiredProcessor: newInputRequiredProcessor(reqCtx, converter), partConverter: converter, reqCtx: reqCtx, meta: meta, eventToArtifact: transform, } } func (p *eventProcessor) process(ctx context.Context, event *session.Event) (*a2a.TaskArtifactUpdateEvent, error) { if event == nil { return nil, nil } p.updateTerminalActions(event) eventMeta, err := toEventMeta(p.meta, event) if err != nil { return nil, err } resp := event.LLMResponse if resp.ErrorCode != "" || resp.ErrorMessage != "" { // TODO(yarolegovich): consider merging responses if multiple errors can be produced during an invocation if p.failedEvent == nil { // terminal event might add additional keys to its metadata when it's dispatched and these changes should // not be reflected in this event's metadata terminalEventMeta := maps.Clone(eventMeta) p.failedEvent = toTaskFailedUpdateEvent(p.reqCtx, errorFromResponse(&resp), terminalEventMeta) } } event, err = p.inputRequiredProcessor.process(ctx, event) if err != nil { return nil, fmt.Errorf("input required processing failed: %w", err) } parts, err := p.convertParts(ctx, event) if err != nil { return nil, err } if len(parts) == 0 { return nil, nil } result, err := p.eventToArtifact.transform(event, parts, eventMeta) if err != nil { return nil, err } return result, nil } func (p *eventProcessor) makeFinalArtifactUpdate() *a2a.TaskArtifactUpdateEvent { return p.eventToArtifact.makeFinalUpdate() } func (p *eventProcessor) makeFinalStatusUpdate() *a2a.TaskStatusUpdateEvent { for _, event := range []*a2a.TaskStatusUpdateEvent{p.failedEvent, p.inputRequiredProcessor.event} { if event != nil { event.Metadata = setActionsMeta(event.Metadata, p.terminalActions) return event } } ev := a2a.NewStatusUpdateEvent(p.reqCtx, a2a.TaskStateCompleted, nil) ev.Final = true // we're modifying base processor metadata which might have been sent with one of the previous events. // this update shouldn't be reflected in the sent events' metadata. baseMetaCopy := maps.Clone(p.meta.eventMeta) ev.Metadata = setActionsMeta(baseMetaCopy, p.terminalActions) return ev } func (p *eventProcessor) makeTaskFailedEvent(cause error, event *session.Event) *a2a.TaskStatusUpdateEvent { meta := p.meta.eventMeta if event != nil { if eventMeta, err := toEventMeta(p.meta, event); err != nil { // TODO(yarolegovich): log ignored error } else { meta = eventMeta } } return toTaskFailedUpdateEvent(p.reqCtx, cause, meta) } func (p *eventProcessor) updateTerminalActions(event *session.Event) { p.terminalActions.Escalate = p.terminalActions.Escalate || event.Actions.Escalate if event.Actions.TransferToAgent != "" { p.terminalActions.TransferToAgent = event.Actions.TransferToAgent } } func (p *eventProcessor) convertParts(ctx context.Context, event *session.Event) ([]a2a.Part, error) { if event.Content == nil || len(event.Content.Parts) == 0 { return nil, nil } parts := event.Content.Parts if p.partConverter == nil { return ToA2AParts(parts, event.LongRunningToolIDs) } converted := make([]a2a.Part, 0, len(parts)) for _, part := range parts { cp, err := p.partConverter(ctx, event, part) if err != nil { return nil, err } if cp == nil { continue } converted = append(converted, cp) } return converted, nil } func toTaskFailedUpdateEvent(task a2a.TaskInfoProvider, cause error, meta map[string]any) *a2a.TaskStatusUpdateEvent { msg := a2a.NewMessageForTask(a2a.MessageRoleAgent, task, a2a.TextPart{Text: cause.Error()}) ev := a2a.NewStatusUpdateEvent(task, a2a.TaskStateFailed, msg) ev.Metadata = meta ev.Final = true return ev } func errorFromResponse(resp *model.LLMResponse) error { return fmt.Errorf("llm error response: %q", resp.ErrorMessage) } ================================================ FILE: server/adka2a/processor_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "testing" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func modelResponseFromParts(parts ...*genai.Part) model.LLMResponse { return model.LLMResponse{Content: &genai.Content{Role: genai.RoleModel, Parts: parts}} } func modelPartialResponseFromParts(parts ...*genai.Part) model.LLMResponse { resp := modelResponseFromParts(parts...) resp.Partial = true return resp } func newNonPartialArtifactEvent(task *a2a.Task, parts ...a2a.Part) *a2a.TaskArtifactUpdateEvent { ev := a2a.NewArtifactEvent(task, parts...) // It is important for events to be explicitely marked as ADK partial or non-partial. // This signals to consumers that the remote agent is running its own aggregation logic. ev.Metadata = map[string]any{metadataPartialKey: false} return ev } func newNonPartialArtifactUpdateEvent(task *a2a.Task, parts ...a2a.Part) *a2a.TaskArtifactUpdateEvent { ev := newNonPartialArtifactEvent(task, parts...) ev.Append = true return ev } func newDiscardPartialArtifactUpdate(task *a2a.Task) *a2a.TaskArtifactUpdateEvent { ev := newLegacyPartialArtifactUpdate(task, "", []a2a.Part{a2a.DataPart{Data: map[string]any{}}}) ev.LastChunk = true return ev } func newFinalStatusUpdate(task *a2a.Task, state a2a.TaskState, msg *a2a.Message) *a2a.TaskStatusUpdateEvent { ev := a2a.NewStatusUpdateEvent(task, state, msg) ev.Final = true return ev } func TestEventProcessor_Process(t *testing.T) { artifactIDPlaceholder := a2a.NewArtifactID() task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} testCases := []struct { name string events []*session.Event processed []*a2a.TaskArtifactUpdateEvent terminal []a2a.Event }{ { name: "skip if no response", events: []*session.Event{ {ID: "125", InvocationID: "345"}, {ID: "127", InvocationID: "345", Branch: "b", Author: "a"}, }, terminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)}, }, { name: "skip if no content parts", events: []*session.Event{ {LLMResponse: model.LLMResponse{Content: &genai.Content{Role: genai.RoleModel}}}, {LLMResponse: model.LLMResponse{Interrupted: true}}, }, terminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)}, }, { name: "multi-part artifact update", events: []*session.Event{{ LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello"), genai.NewPartFromText(", world!")), }}, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.TextPart{Text: "Hello"}, a2a.TextPart{Text: ", world!"}), }, terminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)}, }, { name: "multiple artifact updates", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromExecutableCode("get_the_answer()", genai.LanguagePython))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, "42"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("The answer is 42"))}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.DataPart{ Data: map[string]any{"code": "get_the_answer()", "language": string(genai.LanguagePython)}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode}, }), newNonPartialArtifactUpdateEvent(task, a2a.DataPart{ Data: map[string]any{"outcome": string(genai.OutcomeOK), "output": "42"}, Metadata: map[string]any{a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult}, }), newNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: "The answer is 42"}), }, terminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)}, }, { name: "failed without artifacts", events: []*session.Event{ {LLMResponse: model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}}, }, terminal: []a2a.Event{ toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}), map[string]any{ToA2AMetaKey("error_code"): "1"}, ), }, }, { name: "the first failure is returned", events: []*session.Event{ {LLMResponse: model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed 1"}}, {LLMResponse: model.LLMResponse{ErrorCode: "2", ErrorMessage: "failed 2"}}, }, terminal: []a2a.Event{ toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed 1"}), map[string]any{ToA2AMetaKey("error_code"): "1"}, ), }, }, { name: "failed with artifacts", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("The answer is"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("42"))}, {LLMResponse: model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.TextPart{Text: "The answer is"}), newNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: "42"}), }, terminal: []a2a.Event{ toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}), map[string]any{ToA2AMetaKey("error_code"): "1"}, ), }, }, { name: "failed before receiving all parts", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromText("The answer is"))}, {LLMResponse: model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("42"))}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.TextPart{Text: "The answer is"}), newNonPartialArtifactUpdateEvent(task, a2a.TextPart{Text: "42"}), }, terminal: []a2a.Event{ toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}), map[string]any{ToA2AMetaKey("error_code"): "1"}, ), }, }, { name: "input_required not produced for a normal function call", events: []*session.Event{ {LLMResponse: modelResponseFromParts(genai.NewPartFromFunctionCall("get_weather", map[string]any{"city": "Warsaw"}))}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.DataPart{ Data: map[string]any{"name": "get_weather", "args": map[string]any{"city": "Warsaw"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: false, }, }), }, terminal: []a2a.Event{ newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "input_required produced for long running function", events: []*session.Event{ { LongRunningToolIDs: []string{"get_weather"}, LLMResponse: modelResponseFromParts(&genai.Part{ FunctionCall: &genai.FunctionCall{ID: "get_weather", Name: "weather", Args: map[string]any{"city": "Warsaw"}}, }), }, }, processed: nil, terminal: []a2a.Event{ newFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{ Role: a2a.MessageRoleAgent, Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "name": "weather", "args": map[string]any{"city": "Warsaw"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, }, }), }, }, { name: "long running tool call before receiving all parts", events: []*session.Event{ { LongRunningToolIDs: []string{"get_weather"}, LLMResponse: modelResponseFromParts(&genai.Part{ FunctionCall: &genai.FunctionCall{ID: "get_weather", Name: "weather", Args: map[string]any{"city": "Warsaw"}}, }), }, { LLMResponse: modelResponseFromParts(genai.NewPartFromText("This will take a while")), }, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.TextPart{Text: "This will take a while"}), }, terminal: []a2a.Event{ newFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{ Role: a2a.MessageRoleAgent, Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "name": "weather", "args": map[string]any{"city": "Warsaw"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, }, }), }, }, { name: "long running tool response without ID", events: []*session.Event{ { LongRunningToolIDs: []string{"get_weather"}, LLMResponse: modelResponseFromParts(&genai.Part{ FunctionCall: &genai.FunctionCall{ID: "get_weather", Name: "weather", Args: map[string]any{"city": "Warsaw"}}, }), }, { // No LongRunningToolIDs here LLMResponse: modelResponseFromParts(&genai.Part{ FunctionResponse: &genai.FunctionResponse{ID: "get_weather", Name: "weather", Response: map[string]any{"status": "pending"}}, }), }, }, processed: nil, terminal: []a2a.Event{ newFinalStatusUpdate(task, a2a.TaskStateInputRequired, &a2a.Message{ Role: a2a.MessageRoleAgent, Parts: []a2a.Part{ a2a.DataPart{ Data: map[string]any{"id": "get_weather", "name": "weather", "args": map[string]any{"city": "Warsaw"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionCall, a2aDataPartMetaLongRunningKey: true, }, }, a2a.DataPart{ Data: map[string]any{"id": "get_weather", "name": "weather", "response": map[string]any{"status": "pending"}}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeFunctionResponse, }, }, }, }), }, }, { name: "actions in completed event meta", events: []*session.Event{ {ID: "125", InvocationID: "345", Actions: session.EventActions{Escalate: true, TransferToAgent: "a-2"}}, }, terminal: []a2a.Event{ &a2a.TaskStatusUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, Metadata: map[string]any{metadataEscalateKey: true, metadataTransferToAgentKey: "a-2"}, Final: true, }, }, }, { name: "last agent transfer is returned", events: []*session.Event{ {ID: "125", InvocationID: "345", Actions: session.EventActions{TransferToAgent: "a-2"}}, {ID: "126", InvocationID: "346", Actions: session.EventActions{TransferToAgent: "a-3"}}, }, terminal: []a2a.Event{ &a2a.TaskStatusUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Status: a2a.TaskStatus{State: a2a.TaskStateCompleted}, Metadata: map[string]any{metadataTransferToAgentKey: "a-3"}, Final: true, }, }, }, { name: "actions not overwritten by subsequent events", events: []*session.Event{ { LLMResponse: modelResponseFromParts(genai.NewPartFromText("The answer is")), Actions: session.EventActions{Escalate: true, TransferToAgent: "a-2"}, }, {LLMResponse: model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newNonPartialArtifactEvent(task, a2a.TextPart{Text: "The answer is"}), }, terminal: []a2a.Event{ toTaskFailedUpdateEvent( task, errorFromResponse(&model.LLMResponse{ErrorCode: "1", ErrorMessage: "failed"}), map[string]any{ToA2AMetaKey("error_code"): "1", metadataEscalateKey: true, metadataTransferToAgentKey: "a-2"}, ), }, }, { name: "partial events parts marked", events: []*session.Event{ { LLMResponse: modelPartialResponseFromParts( genai.NewPartFromText("The answer is"), genai.NewPartFromExecutableCode("get_the_answer()", genai.LanguagePython)), }, {LLMResponse: modelPartialResponseFromParts( genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, "42"), genai.NewPartFromText("42"), )}, }, processed: []*a2a.TaskArtifactUpdateEvent{ newLegacyPartialArtifactUpdate(task, artifactIDPlaceholder, []a2a.Part{ a2a.TextPart{Text: "The answer is", Metadata: map[string]any{ToA2AMetaKey("partial"): true}}, a2a.DataPart{ Data: map[string]any{"code": "get_the_answer()", "language": string(genai.LanguagePython)}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecutableCode, ToA2AMetaKey("partial"): true, }, }, }), newLegacyPartialArtifactUpdate(task, artifactIDPlaceholder, []a2a.Part{ a2a.DataPart{ Data: map[string]any{"outcome": string(genai.OutcomeOK), "output": "42"}, Metadata: map[string]any{ a2aDataPartMetaTypeKey: a2aDataPartTypeCodeExecResult, ToA2AMetaKey("partial"): true, }, }, a2a.TextPart{Text: "42", Metadata: map[string]any{ToA2AMetaKey("partial"): true}}, }), }, terminal: []a2a.Event{ newDiscardPartialArtifactUpdate(task), newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil), }, }, { name: "metadata merging", events: []*session.Event{{ InvocationID: "test-invocation-id", LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello")), }}, processed: []*a2a.TaskArtifactUpdateEvent{ func() *a2a.TaskArtifactUpdateEvent { ev := newNonPartialArtifactEvent(task, a2a.TextPart{Text: "Hello"}) ev.Metadata[ToA2AMetaKey("invocation_id")] = "test-invocation-id" return ev }(), }, terminal: []a2a.Event{newFinalStatusUpdate(task, a2a.TaskStateCompleted, nil)}, }, } for _, tc := range testCases { ignoreFields := []cmp.Option{ cmpopts.IgnoreFields(a2a.Message{}, "ID"), cmpopts.IgnoreFields(a2a.Artifact{}, "ID"), cmpopts.IgnoreFields(a2a.TaskStatus{}, "Timestamp"), } t.Run(tc.name, func(t *testing.T) { reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID} processor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx)) var gotEvents []*a2a.TaskArtifactUpdateEvent for _, event := range tc.events { got, err := processor.process(t.Context(), event) if err != nil { t.Fatalf("processor.process() error = %v, want nil", err) } if got != nil { gotEvents = append(gotEvents, got) } } if diff := cmp.Diff(tc.processed, gotEvents, ignoreFields...); diff != "" { t.Fatalf("processor.process() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotEvents, tc.events, diff) } gotTerminal := makeTerminalEvents(processor) if diff := cmp.Diff(tc.terminal, gotTerminal, ignoreFields...); diff != "" { t.Fatalf("processor.makeTerminalEvents() wrong result (+got,-want)\ngot = %v\nwant = %v\ndiff = %s", gotTerminal, tc.terminal, diff) } }) } } func TestEventProcessor_ArtifactUpdates(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} events := []*session.Event{ { LLMResponse: modelResponseFromParts(genai.NewPartFromExecutableCode("find_cat()", genai.LanguagePython)), }, { LLMResponse: modelResponseFromParts( genai.NewPartFromCodeExecutionResult(genai.OutcomeOK, "https://cats.com/image.png"), genai.NewPartFromText("A cat image was downloaded to /home/me/cat.png"), genai.NewPartFromFunctionCall("download", map[string]any{"from": "https://cats.com/image.png", "to": "/home/me/cat.png"}), ), }, { LLMResponse: modelResponseFromParts(genai.NewPartFromFunctionResponse("download", map[string]any{"status": "ok"})), }, { LLMResponse: modelResponseFromParts(genai.NewPartFromText("A cat image was downloaded to /home/me/cat.png")), }, } reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID} processor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx)) got := make([]*a2a.TaskArtifactUpdateEvent, len(events)) for i, event := range events { processed, err := processor.process(t.Context(), event) if err != nil { t.Fatalf("processor.process() error for %d-th = %v, want nil", i, err) } got[i] = processed } if len(events) != len(got) { t.Fatalf("processor.process() returned %d events, want %d\nevents = %v", len(got), len(events), got) } if got[0].Append || got[0].LastChunk { t.Fatalf("processor.process()[0] = %+v, want {Append=false, LastChunk=false}", got[0]) } wantID := got[0].Artifact.ID for i := range len(got) - 1 { event := got[i+1] if event.LastChunk { t.Fatalf("processor.process()[%d] = %+v, want LastChunk=false", i, event) } if event.Artifact.ID != wantID { t.Fatalf("processor.process()[%d] ID = %v, got %v", i, event.Artifact.ID, wantID) } } terminal := makeTerminalEvents(processor) if len(terminal) != 1 { t.Fatalf("processor.makeTerminalEvents() = %v, want [finalStatusUpdate]", terminal) } } func TestEventProcessor_PartialEventsAreDiscardedAsAnArtifact(t *testing.T) { task := &a2a.Task{ID: a2a.NewTaskID(), ContextID: a2a.NewContextID()} events := []*session.Event{ {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("Hello, "))}, {LLMResponse: modelPartialResponseFromParts(genai.NewPartFromText("world!"))}, {LLMResponse: modelResponseFromParts(genai.NewPartFromText("Hello, world!"))}, } reqCtx := &a2asrv.RequestContext{TaskID: task.ID, ContextID: task.ContextID} processor := newEventProcessor(reqCtx, invocationMeta{}, nil, newLegacyArtifactMaker(reqCtx)) got := make([]*a2a.TaskArtifactUpdateEvent, len(events)) for i, event := range events { processed, err := processor.process(t.Context(), event) if err != nil { t.Fatalf("processor.process() error for %d-th = %v, want nil", i, err) } got[i] = processed } if len(events) != len(got) { t.Fatalf("processor.process() returned %d events, want %d\nevents = %v", len(got), len(events), got) } lastI := len(events) - 1 if got[0].Append || got[0].LastChunk { t.Fatalf("processor.process()[0] = %+v, want {Append=false, LastChunk=false}", got[0]) } if got[lastI].Append || got[lastI].LastChunk { t.Fatalf("processor.process()[lastI] = %+v, want {Append=false, LastChunk=false}", got[lastI]) } if got[0].Artifact.ID != got[1].Artifact.ID { t.Fatal("processor.process() partial events applied to different artifact") } if got[0].Artifact.ID == got[lastI].Artifact.ID { t.Fatal("processor.process() final event applied to partial artifact") } for i, event := range got { if event.LastChunk { t.Fatalf("processor.process()[%d] = %+v, want LastChunk=false", i, event) } } terminal := makeTerminalEvents(processor) finalUpdate, ok := terminal[0].(*a2a.TaskArtifactUpdateEvent) if len(terminal) != 2 || !ok { t.Fatalf("processor.makeTerminalEvents() = %v, want [finalArtifactChunk, finalStatusUpdate]", terminal) } wantEvent := &a2a.TaskArtifactUpdateEvent{ TaskID: task.ID, ContextID: task.ContextID, Artifact: &a2a.Artifact{ ID: got[0].Artifact.ID, Parts: a2a.ContentParts{a2a.DataPart{Data: map[string]any{}, Metadata: map[string]any{metadataPartialKey: true}}}, Metadata: map[string]any{metadataPartialKey: true}, }, Metadata: map[string]any{metadataPartialKey: true}, Append: false, LastChunk: true, } if diff := cmp.Diff(wantEvent, finalUpdate); diff != "" { t.Fatalf("makeTerminalEvents() wrong result (+got,-want) diff = %s", diff) } } func makeTerminalEvents(processor *eventProcessor) []a2a.Event { result := make([]a2a.Event, 0, 2) if finalUpdate := processor.eventToArtifact.makeFinalUpdate(); finalUpdate != nil { result = append(result, finalUpdate) } result = append(result, processor.makeFinalStatusUpdate()) return result } ================================================ FILE: server/adka2a/task_artifact.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "maps" "github.com/a2aproject/a2a-go/a2a" "github.com/a2aproject/a2a-go/a2asrv" "google.golang.org/adk/session" ) type artifactMaker struct { reqCtx *a2asrv.RequestContext lastAgentPartialArtifact map[string]a2a.ArtifactID } func newArtifactMaker(reqCtx *a2asrv.RequestContext) *artifactMaker { return &artifactMaker{ reqCtx: reqCtx, lastAgentPartialArtifact: make(map[string]a2a.ArtifactID), } } var _ eventToArtifactTransform = (*artifactMaker)(nil) func (m *artifactMaker) transform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error) { result := a2a.NewArtifactEvent(m.reqCtx, parts...) if artifactID, ok := m.lastAgentPartialArtifact[event.Author]; ok { result.Artifact.ID = artifactID // continue accumulating if partial, otherwise replace contents result.Append = event.Partial } result.LastChunk = !event.Partial if event.Partial { m.lastAgentPartialArtifact[event.Author] = result.Artifact.ID } else { delete(m.lastAgentPartialArtifact, event.Author) } if len(meta) > 0 { if result.Artifact.Metadata == nil { result.Artifact.Metadata = make(map[string]any) } maps.Copy(result.Artifact.Metadata, meta) } return result, nil } func (m *artifactMaker) makeFinalUpdate() *a2a.TaskArtifactUpdateEvent { return nil } type legacyArtifactMaker struct { reqCtx *a2asrv.RequestContext // responseID is created once the first TaskArtifactUpdateEvent is sent. Used for subsequent artifact updates. responseID a2a.ArtifactID // partialResponseID is created once the first TaskArtifactUpdateEvent created from a partial ADK event is sent. // Partial updates are not saved in the ADK session store. There is no concept of a partial event in A2A so instead // we're updating an "ephemeral" artifact while an agent is running. The artifact gets reset at the end of the // invocation effectively erasing its parts. partialResponseID a2a.ArtifactID } func newLegacyArtifactMaker(reqCtx *a2asrv.RequestContext) *legacyArtifactMaker { return &legacyArtifactMaker{ reqCtx: reqCtx, } } var _ eventToArtifactTransform = (*legacyArtifactMaker)(nil) func (p *legacyArtifactMaker) transform(event *session.Event, parts []a2a.Part, meta map[string]any) (*a2a.TaskArtifactUpdateEvent, error) { var result *a2a.TaskArtifactUpdateEvent if event.Partial { result = newLegacyPartialArtifactUpdate(p.reqCtx, p.partialResponseID, parts) p.partialResponseID = result.Artifact.ID } else { result = newLegacyArtifactUpdate(p.reqCtx, p.responseID, parts) p.responseID = result.Artifact.ID } if len(meta) > 0 { maps.Copy(result.Metadata, meta) } return result, nil } func (p *legacyArtifactMaker) makeFinalUpdate() *a2a.TaskArtifactUpdateEvent { // We could also send a LastChunk: true event for the main (non-partial) artifact, // but there's currently no special handling for it and not all A2A SDK (eg. Java) // implementations allow empty-part artifact updates. if p.partialResponseID == "" { return nil } ev := newLegacyPartialArtifactUpdate(p.reqCtx, p.partialResponseID, []a2a.Part{a2a.DataPart{Data: map[string]any{}}}) ev.LastChunk = true return ev } func newLegacyArtifactUpdate(task a2a.TaskInfoProvider, id a2a.ArtifactID, parts []a2a.Part) *a2a.TaskArtifactUpdateEvent { var result *a2a.TaskArtifactUpdateEvent if id == "" { result = a2a.NewArtifactEvent(task, parts...) } else { result = a2a.NewArtifactUpdateEvent(task, id, parts...) } // Explicitely mark and Artifact update as non-partial ADK event so that consumer side // does not run its own aggregation logic. result.Metadata = map[string]any{metadataPartialKey: false} return result } func newLegacyPartialArtifactUpdate(task a2a.TaskInfoProvider, artifactID a2a.ArtifactID, parts []a2a.Part) *a2a.TaskArtifactUpdateEvent { ev := newLegacyArtifactUpdate(task, artifactID, parts) updatePartsMetadata(parts, map[string]any{metadataPartialKey: true}) if ev.Artifact.Metadata == nil { ev.Artifact.Metadata = map[string]any{metadataPartialKey: true} } else { ev.Artifact.Metadata[metadataPartialKey] = true } ev.Metadata[metadataPartialKey] = true ev.Append = false // discard partial events return ev } ================================================ FILE: server/adka2a/utils.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adka2a import ( "github.com/a2aproject/a2a-go/a2a" "google.golang.org/adk/agent" iagent "google.golang.org/adk/internal/agent" iremoteagent "google.golang.org/adk/internal/agent/remoteagent" ) // WithoutPartialArtifacts returns a slice of artifacts without partial artifacts. // Partial artifacts are usually discarded (contain no parts) after agent invocation is finished. func WithoutPartialArtifacts(artifacts []*a2a.Artifact) []*a2a.Artifact { var result []*a2a.Artifact for _, artifact := range artifacts { if IsPartial(artifact.Metadata) { continue } result = append(result, artifact) } return result } func findRemoteSubagents(root agent.Agent) []remoteAgent { var result []remoteAgent var collect func(agent.Agent) collect = func(agent agent.Agent) { ia, ok := agent.(iagent.Agent) if !ok { return } config := iagent.Reveal(ia).Config if state, ok := config.(iremoteagent.RemoteAgentState); ok && state.A2A != nil { result = append(result, remoteAgent{agent: agent, config: state.A2A}) return } for _, sa := range agent.SubAgents() { collect(sa) } } collect(root) return result } type remoteAgent struct { agent agent.Agent config *iremoteagent.A2AServerConfig } ================================================ FILE: server/adkrest/controllers/apps.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "net/http" "google.golang.org/adk/agent" ) // AppsAPIController is the controller for the Apps API. type AppsAPIController struct { agentLoader agent.Loader } // NewAppsAPIController creates a controller for Apps API. func NewAppsAPIController(agentLoader agent.Loader) *AppsAPIController { return &AppsAPIController{agentLoader: agentLoader} } // ListAppsHandler handles listing all loaded agents. func (c *AppsAPIController) ListAppsHandler(rw http.ResponseWriter, req *http.Request) { apps := c.agentLoader.ListAgents() EncodeJSONResponse(apps, http.StatusOK, rw) } ================================================ FILE: server/adkrest/controllers/artifacts.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "net/http" "strconv" "github.com/gorilla/mux" "google.golang.org/adk/artifact" "google.golang.org/adk/server/adkrest/internal/models" ) // ArtifactsAPIController is the controller for the Artifacts API. type ArtifactsAPIController struct { artifactService artifact.Service } func NewArtifactsAPIController(artifactService artifact.Service) *ArtifactsAPIController { return &ArtifactsAPIController{artifactService: artifactService} } // ListArtifactsHandler lists all the artifact filenames within a session. func (c *ArtifactsAPIController) ListArtifactsHandler(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(vars) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } resp, err := c.artifactService.List(req.Context(), &artifact.ListRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, }) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } files := resp.FileNames if files == nil { files = []string{} } EncodeJSONResponse(files, http.StatusOK, rw) } // LoadArtifactHandler gets an artifact from the artifact service storage. func (c *ArtifactsAPIController) LoadArtifactHandler(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(vars) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } artifactName := vars["artifact_name"] if artifactName == "" { http.Error(rw, "artifact_name parameter is required", http.StatusBadRequest) return } loadReq := &artifact.LoadRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, FileName: artifactName, } queryParams := req.URL.Query() version := queryParams.Get("version") if version != "" { versionInt, err := strconv.Atoi(version) if err != nil { http.Error(rw, "version parameter must be an integer", http.StatusBadRequest) return } loadReq.Version = int64(versionInt) } resp, err := c.artifactService.Load(req.Context(), loadReq) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(resp.Part, http.StatusOK, rw) } // LoadArtifactVersionHandler gets an artifact from the artifact service storage with specified version. func (c *ArtifactsAPIController) LoadArtifactVersionHandler(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(vars) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } artifactName := vars["artifact_name"] if artifactName == "" { http.Error(rw, "artifact_name parameter is required", http.StatusBadRequest) return } version := vars["version"] if version == "" { http.Error(rw, "version parameter is required", http.StatusBadRequest) return } versionInt, err := strconv.Atoi(version) if err != nil { http.Error(rw, "version parameter must be an integer", http.StatusBadRequest) return } loadReq := &artifact.LoadRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, FileName: artifactName, Version: int64(versionInt), } resp, err := c.artifactService.Load(req.Context(), loadReq) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(resp.Part, http.StatusOK, rw) } // DeleteArtifactHandler handles deleting an artifact. func (c *ArtifactsAPIController) DeleteArtifactHandler(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(vars) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } artifactName := vars["artifact_name"] if artifactName == "" { http.Error(rw, "artifact_name parameter is required", http.StatusBadRequest) return } err = c.artifactService.Delete(req.Context(), &artifact.DeleteRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, FileName: artifactName, }) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(nil, http.StatusOK, rw) } ================================================ FILE: server/adkrest/controllers/debug.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "fmt" "net/http" "slices" "github.com/gorilla/mux" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/server/adkrest/internal/models" "google.golang.org/adk/server/adkrest/internal/services" "google.golang.org/adk/session" ) // DebugAPIController is the controller for the Debug API. type DebugAPIController struct { sessionService session.Service agentloader agent.Loader debugTelemetry *services.DebugTelemetry } // NewDebugAPIController creates the controller for the Debug API. func NewDebugAPIController(sessionService session.Service, agentLoader agent.Loader, spansExporter *services.DebugTelemetry) *DebugAPIController { return &DebugAPIController{ sessionService: sessionService, agentloader: agentLoader, debugTelemetry: spansExporter, } } // EventSpanHandler returns the debug span for the event. func (c *DebugAPIController) EventSpanHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) eventID := params["event_id"] if eventID == "" { http.Error(rw, "event_id parameter is required", http.StatusBadRequest) return } spans := c.debugTelemetry.GetSpansByEventID(eventID) key := string(semconv.GenAIOperationNameKey) // Return only generate content and execute tool spans. wantedOperations := []string{"execute_tool", "generate_content"} for _, span := range spans { opName := span.Attributes[key] if slices.Contains(wantedOperations, opName) { response := convertEventSpan(span) // Return the first span that matches the wanted operations - single event should contain only a single generate content or execute tool span. EncodeJSONResponse(response, http.StatusOK, rw) return } } http.Error(rw, fmt.Sprintf("event not found: %s", eventID), http.StatusNotFound) } // ADK web expects different format than in [SessionSpansHandler]. // The main difference is that span attributes need to be flattened in the response. func convertEventSpan(span services.DebugSpan) map[string]any { flattened := map[string]any{ "name": span.Name, "start_time": span.StartTime, "end_time": span.EndTime, "trace_id": span.TraceID, "span_id": span.SpanID, "parent_span_id": span.ParentSpanID, "logs": span.Logs, } for k, v := range span.Attributes { flattened[string(k)] = v } return flattened } // SessionSpansHandler returns the debug spans for the session. func (c *DebugAPIController) SessionSpansHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) sessionID := params["session_id"] if sessionID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } spans := c.debugTelemetry.GetSpansBySessionID(sessionID) EncodeJSONResponse(spans, http.StatusOK, rw) } // EventGraphHandler returns the debug information for the session and session events in form of graph. func (c *DebugAPIController) EventGraphHandler(rw http.ResponseWriter, req *http.Request) { vars := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(vars) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } resp, err := c.sessionService.Get(req.Context(), &session.GetRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, }) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } eventID := vars["event_id"] if eventID == "" { http.Error(rw, "event_id parameter is required", http.StatusBadRequest) return } var event *session.Event for it := range resp.Session.Events().All() { if it.ID == eventID { event = it break } } if event == nil { http.Error(rw, "event not found", http.StatusNotFound) return } highlightedPairs := [][]string{} fc := functionalCalls(event) fr := functionalResponses(event) if len(fc) > 0 { for _, f := range fc { if f.Name != "" { highlightedPairs = append(highlightedPairs, []string{f.Name, event.Author}) } } } else if len(fr) > 0 { for _, f := range fr { if f.Name != "" { highlightedPairs = append(highlightedPairs, []string{f.Name, event.Author}) } } } else { highlightedPairs = append(highlightedPairs, []string{event.Author, event.Author}) } agent, err := c.agentloader.LoadAgent(sessionID.AppName) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } graph, err := services.GetAgentGraph(req.Context(), agent, highlightedPairs) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(map[string]string{"dotSrc": graph}, http.StatusOK, rw) } func functionalCalls(event *session.Event) []*genai.FunctionCall { if event.LLMResponse.Content == nil || event.LLMResponse.Content.Parts == nil { return nil } fc := []*genai.FunctionCall{} for _, part := range event.LLMResponse.Content.Parts { if part.FunctionCall != nil { fc = append(fc, part.FunctionCall) } } return fc } func functionalResponses(event *session.Event) []*genai.FunctionResponse { if event.LLMResponse.Content == nil || event.LLMResponse.Content.Parts == nil { return nil } fr := []*genai.FunctionResponse{} for _, part := range event.LLMResponse.Content.Parts { if part.FunctionResponse != nil { fr = append(fr, part.FunctionResponse) } } return fr } ================================================ FILE: server/adkrest/controllers/debug_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers_test import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/gorilla/mux" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/log" sdklog "go.opentelemetry.io/otel/sdk/log" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "google.golang.org/adk/server/adkrest/controllers" "google.golang.org/adk/server/adkrest/internal/services" ) func TestSessionSpansHandler(t *testing.T) { tc := []struct { name string sessionID string reqSessionID string wantStatus int wantBody []map[string]any }{ { name: "spans_found_for_session", sessionID: "test-session", reqSessionID: "test-session", wantStatus: http.StatusOK, wantBody: []map[string]any{ { "name": "test-span", "start_time": "test-time", "end_time": "test-time", "trace_id": "test-trace-id", "span_id": "test-span-id", "parent_span_id": "test-parent-span-id", "attributes": map[string]any{ "gcp.vertex.agent.event_id": "test-event", "gen_ai.conversation.id": "test-session", "gen_ai.operation.name": "execute_tool", }, "logs": []any{ map[string]any{ "event_name": "test-log-event", "body": map[string]any{ "message": "test log message", }, }, }, }, }, }, { name: "spans_not_found_for_session", sessionID: "test-session", reqSessionID: "other-session", wantStatus: http.StatusOK, wantBody: []map[string]any{}, }, { name: "empty_session_id_param", sessionID: "test-session", reqSessionID: "", wantStatus: http.StatusBadRequest, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { eventID := "test-event" opName := semconv.GenAIOperationNameExecuteTool.Value.AsString() testTelemetry := setupTestTelemetry() apiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt) req, err := http.NewRequest(http.MethodGet, "/debug/sessions/"+tt.reqSessionID+"/spans", nil) if err != nil { t.Fatalf("new request: %v", err) } req = mux.SetURLVars(req, map[string]string{ "session_id": tt.reqSessionID, }) rr := httptest.NewRecorder() emitTestSignals(tt.sessionID, eventID, opName, testTelemetry.tp, testTelemetry.lp) apiController.SessionSpansHandler(rr, req) if gotStatus := rr.Code; gotStatus != tt.wantStatus { t.Fatalf("handler returned wrong status code: got %v want %v", gotStatus, tt.wantStatus) } if tt.wantStatus == http.StatusOK { var result []map[string]any err = json.NewDecoder(rr.Body).Decode(&result) if err != nil { t.Fatalf("decode response: %v", err) } if diff := cmp.Diff(tt.wantBody, result, ignoreDynamicFields()); diff != "" { t.Errorf("handler returned unexpected body (-want +got):\n%s", diff) } } }) } } func TestEventSpanHandler(t *testing.T) { tc := []struct { name string eventID string reqEventID string opName string wantStatus int wantBody map[string]any }{ { name: "span_with_generate_content_operation", eventID: "test-event", reqEventID: "test-event", opName: semconv.GenAIOperationNameGenerateContent.Value.AsString(), wantStatus: http.StatusOK, wantBody: map[string]any{ "name": "test-span", "gcp.vertex.agent.event_id": "test-event", "gen_ai.conversation.id": "test-session", "gen_ai.operation.name": semconv.GenAIOperationNameGenerateContent.Value.AsString(), "logs": []any{ map[string]any{ "event_name": "test-log-event", "body": map[string]any{ "message": "test log message", }, }, }, }, }, { name: "span_with_execute_tool_operation", eventID: "test-event", reqEventID: "test-event", opName: semconv.GenAIOperationNameExecuteTool.Value.AsString(), wantStatus: http.StatusOK, wantBody: map[string]any{ "name": "test-span", "gcp.vertex.agent.event_id": "test-event", "gen_ai.conversation.id": "test-session", "gen_ai.operation.name": semconv.GenAIOperationNameExecuteTool.Value.AsString(), "logs": []any{ map[string]any{ "event_name": "test-log-event", "body": map[string]any{ "message": "test log message", }, }, }, }, }, { name: "span_not_found_for_event_id", eventID: "test-event", reqEventID: "other-event", opName: semconv.GenAIOperationNameExecuteTool.Value.AsString(), wantStatus: http.StatusNotFound, }, { name: "span_with_different_operation_name", eventID: "test-event", reqEventID: "test-event", opName: "other-op", wantStatus: http.StatusNotFound, }, { name: "empty_event_id_param", eventID: "test-event", reqEventID: "", opName: semconv.GenAIOperationNameExecuteTool.Value.AsString(), wantStatus: http.StatusBadRequest, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { sessionID := "test-session" testTelemetry := setupTestTelemetry() apiController := controllers.NewDebugAPIController(nil, nil, testTelemetry.dt) req, err := http.NewRequest(http.MethodGet, "/debug/events/"+tt.reqEventID+"/span", nil) if err != nil { t.Fatalf("new request: %v", err) } req = mux.SetURLVars(req, map[string]string{ "event_id": tt.reqEventID, }) rr := httptest.NewRecorder() emitTestSignals(sessionID, tt.eventID, tt.opName, testTelemetry.tp, testTelemetry.lp) apiController.EventSpanHandler(rr, req) if status := rr.Code; status != tt.wantStatus { t.Fatalf("handler returned wrong status code: got %v want %v", status, tt.wantStatus) } if tt.wantStatus == http.StatusOK { var gotBody map[string]any err = json.NewDecoder(rr.Body).Decode(&gotBody) if err != nil { t.Fatalf("decode response: %v", err) } if diff := cmp.Diff(tt.wantBody, gotBody, ignoreDynamicFields()); diff != "" { t.Errorf("handler returned unexpected body (-want +got):\n%s", diff) } } }) } } func ignoreDynamicFields() cmp.Option { return cmpopts.IgnoreMapEntries(func(k string, v any) bool { switch k { case "end_time", "observed_timestamp", "span_id", "start_time", "trace_id", "parent_span_id": return true default: return false } }) } type testTelemetry struct { dt *services.DebugTelemetry tracer trace.Tracer tp *sdktrace.TracerProvider logger log.Logger lp *sdklog.LoggerProvider } func setupTestTelemetry() *testTelemetry { dt := services.NewDebugTelemetry() tp := sdktrace.NewTracerProvider(sdktrace.WithSpanProcessor(dt.SpanProcessor())) lp := sdklog.NewLoggerProvider(sdklog.WithProcessor(dt.LogProcessor())) tracer := tp.Tracer("test-tracer") logger := lp.Logger("test-logger") return &testTelemetry{ dt: dt, tracer: tracer, tp: tp, logger: logger, lp: lp, } } func emitTestSignals(sessionID, eventID, opName string, tp *sdktrace.TracerProvider, lp *sdklog.LoggerProvider) { tracer := tp.Tracer("test-tracer") logger := lp.Logger("test-logger") ctx, span := tracer.Start(context.Background(), "test-span", trace.WithAttributes( attribute.String("gcp.vertex.agent.event_id", eventID), attribute.String(string(semconv.GenAIConversationIDKey), sessionID), attribute.String(string(semconv.GenAIOperationNameKey), opName), )) var record log.Record record.SetTimestamp(time.Now()) record.SetObservedTimestamp(time.Now()) record.SetEventName("test-log-event") record.SetBody( log.MapValue( log.KeyValue{ Key: "message", Value: log.StringValue("test log message"), }, ), ) logger.Emit(ctx, record) span.End() _ = tp.ForceFlush(context.Background()) _ = lp.ForceFlush(context.Background()) } ================================================ FILE: server/adkrest/controllers/errors.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers type statusError struct { Err error Code int } func newStatusError(err error, code int) statusError { return statusError{Err: err, Code: code} } // Error returns an associated error func (se statusError) Error() string { return se.Err.Error() } // Status returns an associated status code func (se statusError) Status() int { return se.Code } ================================================ FILE: server/adkrest/controllers/handlers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package controllers contains the controllers for the ADK REST API. package controllers import ( "encoding/json" "net/http" ) // TODO: Move to an internal package, controllers doesn't have to be public API. // EncodeJSONResponse uses the json encoder to write an interface to the http response with an optional status code func EncodeJSONResponse(i any, status int, w http.ResponseWriter) { wHeader := w.Header() wHeader.Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(status) if i != nil { err := json.NewEncoder(w).Encode(i) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } } type errorHandler func(http.ResponseWriter, *http.Request) error // NewErrorHandler writes the error code returned from the http handler. func NewErrorHandler(fn errorHandler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { err := fn(w, r) if err != nil { if statusErr, ok := err.(statusError); ok { http.Error(w, statusErr.Error(), statusErr.Status()) } else { http.Error(w, err.Error(), http.StatusInternalServerError) } } } } // Unimplemented returns 501 - Status Not Implemented error func Unimplemented(rw http.ResponseWriter, req *http.Request) { rw.WriteHeader(http.StatusNotImplemented) } ================================================ FILE: server/adkrest/controllers/runtime.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "context" "encoding/json" "fmt" "net/http" "time" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/memory" "google.golang.org/adk/runner" "google.golang.org/adk/server/adkrest/internal/models" "google.golang.org/adk/session" ) // RuntimeAPIController is the controller for the Runtime API. type RuntimeAPIController struct { sseTimeout time.Duration sessionService session.Service memoryService memory.Service artifactService artifact.Service agentLoader agent.Loader pluginConfig runner.PluginConfig } // NewRuntimeAPIController creates the controller for the Runtime API. func NewRuntimeAPIController(sessionService session.Service, memoryService memory.Service, agentLoader agent.Loader, artifactService artifact.Service, sseTimeout time.Duration, pluginConfig runner.PluginConfig) *RuntimeAPIController { return &RuntimeAPIController{sessionService: sessionService, memoryService: memoryService, agentLoader: agentLoader, artifactService: artifactService, sseTimeout: sseTimeout, pluginConfig: pluginConfig} } // RunAgent executes a non-streaming agent run for a given session and message. func (c *RuntimeAPIController) RunHandler(rw http.ResponseWriter, req *http.Request) error { runAgentRequest, err := decodeRequestBody(req) if err != nil { return err } sessionEvents, err := c.runAgent(req.Context(), runAgentRequest) if err != nil { return err } var events []models.Event for _, event := range sessionEvents { events = append(events, models.FromSessionEvent(*event)) } EncodeJSONResponse(events, http.StatusOK, rw) return nil } // RunAgent executes a non-streaming agent run for a given session and message. func (c *RuntimeAPIController) runAgent(ctx context.Context, runAgentRequest models.RunAgentRequest) ([]*session.Event, error) { err := c.validateSessionExists(ctx, runAgentRequest.AppName, runAgentRequest.UserId, runAgentRequest.SessionId) if err != nil { return nil, err } r, rCfg, err := c.getRunner(runAgentRequest) if err != nil { return nil, err } resp := r.Run(ctx, runAgentRequest.UserId, runAgentRequest.SessionId, &runAgentRequest.NewMessage, *rCfg) var events []*session.Event for event, err := range resp { if err != nil { return nil, newStatusError(fmt.Errorf("failed to run agent: %w", err), http.StatusInternalServerError) } events = append(events, event) } return events, nil } // RunSSEHandler executes an agent run and streams the resulting events using Server-Sent Events (SSE). func (c *RuntimeAPIController) RunSSEHandler(rw http.ResponseWriter, req *http.Request) error { rw.Header().Set("Content-Type", "text/event-stream") rw.Header().Set("Cache-Control", "no-cache") rw.Header().Set("Connection", "keep-alive") // set custom deadlines for this request - it overrides server-wide timeouts rc := http.NewResponseController(rw) deadline := time.Now().Add(c.sseTimeout) err := rc.SetWriteDeadline(deadline) if err != nil { return newStatusError(fmt.Errorf("failed to set write deadline: %w", err), http.StatusInternalServerError) } runAgentRequest, err := decodeRequestBody(req) if err != nil { return err } err = c.validateSessionExists(req.Context(), runAgentRequest.AppName, runAgentRequest.UserId, runAgentRequest.SessionId) if err != nil { return err } r, rCfg, err := c.getRunner(runAgentRequest) if err != nil { return err } opts := []runner.RunOption{} if runAgentRequest.StateDelta != nil { opts = append(opts, runner.WithStateDelta(*runAgentRequest.StateDelta)) } resp := r.Run(req.Context(), runAgentRequest.UserId, runAgentRequest.SessionId, &runAgentRequest.NewMessage, *rCfg, opts...) for event, err := range resp { if err != nil { _, err := fmt.Fprintf(rw, "Error while running agent: %v\n", err) if err != nil { return newStatusError(fmt.Errorf("failed to write response: %w", err), http.StatusInternalServerError) } err = rc.Flush() if err != nil { return newStatusError(fmt.Errorf("failed to flush: %w", err), http.StatusInternalServerError) } continue } err := flashEvent(rc, rw, *event) if err != nil { return err } } return nil } func flashEvent(rc *http.ResponseController, rw http.ResponseWriter, event session.Event) error { _, err := fmt.Fprintf(rw, "data: ") if err != nil { return newStatusError(fmt.Errorf("failed to write response: %w", err), http.StatusInternalServerError) } err = json.NewEncoder(rw).Encode(models.FromSessionEvent(event)) if err != nil { return newStatusError(fmt.Errorf("failed to encode response: %w", err), http.StatusInternalServerError) } _, err = fmt.Fprintf(rw, "\n") if err != nil { return newStatusError(fmt.Errorf("failed to write response: %w", err), http.StatusInternalServerError) } err = rc.Flush() if err != nil { return newStatusError(fmt.Errorf("failed to flush: %w", err), http.StatusInternalServerError) } return nil } func (c *RuntimeAPIController) validateSessionExists(ctx context.Context, appName, userID, sessionID string) error { _, err := c.sessionService.Get(ctx, &session.GetRequest{ AppName: appName, UserID: userID, SessionID: sessionID, }) if err != nil { return newStatusError(fmt.Errorf("failed to get session: %w", err), http.StatusNotFound) } return nil } func (c *RuntimeAPIController) getRunner(req models.RunAgentRequest) (*runner.Runner, *agent.RunConfig, error) { curAgent, err := c.agentLoader.LoadAgent(req.AppName) if err != nil { return nil, nil, newStatusError(fmt.Errorf("failed to load agent: %w", err), http.StatusInternalServerError) } r, err := runner.New(runner.Config{ AppName: req.AppName, Agent: curAgent, SessionService: c.sessionService, MemoryService: c.memoryService, ArtifactService: c.artifactService, PluginConfig: c.pluginConfig, }, ) if err != nil { return nil, nil, newStatusError(fmt.Errorf("failed to create runner: %w", err), http.StatusInternalServerError) } streamingMode := agent.StreamingModeNone if req.Streaming { streamingMode = agent.StreamingModeSSE } return r, &agent.RunConfig{ StreamingMode: streamingMode, }, nil } func decodeRequestBody(req *http.Request) (decodedReq models.RunAgentRequest, err error) { var runAgentRequest models.RunAgentRequest defer func() { err = req.Body.Close() }() d := json.NewDecoder(req.Body) d.DisallowUnknownFields() if err := d.Decode(&runAgentRequest); err != nil { return runAgentRequest, newStatusError(fmt.Errorf("failed to decode request: %w", err), http.StatusBadRequest) } return runAgentRequest, nil } ================================================ FILE: server/adkrest/controllers/runtime_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "testing" "time" "google.golang.org/adk/plugin" "google.golang.org/adk/runner" ) func TestNewRuntimeAPIController_PluginsAssignment(t *testing.T) { p1, err := plugin.New(plugin.Config{Name: "plugin1"}) if err != nil { t.Fatalf("plugin.New() failed for plugin1: %v", err) } p2, err := plugin.New(plugin.Config{Name: "plugin2"}) if err != nil { t.Fatalf("plugin.New() failed for plugin2: %v", err) } tc := []struct { name string plugins []*plugin.Plugin wantPlugins int }{ { name: "with no plugins", plugins: nil, wantPlugins: 0, }, { name: "with empty plugin list", plugins: []*plugin.Plugin{}, wantPlugins: 0, }, { name: "with single plugin", plugins: []*plugin.Plugin{p1}, wantPlugins: 1, }, { name: "with multiple plugins", plugins: []*plugin.Plugin{p1, p2}, wantPlugins: 2, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { controller := NewRuntimeAPIController(nil, nil, nil, nil, 10*time.Second, runner.PluginConfig{ Plugins: tt.plugins, }) if controller == nil { t.Fatal("NewRuntimeAPIController returned nil") } if got := len(controller.pluginConfig.Plugins); got != tt.wantPlugins { t.Errorf("NewRuntimeAPIController() plugins count = %v, want %v", got, tt.wantPlugins) } }) } } ================================================ FILE: server/adkrest/controllers/sessions.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers import ( "context" "encoding/json" "net/http" "github.com/gorilla/mux" "google.golang.org/adk/server/adkrest/internal/models" "google.golang.org/adk/session" ) // TODO: Confirm error handling and target semantic for REST API. // SessionsAPIController is the controller for the Sessions API. type SessionsAPIController struct { service session.Service } // NewSessionsAPIController creates a new SessionsAPIController. func NewSessionsAPIController(service session.Service) *SessionsAPIController { return &SessionsAPIController{service: service} } // CreateSesssionHTTP is a HTTP handler for the create session API. func (c *SessionsAPIController) CreateSessionHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(params) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } createSessionRequest := models.CreateSessionRequest{} // No state and no events, fails to decode req.Body failing with "EOF" if req.ContentLength > 0 { err := json.NewDecoder(req.Body).Decode(&createSessionRequest) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } } respSession, err := c.createSession(req.Context(), sessionID, createSessionRequest) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(respSession, http.StatusOK, rw) } func (c *SessionsAPIController) createSession(ctx context.Context, sessionID models.SessionID, createSessionRequest models.CreateSessionRequest) (models.Session, error) { session, err := c.service.Create(ctx, &session.CreateRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, State: createSessionRequest.State, }) if err != nil { return models.Session{}, err } for _, event := range createSessionRequest.Events { err = c.service.AppendEvent(ctx, session.Session, models.ToSessionEvent(event)) if err != nil { return models.Session{}, err } } return models.FromSession(session.Session) } // DeleteSession handles deleting a specific session. func (c *SessionsAPIController) DeleteSessionHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(params) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } err = c.service.Delete(req.Context(), &session.DeleteRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, }) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(nil, http.StatusOK, rw) } // GetSession retrieves a specific session by its ID. func (c *SessionsAPIController) GetSessionHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(params) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } if sessionID.ID == "" { http.Error(rw, "session_id parameter is required", http.StatusBadRequest) return } storedSession, err := c.service.Get(req.Context(), &session.GetRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, SessionID: sessionID.ID, }) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } session, err := models.FromSession(storedSession.Session) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } EncodeJSONResponse(session, http.StatusOK, rw) } // ListSessions handles listing all sessions for a given app and user. func (c *SessionsAPIController) ListSessionsHandler(rw http.ResponseWriter, req *http.Request) { params := mux.Vars(req) sessionID, err := models.SessionIDFromHTTPParameters(params) if err != nil { http.Error(rw, err.Error(), http.StatusBadRequest) return } var sessions []models.Session resp, err := c.service.List(req.Context(), &session.ListRequest{ AppName: sessionID.AppName, UserID: sessionID.UserID, }) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } for _, session := range resp.Sessions { respSession, err := models.FromSession(session) if err != nil { http.Error(rw, err.Error(), http.StatusInternalServerError) return } sessions = append(sessions, respSession) } EncodeJSONResponse(sessions, http.StatusOK, rw) } ================================================ FILE: server/adkrest/controllers/sessions_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package controllers_test import ( "bytes" "encoding/json" "fmt" "net/http" "net/http/httptest" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/gorilla/mux" "google.golang.org/adk/server/adkrest/controllers" "google.golang.org/adk/server/adkrest/internal/fakes" "google.golang.org/adk/server/adkrest/internal/models" ) func TestGetSession(t *testing.T) { id := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", } tc := []struct { name string storedSessions map[fakes.SessionKey]fakes.TestSession sessionID fakes.SessionKey wantSession models.Session wantErr error wantStatus int }{ { name: "session exists", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: id, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, sessionID: id, wantSession: models.Session{ ID: "testSession", AppName: "testApp", UserID: "testUser", UpdatedAt: time.Now().Unix(), Events: []models.Event{}, State: map[string]any{ "foo": "bar", }, }, wantStatus: http.StatusOK, }, { name: "session does not exist", storedSessions: map[fakes.SessionKey]fakes.TestSession{}, sessionID: id, wantErr: fmt.Errorf("not found"), wantStatus: http.StatusInternalServerError, }, { name: "user ID is missing in input", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: id, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, sessionID: fakes.SessionKey{ AppName: "testApp", SessionID: "testSession", }, wantErr: fmt.Errorf("user_id parameter is required"), wantStatus: http.StatusBadRequest, }, { name: "session ID is missing", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: fakes.SessionKey{ AppName: "testApp", UserID: "testUser", }, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, sessionID: id, wantErr: fmt.Errorf("session_id is empty in received session"), wantStatus: http.StatusInternalServerError, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { sessionService := fakes.FakeSessionService{Sessions: tt.storedSessions} apiController := controllers.NewSessionsAPIController(&sessionService) req, err := http.NewRequest(http.MethodGet, "/apps/testApp/users/testUser/sessions/testSession", nil) if err != nil { t.Fatalf("new request: %v", err) } // Manually set the URL variables on the request using mux.SetURLVars. req = mux.SetURLVars(req, sessionVars(tt.sessionID)) rr := httptest.NewRecorder() apiController.GetSessionHandler(rr, req) if status := rr.Code; status != tt.wantStatus { t.Fatalf("handler returned wrong status code: got %v want %v", status, tt.wantStatus) } if tt.wantErr != nil { respErr := strings.Trim(rr.Body.String(), "\n") if tt.wantErr.Error() != respErr { t.Errorf("CreateSession() mismatch (-want +got):\n%v, %v", tt.wantErr.Error(), respErr) } return } var gotSession models.Session err = json.NewDecoder(rr.Body).Decode(&gotSession) if err != nil { t.Fatalf("decode response: %v", err) } if diff := cmp.Diff(tt.wantSession, gotSession, EquateApproxInt(int64(time.Second))); diff != "" { t.Errorf("GetSession() mismatch (-want +got):\n%s", diff) } }) } } func TestCreateSession(t *testing.T) { id := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", } tc := []struct { name string storedSessions map[fakes.SessionKey]fakes.TestSession sessionID fakes.SessionKey createRequestObj models.CreateSessionRequest wantSession models.Session wantErr error wantStatus int }{ { name: "session exists", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: id, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, sessionID: id, wantErr: fmt.Errorf("session already exists"), wantStatus: http.StatusInternalServerError, }, { name: "successful create operation", storedSessions: map[fakes.SessionKey]fakes.TestSession{}, sessionID: id, createRequestObj: models.CreateSessionRequest{ State: map[string]any{ "foo": "bar", }, Events: []models.Event{ { ID: "eventID", Author: "testUser", }, }, }, wantSession: models.Session{ ID: "testSession", AppName: "testApp", UserID: "testUser", State: map[string]any{ "foo": "bar", }, Events: []models.Event{ { ID: "eventID", Author: "testUser", }, }, }, wantStatus: http.StatusOK, }, { name: "user id is missing", storedSessions: map[fakes.SessionKey]fakes.TestSession{}, sessionID: fakes.SessionKey{ AppName: "testApp", SessionID: "testSession", }, createRequestObj: models.CreateSessionRequest{}, wantStatus: http.StatusBadRequest, wantErr: fmt.Errorf("user_id parameter is required"), }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { sessionService := fakes.FakeSessionService{Sessions: tt.storedSessions} apiController := controllers.NewSessionsAPIController(&sessionService) reqBytes, err := json.Marshal(tt.createRequestObj) if err != nil { t.Fatalf("marshal request: %v", err) } req, err := http.NewRequest(http.MethodPost, "/apps/testApp/users/testUser/sessions/testSession", bytes.NewBuffer(reqBytes)) if err != nil { t.Fatalf("new request: %v", err) } // Manually set the URL variables on the request using mux.SetURLVars. req = mux.SetURLVars(req, sessionVars(tt.sessionID)) rr := httptest.NewRecorder() apiController.CreateSessionHandler(rr, req) if status := rr.Code; status != tt.wantStatus { t.Errorf("handler returned wrong status code: got %v want %v", status, tt.wantStatus) } if tt.wantErr != nil { respErr := strings.Trim(rr.Body.String(), "\n") if tt.wantErr.Error() != respErr { t.Errorf("CreateSession() mismatch (-want +got):\n%v, %v", tt.wantErr.Error(), respErr) } return } var gotSession models.Session err = json.NewDecoder(rr.Body).Decode(&gotSession) if err != nil { t.Fatalf("decode response: %v", err) } if diff := cmp.Diff(tt.wantSession, gotSession, EquateApproxInt(int64(time.Second)), cmpopts.IgnoreFields(models.Session{}, "UpdatedAt")); diff != "" { t.Errorf("CreateSession() mismatch (-want +got):\n%s", diff) } }) } } func TestDeleteSession(t *testing.T) { id := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", } tc := []struct { name string storedSessions map[fakes.SessionKey]fakes.TestSession sessionID fakes.SessionKey wantStatus int }{ { name: "session exists", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: id, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, sessionID: id, wantStatus: http.StatusOK, }, { name: "session does not exist", storedSessions: map[fakes.SessionKey]fakes.TestSession{}, sessionID: id, wantStatus: http.StatusInternalServerError, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { sessionService := fakes.FakeSessionService{Sessions: tt.storedSessions} apiController := controllers.NewSessionsAPIController(&sessionService) req, err := http.NewRequest(http.MethodDelete, "/apps/testApp/users/testUser/sessions/testSession", nil) if err != nil { t.Fatalf("new request: %v", err) } // Manually set the URL variables on the request using mux.SetURLVars. req = mux.SetURLVars(req, sessionVars(tt.sessionID)) rr := httptest.NewRecorder() apiController.DeleteSessionHandler(rr, req) if status := rr.Code; status != tt.wantStatus { t.Fatalf("handler returned wrong status code: got %v want %v", status, tt.wantStatus) } if _, ok := sessionService.Sessions[tt.sessionID]; ok { t.Errorf("session was not deleted") } }) } } func TestListSessions(t *testing.T) { id := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", } newSessionID := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "newSession", } oldSessionID := fakes.SessionKey{ AppName: "testApp", UserID: "testUser", SessionID: "oldSession", } tc := []struct { name string storedSessions map[fakes.SessionKey]fakes.TestSession wantSessions []models.Session wantStatus int }{ { name: "session exists", storedSessions: map[fakes.SessionKey]fakes.TestSession{ id: { Id: id, SessionState: fakes.TestState{"foo": "bar"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, newSessionID: { Id: newSessionID, SessionState: fakes.TestState{"xyz": "abc"}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, oldSessionID: { Id: oldSessionID, SessionState: fakes.TestState{}, SessionEvents: fakes.TestEvents{}, UpdatedAt: time.Now(), }, }, wantSessions: []models.Session{ { ID: "testSession", AppName: "testApp", UserID: "testUser", UpdatedAt: time.Now().Unix(), Events: []models.Event{}, State: map[string]any{ "foo": "bar", }, }, { ID: "newSession", AppName: "testApp", UserID: "testUser", UpdatedAt: time.Now().Unix(), Events: []models.Event{}, State: map[string]any{ "xyz": "abc", }, }, { ID: "oldSession", AppName: "testApp", UserID: "testUser", State: map[string]any{}, UpdatedAt: time.Now().Unix(), Events: []models.Event{}, }, }, wantStatus: http.StatusOK, }, } for _, tt := range tc { t.Run(tt.name, func(t *testing.T) { sessionService := fakes.FakeSessionService{Sessions: tt.storedSessions} apiController := controllers.NewSessionsAPIController(&sessionService) req, err := http.NewRequest(http.MethodDelete, "/apps/testApp/users/testUser/sessions/testSession", nil) if err != nil { t.Fatalf("new request: %v", err) } // Manually set the URL variables on the request using mux.SetURLVars. req = mux.SetURLVars(req, map[string]string{ "app_name": "testApp", "user_id": "testUser", }) rr := httptest.NewRecorder() apiController.ListSessionsHandler(rr, req) if status := rr.Code; status != tt.wantStatus { t.Fatalf("handler returned wrong status code: got %v want %v", status, tt.wantStatus) } got := []models.Session{} err = json.NewDecoder(rr.Body).Decode(&got) if err != nil { t.Fatalf("decode response: %v", err) } if diff := cmp.Diff(tt.wantSessions, got, EquateApproxInt(int64(time.Second)), cmpopts.SortSlices(func(a, b models.Session) bool { return a.ID < b.ID })); diff != "" { t.Errorf("ListSessions() mismatch (-want +got):\n%s", diff) } }) } } func sessionVars(sessionID fakes.SessionKey) map[string]string { return map[string]string{ "app_name": sessionID.AppName, "user_id": sessionID.UserID, "session_id": sessionID.SessionID, } } // EquateApproxInt returns a cmp.Comparer option that determines integer values // to be equal if they are within a certain absolute margin. func EquateApproxInt(margin int64) cmp.Option { return cmp.Comparer(func(x, y int64) bool { diff := x - y if diff < 0 { diff = -diff } return diff <= margin }) } ================================================ FILE: server/adkrest/handler.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package adkrest import ( "net/http" "time" "github.com/gorilla/mux" sdklog "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/trace" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/memory" "google.golang.org/adk/runner" "google.golang.org/adk/server/adkrest/controllers" "google.golang.org/adk/server/adkrest/internal/routers" "google.golang.org/adk/server/adkrest/internal/services" "google.golang.org/adk/session" ) // NewServer creates a new ADK REST API server which implements [http.Handler] interface. func NewServer(cfg ServerConfig) (*Server, error) { debugTelemetry := services.NewDebugTelemetry() router := mux.NewRouter().StrictSlash(true) // TODO: Allow taking a prefix to allow customizing the path // where the ADK REST API will be served. setupRouter(router, routers.NewSessionsAPIRouter(controllers.NewSessionsAPIController(cfg.SessionService)), routers.NewRuntimeAPIRouter(controllers.NewRuntimeAPIController(cfg.SessionService, cfg.MemoryService, cfg.AgentLoader, cfg.ArtifactService, cfg.SSEWriteTimeout, cfg.PluginConfig)), routers.NewAppsAPIRouter(controllers.NewAppsAPIController(cfg.AgentLoader)), routers.NewDebugAPIRouter(controllers.NewDebugAPIController(cfg.SessionService, cfg.AgentLoader, debugTelemetry)), routers.NewArtifactsAPIRouter(controllers.NewArtifactsAPIController(cfg.ArtifactService)), &routers.EvalAPIRouter{}, ) return &Server{ router: router, telemetryStore: debugTelemetry, }, nil } // ServerConfig contains parameters for the ADK REST API server. type ServerConfig struct { SessionService session.Service MemoryService memory.Service AgentLoader agent.Loader ArtifactService artifact.Service SSEWriteTimeout time.Duration PluginConfig runner.PluginConfig } // Server is an HTTP server that serves the ADK REST API. type Server struct { router *mux.Router telemetryStore *services.DebugTelemetry } // ServeHTTP makes [Server] implement [http.Handler] interface. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.router.ServeHTTP(w, r) } // SpanProcessor returns a processor that captures spans used for /debug/trace endpoint of the ADK REST API server. // You can register it in your application TracerProvider to populate it with these spans. func (s *Server) SpanProcessor() trace.SpanProcessor { return s.telemetryStore.SpanProcessor() } // LogProcessor returns a processor that captures log records used for /debug/trace endpoint of the ADK REST API server. // You can register it in your application LoggerProvider to populate it with these logs. func (s *Server) LogProcessor() sdklog.Processor { return s.telemetryStore.LogProcessor() } func setupRouter(router *mux.Router, subrouters ...routers.Router) *mux.Router { routers.SetupSubRouters(router, subrouters...) return router } ================================================ FILE: server/adkrest/internal/fakes/testsessionservice.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package fakes contains a fake implementation of different ADK services used for testing package fakes import ( "context" "fmt" "iter" "time" "google.golang.org/adk/session" ) type TestState map[string]any func (s TestState) Get(key string) (any, error) { return s[key], nil } func (s TestState) Set(key string, val any) error { s[key] = val return nil } func (s TestState) All() iter.Seq2[string, any] { return func(yield func(key string, val any) bool) { for k, v := range s { if !yield(k, v) { return } } } } type TestEvents []*session.Event func (e TestEvents) All() iter.Seq[*session.Event] { return func(yield func(*session.Event) bool) { for _, event := range e { if !yield(event) { return } } } } func (e TestEvents) Len() int { return len(e) } func (e TestEvents) At(i int) *session.Event { return e[i] } type TestSession struct { Id SessionKey SessionState TestState SessionEvents TestEvents UpdatedAt time.Time } func (s TestSession) ID() string { return s.Id.SessionID } func (s TestSession) AppName() string { return s.Id.AppName } func (s TestSession) UserID() string { return s.Id.UserID } func (s TestSession) State() session.State { return s.SessionState } func (s TestSession) Events() session.Events { return s.SessionEvents } func (s TestSession) LastUpdateTime() time.Time { return s.UpdatedAt } type FakeSessionService struct { Sessions map[SessionKey]TestSession } type SessionKey struct { AppName string UserID string SessionID string } func (s *FakeSessionService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) { if _, ok := s.Sessions[SessionKey{AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID}]; ok { return nil, fmt.Errorf("session already exists") } if req.SessionID == "" { req.SessionID = "testID" } testSession := TestSession{ Id: SessionKey{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, }, SessionState: req.State, UpdatedAt: time.Now(), } s.Sessions[SessionKey{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, }] = testSession return &session.CreateResponse{ Session: &testSession, }, nil } func (s *FakeSessionService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) { if sess, ok := s.Sessions[SessionKey{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, }]; ok { return &session.GetResponse{ Session: &sess, }, nil } return nil, fmt.Errorf("not found") } func (s *FakeSessionService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) { result := []session.Session{} for _, session := range s.Sessions { if session.Id.AppName != req.AppName || session.Id.UserID != req.UserID { continue } result = append(result, session) } return &session.ListResponse{ Sessions: result, }, nil } func (s *FakeSessionService) Delete(ctx context.Context, req *session.DeleteRequest) error { id := SessionKey{ AppName: req.AppName, UserID: req.UserID, SessionID: req.SessionID, } if _, ok := s.Sessions[id]; !ok { return fmt.Errorf("not found") } delete(s.Sessions, id) return nil } func (s *FakeSessionService) AppendEvent(ctx context.Context, curSession session.Session, event *session.Event) error { testSession, ok := curSession.(*TestSession) if !ok { return fmt.Errorf("invalid session type") } testSession.SessionEvents = append(testSession.SessionEvents, event) testSession.UpdatedAt = event.Timestamp s.Sessions[testSession.Id] = *testSession return nil } var _ session.Service = (*FakeSessionService)(nil) ================================================ FILE: server/adkrest/internal/models/event.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package models import ( "encoding/json" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // EventActions represent a data model for session.EventActions type EventActions struct { StateDelta map[string]any `json:"stateDelta"` ArtifactDelta map[string]int64 `json:"artifactDelta"` Escalate bool `json:"escalate,omitempty"` SkipSummarization bool `json:"skipSummarization,omitempty"` TransferToAgent string `json:"transferToAgent,omitempty"` } // Event represents a single event in a session. type Event struct { ID string `json:"id"` InvocationID string `json:"invocationId"` Branch string `json:"branch,omitempty"` Author string `json:"author"` Partial bool `json:"partial,omitempty"` LongRunningToolIDs []string `json:"longRunningToolIds,omitempty"` Content *genai.Content `json:"content"` GroundingMetadata *genai.GroundingMetadata `json:"groundingMetadata"` UsageMetadata *genai.GenerateContentResponseUsageMetadata `json:"usageMetadata"` TurnComplete bool `json:"turnComplete,omitempty"` Interrupted bool `json:"interrupted,omitempty"` ErrorCode string `json:"errorCode,omitempty"` ErrorMessage string `json:"errorMessage,omitempty"` AvgLogprobs float64 `json:"avgLogprobs,omitempty"` FinishReason genai.FinishReason `json:"finishReason,omitempty"` ModelVersion string `json:"modelVersion,omitempty"` Actions EventActions `json:"actions"` } // ToSessionEvent maps Event data struct to session.Event func ToSessionEvent(event Event) *session.Event { return &session.Event{ ID: event.ID, InvocationID: event.InvocationID, Branch: event.Branch, Author: event.Author, LongRunningToolIDs: event.LongRunningToolIDs, LLMResponse: model.LLMResponse{ AvgLogprobs: event.AvgLogprobs, Content: event.Content, GroundingMetadata: event.GroundingMetadata, UsageMetadata: event.UsageMetadata, Partial: event.Partial, TurnComplete: event.TurnComplete, Interrupted: event.Interrupted, ErrorCode: event.ErrorCode, ErrorMessage: event.ErrorMessage, FinishReason: event.FinishReason, ModelVersion: event.ModelVersion, }, Actions: session.EventActions{ StateDelta: event.Actions.StateDelta, ArtifactDelta: event.Actions.ArtifactDelta, Escalate: event.Actions.Escalate, SkipSummarization: event.Actions.SkipSummarization, TransferToAgent: event.Actions.TransferToAgent, }, } } // FromSessionEvent maps session.Event to Event data struct func FromSessionEvent(event session.Event) Event { return Event{ ID: event.ID, InvocationID: event.InvocationID, Branch: event.Branch, Author: event.Author, Partial: event.Partial, LongRunningToolIDs: event.LongRunningToolIDs, AvgLogprobs: event.LLMResponse.AvgLogprobs, Content: event.LLMResponse.Content, GroundingMetadata: event.LLMResponse.GroundingMetadata, UsageMetadata: event.LLMResponse.UsageMetadata, TurnComplete: event.LLMResponse.TurnComplete, Interrupted: event.LLMResponse.Interrupted, ErrorCode: event.LLMResponse.ErrorCode, ErrorMessage: event.LLMResponse.ErrorMessage, FinishReason: event.LLMResponse.FinishReason, ModelVersion: event.LLMResponse.ModelVersion, Actions: EventActions{ StateDelta: event.Actions.StateDelta, ArtifactDelta: event.Actions.ArtifactDelta, Escalate: event.Actions.Escalate, SkipSummarization: event.Actions.SkipSummarization, TransferToAgent: event.Actions.TransferToAgent, }, } } func (e Event) MarshalJSON() ([]byte, error) { // Define Proxy structs to override specific JSON tags. // These embed the original types to inherit all other fields automatically. // ProxyFunctionCall overrides 'Args' to remove 'omitempty'. type ProxyFunctionCall struct { *genai.FunctionCall Args map[string]any `json:"args"` // Tag changed: omitempty removed } // ProxyPart overrides 'FunctionCall' to use ProxyFunctionCall. type ProxyPart struct { *genai.Part FunctionCall *ProxyFunctionCall `json:"functionCall,omitempty"` } // ProxyContent overrides 'Parts' to use ProxyPart. type ProxyContent struct { *genai.Content Parts []*ProxyPart `json:"parts,omitempty"` } // Create an Alias of Event to prevent infinite recursion during Marshal. type EventAlias Event // Create a temporary struct that mimics Event but uses ProxyContent. aux := &struct { EventAlias Content *ProxyContent `json:"content"` }{ EventAlias: EventAlias(e), } // Reconstruct the Content hierarchy if it exists. if e.Content != nil { aux.Content = &ProxyContent{ Content: e.Content, Parts: make([]*ProxyPart, len(e.Content.Parts)), } for i, part := range e.Content.Parts { // Wrap the original part proxyPart := &ProxyPart{Part: part} // If this part is a FunctionCall, wrap it to enforce Args visibility if part.FunctionCall != nil { // Ensure args is at least an empty map (not nil) so it marshals to {} args := part.FunctionCall.Args if args == nil { args = make(map[string]any) } proxyPart.FunctionCall = &ProxyFunctionCall{ FunctionCall: part.FunctionCall, Args: args, } } aux.Content.Parts[i] = proxyPart } } return json.Marshal(aux) } ================================================ FILE: server/adkrest/internal/models/models.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package models defines the data structures for the REST API. package models import "reflect" // IsZeroValue checks if the val is the zero-ed value. func IsZeroValue(val any) bool { return val == nil || reflect.DeepEqual(val, reflect.Zero(reflect.TypeOf(val)).Interface()) } ================================================ FILE: server/adkrest/internal/models/runtime.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package models import ( "fmt" "google.golang.org/genai" ) type RunAgentRequest struct { AppName string `json:"appName"` UserId string `json:"userId"` SessionId string `json:"sessionId"` NewMessage genai.Content `json:"newMessage"` Streaming bool `json:"streaming,omitempty"` StateDelta *map[string]any `json:"stateDelta,omitempty"` } // AssertRunAgentRequestRequired checks if the required fields are not zero-ed func (req RunAgentRequest) AssertRunAgentRequestRequired() error { elements := map[string]any{ "appName": req.AppName, "userId": req.UserId, "sessionId": req.SessionId, "newMessage": req.NewMessage, } for name, el := range elements { if isZero := IsZeroValue(el); isZero { return fmt.Errorf("%s is required", name) } } return nil } ================================================ FILE: server/adkrest/internal/models/session.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package models import ( "fmt" "maps" "github.com/mitchellh/mapstructure" "google.golang.org/adk/session" ) // Session represents an agent's session. type Session struct { ID string `json:"id"` AppName string `json:"appName"` UserID string `json:"userId"` UpdatedAt int64 `json:"lastUpdateTime"` Events []Event `json:"events"` State map[string]any `json:"state"` } type CreateSessionRequest struct { State map[string]any `json:"state"` Events []Event `json:"events"` } type SessionID struct { ID string `mapstructure:"session_id,optional"` AppName string `mapstructure:"app_name,required"` UserID string `mapstructure:"user_id,required"` } func SessionIDFromHTTPParameters(vars map[string]string) (SessionID, error) { var sessionID SessionID decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ WeaklyTypedInput: true, Result: &sessionID, }) if err != nil { return sessionID, err } err = decoder.Decode(vars) if err != nil { return sessionID, err } if sessionID.AppName == "" { return sessionID, fmt.Errorf("app_name parameter is required") } if sessionID.UserID == "" { return sessionID, fmt.Errorf("user_id parameter is required") } return sessionID, nil } func FromSession(session session.Session) (Session, error) { state := map[string]any{} maps.Insert(state, session.State().All()) events := []Event{} for event := range session.Events().All() { events = append(events, FromSessionEvent(*event)) } mappedSession := Session{ ID: session.ID(), AppName: session.AppName(), UserID: session.UserID(), UpdatedAt: session.LastUpdateTime().Unix(), Events: events, State: state, } return mappedSession, mappedSession.Validate() } func (s Session) Validate() error { if s.AppName == "" { return fmt.Errorf("app_name is empty in received session") } if s.UserID == "" { return fmt.Errorf("user_id is empty in received session") } if s.ID == "" { return fmt.Errorf("session_id is empty in received session") } if s.UpdatedAt == 0 { return fmt.Errorf("updated_at is empty") } if s.State == nil { return fmt.Errorf("state is nil") } if s.Events == nil { return fmt.Errorf("events is nil") } return nil } ================================================ FILE: server/adkrest/internal/routers/apps.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // AppsAPIRouter defines the routes for the Apps API. type AppsAPIRouter struct { appsController *controllers.AppsAPIController } // NewAppsAPIRouter creates a new AppsAPIRouter. func NewAppsAPIRouter(controller *controllers.AppsAPIController) *AppsAPIRouter { return &AppsAPIRouter{appsController: controller} } // Routes returns the routes for the Apps API. func (r *AppsAPIRouter) Routes() Routes { return Routes{ Route{ Name: "ListApps", Methods: []string{http.MethodGet}, Pattern: "/list-apps", HandlerFunc: r.appsController.ListAppsHandler, }, } } ================================================ FILE: server/adkrest/internal/routers/artifacts.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // ArtifactsAPIRouter defines the routes for the Artifacts API. type ArtifactsAPIRouter struct { artifactsController *controllers.ArtifactsAPIController } // NewArtifactsAPIRouter creates a new ArtifactsAPIRouter. func NewArtifactsAPIRouter(controller *controllers.ArtifactsAPIController) *ArtifactsAPIRouter { return &ArtifactsAPIRouter{artifactsController: controller} } // Routes returns the routes for the Artifacts API. func (r *ArtifactsAPIRouter) Routes() Routes { return Routes{ Route{ Name: "ListArtifacts", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts", HandlerFunc: r.artifactsController.ListArtifactsHandler, }, Route{ Name: "LoadArtifact", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", HandlerFunc: r.artifactsController.LoadArtifactHandler, }, Route{ Name: "LoadArtifactVersion", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}/versions/{version}", HandlerFunc: r.artifactsController.LoadArtifactVersionHandler, }, Route{ Name: "DeleteArtifact", Methods: []string{http.MethodDelete, http.MethodOptions}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{artifact_name}", HandlerFunc: r.artifactsController.DeleteArtifactHandler, }, } } ================================================ FILE: server/adkrest/internal/routers/debug.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // DebugAPIRouter defines the routes for the Debug API. type DebugAPIRouter struct { runtimeController *controllers.DebugAPIController } // NewDebugAPIRouter creates a new DebugAPIRouter. func NewDebugAPIRouter(controller *controllers.DebugAPIController) *DebugAPIRouter { return &DebugAPIRouter{runtimeController: controller} } // Routes returns the routes for the Debug API. func (r *DebugAPIRouter) Routes() Routes { return Routes{ Route{ Name: "GetTraceDict", Methods: []string{http.MethodGet}, Pattern: "/debug/trace/{event_id}", HandlerFunc: r.runtimeController.EventSpanHandler, }, Route{ Name: "GetEventGraph", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph", HandlerFunc: r.runtimeController.EventGraphHandler, }, Route{ Name: "GetSessionTrace", Methods: []string{http.MethodGet}, Pattern: "/debug/trace/session/{session_id}", HandlerFunc: r.runtimeController.SessionSpansHandler, }, } } ================================================ FILE: server/adkrest/internal/routers/eval.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // EvalAPIRouter defines the routes for the Eval API. type EvalAPIRouter struct{} // Routes returns the routes for the Apps API. func (r *EvalAPIRouter) Routes() Routes { return Routes{ Route{ Name: "ListEvalSets", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/eval_sets", HandlerFunc: controllers.Unimplemented, }, Route{ Name: "ListEvalSets", Methods: []string{http.MethodPost, http.MethodOptions}, Pattern: "/apps/{app_name}/eval_sets/{eval_set_name}", HandlerFunc: controllers.Unimplemented, }, Route{ Name: "ListEvalResults", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/eval_results", HandlerFunc: controllers.Unimplemented, }, } } ================================================ FILE: server/adkrest/internal/routers/routers.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package routers defines the HTTP routes for the ADK REST API. package routers import ( "net/http" "github.com/gorilla/mux" ) // A Route defines the parameters for an api endpoint type Route struct { Name string Methods []string Pattern string HandlerFunc http.HandlerFunc } // Routes is a list of defined api endpoints type Routes []Route // Router defines the required methods for retrieving api routes type Router interface { Routes() Routes } // NewRouter creates a new router for any number of api routers func NewRouter(routers ...Router) *mux.Router { router := mux.NewRouter().StrictSlash(true) SetupSubRouters(router) return router } // SetupSubRouters adds routes from subrouter to the naub router func SetupSubRouters(router *mux.Router, subrouters ...Router) { for _, api := range subrouters { for _, route := range api.Routes() { var handler http.Handler = route.HandlerFunc router. Methods(route.Methods...). Path(route.Pattern). Name(route.Name). Handler(handler) } } } ================================================ FILE: server/adkrest/internal/routers/runtime.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // RuntimeAPIRouter defines the routes for the Runtime API. type RuntimeAPIRouter struct { runtimeController *controllers.RuntimeAPIController } // NewRuntimeAPIRouter creates a new RuntimeAPIRouter. func NewRuntimeAPIRouter(controller *controllers.RuntimeAPIController) *RuntimeAPIRouter { return &RuntimeAPIRouter{runtimeController: controller} } // Routes returns the routes for the Runtime API. func (r *RuntimeAPIRouter) Routes() Routes { return Routes{ Route{ Name: "RunAgent", Methods: []string{http.MethodPost, http.MethodOptions}, Pattern: "/run", HandlerFunc: controllers.NewErrorHandler(r.runtimeController.RunHandler), }, Route{ Name: "RunAgentSse", Methods: []string{http.MethodPost, http.MethodOptions}, Pattern: "/run_sse", HandlerFunc: controllers.NewErrorHandler(r.runtimeController.RunSSEHandler), }, } } ================================================ FILE: server/adkrest/internal/routers/sessions.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package routers import ( "net/http" "google.golang.org/adk/server/adkrest/controllers" ) // SessionsAPIRouter defines the routes for the Sessions API. type SessionsAPIRouter struct { sessionController *controllers.SessionsAPIController } // NewSessionsAPIRouter creates a new SessionsAPIRouter. func NewSessionsAPIRouter(controller *controllers.SessionsAPIController) *SessionsAPIRouter { return &SessionsAPIRouter{sessionController: controller} } // Routes returns the routes for the Sessions API. func (r *SessionsAPIRouter) Routes() Routes { return Routes{ Route{ Name: "GetSession", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}", HandlerFunc: r.sessionController.GetSessionHandler, }, Route{ Name: "CreateSession", Methods: []string{http.MethodPost}, Pattern: "/apps/{app_name}/users/{user_id}/sessions", HandlerFunc: r.sessionController.CreateSessionHandler, }, Route{ Name: "CreateSessionWithId", Methods: []string{http.MethodPost}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}", HandlerFunc: r.sessionController.CreateSessionHandler, }, Route{ Name: "DeleteSession", Methods: []string{http.MethodDelete, http.MethodOptions}, Pattern: "/apps/{app_name}/users/{user_id}/sessions/{session_id}", HandlerFunc: r.sessionController.DeleteSessionHandler, }, Route{ Name: "ListSessions", Methods: []string{http.MethodGet}, Pattern: "/apps/{app_name}/users/{user_id}/sessions", HandlerFunc: r.sessionController.ListSessionsHandler, }, } } ================================================ FILE: server/adkrest/internal/services/agentgraphgenerator.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package services import ( "context" "fmt" "slices" "github.com/awalterschulze/gographviz" "google.golang.org/adk/agent" agentinternal "google.golang.org/adk/internal/agent" llmagentinternal "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/tool" ) const ( DarkGreen = "\"#0F5223\"" LightGreen = "\"#69CB87\"" LightGray = "\"#cccccc\"" White = "\"#ffffff\"" Background = "\"#333537\"" ) var supportedClusterAgents = []agentinternal.Type{ agentinternal.TypeLoopAgent, agentinternal.TypeSequentialAgent, agentinternal.TypeParallelAgent, } type namedInstance interface { Name() string } func nodeName(instance any) string { switch i := instance.(type) { case agent.Agent: return i.Name() case tool.Tool: return i.Name() default: return "Unknown instance type" } } func nodeCaption(instance any) string { caption := "" switch i := instance.(type) { case agent.Agent: caption = "🤖 " + i.Name() typedAgent, ok := i.(agentinternal.Agent) if ok { if slices.Contains(supportedClusterAgents, agentinternal.Reveal(typedAgent).AgentType) { caption = i.Name() + " (" + string(agentinternal.Reveal(typedAgent).AgentType) + ")" } } case tool.Tool: caption = "🔧 " + i.Name() default: caption = "Unsupported agent or tool type" } return "\"" + caption + "\"" } func nodeShape(instance any) string { switch instance.(type) { case agent.Agent: return "ellipse" case tool.Tool: return "box" default: return "cylinder" } } func shouldBuildAgentCluster(instance any) bool { switch i := instance.(type) { case agent.Agent: agent, ok := i.(agentinternal.Agent) if !ok { return false } return slices.Contains(supportedClusterAgents, agentinternal.Reveal(agent).AgentType) default: return false } } func highlighted(nodeName string, higlightedPairs [][]string) bool { if len(higlightedPairs) == 0 { return false } for _, pair := range higlightedPairs { if slices.Contains(pair, nodeName) { return true } } return false } func boolPtr(b bool) *bool { return &b } // Function returns whether the edge should be highlighted. // The graph could have the pairs highlighted in different directions. // If nil is returned, means the nodes aren't highlithed. // Otherwise, pointer to bool type is returned, where true // means the directed connection between nodes, while false means // there is a reversed order between nodes. func edgeHighlighted(from, to string, higlightedPairs [][]string) *bool { if len(higlightedPairs) == 0 { return nil } for _, pair := range higlightedPairs { if len(pair) == 2 { if pair[0] == from && pair[1] == to { return boolPtr(true) } if pair[0] == to && pair[1] == from { return boolPtr(false) } } } return nil } func drawCluster(parentGraph, cluster *gographviz.Graph, agent agent.Agent, highlightedPairs [][]string, visitedNodes map[string]bool) error { agentInternal, ok := agent.(agentinternal.Agent) if !ok { return nil } for i, subAgent := range agent.SubAgents() { err := buildGraph(cluster, parentGraph, subAgent, highlightedPairs, visitedNodes) if err != nil { return fmt.Errorf("draw cluster: build graph: %w", err) } switch agentinternal.Reveal(agentInternal).AgentType { // Sequential sub-agents should be connected one after another with edges. case agentinternal.TypeSequentialAgent: if i < len(agent.SubAgents())-1 { err = drawEdge(parentGraph, nodeName(subAgent), nodeName(agent.SubAgents()[i+1]), highlightedPairs) if err != nil { return fmt.Errorf("draw cluster: draw edge: %w", err) } } // Sequential sub-agents should be connected one after another with edges, but the last one should point to the first agent. case agentinternal.TypeLoopAgent: nextAgentIdx := i + 1 if nextAgentIdx >= len(agent.SubAgents()) { nextAgentIdx = 0 } err = drawEdge(parentGraph, nodeName(subAgent), nodeName(agent.SubAgents()[nextAgentIdx]), highlightedPairs) if err != nil { return fmt.Errorf("draw cluster: draw edge: %w", err) } } // Parallel sub-agents shouldn't be connected, they will be a part of the sub graph. } return nil } func drawNode(graph, parentGraph *gographviz.Graph, instance any, highlightedPairs [][]string, visitedNodes map[string]bool) error { name := nodeName(instance) shape := nodeShape(instance) caption := nodeCaption(instance) highlighted := highlighted(name, highlightedPairs) isCluster := shouldBuildAgentCluster(instance) visitedNodes[name] = true if isCluster { agent, ok := instance.(agent.Agent) if !ok { return nil } cluster := gographviz.NewGraph() err := cluster.SetName("cluster_" + name) if err != nil { return fmt.Errorf("set cluster name: %w", err) } err = graph.AddSubGraph(graph.Name, cluster.Name, map[string]string{ "style": "rounded", "color": White, "label": caption, "fontcolor": LightGray, }) if err != nil { return fmt.Errorf("add cluster: %w", err) } return drawCluster(graph, cluster, agent, highlightedPairs, visitedNodes) } else { nodeAttributes := map[string]string{ "label": caption, "shape": shape, "fontcolor": LightGray, } if highlighted { nodeAttributes["color"] = DarkGreen nodeAttributes["style"] = "filled" } else { nodeAttributes["color"] = LightGray nodeAttributes["style"] = "rounded" } return parentGraph.AddNode(graph.Name, name, nodeAttributes) } } func drawEdge(graph *gographviz.Graph, from, to string, highlightedPairs [][]string) error { edgeHighlighted := edgeHighlighted(from, to, highlightedPairs) edgeAttributes := map[string]string{} if edgeHighlighted != nil { edgeAttributes["color"] = LightGreen if !*edgeHighlighted { edgeAttributes["arrowhead"] = "normal" edgeAttributes["dir"] = "back" } else { edgeAttributes["arrowhead"] = "normal" } } else { edgeAttributes["color"] = LightGray edgeAttributes["arrowhead"] = "none" } return graph.AddEdge(from, to, true, edgeAttributes) } func buildGraph(graph, parentGraph *gographviz.Graph, instance any, highlightedPairs [][]string, visitedNodes map[string]bool) error { namedInstance, ok := instance.(namedInstance) if !ok { return nil } if visitedNodes[namedInstance.Name()] { return nil } err := drawNode(graph, parentGraph, instance, highlightedPairs, visitedNodes) if err != nil { return fmt.Errorf("draw node: %w", err) } agent, ok := instance.(agent.Agent) if !ok { return nil } llmAgent, ok := instance.(llmagentinternal.Agent) if ok { tools := llmagentinternal.Reveal(llmAgent).Tools for _, tool := range tools { err = drawNode(graph, parentGraph, tool, highlightedPairs, visitedNodes) if err != nil { return fmt.Errorf("draw tool node: %w", err) } err = drawEdge(graph, nodeName(agent), nodeName(tool), highlightedPairs) if err != nil { return fmt.Errorf("draw tool edge: %w", err) } } } for _, subAgent := range agent.SubAgents() { err = buildGraph(graph, parentGraph, subAgent, highlightedPairs, visitedNodes) if err != nil { return fmt.Errorf("build sub agent graph: %w", err) } } return nil } func GetAgentGraph(ctx context.Context, agent agent.Agent, highlightedPairs [][]string) (string, error) { graph := gographviz.NewGraph() if err := graph.SetName("AgentGraph"); err != nil { return "", fmt.Errorf("set graph name: %w", err) } if err := graph.SetDir(true); err != nil { return "", fmt.Errorf("set graph direction: %w", err) } if err := graph.AddAttr(graph.Name, "rankdir", "LR"); err != nil { return "", fmt.Errorf("set graph rank direction: %w", err) } if err := graph.AddAttr(graph.Name, "bgcolor", Background); err != nil { return "", fmt.Errorf("set graph background color: %w", err) } visitedNodes := map[string]bool{} err := buildGraph(graph, graph, agent, highlightedPairs, visitedNodes) if err != nil { return "", fmt.Errorf("build root graph: %w", err) } return graph.String(), nil } ================================================ FILE: server/adkrest/internal/services/agentgraphgenerator_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package services import ( "context" "iter" "testing" "github.com/awalterschulze/gographviz" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/agent/workflowagents/parallelagent" "google.golang.org/adk/agent/workflowagents/sequentialagent" agentinternal "google.golang.org/adk/internal/agent" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) type dummyLLM struct { name string } func (d *dummyLLM) Name() string { return d.name } func (d *dummyLLM) GenerateContent(ctx context.Context, req *model.LLMRequest, stream bool) iter.Seq2[*model.LLMResponse, error] { return func(yield func(*model.LLMResponse, error) bool) { yield(&model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{{Text: "Response from agentgrapgenerator test."}}, }, }, nil) } } // Helper to create a generic agent.Agent func newTestAgent(t *testing.T, name, description string, agentType agentinternal.Type, subAgents []agent.Agent, tools []tool.Tool) agent.Agent { var a agent.Agent var err error switch agentType { case agentinternal.TypeSequentialAgent: a, err = sequentialagent.New(sequentialagent.Config{ AgentConfig: agent.Config{ Name: name, Description: description, SubAgents: subAgents, }, }) case agentinternal.TypeLoopAgent: a, err = loopagent.New(loopagent.Config{ AgentConfig: agent.Config{ Name: name, Description: description, SubAgents: subAgents, }, MaxIterations: 1, }) case agentinternal.TypeParallelAgent: a, err = parallelagent.New(parallelagent.Config{ AgentConfig: agent.Config{ Name: name, Description: description, SubAgents: subAgents, }, }) case agentinternal.TypeCustomAgent, agentinternal.TypeLLMAgent: a, err = llmagent.New(llmagent.Config{ Name: name, Description: description, Model: &dummyLLM{}, Tools: tools, SubAgents: subAgents, }) default: t.Fatalf("Unsupported agent type: %v", agentType) } if err != nil { t.Fatalf("failed to create agent: %v", err) } return a } // Mock tool for testing type mockTool struct { name string } func (m *mockTool) Name() string { return m.name } func (m *mockTool) Description() string { return "" } func (m *mockTool) IsLongRunning() bool { return false } func TestNodeName(t *testing.T) { tests := []struct { name string instance any expected string }{ { name: "agent", instance: newTestAgent(t, "TestAgent", "", agentinternal.TypeCustomAgent, nil, nil), expected: "TestAgent", }, { name: "tool", instance: &mockTool{name: "TestTool"}, expected: "TestTool", }, { name: "unknown", instance: "some string", expected: "Unknown instance type", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := nodeName(tt.instance); got != tt.expected { t.Errorf("nodeName(%v) = %s; want %s", tt.instance, got, tt.expected) } }) } } func TestNodeCaption(t *testing.T) { tests := []struct { name string instance any expected string }{ { name: "llm agent", instance: newTestAgent(t, "LLMAgent", "", agentinternal.TypeLLMAgent, nil, nil), expected: "\"🤖 LLMAgent\"", }, { name: "sequential agent", instance: newTestAgent(t, "SeqAgent", "", agentinternal.TypeSequentialAgent, nil, nil), expected: "\"SeqAgent (SequentialAgent)\"", }, { name: "loop agent", instance: newTestAgent(t, "LoopAgent", "", agentinternal.TypeLoopAgent, nil, nil), expected: "\"LoopAgent (LoopAgent)\"", }, { name: "parallel agent", instance: newTestAgent(t, "ParAgent", "", agentinternal.TypeParallelAgent, nil, nil), expected: "\"ParAgent (ParallelAgent)\"", }, { name: "tool", instance: &mockTool{name: "TestTool"}, expected: "\"🔧 TestTool\"", }, { name: "unknown", instance: "some string", expected: "\"Unsupported agent or tool type\"", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := nodeCaption(tt.instance); got != tt.expected { t.Errorf("nodeCaption(%v) = %s; want %s", tt.instance, got, tt.expected) } }) } } func TestNodeShape(t *testing.T) { tests := []struct { name string instance any expected string }{ { name: "agent", instance: newTestAgent(t, "TestAgent", "", agentinternal.TypeCustomAgent, nil, nil), expected: "ellipse", }, { name: "tool", instance: &mockTool{name: "TestTool"}, expected: "box", }, { name: "unknown", instance: "some string", expected: "cylinder", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := nodeShape(tt.instance); got != tt.expected { t.Errorf("nodeShape(%v) = %s; want %s", tt.instance, got, tt.expected) } }) } } func TestShouldBuildAgentCluster(t *testing.T) { tests := []struct { name string instance any expected bool }{ { name: "llm agent", instance: newTestAgent(t, "LLMAgent", "", agentinternal.TypeLLMAgent, nil, nil), expected: false, }, { name: "sequential agent", instance: newTestAgent(t, "SeqAgent", "", agentinternal.TypeSequentialAgent, nil, nil), expected: true, }, { name: "loop agent", instance: newTestAgent(t, "LoopAgent", "", agentinternal.TypeLoopAgent, nil, nil), expected: true, }, { name: "parallel agent", instance: newTestAgent(t, "ParAgent", "", agentinternal.TypeParallelAgent, nil, nil), expected: true, }, { name: "tool", instance: &mockTool{name: "TestTool"}, expected: false, }, { name: "unknown", instance: "some string", expected: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := shouldBuildAgentCluster(tt.instance); got != tt.expected { t.Errorf("shouldBuildAgentCluster(%v) = %t; want %t", tt.instance, got, tt.expected) } }) } } func TestHighlighted(t *testing.T) { tests := []struct { name string nodeName string highlightedPairs [][]string expected bool }{ { name: "no highlight", nodeName: "NodeA", highlightedPairs: [][]string{}, expected: false, }, { name: "node in pair", nodeName: "NodeA", highlightedPairs: [][]string{{"NodeA", "NodeB"}}, expected: true, }, { name: "node not in pair", nodeName: "NodeC", highlightedPairs: [][]string{{"NodeA", "NodeB"}}, expected: false, }, { name: "multiple pairs", nodeName: "NodeB", highlightedPairs: [][]string{{"NodeA", "NodeB"}, {"NodeC", "NodeD"}}, expected: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := highlighted(tt.nodeName, tt.highlightedPairs); got != tt.expected { t.Errorf("highlighted(%s, %v) = %t; want %t", tt.nodeName, tt.highlightedPairs, got, tt.expected) } }) } } func TestEdgeHighlighted(t *testing.T) { tests := []struct { name string from string to string highlightedPairs [][]string expected *bool // Use pointer to distinguish nil from false }{ { name: "no highlight pairs", from: "A", to: "B", highlightedPairs: [][]string{}, expected: nil, }, { name: "matching forward", from: "A", to: "B", highlightedPairs: [][]string{{"A", "B"}}, expected: boolPtr(true), }, { name: "matching backward", from: "B", to: "A", highlightedPairs: [][]string{{"A", "B"}}, expected: boolPtr(false), }, { name: "no match", from: "C", to: "D", highlightedPairs: [][]string{{"A", "B"}}, expected: nil, }, { name: "partial match", from: "A", to: "C", highlightedPairs: [][]string{{"A", "B"}}, expected: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := edgeHighlighted(tt.from, tt.to, tt.highlightedPairs) if (got == nil && tt.expected != nil) || (got != nil && tt.expected == nil) { t.Errorf("edgeHighlighted(%s, %s, %v) = %v; want %v", tt.from, tt.to, tt.highlightedPairs, got, tt.expected) } else if got != nil && tt.expected != nil && *got != *tt.expected { t.Errorf("edgeHighlighted(%s, %s, %v) = %t; want %t", tt.from, tt.to, tt.highlightedPairs, *got, *tt.expected) } }) } } func TestDrawNode(t *testing.T) { tests := []struct { name string agent agent.Agent tool tool.Tool highlightedPairs [][]string expected gographviz.Attrs }{ { name: "draw agent node", agent: newTestAgent(t, "MyAgent", "", agentinternal.TypeCustomAgent, nil, nil), highlightedPairs: [][]string{}, expected: gographviz.Attrs{ "color": LightGray, "label": "\"🤖 MyAgent\"", "shape": "ellipse", "fontcolor": LightGray, "style": "rounded", }, }, { name: "draw agent node highlighted", agent: newTestAgent(t, "HighlightedAgent", "", agentinternal.TypeCustomAgent, nil, nil), highlightedPairs: [][]string{{"HighlightedAgent", "Tool1"}}, expected: gographviz.Attrs{ "color": DarkGreen, "label": "\"🤖 HighlightedAgent\"", "shape": "ellipse", "fontcolor": LightGray, "style": "filled", }, }, { name: "draw tool node", tool: &mockTool{name: "MyTool"}, highlightedPairs: [][]string{}, expected: gographviz.Attrs{ "color": LightGray, "label": "\"🔧 MyTool\"", "shape": "box", "fontcolor": LightGray, "style": "rounded", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { graph := gographviz.NewGraph() err := graph.SetName("G") if err != nil { t.Fatalf("failed to set graph name: %v", err) } parentGraph := graph visitedNodes := make(map[string]bool) nodeName := "" if tt.agent != nil { err = drawNode(graph, parentGraph, tt.agent, tt.highlightedPairs, visitedNodes) if err != nil { t.Fatalf("drawNode failed: %v", err) } nodeName = tt.agent.Name() } if tt.tool != nil { err = drawNode(graph, parentGraph, tt.tool, tt.highlightedPairs, visitedNodes) if err != nil { t.Fatalf("drawNode failed: %v", err) } nodeName = tt.tool.Name() } if nodeName == "" { t.Fatalf("No node name found: %v", nodeName) } node := graph.Nodes.Lookup[nodeName] if node == nil { t.Fatal("Agent node not found in graph") // to prevent SA5011: possible nil pointer dereference (staticcheck) return } if diff := cmp.Diff(tt.expected, node.Attrs); diff != "" { t.Fatalf("drawNode mismatch (-want +got):\n%s", diff) } if !visitedNodes[nodeName] { t.Error("Agent node not marked as visited") } }) } } func TestDrawClusterNode(t *testing.T) { graph := gographviz.NewGraph() err := graph.SetName("G") if err != nil { t.Fatalf("failed to set graph name: %v", err) } parentGraph := graph visitedNodes := make(map[string]bool) agent := newTestAgent(t, "MyClusterAgent", "", agentinternal.TypeSequentialAgent, nil, nil) err = drawNode(graph, parentGraph, agent, [][]string{}, visitedNodes) if err != nil { t.Fatalf("drawNode failed: %v", err) } clusterName := "cluster_MyClusterAgent" cluster := graph.SubGraphs.SubGraphs[clusterName] if cluster == nil { t.Fatal("Cluster not found in graph") // to prevent SA5011: possible nil pointer dereference (staticcheck) return } if cluster.Attrs["label"] != "\"MyClusterAgent (SequentialAgent)\"" { t.Errorf("Cluster label mismatch: got %s", cluster.Attrs["label"]) } if cluster.Attrs["style"] != "rounded" { t.Errorf("Cluster style mismatch: got %s", cluster.Attrs["style"]) } if !visitedNodes["MyClusterAgent"] { t.Error("Cluster agent not marked as visited") } } func lookupEdge(t *testing.T, graph *gographviz.Graph, src, dst string) *gographviz.Edge { node := graph.Edges.SrcToDsts[src] if node == nil { return nil } edges := node[dst] if edges == nil { return nil } if len(edges) != 1 { t.Fatalf("Expected 1 edge, got %d", len(edges)) } return edges[0] } func TestDrawEdge(t *testing.T) { tests := []struct { name string from string to string highlightedPairs [][]string expected gographviz.Attrs }{ { name: "draw unhighlighted edge", from: "NodeA", to: "NodeB", highlightedPairs: [][]string{}, expected: gographviz.Attrs{ "color": LightGray, "arrowhead": "none", }, }, { name: "draw highlighted edge", from: "NodeC", to: "NodeD", highlightedPairs: [][]string{{"NodeC", "NodeD"}}, expected: gographviz.Attrs{ "color": LightGreen, "arrowhead": "normal", }, }, { name: "draw highlighted backward edge", from: "NodeE", to: "NodeF", highlightedPairs: [][]string{{"NodeF", "NodeE"}}, expected: gographviz.Attrs{ "color": LightGreen, "arrowhead": "normal", "dir": "back", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { graph := gographviz.NewGraph() err := graph.SetName("G") if err != nil { t.Fatalf("failed to set graph name: %v", err) } for _, node := range []string{tt.from, tt.to} { err := graph.AddNode("G", node, nil) if err != nil { t.Fatalf("failed to add node %s: %v", node, err) } } err = drawEdge(graph, tt.from, tt.to, tt.highlightedPairs) if err != nil { t.Fatalf("drawEdge failed: %v", err) } edge := lookupEdge(t, graph, tt.from, tt.to) if edge == nil { t.Fatalf("Edge between %v and %v not found", tt.from, tt.to) // to prevent SA5011: possible nil pointer dereference (staticcheck) return } if diff := cmp.Diff(tt.expected, edge.Attrs); diff != "" { t.Fatalf("drawEdge mismatch (-want +got):\n%s", diff) } }) } } func TestDrawCluster(t *testing.T) { tests := []struct { name string agentType agentinternal.Type }{ { name: "sequential agent cluster", agentType: agentinternal.TypeSequentialAgent, }, { name: "parallel agent cluster", agentType: agentinternal.TypeParallelAgent, }, { name: "loop agent cluster", agentType: agentinternal.TypeLoopAgent, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { parentGraph := gographviz.NewGraph() err := parentGraph.SetName("ParentG") if err != nil { t.Fatalf("failed to set parent graph name: %v", err) } visitedNodes := make(map[string]bool) subAgent1 := newTestAgent(t, "SubAgent1", "", agentinternal.TypeLLMAgent, nil, nil) subAgent2 := newTestAgent(t, "SubAgent2", "", agentinternal.TypeLLMAgent, nil, nil) parentAgent := newTestAgent(t, "ParentAgent", "", tt.agentType, []agent.Agent{subAgent1, subAgent2}, nil) clusterGraph := gographviz.NewGraph() err = drawCluster(parentGraph, clusterGraph, parentAgent, [][]string{}, visitedNodes) if err != nil { t.Fatalf("drawCluster failed: %v", err) } if parentGraph.Nodes.Lookup["SubAgent1"] == nil || parentGraph.Nodes.Lookup["SubAgent2"] == nil { t.Error("Sub-agents not drawn as nodes in parent graph") } switch tt.agentType { case agentinternal.TypeSequentialAgent: // Check if sub-agents are drawn as nodes in the parent graph (since drawNode adds to parentGraph) edge := lookupEdge(t, parentGraph, "SubAgent1", "SubAgent2") // Check if edge exists between sub-agents if edge == nil { t.Fatalf("Edge between SubAgent1 and SubAgent2 not found") // to prevent SA5011: possible nil pointer dereference (staticcheck) return } if edge.Attrs["arrowhead"] != "none" { t.Errorf("Sequential agent edge arrowhead mismatch: got %s", edge.Attrs["arrowhead"]) } case agentinternal.TypeParallelAgent: // Check that no edges exist between parallel sub-agents if lookupEdge(t, parentGraph, "SubAgent1", "SubAgent2") != nil || lookupEdge(t, parentGraph, "ParSubAgent2", "ParSubAgent1") != nil { t.Error("Unexpected edge found between parallel sub-agents") } case agentinternal.TypeLoopAgent: // Check if edges exist between sub-agents and back to the first if lookupEdge(t, parentGraph, "SubAgent1", "SubAgent2") == nil { t.Error("Edge between SubAgent1 and SubAgent2 not found") } if lookupEdge(t, parentGraph, "SubAgent1", "SubAgent2") == nil { t.Error("Edge between SubAgent1 and LoopSubAgent1 not found") } default: t.Fatalf("Wrong agent type provided: %v", tt.agentType) } }) } } func TestBuildGraph(t *testing.T) { graph := gographviz.NewGraph() err := graph.SetName("G") if err != nil { t.Fatalf("failed to set parent graph name: %v", err) } parentGraph := graph visitedNodes := make(map[string]bool) tool1 := &mockTool{name: "Tool1"} tool2 := &mockTool{name: "Tool2"} subAgent1 := newTestAgent(t, "SubAgent1", "", agentinternal.TypeLLMAgent, nil, []tool.Tool{tool1}) subAgent2 := newTestAgent(t, "SubAgent2", "", agentinternal.TypeLLMAgent, nil, nil) mainAgent := newTestAgent(t, "MainAgent", "", agentinternal.TypeLLMAgent, []agent.Agent{subAgent1, subAgent2}, []tool.Tool{tool2}) err = buildGraph(graph, parentGraph, mainAgent, [][]string{}, visitedNodes) if err != nil { t.Fatalf("buildGraph failed: %v", err) } // Check if all nodes are present expectedNodes := []string{"MainAgent", "SubAgent1", "SubAgent2", "Tool1", "Tool2"} for _, nodeName := range expectedNodes { if graph.Nodes.Lookup[nodeName] == nil { t.Errorf("Node %s not found in graph", nodeName) } if !visitedNodes[nodeName] { t.Errorf("Node %s not marked as visited", nodeName) } } // Check edges from MainAgent to its tools if lookupEdge(t, graph, "MainAgent", "Tool2") == nil { t.Error("Edge from MainAgent to Tool2 not found") } // // Check edges from SubAgent1 to its tools if lookupEdge(t, graph, "SubAgent1", "Tool1") == nil { t.Error("Edge from SubAgent1 to Tool1 not found") } } ================================================ FILE: server/adkrest/internal/services/debugtelemetry.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package services import ( "context" "slices" "sync" "time" "go.opentelemetry.io/otel/attribute" sdklog "go.opentelemetry.io/otel/sdk/log" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "google.golang.org/adk/internal/telemetry" ) const eventIDKey = "gcp.vertex.agent.event_id" // DebugTelemetry stores the in memory spans and logs, grouped by session and event. type DebugTelemetry struct { store *spanStore } // NewDebugTelemetry returns a new DebugTelemetry instance. func NewDebugTelemetry() *DebugTelemetry { return &DebugTelemetry{ store: newSpanStore(), } } func (d *DebugTelemetry) SpanProcessor() sdktrace.SpanProcessor { // Use simple processor to avoid the lag between ending the span and it appearing in adk-web. return sdktrace.NewSimpleSpanProcessor(d.store) } func (d *DebugTelemetry) LogProcessor() sdklog.Processor { // Use simple processor to avoid the lag between logging and it appearing in adk-web. return sdklog.NewSimpleProcessor(d.store) } // GetSpansByEventID returns spans associated with the given event ID. func (d *DebugTelemetry) GetSpansByEventID(eventID string) []DebugSpan { return d.store.getSpansByEventID(eventID) } // GetSpansBySessionID returns spans associated with the given session ID. func (d *DebugTelemetry) GetSpansBySessionID(sessionID string) []DebugSpan { return d.store.getSpansBySessionID(sessionID) } func convertAttrs(in []attribute.KeyValue) map[string]string { out := make(map[string]string) for _, attr := range in { out[string(attr.Key)] = attr.Value.Emit() } return out } // DebugSpan represents a span in the trace. type DebugSpan struct { Name string `json:"name"` StartTime int64 `json:"start_time"` EndTime int64 `json:"end_time"` SpanID string `json:"span_id"` TraceID string `json:"trace_id"` ParentSpanID string `json:"parent_span_id"` Attributes map[string]string `json:"attributes"` Logs []DebugLog `json:"logs"` } // DebugLog represents a log in the span. type DebugLog struct { Body any `json:"body"` ObservedTimestamp string `json:"observed_timestamp"` TraceID string `json:"trace_id"` SpanID string `json:"span_id"` EventName string `json:"event_name"` } // spanRecord stores a span and its associated logs. type spanRecord struct { Span *inMemorySpan Logs []DebugLog } // inMemorySpan stores spans in memory for debug telemetry. type inMemorySpan struct { Name string StartTime time.Time EndTime time.Time Context trace.SpanContext ParentSpanID trace.SpanID Attributes map[string]string } // spanStore stores spans and logs in memory for debug telemetry. type spanStore struct { mu sync.RWMutex // recordsBySpanID stores spans indexed by span id. recordsBySpanID map[string]*spanRecord // traceIDsBySessionID stores trace ids indexed by session id for easy lookup. traceIDsBySessionID map[string]map[string]struct{} // recordsByEventID stores spans indexed by event id for easy lookup. recordsByEventID map[string][]*spanRecord // recordsByTraceID stores spans indexed by trace id for easy lookup. recordsByTraceID map[string][]*spanRecord } func newSpanStore() *spanStore { return &spanStore{ recordsBySpanID: make(map[string]*spanRecord), traceIDsBySessionID: make(map[string]map[string]struct{}), recordsByEventID: make(map[string][]*spanRecord), recordsByTraceID: make(map[string][]*spanRecord), } } func (s *spanStore) getSpansByEventID(id string) []DebugSpan { s.mu.RLock() defer s.mu.RUnlock() // Create a copy of the slice to avoid race conditions. records := slices.Clone(s.recordsByEventID[id]) return convertRecords(records) } func (s *spanStore) getSpansBySessionID(sessionID string) []DebugSpan { s.mu.RLock() defer s.mu.RUnlock() traces := s.traceIDsBySessionID[sessionID] var records []*spanRecord for traceID := range traces { if r, ok := s.recordsByTraceID[traceID]; ok { records = append(records, r...) } } return convertRecords(records) } func convertRecords(records []*spanRecord) []DebugSpan { records = filterNilsAndSort(records) debugSpans := make([]DebugSpan, len(records)) for i, r := range records { // Clone the logs to avoid race conditions. logs := slices.Clone(r.Logs) debugSpans[i] = DebugSpan{ Name: r.Span.Name, StartTime: r.Span.StartTime.UnixNano(), EndTime: r.Span.EndTime.UnixNano(), TraceID: r.Span.Context.TraceID().String(), SpanID: r.Span.Context.SpanID().String(), ParentSpanID: r.Span.ParentSpanID.String(), Attributes: r.Span.Attributes, Logs: logs, } } return debugSpans } func filterNilsAndSort(records []*spanRecord) []*spanRecord { filtered := slices.DeleteFunc(records, func(s *spanRecord) bool { // Logs are emitted before the span is closed and sent to the processor. // Skip them in the response. return s == nil || s.Span == nil }) slices.SortFunc(filtered, func(a, b *spanRecord) int { return a.Span.StartTime.Compare(b.Span.StartTime) }) return filtered } // Export implements sdklog.Exporter. func (s *spanStore) Export(ctx context.Context, logRecords []sdklog.Record) error { s.mu.Lock() defer s.mu.Unlock() for _, log := range logRecords { if !log.SpanID().IsValid() { // Drop the logs without spanID - we'll never return them to the user. continue } spanID := log.SpanID().String() record, ok := s.recordsBySpanID[spanID] if !ok { record = &spanRecord{} s.recordsBySpanID[spanID] = record } record.Logs = append(record.Logs, DebugLog{ Body: telemetry.FromLogValue(log.Body()), ObservedTimestamp: log.ObservedTimestamp().Format(time.RFC3339Nano), TraceID: log.TraceID().String(), SpanID: log.SpanID().String(), EventName: log.EventName(), }) } return nil } // ExportSpans implements [sdktrace.SpanExporter]. func (s *spanStore) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error { s.mu.Lock() defer s.mu.Unlock() for _, span := range spans { attrs := convertAttrs(span.Attributes()) spanID := span.SpanContext().SpanID().String() record, ok := s.recordsBySpanID[spanID] if !ok { record = &spanRecord{} s.recordsBySpanID[spanID] = record } record.Span = &inMemorySpan{ Name: span.Name(), StartTime: span.StartTime(), EndTime: span.EndTime(), Context: span.SpanContext(), ParentSpanID: span.Parent().SpanID(), Attributes: attrs, } s.updateSpanIndexes(record.Span, record) } return nil } func (s *spanStore) updateSpanIndexes(span *inMemorySpan, record *spanRecord) { // Update session id -> trace id mapping. sessionIDKey := string(semconv.GenAIConversationIDKey) if sessionID, ok := span.Attributes[sessionIDKey]; ok { traces, ok := s.traceIDsBySessionID[sessionID] if !ok { traces = make(map[string]struct{}) s.traceIDsBySessionID[sessionID] = traces } traceID := span.Context.TraceID().String() traces[traceID] = struct{}{} } // Update event id -> span id mapping. if eventID, ok := span.Attributes[eventIDKey]; ok { s.recordsByEventID[eventID] = append(s.recordsByEventID[eventID], record) } // Update trace id -> span id mapping. traceID := span.Context.TraceID().String() s.recordsByTraceID[traceID] = append(s.recordsByTraceID[traceID], record) } // ForceFlush implements sdklog.Exporter and sdktrace.SpanProcessor. func (s *spanStore) ForceFlush(ctx context.Context) error { return nil } // Shutdown implements sdklog.Exporter and sdktrace.SpanProcessor. func (s *spanStore) Shutdown(ctx context.Context) error { return nil } ================================================ FILE: server/adkrest/internal/services/debugtelemetry_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package services import ( "context" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/log" sdklog "go.opentelemetry.io/otel/sdk/log" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" ) func TestDebugTelemetryGetSpansBySessionID(t *testing.T) { ctx := context.Background() type testCase struct { name string testSetup func(ctx context.Context, tracer trace.Tracer, logger log.Logger) querySessionID string wantSessionSpans []DebugSpan } tests := []testCase{ { name: "root span with conversation id", testSetup: func(rootCtx context.Context, tracer trace.Tracer, logger log.Logger) { rootCtx, rootSpan := tracer.Start(rootCtx, "root-span", trace.WithAttributes( attribute.String(string(semconv.GenAIConversationIDKey), "session-1"), )) defer rootSpan.End() childCtx, childSpan := tracer.Start(rootCtx, "child-span") childLog := log.Record{} childLog.SetBody(log.StringValue("child-log-body")) childLog.SetEventName("child-log-event") childLog.SetTimestamp(time.Now()) logger.Emit(childCtx, childLog) childSpan.End() rootLog := log.Record{} rootLog.SetBody(log.StringValue("root-log-body")) rootLog.SetEventName("root-log-event") rootLog.SetTimestamp(time.Now()) logger.Emit(rootCtx, rootLog) }, querySessionID: "session-1", wantSessionSpans: []DebugSpan{ { Name: "root-span", ParentSpanID: trace.SpanID{}.String(), Attributes: map[string]string{ string(semconv.GenAIConversationIDKey): "session-1", }, Logs: []DebugLog{ { Body: "root-log-body", EventName: "root-log-event", }, }, }, { Name: "child-span", ParentSpanID: trace.SpanID{}.String(), Attributes: map[string]string{}, Logs: []DebugLog{ { Body: "child-log-body", EventName: "child-log-event", }, }, }, }, }, { name: "child span with conversation id", testSetup: func(rootCtx context.Context, tracer trace.Tracer, logger log.Logger) { var rootSpan trace.Span rootCtx, rootSpan = tracer.Start(rootCtx, "root") childCtx, childSpan := tracer.Start(rootCtx, "child") _, secondChildSpan := tracer.Start(rootCtx, "child-2") _, thirdChildSpan := tracer.Start(childCtx, "grandchild", trace.WithAttributes( semconv.GenAIConversationID("test-session-id"), )) thirdChildSpan.End() secondChildSpan.End() childSpan.End() rootSpan.End() // Create another trace with a different session ID (should not be returned). _, rootSpan3 := tracer.Start(context.Background(), "root-3", trace.WithAttributes( semconv.GenAIConversationID("test-session-id-1"), )) rootSpan3.End() }, querySessionID: "test-session-id", wantSessionSpans: []DebugSpan{ {Name: "root", Attributes: map[string]string{}}, {Name: "child", Attributes: map[string]string{}}, {Name: "child-2", Attributes: map[string]string{}}, {Name: "grandchild", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "test-session-id"}}, }, }, { name: "multiple traces with same session id", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { // Trace 1 root1Ctx, root1Span := tracer.Start(ctx, "root-1", trace.WithAttributes( semconv.GenAIConversationID("session-1"), )) _, child1 := tracer.Start(root1Ctx, "child-1") child1.End() root1Span.End() // Trace 2 (different trace ID, same session ID) // Session ID on child span root2Ctx, root2Span := tracer.Start(ctx, "root-2") _, child2 := tracer.Start(root2Ctx, "child-2", trace.WithAttributes( semconv.GenAIConversationID("session-1"), )) child2.End() root2Span.End() }, querySessionID: "session-1", wantSessionSpans: []DebugSpan{ {Name: "root-1", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-1"}}, {Name: "child-1", Attributes: map[string]string{}}, {Name: "root-2", Attributes: map[string]string{}}, {Name: "child-2", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-1"}}, }, }, { name: "trace with spans with mixed session ids session-1", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { rootCtx, rootSpan := tracer.Start(ctx, "mixed-root", trace.WithAttributes( semconv.GenAIConversationID("session-1"), )) _, childSpan := tracer.Start(rootCtx, "mixed-child", trace.WithAttributes( semconv.GenAIConversationID("session-2"), )) childSpan.End() rootSpan.End() }, querySessionID: "session-1", wantSessionSpans: []DebugSpan{ {Name: "mixed-root", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-1"}}, {Name: "mixed-child", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-2"}}, }, }, { name: "trace with spans with mixed session ids session-2", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { rootCtx, rootSpan := tracer.Start(ctx, "mixed-root", trace.WithAttributes( semconv.GenAIConversationID("session-1"), )) _, childSpan := tracer.Start(rootCtx, "mixed-child", trace.WithAttributes( semconv.GenAIConversationID("session-2"), )) childSpan.End() rootSpan.End() }, querySessionID: "session-2", wantSessionSpans: []DebugSpan{ {Name: "mixed-root", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-1"}}, {Name: "mixed-child", Attributes: map[string]string{string(semconv.GenAIConversationIDKey): "session-2"}}, }, }, { name: "no matching session id", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { _, rootSpan := tracer.Start(ctx, "root-1", trace.WithAttributes( attribute.String(string(semconv.GenAIConversationIDKey), "session-1"), attribute.String("gcp.vertex.agent.event_id", "event-1"), )) rootSpan.End() }, querySessionID: "non-existent-session", wantSessionSpans: nil, }, { name: "log without span", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { var logRecord log.Record logRecord.SetBody(log.StringValue("test body")) logRecord.SetEventName("test_event") logRecord.SetTimestamp(time.Now()) logger.Emit(ctx, logRecord) }, querySessionID: "session-1", wantSessionSpans: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { debugTelemetry, tp, lp := setup() if tt.testSetup != nil { tt.testSetup(ctx, tp.Tracer("test-tracer"), lp.Logger("test-logger")) } if err := tp.ForceFlush(ctx); err != nil { t.Fatalf("Failed to flush spans: %v", err) } if err := lp.ForceFlush(ctx); err != nil { t.Fatalf("Failed to flush logs: %v", err) } cmpOpts := []cmp.Option{ cmpopts.IgnoreUnexported(log.Value{}), cmpopts.IgnoreFields(DebugSpan{}, "StartTime", "EndTime", "TraceID", "SpanID", "ParentSpanID"), cmpopts.IgnoreFields(DebugLog{}, "ObservedTimestamp", "TraceID", "SpanID"), cmpopts.EquateEmpty(), } // Validate session spans gotSessionSpans := debugTelemetry.GetSpansBySessionID(tt.querySessionID) if diff := cmp.Diff(tt.wantSessionSpans, gotSessionSpans, cmpOpts...); diff != "" { t.Errorf("GetSpansBySessionID() mismatch (-want +got):\n%s", diff) } }) } } func TestDebugTelemetryGetSpansByEventID(t *testing.T) { ctx := context.Background() type testCase struct { name string testSetup func(ctx context.Context, tracer trace.Tracer, logger log.Logger) queryEventID string wantEventSpans []DebugSpan } tests := []testCase{ { name: "single span and log", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { ctx, span := tracer.Start(ctx, "root-1", trace.WithAttributes( attribute.String("gcp.vertex.agent.event_id", "event-1"), attribute.String("genai.operation.name", "generate_content"), )) defer span.End() var r log.Record r.SetBody(log.StringValue("test body")) r.SetEventName("test_event") r.SetTimestamp(time.Now()) logger.Emit(ctx, r) }, queryEventID: "event-1", wantEventSpans: []DebugSpan{ { Name: "root-1", ParentSpanID: trace.SpanID{}.String(), Attributes: map[string]string{ "gcp.vertex.agent.event_id": "event-1", "genai.operation.name": "generate_content", }, Logs: []DebugLog{ { Body: "test body", EventName: "test_event", }, }, }, }, }, { name: "multiple spans", testSetup: func(span1Ctx context.Context, tracer trace.Tracer, logger log.Logger) { span1Ctx, span1 := tracer.Start(span1Ctx, "root-1", trace.WithAttributes( attribute.String("gcp.vertex.agent.event_id", "event-1"), attribute.String("genai.operation.name", "generate_content"), )) defer span1.End() _, span2 := tracer.Start(span1Ctx, "root-2", trace.WithAttributes( attribute.String("gcp.vertex.agent.event_id", "event-1"), attribute.String("genai.operation.name", "execute_tool"), )) defer span2.End() }, queryEventID: "event-1", wantEventSpans: []DebugSpan{ { Name: "root-1", ParentSpanID: trace.SpanID{}.String(), Attributes: map[string]string{ "gcp.vertex.agent.event_id": "event-1", "genai.operation.name": "generate_content", }, }, { Name: "root-2", ParentSpanID: trace.SpanID{}.String(), Attributes: map[string]string{ "gcp.vertex.agent.event_id": "event-1", "genai.operation.name": "execute_tool", }, }, }, }, { name: "no matching span", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { _, span := tracer.Start(ctx, "root-1", trace.WithAttributes( attribute.String("gcp.vertex.agent.event_id", "event-1"), attribute.String("genai.operation.name", "generate_content"), )) span.End() }, queryEventID: "non-existent-event", wantEventSpans: nil, }, { name: "log without span", testSetup: func(ctx context.Context, tracer trace.Tracer, logger log.Logger) { var r log.Record r.SetBody(log.StringValue("test body")) r.SetEventName("test_event") r.SetTimestamp(time.Now()) logger.Emit(ctx, r) }, queryEventID: "event-1", wantEventSpans: nil, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { debugTelemetry, tp, lp := setup() if tt.testSetup != nil { tt.testSetup(ctx, tp.Tracer("test-tracer"), lp.Logger("test-logger")) } if err := tp.ForceFlush(ctx); err != nil { t.Fatalf("Failed to flush spans: %v", err) } if err := lp.ForceFlush(ctx); err != nil { t.Fatalf("Failed to flush logs: %v", err) } cmpOpts := []cmp.Option{ cmpopts.IgnoreUnexported(log.Value{}), cmpopts.IgnoreFields(DebugSpan{}, "StartTime", "EndTime", "ParentSpanID", "TraceID", "SpanID"), cmpopts.IgnoreFields(DebugLog{}, "ObservedTimestamp", "TraceID", "SpanID"), cmpopts.EquateEmpty(), } // Validate event spans gotEventSpans := debugTelemetry.GetSpansByEventID(tt.queryEventID) if diff := cmp.Diff(tt.wantEventSpans, gotEventSpans, cmpOpts...); diff != "" { t.Errorf("GetSpansByEventID() mismatch (-want +got):\n%s", diff) } }) } } func setup() (*DebugTelemetry, *sdktrace.TracerProvider, *sdklog.LoggerProvider) { debugTelemetry := NewDebugTelemetry() tp := sdktrace.NewTracerProvider( sdktrace.WithSpanProcessor(debugTelemetry.SpanProcessor()), ) lp := sdklog.NewLoggerProvider(sdklog.WithProcessor(debugTelemetry.LogProcessor())) return debugTelemetry, tp, lp } ================================================ FILE: server/adkrest/internal/services/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package services contains services defined for the ADK-Web REST API. package services ================================================ FILE: server/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package server hosts protocol implementations to expose and serve ADK agents. package server ================================================ FILE: session/database/gorm_datatypes.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package database import ( "context" "database/sql/driver" "encoding/json" "errors" "fmt" "gorm.io/gorm" "gorm.io/gorm/clause" "gorm.io/gorm/schema" ) // stateMap is a custom type for map[string]any that handles its own // JSON serialization and deserialization for the database by implementing gorm.Serializer. type stateMap map[string]any // GormDataType defines the generic fallback data type, implements GormDataTypeInterface func (stateMap) GormDataType() string { return "text" } // GormDBDataType defines database specific data types, implements GormDBDataTypeInterface func (stateMap) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "postgres": return "JSONB" case "mysql": return "LONGTEXT" case "spanner": return "STRING(MAX)" default: return "" } } // Value implements the gorm.Serializer Value method. func (sm stateMap) Value() (driver.Value, error) { if sm == nil { sm = make(map[string]any) // Serialize as '{}' instead of NULL } // For all other databases, return a JSON string. b, err := json.Marshal(sm) if err != nil { return nil, err } return string(b), nil } // Scan implements the gorm.Serializer Scan method. func (sm *stateMap) Scan(value any) error { if value == nil { *sm = make(map[string]any) return nil } var bytes []byte switch v := value.(type) { case []byte: // Postgres, MySQL bytes = v case string: // Some drivers bytes = []byte(v) default: return fmt.Errorf("failed to unmarshal JSON value: %T", value) } if len(bytes) == 0 { *sm = make(map[string]any) return nil } return json.Unmarshal(bytes, sm) } func (sm stateMap) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { data, _ := json.Marshal(sm) // TODO log the expression result return gorm.Expr("?", string(data)) } // dynamicJSON defined JSON data type, that implements driver.Valuer, sql.Scanner interface type dynamicJSON json.RawMessage // Value return json value, implement driver.Valuer interface func (j dynamicJSON) Value() (driver.Value, error) { if len(j) == 0 { return nil, nil } return string(j), nil } // Scan implements the gorm.Serializer Scan method. func (j *dynamicJSON) Scan(value any) error { if value == nil { *j = nil return nil } var bytes []byte switch v := value.(type) { case []byte: if len(v) == 0 { *j = nil return nil } bytes = make([]byte, len(v)) copy(bytes, v) case string: if v == "" { *j = nil return nil } bytes = []byte(v) default: return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) } if !json.Valid(bytes) { return fmt.Errorf("invalid JSON received from database: %s", string(bytes)) } *j = dynamicJSON(bytes) return nil } func (j dynamicJSON) String() string { return string(j) } // GormDataType defines the generic fallback data type, implements GormDataTypeInterface func (dynamicJSON) GormDataType() string { return "text" } // GormDBDataType defines database specific data types, implements GormDBDataTypeInterface func (dynamicJSON) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "LONGTEXT" case "postgres": return "JSONB" case "spanner": return "STRING(MAX)" } return "" } func (js dynamicJSON) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { if len(js) == 0 { return gorm.Expr("NULL") } // TODO log the expression result return gorm.Expr("?", string(js)) } ================================================ FILE: session/database/service.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package database import ( "context" "errors" "fmt" "maps" "strings" "time" "github.com/google/uuid" "gorm.io/gorm" "google.golang.org/adk/session" ) // databaseService is an database implementation of sessionService.Service. type databaseService struct { db *gorm.DB } // NewSessionService creates a new [session.Service] implementation that uses a // relational database (e.g., PostgreSQL, Spanner, SQLite) via the GORM library. // // It requires a [gorm.Dialector] to specify the database connection and // accepts optional [gorm.Option] values for further GORM configuration. // // It returns the new [session.Service] or an error if the database connection // [gorm.Open] fails. func NewSessionService(dialector gorm.Dialector, opts ...gorm.Option) (session.Service, error) { db, err := gorm.Open(dialector, opts...) if err != nil { return nil, fmt.Errorf("error creating database session service: %w", err) } return &databaseService{db: db}, nil } // AutoMigrate runs the GORM auto-migration tool to ensure the database schema // matches the internal storage models (e.g., storageSession, storageEvent). // // NOTE: This function relies on a type assertion to the concrete *databaseService // implementation. It will return an error if the provided session.Service is // a different implementation. func AutoMigrate(service session.Service) error { dbservice, ok := service.(*databaseService) if !ok { return fmt.Errorf("invalid session service type") } err := dbservice.db.AutoMigrate(&storageSession{}, &storageEvent{}, &storageAppState{}, &storageUserState{}) if err != nil { return fmt.Errorf("auto migrate failed: %w", err) } return nil } // Create generates a session and inserts it to the db, implements session.Service func (s *databaseService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) { if req.AppName == "" || req.UserID == "" { return nil, fmt.Errorf("app_name and user_id are required") } sessionID := req.SessionID if sessionID == "" { sessionID = uuid.NewString() } stateMap := req.State if stateMap == nil { stateMap = make(map[string]any) } val := &localSession{ appName: req.AppName, userID: req.UserID, sessionID: sessionID, state: stateMap, updatedAt: time.Now(), } createdSession, err := createStorageSession(val) if err != nil { return nil, err } err = s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { storageApp, err := fetchStorageAppState(tx, req.AppName) if err != nil { return fmt.Errorf("error on create session: %w", err) } storageUser, err := fetchStorageUserState(tx, req.AppName, req.UserID) if err != nil { return fmt.Errorf("error on create session: %w", err) } appDelta, userDelta, sessionState := extractStateDeltas(req.State) // apply state delta if len(appDelta) > 0 { maps.Copy(storageApp.State, appDelta) if err := tx.Save(&storageApp).Error; err != nil { return fmt.Errorf("failed to save app state: %w", err) } } if len(userDelta) > 0 { maps.Copy(storageUser.State, userDelta) if err := tx.Save(&storageUser).Error; err != nil { return fmt.Errorf("failed to save user state: %w", err) } } createdSession.State = sessionState if err := tx.Create(createdSession).Error; err != nil { return fmt.Errorf("error creating session on database: %w", err) } val.state = mergeStates(storageApp.State, storageUser.State, sessionState) val.updatedAt = createdSession.UpdateTime return nil }) if err != nil { return nil, err } return &session.CreateResponse{ Session: val, }, nil } // Get retrieves a single session from the database using its composite primary key. func (s *databaseService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) { // Ensure all parts of the composite key are provided. appName, userID, sessionID := req.AppName, req.UserID, req.SessionID if appName == "" || userID == "" || sessionID == "" { return nil, fmt.Errorf("app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q", appName, userID, sessionID) } var foundSession storageSession err := s.db.WithContext(ctx). Where(&storageSession{ AppName: appName, UserID: userID, ID: sessionID, }). First(&foundSession).Error if err != nil { // For any error including ErrRecordNotFound, return it as a system error. return nil, fmt.Errorf("database error while fetching session: %w", err) } // Fetch events eventQuery := s.db.WithContext(ctx). Model(&storageEvent{}). Where("app_name = ?", appName). Where("user_id = ?", userID). Where("session_id = ?", sessionID) // Apply conditional filters from the request if !req.After.IsZero() { eventQuery = eventQuery.Where("timestamp >= ?", req.After) } // Order by timestamp DESC to get the most recent events when limiting eventQuery = eventQuery.Order("timestamp DESC") if req.NumRecentEvents > 0 { eventQuery = eventQuery.Limit(req.NumRecentEvents) } var storageEvents []storageEvent if err := eventQuery.Find(&storageEvents).Error; err != nil { // This is a system failure, not a "not found" return nil, fmt.Errorf("database error while fetching events: %w", err) } // fetch app and user states storageApp, err := fetchStorageAppState(s.db.WithContext(ctx), appName) if err != nil { return nil, fmt.Errorf("error on get session: %w", err) } storageUser, err := fetchStorageUserState(s.db.WithContext(ctx), appName, userID) if err != nil { return nil, fmt.Errorf("error on get session: %w", err) } responseSession, err := createSessionFromStorageSession(&foundSession) responseSession.state = mergeStates(storageApp.State, storageUser.State, responseSession.state) if err != nil { return nil, fmt.Errorf("failed to map storage object: %w", err) } // We fetched in DESC order to get the most recent ones (due to LIMIT). // Now we reverse them to be in chronological ASC order for the response. // Convert storage events to response events responseEvents := make([]*session.Event, 0, len(storageEvents)) for i := len(storageEvents) - 1; i >= 0; i-- { evt, err := createEventFromStorageEvent(&storageEvents[i]) if err != nil { return nil, fmt.Errorf("failed to map storage event: %w", err) } responseEvents = append(responseEvents, evt) } responseSession.events = responseEvents return &session.GetResponse{ Session: responseSession, }, nil } // List retrieves sessions from the database using its appName and optional UserID func (s *databaseService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) { appName, userID := req.AppName, req.UserID if appName == "" { return nil, fmt.Errorf("app_name is required, got app_name: %q", req.AppName) } var foundSessions []storageSession listQuery := s.db.WithContext(ctx). Where(&storageSession{ AppName: appName, }) if userID != "" { listQuery = listQuery.Where(&storageSession{ UserID: userID, }) } err := listQuery.Find(&foundSessions).Error if err != nil { // Specifically check if the error is "record not found". if errors.Is(err, gorm.ErrRecordNotFound) { // This is not a system failure. The record simply doesn't exist. return &session.ListResponse{ Sessions: make([]session.Session, 0), }, nil } // For any other error (e.g., connection lost), return it as a system error. return nil, fmt.Errorf("database error while fetching session: %w", err) } storageApp, err := fetchStorageAppState(s.db.WithContext(ctx), appName) if err != nil { return nil, fmt.Errorf("error on list sessions: %w", err) } var userStates map[string]*storageUserState if userID != "" { userState, err := fetchStorageUserState(s.db.WithContext(ctx), appName, userID) if err != nil { return nil, fmt.Errorf("error on list sessions: %w", err) } userStates = map[string]*storageUserState{userID: userState} } else { userStates, err = fetchAllAppStorageUserState(s.db.WithContext(ctx), appName) if err != nil { return nil, fmt.Errorf("error on list sessions: %w", err) } } // Create response sessions, transform the storageSessions into responseSessions := make([]session.Session, 0, len(foundSessions)) for _, storage := range foundSessions { s := storage sess, err := createSessionFromStorageSession(&s) if err != nil { // If we encounter a single mapping error, we fail the whole request. return nil, fmt.Errorf("failed to map storage object for session %s: %w", s.ID, err) } userState, ok := userStates[sess.UserID()] if !ok { userState = &storageUserState{AppName: appName, UserID: userID, State: make(map[string]any)} } sess.state = mergeStates(storageApp.State, userState.State, sess.state) responseSessions = append(responseSessions, sess) } return &session.ListResponse{ Sessions: responseSessions, }, nil } // Delete, deletes a session given a specific id returning error on failure, implements session.Service func (s *databaseService) Delete(ctx context.Context, req *session.DeleteRequest) error { appName, userID, sessionID := req.AppName, req.UserID, req.SessionID if appName == "" || userID == "" || sessionID == "" { return fmt.Errorf("app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q", appName, userID, sessionID) } return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { target := &storageSession{} result := tx.Where(&storageSession{ AppName: req.AppName, UserID: req.UserID, ID: req.SessionID, }).Delete(target) if result.Error != nil { return fmt.Errorf("database error during session deletion: %w", result.Error) } return nil // Returning nil commits the transaction }) } func (s *databaseService) AppendEvent(ctx context.Context, curSession session.Session, event *session.Event) error { if curSession == nil { return fmt.Errorf("session is nil") } if event == nil { return fmt.Errorf("event is nil") } // ignore partial events if event.Partial { return nil } // Truncate timestamp to microsecond precision to match database precision and prevent rounding errors. event.Timestamp = event.Timestamp.Truncate(time.Microsecond) sess, ok := curSession.(*localSession) if !ok { return fmt.Errorf("unexpected session type %T", sess) } // append it to session if err := sess.appendEvent(event); err != nil { return err } // Trim temp state before persisting event = trimTempDeltaState(event) // applyChanges and persist them err := s.applyEvent(ctx, sess, event) if err != nil { return err } // update local session last update time sess.updatedAt = event.Timestamp return nil } // applyEvent fetches the session, validates it, applies state changes from an // event, and saves the event atomically. func (s *databaseService) applyEvent(ctx context.Context, session *localSession, event *session.Event) error { // Wrap database operations in a single transaction. err := s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { // Fetch the session object from storage. var storageSess storageSession err := tx.Where(&storageSession{AppName: session.AppName(), UserID: session.UserID(), ID: session.ID()}). First(&storageSess).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return fmt.Errorf("session not found, cannot apply event") } return fmt.Errorf("failed to get session: %w", err) } // Ensure the session object is not stale. // We use UnixMicro() for microsecond-level precision, matching the Python code. storageUpdateTime := storageSess.UpdateTime.UnixMicro() sessionUpdateTime := session.updatedAt.UnixMicro() if storageUpdateTime > sessionUpdateTime { return fmt.Errorf( "stale session error: last update time from request (%s) is older than in database (%s)", time.Unix(0, sessionUpdateTime).Format(time.RFC3339Nano), time.Unix(0, storageUpdateTime).Format(time.RFC3339Nano), ) } // Fetch App and User states. storageApp, err := fetchStorageAppState(tx, session.AppName()) if err != nil { return err } storageUser, err := fetchStorageUserState(tx, session.AppName(), session.UserID()) if err != nil { return err } appDelta, userDelta, sessionDelta := extractStateDeltas(event.Actions.StateDelta) // Merge state deltas and update the storage objects. // GORM's .Save() method will correctly perform an INSERT or UPDATE. if len(appDelta) > 0 { maps.Copy(storageApp.State, appDelta) if err := tx.Save(&storageApp).Error; err != nil { return fmt.Errorf("failed to save app state: %w", err) } } if len(userDelta) > 0 { maps.Copy(storageUser.State, userDelta) if err := tx.Save(&storageUser).Error; err != nil { return fmt.Errorf("failed to save user state: %w", err) } } if len(sessionDelta) > 0 { maps.Copy(storageSess.State, sessionDelta) // The session state update will be saved along with the event timestamp update. } // Create the new event record in the database. storageEv, err := createStorageEvent(session, event) if err != nil { return fmt.Errorf("failed to map event to storage model: %w", err) } if err := tx.Create(storageEv).Error; err != nil { return fmt.Errorf("failed to save event: %w", err) } storageSess.UpdateTime = event.Timestamp // Save the session to update its state and UpdateTime. if err := tx.Save(&storageSess).Error; err != nil { return fmt.Errorf("failed to save session state: %w", err) } session.updatedAt = storageSess.UpdateTime return nil // Returning nil commits the transaction. }) return err } func fetchStorageAppState(tx *gorm.DB, appName string) (*storageAppState, error) { var storageApp storageAppState if err := tx.First(&storageApp, "app_name = ?", appName).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("failed to fetch app state: %w", err) } // If not found, initialize a new object to be created later. storageApp = storageAppState{AppName: appName, State: make(map[string]any)} } return &storageApp, nil } func fetchStorageUserState(tx *gorm.DB, appName, userID string) (*storageUserState, error) { var storageUser storageUserState if err := tx.First(&storageUser, "app_name = ? AND user_id = ?", appName, userID).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("failed to fetch user state: %w", err) } // If not found, initialize a new object. storageUser = storageUserState{AppName: appName, UserID: userID, State: make(map[string]any)} } return &storageUser, nil } func fetchAllAppStorageUserState(tx *gorm.DB, appName string) (map[string]*storageUserState, error) { var storageUserStates []storageUserState if err := tx.Find(&storageUserStates, "app_name = ?", appName).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf("failed to fetch user states: %w", err) } return make(map[string]*storageUserState), nil } statesByUserId := make(map[string]*storageUserState, len(storageUserStates)) for _, storageUserState := range storageUserStates { statesByUserId[storageUserState.UserID] = &storageUserState } return statesByUserId, nil } // extractStateDeltas splits a single state delta map into three separate maps // for app, user, and session states based on key prefixes. // Temporary keys (starting with TempStatePrefix) are ignored. func extractStateDeltas(delta map[string]any) ( appStateDelta, userStateDelta, sessionStateDelta map[string]any, ) { // Initialize the maps to be returned. appStateDelta = make(map[string]any) userStateDelta = make(map[string]any) sessionStateDelta = make(map[string]any) if delta == nil { return appStateDelta, userStateDelta, sessionStateDelta } for key, value := range delta { if cleanKey, found := strings.CutPrefix(key, session.KeyPrefixApp); found { appStateDelta[cleanKey] = value } else if cleanKey, found := strings.CutPrefix(key, session.KeyPrefixUser); found { userStateDelta[cleanKey] = value } else if !strings.HasPrefix(key, session.KeyPrefixTemp) { // This key belongs to the session state, as long as it's not temporary. sessionStateDelta[key] = value } } return appStateDelta, userStateDelta, sessionStateDelta } // mergeStates combines app, user, and session state maps into a single map // for client-side responses, adding the appropriate prefixes back. func mergeStates(appState, userState, sessionState map[string]any) map[string]any { // Pre-allocate map capacity for efficiency. totalSize := len(appState) + len(userState) + len(sessionState) mergedState := make(map[string]any, totalSize) // In Go, we create a new map and copy key-value pairs. This is equivalent // to the goal of Python's copy.deepcopy() in this context, which is to // avoid modifying the original sessionState map. maps.Copy(mergedState, sessionState) for key, value := range appState { mergedState[session.KeyPrefixApp+key] = value } for key, value := range userState { mergedState[session.KeyPrefixUser+key] = value } return mergedState } ================================================ FILE: session/database/service_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package database import ( "maps" "strconv" "testing" "time" "github.com/glebarez/sqlite" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "gorm.io/gorm" "google.golang.org/adk/model" "google.golang.org/adk/session" ) func Test_databaseService_Create(t *testing.T) { tests := []struct { name string setup func(t *testing.T) *databaseService req *session.CreateRequest want session.Session wantErr bool }{ { name: "full key", setup: emptyService, req: &session.CreateRequest{ AppName: "testApp", UserID: "testUserID", SessionID: "testSessionID", State: map[string]any{ "k": 5, }, }, }, { name: "generated session id", setup: emptyService, req: &session.CreateRequest{ AppName: "testApp", UserID: "testUserID", State: map[string]any{ "k": 5, }, }, }, { name: "when already exists, it fails", // this differs from inmemmory impl setup: serviceDbWithData, req: &session.CreateRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", State: map[string]any{ "k": 10, }, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.Create(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("databaseService.Create() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if got.Session.AppName() != tt.req.AppName { t.Errorf("AppName got: %v, want: %v", got.Session.AppName(), tt.wantErr) } if got.Session.UserID() != tt.req.UserID { t.Errorf("UserID got: %v, want: %v", got.Session.UserID(), tt.wantErr) } if tt.req.SessionID != "" { if got.Session.ID() != tt.req.SessionID { t.Errorf("SessionID got: %v, want: %v", got.Session.ID(), tt.wantErr) } } else { if got.Session.ID() == "" { t.Errorf("SessionID was not generated on empty user input.") } } gotState := maps.Collect(got.Session.State().All()) wantState := tt.req.State if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Create State mismatch: (-want +got):\n%s", diff) } }) } } func Test_databaseService_Delete(t *testing.T) { tests := []struct { name string req *session.DeleteRequest setup func(t *testing.T) *databaseService wantErr bool }{ { name: "delete ok", setup: serviceDbWithData, req: &session.DeleteRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }, }, { name: "no error when not found", setup: serviceDbWithData, req: &session.DeleteRequest{ AppName: "appTest", UserID: "user1", SessionID: "session1", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) if err := s.Delete(t.Context(), tt.req); (err != nil) != tt.wantErr { t.Errorf("databaseService.Delete() error = %v, wantErr %v", err, tt.wantErr) } }) } } func Test_databaseService_Get(t *testing.T) { // This setup function is required for a test case. // It creates the specific scenario from 'test_get_session_respects_user_id'. setupGetRespectsUserID := func(t *testing.T) *databaseService { t.Helper() s := serviceDbWithData(t) // Starts with the standard data // u1 creates s1 and adds an event. // 'serviceDbWithData' already created // (app1, user1, session1) // (app1, user2, session1) // We just need to add an event to it. session1, err := s.Get(t.Context(), &session.GetRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to get session1: %v", err) } // Update 'updatedAt' to pass stale validation on append session1.Session.(*localSession).updatedAt = time.Now() err = s.AppendEvent(t.Context(), session1.Session.(*localSession), &session.Event{ ID: "event_for_user1", Author: "user", LLMResponse: model.LLMResponse{ Partial: false, }, }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to append event: %v", err) } return s } setupGetWithConfig := func(t *testing.T) *databaseService { t.Helper() s := emptyService(t) ctx := t.Context() numTestEvents := 5 created, err := s.Create(ctx, &session.CreateRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", }) if err != nil { t.Fatalf("setupGetWithConfig failed to create session: %v", err) } for i := 1; i <= numTestEvents; i++ { created.Session.(*localSession).updatedAt = time.Now() event := &session.Event{ ID: strconv.Itoa(i), Author: "user", Timestamp: time.Time{}.Add(time.Duration(i) * time.Microsecond), LLMResponse: model.LLMResponse{}, } if err := s.AppendEvent(ctx, created.Session.(*localSession), event); err != nil { t.Fatalf("setupGetWithConfig failed to append event %d: %v", i, err) } } return s } tests := []struct { name string req *session.GetRequest setup func(t *testing.T) *databaseService wantResponse *session.GetResponse wantEvents []*session.Event wantErr bool }{ { name: "ok", setup: serviceDbWithData, req: &session.GetRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }, wantResponse: &session.GetResponse{ Session: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, events: []*session.Event{}, }, }, }, { name: "error when not found", setup: serviceDbWithData, req: &session.GetRequest{ AppName: "testApp", UserID: "user1", SessionID: "session1", }, wantErr: true, }, { name: "get session respects user id", setup: setupGetRespectsUserID, req: &session.GetRequest{ AppName: "app1", UserID: "user2", SessionID: "session1", }, wantResponse: &session.GetResponse{ Session: &localSession{ appName: "app1", userID: "user2", sessionID: "session1", // This is user2's session, which should have its own state state: map[string]any{ "k1": "v2", }, // Critically, it should NOT have the event from user1's session events: []*session.Event{}, }, }, wantErr: false, }, { name: "with config_no config returns all events", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", }, wantEvents: []*session.Event{ {ID: "1", Author: "user", Timestamp: time.Time{}.Add(1 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "2", Author: "user", Timestamp: time.Time{}.Add(2 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "3", Author: "user", Timestamp: time.Time{}.Add(3 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_num recent events", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", NumRecentEvents: 3, }, wantEvents: []*session.Event{ {ID: "3", Author: "user", Timestamp: time.Time{}.Add(3 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_after timestamp", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", After: time.Time{}.Add(4 * time.Microsecond), }, wantEvents: []*session.Event{ {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_combined filters", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", NumRecentEvents: 3, After: time.Time{}.Add(4 * time.Microsecond), }, wantEvents: []*session.Event{ {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4 * time.Microsecond), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5 * time.Microsecond), LLMResponse: model.LLMResponse{}}, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.Get(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("databaseService.Get() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if tt.wantResponse != nil { if diff := cmp.Diff(tt.wantResponse, got, cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt")); diff != "" { t.Errorf("Get session mismatch: (-want +got):\n%s", diff) } } if tt.wantEvents != nil { opts := []cmp.Option{ cmpopts.SortSlices(func(a, b *session.Event) bool { return a.Timestamp.Before(b.Timestamp) }), } if diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != "" { t.Errorf("Get session events mismatch: (-want +got):\n%s", diff) } } }) } } func Test_databaseService_List(t *testing.T) { tests := []struct { name string req *session.ListRequest setup func(t *testing.T) *databaseService wantResponse *session.ListResponse wantErr bool }{ { name: "list for user1", setup: serviceDbWithData, req: &session.ListRequest{ AppName: "app1", UserID: "user1", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{ appName: "app1", userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, }, &localSession{ appName: "app1", userID: "user1", sessionID: "session2", state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "empty list for non-existent user", setup: serviceDbWithData, req: &session.ListRequest{ AppName: "app1", UserID: "custom_user", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{}, }, }, { name: "list for user2", setup: serviceDbWithData, req: &session.ListRequest{ AppName: "app1", UserID: "user2", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{ appName: "app1", userID: "user2", sessionID: "session1", state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "list all users for app", setup: serviceDbWithData, req: &session.ListRequest{AppName: "app1", UserID: ""}, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{appName: "app1", userID: "user1", sessionID: "session1", state: map[string]any{"k1": "v1"}}, &localSession{appName: "app1", userID: "user1", sessionID: "session2", state: map[string]any{"k1": "v2"}}, &localSession{appName: "app1", userID: "user2", sessionID: "session1", state: map[string]any{"k1": "v2"}}, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.List(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Errorf("databaseService.List() error = %v, wantErr %v", err, tt.wantErr) return } if err == nil { // Sort slices for stable comparison opts := []cmp.Option{ cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt"), cmpopts.SortSlices(func(a, b session.Session) bool { return a.ID() < b.ID() }), } if diff := cmp.Diff(tt.wantResponse, got, opts...); diff != "" { t.Errorf("databaseService.List() = %v (-want +got):\n%s", got, diff) } } }) } } func Test_databaseService_AppendEvent(t *testing.T) { tests := []struct { name string setup func(t *testing.T) *databaseService session *localSession event *session.Event wantStoredSession *localSession // State of the session after Get wantEventCount int // Expected event count in storage wantErr bool }{ { name: "append event to the session and overwrite in storage", setup: serviceDbWithData, session: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "append event to the session with events and overwrite in storage", setup: serviceDbWithData, session: &localSession{ appName: "app2", userID: "user2", sessionID: "session2", }, event: &session.Event{ ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &localSession{ appName: "app2", userID: "user2", sessionID: "session2", events: []*session.Event{ { ID: "existing_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, { ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, state: map[string]any{ "k2": "v2", }, }, wantEventCount: 2, }, { name: "append event when session not found should fail", setup: serviceDbWithData, session: &localSession{ appName: "app1", userID: "user1", sessionID: "custom_session", }, event: &session.Event{ ID: "new_event2", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantErr: true, }, { name: "append event with bytes content", setup: serviceDbWithData, session: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "event_with_bytes", Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, }, wantStoredSession: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "event_with_bytes", Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "append event with all fields", setup: serviceDbWithData, session: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "event_complete", Author: "user", LongRunningToolIDs: []string{"tool123"}, Actions: session.EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, wantStoredSession: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "event_complete", Author: "user", LongRunningToolIDs: []string{"tool123"}, Actions: session.EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, }, state: map[string]any{ "k1": "v1", "k2": "v2", }, }, wantEventCount: 1, }, { name: "partial events are not persisted", setup: serviceDbWithData, session: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "partial_event", Author: "user", LLMResponse: model.LLMResponse{ Partial: true, // This is the key field }, }, wantStoredSession: &localSession{ appName: "app1", userID: "user1", sessionID: "session1", events: []*session.Event{}, // No event should be stored state: map[string]any{ "k1": "v1", }, }, wantEventCount: 0, // Expect 0 events }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() s := tt.setup(t) tt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation err := s.AppendEvent(ctx, tt.session, tt.event) if (err != nil) != tt.wantErr { t.Errorf("databaseService.AppendEvent() error = %v, wantErr %v", err, tt.wantErr) } if err != nil { return } resp, err := s.Get(ctx, &session.GetRequest{ AppName: tt.session.AppName(), UserID: tt.session.UserID(), SessionID: tt.session.ID(), }) if err != nil { t.Fatalf("databaseService.Get() error = %v, wantErr %v", err, tt.wantErr) return } // Check event count first if resp.Session.Events().Len() != tt.wantEventCount { t.Errorf("AppendEvent returned %d events, want %d", resp.Session.Events().Len(), tt.wantEventCount) } // Define comparison options opts := []cmp.Option{ cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt"), cmpopts.IgnoreFields(session.Event{}, "Timestamp"), // Add sorters if event order is not guaranteed cmpopts.SortSlices(func(a, b *session.Event) bool { return a.ID < b.ID }), } if diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != "" { t.Errorf("AppendEvent session mismatch: (-want +got):\n%s", diff) } }) } } func Test_databaseService_StateManagement(t *testing.T) { ctx := t.Context() appName := "my_app" t.Run("app_state_is_shared", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"app:k1": "v1"}}) s1.Session.(*localSession).updatedAt = time.Now() err := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Actions: session.EventActions{StateDelta: map[string]any{"app:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s2, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u2", SessionID: "s2"}) if err != nil { t.Fatalf("Failed to create session for user 2: %v", err) } wantState := map[string]any{"app:k1": "v1", "app:k2": "v2"} gotState := maps.Collect(s2.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("User 2 state mismatch (-want +got):\n%s", diff) } }) t.Run("user_state_is_user_specific", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"user:k1": "v1"}}) s1.Session.(*localSession).updatedAt = time.Now() err := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Actions: session.EventActions{StateDelta: map[string]any{"user:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1b"}) wantStateU1 := map[string]any{"user:k1": "v1", "user:k2": "v2"} gotStateU1 := maps.Collect(s1b.Session.State().All()) if diff := cmp.Diff(wantStateU1, gotStateU1); diff != "" { t.Errorf("User 1 second session state mismatch (-want +got):\n%s", diff) } s2, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u2", SessionID: "s2"}) gotStateU2 := maps.Collect(s2.Session.State().All()) if len(gotStateU2) != 0 { t.Errorf("User 2 should have empty state, but got: %v", gotStateU2) } }) t.Run("session_state_is_not_shared", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"sk1": "v1"}}) s1.Session.(*localSession).updatedAt = time.Now() err := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Actions: session.EventActions{StateDelta: map[string]any{"sk2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) wantState := map[string]any{"sk1": "v1", "sk2": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Refetched s1 state mismatch (-want +got):\n%s", diff) } s1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1b"}) gotStateS1b := maps.Collect(s1b.Session.State().All()) if len(gotStateS1b) != 0 { t.Errorf("Session s1b should have empty state, but got: %v", gotStateS1b) } }) t.Run("temp_state_is_not_persisted", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) s1.Session.(*localSession).updatedAt = time.Now() event := &session.Event{ ID: "event1", Actions: session.EventActions{StateDelta: map[string]any{"temp:k1": "v1", "sk": "v2"}}, LLMResponse: model.LLMResponse{}, } err := s.AppendEvent(ctx, s1.Session.(*localSession), event) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } invocationSession := s1.Session.(*localSession) wantInvocationState := map[string]any{"sk": "v2", "temp:k1": "v1"} gotInvocationState := maps.Collect(invocationSession.State().All()) if diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != "" { t.Errorf("Invocation session state mismatch (-want +got):\n%s", diff) } s1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) wantState := map[string]any{"sk": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Persisted state mismatch (-want +got):\n%s", diff) } storedEvents := s1_got.Session.Events() if storedEvents.Len() != 1 { t.Fatalf("Expected 1 stored event, got %d", storedEvents.Len()) } storedDelta := storedEvents.At(0).Actions.StateDelta if _, exists := storedDelta["temp:k1"]; exists { t.Errorf("temp:k1 key was found in the stored event's state delta") } if storedDelta["sk"] != "v2" { t.Errorf("Expected 'sk' key in stored event, but was missing or wrong value") } }) } func serviceDbWithData(t *testing.T) *databaseService { t.Helper() service := emptyService(t) for _, storedSession := range []*localSession{ { appName: "app1", userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, }, { appName: "app1", userID: "user2", sessionID: "session1", state: map[string]any{ "k1": "v2", }, }, { appName: "app1", userID: "user1", sessionID: "session2", state: map[string]any{ "k1": "v2", }, }, { appName: "app2", userID: "user2", sessionID: "session2", state: map[string]any{ "k2": "v2", }, events: []*session.Event{ { ID: "existing_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, }, } { // TODO: Consider changing to SQL insert resp, err := service.Create(t.Context(), &session.CreateRequest{ AppName: storedSession.appName, UserID: storedSession.userID, SessionID: storedSession.sessionID, State: storedSession.state, }) if err != nil { t.Fatalf("Failed to create sample sessions on db initialization: %v", err) } for _, ev := range storedSession.events { err = service.AppendEvent(t.Context(), resp.Session, ev) if err != nil { t.Fatalf("Failed to append event to session on db initialization: %v", err) } } } return service } func emptyService(t *testing.T) *databaseService { t.Helper() gormConfig := &gorm.Config{ PrepareStmt: true, } service, err := NewSessionService(sqlite.Open("file::memory:?cache=shared"), gormConfig) if err != nil { t.Fatalf("Failed to create session service: %v", err) } dbservice, ok := service.(*databaseService) if !ok { t.Fatalf("invalid session service type") } err = AutoMigrate(service) if err != nil { t.Fatalf("Failed to AutoMigrate db: %v", err) } t.Cleanup(func() { t.Log("CLEANUP: Deleting all rows from tables...") // Define models in Child-to-Parent order modelsToDelete := []any{ &storageEvent{}, // Child-most &storageSession{}, &storageUserState{}, &storageAppState{}, // Parent-most } for _, model := range modelsToDelete { // GORM statement parser to get table names stmt := &gorm.Statement{DB: dbservice.db} // Parse the model to get its table name if err := stmt.Parse(model); err != nil { t.Errorf("Failed to parse model schema for cleanup: %v", err) continue } tableName := stmt.Table // Exec with "WHERE true" instead of gorm.Delete() // satisfies Spanner's requirement for a WHERE clause. if err := dbservice.db.Exec(`DELETE FROM ` + tableName + ` WHERE true`).Error; err != nil { t.Errorf("Failed to delete from table %s: %v", tableName, err) } } sqlDB, err := dbservice.db.DB() if err != nil { t.Errorf("Failed to get underlying *sql.DB: %v", err) return } if err := sqlDB.Close(); err != nil { t.Errorf("Failed to close database connection: %v", err) } }) return dbservice } ================================================ FILE: session/database/session.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package database import ( "fmt" "iter" "maps" "strings" "sync" "time" "google.golang.org/adk/session" ) // TODO localSession is identical to session.session. Move to sessioninternal type localSession struct { appName string userID string sessionID string // guards all mutable fields mu sync.RWMutex events []*session.Event state map[string]any updatedAt time.Time } func (s *localSession) ID() string { return s.sessionID } func (s *localSession) AppName() string { return s.appName } func (s *localSession) UserID() string { return s.userID } func (s *localSession) State() session.State { return &state{ mu: &s.mu, state: s.state, } } func (s *localSession) Events() session.Events { return events(s.events) } func (s *localSession) LastUpdateTime() time.Time { s.mu.RLock() defer s.mu.RUnlock() return s.updatedAt } func (s *localSession) appendEvent(event *session.Event) error { if event.Partial { return nil } s.mu.Lock() defer s.mu.Unlock() if err := updateSessionState(s, event); err != nil { return fmt.Errorf("failed to update localSession state: %w", err) } processedEvent := trimTempDeltaState(event) s.events = append(s.events, processedEvent) return nil } type events []*session.Event func (e events) All() iter.Seq[*session.Event] { return func(yield func(*session.Event) bool) { for _, event := range e { if !yield(event) { return } } } } func (e events) Len() int { return len(e) } func (e events) At(i int) *session.Event { if i >= 0 && i < len(e) { return e[i] } return nil } type state struct { mu *sync.RWMutex state map[string]any } func (s *state) Get(key string) (any, error) { s.mu.RLock() defer s.mu.RUnlock() val, ok := s.state[key] if !ok { return nil, session.ErrStateKeyNotExist } return val, nil } func (s *state) All() iter.Seq2[string, any] { s.mu.RLock() // Create a copy of the state to iterate over it without holding the lock. stateCopy := maps.Clone(s.state) s.mu.RUnlock() return func(yield func(key string, val any) bool) { for k, v := range stateCopy { if !yield(k, v) { return } } } } func (s *state) Set(key string, value any) error { s.mu.Lock() defer s.mu.Unlock() s.state[key] = value return nil } // TrimTempDeltaState removes temporary state delta keys from the event. func trimTempDeltaState(event *session.Event) *session.Event { if len(event.Actions.StateDelta) == 0 { return event } // Iterate over the map and build a new one with the keys we want to keep. filteredStateDelta := make(map[string]any) for key, value := range event.Actions.StateDelta { if !strings.HasPrefix(key, session.KeyPrefixTemp) { filteredStateDelta[key] = value } } // Replace the old map with the newly filtered one. event.Actions.StateDelta = filteredStateDelta return event } // updateSessionState updates the session state based on the event state delta. func updateSessionState(sess *localSession, event *session.Event) error { if event.Actions.StateDelta == nil { return nil // Nothing to do } // Ensure the session state map is initialized if sess.state == nil { sess.state = make(map[string]any) } maps.Copy(sess.state, event.Actions.StateDelta) return nil } var ( _ session.Session = (*localSession)(nil) _ session.Events = (*events)(nil) _ session.State = (*state)(nil) ) ================================================ FILE: session/database/storage_session.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package database import ( "encoding/json" "fmt" "time" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/session" ) // storageSession corresponds to the 'sessions' table. type storageSession struct { AppName string `gorm:"primaryKey;"` UserID string `gorm:"primaryKey;"` ID string `gorm:"primaryKey;"` State stateMap CreateTime time.Time `gorm:"precision:6"` UpdateTime time.Time `gorm:"precision:6"` // Has-Many relationship: A session has many events. Events []storageEvent `gorm:"foreignKey:AppName,UserID,SessionID;references:AppName,UserID,ID;constraint:OnDelete:CASCADE"` } // TableName explicitly sets the table name for the storageSession struct. func (storageSession) TableName() string { return "sessions" } // Helper to map from internal struct to GORM struct func createStorageSession(s *localSession) (*storageSession, error) { return &storageSession{ UserID: s.userID, AppName: s.appName, ID: s.sessionID, State: s.state, CreateTime: time.Now(), UpdateTime: time.Now(), }, nil } // Helper to map from GORM struct to internal struct func createSessionFromStorageSession(storage *storageSession) (*localSession, error) { return &localSession{ appName: storage.AppName, userID: storage.UserID, sessionID: storage.ID, state: storage.State, updatedAt: storage.UpdateTime, }, nil } // storageEvent corresponds to the 'events' table. type storageEvent struct { ID string `gorm:"primaryKey;"` AppName string `gorm:"primaryKey;"` UserID string `gorm:"primaryKey;"` SessionID string `gorm:"primaryKey;"` InvocationID string Author string // In Python, this is a pickled object. In Go, the raw bytes are the closest // equivalent. Unpickling would require a custom library or service. Actions []byte LongRunningToolIDsJSON dynamicJSON Branch *string Timestamp time.Time `gorm:"precision:6"` // Fields from llm_response Content dynamicJSON GroundingMetadata dynamicJSON CustomMetadata dynamicJSON UsageMetadata dynamicJSON CitationMetadata dynamicJSON Partial *bool TurnComplete *bool ErrorCode *string ErrorMessage *string Interrupted *bool // Belongs-To relationship: An event belongs to a session. Session storageSession `gorm:"foreignKey:AppName,UserID,SessionID;references:AppName,UserID,ID"` } // TableName explicitly sets the table name for the storageEvent struct. func (storageEvent) TableName() string { return "events" } // createStorageEvent translates the application-level Session and Event models // into a GORM-compatible storageEvent struct, ready for database insertion. func createStorageEvent(session session.Session, event *session.Event) (*storageEvent, error) { // Initialize the base storageEvent with direct field mappings. storageEv := &storageEvent{ ID: event.ID, InvocationID: event.InvocationID, Author: event.Author, SessionID: session.ID(), AppName: session.AppName(), UserID: session.UserID(), Timestamp: event.Timestamp, } // --- Handle complex or nullable fields --- // Serialize the entire Actions struct into a JSON byte slice. actionsJSON, err := json.Marshal(event.Actions) if err != nil { return nil, fmt.Errorf("failed to marshal event actions: %w", err) } storageEv.Actions = actionsJSON // Serialize the list of tool IDs into a JSON string if len(event.LongRunningToolIDs) > 0 { toolIDsJSON, err := json.Marshal(event.LongRunningToolIDs) if err != nil { return nil, fmt.Errorf("failed to marshal long running tool IDs: %w", err) } storageEv.LongRunningToolIDsJSON = toolIDsJSON } // Handle optional fields by taking the address of the value. // An empty string from the event becomes a nil pointer in storage. if event.Branch != "" { storageEv.Branch = &event.Branch } if event.ErrorCode != "" { storageEv.ErrorCode = &event.ErrorCode } if event.ErrorMessage != "" { storageEv.ErrorMessage = &event.ErrorMessage } // For booleans, we can assign pointers directly. storageEv.Partial = &event.Partial storageEv.TurnComplete = &event.TurnComplete storageEv.Interrupted = &event.Interrupted // --- Handle JSON content fields --- if event.Content != nil { storageEv.Content, err = json.Marshal(event.Content) if err != nil { return nil, fmt.Errorf("failed to marshal content: %w", err) } } if event.GroundingMetadata != nil { storageEv.GroundingMetadata, err = json.Marshal(event.GroundingMetadata) if err != nil { return nil, fmt.Errorf("failed to marshal grounding metadata: %w", err) } } if len(event.CustomMetadata) > 0 { storageEv.CustomMetadata, err = json.Marshal(event.CustomMetadata) if err != nil { return nil, fmt.Errorf("failed to marshal custom metadata: %w", err) } } if event.UsageMetadata != nil { storageEv.UsageMetadata, err = json.Marshal(event.UsageMetadata) if err != nil { return nil, fmt.Errorf("failed to marshal usage metadata: %w", err) } } if event.CitationMetadata != nil { storageEv.CitationMetadata, err = json.Marshal(event.CitationMetadata) if err != nil { return nil, fmt.Errorf("failed to marshal citation metadata: %w", err) } } return storageEv, nil } // derefOrZero safely dereferences a pointer, returning the zero value // of its type if the pointer is nil. func derefOrZero[T any](p *T) T { if p == nil { var zero T return zero } return *p } // createEventFromStorageEvent translates a GORM storageEvent back into an // application-level Event model. func createEventFromStorageEvent(se *storageEvent) (*session.Event, error) { var actions session.EventActions if len(se.Actions) > 0 { if err := json.Unmarshal(se.Actions, &actions); err != nil { return nil, fmt.Errorf("failed to unmarshal actions: %w", err) } } var content *genai.Content if len(se.Content) > 0 { if err := json.Unmarshal(se.Content, &content); err != nil { return nil, fmt.Errorf("failed to unmarshal content: %w", err) } } var groundingMetadata *genai.GroundingMetadata if len(se.GroundingMetadata) > 0 { if err := json.Unmarshal(se.GroundingMetadata, &groundingMetadata); err != nil { return nil, fmt.Errorf("failed to unmarshal grounding metadata: %w", err) } } var customMetadata map[string]any if len(se.CustomMetadata) > 0 { if err := json.Unmarshal(se.CustomMetadata, &customMetadata); err != nil { return nil, fmt.Errorf("failed to unmarshal custom metadata: %w", err) } } var usageMetadata *genai.GenerateContentResponseUsageMetadata if len(se.UsageMetadata) > 0 { if err := json.Unmarshal(se.UsageMetadata, &usageMetadata); err != nil { return nil, fmt.Errorf("failed to unmarshal usage metadata: %w", err) } } var citationMetadata *genai.CitationMetadata if len(se.CitationMetadata) > 0 { if err := json.Unmarshal(se.CitationMetadata, &citationMetadata); err != nil { return nil, fmt.Errorf("failed to unmarshal citation metadata: %w", err) } } // --- Handle JSON-encoded *string field --- var toolIDs []string if se.LongRunningToolIDsJSON != nil { if err := json.Unmarshal([]byte(se.LongRunningToolIDsJSON), &toolIDs); err != nil { return nil, fmt.Errorf("failed to unmarshal long running tool IDs: %w", err) } } // --- Handle simple pointer fields (dereference or use zero value) --- // Use the helper to safely get the value or its zero-value default branch := derefOrZero(se.Branch) errorCode := derefOrZero(se.ErrorCode) errorMessage := derefOrZero(se.ErrorMessage) partial := derefOrZero(se.Partial) turnComplete := derefOrZero(se.TurnComplete) interrupted := derefOrZero(se.Interrupted) // --- Assemble the final Event struct --- event := &session.Event{ ID: se.ID, InvocationID: se.InvocationID, Author: se.Author, Timestamp: se.Timestamp, Actions: actions, LongRunningToolIDs: toolIDs, Branch: branch, LLMResponse: model.LLMResponse{ Content: content, GroundingMetadata: groundingMetadata, CustomMetadata: customMetadata, UsageMetadata: usageMetadata, CitationMetadata: citationMetadata, ErrorCode: errorCode, ErrorMessage: errorMessage, Partial: partial, TurnComplete: turnComplete, Interrupted: interrupted, }, } return event, nil } // AppState corresponds to the 'app_states' table. type storageAppState struct { AppName string `gorm:"primaryKey;"` State stateMap UpdateTime time.Time `gorm:"precision:6"` } // TableName explicitly sets the table name for the AppState struct. func (storageAppState) TableName() string { return "app_states" } // UserState corresponds to the 'user_states' table. type storageUserState struct { AppName string `gorm:"primaryKey;"` UserID string `gorm:"primaryKey;"` State stateMap UpdateTime time.Time `gorm:"precision:6"` } // TableName explicitly sets the table name for the UserState struct. func (storageUserState) TableName() string { return "user_states" } ================================================ FILE: session/doc.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package session provides types to manage user sessions and their states. package session ================================================ FILE: session/inmemory.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package session import ( "context" "fmt" "iter" "maps" "slices" "sort" "strings" "sync" "time" "github.com/google/uuid" "rsc.io/omap" "rsc.io/ordered" "google.golang.org/adk/internal/sessionutils" ) type stateMap map[string]any // inMemoryService is an in-memory implementation of sessionService.Service. // Thread-safe. type inMemoryService struct { mu sync.RWMutex sessions omap.Map[string, *session] // session.ID) -> storedSession userState map[string]map[string]stateMap appState map[string]stateMap } func (s *inMemoryService) Create(ctx context.Context, req *CreateRequest) (*CreateResponse, error) { if req.AppName == "" || req.UserID == "" { return nil, fmt.Errorf("app_name and user_id are required, got app_name: %q, user_id: %q", req.AppName, req.UserID) } sessionID := req.SessionID if sessionID == "" { sessionID = uuid.NewString() } key := id{ appName: req.AppName, userID: req.UserID, sessionID: sessionID, } encodedKey := key.Encode() s.mu.Lock() defer s.mu.Unlock() if _, ok := s.sessions.Get(encodedKey); ok { return nil, fmt.Errorf("session %s already exists", req.SessionID) } state := req.State if state == nil { state = make(stateMap) } val := &session{ id: key, state: state, updatedAt: time.Now(), } s.sessions.Set(encodedKey, val) appDelta, userDelta, _ := sessionutils.ExtractStateDeltas(req.State) appState := s.updateAppState(appDelta, req.AppName) userState := s.updateUserState(userDelta, req.AppName, req.UserID) val.state = sessionutils.MergeStates(appState, userState, state) copiedSession := copySessionWithoutStateAndEvents(val) copiedSession.state = maps.Clone(val.state) copiedSession.events = slices.Clone(val.events) return &CreateResponse{ Session: copiedSession, }, nil } func (s *inMemoryService) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) { appName, userID, sessionID := req.AppName, req.UserID, req.SessionID if appName == "" || userID == "" || sessionID == "" { return nil, fmt.Errorf("app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q", appName, userID, sessionID) } s.mu.RLock() defer s.mu.RUnlock() id := id{ appName: appName, userID: userID, sessionID: sessionID, } res, ok := s.sessions.Get(id.Encode()) if !ok { return nil, fmt.Errorf("session %+v not found", req.SessionID) } copiedSession := copySessionWithoutStateAndEvents(res) copiedSession.state = s.mergeStates(res.state, appName, userID) filteredEvents := res.events if req.NumRecentEvents > 0 { start := max(len(filteredEvents)-req.NumRecentEvents, 0) // create a new slice header pointing to the same array filteredEvents = filteredEvents[start:] } // apply timestamp filter, assuming list is sorted if !req.After.IsZero() && len(filteredEvents) > 0 { firstIndexToKeep := sort.Search(len(filteredEvents), func(i int) bool { // Find the first event that is not before the timestamp return !filteredEvents[i].Timestamp.Before(req.After) }) filteredEvents = filteredEvents[firstIndexToKeep:] } copiedSession.events = make([]*Event, 0, len(filteredEvents)) copiedSession.events = append(copiedSession.events, filteredEvents...) return &GetResponse{ Session: copiedSession, }, nil } func (s *inMemoryService) List(ctx context.Context, req *ListRequest) (*ListResponse, error) { appName, userID := req.AppName, req.UserID if appName == "" { return nil, fmt.Errorf("app_name is required, got app_name: %q", appName) } s.mu.RLock() defer s.mu.RUnlock() lo := id{appName: appName, userID: userID}.Encode() var hi string if userID == "" { hi = id{appName: appName + "\x00"}.Encode() } else { hi = id{appName: appName, userID: userID + "\x00"}.Encode() } sessions := make([]Session, 0) for k, storedSession := range s.sessions.Scan(lo, hi) { var key id if err := key.Decode(k); err != nil { return nil, fmt.Errorf("failed to decode key: %w", err) } if key.appName != appName && key.userID != userID { break } copiedSession := copySessionWithoutStateAndEvents(storedSession) copiedSession.state = s.mergeStates(storedSession.state, appName, storedSession.UserID()) sessions = append(sessions, copiedSession) } return &ListResponse{ Sessions: sessions, }, nil } func (s *inMemoryService) Delete(ctx context.Context, req *DeleteRequest) error { appName, userID, sessionID := req.AppName, req.UserID, req.SessionID if appName == "" || userID == "" || sessionID == "" { return fmt.Errorf("app_name, user_id, session_id are required, got app_name: %q, user_id: %q, session_id: %q", appName, userID, sessionID) } s.mu.Lock() defer s.mu.Unlock() id := id{ appName: appName, userID: userID, sessionID: sessionID, } s.sessions.Delete(id.Encode()) return nil } func (s *inMemoryService) AppendEvent(ctx context.Context, curSession Session, event *Event) error { if curSession == nil { return fmt.Errorf("session is nil") } if event == nil { return fmt.Errorf("event is nil") } if event.Partial { return nil } sess, ok := curSession.(*session) if !ok { return fmt.Errorf("unexpected session type %T for session ID %s", curSession, curSession.ID()) } s.mu.Lock() defer s.mu.Unlock() stored_session, ok := s.sessions.Get(sess.id.Encode()) if !ok { return fmt.Errorf("session not found, cannot apply event") } // update the in-memory session if err := sess.appendEvent(event); err != nil { return fmt.Errorf("fail to set state on appendEvent: %w", err) } eventCopy := &Event{ ID: event.ID, InvocationID: event.InvocationID, Timestamp: event.Timestamp, Author: event.Author, Branch: event.Branch, Actions: EventActions{ StateDelta: maps.Clone(event.Actions.StateDelta), ArtifactDelta: maps.Clone(event.Actions.ArtifactDelta), RequestedToolConfirmations: maps.Clone(event.Actions.RequestedToolConfirmations), TransferToAgent: event.Actions.TransferToAgent, Escalate: event.Actions.Escalate, SkipSummarization: event.Actions.SkipSummarization, }, LongRunningToolIDs: slices.Clone(event.LongRunningToolIDs), LLMResponse: event.LLMResponse, } // update the in-memory session service stored_session.events = append(stored_session.events, eventCopy) stored_session.updatedAt = event.Timestamp if len(event.Actions.StateDelta) > 0 { appDelta, userDelta, sessionDelta := sessionutils.ExtractStateDeltas(event.Actions.StateDelta) s.updateAppState(appDelta, curSession.AppName()) s.updateUserState(userDelta, curSession.AppName(), curSession.UserID()) maps.Copy(stored_session.state, sessionDelta) } return nil } func (s *inMemoryService) updateAppState(appDelta stateMap, appName string) stateMap { innerMap, ok := s.appState[appName] if !ok { innerMap = make(stateMap) s.appState[appName] = innerMap } maps.Copy(innerMap, appDelta) return innerMap } func (s *inMemoryService) updateUserState(userDelta stateMap, appName, userID string) stateMap { innerUsersMap, ok := s.userState[appName] if !ok { innerUsersMap = make(map[string]stateMap) s.userState[appName] = innerUsersMap } innerMap, ok := innerUsersMap[userID] if !ok { innerMap = make(stateMap) innerUsersMap[userID] = innerMap } maps.Copy(innerMap, userDelta) return innerMap } func (s *inMemoryService) mergeStates(state stateMap, appName, userID string) stateMap { appState := s.appState[appName] var userState stateMap userStateMap, ok := s.userState[appName] if ok { userState = userStateMap[userID] } return sessionutils.MergeStates(appState, userState, state) } func (id id) Encode() string { return string(ordered.Encode(id.appName, id.userID, id.sessionID)) } func (id *id) Decode(key string) error { return ordered.Decode([]byte(key), &id.appName, &id.userID, &id.sessionID) } type id struct { appName string userID string sessionID string } type session struct { id id // guards all mutable fields mu sync.RWMutex events []*Event state map[string]any updatedAt time.Time } func (s *session) ID() string { return s.id.sessionID } func (s *session) AppName() string { return s.id.appName } func (s *session) UserID() string { return s.id.userID } func (s *session) State() State { return &state{ mu: &s.mu, state: s.state, } } func (s *session) Events() Events { s.mu.RLock() defer s.mu.RUnlock() return events(s.events) } func (s *session) LastUpdateTime() time.Time { s.mu.RLock() defer s.mu.RUnlock() return s.updatedAt } func (s *session) appendEvent(event *Event) error { if event.Partial { return nil } s.mu.Lock() defer s.mu.Unlock() if err := updateSessionState(s, event); err != nil { return fmt.Errorf("error on appendEvent: %w", err) } processedEvent := trimTempDeltaState(event) s.events = append(s.events, processedEvent) s.updatedAt = event.Timestamp return nil } type events []*Event func (e events) All() iter.Seq[*Event] { return func(yield func(*Event) bool) { for _, event := range e { if !yield(event) { return } } } } func (e events) Len() int { return len(e) } func (e events) At(i int) *Event { if i >= 0 && i < len(e) { return e[i] } return nil } type state struct { mu *sync.RWMutex state map[string]any } func (s *state) Get(key string) (any, error) { s.mu.RLock() defer s.mu.RUnlock() val, ok := s.state[key] if !ok { return nil, ErrStateKeyNotExist } return val, nil } func (s *state) All() iter.Seq2[string, any] { s.mu.RLock() // Create a copy of the state to iterate over it without holding the lock. stateCopy := maps.Clone(s.state) s.mu.RUnlock() return func(yield func(key string, val any) bool) { for k, v := range stateCopy { if !yield(k, v) { return } } } } func (s *state) Set(key string, value any) error { s.mu.Lock() defer s.mu.Unlock() s.state[key] = value return nil } // trimTempDeltaState removes temporary state delta keys from the event. func trimTempDeltaState(event *Event) *Event { if len(event.Actions.StateDelta) == 0 { return event } // Iterate over the map and build a new one with the keys we want to keep. filteredStateDelta := make(map[string]any) for key, value := range event.Actions.StateDelta { if !strings.HasPrefix(key, KeyPrefixTemp) { filteredStateDelta[key] = value } } // Replace the old map with the newly filtered one. event.Actions.StateDelta = filteredStateDelta return event } // updateSessionState updates the session state based on the event state delta. func updateSessionState(session *session, event *Event) error { if event.Actions.StateDelta == nil { return nil // Nothing to do } // ensure the session state map is initialized if session.state == nil { session.state = make(map[string]any) } maps.Copy(session.state, event.Actions.StateDelta) return nil } func copySessionWithoutStateAndEvents(sess *session) *session { return &session{ id: id{ appName: sess.id.appName, userID: sess.id.userID, sessionID: sess.id.sessionID, }, updatedAt: sess.updatedAt, } } var _ Service = (*inMemoryService)(nil) ================================================ FILE: session/inmemory_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package session import ( "maps" "strconv" "strings" "sync" "sync/atomic" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/model" ) func Test_databaseService_Create(t *testing.T) { tests := []struct { name string setup func(t *testing.T) Service req *CreateRequest want Session wantErr bool }{ { name: "full key", setup: emptyService, req: &CreateRequest{ AppName: "testApp", UserID: "testUserID", SessionID: "testSessionID", State: map[string]any{ "k": 5, }, }, }, { name: "generated session id", setup: emptyService, req: &CreateRequest{ AppName: "testApp", UserID: "testUserID", State: map[string]any{ "k": 5, }, }, }, { name: "when already exists, it fails", setup: serviceDbWithData, req: &CreateRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", State: map[string]any{ "k": 10, }, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.Create(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("databaseService.Create() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if got.Session.AppName() != tt.req.AppName { t.Errorf("AppName got: %v, want: %v", got.Session.AppName(), tt.wantErr) } if got.Session.UserID() != tt.req.UserID { t.Errorf("UserID got: %v, want: %v", got.Session.UserID(), tt.wantErr) } if tt.req.SessionID != "" { if got.Session.ID() != tt.req.SessionID { t.Errorf("SessionID got: %v, want: %v", got.Session.ID(), tt.wantErr) } } else { if got.Session.ID() == "" { t.Errorf("SessionID was not generated on empty user input.") } } gotState := maps.Collect(got.Session.State().All()) wantState := tt.req.State if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Create State mismatch: (-want +got):\n%s", diff) } }) } } func Test_databaseService_Delete(t *testing.T) { tests := []struct { name string req *DeleteRequest setup func(t *testing.T) Service wantErr bool }{ { name: "delete ok", setup: serviceDbWithData, req: &DeleteRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }, }, { name: "no error when not found", setup: serviceDbWithData, req: &DeleteRequest{ AppName: "appTest", UserID: "user1", SessionID: "session1", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) if err := s.Delete(t.Context(), tt.req); (err != nil) != tt.wantErr { t.Errorf("databaseService.Delete() error = %v, wantErr %v", err, tt.wantErr) } }) } } func Test_databaseService_Get(t *testing.T) { // This setup function is required for a test case. // It creates the specific scenario from 'test_get_session_respects_user_id'. setupGetRespectsUserID := func(t *testing.T) Service { t.Helper() s := serviceDbWithData(t) // Starts with the standard data // u1 creates s1 and adds an event. // 'serviceDbWithData' already created // (app1, user1, session1) // (app1, user2, session1) // We just need to add an event to it. session1, err := s.Get(t.Context(), &GetRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to get session1: %v", err) } // Update 'updatedAt' to pass stale validation on append session1.Session.(*session).updatedAt = time.Now() err = s.AppendEvent(t.Context(), session1.Session.(*session), &Event{ ID: "event_for_user1", Author: "user", LLMResponse: model.LLMResponse{ Partial: false, }, }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to append event: %v", err) } return s } setupGetWithConfig := func(t *testing.T) Service { t.Helper() s := emptyService(t) ctx := t.Context() numTestEvents := 5 created, err := s.Create(ctx, &CreateRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", }) if err != nil { t.Fatalf("setupGetWithConfig failed to create session: %v", err) } for i := 1; i <= numTestEvents; i++ { created.Session.(*session).updatedAt = time.Now() event := &Event{ ID: strconv.Itoa(i), Author: "user", Timestamp: time.Time{}.Add(time.Duration(i)), LLMResponse: model.LLMResponse{}, } if err := s.AppendEvent(ctx, created.Session.(*session), event); err != nil { t.Fatalf("setupGetWithConfig failed to append event %d: %v", i, err) } } return s } tests := []struct { name string req *GetRequest setup func(t *testing.T) Service wantResponse *GetResponse wantEvents []*Event wantErr bool }{ { name: "ok", setup: serviceDbWithData, req: &GetRequest{ AppName: "app1", UserID: "user1", SessionID: "session1", }, wantResponse: &GetResponse{ Session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, events: []*Event{}, }, }, }, { name: "error when not found", setup: serviceDbWithData, req: &GetRequest{ AppName: "testApp", UserID: "user1", SessionID: "session1", }, wantErr: true, }, { name: "get session respects user id", setup: setupGetRespectsUserID, req: &GetRequest{ AppName: "app1", UserID: "user2", SessionID: "session1", }, wantResponse: &GetResponse{ Session: &session{ id: id{ appName: "app1", userID: "user2", sessionID: "session1", }, // This is user2's session, which should have its own state state: map[string]any{ "k1": "v2", }, // Critically, it should NOT have the event from user1's session events: []*Event{}, }, }, wantErr: false, }, { name: "with config_no config returns all events", setup: setupGetWithConfig, req: &GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", }, wantEvents: []*Event{ {ID: "1", Author: "user", Timestamp: time.Time{}.Add(1), LLMResponse: model.LLMResponse{}}, {ID: "2", Author: "user", Timestamp: time.Time{}.Add(2), LLMResponse: model.LLMResponse{}}, {ID: "3", Author: "user", Timestamp: time.Time{}.Add(3), LLMResponse: model.LLMResponse{}}, {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_num recent events", setup: setupGetWithConfig, req: &GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", NumRecentEvents: 3, }, wantEvents: []*Event{ {ID: "3", Author: "user", Timestamp: time.Time{}.Add(3), LLMResponse: model.LLMResponse{}}, {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_after timestamp", setup: setupGetWithConfig, req: &GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", After: time.Time{}.Add(4), }, wantEvents: []*Event{ {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}}, }, }, { name: "with config_combined filters", setup: setupGetWithConfig, req: &GetRequest{ AppName: "my_app", UserID: "user", SessionID: "s1", NumRecentEvents: 3, After: time.Time{}.Add(4), }, wantEvents: []*Event{ {ID: "4", Author: "user", Timestamp: time.Time{}.Add(4), LLMResponse: model.LLMResponse{}}, {ID: "5", Author: "user", Timestamp: time.Time{}.Add(5), LLMResponse: model.LLMResponse{}}, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.Get(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("databaseService.Get() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if tt.wantResponse != nil { if diff := cmp.Diff(tt.wantResponse, got, cmp.AllowUnexported(session{}), cmp.AllowUnexported(id{}), cmpopts.IgnoreFields(session{}, "mu", "updatedAt")); diff != "" { t.Errorf("Get session mismatch: (-want +got):\n%s", diff) } } if tt.wantEvents != nil { opts := []cmp.Option{ cmpopts.SortSlices(func(a, b *Event) bool { return a.Timestamp.Before(b.Timestamp) }), } if diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != "" { t.Errorf("Get session events mismatch: (-want +got):\n%s", diff) } } }) } } func Test_databaseService_List(t *testing.T) { tests := []struct { name string req *ListRequest setup func(t *testing.T) Service wantResponse *ListResponse wantErr bool }{ { name: "list for user1", setup: serviceDbWithData, req: &ListRequest{ AppName: "app1", UserID: "user1", }, wantResponse: &ListResponse{ Sessions: []Session{ &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, }, &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session2", }, state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "empty list for non-existent user", setup: serviceDbWithData, req: &ListRequest{ AppName: "app1", UserID: "custom_user", }, wantResponse: &ListResponse{ Sessions: []Session{}, }, }, { name: "list for user2", setup: serviceDbWithData, req: &ListRequest{ AppName: "app1", UserID: "user2", }, wantResponse: &ListResponse{ Sessions: []Session{ &session{ id: id{ appName: "app1", userID: "user2", sessionID: "session1", }, state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "list all users for app", setup: serviceDbWithData, req: &ListRequest{AppName: "app1", UserID: ""}, wantResponse: &ListResponse{ Sessions: []Session{ &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{"k1": "v1"}, }, &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session2", }, state: map[string]any{"k1": "v2"}, }, &session{ id: id{ appName: "app1", userID: "user2", sessionID: "session1", }, state: map[string]any{"k1": "v2"}, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s := tt.setup(t) got, err := s.List(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Errorf("databaseService.List() error = %v, wantErr %v", err, tt.wantErr) return } if err == nil { // Sort slices for stable comparison opts := []cmp.Option{ cmp.AllowUnexported(session{}), cmp.AllowUnexported(id{}), cmpopts.IgnoreFields(session{}, "mu", "updatedAt"), cmpopts.SortSlices(func(a, b Session) bool { return a.ID() < b.ID() }), } if diff := cmp.Diff(tt.wantResponse, got, opts...); diff != "" { t.Errorf("databaseService.List() = %v (-want +got):\n%s", got, diff) } } }) } } func Test_databaseService_AppendEvent(t *testing.T) { tests := []struct { name string setup func(t *testing.T) Service session *session event *Event wantStoredSession *session // State of the session after Get wantEventCount int // Expected event count in storage wantErr bool }{ { name: "append event to the session and overwrite in storage", setup: serviceDbWithData, session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, }, event: &Event{ ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, events: []*Event{ { ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "append event to the session with events and overwrite in storage", setup: serviceDbWithData, session: &session{ id: id{ appName: "app2", userID: "user2", sessionID: "session2", }, }, event: &Event{ ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &session{ id: id{ appName: "app2", userID: "user2", sessionID: "session2", }, events: []*Event{ { ID: "existing_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, { ID: "new_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, state: map[string]any{ "k2": "v2", }, }, wantEventCount: 2, }, { name: "append event when session not found should fail", setup: serviceDbWithData, session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "custom_session", }, }, event: &Event{ ID: "new_event2", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantErr: true, }, { name: "append event with bytes content", setup: serviceDbWithData, session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, }, event: &Event{ ID: "event_with_bytes", Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, }, wantStoredSession: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, events: []*Event{ { ID: "event_with_bytes", Author: "user", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "append event with all fields", setup: serviceDbWithData, session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, }, event: &Event{ ID: "event_complete", Author: "user", LongRunningToolIDs: []string{"tool123"}, Actions: EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, wantStoredSession: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, events: []*Event{ { ID: "event_complete", Author: "user", LongRunningToolIDs: []string{"tool123"}, Actions: EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, }, state: map[string]any{ "k1": "v1", "k2": "v2", }, }, wantEventCount: 1, }, { name: "partial events are not persisted", setup: serviceDbWithData, session: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, }, event: &Event{ ID: "partial_event", Author: "user", LLMResponse: model.LLMResponse{ Partial: true, // This is the key field }, }, wantStoredSession: &session{ id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, events: []*Event{}, // No event should be stored state: map[string]any{ "k1": "v1", }, }, wantEventCount: 0, // Expect 0 events }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() s := tt.setup(t) tt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation err := s.AppendEvent(ctx, tt.session, tt.event) if (err != nil) != tt.wantErr { t.Errorf("databaseService.AppendEvent() error = %v, wantErr %v", err, tt.wantErr) } if err != nil { return } resp, err := s.Get(ctx, &GetRequest{ AppName: tt.session.AppName(), UserID: tt.session.UserID(), SessionID: tt.session.ID(), }) if err != nil { t.Fatalf("databaseService.Get() error = %v, wantErr %v", err, tt.wantErr) return } // Check event count first if resp.Session.Events().Len() != tt.wantEventCount { t.Errorf("AppendEvent returned %d events, want %d", resp.Session.Events().Len(), tt.wantEventCount) } // Define comparison options opts := []cmp.Option{ cmp.AllowUnexported(session{}), cmp.AllowUnexported(id{}), cmpopts.IgnoreFields(session{}, "mu", "updatedAt"), cmpopts.IgnoreFields(Event{}, "Timestamp"), // Add sorters if event order is not guaranteed cmpopts.SortSlices(func(a, b *Event) bool { return a.ID < b.ID }), } if diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != "" { t.Errorf("AppendEvent session mismatch: (-want +got):\n%s", diff) } }) } } func Test_inMemoryService_StateManagement(t *testing.T) { ctx := t.Context() appName := "my_app" t.Run("app_state_is_shared", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"app:k1": "v1"}}) s1.Session.(*session).updatedAt = time.Now() _ = s.AppendEvent(ctx, s1.Session.(*session), &Event{ ID: "event1", Actions: EventActions{StateDelta: map[string]any{"app:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) s2, err := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u2", SessionID: "s2"}) if err != nil { t.Fatalf("Failed to create session for user 2: %v", err) } wantState := map[string]any{"app:k1": "v1", "app:k2": "v2"} gotState := maps.Collect(s2.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("User 2 state mismatch (-want +got):\n%s", diff) } }) t.Run("user_state_is_user_specific", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"user:k1": "v1"}}) s1.Session.(*session).updatedAt = time.Now() _ = s.AppendEvent(ctx, s1.Session.(*session), &Event{ ID: "event1", Actions: EventActions{StateDelta: map[string]any{"user:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) s1b, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1b"}) wantStateU1 := map[string]any{"user:k1": "v1", "user:k2": "v2"} gotStateU1 := maps.Collect(s1b.Session.State().All()) if diff := cmp.Diff(wantStateU1, gotStateU1); diff != "" { t.Errorf("User 1 second session state mismatch (-want +got):\n%s", diff) } s2, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u2", SessionID: "s2"}) gotStateU2 := maps.Collect(s2.Session.State().All()) if len(gotStateU2) != 0 { t.Errorf("User 2 should have empty state, but got: %v", gotStateU2) } }) t.Run("session_state_is_not_shared", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1", State: map[string]any{"sk1": "v1"}}) s1.Session.(*session).updatedAt = time.Now() _ = s.AppendEvent(ctx, s1.Session.(*session), &Event{ ID: "event1", Actions: EventActions{StateDelta: map[string]any{"sk2": "v2"}}, LLMResponse: model.LLMResponse{}, }) s1_got, _ := s.Get(ctx, &GetRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) wantState := map[string]any{"sk1": "v1", "sk2": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Refetched s1 state mismatch (-want +got):\n%s", diff) } s1b, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1b"}) gotStateS1b := maps.Collect(s1b.Session.State().All()) if len(gotStateS1b) != 0 { t.Errorf("Session s1b should have empty state, but got: %v", gotStateS1b) } }) t.Run("temp_state_is_not_persisted", func(t *testing.T) { s := emptyService(t) s1, _ := s.Create(ctx, &CreateRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) s1.Session.(*session).updatedAt = time.Now() event := &Event{ ID: "event1", Actions: EventActions{StateDelta: map[string]any{"temp:k1": "v1", "sk": "v2"}}, LLMResponse: model.LLMResponse{}, } err := s.AppendEvent(ctx, s1.Session.(*session), event) if err != nil { t.Fatalf("Failed to append event: %v", err) } invocationSession := s1.Session.(*session) wantInvocationState := map[string]any{"sk": "v2", "temp:k1": "v1"} gotInvocationState := maps.Collect(invocationSession.State().All()) if diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != "" { t.Errorf("Invocation session state mismatch (-want +got):\n%s", diff) } s1_got, _ := s.Get(ctx, &GetRequest{AppName: appName, UserID: "u1", SessionID: "s1"}) wantState := map[string]any{"sk": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Persisted state mismatch (-want +got):\n%s", diff) } storedEvents := s1_got.Session.Events() if storedEvents.Len() != 1 { t.Fatalf("Expected 1 stored event, got %d", storedEvents.Len()) } storedDelta := storedEvents.At(0).Actions.StateDelta if _, exists := storedDelta["temp:k1"]; exists { t.Errorf("temp:k1 key was found in the stored event's state delta") } if storedDelta["sk"] != "v2" { t.Errorf("Expected 'sk' key in stored event, but was missing or wrong value") } }) } func serviceDbWithData(t *testing.T) Service { t.Helper() service := emptyService(t).(*inMemoryService) for _, storedSession := range []*session{ { id: id{ appName: "app1", userID: "user1", sessionID: "session1", }, state: map[string]any{ "k1": "v1", }, }, { id: id{ appName: "app1", userID: "user2", sessionID: "session1", }, state: map[string]any{ "k1": "v2", }, }, { id: id{ appName: "app1", userID: "user1", sessionID: "session2", }, state: map[string]any{ "k1": "v2", }, }, { id: id{ appName: "app2", userID: "user2", sessionID: "session2", }, state: map[string]any{ "k2": "v2", }, events: []*Event{ { ID: "existing_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, }, } { service.sessions.Set(storedSession.id.Encode(), storedSession) } return service } func emptyService(t *testing.T) Service { t.Helper() return InMemoryService() } // TODO: test concurrency func Test_inMemoryService_CreateConcurrentAccess(t *testing.T) { s := InMemoryService() const goroutines = 16 const attempts = 32 start := make(chan struct{}) var wg sync.WaitGroup wg.Add(goroutines) req := &CreateRequest{ AppName: "race-app", UserID: "race-user", SessionID: "race-session", } var successCount atomic.Int32 var errorCount atomic.Int32 for range goroutines { go func() { defer wg.Done() <-start for range attempts { _, err := s.Create(t.Context(), req) if err == nil { successCount.Add(1) } else if strings.Contains(err.Error(), "already exists") { errorCount.Add(1) } } }() } close(start) wg.Wait() if successCount.Load() != 1 { t.Errorf("expected 1 successful creation, but got %d", successCount.Load()) } expectedErrors := int32(goroutines*attempts - 1) if errorCount.Load() != expectedErrors { t.Errorf("expected %d 'already exists' errors, but got %d", expectedErrors, errorCount.Load()) } } func TestInMemorySession_AppendEvent_Deadlock(t *testing.T) { ctx := t.Context() service := InMemoryService() // Create a session createReq := &CreateRequest{ AppName: "testapp", UserID: "testuser", } createResp, err := service.Create(ctx, createReq) if err != nil { t.Fatalf("Failed to create session: %v", err) } sess := createResp.Session // Event with StateDelta to trigger updateSessionState event := &Event{ ID: "event1", Timestamp: time.Now(), Actions: EventActions{ StateDelta: map[string]any{ "test_key": "test_value", }, }, } // This call should hang if the deadlock is present err = service.AppendEvent(ctx, sess, event) if err != nil { t.Fatalf("AppendEvent failed: %v", err) } // If it doesn't hang, the test passes (meaning no deadlock) t.Log("AppendEvent did not deadlock") } ================================================ FILE: session/service.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package session import ( "context" "time" ) // Service is a session storage service. // // It provides a set of methods for managing sessions and events. type Service interface { Create(context.Context, *CreateRequest) (*CreateResponse, error) Get(context.Context, *GetRequest) (*GetResponse, error) List(context.Context, *ListRequest) (*ListResponse, error) Delete(context.Context, *DeleteRequest) error // AppendEvent is used to append an event to a session, and remove temporary state keys from the event. AppendEvent(context.Context, Session, *Event) error } // InMemoryService returns an in-memory implementation of the session service. func InMemoryService() Service { return &inMemoryService{ appState: make(map[string]stateMap), userState: make(map[string]map[string]stateMap), } } // CreateRequest represents a request to create a session. type CreateRequest struct { AppName string UserID string // SessionID is the client-provided ID of the session to create. // Optional: if not set, it will be autogenerated. SessionID string // State is the initial state of the session. State map[string]any } // CreateResponse represents a response for newly created session. type CreateResponse struct { Session Session } // GetRequest represents a request to get a session. type GetRequest struct { AppName string UserID string SessionID string // NumRecentEvents returns at most NumRecentEvents most recent events. // Optional: if zero, the filter is not applied. NumRecentEvents int // After returns events with timestamp >= the given time. // Optional: if zero, the filter is not applied. After time.Time } // GetResponse represents a response from [Service.Get]. type GetResponse struct { Session Session } // ListRequest represents a request to list sessions. type ListRequest struct { AppName string UserID string } // ListResponse represents a response from [Service.List]. type ListResponse struct { Sessions []Session } // DeleteRequest represents a request to delete a session. type DeleteRequest struct { AppName string UserID string SessionID string } ================================================ FILE: session/session.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package session import ( "errors" "iter" "time" "github.com/google/uuid" "google.golang.org/adk/model" "google.golang.org/adk/tool/toolconfirmation" ) // Session represents a series of interactions between a user and agents. // // When a user starts interacting with your agent, session holds everything // related to that one specific chat thread. type Session interface { // ID returns the unique identifier of the session. ID() string // AppName returns name of the app. AppName() string // UserID returns the id of the user. UserID() string // State returns the state of the session. State() State // Events return the events of the session, e.g. user input, model response, function call/response, etc. Events() Events // LastUpdateTime returns the time of the last update. LastUpdateTime() time.Time } // State defines a standard interface for a key-value store. // It provides basic methods for accessing, modifying, and iterating over // key-value pairs. type State interface { // Get retrieves the value associated with a given key. // It returns a ErrStateKeyNotExist error if the key does not exist. Get(string) (any, error) // Set assigns the given value to the given key, overwriting any // existing value. It returns an error if the underlying storage // operation fails. Set(string, any) error // All returns an iterator (iter.Seq2) that yields all key-value pairs // currently in the state. The order of iteration is not guaranteed. All() iter.Seq2[string, any] } // ReadonlyState defines a standard interface for a key-value store. // It provides basic methods for accessing, and iterating over // key-value pairs. type ReadonlyState interface { // Get retrieves the value associated with a given key. // It returns a ErrStateKeyNotExist error if the key does not exist. Get(string) (any, error) // All returns an iterator (iter.Seq2) that yields all key-value pairs // currently in the state. The order of iteration is not guaranteed. All() iter.Seq2[string, any] } // Events define a standard interface for an [Event] list. // It provides methods for iterating over the sequence and accessing // individual events by their index. type Events interface { // All returns an iterator (iter.Seq) that yields all events // in the sequence, preserving their order. All() iter.Seq[*Event] // Len returns the total number of events in the sequence. Len() int // At returns the event at the specified index i. At(i int) *Event } // Event represents an interaction in a conversation between agents and users. // It is used to store the content of the conversation, as well as // the actions taken by the agents like function calls, etc. type Event struct { model.LLMResponse // Set by storage ID string Timestamp time.Time // Set by agent.Context implementation. InvocationID string // The branch of the event. // // The format is like agent_1.agent_2.agent_3, where agent_1 is // the parent of agent_2, and agent_2 is the parent of agent_3. // // Branch is used when multiple sub-agent shouldn't see their peer agents' // conversation history. Branch string // Author is the name of the event's author Author string // The actions taken by the agent. Actions EventActions // Set of IDs of the long running function calls. // Agent client will know from this field about which function call is long running. // Only valid for function call event. LongRunningToolIDs []string } // IsFinalResponse returns whether the event is the final response of an agent. // // Note: when multiple agents participate in one invocation, there could be // multiple events with IsFinalResponse() as True, for each participating agent. func (e *Event) IsFinalResponse() bool { if (e.Actions.SkipSummarization) || len(e.LongRunningToolIDs) > 0 { return true } return !hasFunctionCalls(&e.LLMResponse) && !hasFunctionResponses(&e.LLMResponse) && !e.LLMResponse.Partial && !hasTrailingCodeExecutionResult(&e.LLMResponse) } // NewEvent creates a new event defining now as the timestamp. func NewEvent(invocationID string) *Event { return &Event{ ID: uuid.NewString(), InvocationID: invocationID, Timestamp: time.Now(), Actions: EventActions{StateDelta: make(map[string]any), ArtifactDelta: make(map[string]int64)}, } } // EventActions represent the actions attached to an event. type EventActions struct { // Set by agent.Context implementation. StateDelta map[string]any // Indicates that the event is updating an artifact. key is the filename, // value is the version. ArtifactDelta map[string]int64 RequestedToolConfirmations map[string]toolconfirmation.ToolConfirmation // If true, it won't call model to summarize function response. // Only valid for function response event. SkipSummarization bool // If set, the event transfers to the specified agent. TransferToAgent string // The agent is escalating to a higher level agent. Escalate bool } // Prefixes for defining session's state scopes const ( // KeyPrefixApp is the prefix for app-level state keys. // They are shared across all users and sessions for that application. KeyPrefixApp string = "app:" // KeyPrefixTemp is the prefix for temporary state keys. // Such entries are specific to the current invocation (the entire process // from an agent receiving user input to generating the final output for // that input. Discarded after the invocation completes. KeyPrefixTemp string = "temp:" // KeyPrefixUser is the prefix for user-level state keys. // They are tied to the user_id, shared across all sessions for that user // (within the same app_name). KeyPrefixUser string = "user:" ) // ErrStateKeyNotExist is the error thrown when key does not exist. var ErrStateKeyNotExist = errors.New("state key does not exist") func hasFunctionCalls(resp *model.LLMResponse) bool { if resp == nil || resp.Content == nil { return false } for _, part := range resp.Content.Parts { if part.FunctionCall != nil { return true } } return false } func hasFunctionResponses(resp *model.LLMResponse) bool { if resp == nil || resp.Content == nil { return false } for _, part := range resp.Content.Parts { if part.FunctionResponse != nil { return true } } return false } // Returns whether the event has a trailing code execution result. func hasTrailingCodeExecutionResult(resp *model.LLMResponse) bool { if resp == nil || resp.Content == nil || len(resp.Content.Parts) == 0 { return false } lastPart := resp.Content.Parts[len(resp.Content.Parts)-1] return lastPart.CodeExecutionResult != nil } ================================================ FILE: session/vertexai/service_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vertexai import ( "context" "maps" "os" "path/filepath" "strconv" "strings" "testing" "time" "cloud.google.com/go/rpcreplay" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "google.golang.org/api/option" "google.golang.org/genai" "google.golang.org/grpc" "google.golang.org/adk/model" "google.golang.org/adk/session" ) const ( ProjectID = "adk-go-test" Location = "us-central1" EngineId = "5576569044451983360" EngineId2 = "8602987994044956672" UserID = "test-user" ) func Test_vertexaiService_Create(t *testing.T) { tests := []struct { name string setup func(t *testing.T, name string) (session.Service, map[string]string) req *session.CreateRequest want session.Session wantErr bool errMessage string }{ { name: "full key", setup: emptyService, req: &session.CreateRequest{ AppName: EngineId, UserID: "testUserID", SessionID: "testSessionID", State: map[string]any{ "k": 5, }, }, wantErr: true, errMessage: "user-provided Session id is not supported for VertexAISessionService: \"testSessionID\"", }, { name: "generated session id", setup: emptyService, req: &session.CreateRequest{ AppName: EngineId, UserID: "testUserID", State: map[string]any{ // TODO had to parse to float64, sending int was modified by vertex or by vertex client, int should work "k": float64(5), }, }, }, { name: "when already exists, it fails", setup: serviceDbWithData, req: &session.CreateRequest{ AppName: EngineId, UserID: "user1", SessionID: "session1", State: map[string]any{ "k": 10, }, }, wantErr: true, errMessage: "user-provided Session id is not supported for VertexAISessionService: \"session1\"", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s, _ := tt.setup(t, tt.name) got, err := s.Create(t.Context(), tt.req) if err != nil { if tt.wantErr && err.Error() == tt.errMessage { return } t.Fatalf("vertexAiService.Create() error = %v, wantErr %v", err, tt.errMessage) return } if got.Session.AppName() != tt.req.AppName { t.Errorf("AppName got: %v, want: %v", got.Session.AppName(), tt.wantErr) } if got.Session.UserID() != tt.req.UserID { t.Errorf("UserID got: %v, want: %v", got.Session.UserID(), tt.wantErr) } if tt.req.SessionID != "" { if got.Session.ID() != tt.req.SessionID { t.Errorf("SessionID got: %v, want: %v", got.Session.ID(), tt.wantErr) } } else { if got.Session.ID() == "" { t.Errorf("SessionID was not generated on empty user input.") } } gotState := maps.Collect(got.Session.State().All()) wantState := tt.req.State if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Create State mismatch: (-want +got):\n%s", diff) } }) } } func Test_vertexaiService_Get(t *testing.T) { // This setup function is required for a test case. // It creates the specific scenario from 'test_get_session_respects_user_id'. setupGetRespectsUserID := func(t *testing.T, name string) (session.Service, map[string]string) { t.Helper() s, l := serviceDbWithData(t, name) // Starts with the standard data // u1 creates s1 and adds an event. // 'serviceDbWithData' already created // (app1, user1, session1) // (app1, user2, session1) // We just need to add an event to it. session1, err := s.Get(t.Context(), &session.GetRequest{ AppName: EngineId, UserID: "user1", SessionID: l[EngineId+"user1session1"], }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to get session1: %v", err) } // Update 'updatedAt' to pass stale validation on append session1.Session.(*localSession).updatedAt = time.Now() err = s.AppendEvent(t.Context(), session1.Session.(*localSession), &session.Event{ ID: "event_for_user1", InvocationID: "test", Author: "user", LLMResponse: model.LLMResponse{ Partial: false, }, }) if err != nil { t.Fatalf("setupGetRespectsUserID failed to append event: %v", err) } return s, l } setupGetWithConfig := func(t *testing.T, name string) (session.Service, map[string]string) { t.Helper() s, l := emptyService(t, name) ctx := t.Context() numTestEvents := 5 created, err := s.Create(ctx, &session.CreateRequest{ AppName: EngineId2, UserID: "user", }) if err != nil { t.Fatalf("setupGetWithConfig failed to create session: %v", err) } l[created.Session.AppName()+created.Session.UserID()+"s1"] = created.Session.ID() for i := 1; i <= numTestEvents; i++ { created.Session.(*localSession).updatedAt = time.Now() event := &session.Event{ ID: strconv.Itoa(i), InvocationID: "test", Author: "user", Timestamp: time.Time{}.Add(time.Duration(i) * time.Second), LLMResponse: model.LLMResponse{}, } if err := s.AppendEvent(ctx, created.Session.(*localSession), event); err != nil { t.Fatalf("setupGetWithConfig failed to append event %d: %v", i, err) } } return s, l } tests := []struct { name string req *session.GetRequest setup func(t *testing.T, name string) (session.Service, map[string]string) wantResponse *session.GetResponse wantEvents []*session.Event wantErr bool }{ { name: "ok", setup: serviceDbWithData, req: &session.GetRequest{ AppName: EngineId, UserID: "user1", SessionID: "session1", }, wantResponse: &session.GetResponse{ Session: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, events: []*session.Event{}, }, }, }, { name: "error when not found", setup: serviceDbWithData, req: &session.GetRequest{ AppName: EngineId, UserID: "user1", SessionID: "session4", }, wantErr: true, }, { name: "get session respects user id", setup: setupGetRespectsUserID, req: &session.GetRequest{ AppName: EngineId, UserID: "user2", SessionID: "session1", }, wantResponse: &session.GetResponse{ Session: &localSession{ appName: EngineId, userID: "user2", sessionID: "session1", // This is user2's session, which should have its own state state: map[string]any{ "k1": "v2", }, // Critically, it should NOT have the event from user1's session events: []*session.Event{}, }, }, wantErr: false, }, { name: "with config_no config returns all events", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: EngineId2, UserID: "user", SessionID: "s1", }, wantEvents: []*session.Event{ { ID: "1", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(1 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "2", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(2 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "3", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(3 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "4", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(4 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "5", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(5 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, }, { name: "with config_num recent events", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: EngineId2, UserID: "user", SessionID: "s1", NumRecentEvents: 3, }, wantEvents: []*session.Event{ { ID: "3", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(3 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "4", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(4 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "5", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(5 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, }, { name: "with config_after timestamp", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: EngineId2, UserID: "user", SessionID: "s1", After: time.Time{}.Add(4 * time.Second), }, wantErr: false, wantEvents: []*session.Event{ { ID: "4", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(4 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "5", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(5 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, }, { name: "with config_combined filters", setup: setupGetWithConfig, req: &session.GetRequest{ AppName: EngineId2, UserID: "user", SessionID: "s1", NumRecentEvents: 3, After: time.Time{}.Add(4 * time.Second), }, wantErr: false, wantEvents: []*session.Event{ { ID: "4", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(4 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "5", Author: "user", InvocationID: "test", Timestamp: time.Time{}.Add(5 * time.Second), LLMResponse: model.LLMResponse{ Content: &genai.Content{}, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s, l := tt.setup(t, tt.name) tt.req.SessionID = l[tt.req.AppName+tt.req.UserID+tt.req.SessionID] got, err := s.Get(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Fatalf("vertexAiService.Get() error = %v, wantErr %v", err, tt.wantErr) return } if err != nil { return } if tt.wantResponse != nil { if diff := cmp.Diff(tt.wantResponse, got, cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt", "sessionID")); diff != "" { t.Errorf("Get session mismatch: (-want +got):\n%s", diff) } } if tt.wantEvents != nil { opts := []cmp.Option{ cmpopts.SortSlices(func(a, b *session.Event) bool { return a.Timestamp.Before(b.Timestamp) }), cmpopts.IgnoreFields(session.Event{}, "ID"), } if diff := cmp.Diff(events(tt.wantEvents), got.Session.Events(), opts...); diff != "" { t.Errorf("Get session events mismatch: (-want +got):\n%s", diff) } } }) } } func Test_vertexaiService_List(t *testing.T) { tests := []struct { name string req *session.ListRequest setup func(t *testing.T, name string) (session.Service, map[string]string) wantResponse *session.ListResponse wantErr bool }{ { name: "list for user1", setup: serviceDbWithData, req: &session.ListRequest{ AppName: EngineId, UserID: "user1", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, }, &localSession{ appName: EngineId, userID: "user1", sessionID: "session2", state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "empty list for non-existent user", setup: serviceDbWithData, req: &session.ListRequest{ AppName: EngineId, UserID: "custom_user", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{}, }, }, { name: "list for user2", setup: serviceDbWithData, req: &session.ListRequest{ AppName: EngineId, UserID: "user2", }, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{ appName: EngineId, userID: "user2", sessionID: "session1", state: map[string]any{ "k1": "v2", }, }, }, }, }, { name: "list all users for app", setup: serviceDbWithData, req: &session.ListRequest{AppName: EngineId, UserID: ""}, wantResponse: &session.ListResponse{ Sessions: []session.Session{ &localSession{appName: EngineId, userID: "user1", sessionID: "session1", state: map[string]any{"k1": "v1"}}, &localSession{appName: EngineId, userID: "user1", sessionID: "session2", state: map[string]any{"k1": "v2"}}, &localSession{appName: EngineId, userID: "user2", sessionID: "session1", state: map[string]any{"k1": "v2"}}, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s, l := tt.setup(t, tt.name) got, err := s.List(t.Context(), tt.req) if (err != nil) != tt.wantErr { t.Errorf("vertexAiService.List() error = %v, wantErr %v", err, tt.wantErr) return } for _, s1 := range tt.wantResponse.Sessions { ls := s1.(*localSession) ls.sessionID = l[ls.appName+ls.userID+ls.sessionID] } if err == nil { // Sort slices for stable comparison opts := []cmp.Option{ cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt"), cmpopts.SortSlices(func(a, b session.Session) bool { return a.ID() < b.ID() }), } if diff := cmp.Diff(tt.wantResponse, got, opts...); diff != "" { t.Errorf("vertexAiService.List() = %v (-want +got):\n%s", got, diff) } } }) } } func Test_vertexaiService_AppendEvent(t *testing.T) { tests := []struct { name string setup func(t *testing.T, name string) (session.Service, map[string]string) session *localSession event *session.Event wantStoredSession *localSession // State of the session after Get wantEventCount int // Expected event count in storage wantErr bool }{ { name: "append event to the session and overwrite in storage", setup: serviceDbWithData, session: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "new_event1", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "new_event1", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Content: &genai.Content{}, Partial: false, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "missing session id", setup: emptyService, session: &localSession{appName: EngineId, userID: UserID}, event: &session.Event{}, wantErr: true, }, { name: "nil event", setup: emptyService, session: &localSession{ appName: EngineId2, userID: "user2", sessionID: "session2", }, event: nil, wantErr: true, }, { name: "missing author", setup: emptyService, session: &localSession{ appName: EngineId2, userID: "user2", sessionID: "session2", }, event: &session.Event{ Timestamp: time.Now(), InvocationID: uuid.NewString(), }, wantErr: true, }, { name: "missing invocation id", setup: emptyService, session: &localSession{ appName: EngineId2, userID: "user2", sessionID: "session2", }, event: &session.Event{ Timestamp: time.Now(), Author: UserID, }, wantErr: true, }, { name: "append event to the session with events and overwrite in storage", setup: serviceDbWithData, session: &localSession{ appName: EngineId2, userID: "user2", sessionID: "session2", }, event: &session.Event{ ID: "new_event1", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantStoredSession: &localSession{ appName: EngineId2, userID: "user2", sessionID: "session2", events: []*session.Event{ { ID: "existing_event1", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Content: &genai.Content{}, Partial: false, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, { ID: "new_event1", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Content: &genai.Content{}, Partial: false, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, state: map[string]any{ "k2": "v2", }, }, wantEventCount: 2, }, { name: "append event when session not found should fail", setup: serviceDbWithData, session: &localSession{ appName: EngineId, userID: "user1", sessionID: "custom_session", }, event: &session.Event{ ID: "new_event2", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: false, }, }, wantErr: true, }, { name: "append event with bytes content", setup: serviceDbWithData, session: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "event_with_bytes", Author: "user", InvocationID: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, }, wantStoredSession: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "event_with_bytes", Author: "user", InvocationID: "test", LLMResponse: model.LLMResponse{ Content: genai.NewContentFromBytes([]byte("test_image_data"), "image/png", "user"), GroundingMetadata: &genai.GroundingMetadata{ SearchEntryPoint: &genai.SearchEntryPoint{ SDKBlob: []byte("test_sdk_blob"), }, }, }, Actions: session.EventActions{ StateDelta: map[string]any{}, }, }, }, state: map[string]any{ "k1": "v1", }, }, wantEventCount: 1, }, { name: "append event with all fields", setup: serviceDbWithData, session: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "event_complete", Author: "user", InvocationID: "test", LongRunningToolIDs: []string{"tool123"}, Actions: session.EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, wantStoredSession: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", events: []*session.Event{ { ID: "event_complete", Author: "user", InvocationID: "test", LongRunningToolIDs: []string{"tool123"}, Actions: session.EventActions{StateDelta: map[string]any{"k2": "v2"}}, LLMResponse: model.LLMResponse{ Content: genai.NewContentFromText("test_text", "user"), TurnComplete: true, Partial: false, ErrorCode: "error_code", ErrorMessage: "error_message", Interrupted: true, GroundingMetadata: &genai.GroundingMetadata{ WebSearchQueries: []string{"query1"}, }, UsageMetadata: &genai.GenerateContentResponseUsageMetadata{ PromptTokenCount: 1, CandidatesTokenCount: 1, TotalTokenCount: 2, }, CitationMetadata: &genai.CitationMetadata{ Citations: []*genai.Citation{{Title: "test", URI: "google.com"}}, }, CustomMetadata: map[string]any{ "custom_key": "custom_value", }, }, }, }, state: map[string]any{ "k1": "v1", "k2": "v2", }, }, wantEventCount: 1, }, { name: "partial events are not persisted", setup: serviceDbWithData, session: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", }, event: &session.Event{ ID: "partial_event", Author: "user", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: true, // This is the key field }, }, wantStoredSession: &localSession{ appName: EngineId, userID: "user1", sessionID: "session1", events: []*session.Event{}, // No event should be stored state: map[string]any{ "k1": "v1", }, }, wantEventCount: 0, // Expect 0 events }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctx := t.Context() s, l := tt.setup(t, tt.name) tt.session.sessionID = l[tt.session.appName+tt.session.userID+tt.session.sessionID] if tt.wantStoredSession != nil { tt.wantStoredSession.sessionID = tt.session.sessionID } tt.session.updatedAt = time.Now() // set updatedAt value to pass stale validation err := s.AppendEvent(ctx, tt.session, tt.event) if (err != nil) != tt.wantErr { t.Errorf("vertexAiService.AppendEvent() error = %v, wantErr %v", err, tt.wantErr) } if err != nil { return } resp, err := s.Get(ctx, &session.GetRequest{ AppName: tt.session.AppName(), UserID: tt.session.UserID(), SessionID: tt.session.ID(), }) if err != nil { t.Fatalf("vertexAiService.Get() error = %v, wantErr %v", err, tt.wantErr) return } // Check event count first if resp.Session.Events().Len() != tt.wantEventCount { t.Errorf("AppendEvent returned %d events, want %d", resp.Session.Events().Len(), tt.wantEventCount) } // Define comparison options opts := []cmp.Option{ cmp.AllowUnexported(localSession{}), cmpopts.IgnoreFields(localSession{}, "mu", "updatedAt"), cmpopts.IgnoreFields(session.Event{}, "Timestamp", "ID"), cmpopts.IgnoreFields(model.LLMResponse{}, "CitationMetadata", "UsageMetadata"), // Add sorters if event order is not guaranteed cmpopts.SortSlices(func(a, b *session.Event) bool { return a.ID < b.ID }), } if diff := cmp.Diff(tt.wantStoredSession, resp.Session, opts...); diff != "" { t.Errorf("AppendEvent session mismatch: (-want +got):\n%s", diff) } }) } } func Test_vertexaiService_StateManagement(t *testing.T) { ctx := t.Context() appName := EngineId t.Run("app_state_is_shared", func(t *testing.T) { s, _ := emptyService(t, "app_state_is_shared") s1, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", State: map[string]any{"app:k1": "v1"}}) if err != nil { t.Fatalf("Failed to create session for user 1: %v", err) } s1.Session.(*localSession).updatedAt = time.Now() err = s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Author: "test", InvocationID: "test", Actions: session.EventActions{StateDelta: map[string]any{"app:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s2, err := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u2"}) if err != nil { t.Fatalf("Failed to create session for user 2: %v", err) } wantState := map[string]any{"app:k1": "v1", "app:k2": "v2"} gotState := maps.Collect(s2.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("User 2 state mismatch (-want +got):\n%s", diff) } t.Cleanup(func() { err := s.AppendEvent(ctx, s2.Session, &session.Event{ ID: "clean_up_event", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: false, }, Actions: session.EventActions{ StateDelta: map[string]any{ "app:k1": nil, "app:k2": nil, }, }, }) if err != nil { t.Fatalf("Failed to appendEvent on cleanup: %v", err) } }) }) t.Run("user_state_is_user_specific", func(t *testing.T) { s, _ := emptyService(t, "user_state_is_user_specific") s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", State: map[string]any{"user:k1": "v1"}}) s1.Session.(*localSession).updatedAt = time.Now() err := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Author: "test", InvocationID: "test", Actions: session.EventActions{StateDelta: map[string]any{"user:k2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1"}) wantStateU1 := map[string]any{"user:k1": "v1", "user:k2": "v2"} gotStateU1 := maps.Collect(s1b.Session.State().All()) if diff := cmp.Diff(wantStateU1, gotStateU1); diff != "" { t.Errorf("User 1 second session state mismatch (-want +got):\n%s", diff) } s2, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u2"}) gotStateU2 := maps.Collect(s2.Session.State().All()) if len(gotStateU2) != 0 { t.Errorf("User 2 should have empty state, but got: %v", gotStateU2) } t.Cleanup(func() { err := s.AppendEvent(ctx, s1b.Session, &session.Event{ ID: "clean_up_event", Author: "test", InvocationID: "test", LLMResponse: model.LLMResponse{ Partial: false, }, Actions: session.EventActions{ StateDelta: map[string]any{ "user:k1": nil, "user:k2": nil, }, }, }) if err != nil { t.Fatalf("Failed to appendEvent on cleanup: %v", err) } }) }) t.Run("session_state_is_not_shared", func(t *testing.T) { s, _ := emptyService(t, "session_state_is_not_shared") s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1", State: map[string]any{"sk1": "v1"}}) s1.Session.(*localSession).updatedAt = time.Now() err := s.AppendEvent(ctx, s1.Session.(*localSession), &session.Event{ ID: "event1", Author: "test", InvocationID: "test", Actions: session.EventActions{StateDelta: map[string]any{"sk2": "v2"}}, LLMResponse: model.LLMResponse{}, }) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } s1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: "u1", SessionID: s1.Session.ID()}) wantState := map[string]any{"sk1": "v1", "sk2": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Refetched s1 state mismatch (-want +got):\n%s", diff) } s1b, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1"}) gotStateS1b := maps.Collect(s1b.Session.State().All()) if len(gotStateS1b) != 0 { t.Errorf("Session s1b should have empty state, but got: %v", gotStateS1b) } }) t.Run("temp_state_is_not_persisted", func(t *testing.T) { s, _ := emptyService(t, "temp_state_is_not_persisted") s1, _ := s.Create(ctx, &session.CreateRequest{AppName: appName, UserID: "u1"}) s1.Session.(*localSession).updatedAt = time.Now() event := &session.Event{ ID: "event1", Author: "test", InvocationID: "test", Actions: session.EventActions{StateDelta: map[string]any{"temp:k1": "v1", "sk": "v2"}}, LLMResponse: model.LLMResponse{}, } err := s.AppendEvent(ctx, s1.Session.(*localSession), event) if err != nil { t.Fatalf("Failed to appendEvent: %v", err) } invocationSession := s1.Session.(*localSession) wantInvocationState := map[string]any{"sk": "v2", "temp:k1": "v1"} gotInvocationState := maps.Collect(invocationSession.State().All()) if diff := cmp.Diff(wantInvocationState, gotInvocationState); diff != "" { t.Errorf("Invocation session state mismatch (-want +got):\n%s", diff) } s1_got, _ := s.Get(ctx, &session.GetRequest{AppName: appName, UserID: s1.Session.UserID(), SessionID: s1.Session.ID()}) wantState := map[string]any{"sk": "v2"} gotState := maps.Collect(s1_got.Session.State().All()) if diff := cmp.Diff(wantState, gotState); diff != "" { t.Errorf("Persisted state mismatch (-want +got):\n%s", diff) } storedEvents := s1_got.Session.Events() if storedEvents.Len() != 1 { t.Fatalf("Expected 1 stored event, got %d", storedEvents.Len()) } storedDelta := storedEvents.At(0).Actions.StateDelta if storedDelta["sk"] != "v2" { t.Errorf("Expected 'sk' key in stored event, but was missing or wrong value") } }) } func emptyService(t *testing.T, name string) (session.Service, map[string]string) { t.Helper() replayFile := sanitizeFilename(name) opts, teardown, err := setupReplay(t, replayFile) if err != nil { t.Fatalf("Failed to setup replay: %v", err) } v, err := NewSessionService(t.Context(), VertexAIServiceConfig{ Location: Location, ProjectID: ProjectID, }, opts...) if err != nil { t.Fatalf("%s", err) } t.Cleanup(func() { t.Log("CLEANUP") deleteAll(t, v) defer teardown() }) return v, make(map[string]string, 0) } func deleteAll(t *testing.T, v session.Service) { deleteAllFromApp(t, v, EngineId) deleteAllFromApp(t, v, EngineId2) } func deleteAllFromApp(t *testing.T, v session.Service, app string) { cleanupCtx := context.Background() sessionsResp, err := v.List(cleanupCtx, &session.ListRequest{ AppName: app, }) if err != nil { t.Errorf("error listing session for delete all: %s", err) } for _, s := range sessionsResp.Sessions { err := v.Delete(cleanupCtx, &session.DeleteRequest{ AppName: s.AppName(), UserID: s.UserID(), SessionID: s.ID(), }) if err != nil { t.Errorf("error deleting session for delete all: %s", err) } } } func serviceDbWithData(t *testing.T, name string) (session.Service, map[string]string) { t.Helper() service, _ := emptyService(t, name) ids := make(map[string]string, 4) for _, storedSession := range []*localSession{ { appName: EngineId, userID: "user1", sessionID: "session1", state: map[string]any{ "k1": "v1", }, }, { appName: EngineId, userID: "user2", sessionID: "session1", state: map[string]any{ "k1": "v2", }, }, { appName: EngineId, userID: "user1", sessionID: "session2", state: map[string]any{ "k1": "v2", }, }, { appName: EngineId2, userID: "user2", sessionID: "session2", state: map[string]any{ "k2": "v2", }, events: []*session.Event{ { Author: "test", InvocationID: "test", ID: "existing_event1", LLMResponse: model.LLMResponse{ Partial: false, }, }, }, }, } { resp, err := service.Create(t.Context(), &session.CreateRequest{ AppName: storedSession.appName, UserID: storedSession.userID, State: storedSession.state, }) if err != nil { t.Fatalf("Failed to create sample sessions on db initialization: %v", err) } ids[resp.Session.AppName()+resp.Session.UserID()+storedSession.sessionID] = resp.Session.ID() for _, ev := range storedSession.events { err = service.AppendEvent(t.Context(), resp.Session, ev) if err != nil { t.Fatalf("Failed to append event to session on db initialization: %v", err) } } } return service, ids } // setupReplay determines if we are recording real traffic or replaying from a file. // returns: client options, a teardown function, and an error. func setupReplay(t *testing.T, filename string) ([]option.ClientOption, func(), error) { filePath := filepath.Join("testdata", filename) var grpcOpts []grpc.DialOption var teardown func() error // 1. Determine mode (Record vs Replay) if os.Getenv("UPDATE_REPLAYS") == "true" { t.Logf("Recording payload to %s", filePath) _ = os.MkdirAll("testdata", 0o755) rec, err := rpcreplay.NewRecorder(filePath, nil) if err != nil { return nil, nil, err } grpcOpts = rec.DialOptions() teardown = rec.Close } else { t.Logf("Replaying from %s", filePath) rep, err := rpcreplay.NewReplayer(filePath) if err != nil { return nil, nil, err } grpcOpts = rep.DialOptions() teardown = rep.Close } // 2. CONVERSION STEP: Convert []grpc.DialOption -> []option.ClientOption var clientOpts []option.ClientOption for _, opt := range grpcOpts { clientOpts = append(clientOpts, option.WithGRPCDialOption(opt)) if os.Getenv("UPDATE_REPLAYS") != "true" { clientOpts = append(clientOpts, option.WithoutAuthentication()) } } // 3. Return the SAFE client options return clientOpts, func() { if err := teardown(); err != nil { t.Errorf("Failed to close replayer/recorder: %v", err) } }, nil } func sanitizeFilename(name string) string { // Replace spaces and special chars with underscores safe := strings.ReplaceAll(name, " ", "_") safe = strings.ReplaceAll(safe, ",", "_") safe = strings.ReplaceAll(safe, "/", "-") return safe + ".replay" } ================================================ FILE: session/vertexai/session.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vertexai import ( "fmt" "iter" "maps" "strings" "sync" "time" "google.golang.org/adk/session" ) // TODO localSession is identical to session.session. Move to sessioninternal type localSession struct { appName string userID string sessionID string // guards all mutable fields mu sync.RWMutex events []*session.Event state map[string]any updatedAt time.Time } func (s *localSession) ID() string { return s.sessionID } func (s *localSession) AppName() string { return s.appName } func (s *localSession) UserID() string { return s.userID } func (s *localSession) State() session.State { return &state{ mu: &s.mu, state: s.state, } } func (s *localSession) Events() session.Events { return events(s.events) } func (s *localSession) LastUpdateTime() time.Time { s.mu.RLock() defer s.mu.RUnlock() return s.updatedAt } func (s *localSession) appendEvent(event *session.Event) error { if event.Partial { return nil } s.mu.Lock() defer s.mu.Unlock() if err := updateSessionState(s, event); err != nil { return fmt.Errorf("failed to update localSession state: %w", err) } processedEvent := trimTempDeltaState(event) s.events = append(s.events, processedEvent) s.updatedAt = processedEvent.Timestamp return nil } type events []*session.Event func (e events) All() iter.Seq[*session.Event] { return func(yield func(*session.Event) bool) { for _, event := range e { if !yield(event) { return } } } } func (e events) Len() int { return len(e) } func (e events) At(i int) *session.Event { if i >= 0 && i < len(e) { return e[i] } return nil } type state struct { mu *sync.RWMutex state map[string]any } func (s *state) Get(key string) (any, error) { s.mu.RLock() defer s.mu.RUnlock() val, ok := s.state[key] if !ok { return nil, session.ErrStateKeyNotExist } return val, nil } func (s *state) All() iter.Seq2[string, any] { s.mu.RLock() // Create a copy of the state to iterate over it without holding the lock. stateCopy := maps.Clone(s.state) s.mu.RUnlock() return func(yield func(key string, val any) bool) { for k, v := range stateCopy { if !yield(k, v) { return } } } } func (s *state) Set(key string, value any) error { s.mu.Lock() defer s.mu.Unlock() s.state[key] = value return nil } // TrimTempDeltaState removes temporary state delta keys from the event. func trimTempDeltaState(event *session.Event) *session.Event { if len(event.Actions.StateDelta) == 0 { return event } // Iterate over the map and build a new one with the keys we want to keep. filteredStateDelta := make(map[string]any) for key, value := range event.Actions.StateDelta { if !strings.HasPrefix(key, session.KeyPrefixTemp) { filteredStateDelta[key] = value } } // Replace the old map with the newly filtered one. event.Actions.StateDelta = filteredStateDelta return event } // updateSessionState updates the session state based on the event state delta. func updateSessionState(sess *localSession, event *session.Event) error { if event.Actions.StateDelta == nil { return nil // Nothing to do } // Ensure the session state map is initialized if sess.state == nil { sess.state = make(map[string]any) } maps.Copy(sess.state, event.Actions.StateDelta) return nil } var ( _ session.Session = (*localSession)(nil) _ session.Events = (*events)(nil) _ session.State = (*state)(nil) ) ================================================ FILE: session/vertexai/vertexai.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vertexai import ( "context" "fmt" "golang.org/x/sync/errgroup" "google.golang.org/api/option" "google.golang.org/adk/session" ) // VertexAiSessionService type vertexAiService struct { client *vertexAiClient } type VertexAIServiceConfig struct { // ProjectID with VertexAI API enabled. ProjectID string // Location where the reasoningEngine is running. Location string // ReasoningEngine is the runtime in the agent engine which will store the // sessions. // Optimal way is to create reasoningEngine per app. // For example, a reasoningEngine can be created via the Vertex AI REST // API's 'projects.locations.reasoningEngines.create' method. ReasoningEngine string } // NewSessionService returns VertextAiSessionService implementation. func NewSessionService(ctx context.Context, cfg VertexAIServiceConfig, opts ...option.ClientOption) (session.Service, error) { client, err := newVertexAiClient(ctx, cfg.Location, cfg.ProjectID, cfg.ReasoningEngine, opts...) if err != nil { return nil, fmt.Errorf("failed to create Vertex AI client: %w", err) } return &vertexAiService{client: client}, nil } func (s *vertexAiService) Create(ctx context.Context, req *session.CreateRequest) (*session.CreateResponse, error) { if req.AppName == "" || req.UserID == "" { return nil, fmt.Errorf("app_name and user_id are required, got app_name: %q, user_id: %q", req.AppName, req.UserID) } if req.SessionID != "" { return nil, fmt.Errorf("user-provided Session id is not supported for VertexAISessionService: %q", req.SessionID) } sess, err := s.client.createSession(ctx, req) if err != nil { return nil, fmt.Errorf("failed to create session: %w", err) } return &session.CreateResponse{Session: sess}, nil } func (s *vertexAiService) Get(ctx context.Context, req *session.GetRequest) (*session.GetResponse, error) { if req.AppName == "" || req.UserID == "" || req.SessionID == "" { return nil, fmt.Errorf("app_name, user_id and session_id are required, got app_name: %q, user_id: %q, session_id: %q", req.AppName, req.UserID, req.SessionID) } // gCtx will be canceled if either function returns an error g, gCtx := errgroup.WithContext(ctx) var ( sess *localSession events []*session.Event ) g.Go(func() error { var err error sess, err = s.client.getSession(gCtx, req) if err != nil { return fmt.Errorf("failed to get session: %w", err) } return nil }) g.Go(func() error { var err error events, err = s.client.listSessionEvents(gCtx, req.AppName, req.SessionID, req.After, req.NumRecentEvents) if err != nil { return fmt.Errorf("failed to list session events: %w", err) } return nil }) if err := g.Wait(); err != nil { return nil, err } sess.events = events return &session.GetResponse{Session: sess}, nil } func (s *vertexAiService) List(ctx context.Context, req *session.ListRequest) (*session.ListResponse, error) { if req.AppName == "" { return nil, fmt.Errorf("app_name is required, got app_name: %q", req.AppName) } sessions, err := s.client.listSessions(ctx, req) if err != nil { return nil, fmt.Errorf("failed to request sessions list: %w", err) } return &session.ListResponse{Sessions: sessions}, nil } func (s *vertexAiService) Delete(ctx context.Context, req *session.DeleteRequest) error { if req.AppName == "" || req.UserID == "" || req.SessionID == "" { return fmt.Errorf("app_name, user_id and session_id are required, got app_name: %q, user_id: %q, session_id: %q", req.AppName, req.UserID, req.SessionID) } err := s.client.deleteSession(ctx, req) if err != nil { return fmt.Errorf("failed to delete session: %w", err) } return nil } func (s *vertexAiService) AppendEvent(ctx context.Context, sess session.Session, event *session.Event) error { if sess.ID() == "" || event == nil { return fmt.Errorf("session_id and event are required, got session_id: %q, event_id: %t", sess.ID(), event == nil) } err := s.client.appendEvent(ctx, sess.AppName(), sess.ID(), event) if err != nil { return fmt.Errorf("failed to append event: %w", err) } sessInt, ok := sess.(*localSession) if !ok { return fmt.Errorf("AppendEvent for Vertex AI service only supports sessions created by it, got %T", sess) } err = sessInt.appendEvent(event) if err != nil { return fmt.Errorf("failed to append event: %w", err) } return nil } ================================================ FILE: session/vertexai/vertexai_client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vertexai import ( "context" "fmt" "regexp" "strconv" "strings" "time" "google.golang.org/api/iterator" "google.golang.org/api/option" "google.golang.org/genai" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/adk/model" "google.golang.org/adk/session" aiplatform "cloud.google.com/go/aiplatform/apiv1beta1" aiplatformpb "cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb" ) const ( engineResourceTemplate = "projects/%s/locations/%s/reasoningEngines/%s" sessionResourceTemplate = engineResourceTemplate + "/sessions/%s" ) type vertexAiClient struct { location string projectID string reasoningEngine string rpcClient *aiplatform.SessionClient } func newVertexAiClient(ctx context.Context, location, projectID, reasoningEngine string, opts ...option.ClientOption) (*vertexAiClient, error) { rpcClient, err := aiplatform.NewSessionClient(ctx, opts...) if err != nil { return nil, fmt.Errorf("could not establish connection to the aiplatform server: %w", err) } return &vertexAiClient{location, projectID, reasoningEngine, rpcClient}, nil } // Ensure you close it when your application shuts down func (c *vertexAiClient) Close() error { return c.rpcClient.Close() } func (c *vertexAiClient) createSession(ctx context.Context, req *session.CreateRequest) (*localSession, error) { pbSession := &aiplatformpb.Session{ UserId: req.UserID, } // Convert and set the initial state if provided if len(req.State) > 0 { stateStruct, err := structpb.NewStruct(req.State) if err != nil { return nil, fmt.Errorf("failed to convert state to structpb: %w", err) } pbSession.SessionState = stateStruct } reasoningEngine, err := c.getReasoningEngineID(req.AppName) if err != nil { return nil, err } rpcReq := &aiplatformpb.CreateSessionRequest{ Parent: fmt.Sprintf(engineResourceTemplate, c.projectID, c.location, reasoningEngine), Session: pbSession, } lro, err := c.rpcClient.CreateSession(ctx, rpcReq) if err != nil { return nil, fmt.Errorf("error creating session: %w", err) } sessionID, err := sessionIDByOperationName(lro.Name()) if err != nil { return nil, fmt.Errorf("error creating session: %w", err) } createdSession, err := c.waitForOperation(ctx, req.AppName, req.UserID, sessionID) if err != nil { return nil, fmt.Errorf("LRO for CreateSession failed: %w", err) } return createdSession, nil } func isNotFoundError(err error) bool { // status.Code returns codes.Unknown if it's not a gRPC error, // otherwise it returns the specific gRPC code. return status.Code(err) == codes.NotFound } // TODO replace with LRO wait when it's fixed // waitForOperation polls the LRO until it is done. func (c *vertexAiClient) waitForOperation(ctx context.Context, appName, userId, sessionID string) (*localSession, error) { const ( maxRetries = 10 baseDelay = time.Second maxDelay = 5 * time.Second ) for i := range maxRetries { // Get the latest status of the operation. ls, err := c.getSession(ctx, &session.GetRequest{AppName: appName, UserID: userId, SessionID: sessionID}) if err != nil { // Basic retry on "not found" which might be due to propagation if i < maxRetries-1 && isNotFoundError(err) { delay := min(time.Duration(i*i)*baseDelay, maxDelay) time.Sleep(delay) continue } return nil, fmt.Errorf("error getting operation '%s': %w", sessionID, err) } else { return ls, nil } } return nil, fmt.Errorf("LRO '%s' timed out after %d retries", sessionID, maxRetries) } func (c *vertexAiClient) getSession(ctx context.Context, req *session.GetRequest) (*localSession, error) { reasoningEngine, err := c.getReasoningEngineID(req.AppName) if err != nil { return nil, err } sessRpcReq := &aiplatformpb.GetSessionRequest{ Name: sessionNameByID(req.SessionID, c, reasoningEngine), } sessRpcResp, err := c.rpcClient.GetSession(ctx, sessRpcReq) if err != nil { return nil, fmt.Errorf("error fetching session: %w", err) } if sessRpcResp == nil { return nil, fmt.Errorf("session %+v not found", req.SessionID) } if sessRpcResp.UserId != req.UserID { return nil, fmt.Errorf("session %s does not belong to user %s", req.SessionID, req.UserID) } return &localSession{ appName: req.AppName, userID: req.UserID, sessionID: req.SessionID, updatedAt: sessRpcResp.UpdateTime.AsTime(), state: filterNilValues(sessRpcResp.SessionState.AsMap()), }, nil } func (c *vertexAiClient) listSessions(ctx context.Context, req *session.ListRequest) ([]session.Session, error) { sessions := make([]session.Session, 0) reasoningEngine, err := c.getReasoningEngineID(req.AppName) if err != nil { return nil, err } rpcReq := &aiplatformpb.ListSessionsRequest{ Parent: fmt.Sprintf(engineResourceTemplate, c.projectID, c.location, reasoningEngine), } if req.UserID != "" { rpcReq.Filter = fmt.Sprintf("userId=\"%s\"", req.UserID) } it := c.rpcClient.ListSessions(ctx, rpcReq) for { rpcResp, err := it.Next() if err == iterator.Done { break } if err != nil { return nil, fmt.Errorf("error creating session list: %w", err) } id, err := sessionIdBySessionName(rpcResp.Name) if err != nil { return nil, fmt.Errorf("error creating session list: %w", err) } session := &localSession{ appName: req.AppName, userID: rpcResp.UserId, sessionID: id, state: filterNilValues(rpcResp.SessionState.AsMap()), updatedAt: rpcResp.UpdateTime.AsTime(), } sessions = append(sessions, session) } return sessions, nil } func filterNilValues(originalMap map[string]any) map[string]any { if originalMap == nil { return nil } filteredMap := make(map[string]any) for key, value := range originalMap { if value != nil { filteredMap[key] = value } } return filteredMap } func (c *vertexAiClient) deleteSession(ctx context.Context, req *session.DeleteRequest) error { reasoningEngine, err := c.getReasoningEngineID(req.AppName) if err != nil { return err } lro, err := c.rpcClient.DeleteSession(ctx, &aiplatformpb.DeleteSessionRequest{ Name: sessionNameByID(req.SessionID, c, reasoningEngine), }) if err != nil { return fmt.Errorf("error deleting session: %w", err) } return lro.Wait(ctx) } func (c *vertexAiClient) appendEvent(ctx context.Context, appName, sessionID string, event *session.Event) error { // ignore partial events if event.Partial { return nil } reasoningEngine, err := c.getReasoningEngineID(appName) if err != nil { return err } var eventState *aiplatformpb.EventActions // Convert and set the initial state if provided if len(event.Actions.StateDelta) > 0 { sessionState, err := structpb.NewStruct(event.Actions.StateDelta) if err != nil { return fmt.Errorf("failed to convert state to structpb: %w", err) } eventState = &aiplatformpb.EventActions{StateDelta: sessionState} } content, err := createAiplatformpbContent(event) if err != nil { return fmt.Errorf("error creating content: %w", err) } metadata, err := createAiplatformpbMetadata(event) if err != nil { return fmt.Errorf("error creating metadata: %w", err) } _, err = c.rpcClient.AppendEvent(ctx, &aiplatformpb.AppendEventRequest{ Name: sessionNameByID(sessionID, c, reasoningEngine), Event: &aiplatformpb.SessionEvent{ Timestamp: ×tamppb.Timestamp{ Seconds: event.Timestamp.Unix(), Nanos: int32(event.Timestamp.Nanosecond()), }, Author: event.Author, InvocationId: event.InvocationID, Content: content, Actions: eventState, EventMetadata: metadata, ErrorCode: event.ErrorCode, ErrorMessage: event.ErrorMessage, }, }) if err != nil { return fmt.Errorf("error appending event: %w", err) } return nil } func (c *vertexAiClient) listSessionEvents(ctx context.Context, appName, sessionID string, after time.Time, numRecentEvents int) ([]*session.Event, error) { reasoningEngine, err := c.getReasoningEngineID(appName) if err != nil { return nil, err } events := make([]*session.Event, 0) eventsRpcReq := &aiplatformpb.ListEventsRequest{ Parent: sessionNameByID(sessionID, c, reasoningEngine), } if !after.IsZero() { eventsRpcReq.Filter = fmt.Sprintf("timestamp>=%q", after.Format("2006-01-02T15:04:05-07:00")) } it := c.rpcClient.ListEvents(ctx, eventsRpcReq) for { rpcResp, err := it.Next() if err == iterator.Done { break } if err != nil { return nil, fmt.Errorf("error fetching session events: %w", err) } content := aiplatformToGenaiContent(rpcResp) id, err := sessionIdBySessionName(rpcResp.Name) if err != nil { return nil, fmt.Errorf("error fetching session events: %w", err) } event := &session.Event{ ID: id, Timestamp: rpcResp.Timestamp.AsTime(), InvocationID: rpcResp.InvocationId, Author: rpcResp.Author, Actions: session.EventActions{ StateDelta: filterNilValues(rpcResp.Actions.StateDelta.AsMap()), }, LLMResponse: model.LLMResponse{ Content: content, ErrorCode: rpcResp.ErrorCode, ErrorMessage: rpcResp.ErrorMessage, }, } if rpcResp.EventMetadata != nil { event.Branch = rpcResp.EventMetadata.Branch event.TurnComplete = rpcResp.EventMetadata.TurnComplete event.Partial = rpcResp.EventMetadata.Partial event.Interrupted = rpcResp.EventMetadata.Interrupted event.LongRunningToolIDs = rpcResp.EventMetadata.LongRunningToolIds event.GroundingMetadata = createGroundingMetadata(rpcResp.EventMetadata.GroundingMetadata) if rpcResp.EventMetadata.CustomMetadata != nil { event.CustomMetadata = rpcResp.EventMetadata.CustomMetadata.AsMap() } } events = append(events, event) } if numRecentEvents > 0 { if numRecentEvents > len(events) { return events, nil } return events[len(events)-numRecentEvents:], nil } return events, nil } func sessionIdBySessionName(sn string) (string, error) { idx := strings.LastIndex(sn, "/") if idx == -1 { return "", fmt.Errorf("invalid session name format %q: missing separator '/'", sn) } id := sn[idx+1:] if id == "" { return "", fmt.Errorf("invalid session name %q: empty session ID", sn) } return id, nil } func sessionIDByOperationName(on string) (string, error) { const sessionPrefix = "/sessions/" const opsSuffix = "/operations/" idxSession := strings.LastIndex(on, sessionPrefix) if idxSession == -1 { return "", fmt.Errorf("invalid operation name %q: missing %q", on, sessionPrefix) } // Calculate where the ID actually begins idStart := idxSession + len(sessionPrefix) idxOps := strings.LastIndex(on, opsSuffix) if idxOps == -1 { return "", fmt.Errorf("invalid operation name %q: missing %q", on, opsSuffix) } // ensure the start comes before the end // If idStart > idxOps, it means "/operations/" appeared before "/sessions/" // or they overlap in a weird way, which would cause a panic on slicing. if idStart > idxOps { return "", fmt.Errorf("invalid operation name %q: structure malformed or segments out of order", on) } id := on[idStart:idxOps] if id == "" { return "", fmt.Errorf("invalid operation name %q: empty session ID", on) } return id, nil } func sessionNameByID(id string, c *vertexAiClient, reasoningEngine string) string { return fmt.Sprintf(sessionResourceTemplate, c.projectID, c.location, reasoningEngine, id) } // (?:...) tells Go "match this, but don't save it in the results array". // We keep the (\d+) at the end as a capturing group. var reasoningEnginePattern = regexp.MustCompile(`^projects/(?:[a-zA-Z0-9-_]+)/locations/(?:[a-zA-Z0-9-_]+)/reasoningEngines/(\d+)$`) func (c *vertexAiClient) getReasoningEngineID(appName string) (string, error) { if c.reasoningEngine != "" { return c.reasoningEngine, nil } // Check if appName consists only of digits if _, err := strconv.Atoi(appName); err == nil { return appName, nil } // Execute the Regex matches := reasoningEnginePattern.FindStringSubmatch(appName) // With non-capturing groups, 'matches' will strictly have 2 elements if successful: // matches[0]: The full string (e.g., "projects/my-p/locations/...") // matches[1]: The first capturing group (the ID) if len(matches) < 2 { return "", fmt.Errorf("app name %q is not valid. It should be the full ReasoningEngine resource name or the reasoning engine numeric ID", appName) } return matches[1], nil } func aiplatformToGenaiContent(rpcResp *aiplatformpb.SessionEvent) *genai.Content { // TODO add logic for other types of parts var content *genai.Content if rpcResp.Content != nil { var parts []*genai.Part role := rpcResp.Content.Role for _, respPart := range rpcResp.Content.Parts { part := &genai.Part{} part.Thought = respPart.Thought part.ThoughtSignature = respPart.ThoughtSignature switch v := respPart.Data.(type) { case *aiplatformpb.Part_Text: part.Text = v.Text case *aiplatformpb.Part_InlineData: part.InlineData = &genai.Blob{ MIMEType: v.InlineData.MimeType, Data: v.InlineData.Data, } case *aiplatformpb.Part_FunctionCall: argsMap := v.FunctionCall.Args.AsMap() // Converts *structpb.Struct -> map[string]any part.FunctionCall = &genai.FunctionCall{ Name: v.FunctionCall.Name, Args: argsMap, } case *aiplatformpb.Part_FunctionResponse: responseMap := v.FunctionResponse.Response.AsMap() // Converts *structpb.Struct -> map[string]any part.FunctionResponse = &genai.FunctionResponse{ Name: v.FunctionResponse.Name, Response: responseMap, } } parts = append(parts, part) } content = &genai.Content{ Parts: parts, Role: role, } } return content } func createAiplatformpbContent(event *session.Event) (*aiplatformpb.Content, error) { // TODO add logic for other types of parts var content *aiplatformpb.Content if event.Content != nil { parts := make([]*aiplatformpb.Part, 0) for _, part := range event.Content.Parts { aiplatformPart := &aiplatformpb.Part{} aiplatformPart.Thought = part.Thought aiplatformPart.ThoughtSignature = part.ThoughtSignature if part.Text != "" { aiplatformPart.Data = &aiplatformpb.Part_Text{Text: part.Text} } if part.InlineData != nil { aiplatformPart.Data = &aiplatformpb.Part_InlineData{ InlineData: &aiplatformpb.Blob{ Data: part.InlineData.Data, MimeType: part.InlineData.MIMEType, }, } } if part.FunctionCall != nil { args, err := structpb.NewStruct(part.FunctionCall.Args) if err != nil { return nil, fmt.Errorf("failed to convert function call to structpb: %w", err) } aiplatformPart.Data = &aiplatformpb.Part_FunctionCall{ FunctionCall: &aiplatformpb.FunctionCall{ Id: part.FunctionCall.ID, Name: part.FunctionCall.Name, Args: args, }, } } if part.FunctionResponse != nil { response, err := structpb.NewStruct(part.FunctionResponse.Response) if err != nil { return nil, fmt.Errorf("failed to convert function response to structpb: %w", err) } aiplatformPart.Data = &aiplatformpb.Part_FunctionResponse{ FunctionResponse: &aiplatformpb.FunctionResponse{ Id: part.FunctionResponse.ID, Name: part.FunctionResponse.Name, Response: response, }, } } parts = append(parts, aiplatformPart) } content = &aiplatformpb.Content{ Parts: parts, Role: event.Content.Role, } } return content, nil } func createAiplatformpbMetadata(event *session.Event) (*aiplatformpb.EventMetadata, error) { if event == nil { return nil, nil } metadata := &aiplatformpb.EventMetadata{ Partial: event.Partial, TurnComplete: event.TurnComplete, Interrupted: event.Interrupted, LongRunningToolIds: event.LongRunningToolIDs, Branch: event.Branch, } if event.CustomMetadata != nil { customMetadata, err := structpb.NewStruct(event.CustomMetadata) if err != nil { return nil, fmt.Errorf("failed to convert event customMetadata to structpb: %w", err) } metadata.CustomMetadata = customMetadata } if event.GroundingMetadata != nil { metadata.GroundingMetadata = &aiplatformpb.GroundingMetadata{ WebSearchQueries: event.GroundingMetadata.WebSearchQueries, RetrievalQueries: event.GroundingMetadata.RetrievalQueries, GoogleMapsWidgetContextToken: &event.GroundingMetadata.GoogleMapsWidgetContextToken, } if event.GroundingMetadata.SearchEntryPoint != nil { metadata.GroundingMetadata.SearchEntryPoint = &aiplatformpb.SearchEntryPoint{ RenderedContent: event.GroundingMetadata.SearchEntryPoint.RenderedContent, SdkBlob: event.GroundingMetadata.SearchEntryPoint.SDKBlob, } } if event.GroundingMetadata.RetrievalMetadata != nil { metadata.GroundingMetadata.RetrievalMetadata = &aiplatformpb.RetrievalMetadata{ GoogleSearchDynamicRetrievalScore: event.GroundingMetadata.RetrievalMetadata.GoogleSearchDynamicRetrievalScore, } } var groundingChunks []*aiplatformpb.GroundingChunk for _, gc := range event.GroundingMetadata.GroundingChunks { if gc.Maps != nil { maps := &aiplatformpb.GroundingChunk_Maps{ Uri: &gc.Maps.URI, Title: &gc.Maps.Title, Text: &gc.Maps.Text, PlaceId: &gc.Maps.PlaceID, } if gc.Maps.PlaceAnswerSources != nil { var reviewSnippets []*aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources_ReviewSnippet for _, source := range gc.Maps.PlaceAnswerSources.ReviewSnippets { snippet := &aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources_ReviewSnippet{ ReviewId: source.Review, GoogleMapsUri: source.GoogleMapsURI, Title: source.Title, } reviewSnippets = append(reviewSnippets, snippet) } maps.PlaceAnswerSources = &aiplatformpb.GroundingChunk_Maps_PlaceAnswerSources{ ReviewSnippets: reviewSnippets, } } aiplGc := &aiplatformpb.GroundingChunk{ ChunkType: &aiplatformpb.GroundingChunk_Maps_{ Maps: maps, }, } groundingChunks = append(groundingChunks, aiplGc) } if gc.RetrievedContext != nil { retrievedContext := &aiplatformpb.GroundingChunk_RetrievedContext{ Uri: &gc.RetrievedContext.URI, Title: &gc.RetrievedContext.Title, Text: &gc.RetrievedContext.Text, DocumentName: &gc.RetrievedContext.DocumentName, } if gc.RetrievedContext.RAGChunk != nil && gc.RetrievedContext.RAGChunk.PageSpan != nil { retrievedContext.ContextDetails = &aiplatformpb.GroundingChunk_RetrievedContext_RagChunk{ RagChunk: &aiplatformpb.RagChunk{ Text: gc.RetrievedContext.RAGChunk.Text, PageSpan: &aiplatformpb.RagChunk_PageSpan{ FirstPage: gc.RetrievedContext.RAGChunk.PageSpan.FirstPage, LastPage: gc.RetrievedContext.RAGChunk.PageSpan.LastPage, }, }, } } aiplGc := &aiplatformpb.GroundingChunk{ ChunkType: &aiplatformpb.GroundingChunk_RetrievedContext_{ RetrievedContext: retrievedContext, }, } groundingChunks = append(groundingChunks, aiplGc) } if gc.Web != nil { web := &aiplatformpb.GroundingChunk_Web{ Uri: &gc.Web.URI, Title: &gc.Web.Title, } aiplGc := &aiplatformpb.GroundingChunk{ ChunkType: &aiplatformpb.GroundingChunk_Web_{ Web: web, }, } groundingChunks = append(groundingChunks, aiplGc) } } metadata.GroundingMetadata.GroundingChunks = groundingChunks var groundingSupports []*aiplatformpb.GroundingSupport for _, gs := range event.GroundingMetadata.GroundingSupports { aiplGs := &aiplatformpb.GroundingSupport{ GroundingChunkIndices: gs.GroundingChunkIndices, ConfidenceScores: gs.ConfidenceScores, } if gs.Segment != nil { aiplGs.Segment = &aiplatformpb.Segment{ PartIndex: gs.Segment.PartIndex, StartIndex: gs.Segment.StartIndex, EndIndex: gs.Segment.EndIndex, Text: gs.Segment.Text, } } groundingSupports = append(groundingSupports, aiplGs) } metadata.GroundingMetadata.GroundingSupports = groundingSupports } return metadata, nil } func createGroundingMetadata(metadata *aiplatformpb.GroundingMetadata) *genai.GroundingMetadata { if metadata == nil { return nil } out := &genai.GroundingMetadata{ WebSearchQueries: metadata.WebSearchQueries, RetrievalQueries: metadata.RetrievalQueries, } // Handle string pointer for Context Token out.GoogleMapsWidgetContextToken = derefString(metadata.GoogleMapsWidgetContextToken) // Search Entry Point if metadata.SearchEntryPoint != nil { out.SearchEntryPoint = &genai.SearchEntryPoint{ RenderedContent: metadata.SearchEntryPoint.RenderedContent, SDKBlob: metadata.SearchEntryPoint.SdkBlob, } } // Retrieval Metadata if metadata.RetrievalMetadata != nil { out.RetrievalMetadata = &genai.RetrievalMetadata{ GoogleSearchDynamicRetrievalScore: metadata.RetrievalMetadata.GoogleSearchDynamicRetrievalScore, } } // Grounding Chunks if len(metadata.GroundingChunks) > 0 { var chunks []*genai.GroundingChunk for _, chunk := range metadata.GroundingChunks { newChunk := &genai.GroundingChunk{} // Handle 'Maps' Chunk if maps := chunk.GetMaps(); maps != nil { newMaps := &genai.GroundingChunkMaps{ URI: derefString(maps.Uri), Title: derefString(maps.Title), Text: derefString(maps.Text), PlaceID: derefString(maps.PlaceId), } if maps.PlaceAnswerSources != nil { newMaps.PlaceAnswerSources = &genai.GroundingChunkMapsPlaceAnswerSources{} for _, snippet := range maps.PlaceAnswerSources.ReviewSnippets { newSnippet := &genai.GroundingChunkMapsPlaceAnswerSourcesReviewSnippet{ Review: snippet.ReviewId, GoogleMapsURI: snippet.GoogleMapsUri, } newMaps.PlaceAnswerSources.ReviewSnippets = append(newMaps.PlaceAnswerSources.ReviewSnippets, newSnippet) } } newChunk.Maps = newMaps } // Handle 'RetrievedContext' Chunk if rc := chunk.GetRetrievedContext(); rc != nil { newRC := &genai.GroundingChunkRetrievedContext{ URI: derefString(rc.Uri), Title: derefString(rc.Title), Text: derefString(rc.Text), DocumentName: derefString(rc.DocumentName), } // Handle RAG Chunk (oneof in pb, usually a nested struct in genai) if rag := rc.GetRagChunk(); rag != nil { newRC.RAGChunk = &genai.RAGChunk{ Text: rag.Text, } if rag.PageSpan != nil { newRC.RAGChunk.PageSpan = &genai.RAGChunkPageSpan{ FirstPage: rag.PageSpan.FirstPage, LastPage: rag.PageSpan.LastPage, } } } newChunk.RetrievedContext = newRC } // Handle 'Web' Chunk if web := chunk.GetWeb(); web != nil { newChunk.Web = &genai.GroundingChunkWeb{ URI: derefString(web.Uri), Title: derefString(web.Title), } } chunks = append(chunks, newChunk) } out.GroundingChunks = chunks } // Grounding Supports if len(metadata.GroundingSupports) > 0 { var supports []*genai.GroundingSupport for _, gs := range metadata.GroundingSupports { newSupport := &genai.GroundingSupport{ GroundingChunkIndices: gs.GroundingChunkIndices, ConfidenceScores: gs.ConfidenceScores, } if gs.Segment != nil { newSupport.Segment = &genai.Segment{ PartIndex: gs.Segment.PartIndex, StartIndex: gs.Segment.StartIndex, EndIndex: gs.Segment.EndIndex, Text: gs.Segment.Text, } } supports = append(supports, newSupport) } out.GroundingSupports = supports } return out } // derefString is a helper to safely dereference string pointers // Returns empty string if pointer is nil func derefString(s *string) string { if s == nil { return "" } return *s } ================================================ FILE: session/vertexai/vertexai_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package vertexai import ( "testing" ) func TestGetReasoningEngineID(t *testing.T) { tests := []struct { name string existingEngineID string // Field: c.reasoningEngine inputAppName string // Argument: appName expectedID string expectError bool }{ { name: "Client already has engine ID configured", existingEngineID: "999", inputAppName: "irrelevant-input", expectedID: "999", expectError: false, }, { name: "Input is a direct numeric ID", existingEngineID: "", inputAppName: "123456", expectedID: "123456", expectError: false, }, { name: "Input is a valid full resource path", existingEngineID: "", inputAppName: "projects/my-project/locations/us-central1/reasoningEngines/555123", expectedID: "555123", expectError: false, }, { name: "Input is valid path with dashes and underscores in project/location", existingEngineID: "", inputAppName: "projects/my_project-1/locations/us_central-1/reasoningEngines/888", expectedID: "888", expectError: false, }, { name: "Input is malformed (ID is not numeric)", existingEngineID: "", inputAppName: "projects/proj/locations/loc/reasoningEngines/abc", expectedID: "", expectError: true, }, { name: "Input is malformed (missing path components)", existingEngineID: "", inputAppName: "locations/us-central1/reasoningEngines/123", expectedID: "", expectError: true, }, { name: "Input is random text", existingEngineID: "", inputAppName: "some-random-app-name", expectedID: "", expectError: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Setup the client with the test case state c := &vertexAiClient{ reasoningEngine: tt.existingEngineID, } // Execute got, err := c.getReasoningEngineID(tt.inputAppName) // Check Error Expectation if (err != nil) != tt.expectError { t.Errorf("getReasoningEngineID() error = %v, expectError %v", err, tt.expectError) return } // Check Returned Value if got != tt.expectedID { t.Errorf("getReasoningEngineID() got = %v, want %v", got, tt.expectedID) } }) } } ================================================ FILE: telemetry/config.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package telemetry implements the open telemetry in ADK. package telemetry import ( sdklog "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "golang.org/x/oauth2/google" ) type config struct { // Enables/disables telemetry export to GCP. oTelToCloud bool // genAICaptureMessageContent enables/disables logging of message content. The default value is taken from OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT env variable. // If set to true, the message content will be logged in message body. Otherwise it will be elided. genAICaptureMessageContent bool // gcpResourceProject is used as the gcp.project.id resource attribute. // If it's empty, the project will be read from ADC or GOOGLE_CLOUD_PROJECT env variable. gcpResourceProject string // gcpQuotaProject is used as the quota project for the telemetry export. // If it's empty, the project will be read from ADC or GOOGLE_CLOUD_PROJECT env variable. gcpQuotaProject string // googleCredentials override the application default credentials. googleCredentials *google.Credentials // resource customizes the OTel resource. It will be merged with default detectors. resource *resource.Resource // spanProcessors registers additional span processors, e.g. for custom span exporters. spanProcessors []sdktrace.SpanProcessor // logProcessors registers additional log processors, e.g. for custom log exporters. logProcessors []sdklog.Processor // tracerProvider overrides the default TracerProvider. tracerProvider *sdktrace.TracerProvider // loggerProvider overrides the default LoggerProvider. loggerProvider *sdklog.LoggerProvider } // Option configures adk telemetry. type Option interface { apply(*config) error } type optionFunc func(*config) error func (fn optionFunc) apply(cfg *config) error { return fn(cfg) } // WithOtelToCloud enables/disables exporting telemetry to GCP. func WithOtelToCloud(value bool) Option { return optionFunc(func(cfg *config) error { cfg.oTelToCloud = value return nil }) } // WithGcpResourceProject sets the gcp.project.id resource attribute. func WithGcpResourceProject(project string) Option { return optionFunc(func(cfg *config) error { cfg.gcpResourceProject = project return nil }) } // WithGcpQuotaProject sets the quota project for the telemetry export. func WithGcpQuotaProject(projectID string) Option { return optionFunc(func(cfg *config) error { cfg.gcpQuotaProject = projectID return nil }) } // WithResource configures the OTel resource. func WithResource(r *resource.Resource) Option { return optionFunc(func(cfg *config) error { cfg.resource = r return nil }) } // WithGoogleCredentials overrides the application default credentials. func WithGoogleCredentials(c *google.Credentials) Option { return optionFunc(func(cfg *config) error { cfg.googleCredentials = c return nil }) } // WithSpanProcessors registers additional span processors. func WithSpanProcessors(p ...sdktrace.SpanProcessor) Option { return optionFunc(func(cfg *config) error { cfg.spanProcessors = append(cfg.spanProcessors, p...) return nil }) } // WithLogRecordProcessors registers additional log processors. func WithLogRecordProcessors(p ...sdklog.Processor) Option { return optionFunc(func(cfg *config) error { cfg.logProcessors = append(cfg.logProcessors, p...) return nil }) } // WithTracerProvider overrides the default TracerProvider with preconfigured instance. func WithTracerProvider(tp *sdktrace.TracerProvider) Option { return optionFunc(func(cfg *config) error { cfg.tracerProvider = tp return nil }) } // WithLoggerProvider overrides the default LoggerProvider with preconfigured instance. func WithLoggerProvider(lp *sdklog.LoggerProvider) Option { return optionFunc(func(cfg *config) error { cfg.loggerProvider = lp return nil }) } // WithGenAICaptureMessageContent overrides the default [config.genAICaptureMessageContent]. func WithGenAICaptureMessageContent(capture bool) Option { return optionFunc(func(cfg *config) error { cfg.genAICaptureMessageContent = capture return nil }) } ================================================ FILE: telemetry/setup_otel.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "context" "fmt" "os" "strings" "go.opentelemetry.io/contrib/detectors/gcp" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" sdklog "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "golang.org/x/oauth2" "golang.org/x/oauth2/google" ) func configure(ctx context.Context, opts ...Option) (*config, error) { cfg, err := configFromOpts(opts...) if err != nil { return nil, err } if cfg.oTelToCloud { // Load ADC if no credentials are provided in the config. if cfg.googleCredentials == nil { cfg.googleCredentials, err = google.FindDefaultCredentials(ctx, "https://www.googleapis.com/auth/cloud-platform") if err != nil { return nil, fmt.Errorf("failed to find default credentials: %w", err) } } quotaProject, err := resolveGcpQuotaProject(cfg) if err != nil { return nil, fmt.Errorf("failed to resolve GCP quota project: %w", err) } cfg.gcpQuotaProject = quotaProject resourceProject, err := resolveGcpResourceProject(cfg) if err != nil { return nil, fmt.Errorf("failed to resolve GCP resource project: %w", err) } cfg.gcpResourceProject = resourceProject } cfg.resource, err = resolveResource(ctx, cfg) if err != nil { return nil, fmt.Errorf("failed to resolve resource: %w", err) } spanProcessors, logProcessors, err := configureExporters(ctx, cfg) if err != nil { return nil, fmt.Errorf("failed to configure exporters: %w", err) } cfg.spanProcessors = append(cfg.spanProcessors, spanProcessors...) cfg.logProcessors = append(cfg.logProcessors, logProcessors...) return cfg, nil } func configFromOpts(opts ...Option) (*config, error) { cfg := &config{ genAICaptureMessageContent: strings.TrimSpace(os.Getenv("OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT")) == "true", } for _, opt := range opts { if err := opt.apply(cfg); err != nil { return nil, fmt.Errorf("failed to apply option: %w", err) } } return cfg, nil } func newInternal(cfg *config) (*Providers, error) { tp := initTracerProvider(cfg) lp := initLoggerProvider(cfg) // TODO(#479) init meter provider return &Providers{ TracerProvider: tp, genAICaptureMessageContent: cfg.genAICaptureMessageContent, LoggerProvider: lp, }, nil } // resolveGcpQuotaProject determines the quota project for telemetry export in the following order: // 1. config.gcpQuotaProject, if present. // 2. Project ID from credentials, if present. // 3. GOOGLE_CLOUD_PROJECT environment variable. // Returns the quota project or error if the quota project cannot be determined. func resolveGcpQuotaProject(cfg *config) (string, error) { return resolveProject(cfg.gcpQuotaProject, cfg.googleCredentials, cfg.oTelToCloud, "quota") } // resolveGcpResourceProject determines the resource project for telemetry export in the following order: // 1. config.gcpResourceProject, if present. // 2. Project ID from credentials, if present. // 3. GOOGLE_CLOUD_PROJECT environment variable. // Returns the resource project or error if the resource project cannot be determined. func resolveGcpResourceProject(cfg *config) (string, error) { return resolveProject(cfg.gcpResourceProject, cfg.googleCredentials, cfg.oTelToCloud, "resource") } func resolveProject(configuredProject string, creds *google.Credentials, requireProject bool, projectType string) (string, error) { configuredProject = strings.TrimSpace(configuredProject) if configuredProject != "" { return configuredProject, nil } if creds != nil && creds.ProjectID != "" { return creds.ProjectID, nil } // The project was always empty during testing, even though it was set in ADC JSON file. // Using fallback to env variable to resolve the project as a workaround. project := strings.TrimSpace(os.Getenv("GOOGLE_CLOUD_PROJECT")) if requireProject && project == "" { return "", fmt.Errorf("telemetry.googleapis.com requires setting the %s project. Refer to telemetry.config for the available options to set the %s project", projectType, projectType) } return project, nil } // resolveResource creates a new resource with attributes specified in the following order (later attributes override earlier ones): // 1. [resource.Default()] populates the resource labels from environment variables like OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES. // 2. GCP related attributes when otelToCloud is enabled or gcpResourceProject is set - `gcp.project_id` attribute needed by Cloud Trace and other attributes provided by [gcp.NewDetector()]. // 3. GCP detector adds runtime attributes if ADK runs on one of supported platforms (e.g. GCE, GKE, CloudRun). // 4. Resource from config, if present. func resolveResource(ctx context.Context, cfg *config) (*resource.Resource, error) { r := resource.Default() opts := []resource.Option{ resource.WithAttributes( attribute.Key("gcp.project_id").String(cfg.gcpResourceProject), ), } if cfg.oTelToCloud { // Add GCP specific detectors. opts = append(opts, resource.WithDetectors(gcp.NewDetector())) } var err error gcpResource, err := resource.New(ctx, opts...) if err != nil { return nil, fmt.Errorf("failed to create GCP resource: %w", err) } // Merge with the default resource. r, err = resource.Merge(r, gcpResource) if err != nil { return nil, fmt.Errorf("failed to merge default and GCP resources: %w", err) } // Lastly, merge with the resource from config. if cfg.resource != nil { r, err = resource.Merge(r, cfg.resource) if err != nil { return nil, fmt.Errorf("failed to merge with config resource: %w", err) } } return r, nil } // configureExporters initializes OTel exporters from environment variables and otelToCloud. func configureExporters(ctx context.Context, cfg *config) ([]sdktrace.SpanProcessor, []sdklog.Processor, error) { var spanProcessors []sdktrace.SpanProcessor var logProcessors []sdklog.Processor otelEndpointEnv := strings.TrimSpace(os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")) // Tracing section. otelTracesEndpointEnv := strings.TrimSpace(os.Getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT")) if otelEndpointEnv != "" || otelTracesEndpointEnv != "" { exporter, err := otlptracehttp.New(ctx) if err != nil { return nil, nil, fmt.Errorf("failed to create OTLP HTTP exporter: %w", err) } spanProcessors = append(spanProcessors, sdktrace.NewBatchSpanProcessor( exporter, )) } if cfg.oTelToCloud { spanExporter, err := newGcpSpanExporter(ctx, cfg) if err != nil { return nil, nil, fmt.Errorf("failed to create GCP span exporter: %w", err) } spanProcessors = append(spanProcessors, sdktrace.NewBatchSpanProcessor(spanExporter)) } // Logs section. otelLogsEndpointEnv := strings.TrimSpace(os.Getenv("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT")) if otelEndpointEnv != "" || otelLogsEndpointEnv != "" { exporter, err := otlploghttp.New(ctx) if err != nil { return nil, nil, fmt.Errorf("failed to create OTLP HTTP log exporter: %w", err) } logProcessors = append(logProcessors, sdklog.NewBatchProcessor( exporter, )) } // Golang OTel exporter to CloudLogging is not yet available. return spanProcessors, logProcessors, nil } func initTracerProvider(cfg *config) *sdktrace.TracerProvider { if cfg.tracerProvider != nil { return cfg.tracerProvider } if len(cfg.spanProcessors) == 0 { return nil } opts := []sdktrace.TracerProviderOption{ sdktrace.WithResource(cfg.resource), } for _, p := range cfg.spanProcessors { opts = append(opts, sdktrace.WithSpanProcessor(p)) } tp := sdktrace.NewTracerProvider(opts...) return tp } func initLoggerProvider(cfg *config) *sdklog.LoggerProvider { if cfg.loggerProvider != nil { return cfg.loggerProvider } if len(cfg.logProcessors) == 0 { return nil } opts := []sdklog.LoggerProviderOption{ sdklog.WithResource(cfg.resource), } for _, p := range cfg.logProcessors { opts = append(opts, sdklog.WithProcessor(p)) } lp := sdklog.NewLoggerProvider(opts...) return lp } func newGcpSpanExporter(ctx context.Context, cfg *config) (sdktrace.SpanExporter, error) { client := oauth2.NewClient(ctx, cfg.googleCredentials.TokenSource) return otlptracehttp.New(ctx, otlptracehttp.WithHTTPClient(client), otlptracehttp.WithEndpointURL("https://telemetry.googleapis.com/v1/traces"), // Pass the quota project id in headers to fix auth errors. // https://cloud.google.com/docs/authentication/adc-troubleshooting/user-creds otlptracehttp.WithHeaders(map[string]string{ "x-goog-user-project": cfg.gcpQuotaProject, })) } ================================================ FILE: telemetry/telemetry.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package telemetry contains OpenTelemetry related functionality for ADK. package telemetry import ( "context" "errors" internal "google.golang.org/adk/internal/telemetry" "go.opentelemetry.io/otel" logglobal "go.opentelemetry.io/otel/log/global" sdklog "go.opentelemetry.io/otel/sdk/log" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // Providers wraps all telemetry providers and provides [Shutdown] function. type Providers struct { genAICaptureMessageContent bool // TracerProvider is the configured TracerProvider or nil. TracerProvider *sdktrace.TracerProvider // LoggerProvider is the configured LoggerProvider or nil. LoggerProvider *sdklog.LoggerProvider } // Shutdown shuts down underlying OTel providers. func (t *Providers) Shutdown(ctx context.Context) error { var err error if t.TracerProvider != nil { if tpErr := t.TracerProvider.Shutdown(ctx); tpErr != nil { err = errors.Join(err, tpErr) } } if t.LoggerProvider != nil { if lpErr := t.LoggerProvider.Shutdown(ctx); lpErr != nil { err = errors.Join(err, lpErr) } } return err } // SetGlobalOtelProviders registers the configured providers as the global OTel providers. func (t *Providers) SetGlobalOtelProviders() { internal.SetGenAICaptureMessageContent(t.genAICaptureMessageContent) if t.TracerProvider != nil { otel.SetTracerProvider(t.TracerProvider) } if t.LoggerProvider != nil { logglobal.SetLoggerProvider(t.LoggerProvider) } } // New initializes telemetry providers: TraceProvider, LogProvider, and MeterProvider. // Options can be used to customize the defaults, e.g. use custom credentials, add SpanProcessors, or use preconfigured TraceProvider. // Telemetry providers have to be registered in the global OTel providers either manually or via [Providers.SetGlobalOtelProviders]. // If your library doesn't use the global providers, you can use the providers directly and pass them to the instrumented libraries. // // # Usage // // import ( // "context" // "log" // "time" // // "go.opentelemetry.io/otel/sdk/resource" // semconv "go.opentelemetry.io/otel/semconv/v1.36.0" // "google.golang.org/adk/telemetry" // ) // // func main() { // ctx := context.Background() // res, err := resource.New(ctx, // resource.WithAttributes( // semconv.ServiceNameKey.String("my-service"), // semconv.ServiceVersionKey.String("1.0.0"), // ), // ) // if err != nil { // log.Fatalf("failed to create resource: %v", err) // } // // telemetryProviders, err := telemetry.New(ctx, // telemetry.WithOtelToCloud(true), // telemetry.WithResource(res), // ) // if err != nil { // log.Fatal(err) // } // defer func() { // shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // defer cancel() // if err := telemetryProviders.Shutdown(shutdownCtx); err != nil { // log.Printf("telemetry shutdown failed: %v", err) // } // }() // telemetryProviders.SetGlobalOtelProviders() // // tp := telemetryProviders.TracerProvider // instrumentedlib.SetTracerProvider(tp) // Set TracerProvider manually if your lib doesn't use the global provider. // // // app code // } // // The caller must call [Providers.Shutdown] method to gracefully shut down the underlying telemetry and release resources. func New(ctx context.Context, opts ...Option) (*Providers, error) { cfg, err := configure(ctx, opts...) if err != nil { return nil, err } return newInternal(cfg) } ================================================ FILE: telemetry/telemetry_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package telemetry import ( "context" "testing" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/log" sdklog "go.opentelemetry.io/otel/sdk/log" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/sdk/trace/tracetest" semconv "go.opentelemetry.io/otel/semconv/v1.36.0" "go.opentelemetry.io/otel/trace" "golang.org/x/oauth2/google" ) const ( resourceProject = "resource-project" quotaProject = "quota-project" ) func TestTelemetrySmoke(t *testing.T) { exporter := tracetest.NewInMemoryExporter() logExporter := &inMemoryLogExporter{} ctx := t.Context() // Initialize telemetry. serviceName := "test-service" serviceVersion := "1.2.3" r, err := resource.New(ctx, resource.WithAttributes( semconv.ServiceNameKey.String(serviceName), semconv.ServiceVersionKey.String(serviceVersion), )) if err != nil { t.Fatalf("failed to create resource: %v", err) } providers, err := New(t.Context(), WithSpanProcessors(sdktrace.NewSimpleSpanProcessor(exporter)), WithLogRecordProcessors(sdklog.NewSimpleProcessor(logExporter)), WithGcpResourceProject(resourceProject), WithGcpQuotaProject(quotaProject), WithResource(r), ) if err != nil { t.Fatalf("failed to create telemetry: %v", err) } t.Cleanup(func() { if err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil { t.Errorf("telemetry.Shutdown() failed: %v", err) } }) providers.SetGlobalOtelProviders() // Create test tracer. tracer := otel.Tracer("test-tracer") spanName := "test-span" _, span := tracer.Start(ctx, spanName, trace.WithSpanKind(trace.SpanKindServer)) span.End() // Create test logger and log. logger := providers.LoggerProvider.Logger("test-logger") logBody := "test-log" var record log.Record record.SetBody(log.StringValue(logBody)) logger.Emit(ctx, record) if err := providers.TracerProvider.ForceFlush(context.Background()); err != nil { t.Fatalf("failed to flush spans: %v", err) } if err := providers.LoggerProvider.ForceFlush(context.Background()); err != nil { t.Fatalf("failed to flush logs: %v", err) } // Check exporter contains the span. spans := exporter.GetSpans() if len(spans) != 1 { t.Fatalf("got %d spans, want 1", len(spans)) } gotSpan := spans[0] if gotSpan.Name != spanName { t.Errorf("got span name %q, want %q", gotSpan.Name, spanName) } gotResourceProject, gotServiceName, gotServiceVersion := extractResourceAttributes(gotSpan.Resource) if gotResourceProject != resourceProject { t.Errorf("want 'gcp.project_id' attribute %q, got %q", resourceProject, gotResourceProject) } if gotServiceName != serviceName { t.Errorf("want 'service.name' attribute %q, got %q", serviceName, gotServiceName) } if gotServiceVersion != serviceVersion { t.Errorf("want 'service.version' attribute %q, got %q", serviceVersion, gotServiceVersion) } // Check exporter contains the log. if len(logExporter.records) != 1 { t.Fatalf("got %d log records, want 1", len(logExporter.records)) } gotLog := logExporter.records[0] if gotLog.Body().AsString() != logBody { t.Errorf("got log body %q, want %q", gotLog.Body().AsString(), logBody) } if err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil { t.Errorf("telemetry.Shutdown() failed: %v", err) } if len(exporter.GetSpans()) != 0 { t.Errorf("expected no spans after shutdown, got %d", len(exporter.GetSpans())) } } func TestTelemetryCustomProvider(t *testing.T) { exporter := tracetest.NewInMemoryExporter() tp := sdktrace.NewTracerProvider( sdktrace.WithSpanProcessor(sdktrace.NewSimpleSpanProcessor(exporter)), ) unusedExporter := tracetest.NewInMemoryExporter() ctx := t.Context() // Initialize telemetry with custom provider. providers, err := New(t.Context(), WithTracerProvider(tp), WithSpanProcessors(sdktrace.NewSimpleSpanProcessor(unusedExporter)), ) if err != nil { t.Fatalf("failed to create telemetry: %v", err) } t.Cleanup(func() { if err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil { t.Errorf("telemetry.Shutdown() failed: %v", err) } }) providers.SetGlobalOtelProviders() // Create test tracer and span. tracer := otel.Tracer("test-tracer") spanName := "test-span" _, span := tracer.Start(ctx, spanName) span.End() if err := providers.TracerProvider.ForceFlush(context.Background()); err != nil { t.Fatalf("failed to flush spans: %v", err) } // Verify span was exported. spans := exporter.GetSpans() if len(spans) != 1 { t.Fatalf("got %d spans, want 1", len(spans)) } if spans[0].Name != spanName { t.Errorf("got span name %q, want %q", spans[0].Name, spanName) } // Unused exporter should not have any spans. if len(unusedExporter.GetSpans()) != 0 { t.Fatalf("got %d spans, want 0", len(unusedExporter.GetSpans())) } } func TestTelemetryCustomLoggerProvider(t *testing.T) { logExporter := &inMemoryLogExporter{} lp := sdklog.NewLoggerProvider( sdklog.WithProcessor(sdklog.NewSimpleProcessor(logExporter)), ) unusedLogExporter := &inMemoryLogExporter{} ctx := t.Context() // Initialize telemetry with custom logger provider. providers, err := New(t.Context(), WithLoggerProvider(lp), WithLogRecordProcessors(sdklog.NewSimpleProcessor(unusedLogExporter)), ) if err != nil { t.Fatalf("failed to create telemetry: %v", err) } t.Cleanup(func() { if err := providers.Shutdown(context.WithoutCancel(ctx)); err != nil { t.Errorf("telemetry.Shutdown() failed: %v", err) } }) providers.SetGlobalOtelProviders() // Create test logger and emit. logger := providers.LoggerProvider.Logger("test-logger") logBody := "test-log" var record log.Record record.SetBody(log.StringValue(logBody)) logger.Emit(ctx, record) if err := providers.LoggerProvider.ForceFlush(context.Background()); err != nil { t.Fatalf("failed to flush logs: %v", err) } // Verify log was exported. if len(logExporter.records) != 1 { t.Fatalf("got %d logs, want 1", len(logExporter.records)) } if logExporter.records[0].Body().AsString() != logBody { t.Errorf("got log body %q, want %q", logExporter.records[0].Body().AsString(), logBody) } // Unused exporter should not have any logs. if len(unusedLogExporter.records) != 0 { t.Fatalf("got %d logs, want 0", len(unusedLogExporter.records)) } } func extractResourceAttributes(res *resource.Resource) (projectID, serviceName, serviceVersion string) { for _, attr := range res.Attributes() { switch attr.Key { case "gcp.project_id": projectID = attr.Value.AsString() case semconv.ServiceNameKey: serviceName = attr.Value.AsString() case semconv.ServiceVersionKey: serviceVersion = attr.Value.AsString() } } return projectID, serviceName, serviceVersion } func TestResolveResourceProject(t *testing.T) { testCases := []struct { name string opts []Option envVar string wantProject string wantErr bool }{ { name: "project from options", opts: []Option{ WithOtelToCloud(true), WithGcpResourceProject("option-project"), WithGoogleCredentials(&google.Credentials{ProjectID: "cred-project"}), }, envVar: "env-project", wantProject: "option-project", }, { name: "project from credentials", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{ProjectID: "cred-project"}), }, envVar: "env-project", wantProject: "cred-project", }, { name: "project from env var", opts: []Option{ WithOtelToCloud(true), }, envVar: "env-project", wantProject: "env-project", }, { name: "no project", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{}), }, wantErr: true, }, { name: "no project no credentials", opts: []Option{ WithOtelToCloud(true), }, wantErr: true, }, { name: "env var whitespace", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{}), }, envVar: " ", wantErr: true, }, { name: "option project whitespace", opts: []Option{ WithOtelToCloud(true), WithGcpResourceProject(" "), }, wantErr: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // Always set the environment variable to avoid flakiness from ambient GOOGLE_CLOUD_PROJECT. t.Setenv("GOOGLE_CLOUD_PROJECT", tc.envVar) cfg, err := configFromOpts(tc.opts...) if err != nil { t.Fatalf("configFromOpts() unexpected error: %v", err) } gotProject, err := resolveGcpResourceProject(cfg) if (err != nil) != tc.wantErr { t.Fatalf("resolveGcpResourceProject() error = %v, wantErr %v", err, tc.wantErr) } if err != nil { return } if gotProject != tc.wantProject { t.Errorf("resolveGcpResourceProject() got = %v, want %v", gotProject, tc.wantProject) } }) } } func TestResolveQuotaProject(t *testing.T) { testCases := []struct { name string opts []Option envVar string wantProject string wantErr bool }{ { name: "project from options", opts: []Option{ WithOtelToCloud(true), WithGcpQuotaProject("option-project"), WithGoogleCredentials(&google.Credentials{ProjectID: "cred-project"}), }, envVar: "env-project", wantProject: "option-project", }, { name: "project from credentials", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{ProjectID: "cred-project"}), }, envVar: "env-project", wantProject: "cred-project", }, { name: "project from env var", opts: []Option{ WithOtelToCloud(true), }, envVar: "env-project", wantProject: "env-project", }, { name: "no project", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{}), }, wantErr: true, }, { name: "no project no credentials", opts: []Option{ WithOtelToCloud(true), }, wantErr: true, }, { name: "no project and otelToCloud disabled", opts: []Option{ WithOtelToCloud(false), WithGoogleCredentials(&google.Credentials{}), }, wantProject: "", }, { name: "env var whitespace", opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{}), }, envVar: " ", wantErr: true, }, { name: "option project whitespace", opts: []Option{ WithOtelToCloud(true), WithGcpQuotaProject(" "), }, wantErr: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // Always set the environment variable to avoid flakiness from ambient GOOGLE_CLOUD_PROJECT. t.Setenv("GOOGLE_CLOUD_PROJECT", tc.envVar) cfg, err := configFromOpts(tc.opts...) if err != nil { t.Fatalf("configFromOpts() unexpected error: %v", err) } gotProject, err := resolveGcpQuotaProject(cfg) if (err != nil) != tc.wantErr { t.Fatalf("resolveGcpQuotaProject() error = %v, wantErr %v", err, tc.wantErr) } if err != nil { return } if gotProject != tc.wantProject { t.Errorf("resolveGcpQuotaProject() got = %v, want %v", gotProject, tc.wantProject) } }) } } type inMemoryLogExporter struct { records []sdklog.Record } func (e *inMemoryLogExporter) Export(_ context.Context, records []sdklog.Record) error { e.records = append(e.records, records...) return nil } func (e *inMemoryLogExporter) Shutdown(context.Context) error { return nil } func (e *inMemoryLogExporter) ForceFlush(context.Context) error { return nil } type envVars struct { OTEL_EXPORTER_OTLP_ENDPOINT string OTEL_EXPORTER_OTLP_TRACES_ENDPOINT string OTEL_EXPORTER_OTLP_LOGS_ENDPOINT string } func TestConfigureExporters(t *testing.T) { testCases := []struct { name string envVars envVars opts []Option // The client address is nested deep inside the http client of the exporter, which is nested in a processor. // Accessing it via reflection is too brittle. The best thing we can do is a smoke test, which checks the number of created processors. wantSpanProcessors int wantLogProcessors int }{ { name: "no processors", envVars: envVars{}, wantSpanProcessors: 0, wantLogProcessors: 0, }, { name: "OTEL_EXPORTER_OTLP_ENDPOINT", envVars: envVars{ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318", }, wantSpanProcessors: 1, wantLogProcessors: 1, }, { name: "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", envVars: envVars{ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: "http://localhost:4318/v1/traces", }, wantSpanProcessors: 1, wantLogProcessors: 0, }, { name: "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT", envVars: envVars{ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: "http://localhost:4318/v1/logs", }, wantSpanProcessors: 0, wantLogProcessors: 1, }, { name: "OTEL_EXPORTER_OTLP_ENDPOINT and otel_to_cloud", envVars: envVars{ OTEL_EXPORTER_OTLP_ENDPOINT: "http://localhost:4318", }, opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{ProjectID: "test-project"}), }, wantSpanProcessors: 2, wantLogProcessors: 1, }, { name: "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT and otel_to_cloud", envVars: envVars{ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: "http://localhost:4318/v1/traces", }, opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{ProjectID: "test-project"}), }, wantSpanProcessors: 2, wantLogProcessors: 0, }, { name: "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT and otel_to_cloud", envVars: envVars{ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: "http://localhost:4318/v1/logs", }, opts: []Option{ WithOtelToCloud(true), WithGoogleCredentials(&google.Credentials{ProjectID: "test-project"}), }, wantSpanProcessors: 1, wantLogProcessors: 1, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { t.Setenv("OTEL_EXPORTER_OTLP_ENDPOINT", tc.envVars.OTEL_EXPORTER_OTLP_ENDPOINT) t.Setenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", tc.envVars.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) t.Setenv("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT", tc.envVars.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) // Set the quota project needed to configure GCP exporters. t.Setenv("GOOGLE_CLOUD_PROJECT", "test-project") ctx := t.Context() cfg, err := configure(ctx, tc.opts...) if err != nil { t.Fatalf("configure() unexpected error: %v", err) } spanProcessors, logProcessors, err := configureExporters(ctx, cfg) if err != nil { t.Fatalf("configureExporters() unexpected error: %v", err) } if len(spanProcessors) != tc.wantSpanProcessors { t.Errorf("got %d span processors, want %d", len(spanProcessors), tc.wantSpanProcessors) } if len(logProcessors) != tc.wantLogProcessors { t.Errorf("got %d log processors, want %d", len(logProcessors), tc.wantLogProcessors) } }) } } ================================================ FILE: tool/agenttool/agent_tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package agenttool provides a tool that allows an agent to call another agent. // This enables composition of agents, which can be useful for scenarios where // different types of `genai` tools cannot be used together. package agenttool import ( "encoding/json" "fmt" "strings" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/artifact" "google.golang.org/adk/internal/llminternal" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/internal/utils" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/runner" "google.golang.org/adk/session" "google.golang.org/adk/tool" ) // agentTool implements a tool that allows an agent to call another agent. type agentTool struct { agent agent.Agent skipSummarization bool } // Config holds the configuration for an agent tool. type Config struct { // SkipSummarization, if true, will cause the agent to skip summarization // after the sub-agent finishes execution. SkipSummarization bool } // New creates a new agent tool. // If cfg is nil, skipSummarization defaults to false. func New(agent agent.Agent, cfg *Config) tool.Tool { if cfg == nil { return &agentTool{ agent: agent, skipSummarization: false, } } return &agentTool{ agent: agent, skipSummarization: cfg.SkipSummarization, } } // Name implements tool.Tool. func (t *agentTool) Name() string { return t.agent.Name() } // Description implements tool.Tool. func (t *agentTool) Description() string { return t.agent.Description() } // IsLongRunning implements tool.Tool. func (t *agentTool) IsLongRunning() bool { return false } // Declaration returns the function declaration for the wrapped agent. // It generates a function declaration based on the agent's input schema. // If the agent does not have an input schema, a default schema with a // "request" string parameter is used. func (t *agentTool) Declaration() *genai.FunctionDeclaration { decl := &genai.FunctionDeclaration{ Name: t.Name(), Description: t.Description(), } var agentInputSchema *genai.Schema llmAgent, ok := t.agent.(llminternal.Agent) if ok && llmAgent != nil { // TODO - understand what build_function_declaration does in python and apply if needed. internalLlmAgent, ok := t.agent.(llminternal.Agent) if !ok { return nil } agentInputSchema = llminternal.Reveal(internalLlmAgent).InputSchema } if agentInputSchema != nil { decl.Parameters = agentInputSchema } else { decl.Parameters = &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "request": {Type: "STRING"}, }, Required: []string{"request"}, } } // TODO - understand how _api_variant affects response type. return decl } // Run executes the wrapped agent with the provided arguments. // It creates a new session for the sub-agent, runs the agent, and returns // the final result. func (t *agentTool) Run(toolCtx tool.Context, args any) (map[string]any, error) { margs, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("agentTool expects map[string]any arguments, got %T", args) } if t.skipSummarization { if actions := toolCtx.Actions(); actions != nil { actions.SkipSummarization = true } } var agentInputSchema *genai.Schema llmAgent, ok := t.agent.(llminternal.Agent) isLllmAgent := (ok && llmAgent != nil) if isLllmAgent { internalLlmAgent, ok := t.agent.(llminternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to llm agent") } agentInputSchema = llminternal.Reveal(internalLlmAgent).InputSchema } var content *genai.Content var err error if agentInputSchema != nil { if err = utils.ValidateMapOnSchema(margs, agentInputSchema, true); err != nil { return nil, fmt.Errorf("argument validation failed for agent %s: %w", t.agent.Name(), err) } jsonData, err := json.Marshal(margs) if err != nil { return nil, fmt.Errorf("error serializing tool arguments for agent %s: %w", t.agent.Name(), err) } content = genai.NewContentFromText(string(jsonData), genai.RoleUser) } else { input, ok := margs["request"] if !ok { return nil, fmt.Errorf("missing required argument 'request' for agent %s", t.agent.Name()) } inputText, ok := input.(string) if !ok { // Try to convert to string if not already one inputText = fmt.Sprint(input) } content = genai.NewContentFromText(inputText, genai.RoleUser) } sessionService := session.InMemoryService() r, err := runner.New(runner.Config{ AppName: t.agent.Name(), Agent: t.agent, SessionService: sessionService, // TODO - use forwarding_artifact_service as in python. ArtifactService: artifact.InMemoryService(), MemoryService: memory.InMemoryService(), }) if err != nil { return nil, fmt.Errorf("failed to create runner") } stateMap := make(map[string]any) for k, v := range toolCtx.State().All() { // Filter out adk internal states. if !strings.HasPrefix(k, "_adk") { stateMap[k] = v } } subSession, err := sessionService.Create(toolCtx, &session.CreateRequest{ AppName: t.agent.Name(), UserID: toolCtx.UserID(), State: stateMap, }) if err != nil { return nil, fmt.Errorf("failed to create session for sub-agent %s: %w", t.agent.Name(), err) } // TODO(dpasiukevich): verify agent loop termination. eventCh := r.Run(toolCtx, subSession.Session.UserID(), subSession.Session.ID(), content, agent.RunConfig{ StreamingMode: agent.StreamingModeSSE, }) var lastEvent *session.Event for event, err := range eventCh { if err != nil { return nil, fmt.Errorf("error during execution of sub-agent %s: %w", t.agent.Name(), err) } if event.ErrorCode != "" || event.ErrorMessage != "" { return nil, fmt.Errorf("error from sub-agent %q (code: %q, message: %q)", t.agent.Name(), event.ErrorCode, event.ErrorMessage) } if event.LLMResponse.Content != nil { lastEvent = event } } if lastEvent == nil { return map[string]any{}, nil } lastContent := lastEvent.LLMResponse.Content var textParts []string for _, part := range lastContent.Parts { if part != nil && part.Text != "" { textParts = append(textParts, part.Text) } } outputText := strings.Join(textParts, "\n") if outputText == "" { return map[string]any{}, nil } if isLllmAgent { internalLlmAgent, ok := t.agent.(llminternal.Agent) if !ok { return nil, fmt.Errorf("internal error: failed to convert to llm agent") } if agentOutputSchema := llminternal.Reveal(internalLlmAgent).OutputSchema; agentOutputSchema != nil { // Assuming schemautils.ValidateOutputSchema parses the JSON string outputText // and validates it against the agentOutputSchema, returning a map[string]any. parsedOutput, err := utils.ValidateOutputSchema(outputText, agentOutputSchema) if err != nil { return nil, fmt.Errorf("output validation failed for sub-agent %s: %w", t.agent.Name(), err) } return parsedOutput, nil } } return map[string]any{"result": outputText}, nil } // ProcessRequest adds the agent tool's function declaration to the LLM request. func (t *agentTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return toolutils.PackTool(req, t) } ================================================ FILE: tool/agenttool/agent_tool_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package agenttool_test import ( "log" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" ) func TestAgentTool_Declaration(t *testing.T) { inputSchema := &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "request": {Type: "STRING"}, }, Required: []string{"request"}, } agent := createAgent(t, inputSchema, nil) agentTool := agenttool.New(agent, nil) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } decl := toolImpl.Declaration() wantDecl := &genai.FunctionDeclaration{ Name: "math_agent", Description: "Solves math problems.", Parameters: &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "request": {Type: "STRING"}, }, Required: []string{"request"}, }, } if diff := cmp.Diff(wantDecl, decl); diff != "" { t.Errorf("Declaration() returned diff (-want +got):\n%s", diff) } } func TestAgentTool_DeclarationWithoutSchema(t *testing.T) { agent := createAgent(t, nil, nil) agentTool := agenttool.New(agent, nil) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } decl := toolImpl.Declaration() wantDecl := &genai.FunctionDeclaration{ Name: "math_agent", Description: "Solves math problems.", Parameters: &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "request": {Type: "STRING"}, }, Required: []string{"request"}, }, } if diff := cmp.Diff(wantDecl, decl); diff != "" { t.Errorf("Declaration() returned diff (-want +got):\n%s", diff) } } func TestAgentTool_Run_InputValidation(t *testing.T) { inputSchema := &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "is_magic": {Type: "BOOLEAN"}, "name": {Type: "STRING"}, }, Required: []string{"is_magic", "name"}, } agent := createAgent(t, inputSchema, nil) agentTool := agenttool.New(agent, nil) toolCtx := createToolContext(t, agent) tests := []struct { name string args map[string]any }{ { name: "extra_field", args: map[string]any{"is_magic": true, "name_invalid": "test_name", "name": "test"}, }, { name: "invalid_type", args: map[string]any{"is_magic": "invalid_type", "name": "test_name"}, }, { name: "missing_required", args: map[string]any{"is_magic": true}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } _, err := toolImpl.Run(toolCtx, tt.args) if err == nil { t.Fatalf("Run(%v) succeeded unexpectedly, wanted error", tt.args) } }) } } func TestAgentTool_Run_OutputValidation(t *testing.T) { outputSchema := &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "is_valid": {Type: "BOOLEAN"}, "message": {Type: "STRING"}, }, Required: []string{"is_valid", "message"}, } testLLM := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromText("{\"is_valid\": \"invalid type\", \"message\": \"success\"}", genai.RoleModel), }, } agent := createAgentWithModel(t, nil, outputSchema, testLLM) agentTool := agenttool.New(agent, nil) toolCtx := createToolContext(t, agent) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } _, err := toolImpl.Run(toolCtx, map[string]any{"request": "test"}) if err == nil { t.Fatalf("Run() succeeded unexpectedly, want error") } } func TestAgentTool_Run_Successful(t *testing.T) { inputSchema := &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "is_magic": {Type: "BOOLEAN"}, }, Required: []string{"is_magic"}, } outputSchema := &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "is_valid": {Type: "BOOLEAN"}, "message": {Type: "STRING"}, }, Required: []string{"is_valid", "message"}, } testLLM := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromText("{\"is_valid\": true, \"message\": \"success\"}", genai.RoleModel), }, } agent := createAgentWithModel(t, inputSchema, outputSchema, testLLM) agentTool := agenttool.New(agent, nil) toolCtx := createToolContext(t, agent) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } result, err := toolImpl.Run(toolCtx, map[string]any{"is_magic": true}) if err != nil { t.Fatalf("Run() failed unexpectedly: %v", err) } want := map[string]any{"is_valid": true, "message": "success"} if diff := cmp.Diff(want, result); diff != "" { t.Errorf("Run() result diff (-want +got):\n%s", diff) } } func TestAgentTool_Run_WithoutSchema(t *testing.T) { testLLM := &testutil.MockModel{ Responses: []*genai.Content{ { Parts: []*genai.Part{ {Text: "First text part is returned"}, {Text: " This should not be ignored"}, }, Role: genai.RoleModel, }, }, StreamResponsesCount: 1, } agent := createAgentWithModel(t, nil, nil, testLLM) agentTool := agenttool.New(agent, nil) toolCtx := createToolContext(t, agent) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } result, err := toolImpl.Run(toolCtx, map[string]any{"request": "magic"}) if err != nil { t.Fatalf("Run() failed unexpectedly: %v", err) } want := map[string]any{"result": "First text part is returned This should not be ignored"} if diff := cmp.Diff(want, result); diff != "" { t.Errorf("Run() result diff (-want +got):\n%s", diff) } } func TestAgentTool_Run_EmptyModelResponse(t *testing.T) { testLLM := &testutil.MockModel{ Responses: []*genai.Content{ {Role: genai.RoleModel}, // Empty content }, } agent := createAgentWithModel(t, nil, nil, testLLM) agentTool := agenttool.New(agent, nil) toolCtx := createToolContext(t, agent) toolImpl, ok := agentTool.(toolinternal.FunctionTool) if !ok { t.Fatal("agentTool does not implement FunctionTool") } result, err := toolImpl.Run(toolCtx, map[string]any{"request": "magic"}) if err != nil { t.Fatalf("Run() failed unexpectedly: %v", err) } want := map[string]any{} if diff := cmp.Diff(want, result); diff != "" { t.Errorf("Run() result diff (-want +got):\n%s", diff) } } func TestAgentTool_Run_SkipSummarization(t *testing.T) { testLLM := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromText("test response", genai.RoleModel), }, } agent := createAgentWithModel(t, nil, nil, testLLM) toolCtx := createToolContext(t, agent) // Test with skipSummarization = true agentToolSkip := agenttool.New(agent, &agenttool.Config{SkipSummarization: true}) actions := toolCtx.Actions() toolImpl, ok := agentToolSkip.(toolinternal.FunctionTool) if !ok { t.Fatal("agentToolSkip does not implement FunctionTool") } _, err := toolImpl.Run(toolCtx, map[string]any{"request": "magic"}) if err != nil { t.Fatalf("Run() with skipSummarization=true failed unexpectedly: %v", err) } if !actions.SkipSummarization { t.Errorf("SkipSummarization flag not set when AgentTool was created with skipSummarization=true") } // Test with skipSummarization = false agentToolNoSkip := agenttool.New(agent, &agenttool.Config{SkipSummarization: false}) toolImpl, ok = agentToolNoSkip.(toolinternal.FunctionTool) if !ok { t.Fatal("agentToolNoSkip does not implement FunctionTool") } actions.SkipSummarization = false // Reset // Reset mock for the second call testLLM.Responses = []*genai.Content{ genai.NewContentFromText("test response", genai.RoleModel), } testLLM.Requests = nil _, err = toolImpl.Run(toolCtx, map[string]any{"request": "magic"}) if err != nil { t.Fatalf("Run() with skipSummarization=false failed unexpectedly: %v", err) } if actions.SkipSummarization { t.Errorf("SkipSummarization flag was set when AgentTool was created with skipSummarization=false") } } func createAgent(t *testing.T, inputSchema, outputSchema *genai.Schema) agent.Agent { t.Helper() model, err := gemini.NewModel(t.Context(), "gemini-2.5-flash", &genai.ClientConfig{ APIKey: "FAKE_KEY", }) if err != nil { log.Fatalf("Failed to create model: %v", err) } agent, err := llmagent.New(llmagent.Config{ Name: "math_agent", Model: model, Description: "Solves math problems.", Instruction: "You solve math problems.", InputSchema: inputSchema, OutputSchema: outputSchema, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } return agent } func createAgentWithModel(t *testing.T, inputSchema, outputSchema *genai.Schema, llmModel model.LLM) agent.Agent { t.Helper() agent, err := llmagent.New(llmagent.Config{ Name: "math_agent", Model: llmModel, Description: "Solves math problems.", Instruction: "You solve math problems.", InputSchema: inputSchema, OutputSchema: outputSchema, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } return agent } func createToolContext(t *testing.T, testAgent agent.Agent) tool.Context { t.Helper() sessionService := session.InMemoryService() createResponse, err := sessionService.Create(t.Context(), &session.CreateRequest{ AppName: "testApp", UserID: "testUser", SessionID: "testSession", }) if err != nil { t.Fatalf("Failed to create session: %v", err) } ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Session: createResponse.Session, }) return toolinternal.NewToolContext(ctx, "", &session.EventActions{}, nil) } ================================================ FILE: tool/exampletool/tool.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package exampletool provides a tool that allows an agent to add (few-shot) examples to the LLM request. package exampletool import ( "fmt" "strings" "google.golang.org/genai" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) type Example struct { Input *genai.Content `json:"input"` Output []*genai.Content `json:"output"` } type ExampleToolConfig struct { Examples []*Example } // exampleTool is a tool that adds (few-shot) examples to the LLM request. type exampleTool struct { examples []*Example } func New(config ExampleToolConfig) (*exampleTool, error) { return &exampleTool{examples: config.Examples}, nil } // Name implements tool.Tool. func (s exampleTool) Name() string { return "example_tool" } // Description implements tool.Tool. func (s exampleTool) Description() string { return "example tool" } // ProcessRequest adds the exampleTool examples to the LLM request. func (s exampleTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { parts := ctx.UserContent().Parts if len(parts) == 0 || parts[0].Text == "" { return nil } instruction := buildExamplesSystemInstruction(s.examples, req.Model) utils.AppendInstructions(req, instruction) return nil } // IsLongRunning implements tool.Tool. func (t exampleTool) IsLongRunning() bool { return false } const ( examplesIntro = "\nBegin few-shot\nThe following are examples of user queries and model responses using the available tools.\n\n" examplesEnd = "End few-shot\n" exampleStart = "EXAMPLE %d:\nBegin example\n" exampleEnd = "End example\n\n" userPrefix = "[user]\n" modelPrefix = "[model]\n" functionPrefix = "```\n" functionCallPrefix = "```tool_code\n" functionCallSuffix = "\n```\n" functionResponsePrefix = "```tool_outputs\n" functionResponseSuffix = "\n```\n" ) // Converts a list of examples to a string that can be used in a system instruction. func buildExamplesSystemInstruction(examples []*Example, model string) string { var sb strings.Builder sb.WriteString(examplesIntro) for exampleNum, example := range examples { fmt.Fprintf(&sb, exampleStart, exampleNum+1) sb.WriteString(userPrefix) if example.Input != nil && len(example.Input.Parts) > 0 { for _, part := range example.Input.Parts { if part.Text != "" { safeText := strings.ReplaceAll(part.Text, "End few-shot", "[PROTECTED]") sb.WriteString(safeText) sb.WriteString("\n") } } } gemini2 := strings.Contains(model, "gemini-2") previousRole := "" for _, content := range example.Output { var role string if content.Role == "model" { role = modelPrefix } else { role = userPrefix } if role != previousRole { sb.WriteString(role) } previousRole = role for _, part := range content.Parts { if part.FunctionCall != nil { args := []string{} for k, v := range part.FunctionCall.Args { if _, ok := v.(string); ok { args = append(args, fmt.Sprintf("%s='%s'", k, v)) } else { args = append(args, fmt.Sprintf("%s=%v", k, v)) } } prefix := functionPrefix if gemini2 { prefix = functionCallPrefix } fmt.Fprintf(&sb, "%s%s(%s)%s", prefix, part.FunctionCall.Name, strings.Join(args, ", "), functionCallSuffix) } else if part.FunctionResponse != nil { prefix := functionPrefix if gemini2 { prefix = functionResponsePrefix } fmt.Fprintf(&sb, "%s%v%s", prefix, part.FunctionResponse, functionResponseSuffix) } else if part.Text != "" { // SANITIZATION: Again, protect the boundary tags safeText := strings.ReplaceAll(part.Text, "End few-shot", "[PROTECTED]") sb.WriteString(safeText) sb.WriteString("\n") } } } sb.WriteString(exampleEnd) } sb.WriteString(examplesEnd) return sb.String() } ================================================ FILE: tool/exampletool/tool_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package exampletool import ( "context" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/toolconfirmation" ) // --- mockToolContext --- type mockToolContext struct { context.Context userContent *genai.Content } func (m *mockToolContext) UserContent() *genai.Content { return m.userContent } // Implement other interface methods with panic or nil as needed for this specific test func (m *mockToolContext) FunctionCallID() string { return "" } func (m *mockToolContext) Actions() *session.EventActions { return &session.EventActions{} } func (m *mockToolContext) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { return nil, nil } func (m *mockToolContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return nil } func (m *mockToolContext) RequestConfirmation(hint string, payload any) error { return nil } func (m *mockToolContext) AgentName() string { return "mock_agent" } func (m *mockToolContext) ReadonlyState() session.ReadonlyState { return nil } func (m *mockToolContext) State() session.State { return nil } func (m *mockToolContext) Artifacts() agent.Artifacts { return nil } func (m *mockToolContext) InvocationID() string { return "mock_invocation" } func (m *mockToolContext) AppName() string { return "mock_app" } func (m *mockToolContext) Branch() string { return "mock_branch" } func (m *mockToolContext) SessionID() string { return "mock_session" } func (m *mockToolContext) UserID() string { return "mock_user" } // --- Tests --- func TestExampleTool_ProcessRequest(t *testing.T) { tests := []struct { name string examples []*Example userContent *genai.Content model string wantInstruct string }{ { name: "NoUserContent", examples: []*Example{{Input: genai.NewContentFromText("hi", "user"), Output: []*genai.Content{genai.NewContentFromText("hello", "model")}}}, userContent: &genai.Content{ Parts: []*genai.Part{}, }, model: "gemini-1.5-pro", wantInstruct: "", }, { name: "EmptyUserContentString", examples: []*Example{{Input: genai.NewContentFromText("hi", "user"), Output: []*genai.Content{genai.NewContentFromText("hello", "model")}}}, userContent: &genai.Content{ Parts: []*genai.Part{{Text: ""}}, }, model: "gemini-1.5-pro", wantInstruct: "", }, { name: "SimpleExample", examples: []*Example{ { Input: genai.NewContentFromText("input1", "user"), Output: []*genai.Content{genai.NewContentFromText("output1", "model")}, }, }, userContent: genai.NewContentFromText("user query", "user"), model: "gemini-1.5-pro", wantInstruct: ` Begin few-shot The following are examples of user queries and model responses using the available tools. EXAMPLE 1: Begin example [user] input1 [model] output1 End example End few-shot `, }, { name: "MultipleExamples", examples: []*Example{ { Input: genai.NewContentFromText("in1", "user"), Output: []*genai.Content{genai.NewContentFromText("out1", "model")}, }, { Input: genai.NewContentFromText("in2", "user"), Output: []*genai.Content{genai.NewContentFromText("out2", "model")}, }, }, userContent: genai.NewContentFromText("query", "user"), model: "gemini-1.5-pro", wantInstruct: ` Begin few-shot The following are examples of user queries and model responses using the available tools. EXAMPLE 1: Begin example [user] in1 [model] out1 End example EXAMPLE 2: Begin example [user] in2 [model] out2 End example End few-shot `, }, { name: "FunctionCallExample_Gemini1.5", examples: []*Example{ { Input: genai.NewContentFromText("call func", "user"), Output: []*genai.Content{ { Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "my_tool", Args: map[string]any{"arg1": "val1"}, }, }, }, }, { Role: "user", // Function response is usually from user/tool role Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: "my_tool", Response: map[string]any{"result": "ok"}, }, }, }, }, }, }, }, userContent: genai.NewContentFromText("query", "user"), model: "gemini-1.5-pro", wantInstruct: ` Begin few-shot The following are examples of user queries and model responses using the available tools. EXAMPLE 1: Begin example [user] call func [model] ` + "```" + ` my_tool(arg1='val1') ` + "```" + ` [user] ` + "```" + ` &{ [] my_tool map[result:ok]} ` + "```" + ` End example End few-shot `, }, { name: "FunctionCallExample_Gemini2", examples: []*Example{ { Input: genai.NewContentFromText("call func", "user"), Output: []*genai.Content{ { Role: "model", Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: "my_tool", Args: map[string]any{"arg1": "val1"}, }, }, }, }, { Role: "user", Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: "my_tool", Response: map[string]any{"result": "ok"}, }, }, }, }, }, }, }, userContent: genai.NewContentFromText("query", "user"), model: "gemini-2.0-flash", wantInstruct: ` Begin few-shot The following are examples of user queries and model responses using the available tools. EXAMPLE 1: Begin example [user] call func [model] ` + "```tool_code" + ` my_tool(arg1='val1') ` + "```" + ` [user] ` + "```tool_outputs" + ` &{ [] my_tool map[result:ok]} ` + "```" + ` End example End few-shot `, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { et, err := New(ExampleToolConfig{Examples: tc.examples}) if err != nil { t.Fatalf("New() error = %v", err) } req := &model.LLMRequest{ Model: tc.model, } ctx := &mockToolContext{ Context: context.Background(), userContent: tc.userContent, } err = et.ProcessRequest(ctx, req) if err != nil { t.Errorf("ProcessRequest() error = %v", err) } if tc.wantInstruct == "" { if req.Config != nil && req.Config.SystemInstruction != nil { t.Errorf("ProcessRequest() unexpected system instruction: got %v, want nil/empty", req.Config.SystemInstruction) } return } if req.Config == nil || req.Config.SystemInstruction == nil { t.Fatal("ProcessRequest() expected system instruction, got nil") } gotInstruct := req.Config.SystemInstruction.Parts[0].Text // Normalize newlines for comparison if needed, though exact match is best if diff := cmp.Diff(tc.wantInstruct, gotInstruct); diff != "" { t.Errorf("System instruction mismatch (-want +got):\n%s", diff) } }) } } func TestExampleTool_Interface(t *testing.T) { et, _ := New(ExampleToolConfig{}) var _ tool.Tool = et if et.Name() != "example_tool" { t.Errorf("Name() = %q, want %q", et.Name(), "example_tool") } if et.IsLongRunning() { t.Error("IsLongRunning() = true, want false") } } ================================================ FILE: tool/exitlooptool/tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package exitlooptool provides a tool that allows an agent to exit a loop. package exitlooptool import ( "fmt" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) func exitLoop(ctx tool.Context, myArgs struct{}) (map[string]string, error) { ctx.Actions().Escalate = true ctx.Actions().SkipSummarization = true return map[string]string{}, nil } // New creates an instance of an exitLoop tool. func New() (tool.Tool, error) { exitLoopTool, err := functiontool.New(functiontool.Config{ Name: "exit_loop", Description: "Exits the loop.\n\n Call this function only when you are instructed to do so.\n ", }, exitLoop) if err != nil { return nil, fmt.Errorf("error creating exit loop tool: %w", err) } return exitLoopTool, nil } ================================================ FILE: tool/exitlooptool/tool_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package exitlooptool_test import ( "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/agent/workflowagents/loopagent" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/tool" "google.golang.org/adk/tool/exitlooptool" ) // --- Test Suite --- func TestExitLoopToolExitsLoopAgent(t *testing.T) { // Define the structure for our test cases testCases := []struct { name string mockResponses []*genai.Content maxIterations uint want []*genai.Content }{ { name: "ExitLoopToolStopsMidLoop", mockResponses: []*genai.Content{ genai.NewContentFromText("response1", "model"), genai.NewContentFromText("response2", "model"), genai.NewContentFromFunctionCall("exit_loop", map[string]any{}, "model"), genai.NewContentFromText("this should not be processed", "model"), genai.NewContentFromText("this should not be processed", "model"), }, maxIterations: 5, want: []*genai.Content{ // Results from first GenerateStream call genai.NewContentFromText("response1", "model"), genai.NewContentFromText("response2", "model"), genai.NewContentFromFunctionCall("exit_loop", map[string]any{}, "model"), // Result from the tool execution genai.NewContentFromFunctionResponse("exit_loop", map[string]any{}, "user"), }, }, { name: "MaxIterationsStopsLoop", mockResponses: []*genai.Content{ // First iteration genai.NewContentFromText("iteration 1 response", "model"), // Second iteration genai.NewContentFromText("iteration 2 response", "model"), // This won't be reached genai.NewContentFromText("iteration 3 response", "model"), }, maxIterations: 2, want: []*genai.Content{ genai.NewContentFromText("iteration 1 response", "model"), genai.NewContentFromText("iteration 2 response", "model"), }, }, { name: "ExitLoopToolStopsImmediately", mockResponses: []*genai.Content{ genai.NewContentFromFunctionCall("exit_loop", map[string]any{}, "model"), genai.NewContentFromText("this should not be processed", "model"), genai.NewContentFromText("this should not be processed", "model"), }, maxIterations: 3, want: []*genai.Content{ genai.NewContentFromFunctionCall("exit_loop", map[string]any{}, "model"), genai.NewContentFromFunctionResponse("exit_loop", map[string]any{}, "user"), }, }, } // Iterate over the test cases for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { // 1. Setup mockModel := &testutil.MockModel{Responses: tc.mockResponses} exitLoopTool, err := exitlooptool.New() if err != nil { t.Fatalf("failed to create exit tool: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "simple agent", Model: mockModel, Tools: []tool.Tool{exitLoopTool}, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } looper, err := loopagent.New(loopagent.Config{ AgentConfig: agent.Config{ Name: "looper", SubAgents: []agent.Agent{a}, }, MaxIterations: tc.maxIterations, }) if err != nil { t.Fatalf("failed to create loop agent: %v", err) } runner := testutil.NewTestAgentRunner(t, looper) // 2. Execution and Assertion eventCount := 0 ev := runner.Run(t, "id", "message") for got, err := range ev { if err != nil { // Check if an error was expected t.Fatalf("runner returned unexpected error: %v", err) // If error was expected, we can stop here or check for a specific error type. return } if eventCount >= len(tc.want) { t.Fatalf("stream generated more values than the expected %d. Got: %+v", len(tc.want), got.Content) } if diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID")); diff != "" { t.Errorf("LoopAgent Run() mismatch (-want +got):\n%s", diff) } eventCount++ } // Final check on the number of events if eventCount != len(tc.want) { t.Errorf("unexpected stream length, want %d got %d", len(tc.want), eventCount) } }) } } ================================================ FILE: tool/functiontool/function.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package functiontool provides a tool that wraps a Go function. package functiontool import ( "errors" "fmt" "reflect" "runtime/debug" "github.com/google/jsonschema-go/jsonschema" "google.golang.org/genai" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/internal/typeutil" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) // FunctionTool: borrow implementation from MCP go. // Config is the input to the NewFunctionTool function. type Config struct { // The name of this tool. Name string // A human-readable description of the tool. Description string // An optional JSON schema object defining the expected parameters for the tool. // If it is nil, FunctionTool tries to infer the schema based on the handler type. InputSchema *jsonschema.Schema // An optional JSON schema object defining the structure of the tool's output. // If it is nil, FunctionTool tries to infer the schema based on the handler type. OutputSchema *jsonschema.Schema // IsLongRunning makes a FunctionTool a long-running operation. IsLongRunning bool // RequireConfirmation flags whether this tool must always ask for user confirmation // before execution. If set to true, the ADK framework will automatically initiate // a Human-in-the-Loop (HITL) confirmation request when this tool is invoked. RequireConfirmation bool // RequireConfirmationProvider allows for dynamic determination of whether // user confirmation is needed. This field is a function called at runtime to decide if // a confirmation request should be sent. The function takes the tool's input parameters as arguments. // This provider offers more flexibility than the static RequireConfirmation flag, // enabling conditional confirmation based on the invocation details. // If set, this often takes precedence over the RequireConfirmation flag. // // Required signature for a provider function: // func(toolInput ToolArgs) (bool) // where ToolArgs is the input type of your go function // Returning true means confirmation is required. RequireConfirmationProvider any } // Func represents a Go function that can be wrapped in a tool. // It takes a tool.Context and a generic argument type, and returns a generic result type. type Func[TArgs, TResults any] func(tool.Context, TArgs) (TResults, error) // ErrInvalidArgument indicates the input parameter type is invalid. var ErrInvalidArgument = errors.New("invalid argument") // New creates a new tool with a name, description, and the provided handler. // Input schema is automatically inferred from the input and output types. func New[TArgs, TResults any](cfg Config, handler Func[TArgs, TResults]) (tool.Tool, error) { // TODO: How can we improve UX for functions that does not require an argument, returns a simple type value, or returns a no result? // https://github.com/modelcontextprotocol/go-sdk/discussions/37 var zeroArgs TArgs argsType := reflect.TypeOf(zeroArgs) for argsType != nil && argsType.Kind() == reflect.Pointer { argsType = argsType.Elem() } if argsType == nil || (argsType.Kind() != reflect.Struct && argsType.Kind() != reflect.Map) { return nil, fmt.Errorf("input must be a struct or a map or a pointer to those types, but received: %v: %w", argsType, ErrInvalidArgument) } ischema, err := resolvedSchema[TArgs](cfg.InputSchema) if err != nil { return nil, fmt.Errorf("failed to infer input schema: %w", err) } oschema, err := resolvedSchema[TResults](cfg.OutputSchema) if err != nil { return nil, fmt.Errorf("failed to infer output schema: %w", err) } var confirmWrapper func(TArgs) bool if cfg.RequireConfirmationProvider != nil { // Attempt to cast the interface directly to the function signature fn, ok := cfg.RequireConfirmationProvider.(func(TArgs) bool) if !ok { return nil, fmt.Errorf("error RequireConfirmationProvider must be a function with signature func(%T) bool", *new(TArgs)) } confirmWrapper = fn } return &functionTool[TArgs, TResults]{ cfg: cfg, inputSchema: ischema, outputSchema: oschema, handler: handler, requireConfirmation: cfg.RequireConfirmation, requireConfirmationProvider: confirmWrapper, }, nil } // functionTool wraps a Go function. type functionTool[TArgs, TResults any] struct { cfg Config // A JSON Schema object defining the expected parameters for the tool. inputSchema *jsonschema.Resolved // A JSON Schema object defining the result of the tool. outputSchema *jsonschema.Resolved // handler is the Go function. handler Func[TArgs, TResults] requireConfirmation bool requireConfirmationProvider func(TArgs) bool } // Description implements tool.Tool. func (f *functionTool[TArgs, TResults]) Description() string { return f.cfg.Description } // Name implements tool.Tool. func (f *functionTool[TArgs, TResults]) Name() string { return f.cfg.Name } // IsLongRunning implements tool.Tool. func (f *functionTool[TArgs, TResults]) IsLongRunning() bool { return f.cfg.IsLongRunning } // ProcessRequest packs the function tool's declaration into the LLM request. func (f *functionTool[TArgs, TResults]) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return toolutils.PackTool(req, f) } // FunctionDeclaration implements interfaces.FunctionTool. func (f *functionTool[TArgs, TResults]) Declaration() *genai.FunctionDeclaration { decl := &genai.FunctionDeclaration{ Name: f.Name(), Description: f.Description(), } if f.inputSchema != nil { decl.ParametersJsonSchema = f.inputSchema.Schema() } if f.outputSchema != nil { decl.ResponseJsonSchema = f.outputSchema.Schema() } if f.cfg.IsLongRunning { instruction := "NOTE: This is a long-running operation. Do not call this tool again if it has already returned some intermediate or pending status." if decl.Description != "" { decl.Description += "\n\n" + instruction } else { decl.Description = instruction } } return decl } // Run executes the tool with the provided context and yields events. func (f *functionTool[TArgs, TResults]) Run(ctx tool.Context, args any) (result map[string]any, err error) { // TODO: Handle function call request from tc.InvocationContext. defer func() { if r := recover(); r != nil { err = fmt.Errorf("panic in tool %q: %v\nstack: %s", f.Name(), r, debug.Stack()) } }() m, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("unexpected args type, got: %T", args) } input, err := typeutil.ConvertToWithJSONSchema[map[string]any, TArgs](m, f.inputSchema) if err != nil { return nil, err } if confirmation := ctx.ToolConfirmation(); confirmation != nil { if !confirmation.Confirmed { return nil, fmt.Errorf("error tool %q %w", f.Name(), tool.ErrConfirmationRejected) } } else { requireConfirmation := f.requireConfirmation // Only run the potentially expensive provider if the static flag didn't already trigger it // Provider takes precedence/overrides: if f.requireConfirmationProvider != nil { requireConfirmation = f.requireConfirmationProvider(input) } if requireConfirmation { err := ctx.RequestConfirmation( fmt.Sprintf("Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.", f.Name()), nil) if err != nil { return nil, err } ctx.Actions().SkipSummarization = true return nil, fmt.Errorf("error tool %q %w", f.Name(), tool.ErrConfirmationRequired) } } output, err := f.handler(ctx, input) if err != nil { return nil, err } resp, err := typeutil.ConvertToWithJSONSchema[TResults, map[string]any](output, f.outputSchema) if err == nil { // all good return resp, nil } // Specs requires the result to be a map (dict in python). python impl allows basic types when building response event // functions.py __build_response_event does the following // if not isinstance(function_result, dict): // function_result = {'result': function_result} if f.outputSchema != nil { if err1 := f.outputSchema.Validate(output); err1 != nil { return resp, err // if it fails propagate original err. } } wrappedOutput := map[string]any{"result": output} return wrappedOutput, nil } // ** NOTE FOR REVIEWERS ** // Initially I started to borrow the design of the MCP ServerTool and // ToolHandlerFor/ToolHandler [1], but got diverged. // * MCP ServerTool provides direct access to mcp.CallToolResult message // but we expect Function in our case is a simple wrapper around a Go // function, and does not need to worry about how the result is translated // in genai.Content. // * Function returns only TResults, not (TResults, error). If the user // function can return an error, that needs to be included in the output // json schema. And for function that never returns an error, I think it // gets less uglier. // * MCP ToolHandler expects mcp.ServerSession. types.ToolContext may be close // to it, but we don't need to expose this to user function // (similar to ADK Python FunctionTool [2]) // References // [1] MCP SDK https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk@v0.0.0-20250625213837-ff0d746521c4/mcp#ToolHandler // [2] ADK Python https://github.com/google/adk-python/blob/04de3e197d7a57935488eb7bfa647c7ab62cd9d9/src/google/adk/tools/function_tool.py#L110-L112 func resolvedSchema[T any](override *jsonschema.Schema) (*jsonschema.Resolved, error) { // TODO: check if override schema is compatible with T. if override != nil { return override.Resolve(nil) } schema, err := jsonschema.For[T](nil) if err != nil { return nil, err } return schema.Resolve(nil) } ================================================ FILE: tool/functiontool/function_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package functiontool_test import ( "encoding/json" "errors" "fmt" "iter" "path/filepath" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/jsonschema-go/jsonschema" "google.golang.org/genai" "google.golang.org/adk/agent/llmagent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/typeutil" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/toolconfirmation" ) type SumArgs struct { A int `json:"a"` // an integer to sum B int `json:"b"` // another integer to sum } type SumResult struct { Sum int `json:"sum"` // the sum of two integers } func sumFunc(ctx tool.Context, input SumArgs) (SumResult, error) { return SumResult{Sum: input.A + input.B}, nil } func ExampleNew() { sumTool, err := functiontool.New(functiontool.Config{ Name: "sum", Description: "sums two integers", }, sumFunc) if err != nil { panic(err) } _ = sumTool // use the tool } func createToolContext(t *testing.T) tool.Context { invCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}) return toolinternal.NewToolContext(invCtx, "", &session.EventActions{}, nil) } //go:generate go test -v -httprecord=.* func TestFunctionTool_Simple(t *testing.T) { ctx := t.Context() // TODO: this model creation code was copied from model/genai_test.go. Refactor so both tests can share. modelName := "gemini-2.5-flash" replayTrace := filepath.Join("testdata", t.Name()+".httprr") cfg := testutil.NewGeminiTestClientConfig(t, replayTrace) m, err := gemini.NewModel(ctx, modelName, cfg) if err != nil { t.Fatalf("model.NewGeminiModel(%q) failed: %v", modelName, err) } type Args struct { City string `json:"city"` } type Result struct { Report string `json:"report"` Status string `json:"status"` } resultSet := map[string]Result{ "london": { Status: "success", Report: "The current weather in London is cloudy with a temperature of18 degrees Celsius and a chance of rain.", }, "paris": { Status: "success", Report: "The weather in Paris is sunny with a temperature of 25 derees Celsius.", }, } weatherReport := func(ctx tool.Context, input Args) (Result, error) { city := strings.ToLower(input.City) if ret, ok := resultSet[city]; ok { return ret, nil } return Result{}, fmt.Errorf("weather information for %q is not available", city) } weatherReportTool, err := functiontool.New( functiontool.Config{ Name: "get_weather_report", Description: "Retrieves the current weather report for a specified city.", }, weatherReport) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } for _, tc := range []struct { name string prompt string want Result isError bool }{ { name: "london", prompt: "Report the current weather of the capital city of U.K.", want: resultSet["london"], isError: false, }, { name: "paris", prompt: "How is the weather of Paris now?", want: resultSet["paris"], isError: false, }, { name: "new york", prompt: "Tell me about the current weather in New York", want: Result{}, isError: true, }, } { t.Run(tc.name, func(t *testing.T) { // TODO: replace with testing using LLMAgent, instead of directly calling the model. var req model.LLMRequest requestProcessor, ok := weatherReportTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("weatherReportTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("weatherReportTool.ProcessRequest failed: %v", err) } if req.Config == nil || len(req.Config.Tools) != 1 { t.Fatalf("weatherReportTool.ProcessRequest did not configure tool info in LLMRequest: %v", req) } req.Contents = genai.Text(tc.prompt) resp, err := readFirstResponse[*genai.FunctionCall]( m.GenerateContent(ctx, &req, false), ) if err != nil { t.Fatalf("GenerateContent(%v) failed: %v", req, err) } if resp.Name != "get_weather_report" || len(resp.Args) == 0 { t.Fatalf("unexpected function call %v", resp) } // Call the function. funcTool, ok := weatherReportTool.(toolinternal.FunctionTool) if !ok { t.Fatal("weatherReportTool does not implement itype.RequestProcessor") } callResult, err := funcTool.Run(createToolContext(t), resp.Args) if tc.isError { if err == nil { t.Fatalf("weatherReportTool.Run(%v) expected to fail but got success with result %v", resp.Args, callResult) } return } if err != nil { t.Fatalf("weatherReportTool.Run failed: %v", err) } got, err := typeutil.ConvertToWithJSONSchema[map[string]any, Result](callResult, nil) if err != nil { t.Fatalf("weatherReportTool.Run returned unexpected result of type %[1]T: %[1]v", callResult) } want := tc.want if diff := cmp.Diff(want, got); diff != "" { t.Errorf("weatherReportTool.Run returned unexpected result (-want +got):\n%s", diff) } }) } } func TestFunctionTool_DifferentFunctionDeclarations_ConsolidatedInOneGenAiTool(t *testing.T) { // First tool type IntInput struct { X int `json:"x"` } type IntOutput struct { Result int `json:"result"` } identityFunc := func(ctx tool.Context, input IntInput) (IntOutput, error) { return IntOutput{Result: input.X}, nil } identityTool, err := functiontool.New(functiontool.Config{ Name: "identity", Description: "returns the input value", }, identityFunc) if err != nil { panic(err) } // Second tool type StringInput struct { Value string `json:"value"` } type StringOutput struct { Result string `json:"result"` } stringIdentityFunc := func(ctx tool.Context, input StringInput) (StringOutput, error) { return StringOutput{Result: input.Value}, nil } stringIdentityTool, err := functiontool.New( functiontool.Config{ Name: "string_identity", Description: "returns the input value", }, stringIdentityFunc) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } var req model.LLMRequest requestProcessor, ok := identityTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("identityTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("identityTool.ProcessRequest failed: %v", err) } requestProcessor, ok = stringIdentityTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("stringIdentityTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("stringIdentityTool.ProcessRequest failed: %v", err) } if len(req.Config.Tools) != 1 { t.Errorf("number of tools should be one, got: %d", len(req.Config.Tools)) } if len(req.Config.Tools[0].FunctionDeclarations) != 2 { t.Errorf("number of function declarations should be two, got: %d", len(req.Config.Tools[0].FunctionDeclarations)) } } func TestFunctionTool_ReturnsBasicType(t *testing.T) { type Args struct { City string `json:"city"` } resultSet := map[string]string{ "london": "The current weather in London is cloudy with a temperature of18 degrees Celsius and a chance of rain.", "paris": "The weather in Paris is sunny with a temperature of 25 derees Celsius.", } weatherReport := func(ctx tool.Context, input Args) (string, error) { city := strings.ToLower(input.City) if ret, ok := resultSet[city]; ok { return ret, nil } return fmt.Sprintf("Weather information for %q is not available.", city), nil } weatherReportTool, err := functiontool.New( functiontool.Config{ Name: "get_weather_report", Description: "Retrieves the current weather report for a specified city.", }, weatherReport) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } for _, tc := range []struct { args map[string]any name string prompt string want string }{ { args: map[string]any{"city": "london"}, name: "london", prompt: "Report the current weather of the capital city of U.K.", want: resultSet["london"], }, { args: map[string]any{"city": "paris"}, name: "paris", prompt: "How is the weather of Paris now?", want: resultSet["paris"], }, { args: map[string]any{"city": "new york"}, name: "new york", prompt: "Tell me about the current weather in New York", want: `Weather information for "new york" is not available.`, }, } { t.Run(tc.name, func(t *testing.T) { // TODO: replace with testing using LLMAgent, instead of directly calling the model. var req model.LLMRequest requestProcessor, ok := weatherReportTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("weatherReportTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("weatherReportTool.ProcessRequest failed: %v", err) } if req.Config == nil || len(req.Config.Tools) != 1 { t.Fatalf("weatherReportTool.ProcessRequest did not configure tool info in LLMRequest: %v", req) } // Call the function. funcTool, ok := weatherReportTool.(toolinternal.FunctionTool) if !ok { t.Fatal("weatherReportTool does not implement itype.RequestProcessor") } callResult, err := funcTool.Run(createToolContext(t), tc.args) if err != nil { t.Fatalf("weatherReportTool.Run failed: %v", err) } got, err := typeutil.ConvertToWithJSONSchema[map[string]any, map[string]string](callResult, nil) if err != nil { t.Fatalf("weatherReportTool.Run returned unexpected result of type %[1]T: %[1]v", callResult) } gotVal, ok := got["result"] if !ok { t.Fatalf("function response, incorrect %q value", got["result"]) } want := tc.want if diff := cmp.Diff(want, gotVal); diff != "" { t.Errorf("weatherReportTool.Run returned unexpected result (-want +got):\n%s", diff) } }) } } func TestFunctionTool_MapInput(t *testing.T) { type Output struct { Sum int `json:"sum"` } sumTool, err := functiontool.New( functiontool.Config{ Name: "sum_map", Description: "sums numbers provided in a map input", }, func(ctx tool.Context, input map[string]int) (Output, error) { return Output{Sum: input["a"] + input["b"]}, nil }) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } funcTool, ok := sumTool.(toolinternal.FunctionTool) if !ok { t.Fatal("sumTool does not implement itype.RequestProcessor") } callResult, err := funcTool.Run(createToolContext(t), map[string]any{"a": 2, "b": 3}) if err != nil { t.Fatalf("sumTool.Run failed: %v", err) } got, err := typeutil.ConvertToWithJSONSchema[map[string]any, Output](callResult, nil) if err != nil { t.Fatalf("sumTool.Run returned unexpected result of type %[1]T: %[1]v", callResult) } want := Output{Sum: 5} if diff := cmp.Diff(want, got); diff != "" { t.Errorf("sumTool.Run returned unexpected result (-want +got):\n%s", diff) } } func readFirstResponse[T any](s iter.Seq2[*model.LLMResponse, error]) (T, error) { var zero T do := func(s iter.Seq2[*model.LLMResponse, error]) (any, error) { for resp, err := range s { if err != nil { return zero, err } if resp.Content == nil || len(resp.Content.Parts) == 0 { return zero, fmt.Errorf("encountered an empty response: %v", resp) } for _, p := range resp.Content.Parts { switch any(zero).(type) { case string: if p.Text != "" { return p.Text, nil } case *genai.FunctionCall: if p.FunctionCall != nil { return p.FunctionCall, nil } case *genai.FunctionResponse: if p.FunctionResponse != nil { return p.FunctionResponse, nil } } } return zero, fmt.Errorf("response does not contain data for %T: %v", zero, resp) } return zero, fmt.Errorf("no response message was received") } v, err := do(s) if err != nil { return zero, err } if v, ok := v.(T); ok { return v, nil } panic(fmt.Sprintf("do extracted unexpected type = %[1]T(%[1]v), want %T", v, zero)) } func TestFunctionTool_CustomSchema(t *testing.T) { type Args struct { // Either apple or orange, nothing else. Fruit string `json:"fruit"` } ischema, err := jsonschema.For[Args](nil) if err != nil { t.Fatalf("jsonschema.For[Args]() failed: %v", err) } fruit, ok := ischema.Properties["fruit"] if !ok { t.Fatalf("unexpeced jsonschema: missing 'fruit': %+v", ischema) } fruit.Description = "print the remaining quantity of the item." fruit.Enum = []any{"mandarin", "kiwi"} inventoryTool, err := functiontool.New(functiontool.Config{ Name: "print_quantity", Description: "print the remaining quantity of the given fruit.", InputSchema: ischema, }, func(ctx tool.Context, input Args) (any, error) { fruit := strings.ToLower(input.Fruit) if fruit != "mandarin" && fruit != "kiwi" { t.Errorf("unexpected fruit: %q", fruit) } return nil, nil // always return nil. }) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } t.Run("ProcessRequest", func(t *testing.T) { var req model.LLMRequest requestProcessor, ok := inventoryTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("inventoryTool does not implement itype.RequestProcessor") } if err := requestProcessor.ProcessRequest(nil, &req); err != nil { t.Fatalf("inventoryTool.ProcessRequest failed: %v", err) } decl := toolDeclaration(req.Config) if decl == nil { t.Fatalf("inventoryTool.ProcessRequest did not configure function declaration: %v", req) // to prevent SA5011: possible nil pointer dereference (staticcheck) return } if got, want := decl.Name, inventoryTool.Name(); got != want { t.Errorf("inventoryTool function declaration name = %q, want %q", got, want) } if got, want := decl.Description, inventoryTool.Description(); got != want { t.Errorf("inventoryTool function declaration description = %q, want %q", got, want) } if got, want := stringify(decl.ParametersJsonSchema), stringify(ischema); got != want { t.Errorf("inventoryTool function declaration parameter json schema = %q, want %q", got, want) } if got, want := stringify(decl.ResponseJsonSchema), stringify(&jsonschema.Schema{}); got != want { t.Errorf("inventoryTool function response json schema = %q, want %q", got, want) } }) t.Run("Run", func(t *testing.T) { testCases := []struct { name string in map[string]any wantErr bool }{ { name: "valid_item", in: map[string]any{"fruit": "mandarin"}, wantErr: false, }, { name: "invalid_item", in: map[string]any{"fruit": "banana"}, wantErr: true, }, { name: "unexpected_type", in: map[string]any{"fruit": 1}, wantErr: true, }, { name: "nil", in: nil, wantErr: true, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { funcTool, ok := inventoryTool.(toolinternal.FunctionTool) if !ok { t.Fatal("inventoryTool does not implement itype.RequestProcessor") } ret, err := funcTool.Run(createToolContext(t), tc.in) // ret is expected to be nil always. if tc.wantErr && err == nil { t.Errorf("inventoryTool.Run = (%v, %v), want error", ret, err) } if !tc.wantErr && (err != nil || ret != nil) { // TODO: fix, for "valid_item" case now it returns empty map instead of nil if len(ret) != 0 { t.Errorf("inventoryTool.Run = (%v, %v), want (nil, nil)", ret, err) } } }) } }) } func toolDeclaration(cfg *genai.GenerateContentConfig) *genai.FunctionDeclaration { if cfg == nil || len(cfg.Tools) == 0 { return nil } t := cfg.Tools[0] if len(t.FunctionDeclarations) == 0 { return nil } return t.FunctionDeclarations[0] } func stringify(v any) string { x, err := json.MarshalIndent(v, "", " ") if err != nil { panic(err) } return string(x) } type SimpleArgs struct { Num int } func okFunc(_ tool.Context, _ SimpleArgs) (string, error) { return "ok", nil } func TestToolConfirmation(t *testing.T) { testCases := []struct { name string toolConfig functiontool.Config args map[string]any confirmFunctionResponse *genai.FunctionResponse // User's confirmation response want []*genai.Content }{ { name: "No Confirmation Required", toolConfig: functiontool.Config{ Name: "test_tool", }, args: map[string]any{"Num": 1}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 1}, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{"result": "ok"}, "user"), }, }, { name: "Confirmation Required", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmation: true, }, args: map[string]any{"Num": 1}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 1}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 1}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), }, }, { name: "Confirmation Required and is confirmed", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmation: true, }, args: map[string]any{"Num": 1}, confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": true}}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 1}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 1}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{"result": "ok"}, "user"), }, }, { name: "Confirmation Required and is rejected", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmation: true, }, args: map[string]any{"Num": 1}, confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": false}}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 1}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 1}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" call is rejected"), }, "user"), }, }, { name: "Conditional Confirmation Not Required", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmationProvider: func(args SimpleArgs) bool { return args.Num < 5 }, }, args: map[string]any{"Num": 7}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 7}, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{"result": "ok"}, "user"), }, }, { name: "Conditional Confirmation Required", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmationProvider: func(args SimpleArgs) bool { return args.Num < 5 }, }, args: map[string]any{"Num": 4}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 4}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 4}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), }, }, { name: "Conditional Confirmation Required and is confirmed", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmationProvider: func(args SimpleArgs) bool { return args.Num < 5 }, }, args: map[string]any{"Num": 4}, confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": true}}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 4}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 4}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{"result": "ok"}, "user"), }, }, { name: "Conditional Confirmation Required and is rejected", toolConfig: functiontool.Config{ Name: "test_tool", RequireConfirmationProvider: func(args SimpleArgs) bool { return args.Num < 5 }, }, args: map[string]any{"Num": 4}, confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": false}}, want: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", map[string]any{"Num": 4}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"Num": 4}, Name: "test_tool", }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call test_tool() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse("test_tool", map[string]any{ "error": errors.New("error tool \"test_tool\" call is rejected"), }, "user"), }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { mockModel := &testutil.MockModel{ Responses: []*genai.Content{ genai.NewContentFromFunctionCall("test_tool", tc.args, genai.RoleModel), }, } // Setup tool myTool, err := functiontool.New(tc.toolConfig, okFunc) if err != nil { t.Fatalf("Failed to create tool: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "simple agent", Model: mockModel, Tools: []tool.Tool{myTool}, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } runner := testutil.NewTestAgentRunner(t, a) eventCount := 0 ev := runner.Run(t, "id", "message") var confirmFunctionCall *genai.FunctionCall for got, err := range ev { if err != nil && err.Error() == "no data" { break } if err != nil { // Check if an error was expected t.Fatalf("runner returned unexpected error: %v", err) // If error was expected, we can stop here or check for a specific error type. return } if eventCount >= len(tc.want) { t.Fatalf("stream generated more values than the expected %d. Got: %+v", len(tc.want), got.Content) } if diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmp.Transformer("StringifyMapErrors", func(m map[string]any) map[string]any { out := make(map[string]any, len(m)) for k, v := range m { // Check if the value inside the map is an error if err, ok := v.(error); ok { out[k] = err.Error() // Convert to string } else { out[k] = v // Keep as is } } return out }), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID")); diff != "" { t.Errorf("LoopAgent Run() mismatch (-want +got):\n%s", diff) } for _, p := range got.Content.Parts { if p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName { confirmFunctionCall = p.FunctionCall } } eventCount++ } if confirmFunctionCall != nil && tc.confirmFunctionResponse != nil { tc.confirmFunctionResponse.ID = confirmFunctionCall.ID ev := runner.RunContent(t, "id", &genai.Content{ Parts: []*genai.Part{{FunctionResponse: tc.confirmFunctionResponse}}, }) for got, err := range ev { if err != nil && err.Error() == "no data" { break } if err != nil { // Check if an error was expected t.Fatalf("runner returned unexpected error: %v", err) // If error was expected, we can stop here or check for a specific error type. return } if eventCount >= len(tc.want) { t.Fatalf("stream generated more values than the expected %d. Got: %+v", len(tc.want), got.Content) } if diff := cmp.Diff(tc.want[eventCount], got.Content, cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmp.Transformer("StringifyMapErrors", func(m map[string]any) map[string]any { out := make(map[string]any, len(m)) for k, v := range m { // Check if the value inside the map is an error if err, ok := v.(error); ok { out[k] = err.Error() // Convert to string } else { out[k] = v // Keep as is } } return out }), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID")); diff != "" { t.Errorf("LoopAgent Run() mismatch (-want +got):\n%s", diff) } for _, p := range got.Content.Parts { if p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName { confirmFunctionCall = p.FunctionCall } } eventCount++ } } // Final check on the number of events if eventCount != len(tc.want) { t.Errorf("unexpected stream length, want %d got %d", len(tc.want), eventCount) } }) } } // Mock types for TArgs and TResults type TestArgs struct { Name string } type TestResult struct { Value int } func TestNew_RequireConfirmationProvider_Validation(t *testing.T) { // A dummy handler to satisfy the function signature dummyHandler := func(_ tool.Context, _ TestArgs) (TestResult, error) { return TestResult{Value: 1}, nil } expectedError := fmt.Sprintf("error RequireConfirmationProvider must be a function with signature func(%T) bool", TestArgs{}) tests := []struct { name string provider any // The RequireConfirmationProvider value to test expectsError bool // Substring expected in the error message; empty if no error expected }{ // --- Happy Paths --- { name: "Valid: Nil provider is allowed", provider: nil, expectsError: false, }, { name: "Valid: Correct function signature", provider: func(args TestArgs) bool { return true }, expectsError: false, }, // --- Edge Cases / Validation Errors --- { name: "Invalid: Provider is not a function (it's a struct)", provider: struct{}{}, expectsError: true, }, { name: "Invalid: Provider is not a function (it's a primitive)", provider: 123, expectsError: true, }, { name: "Invalid: Function has 0 arguments", provider: func() bool { return true }, expectsError: true, }, { name: "Invalid: Function has too many arguments (2)", provider: func(a TestArgs, b int) bool { return true }, expectsError: true, }, { name: "Invalid: Argument type mismatch (int instead of TestArgs)", provider: func(n int) bool { return true }, expectsError: true, }, { name: "Invalid: Argument type mismatch (pointer vs value)", provider: func(a *TestArgs) bool { return true }, expectsError: true, }, { name: "Invalid: Function returns nothing", provider: func(args TestArgs) {}, expectsError: true, }, { name: "Invalid: Function returns too many values", provider: func(args TestArgs) (bool, error) { return true, nil }, expectsError: true, }, { name: "Invalid: Return type mismatch (returns int instead of bool)", provider: func(args TestArgs) int { return 1 }, expectsError: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Construct config with the provider under test cfg := functiontool.Config{ RequireConfirmationProvider: tt.provider, } tool, err := functiontool.New(cfg, dummyHandler) // Check results if !tt.expectsError { if err != nil { t.Fatalf("unexpected error: %v", err) } if tool == nil { t.Error("expected valid tool, got nil") } } else { if err == nil { t.Error("expected error but got nil") } else if !strings.Contains(err.Error(), expectedError) { t.Errorf("error message mismatch.\nExpected substring: %q\nGot: %q", expectedError, err.Error()) } } }) } } func TestNew_InvalidInputType(t *testing.T) { testCases := []struct { name string createTool func() (tool.Tool, error) wantErrMsg string }{ { name: "string_input", createTool: func() (tool.Tool, error) { return functiontool.New(functiontool.Config{ Name: "string_tool", Description: "a tool with string input", }, func(ctx tool.Context, input string) (string, error) { return input, nil }) }, wantErrMsg: "input must be a struct type, got: string", }, { name: "int_input", createTool: func() (tool.Tool, error) { return functiontool.New(functiontool.Config{ Name: "int_tool", Description: "a tool with int input", }, func(ctx tool.Context, input int) (int, error) { return input, nil }) }, wantErrMsg: "input must be a struct type, got: int", }, { name: "bool_input", createTool: func() (tool.Tool, error) { return functiontool.New(functiontool.Config{ Name: "bool_tool", Description: "a tool with bool input", }, func(ctx tool.Context, input bool) (bool, error) { return input, nil }) }, wantErrMsg: "input must be a struct type, got: bool", }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { _, err := tc.createTool() if err == nil { t.Fatalf("functiontool.New() succeeded, want error containing %q", tc.wantErrMsg) } if !errors.Is(err, functiontool.ErrInvalidArgument) { t.Fatalf("functiontool.New() error = %v, want %v", err, functiontool.ErrInvalidArgument) } }) } } func TestFunctionTool_PanicRecovery(t *testing.T) { type Args struct { Value string `json:"value"` } panicHandler := func(ctx tool.Context, input Args) (string, error) { panic("intentional panic for testing") } panicTool, err := functiontool.New(functiontool.Config{ Name: "panic_tool", Description: "a tool that always panics", }, panicHandler) if err != nil { t.Fatalf("NewFunctionTool failed: %v", err) } funcTool, ok := panicTool.(toolinternal.FunctionTool) if !ok { t.Fatal("panicTool does not implement toolinternal.FunctionTool") } result, err := funcTool.Run(createToolContext(t), map[string]any{"value": "test"}) if err == nil { t.Fatal("expected error from panic recovery, got nil") } if result != nil { t.Errorf("expected nil result, got %v", result) } expectedErrParts := []string{ "panic in tool", "panic_tool", "intentional panic for testing", "stack:", } for _, part := range expectedErrParts { if !strings.Contains(err.Error(), part) { t.Errorf("expected error to contain %q, but it did not. Error: %v", part, err) } } } ================================================ FILE: tool/functiontool/long_running_function_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package functiontool_test import ( "encoding/json" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/genai" "google.golang.org/adk/agent/llmagent" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/tool" "google.golang.org/adk/tool/functiontool" ) func TestNewLongRunningFunctionTool(t *testing.T) { type SumArgs struct { A int `json:"a"` // an integer to sum B int `json:"b"` // another integer to sum } type SumResult struct { Result string `json:"result"` // the operation result } handler := func(ctx tool.Context, input SumArgs) (SumResult, error) { return SumResult{Result: "Processing sum"}, nil } sumTool, err := functiontool.New(functiontool.Config{ Name: "sum", Description: "sums two integers", IsLongRunning: true, }, handler) if err != nil { t.Fatalf("TestNewLongRunningFunctionTool failed: %v", err) } if sumTool.Name() != "sum" { t.Fatalf("TestNewLongRunningFunctionTool failed: wrong name") } if sumTool.Description() != "sums two integers" { t.Fatalf("TestNewLongRunningFunctionTool failed: wrong description") } if sumTool.IsLongRunning() == false { t.Fatalf("TestNewLongRunningFunctionTool failed: wrong value for IsLongRunning") } functionTool, ok := sumTool.(toolinternal.FunctionTool) if !ok { t.Fatalf("TestNewLongRunningFunctionTool failed: could not convert to FunctionTool") } if !strings.Contains(functionTool.Declaration().Description, "NOTE: This is a long-running operation") { t.Fatalf("TestNewLongRunningFunctionTool failed: wrong description note") } _ = sumTool // use the tool } func NewContentFromFunctionResponseWithID(name string, response map[string]any, id, role string) *genai.Content { content := genai.NewContentFromFunctionResponse(name, response, genai.Role(role)) content.Parts[0].FunctionResponse.ID = id return content } type IncArgs struct{} func TestLongRunningFunctionFlow(t *testing.T) { functionCalled := 0 increaseByOne := func(ctx tool.Context, x IncArgs) (map[string]string, error) { functionCalled++ return map[string]string{"status": "pending"}, nil } testLongRunningFunctionFlow(t, increaseByOne, "status", &functionCalled) } func TestLongRunningStringFunctionFlow(t *testing.T) { functionCalled := 0 increaseByOne := func(ctx tool.Context, x IncArgs) (string, error) { functionCalled++ return "pending", nil } testLongRunningFunctionFlow(t, increaseByOne, "result", &functionCalled) } // --- Test Suite --- func testLongRunningFunctionFlow[Out any](t *testing.T, increaseByOne func(ctx tool.Context, x IncArgs) (Out, error), resultKey string, callCount *int) { // 1. Setup responses := []*genai.Content{ genai.NewContentFromFunctionCall("increaseByOne", map[string]any{}, "model"), genai.NewContentFromText("response1", "model"), genai.NewContentFromText("response2", "model"), genai.NewContentFromText("response3", "model"), genai.NewContentFromText("response4", "model"), } mockModel := &testutil.MockModel{Responses: responses} longRunningTool, err := functiontool.New(functiontool.Config{ Name: "increaseByOne", Description: "increaseByOne", IsLongRunning: true, }, increaseByOne) if err != nil { t.Fatalf("failed to create longRunningTool: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "long_running_agent", Model: mockModel, Tools: []tool.Tool{longRunningTool}, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } runner := testutil.NewTestAgentRunner(t, a) // 2. Initial Run eventStream := runner.Run(t, "test_session", "test1") eventParts, err := testutil.CollectParts(eventStream) if err != nil { t.Fatalf("failed to collect events: %v", err) } // 3. Assertions for Initial Run if len(mockModel.Requests) != 2 { // Marshal the slice into a readable JSON string requestsJSON, _ := json.MarshalIndent(mockModel.Requests, "", " ") t.Fatalf("got %d requests, want 2;\n- requests:\n%s", len(mockModel.Requests), requestsJSON) } if *callCount != 1 { t.Errorf("function called %d times, want 1", *callCount) } // Assert first request wantFirsteq := []*genai.Content{ genai.NewContentFromText("test1", "user"), } if diff := cmp.Diff(wantFirsteq, mockModel.Requests[0].Contents); diff != "" { t.Errorf("LLMRequest.Contents mismatch (-want +got):\n%s", diff) } // Assert second request wantSecondReq := []*genai.Content{ genai.NewContentFromText("test1", "user"), genai.NewContentFromFunctionCall("increaseByOne", map[string]any{}, "model"), genai.NewContentFromFunctionResponse("increaseByOne", map[string]any{resultKey: "pending"}, "user"), } if diff := cmp.Diff(wantSecondReq, mockModel.Requests[1].Contents); diff != "" { t.Errorf("LLMRequest.Contents mismatch (-want +got):\n%s", diff) } wantEventParts := []*genai.Part{ genai.NewPartFromFunctionCall("increaseByOne", map[string]any{}), genai.NewPartFromFunctionResponse("increaseByOne", map[string]any{resultKey: "pending"}), genai.NewPartFromText("response1"), } if diff := cmp.Diff(wantEventParts, eventParts, cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID")); diff != "" { t.Errorf("Event parts mismatch (-want +got):\n%s", diff) } functionCallEventPart := eventParts[0] idFromTheFunctionCallEvent := functionCallEventPart.FunctionCall.ID testCases := []struct { name string // Name for the Run subtest inputContent *genai.Content // The content to send wantReqCount int // Expected len(mockModel.Requests) wantEventCount int // Expected len(eventParts) wantEventText string // Expected eventParts[0].Text wantContent *genai.Content // Expected output content }{ { name: "function response still waiting", inputContent: NewContentFromFunctionResponseWithID( "increaseByOne", map[string]any{"status": "still waiting"}, idFromTheFunctionCallEvent, "user", ), wantReqCount: 3, wantEventCount: 1, wantEventText: "response2", wantContent: genai.NewContentFromFunctionResponse("increaseByOne", map[string]any{"status": "still waiting"}, "user"), }, { name: "function response result 2", inputContent: NewContentFromFunctionResponseWithID( "increaseByOne", map[string]any{"result": 2}, idFromTheFunctionCallEvent, "user", ), wantReqCount: 4, wantEventCount: 1, wantEventText: "response3", wantContent: genai.NewContentFromFunctionResponse("increaseByOne", map[string]any{"result": 2}, "user"), }, { name: "function response result 3", inputContent: NewContentFromFunctionResponseWithID( "increaseByOne", map[string]any{"result": 3}, idFromTheFunctionCallEvent, "user", ), wantReqCount: 5, wantEventCount: 1, wantEventText: "response4", wantContent: genai.NewContentFromFunctionResponse("increaseByOne", map[string]any{"result": 3}, "user"), }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { eventStream := runner.RunContent(t, "test_session", tc.inputContent) eventParts, err := testutil.CollectParts(eventStream) if err != nil { t.Fatalf("failed to collect events: %v", err) } // Assert against the values from the test case struct if len(mockModel.Requests) != tc.wantReqCount { t.Fatalf("got %d requests, want %d", len(mockModel.Requests), tc.wantReqCount) } latestRequestContents := mockModel.Requests[len(mockModel.Requests)-1].Contents // content should still be 3 since the function responses are merged into one in contents_processor if len(latestRequestContents) != 3 { t.Fatalf("got %d latest request contents size, want %d", len(latestRequestContents), 3) } if diff := cmp.Diff(tc.wantContent, latestRequestContents[len(latestRequestContents)-1]); diff != "" { t.Errorf("LLMRequest.Content mismatch (-want +got):\n%s", diff) } if len(eventParts) != tc.wantEventCount { // Marshal the slice into a readable JSON string partsJSON, _ := json.MarshalIndent(eventParts, "", " ") t.Fatalf("got %d events parts, want %d;\n- parts:\n%s", len(eventParts), tc.wantEventCount, partsJSON) } // This check is now safe because the Fatalf above would have stopped the test if len(eventParts) > 0 && eventParts[0].Text != tc.wantEventText { t.Errorf("got event part text %q, want %q", eventParts[0].Text, tc.wantEventText) } }) } // Should still be one if *callCount != 1 { t.Errorf("function called %d times, want 1", *callCount) } } func TestLongRunningToolIDsAreSet(t *testing.T) { // 1. Setup responses := []*genai.Content{ genai.NewContentFromFunctionCall("increaseByOne", map[string]any{}, "model"), genai.NewContentFromText("response1", "model"), } mockModel := &testutil.MockModel{Responses: responses} functionCalled := 0 type IncArgs struct{} increaseByOne := func(ctx tool.Context, x IncArgs) (map[string]string, error) { functionCalled++ return map[string]string{"status": "pending"}, nil } longRunningTool, err := functiontool.New(functiontool.Config{ Name: "increaseByOne", Description: "increaseByOne", IsLongRunning: true, }, increaseByOne) if err != nil { t.Fatalf("failed to create longRunningTool: %v", err) } a, err := llmagent.New(llmagent.Config{ Name: "hello_world_agent", Model: mockModel, Tools: []tool.Tool{longRunningTool}, }) if err != nil { t.Fatalf("failed to create llm agent: %v", err) } runner := testutil.NewTestAgentRunner(t, a) // 2. Initial Run eventStream := runner.Run(t, "test_session", "test1") events, err := testutil.CollectEvents(eventStream) if err != nil { t.Fatalf("failed to collect events: %v", err) } if len(events) != 3 { // first event is function call, seconds is function response, third is llm message back // Marshal the slice into a readable JSON string eventsJSON, _ := json.MarshalIndent(events, "", " ") t.Fatalf("got %d for events length, want 3;\n- events:\n%s", len(events), eventsJSON) } // Assert responses functionCallEvent := events[0] functionResponseEvent := events[1] llmResponseEvent := events[2] // First event should have LongRunningToolIDs field if functionCallEvent.LongRunningToolIDs == nil || len(functionCallEvent.LongRunningToolIDs) != 1 { t.Fatalf("Invalid LongRunningToolIDs for functionCallEvent") } if functionResponseEvent.LongRunningToolIDs != nil { t.Errorf("Invalid LongRunningToolIDs for functionResponseEvent") } if len(llmResponseEvent.LongRunningToolIDs) != 0 { t.Errorf("Invalid LongRunningToolIDs for llmResponseEvent") } if functionCallEvent.LongRunningToolIDs[0] != functionCallEvent.LLMResponse.Content.Parts[0].FunctionCall.ID { t.Fatalf("Invalid LongRunningToolIDs for functionCallEvent got %q expected %q", functionCallEvent.LongRunningToolIDs[0], functionCallEvent.LLMResponse.Content.Parts[0].FunctionCall.ID) } } ================================================ FILE: tool/functiontool/testdata/TestFunctionTool_Simple.httprr ================================================ httprr trace v1 800 1845 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 568 Content-Type: application/json {"contents":[{"parts":[{"text":"Report the current weather of the capital city of U.K."}],"role":"user"}],"generationConfig":{},"tools":[{"functionDeclarations":[{"description":"Retrieves the current weather report for a specified city.","name":"get_weather_report","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"report":{"type":"string"},"status":{"type":"string"}},"required":["report","status"],"type":"object"}}]}]}HTTP/2.0 200 OK Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: application/json; charset=UTF-8 Date: Fri, 20 Feb 2026 12:55:06 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1723 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather_report", "args": { "city": "London" } }, "thoughtSignature": "CpAEAb4+9vsutluzr9rWOQfH9dS0XV653cFDpSb/TRzRVzLknyGU1eF725i0tt9tq4t6LkEatm9ZtMbBhY0pm/IAYSwCmqDf5AnI2wsTqpgpFXuU/3EEFWGp+4wWaBqcjEZeRmPW7I4lNZEQ9Y80p8/7OIeJ7FVr14WQnqmb8wJK8H8WPo2idly7T9+J5Ybqh+fdJDAm4iIFSPvhGYnkUjmYyVzzNFLTTMgEVY+PuFQvAog1xvl/+YWl89bwJbYbaP637rbraYQSiEDhlJ/+Ki0uKyOeKt56PaIA+89bDteD1D4AK9exmtW7wjg06lPkw3g5dT5JtIl+lstayFemzZxTd3+0rW2F0FGDH4vQ1Fe6M/qNAUpdtU9rM9VR//ROw1dLT8yVDHQVKF6eDLKJBzPTmS6yYpUUurV8Vjz7wf8OY1UsNxRCeKTYUJKq9mEGkvUoOxqT+WA5EWtUiVvGv6dVVU2xtxs43p/paEMx2vWK8jAG3ol8Z++4eml7QmAFvSkv5S/kD/RWali/Spu+UfZsMJLUP/0sQP8JCxzmjBuD4GUG1v0yiXNb5I2bVOp0NOOcpNd2Y1TMfAdf7o3HjNdn1GyVffiWJ7xdct0gE0Y7XtWwU9vsevdvlsvTTshG9zOW6R9uvp51Q24HeRhrrTq/bQCO7wjC3PkUtXQNKM+OYsWjOSMjfKH3S9Ddhb9Cdppz" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 113, "candidatesTokenCount": 17, "totalTokenCount": 265, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 113 } ], "thoughtsTokenCount": 135 }, "modelVersion": "gemini-2.5-flash", "responseId": "qFmYaY79GbLZ2roPsKvdOQ" } 778 1708 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 546 Content-Type: application/json {"contents":[{"parts":[{"text":"How is the weather of Paris now?"}],"role":"user"}],"generationConfig":{},"tools":[{"functionDeclarations":[{"description":"Retrieves the current weather report for a specified city.","name":"get_weather_report","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"report":{"type":"string"},"status":{"type":"string"}},"required":["report","status"],"type":"object"}}]}]}HTTP/2.0 200 OK Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: application/json; charset=UTF-8 Date: Fri, 20 Feb 2026 12:55:07 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1339 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather_report", "args": { "city": "Paris" } }, "thoughtSignature": "CqoDAb4+9vuYMHffdQJYJ6ErebPblkYklb38rf+UMkmKXgFs3mcKDEdvtupR5PEFt5aUhNftTB0sDsBCLCNPB+V+bReLxEuCk7wEUbya/mosSi9cj92Ql1Lpg2PNYDqyElSg/YYGa0SX7b+y4IF6s/H/PhNxS2Z7CfS/iaaau9MJkRcMH+RQeMdu+GGRJ9hT9wgPMUMuJlMPYNL7vVrW8RzCdoHUb73QxHk/NnxpbScpRg7Bi7blNPjOXh07xHzJvcUWfIRXWVvGNdUSHbQGzhGtZYBcWXWIm6HnkHlgpdyi13rDBrd36j5TIcrNe7zKC3I/uuTF0y8M0TwC6API4sTYJThXKqBXNeHra20W6gi2lzyW8fAtA9353e97hdtPJheV9X97zF3BsWKpj8uSKmc8o8EzXfu/TiJWIhw5yJBwpfv6FDscBn16CbeO8q0lPdSf+aQ2DBo9908PUHDCEheuRFClL6KyKmp53O43fyfWKotgqB0CD2t65zkdxWtiL8p9R1mmjNAGMNdtVxm89RvOrNU00QD8rdhRL2FeYFiHFVb2svTAdleNI+Ko" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 108, "candidatesTokenCount": 17, "totalTokenCount": 218, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 108 } ], "thoughtsTokenCount": 93 }, "modelVersion": "gemini-2.5-flash", "responseId": "qlmYaZ3RDoa20-kPlJHKuQo" } 791 1587 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 559 Content-Type: application/json {"contents":[{"parts":[{"text":"Tell me about the current weather in New York"}],"role":"user"}],"generationConfig":{},"tools":[{"functionDeclarations":[{"description":"Retrieves the current weather report for a specified city.","name":"get_weather_report","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"report":{"type":"string"},"status":{"type":"string"}},"required":["report","status"],"type":"object"}}]}]}HTTP/2.0 200 OK Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Content-Type: application/json; charset=UTF-8 Date: Fri, 20 Feb 2026 12:55:08 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1413 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather_report", "args": { "city": "New York" } }, "thoughtSignature": "CswCAb4+9vuQNOI+nK2hM31s/rM7fYTq5LKORz+pMG1NjQDg0FamFaOnnLxXjT/Ut0fA/JjHyaBHd6xKy+swUeH6YZ7Ez0timODCf2vUHV/5jCEEtkAsbKFVfrtO1Jw43dmOgy+nJ1DnDVzWfPe4Wy7HYfyDCXqIjrtbWTo5yG6nmT15xx0YChT0SpForS5liyLbjMbIVP1WhVknZLoRBeQoXWBFeb8Trb6vYi5TYLU5G4rzWKn2Ogu0GDcg62000nWPC8Ifk6A8fjqbCjr49esecCny+gkfET1bagIQG21kpoQijUM869r0rx5BDokkXeXfYfG+dMpAmO2YnyW2s7ldzF6bppzg+Ka7hGhdfL+7xJ24y4JrKwnCmnDnq+SUjPUiG8/toObyN0l+VVpHRK7R1H81ZXox69ifcn3YEDo5Zzp7+JfsjX+8MsJBktk=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 109, "candidatesTokenCount": 18, "totalTokenCount": 202, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 109 } ], "thoughtsTokenCount": 75 }, "modelVersion": "gemini-2.5-flash", "responseId": "q1mYadDQI96M2roPsP3UyAs" } ================================================ FILE: tool/geminitool/google_search.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package geminitool import ( "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) // GoogleSearch is a built-in tool that is automatically invoked by Gemini 2 // models to retrieve search results from Google Search. // The tool operates internally within the model and does not require or // perform local code execution. type GoogleSearch struct{} // Name implements tool.Tool. func (s GoogleSearch) Name() string { return "google_search" } // Description implements tool.Tool. func (s GoogleSearch) Description() string { return "Performs a Google search to retrieve information from the web." } // ProcessRequest adds the GoogleSearch tool to the LLM request. func (s GoogleSearch) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return setTool(req, &genai.Tool{ GoogleSearch: &genai.GoogleSearch{}, }) } // IsLongRunning implements tool.Tool. func (s GoogleSearch) IsLongRunning() bool { return false } ================================================ FILE: tool/geminitool/tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package geminitool provides access to Gemini native tools. You can use any // tool from genai with geminitool.New(). // // For example, to create a Gemini retrieval tool: // // geminitool.New("data_retrieval", &genai.Tool{ // Retrieval: &genai.Retrieval{ // ExternalAPI: &genai.ExternalAPI{ // Endpoint: , // AuthConfig: // }, // }, // }) // // Package also provides default tools like GoogleSearch. package geminitool import ( "fmt" "google.golang.org/genai" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) // New creates gemini API tool. func New(name, description string, t *genai.Tool) tool.Tool { return &geminiTool{ name: name, description: description, value: t, } } // geminiTool is a wrapper around a genai.Tool. type geminiTool struct { name string description string value *genai.Tool } // ProcessRequest adds the Gemini tool to the LLM request. func (t *geminiTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return setTool(req, t.value) } // Name implements tool.Tool. func (t *geminiTool) Name() string { return t.name } // Description implements tool.Tool. func (t *geminiTool) Description() string { return t.description } // IsLongRunning implements tool.Tool. func (t *geminiTool) IsLongRunning() bool { return false } func setTool(req *model.LLMRequest, t *genai.Tool) error { if req == nil { return fmt.Errorf("llm request is nil") } if req.Config == nil { req.Config = &genai.GenerateContentConfig{} } req.Config.Tools = append(req.Config.Tools, t) return nil } ================================================ FILE: tool/geminitool/tool_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package geminitool_test import ( "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/tool/geminitool" ) func TestGeminiTool_ProcessRequest(t *testing.T) { testCases := []struct { name string inputTool *genai.Tool req *model.LLMRequest wantTools []*genai.Tool wantErr bool }{ { name: "add to empty request", inputTool: &genai.Tool{ GoogleSearch: &genai.GoogleSearch{}, }, req: &model.LLMRequest{}, wantTools: []*genai.Tool{ {GoogleSearch: &genai.GoogleSearch{}}, }, }, { name: "add to existing tools", inputTool: &genai.Tool{ GoogleSearch: &genai.GoogleSearch{}, }, req: &model.LLMRequest{ Config: &genai.GenerateContentConfig{ Tools: []*genai.Tool{ { GoogleMaps: &genai.GoogleMaps{}, }, }, }, }, wantTools: []*genai.Tool{ {GoogleMaps: &genai.GoogleMaps{}}, {GoogleSearch: &genai.GoogleSearch{}}, }, }, { name: "error on nil request", wantErr: true, }, } for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { geminiTool := geminitool.New("test_tool", "test_description", tt.inputTool) requestProcessor, ok := geminiTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("geminiTool does not implement RequestProcessor") } err := requestProcessor.ProcessRequest(nil, tt.req) if (err != nil) != tt.wantErr { t.Fatalf("ProcessRequest() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantErr { return } if diff := cmp.Diff(tt.wantTools, tt.req.Config.Tools); diff != "" { t.Errorf("ProcessRequest returned unexpected tools (-want +got):\n%s", diff) } }) } } ================================================ FILE: tool/loadartifactstool/load_artifacts_tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package loadartifactstool defines a tool for loading artifacts. // This tool informs the model about available artifacts and provides their content when // requested by the model through a function call. package loadartifactstool import ( "context" "encoding/json" "fmt" "golang.org/x/sync/errgroup" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/internal/utils" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) // artifactsTool is a tool that loads artifacts and adds them to the session. type artifactsTool struct { name string description string } // New creates a new loadArtifactsTool. func New() tool.Tool { return &artifactsTool{ name: "load_artifacts", description: "Loads the artifacts and adds them to the session.", } } // Name implements tool.Tool. func (t *artifactsTool) Name() string { return t.name } // Description implements tool.Tool. func (t *artifactsTool) Description() string { return t.description } // IsLongRunning implements tool.Tool. func (t *artifactsTool) IsLongRunning() bool { return false } // Declaration returns the GenAI FunctionDeclaration for the load_artifacts tool. // // This declaration allows the LLM to understand and call the tool // by specifying the function name, a detailed description of its // purpose, and the required input parameters (schema). func (t *artifactsTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{ Name: t.name, Description: t.description, Parameters: &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "artifact_names": { Type: "ARRAY", Items: &genai.Schema{ Type: "STRING", }, }, }, }, } } // Run implements tool.Tool. func (t *artifactsTool) Run(ctx tool.Context, args any) (map[string]any, error) { m, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("unexpected args type, got: %T", args) } var artifactNames []string artifactNamesRaw, exists := m["artifact_names"] if !exists { artifactNames = []string{} } else { // In order to cast properly from []any to []string we're gonna marshal and then // unmarshal the artifact_names value. artifactNamesJson, err := json.Marshal(artifactNamesRaw) if err != nil { return nil, fmt.Errorf("failed to marshal artifact_names to JSON: %w", err) } if err := json.Unmarshal(artifactNamesJson, &artifactNames); err != nil { return nil, fmt.Errorf("failed to unmarshal artifact_names from JSON to []string: %w", err) } // Ensure the slice is not nil if it's empty if artifactNames == nil { artifactNames = []string{} } } result := map[string]any{ "artifact_names": artifactNames, } return result, nil } // ProcessRequest processes the LLM request. It packs the tool, appends initial // instructions, and processes any load artifacts function calls. func (t *artifactsTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { if err := toolutils.PackTool(req, t); err != nil { return err } if err := t.appendInitialInstructions(ctx, req); err != nil { return err } return t.processLoadArtifactsFunctionCall(ctx, req) } func (t *artifactsTool) appendInitialInstructions(ctx tool.Context, req *model.LLMRequest) error { resp, err := ctx.Artifacts().List(ctx) if err != nil { return fmt.Errorf("failed to list artifacts: %w", err) } if len(resp.FileNames) == 0 { return nil } artifactNamesJSON, err := json.Marshal(resp.FileNames) if err != nil { return fmt.Errorf("failed to marshal artifact names: %w", err) } instructions := fmt.Sprintf( "You have a list of artifacts:\n %s\n\nWhen the user asks questions about"+ " any of the artifacts, you should call the `load_artifacts` function"+ " to load the artifact. Do not generate any text other than the"+ " function call. Whenever you are asked about artifacts, you"+ " should first load it. You must always load an artifact to access its"+ " content, even if it has been loaded before.", string(artifactNamesJSON)) utils.AppendInstructions(req, instructions) return nil } func (t *artifactsTool) processLoadArtifactsFunctionCall(ctx tool.Context, req *model.LLMRequest) error { if len(req.Contents) == 0 { return nil } lastContent := req.Contents[len(req.Contents)-1] if lastContent == nil || len(lastContent.Parts) == 0 { return nil } firstPart := lastContent.Parts[0] if firstPart.FunctionResponse == nil { return nil } functionResponse := firstPart.FunctionResponse if functionResponse.Name != "load_artifacts" { return nil } artifactNamesRaw, ok := functionResponse.Response["artifact_names"] if !ok { return nil } artifactNames, ok := artifactNamesRaw.([]string) if !ok { return fmt.Errorf("invalid artifact names type: %T, expected []string", artifactNamesRaw) } if len(artifactNames) == 0 { return nil } results := make([]*genai.Content, len(artifactNames)) group, childCtx := errgroup.WithContext(ctx) artifactsService := ctx.Artifacts() for i, artifactName := range artifactNames { group.Go(func() error { // Although not used, we need to pass childCtx for early return in case of an error. content, err := t.loadIndividualArtifact(childCtx, artifactsService, artifactName) if err != nil { return fmt.Errorf("failed to load artifact %s: %w", artifactName, err) } results[i] = content return nil }) } if err := group.Wait(); err != nil { return err } req.Contents = append(req.Contents, results...) return nil } func (t *artifactsTool) loadIndividualArtifact(ctx context.Context, artifactsService agent.Artifacts, artifactName string) (*genai.Content, error) { resp, err := artifactsService.Load(ctx, artifactName) if err != nil { return nil, fmt.Errorf("failed to load artifact %s: %w", artifactName, err) } return &genai.Content{ Parts: []*genai.Part{ genai.NewPartFromText("Artifact " + artifactName + " is:"), resp.Part, }, Role: genai.RoleUser, }, nil } ================================================ FILE: tool/loadartifactstool/load_artifacts_tool_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package loadartifactstool_test import ( "strings" "testing" "github.com/google/go-cmp/cmp" "google.golang.org/genai" "google.golang.org/adk/artifact" artifactinternal "google.golang.org/adk/internal/artifact" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/tool" "google.golang.org/adk/tool/loadartifactstool" ) func TestLoadArtifactsTool_Run(t *testing.T) { loadArtifactsTool := loadartifactstool.New() tc := createToolContext(t) toolImpl, ok := loadArtifactsTool.(toolinternal.FunctionTool) if !ok { t.Fatal("loadArtifactsTool does not implement FunctionTool") } tests := []struct { name string args map[string]any want map[string]any wantErr bool }{ { name: "basic string slice", args: map[string]any{ "artifact_names": []string{"file1", "file2"}, }, want: map[string]any{ "artifact_names": []string{"file1", "file2"}, }, }, { name: "empty args", args: map[string]any{}, want: map[string]any{ "artifact_names": []string{}, }, }, { name: "any slice with strings", args: map[string]any{ "artifact_names": []any{"fileA", "fileB"}, }, want: map[string]any{ "artifact_names": []string{"fileA", "fileB"}, }, }, { name: "empty string slice", args: map[string]any{ "artifact_names": []string{}, }, want: map[string]any{ "artifact_names": []string{}, }, }, { name: "empty any slice", args: map[string]any{ "artifact_names": []any{}, }, want: map[string]any{ "artifact_names": []string{}, }, }, { name: "nil value", args: map[string]any{ "artifact_names": nil, }, want: map[string]any{ "artifact_names": []string{}, }, }, { name: "incorrect type (not a slice)", args: map[string]any{ "artifact_names": "not a slice", }, wantErr: true, }, { name: "any slice with non-string", args: map[string]any{ "artifact_names": []any{"fileA", 123}, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := toolImpl.Run(tc, tt.args) if (err != nil) != tt.wantErr { t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantErr { return } if diff := cmp.Diff(tt.want, result); diff != "" { t.Errorf("Run() result diff (-want +got):\n%s", diff) } }) } } func TestLoadArtifactsTool_ProcessRequest(t *testing.T) { loadArtifactsTool := loadartifactstool.New() tc := createToolContext(t) artifacts := map[string]*genai.Part{ "file1.txt": {Text: "content1"}, "file2.pdf": {Text: "content2"}, } for name, part := range artifacts { _, err := tc.Artifacts().Save(t.Context(), name, part) if err != nil { t.Fatalf("Failed to save artifact %s: %v", name, err) } } llmRequest := &model.LLMRequest{} requestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("loadArtifactsTool does not implement RequestProcessor") } err := requestProcessor.ProcessRequest(tc, llmRequest) if err != nil { t.Fatalf("ProcessRequest failed: %v", err) } instruction := llmRequest.Config.SystemInstruction.Parts[0].Text if !strings.Contains(instruction, "You have a list of artifacts") { t.Errorf("Instruction should contain 'You have a list of artifacts', but got: %v", instruction) } if !strings.Contains(instruction, `"file1.txt"`) || !strings.Contains(instruction, `"file2.pdf"`) { t.Errorf("Instruction should contain artifact names, but got: %v", instruction) } if len(llmRequest.Contents) > 0 { t.Errorf("Expected no contents, but got: %v", llmRequest.Contents) } } func TestLoadArtifactsTool_ProcessRequest_Artifacts_LoadArtifactsFunctionCall(t *testing.T) { loadArtifactsTool := loadartifactstool.New() tc := createToolContext(t) artifacts := map[string]*genai.Part{ "doc1.txt": {Text: "This is the content of doc1.txt"}, } for name, part := range artifacts { _, err := tc.Artifacts().Save(t.Context(), name, part) if err != nil { t.Fatalf("Failed to save artifact %s: %v", name, err) } } functionResponse := &genai.FunctionResponse{ Name: "load_artifacts", Response: map[string]any{ "artifact_names": []string{"doc1.txt"}, }, } llmRequest := &model.LLMRequest{ Contents: []*genai.Content{ { Role: "model", Parts: []*genai.Part{ genai.NewPartFromFunctionResponse(functionResponse.Name, functionResponse.Response), }, }, }, } requestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("loadArtifactsTool does not implement RequestProcessor") } err := requestProcessor.ProcessRequest(tc, llmRequest) if err != nil { t.Fatalf("ProcessRequest failed: %v", err) } if len(llmRequest.Contents) != 2 { t.Fatalf("Expected 2 content, but got: %v", llmRequest.Contents) } appendedContent := llmRequest.Contents[1] if appendedContent.Role != "user" { t.Errorf("Appended Content Role: got %v, want 'user'", appendedContent.Role) } if len(appendedContent.Parts) != 2 { t.Fatalf("Expected 2 parts in appended content, but got: %v", appendedContent.Parts) } if appendedContent.Parts[0].Text != "Artifact doc1.txt is:" { t.Errorf("First part of appended content: got %v, want 'Artifact doc1.txt is:'", appendedContent.Parts[0].Text) } if appendedContent.Parts[1].Text != "This is the content of doc1.txt" { t.Errorf("Second part of appended content: got %v, want 'This is the content of doc1.txt'", appendedContent.Parts[1].Text) } } func TestLoadArtifactsTool_ProcessRequest_Artifacts_OtherFunctionCall(t *testing.T) { loadArtifactsTool := loadartifactstool.New() tc := createToolContext(t) artifacts := map[string]*genai.Part{ "doc1.txt": {Text: "content1"}, } for name, part := range artifacts { _, err := tc.Artifacts().Save(t.Context(), name, part) if err != nil { t.Fatalf("Failed to save artifact %s: %v", name, err) } } functionResponse := &genai.FunctionResponse{ Name: "other_function", Response: map[string]any{ "some_key": "some_value", }, } llmRequest := &model.LLMRequest{ Contents: []*genai.Content{ { Role: "model", Parts: []*genai.Part{ genai.NewPartFromFunctionResponse(functionResponse.Name, functionResponse.Response), }, }, }, } requestProcessor, ok := loadArtifactsTool.(toolinternal.RequestProcessor) if !ok { t.Fatal("loadArtifactsTool does not implement RequestProcessor") } err := requestProcessor.ProcessRequest(tc, llmRequest) if err != nil { t.Fatalf("ProcessRequest failed: %v", err) } if len(llmRequest.Contents) != 1 { t.Fatalf("Expected 1 content, but got: %v", llmRequest.Contents) } if llmRequest.Contents[0].Role != "model" { t.Errorf("Content Role: got %v, want 'model'", llmRequest.Contents[0].Role) } } func createToolContext(t *testing.T) tool.Context { t.Helper() artifacts := &artifactinternal.Artifacts{ Service: artifact.InMemoryService(), AppName: "app", UserID: "user", SessionID: "session", } ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Artifacts: artifacts, }) return toolinternal.NewToolContext(ctx, "", nil, nil) } ================================================ FILE: tool/loadmemorytool/tool.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package loadmemorytool provides a tool that loads memory for the current user. // This tool allows the model to search and retrieve relevant memory entries // based on a query. package loadmemorytool import ( "fmt" "google.golang.org/genai" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/internal/utils" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) const memoryInstructions = `You have memory. You can use it to answer questions. If any questions need you to look up the memory, you should call load_memory function with a query.` type loadMemoryTool struct { name string description string } // New creates a new loadMemoryTool. func New() toolinternal.FunctionTool { return &loadMemoryTool{ name: "load_memory", description: "Loads the memory for the current user.", } } // Name implements tool.Tool. func (t *loadMemoryTool) Name() string { return t.name } // Description implements tool.Tool. func (t *loadMemoryTool) Description() string { return t.description } // IsLongRunning implements tool.Tool. func (t *loadMemoryTool) IsLongRunning() bool { return false } // Declaration returns the GenAI FunctionDeclaration for the load_memory tool. func (t *loadMemoryTool) Declaration() *genai.FunctionDeclaration { return &genai.FunctionDeclaration{ Name: t.name, Description: t.description, Parameters: &genai.Schema{ Type: "OBJECT", Properties: map[string]*genai.Schema{ "query": { Type: "STRING", Description: "The query to search memory for.", }, }, Required: []string{"query"}, }, } } // Run executes the tool with the provided context and arguments. func (t *loadMemoryTool) Run(toolCtx tool.Context, args any) (map[string]any, error) { m, ok := args.(map[string]any) if !ok { return nil, fmt.Errorf("unexpected args type, got: %T", args) } queryRaw, exists := m["query"] if !exists { return nil, fmt.Errorf("missing required parameter: query") } query, ok := queryRaw.(string) if !ok { return nil, fmt.Errorf("query must be a string, got: %T", queryRaw) } searchResponse, err := toolCtx.SearchMemory(toolCtx, query) if err != nil { return nil, fmt.Errorf("failed to search memory: %w", err) } if searchResponse == nil || searchResponse.Memories == nil { return map[string]any{"memories": []memory.Entry{}}, nil } return map[string]any{"memories": searchResponse.Memories}, nil } // ProcessRequest processes the LLM request by packing the tool and appending // memory-related instructions. func (t *loadMemoryTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { if err := toolutils.PackTool(req, t); err != nil { return err } utils.AppendInstructions(req, memoryInstructions) return nil } ================================================ FILE: tool/loadmemorytool/tool_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package loadmemorytool_test import ( "context" "strings" "testing" "time" "google.golang.org/genai" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/loadmemorytool" ) type mockMemory struct { memories []memory.Entry err error } func (m *mockMemory) AddSessionToMemory(ctx context.Context, s session.Session) error { return nil } func (m *mockMemory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { if m.err != nil { return nil, m.err } return &memory.SearchResponse{Memories: m.memories}, nil } func TestLoadMemoryTool_BasicProperties(t *testing.T) { tool := loadmemorytool.New() if got := tool.Name(); got != "load_memory" { t.Errorf("Name() = %v, want load_memory", got) } if got := tool.Description(); got != "Loads the memory for the current user." { t.Errorf("Description() = %v, want 'Loads the memory for the current user.'", got) } if got := tool.IsLongRunning(); got != false { t.Errorf("IsLongRunning() = %v, want false", got) } } func TestLoadMemoryTool_Run(t *testing.T) { tool := loadmemorytool.New() tests := []struct { name string args map[string]any memories []memory.Entry wantLen int wantErr bool }{ { name: "empty memories", args: map[string]any{"query": "test query"}, memories: []memory.Entry{}, wantLen: 0, }, { name: "single memory entry", args: map[string]any{"query": "test query"}, memories: []memory.Entry{ { Author: "user", Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("Hello world", genai.RoleUser), }, }, wantLen: 1, }, { name: "multiple memory entries", args: map[string]any{"query": "search term"}, memories: []memory.Entry{ { Author: "user", Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("First memory", genai.RoleUser), }, { Author: "assistant", Timestamp: time.Date(2025, 1, 2, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("Second memory", genai.RoleModel), }, }, wantLen: 2, }, { name: "missing query parameter", args: map[string]any{}, wantErr: true, }, { name: "invalid query type", args: map[string]any{"query": 123}, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tc := createToolContext(t, &mockMemory{memories: tt.memories}) result, err := tool.Run(tc, tt.args) if (err != nil) != tt.wantErr { t.Fatalf("Run() error = %v, wantErr %v", err, tt.wantErr) } if tt.wantErr { return } memories, ok := result["memories"].([]memory.Entry) if !ok { t.Fatalf("result['memories'] is not []memory.Entry, got %T", result["memories"]) } if len(memories) != tt.wantLen { t.Errorf("Run() returned %d memories, want %d", len(memories), tt.wantLen) } }) } } func TestLoadMemoryTool_ProcessRequest(t *testing.T) { tool := loadmemorytool.New() tc := createToolContext(t, &mockMemory{}) llmRequest := &model.LLMRequest{} requestProcessor, ok := tool.(toolinternal.RequestProcessor) if !ok { t.Fatal("loadMemoryTool does not implement RequestProcessor") } err := requestProcessor.ProcessRequest(tc, llmRequest) if err != nil { t.Fatalf("ProcessRequest failed: %v", err) } if llmRequest.Config == nil || llmRequest.Config.SystemInstruction == nil { t.Fatal("ProcessRequest did not set SystemInstruction") } instruction := llmRequest.Config.SystemInstruction.Parts[0].Text if !strings.Contains(instruction, "You have memory") { t.Errorf("Instruction should contain 'You have memory', got: %v", instruction) } if !strings.Contains(instruction, "load_memory") { t.Errorf("Instruction should contain 'load_memory', got: %v", instruction) } } func createToolContext(t *testing.T, mem *mockMemory) tool.Context { t.Helper() ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Memory: mem, }) return toolinternal.NewToolContext(ctx, "", nil, nil) } ================================================ FILE: tool/mcptoolset/client.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mcptoolset import ( "context" "errors" "fmt" "io" "log" "sync" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/adk/internal/version" ) // MCPClient abstracts MCP session operations for easier connection management. type MCPClient interface { CallTool(context.Context, *mcp.CallToolParams) (*mcp.CallToolResult, error) ListTools(context.Context) ([]*mcp.Tool, error) } // connectionRefresher wraps an MCP client/transport and handles automatic reconnection. // It implements MCPClient and transparently retries operations after reconnecting // when the underlying session fails. type connectionRefresher struct { client *mcp.Client transport mcp.Transport mu sync.Mutex session *mcp.ClientSession } // refreshableErrors is a list of errors that should trigger a connection refresh. var refreshableErrors = []error{ mcp.ErrConnectionClosed, mcp.ErrSessionMissing, io.ErrClosedPipe, io.EOF, } // newConnectionRefresher creates a new connectionRefresher with the given client and transport. // If client is nil, a default MCP client will be created. func newConnectionRefresher(client *mcp.Client, transport mcp.Transport) *connectionRefresher { if client == nil { client = mcp.NewClient(&mcp.Implementation{Name: "adk-mcp-client", Version: version.Version}, nil) } return &connectionRefresher{ client: client, transport: transport, } } // CallTool calls a tool on the MCP server, automatically reconnecting if needed. func (c *connectionRefresher) CallTool(ctx context.Context, params *mcp.CallToolParams) (*mcp.CallToolResult, error) { result, _, err := withRetry(ctx, c, func(session *mcp.ClientSession) (*mcp.CallToolResult, error) { return session.CallTool(ctx, params) }) return result, err } // ListTools lists all available tools from the MCP server, handling pagination // and automatically reconnecting if needed. Per MCP spec, cursors do not persist // across sessions, so pagination restarts from scratch after reconnection. func (c *connectionRefresher) ListTools(ctx context.Context) ([]*mcp.Tool, error) { var tools []*mcp.Tool cursor := "" hasReconnected := false for { resp, reconnected, err := withRetry(ctx, c, func(session *mcp.ClientSession) (*mcp.ListToolsResult, error) { return session.ListTools(ctx, &mcp.ListToolsParams{Cursor: cursor}) }) if err != nil { return nil, fmt.Errorf("failed to list MCP tools: %w", err) } if reconnected { if hasReconnected { return nil, fmt.Errorf("failed to list MCP tools: connection lost again after reconnection") } // On reconnection, restart pagination from scratch per MCP spec. hasReconnected = true cursor = "" tools = nil continue } tools = append(tools, resp.Tools...) if resp.NextCursor == "" { break } cursor = resp.NextCursor } return tools, nil } // withRetry executes fn with the current session, and if it fails, attempts to refresh // the connection and retry once. Returns the result, whether a reconnection occurred, and any error. func withRetry[T any](ctx context.Context, c *connectionRefresher, fn func(*mcp.ClientSession) (T, error)) (T, bool, error) { var zero T session, err := c.getSession(ctx) if err != nil { return zero, false, err } result, err := fn(session) if err != nil { if !shouldRefreshConnection(err) { return zero, false, err } session, refreshErr := c.refreshConnection(ctx) if refreshErr != nil { return zero, false, fmt.Errorf("%w (reconnection also failed: %v)", err, refreshErr) } result, err = fn(session) return result, true, err } return result, false, err } // shouldRefreshConnection returns true if the error indicates we should // attempt to refresh the MCP connection. func shouldRefreshConnection(err error) bool { for _, target := range refreshableErrors { if errors.Is(err, target) { return true } } return false } func (c *connectionRefresher) getSession(ctx context.Context) (*mcp.ClientSession, error) { c.mu.Lock() defer c.mu.Unlock() if c.session != nil { return c.session, nil } session, err := c.client.Connect(ctx, c.transport, nil) if err != nil { return nil, fmt.Errorf("failed to init MCP session: %w", err) } c.session = session return c.session, nil } func (c *connectionRefresher) refreshConnection(ctx context.Context) (*mcp.ClientSession, error) { c.mu.Lock() defer c.mu.Unlock() // Ping to verify the connection is actually dead before reconnecting. // This handles the case where another goroutine already reconnected. if c.session != nil { if err := c.session.Ping(ctx, &mcp.PingParams{}); err == nil { return c.session, nil } if err := c.session.Close(); err != nil { log.Printf("failed to close MCP session: %v", err) } c.session = nil } session, err := c.client.Connect(ctx, c.transport, nil) if err != nil { return nil, fmt.Errorf("failed to refresh MCP session: %w", err) } c.session = session return c.session, nil } var _ MCPClient = (*connectionRefresher)(nil) ================================================ FILE: tool/mcptoolset/set.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package mcptoolset provides an MCP tool set. package mcptoolset import ( "fmt" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/adk/agent" "google.golang.org/adk/tool" ) // New returns MCP ToolSet. // MCP ToolSet connects to a MCP Server, retrieves MCP Tools into ADK Tools and // passes them to the LLM. // It uses https://github.com/modelcontextprotocol/go-sdk for MCP communication. // MCP session is created lazily on the first request to LLM. // // Usage: create MCP ToolSet with mcptoolset.New() and provide it to the // LLMAgent in the llmagent.Config. // // Example: // // llmagent.New(llmagent.Config{ // Name: "agent_name", // Model: model, // Description: "...", // Instruction: "...", // Toolsets: []tool.Set{ // mcptoolset.New(mcptoolset.Config{ // Transport: &mcp.CommandTransport{Command: exec.Command("myserver")} // }), // }, // }) func New(cfg Config) (tool.Toolset, error) { return &set{ mcpClient: newConnectionRefresher(cfg.Client, cfg.Transport), toolFilter: cfg.ToolFilter, requireConfirmation: cfg.RequireConfirmation, requireConfirmationProvider: cfg.RequireConfirmationProvider, }, nil } // Config provides initial configuration for the MCP ToolSet. type Config struct { // Client is an optional custom MCP client to use. If nil, a default client will be created. Client *mcp.Client // Transport that will be used to connect to MCP server. Transport mcp.Transport // Deprecated: use tool.FilterToolset instead. // ToolFilter selects tools for which tool.Predicate returns true. // If ToolFilter is nil, then all tools are returned. // tool.StringPredicate can be convenient if there's a known fixed list of tool names. ToolFilter tool.Predicate // RequireConfirmation flags whether the tools from this toolset must always ask for user confirmation // before execution. If set to true, the ADK framework will automatically initiate // a Human-in-the-Loop (HITL) confirmation request when a tool is invoked. RequireConfirmation bool // RequireConfirmationProvider allows for dynamic determination of whether // user confirmation is needed. This field is a function called at runtime to decide if // a confirmation request should be sent. The function takes the toolName and tool's input parameters as arguments. // This provider offers more flexibility than the static RequireConfirmation flag, // enabling conditional confirmation based on the invocation details. // If set, this takes precedence over the RequireConfirmation flag. // // Required signature for a provider function: // func(name string, toolInput any) bool // Returning true means confirmation is required. RequireConfirmationProvider tool.ConfirmationProvider } type set struct { mcpClient MCPClient toolFilter tool.Predicate requireConfirmation bool requireConfirmationProvider tool.ConfirmationProvider } func (*set) Name() string { return "mcp_tool_set" } func (*set) Description() string { return "Connects to a MCP Server, retrieves MCP Tools into ADK Tools." } func (*set) IsLongRunning() bool { return false } // Tools fetch MCP tools from the server, convert to adk tool.Tool and filter by name. func (s *set) Tools(ctx agent.ReadonlyContext) ([]tool.Tool, error) { mcpTools, err := s.mcpClient.ListTools(ctx) if err != nil { return nil, err } var adkTools []tool.Tool for _, mcpTool := range mcpTools { t, err := convertTool(mcpTool, s.mcpClient, s.requireConfirmation, s.requireConfirmationProvider) if err != nil { return nil, fmt.Errorf("failed to convert MCP tool %q to adk tool: %w", mcpTool.Name, err) } if s.toolFilter != nil && !s.toolFilter(ctx, t) { continue } adkTools = append(adkTools, t) } return adkTools, nil } ================================================ FILE: tool/mcptoolset/set_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mcptoolset_test import ( "context" "errors" "fmt" "io" "log" "net/http" "path/filepath" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/genai" "google.golang.org/adk/agent/llmagent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/httprr" "google.golang.org/adk/internal/testutil" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/model" "google.golang.org/adk/model/gemini" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/mcptoolset" "google.golang.org/adk/tool/toolconfirmation" ) type Input struct { City string `json:"city" jsonschema:"city name"` } type Output struct { WeatherSummary string `json:"weather_summary" jsonschema:"weather summary in the given city"` } func weatherFunc(ctx context.Context, req *mcp.CallToolRequest, input Input) (*mcp.CallToolResult, Output, error) { return nil, Output{ WeatherSummary: fmt.Sprintf("Today in %q is sunny", input.City), }, nil } const modelName = "gemini-2.5-flash" //go:generate go test -v -httprecord=.* func TestMCPToolSet(t *testing.T) { const ( toolName = "get_weather" toolDescription = "returns weather in the given city" ) clientTransport, serverTransport := mcp.NewInMemoryTransports() // Run in-memory MCP server. server := mcp.NewServer(&mcp.Implementation{Name: "weather_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: toolName, Description: toolDescription}, weatherFunc) _, err := server.Connect(t.Context(), serverTransport, nil) if err != nil { t.Fatal(err) } ts, err := mcptoolset.New(mcptoolset.Config{ Transport: clientTransport, }) if err != nil { t.Fatalf("Failed to create MCP tool set: %v", err) } agent, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: newGeminiModel(t, modelName), Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Toolsets: []tool.Toolset{ ts, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } prompt := "what is the weather in london?" runner := testutil.NewTestAgentRunner(t, agent) var gotEvents []*session.Event for event, err := range runner.Run(t, "session1", prompt) { if err != nil { t.Fatal(err) } gotEvents = append(gotEvents, event) } wantEvents := []*session.Event{ { Author: "weather_time_agent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionCall: &genai.FunctionCall{ Name: toolName, Args: map[string]any{"city": "london"}, }, }, }, Role: genai.RoleModel, }, ModelVersion: "gemini-2.5-flash", }, }, { Author: "weather_time_agent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { FunctionResponse: &genai.FunctionResponse{ Name: toolName, Response: map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "london" is sunny`)}, }, }, }, }, Role: genai.RoleUser, }, }, }, { Author: "weather_time_agent", LLMResponse: model.LLMResponse{ Content: &genai.Content{ Parts: []*genai.Part{ { Text: `The weather in London is sunny.`, }, }, Role: genai.RoleModel, }, ModelVersion: "gemini-2.5-flash", }, }, } if diff := cmp.Diff(wantEvents, gotEvents, cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID"), cmpopts.IgnoreFields(session.EventActions{}, "StateDelta", "ArtifactDelta"), cmpopts.IgnoreFields(model.LLMResponse{}, "UsageMetadata", "AvgLogprobs", "FinishReason"), cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID"), cmpopts.IgnoreFields(genai.Part{}, "ThoughtSignature")); diff != "" { t.Errorf("event[i] mismatch (-want +got):\n%s", diff) } } func newGeminiTestClientConfig(t *testing.T, rrfile string) (http.RoundTripper, bool) { t.Helper() rr, err := testutil.NewGeminiTransport(rrfile) if err != nil { t.Fatal(err) } // Ensure the transport is closed to flush data and release locks if c, ok := rr.(io.Closer); ok { t.Cleanup(func() { if err := c.Close(); err != nil { t.Errorf("failed to close transport: %v", err) } }) } recording, _ := httprr.Recording(rrfile) return rr, recording } func newGeminiModel(t *testing.T, modelName string) model.LLM { apiKey := "fakeKey" trace := filepath.Join("testdata", strings.ReplaceAll(t.Name()+".httprr", "/", "_")) recording := false transport, recording := newGeminiTestClientConfig(t, trace) if recording { // if we are recording httprr trace, don't use the fakeKey. apiKey = "" } model, err := gemini.NewModel(t.Context(), modelName, &genai.ClientConfig{ HTTPClient: &http.Client{Transport: transport}, APIKey: apiKey, }) if err != nil { t.Fatalf("failed to create model: %v", err) } return model } func TestToolFilter(t *testing.T) { const toolDescription = "returns weather in the given city" clientTransport, serverTransport := mcp.NewInMemoryTransports() server := mcp.NewServer(&mcp.Implementation{Name: "weather_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "get_weather", Description: toolDescription}, weatherFunc) mcp.AddTool(server, &mcp.Tool{Name: "get_weather1", Description: toolDescription}, weatherFunc) _, err := server.Connect(t.Context(), serverTransport, nil) if err != nil { t.Fatal(err) } ts, err := mcptoolset.New(mcptoolset.Config{ Transport: clientTransport, ToolFilter: tool.StringPredicate([]string{"get_weather"}), }) if err != nil { t.Fatalf("Failed to create MCP tool set: %v", err) } tools, err := ts.Tools(icontext.NewReadonlyContext( icontext.NewInvocationContext( t.Context(), icontext.InvocationContextParams{}, ), )) if err != nil { t.Fatalf("Failed to get tools: %v", err) } gotToolNames := make([]string, len(tools)) for i, tool := range tools { gotToolNames[i] = tool.Name() } wantToolNames := []string{"get_weather"} if diff := cmp.Diff(wantToolNames, gotToolNames); diff != "" { t.Errorf("tools mismatch (-want +got):\n%s", diff) } } func TestListToolsReconnection(t *testing.T) { server := mcp.NewServer(&mcp.Implementation{Name: "test_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "get_weather", Description: "returns weather in the given city"}, weatherFunc) rt := &reconnectableTransport{server: server} spyTransport := &spyTransport{Transport: rt} ts, err := mcptoolset.New(mcptoolset.Config{ Transport: spyTransport, }) if err != nil { t.Fatalf("Failed to create MCP tool set: %v", err) } ctx := icontext.NewReadonlyContext(icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{})) // First call to Tools should create a session. _, err = ts.Tools(ctx) if err != nil { t.Fatalf("First Tools call failed: %v", err) } // Kill the transport by closing the connection. if err := spyTransport.lastConn.Close(); err != nil { t.Fatalf("Failed to close connection: %v", err) } // Second call should detect the closed connection and reconnect. _, err = ts.Tools(ctx) if err != nil { t.Fatalf("Second Tools call failed: %v", err) } // Verify that we reconnected (should have 2 connections). if spyTransport.connectCount != 2 { t.Errorf("Expected 2 Connect calls (reconnect after close), got %d", spyTransport.connectCount) } } func TestCallToolReconnection(t *testing.T) { server := mcp.NewServer(&mcp.Implementation{Name: "test_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "get_weather", Description: "returns weather in the given city"}, weatherFunc) rt := &reconnectableTransport{server: server} spyTransport := &spyTransport{Transport: rt} ts, err := mcptoolset.New(mcptoolset.Config{ Transport: spyTransport, }) if err != nil { t.Fatalf("Failed to create MCP tool set: %v", err) } invCtx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{}) ctx := icontext.NewReadonlyContext(invCtx) toolCtx := toolinternal.NewToolContext(invCtx, "", nil, nil) // Get tools first to establish a session. tools, err := ts.Tools(ctx) if err != nil { t.Fatalf("Tools call failed: %v", err) } // Kill the transport by closing the connection. if err := spyTransport.lastConn.Close(); err != nil { t.Fatalf("Failed to close connection: %v", err) } // Call the tool - should reconnect and succeed. fnTool := tools[0].(toolinternal.FunctionTool) result, err := fnTool.Run(toolCtx, map[string]any{"city": "Paris"}) if err != nil { t.Fatalf("Tool call after reconnect failed: %v", err) } if result == nil { t.Fatal("Expected non-nil result after reconnect") } // Verify that we reconnected (should have 2 connections). if spyTransport.connectCount != 2 { t.Errorf("Expected 2 Connect calls (reconnect after close), got %d", spyTransport.connectCount) } } type spyTransport struct { mcp.Transport connectCount int lastConn mcp.Connection } func (t *spyTransport) Connect(ctx context.Context) (mcp.Connection, error) { t.connectCount++ conn, err := t.Transport.Connect(ctx) t.lastConn = conn return conn, err } type reconnectableTransport struct { server *mcp.Server } func (rt *reconnectableTransport) Connect(ctx context.Context) (mcp.Connection, error) { ct, st := mcp.NewInMemoryTransports() _, err := rt.server.Connect(ctx, st, nil) if err != nil { return nil, err } return ct.Connect(ctx) } func TestMCPToolSetConfirmation(t *testing.T) { const ( toolName = "get_weather" toolDescription = "returns weather in the given city" ) requireConfirmationProvider := func(name string, args any) bool { if name != toolName { return false } if input, ok := args.(Input); ok { return input.City == "Lisbon" } if m, ok := args.(map[string]any); ok { if cityVal, found := m["city"]; found { if cityStr, isStr := cityVal.(string); isStr { return cityStr == "Lisbon" } } } return true } testCases := []struct { name string toolSetConfig mcptoolset.Config city string confirmFunctionResponse *genai.FunctionResponse // User's confirmation response want []*genai.Content }{ { name: "No Confirmation Required", toolSetConfig: mcptoolset.Config{}, city: "Lisbon", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "Lisbon" is sunny`)}, }, "user"), genai.NewContentFromText(`Today in "Lisbon" is sunny`, "model"), }, }, { name: "Confirmation Required", toolSetConfig: mcptoolset.Config{ RequireConfirmation: true, }, city: "Lisbon", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), }, }, { name: "Confirmation Required and is confirmed", toolSetConfig: mcptoolset.Config{ RequireConfirmation: true, }, city: "Lisbon", confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": true}}, want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "Lisbon" is sunny`)}, }, "user"), genai.NewContentFromText(`Today in "Lisbon" is sunny`, "model"), }, }, { name: "Confirmation Required and is rejected", toolSetConfig: mcptoolset.Config{ RequireConfirmation: true, }, city: "Lisbon", confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": false}}, want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" call is rejected"), }, "user"), genai.NewContentFromText("I am sorry, I cannot get the weather in Lisbon.", "model"), }, }, { name: "Conditional Confirmation Not Required", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: requireConfirmationProvider, }, city: "Porto", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Porto"}, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "Porto" is sunny`)}, }, "user"), genai.NewContentFromText(`Today in "Porto" is sunny`, "model"), }, }, { name: "Conditional Confirmation Not Required For This Tool", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: func(name string, args any) bool { return name != toolName }, }, city: "Lisbon", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "Lisbon" is sunny`)}, }, "user"), genai.NewContentFromText(`Today in "Lisbon" is sunny`, "model"), }, }, { name: "Conditional Confirmation Required For This Tool", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: func(name string, args any) bool { return name == toolName }, }, city: "Lisbon", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), }, }, { name: "Conditional Confirmation Required", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: requireConfirmationProvider, }, city: "Lisbon", want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), }, }, { name: "Conditional Confirmation Required and is confirmed", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: requireConfirmationProvider, }, city: "Lisbon", confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": true}}, want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "output": map[string]any{"weather_summary": string(`Today in "Lisbon" is sunny`)}, }, "user"), genai.NewContentFromText(`Today in "Lisbon" is sunny`, "model"), }, }, { name: "Conditional Confirmation Required and is rejected", toolSetConfig: mcptoolset.Config{ RequireConfirmationProvider: requireConfirmationProvider, }, city: "Lisbon", confirmFunctionResponse: &genai.FunctionResponse{Name: toolconfirmation.FunctionCallName, Response: map[string]any{"confirmed": false}}, want: []*genai.Content{ genai.NewContentFromFunctionCall(toolName, map[string]any{"city": "Lisbon"}, "model"), genai.NewContentFromFunctionCall(toolconfirmation.FunctionCallName, map[string]any{ "originalFunctionCall": &genai.FunctionCall{ Args: map[string]any{"city": "Lisbon"}, Name: toolName, }, "toolConfirmation": toolconfirmation.ToolConfirmation{ Hint: "Please approve or reject the tool call get_weather() by responding with a FunctionResponse with an expected ToolConfirmation payload.", }, }, "model"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" requires confirmation, please approve or reject"), }, "user"), genai.NewContentFromFunctionResponse(toolName, map[string]any{ "error": errors.New("error tool \"get_weather\" call is rejected"), }, "user"), genai.NewContentFromText("I am sorry, I cannot get the weather in Lisbon.", "model"), }, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { clientTransport, serverTransport := mcp.NewInMemoryTransports() // Run in-memory MCP server. server := mcp.NewServer(&mcp.Implementation{Name: "weather_server", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: toolName, Description: toolDescription}, weatherFunc) _, err := server.Connect(t.Context(), serverTransport, nil) if err != nil { t.Fatal(err) } tc.toolSetConfig.Transport = clientTransport ts, err := mcptoolset.New(tc.toolSetConfig) if err != nil { t.Fatalf("Failed to create MCP tool set: %v", err) } agent, err := llmagent.New(llmagent.Config{ Name: "weather_time_agent", Model: newGeminiModel(t, modelName), Description: "Agent to answer questions about the time and weather in a city.", Instruction: "I can answer your questions about the time and weather in a city.", Toolsets: []tool.Toolset{ ts, }, }) if err != nil { log.Fatalf("Failed to create agent: %v", err) } prompt := fmt.Sprintf("what is the weather in %s?", tc.city) runner := testutil.NewTestAgentRunner(t, agent) ev := runner.Run(t, "session1", prompt) comptsList := []cmp.Option{ cmpopts.IgnoreFields(session.Event{}, "ID", "Timestamp", "InvocationID"), cmpopts.IgnoreFields(session.EventActions{}, "StateDelta"), cmpopts.IgnoreFields(model.LLMResponse{}, "UsageMetadata", "AvgLogprobs", "FinishReason"), cmpopts.IgnoreFields(genai.FunctionCall{}, "ID"), cmpopts.IgnoreFields(genai.FunctionResponse{}, "ID"), cmpopts.IgnoreFields(genai.Part{}, "ThoughtSignature"), cmp.Transformer("StringifyMapErrors", func(m map[string]any) map[string]any { out := make(map[string]any, len(m)) for k, v := range m { // Check if the value inside the map is an error if err, ok := v.(error); ok { out[k] = err.Error() // Convert to string } else { out[k] = v // Keep as is } } return out }), } eventCount := 0 var confirmFunctionCall *genai.FunctionCall for got, err := range ev { if err != nil && err.Error() == "no data" { break } if err != nil { // Check if an error was expected t.Fatalf("runner returned unexpected error: %v", err) // If error was expected, we can stop here or check for a specific error type. return } if eventCount >= len(tc.want) { t.Fatalf("stream generated more values than the expected %d. Got: %+v", len(tc.want), got.Content) } if diff := cmp.Diff(tc.want[eventCount], got.Content, comptsList...); diff != "" { t.Errorf("LoopAgent Run() mismatch (-want +got):\n%s", diff) } for _, p := range got.Content.Parts { if p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName { confirmFunctionCall = p.FunctionCall } } eventCount++ } if confirmFunctionCall != nil && tc.confirmFunctionResponse != nil { tc.confirmFunctionResponse.ID = confirmFunctionCall.ID ev := runner.RunContent(t, "session1", &genai.Content{ Parts: []*genai.Part{{FunctionResponse: tc.confirmFunctionResponse}}, }) for got, err := range ev { if err != nil && err.Error() == "no data" { break } if err != nil { // Check if an error was expected t.Fatalf("runner returned unexpected error: %v", err) // If error was expected, we can stop here or check for a specific error type. return } if eventCount >= len(tc.want) { t.Fatalf("stream generated more values than the expected %d. Got: %+v", len(tc.want), got.Content) } if diff := cmp.Diff(tc.want[eventCount], got.Content, comptsList...); diff != "" { t.Errorf("LoopAgent Run() mismatch (-want +got):\n%s", diff) } for _, p := range got.Content.Parts { if p.FunctionCall != nil && p.FunctionCall.Name == toolconfirmation.FunctionCallName { confirmFunctionCall = p.FunctionCall } } eventCount++ } } // Final check on the number of events if eventCount != len(tc.want) { t.Errorf("unexpected stream length, want %d got %d", len(tc.want), eventCount) } }) } } // Mock types for TArgs and TResults type TestArgs struct { Name string } type TestResult struct { Value int } func TestNewToolSet_RequireConfirmationProvider_Validation(t *testing.T) { tests := []struct { name string provider tool.ConfirmationProvider // The provider to test }{ // --- Happy Paths --- { name: "Valid: Nil provider is allowed", provider: nil, }, { name: "Valid: Correct function signature", provider: func(name string, args any) bool { return true }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Construct config with the provider under test clientTransport, serverTransport := mcp.NewInMemoryTransports() // Run in-memory MCP server. server := mcp.NewServer(&mcp.Implementation{Name: "test", Version: "v1.0.0"}, nil) mcp.AddTool(server, &mcp.Tool{Name: "test", Description: "test"}, weatherFunc) _, err := server.Connect(t.Context(), serverTransport, nil) if err != nil { t.Fatal(err) } toolSetConfig := mcptoolset.Config{ Transport: clientTransport, RequireConfirmationProvider: tt.provider, } toolset, err := mcptoolset.New(toolSetConfig) if err != nil { t.Fatalf("unexpected error: %v", err) } if toolset == nil { t.Error("expected valid toolset, got nil") } }) } } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSet.httprr ================================================ httprr trace v1 1090 1396 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in london?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:23 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=715 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "london" } }, "thoughtSignature": "CvABAb4+9vt2kwGSfJuUdi6kZ6iW6ZEosxtgyl9Q8w0+TXXm3xp+qWMxg5aOSf6sT97uxxM+zVP5g7TKv0B3+GqUW+JqYo7gRlVtmy6+cuJk90u3+zmlaw4ACnCJPc5jZk3oKHFUr+IXK9dH4R9fIhz0W1d4YLV4fsyvHd0Yf1o5EqhFngoXrXcJDE8SKlTSm4vrKdMJ8D8jKjSNPwqq+psPyGkoK1Qywdf+HD23fhLH9a+Ag3yD1xYzh3g38LC/siL0FM/3r65scTej6bW5eEdV1ulaZDADKD/mDAhhSRtU0SdlyXjCWpB53AaxYwarhypU" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 15, "totalTokenCount": 211, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 47 }, "modelVersion": "gemini-2.5-flash", "responseId": "EiawaayZGojv7M8P_KX6gAo" } 1672 845 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1439 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in london?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"london"},"name":"get_weather"},"thoughtSignature":"CvABAb4+9vt2kwGSfJuUdi6kZ6iW6ZEosxtgyl9Q8w0+TXXm3xp+qWMxg5aOSf6sT97uxxM+zVP5g7TKv0B3+GqUW+JqYo7gRlVtmy6+cuJk90u3+zmlaw4ACnCJPc5jZk3oKHFUr+IXK9dH4R9fIhz0W1d4YLV4fsyvHd0Yf1o5EqhFngoXrXcJDE8SKlTSm4vrKdMJ8D8jKjSNPwqq+psPyGkoK1Qywdf+HD23fhLH9a+Ag3yD1xYzh3g38LC/siL0FM/3r65scTej6bW5eEdV1ulaZDADKD/mDAhhSRtU0SdlyXjCWpB53AaxYwarhypU"}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"london\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:09:23 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=342 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "The weather in London is sunny." } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 191, "candidatesTokenCount": 7, "totalTokenCount": 198, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 191 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "Eyawadu4Bprf7M8P8_738Ag" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required.httprr ================================================ httprr trace v1 1089 1499 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 857 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Porto?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:44 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=733 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Porto" } }, "thoughtSignature": "CrwCAb4+9vsuvs2W3gqNDffylURPr+r1NjkdtDGegBWRhMfeZBBxJ8oIuQAl3LwxUxMOjCJcj6t3/vFY1wFIFPgDhkYmXV0cJjyinX7wSgQG0SR4qJwGMcc5Db9MO9+5IVJipYnjTgh2CQUkNWU2AwYJ5JJxTmR3sXelhh8LHnfvnzMQeKbkuhqWWw9AuOjWqflEfd4kyoxr9nuC7WzE1y2k8m/ZLMqOttgXwJ8cLCWCyDLLu8leyCtjDg4jusnqo4HnIY1UruEMEiFuDFaAyuHXamRexWRoypQzyht4UuFPL9fgFOLKEMnaedZ9Jy9yYEr8k88x0MaLx8wX9Kki8SbDWshduBqvPn5B2bafyYxd8gQGdJa9ujn7CC6wloibeZUlPS+1yi9jhOn52X0w0KES62KZHBaH9GOpj85cTg==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 238, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 73 }, "modelVersion": "gemini-2.5-flash", "responseId": "6yWwacjDOIzGnsEP3Ja76Ag" } 1773 841 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1540 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Porto?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Porto"},"name":"get_weather"},"thoughtSignature":"CrwCAb4+9vsuvs2W3gqNDffylURPr+r1NjkdtDGegBWRhMfeZBBxJ8oIuQAl3LwxUxMOjCJcj6t3/vFY1wFIFPgDhkYmXV0cJjyinX7wSgQG0SR4qJwGMcc5Db9MO9+5IVJipYnjTgh2CQUkNWU2AwYJ5JJxTmR3sXelhh8LHnfvnzMQeKbkuhqWWw9AuOjWqflEfd4kyoxr9nuC7WzE1y2k8m/ZLMqOttgXwJ8cLCWCyDLLu8leyCtjDg4jusnqo4HnIY1UruEMEiFuDFaAyuHXamRexWRoypQzyht4UuFPL9fgFOLKEMnaedZ9Jy9yYEr8k88x0MaLx8wX9Kki8SbDWshduBqvPn5B2bafyYxd8gQGdJa9ujn7CC6wloibeZUlPS+1yi9jhOn52X0w0KES62KZHBaH9GOpj85cTg=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"Porto\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:45 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=906 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Today in \"Porto\" is sunny" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 193, "candidatesTokenCount": 8, "totalTokenCount": 201, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 193 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "7CWwaeWaKLyvnsEP3tfsiQk" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Not_Required_For_This_Tool.httprr ================================================ httprr trace v1 1090 1437 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:21:14 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1229 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "Co4CAb4+9vvBrIepyCDIV6Vd6zGtdvHmdC0sq4IW7P/OliVvLoElltfi130x27agIkHSe69dkjs4/BqZNKScmSypU6XXprdMOINiGwcPfoInPdQT06hWWGL9qDB65YbyWsw21ylto7SUtS6yNDG8QZwbjN+7Pri45Xov8iCQVveDXslEVrmJ0yAL2xz/nwWR6iAJWRYwleHVIyJNHLgIx5mSxOdfcoltUt0EMvR/8MlB7aNhtK2juGREd3Ga9e1sxkZdT8eBcfd2H8ghUpzp8fswMNd+tfkIKXAzijaBQ3aO51whIPPFkw7k+lF2F5Bo67pg5R2FOLVT5CYWk6hjJpQiWSSe2o09DTnH7FOa+YKp" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 227, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 62 }, "modelVersion": "gemini-2.5-flash", "responseId": "2SiwacipCfH3nsEP2v-88AQ" } 1712 842 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1479 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"Co4CAb4+9vvBrIepyCDIV6Vd6zGtdvHmdC0sq4IW7P/OliVvLoElltfi130x27agIkHSe69dkjs4/BqZNKScmSypU6XXprdMOINiGwcPfoInPdQT06hWWGL9qDB65YbyWsw21ylto7SUtS6yNDG8QZwbjN+7Pri45Xov8iCQVveDXslEVrmJ0yAL2xz/nwWR6iAJWRYwleHVIyJNHLgIx5mSxOdfcoltUt0EMvR/8MlB7aNhtK2juGREd3Ga9e1sxkZdT8eBcfd2H8ghUpzp8fswMNd+tfkIKXAzijaBQ3aO51whIPPFkw7k+lF2F5Bo67pg5R2FOLVT5CYWk6hjJpQiWSSe2o09DTnH7FOa+YKp"}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"Lisbon\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:21:14 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=407 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Today in \"Lisbon\" is sunny" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 193, "candidatesTokenCount": 8, "totalTokenCount": 201, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 193 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "2iiwadyXFYenkdUP2u2b8Ak" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required.httprr ================================================ httprr trace v1 1090 1508 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:48 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=736 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CsMCAb4+9vvVsnVfseCsSqZxjM76GncXWUsuzW95bX3Q7wCJMZVLWqAJyveqJXd0wX/Ov2UjzJZdj1gh9ugUuBiIYAqH+5l5YXXdK1VLTox2GRBrpP+MRbXalDLo+xlpUBHIqQC8JLCnVSaZXx7BJ0nbAfiuGDxKCXnkofKozyq0hQwo2KNz8IKRYVI4S68+KAUIoi4iKQk7Gm8aw2P0frR7TcBxqk6lRobncCzHgK66bh+Y5lDFXoWC1q6Lkw1WBYAQZcU1Kq0vgssg+nGc7zqg+tjq9+S1hJt/OerhxuYfW3z95wv7T7oDiX+UBRidpaCLAHR39hxwYlV9B7Ov2nHstsTTWukNOlDMZBFV3AkroHWVZNaUpOPL37cfAns8xZKbY3T+iXU2nUFHpXscRWsLY1XRhdOunaDtaamEsnmr/M946lY=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 240, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 75 }, "modelVersion": "gemini-2.5-flash", "responseId": "7yWwaY-mKLLn7M8P-dK7yQU" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_For_This_Tool.httprr ================================================ httprr trace v1 1090 1456 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:47 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=847 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CpsCAb4+9vuzvowP9R8IinEiJ1J68njC3Sqpy4x5TrMbf7JiTqqBjuw49XSDrt8UMaLD1SyIb919mEy/8KycFbQTXQxf5gHkKjLQ8AAQ4EEL0J3wlOI5KVbG6qG+sKT48Oj1aE8vwR92p2gmVnbGIvKFPIqSrSMcscaYkL7F3DX+J9ObZTfs9YG21o51A3bZm2QLIRORAbJ/nL4LhgvoniVyZAOXMxS2M/pB6L0VVLo9jLlNh66Egpp9e+3RsugWcZ+clTLw3fCOV0nz3h7WEu0vEzydELnK9vHxKjB9ikGRp476FGC7wj6qdhoEZCabAbpNyAMwhBqF0D/DZ0nLc60YcJvIYItfx2U5BjiHBCJRHMvUgGzDgV+epSDBJg==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 228, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 63 }, "modelVersion": "gemini-2.5-flash", "responseId": "7iWwaaOJMrOensEPmuPpsQo" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_confirmed.httprr ================================================ httprr trace v1 1090 1452 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:49 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=776 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CpoCAb4+9vtJhl05lkfOP1l9jngLAI1bvPPno4epalODaZKgBBts4I7dZRUMugaSuVn36ahSDuRZC0UP5UkdQEUhpiNUT6TUKmRQ5CCAfjrXuOJ33ARA+oR64Aiys5vPfTh3F/tRVyskBWYRxKCP9vpB+C2tT16l3WzPR6bjeA0ECsa2H9QTHiHKxU/li/P2Gvotia1mu9qmWyJZj2oZ/R6fgDDcmkhxfpR5TwQ7Un/P8P3lqLavZn57SWDRI3S6EIaDqnH1RKJLu1QinGtuxUqfpWIcS/Bi6ys2YVy+8vQsEJSwz/t9PZ7FBgk6Q98aycW3EadmyOnnUR2FHHgi9RyOc96Vqhg4nCcxV2MZu+IgfZ2bZyzPGMnlXISR" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 229, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 64 }, "modelVersion": "gemini-2.5-flash", "responseId": "8CWwadijGaGF7M8Pn7bJqAE" } 1728 842 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1495 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"CpoCAb4+9vtJhl05lkfOP1l9jngLAI1bvPPno4epalODaZKgBBts4I7dZRUMugaSuVn36ahSDuRZC0UP5UkdQEUhpiNUT6TUKmRQ5CCAfjrXuOJ33ARA+oR64Aiys5vPfTh3F/tRVyskBWYRxKCP9vpB+C2tT16l3WzPR6bjeA0ECsa2H9QTHiHKxU/li/P2Gvotia1mu9qmWyJZj2oZ/R6fgDDcmkhxfpR5TwQ7Un/P8P3lqLavZn57SWDRI3S6EIaDqnH1RKJLu1QinGtuxUqfpWIcS/Bi6ys2YVy+8vQsEJSwz/t9PZ7FBgk6Q98aycW3EadmyOnnUR2FHHgi9RyOc96Vqhg4nCcxV2MZu+IgfZ2bZyzPGMnlXISR"}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"Lisbon\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:49 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=392 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Today in \"Lisbon\" is sunny" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 193, "candidatesTokenCount": 8, "totalTokenCount": 201, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 193 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "8SWwab_4C-LW7M8P57HViAE" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Conditional_Confirmation_Required_and_is_rejected.httprr ================================================ httprr trace v1 1090 1517 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:50 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1307 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CskCAb4+9vu7Zz79+vWht/1PHkM+DYL3dHUxRJXWqgp6ej19WF5oCJPP9JRTUy0lsBZq6rX/kIAcLKN1METnz6NyR5R5yGfLAI53fckY29mE0JQqXnAULrd31w1yrMlsYfYQVn8fY2nj15e6QrbmWuF7sxgrFA91GXq66Et4Py0ob3eOnWZ4l9D5JIPMfl5GPcDcFV7gEepOLlNI8Blz7SsaENg05AaO1qH/evmuCAvFrhA8oNjFKcubvLhx8gh14rACgQ2VS9ebzHJfoHSmJIVpJ+MLwAi25c8dh9ReQ16Vbgo4TF2fKP5331w064v3Vpevb4w5kTyf+GxxnlJJIsZhO9uKn34qbkJBsjm/F9dnfgXqrNSbtN3/OkWALzFdXGGA4bbJwtxcyIdO9qhTzJHLhcqqZK5zAXNT7/ozM394Wm/+gkdVUCXzz/4=" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 242, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 77 }, "modelVersion": "gemini-2.5-flash", "responseId": "8SWwaZnvI4jp7M8P4ajSyAc" } 1786 1373 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1553 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"CskCAb4+9vu7Zz79+vWht/1PHkM+DYL3dHUxRJXWqgp6ej19WF5oCJPP9JRTUy0lsBZq6rX/kIAcLKN1METnz6NyR5R5yGfLAI53fckY29mE0JQqXnAULrd31w1yrMlsYfYQVn8fY2nj15e6QrbmWuF7sxgrFA91GXq66Et4Py0ob3eOnWZ4l9D5JIPMfl5GPcDcFV7gEepOLlNI8Blz7SsaENg05AaO1qH/evmuCAvFrhA8oNjFKcubvLhx8gh14rACgQ2VS9ebzHJfoHSmJIVpJ+MLwAi25c8dh9ReQ16Vbgo4TF2fKP5331w064v3Vpevb4w5kTyf+GxxnlJJIsZhO9uKn34qbkJBsjm/F9dnfgXqrNSbtN3/OkWALzFdXGGA4bbJwtxcyIdO9qhTzJHLhcqqZK5zAXNT7/ozM394Wm/+gkdVUCXzz/4="}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"error":"error tool \"get_weather\" call is rejected"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:51 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1122 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "I am sorry, I cannot get the weather in Lisbon.", "thoughtSignature": "CsgCAb4+9vuqzbE+NavXuzJpmRjhPijB11oEpwUVOvsIE8Qt8foUrderfoFT3U9DSjnUYJ8Fat/fgtfDTFzn3uhiJs9onmQy2lPPiIHbfAkV9WLoVWEx5AleAsPwqHWomLfcaUfxvfTOlx8tdiIUfMJmLAZvAGgT6IlwxmEpvVIqyKMRwJJ2LQZ6srn20FvJ8vMgyx71r+0+7+YOzcRkl6q/Zu8nOKvALVpaYuA+5pgGGkURV4EJGSuWvPzxWoAvSE1tjr652c0yv4EfowgiWuFcbJRUiY6cP07T0mnkzeSqnZOM57EKw5TYvYD0OGH2LqkZEcrkL/ah7nCAF8KZuIhkyHMjD95xAYlB7IqvypOaZwC14wnIK2UE/zu1c6+2mcsYZoeuxlhTc0emrYSWhCmlzVsLoGDuEkTbSJhQNI+tSoSlAROwUELiKQ==" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 189, "candidatesTokenCount": 12, "totalTokenCount": 266, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 189 } ], "thoughtsTokenCount": 65 }, "modelVersion": "gemini-2.5-flash", "responseId": "8iWwabSiN-SkkdUPj4n08Qw" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required.httprr ================================================ httprr trace v1 1090 1384 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:40 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=669 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CuUBAb4+9vttS2eKqg6oxdrmGp4qnJEpsRkZXa4wp7zqIJI+UWEALW183sDZUc0YH5FcPayov3uWmB1iKgbNGkNnFtLJtCaszZVHrzyk+NBCN4gGveKQPvlnpwmfdJzc6xfWfje2E8rt9f9R38uDRAkZt6emcSule+CNaebgxpnm2iMvfgNl8Q7ndfDpkEFXrgRi1l43nh/Q9igFG6M827p2YkrP9W2tgmSYjafN00FNHhYosmNgFTJnhQwxoR2xznocNUXo0+Ze4bHLxTuhWspOD2jzaxIuCQpiKBl3/FmkZzAZ5euJvw==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 213, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 48 }, "modelVersion": "gemini-2.5-flash", "responseId": "5yWwaauWMu30kdUP35_1gQw" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required_and_is_confirmed.httprr ================================================ httprr trace v1 1090 1437 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:41 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1364 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "Co4CAb4+9vtkO/l5IvHFtfeYWk20ZZsa+gYCHtKCQj7Kk9JABsFWzjPg0MalNQ57eM46fPSaZQ8AAwmRpvrGu3o7mCA8LEl1ctQGJSGZwiq7mXzp/Rr0WPxcQsufB8hz7/o2KWUBPR5pcMxDCDPluvnVDPts3W60r1Q4jCVB8gI4ILaVDG3MzPVo4znVqp16Yn+6dnO8gxrhBtK/q9GID5XUasIC3STRMan92H18aQiSe2+oTZfk5hWH7JIQ6VgoPXg0zRTbrmg7NPs1plLd0e6JwaZ/e6mV8tsrKQGWR6u/BhVo9qf5sdktkGaUU3lnOlfx+CJGfBSiTB3xNSDBPw474I4H1NmpiipSDKDbB41y" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 227, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 62 }, "modelVersion": "gemini-2.5-flash", "responseId": "6CWwadaIH5axkdUP3MTwoAk" } 1712 842 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1479 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"Co4CAb4+9vtkO/l5IvHFtfeYWk20ZZsa+gYCHtKCQj7Kk9JABsFWzjPg0MalNQ57eM46fPSaZQ8AAwmRpvrGu3o7mCA8LEl1ctQGJSGZwiq7mXzp/Rr0WPxcQsufB8hz7/o2KWUBPR5pcMxDCDPluvnVDPts3W60r1Q4jCVB8gI4ILaVDG3MzPVo4znVqp16Yn+6dnO8gxrhBtK/q9GID5XUasIC3STRMan92H18aQiSe2+oTZfk5hWH7JIQ6VgoPXg0zRTbrmg7NPs1plLd0e6JwaZ/e6mV8tsrKQGWR6u/BhVo9qf5sdktkGaUU3lnOlfx+CJGfBSiTB3xNSDBPw474I4H1NmpiipSDKDbB41y"}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"Lisbon\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:42 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=564 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Today in \"Lisbon\" is sunny" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 193, "candidatesTokenCount": 8, "totalTokenCount": 201, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 193 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "6SWwadLjNM2E7M8P1teV2QE" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_Confirmation_Required_and_is_rejected.httprr ================================================ httprr trace v1 1090 1488 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:43 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=910 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CrUCAb4+9vsxoW2f5UlClM3vCjVL4Y7+qUAQwsrQxXTlq/JZ8/9kOHDEk5V+3QPYB+30JDTLlPKJ+5Hk+7d2NMLLStOv7K3iFGIvoZtEoyYFPcJvAcBBpThT7OLsSPA1CbWAWv3NWOkwSpbcK9lawpnlcoPBtOBvyxqkCTIR6FCT70mbudMfH6ZP/ALPGymOHsLqNLjtUW5CUDCxiW4f0B/YvCLurtcxVrLelO8ca+tdew9i3a7/W+ZSPqdB8MELFVahbZ2OMsncq+kjv8O0ZKGM3zW3R70swYTqcI7qQ9xI5Du3hlHccy4rmV/R4MKCT2IgrS1Bw/HSRpGZ2I2rNCtT0bbaLfc/PXLz1zTEhnrMNXekacCH3Od+RnWrpDc6AcSmq4xovPwC0i79cK6TqXpanaftKN/e" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 234, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 69 }, "modelVersion": "gemini-2.5-flash", "responseId": "6iWwabLUGsTikdUPnqTR6QU" } 1758 1140 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1525 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"CrUCAb4+9vsxoW2f5UlClM3vCjVL4Y7+qUAQwsrQxXTlq/JZ8/9kOHDEk5V+3QPYB+30JDTLlPKJ+5Hk+7d2NMLLStOv7K3iFGIvoZtEoyYFPcJvAcBBpThT7OLsSPA1CbWAWv3NWOkwSpbcK9lawpnlcoPBtOBvyxqkCTIR6FCT70mbudMfH6ZP/ALPGymOHsLqNLjtUW5CUDCxiW4f0B/YvCLurtcxVrLelO8ca+tdew9i3a7/W+ZSPqdB8MELFVahbZ2OMsncq+kjv8O0ZKGM3zW3R70swYTqcI7qQ9xI5Du3hlHccy4rmV/R4MKCT2IgrS1Bw/HSRpGZ2I2rNCtT0bbaLfc/PXLz1zTEhnrMNXekacCH3Od+RnWrpDc6AcSmq4xovPwC0i79cK6TqXpanaftKN/e"}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"error":"error tool \"get_weather\" call is rejected"}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:43 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=562 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "I am sorry, I cannot get the weather in Lisbon.", "thoughtSignature": "CpwBAb4+9vtTRlCMA1xbzVUmI1IZIWScaBtIiwQa51+OMDPDKvX9EXgXKp5DgVjWjOAlc2S3iPEDSaLh8NLU+FAPRA9oR9a7/THG1/0TAV+GUD5VJMwZnPWftRIPEL3YY2d0ZCwCwOzdMnGu8WkjH2rc5u/vXGcuoQicTlc7aqZ7wWARdm2JUJ77B7pX4w5L1PXLWaiO5jIidNiz3d2Y" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 189, "candidatesTokenCount": 12, "totalTokenCount": 230, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 189 } ], "thoughtsTokenCount": 29 }, "modelVersion": "gemini-2.5-flash", "responseId": "6yWwacmqFfbu7M8P44yeiQ0" } ================================================ FILE: tool/mcptoolset/testdata/TestMCPToolSetConfirmation_No_Confirmation_Required.httprr ================================================ httprr trace v1 1090 1452 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 858 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:38 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=830 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "functionCall": { "name": "get_weather", "args": { "city": "Lisbon" } }, "thoughtSignature": "CpgCAb4+9vsWTCqejCWS+XQeOqqJQ5hKLDNlJ5T1DGEaINL1JxaO+FjyxZwwlhEsdKUH6Q+WLRvMqxMoCmpfhY/iG1qDENGWPArS8wvp6sGP7dXb/bpYPmMCgOoZyHNxNjLOrW0yCnKdYilfxVeAvSukKKFbPhczBC5wmLHLX50GljVv90ZAwjvSF2SWRZ/RNDZ3IyDWhIZqReu/cSWMjQXkfUHNYNHiyszTS3hZukQLzCo4WhJAa+AmSZNag38pgSrK9bylaXwxK2JaFg1YlnrPsOoUKFKNCOSvi7HtLW6fJuLiYtx1KuYk0Q2RCQS7vD/SFo7Pj75WnlfMuS8T2hMAuAeo96qE/p2Tt+rwXbUFx5cP7WTHPXxBqQ==" } ], "role": "model" }, "finishReason": "STOP", "index": 0, "finishMessage": "Model generated function call(s)." } ], "usageMetadata": { "promptTokenCount": 149, "candidatesTokenCount": 16, "totalTokenCount": 229, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 149 } ], "thoughtsTokenCount": 64 }, "modelVersion": "gemini-2.5-flash", "responseId": "5SWwaajIH4aSkdUP-9_n2AY" } 1728 843 POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent HTTP/1.1 Host: generativelanguage.googleapis.com User-Agent: Go-http-client/1.1 Content-Length: 1495 Content-Type: application/json {"contents":[{"parts":[{"text":"what is the weather in Lisbon?"}],"role":"user"},{"parts":[{"functionCall":{"args":{"city":"Lisbon"},"name":"get_weather"},"thoughtSignature":"CpgCAb4+9vsWTCqejCWS+XQeOqqJQ5hKLDNlJ5T1DGEaINL1JxaO+FjyxZwwlhEsdKUH6Q+WLRvMqxMoCmpfhY/iG1qDENGWPArS8wvp6sGP7dXb/bpYPmMCgOoZyHNxNjLOrW0yCnKdYilfxVeAvSukKKFbPhczBC5wmLHLX50GljVv90ZAwjvSF2SWRZ/RNDZ3IyDWhIZqReu/cSWMjQXkfUHNYNHiyszTS3hZukQLzCo4WhJAa+AmSZNag38pgSrK9bylaXwxK2JaFg1YlnrPsOoUKFKNCOSvi7HtLW6fJuLiYtx1KuYk0Q2RCQS7vD/SFo7Pj75WnlfMuS8T2hMAuAeo96qE/p2Tt+rwXbUFx5cP7WTHPXxBqQ=="}],"role":"model"},{"parts":[{"functionResponse":{"name":"get_weather","response":{"output":{"weather_summary":"Today in \"Lisbon\" is sunny"}}}}],"role":"user"}],"generationConfig":{},"systemInstruction":{"parts":[{"text":"I can answer your questions about the time and weather in a city.\n\nYou are an agent. Your internal name is \"weather_time_agent\". The description about you is \"Agent to answer questions about the time and weather in a city.\"."}],"role":"user"},"tools":[{"functionDeclarations":[{"description":"returns weather in the given city","name":"get_weather","parametersJsonSchema":{"additionalProperties":false,"properties":{"city":{"description":"city name","type":"string"}},"required":["city"],"type":"object"},"responseJsonSchema":{"additionalProperties":false,"properties":{"weather_summary":{"description":"weather summary in the given city","type":"string"}},"required":["weather_summary"],"type":"object"}}]}]}HTTP/2.0 200 OK Content-Type: application/json; charset=UTF-8 Date: Tue, 10 Mar 2026 14:08:39 GMT Server: scaffolding on HTTPServer2 Server-Timing: gfet4t7; dur=1458 Vary: Origin Vary: X-Origin Vary: Referer X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 0 { "candidates": [ { "content": { "parts": [ { "text": "Today in \"Lisbon\" is sunny" } ], "role": "model" }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 193, "candidatesTokenCount": 8, "totalTokenCount": 201, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 193 } ] }, "modelVersion": "gemini-2.5-flash", "responseId": "5iWwab7VFYjp7M8P3JPTmAo" } ================================================ FILE: tool/mcptoolset/tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package mcptoolset import ( "errors" "fmt" "strings" "github.com/modelcontextprotocol/go-sdk/mcp" "google.golang.org/genai" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) func convertTool(t *mcp.Tool, client MCPClient, requireConfirmation bool, requireConfirmationProvider tool.ConfirmationProvider) (tool.Tool, error) { mcp := &mcpTool{ name: t.Name, description: t.Description, funcDeclaration: &genai.FunctionDeclaration{ Name: t.Name, Description: t.Description, }, mcpClient: client, requireConfirmation: requireConfirmation, requireConfirmationProvider: requireConfirmationProvider, } // Since t.InputSchema and t.OutputSchema are pointers (*jsonschema.Schema) and the destination ResponseJsonSchema // is an interface (any), we have encountered the type nil problem. // This will make the omitempty not work since ResponseJsonSchema becomes an interface wrapper // to a nil pointer and genai converter includes "responseJsonSchema": null in the json sent to the llm which causes it to crash. // we need the following "if" check to keep ResponseJsonSchema (nil,nil) instead of (*jsonschema.Schema, nil) if t.InputSchema != nil { mcp.funcDeclaration.ParametersJsonSchema = t.InputSchema } if t.OutputSchema != nil { mcp.funcDeclaration.ResponseJsonSchema = t.OutputSchema } return mcp, nil } type mcpTool struct { name string description string funcDeclaration *genai.FunctionDeclaration mcpClient MCPClient requireConfirmation bool requireConfirmationProvider tool.ConfirmationProvider } // Name implements the tool.Tool. func (t *mcpTool) Name() string { return t.name } // Description implements the tool.Tool. func (t *mcpTool) Description() string { return t.description } // IsLongRunning implements the tool.Tool. func (t *mcpTool) IsLongRunning() bool { return false } func (t *mcpTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { return toolutils.PackTool(req, t) } func (t *mcpTool) Declaration() *genai.FunctionDeclaration { return t.funcDeclaration } func (t *mcpTool) Run(ctx tool.Context, args any) (map[string]any, error) { if confirmation := ctx.ToolConfirmation(); confirmation != nil { if !confirmation.Confirmed { return nil, fmt.Errorf("error tool %q %w", t.Name(), tool.ErrConfirmationRejected) } } else { requireConfirmation := t.requireConfirmation // Only run the potentially expensive provider if the static flag didn't already trigger it // Provider takes precedence/overrides: if t.requireConfirmationProvider != nil { requireConfirmation = t.requireConfirmationProvider(t.Name(), args) } if requireConfirmation { err := ctx.RequestConfirmation( fmt.Sprintf("Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.", t.Name()), nil) if err != nil { return nil, err } ctx.Actions().SkipSummarization = true return nil, fmt.Errorf("error tool %q %w", t.Name(), tool.ErrConfirmationRequired) } } // TODO: add auth res, err := t.mcpClient.CallTool(ctx, &mcp.CallToolParams{ Name: t.name, Arguments: args, }) if err != nil { return nil, fmt.Errorf("failed to call MCP tool %q with err: %w", t.name, err) } if res.IsError { details := strings.Builder{} for _, c := range res.Content { textContent, ok := c.(*mcp.TextContent) if !ok { continue } if _, err := details.WriteString(textContent.Text); err != nil { return nil, fmt.Errorf("failed to write error details: %w", err) } } errMsg := "Tool execution failed." if details.Len() > 0 { errMsg += " Details: " + details.String() } return nil, errors.New(errMsg) } if res.StructuredContent != nil { return map[string]any{ "output": res.StructuredContent, }, nil } textResponse := strings.Builder{} for _, c := range res.Content { textContent, ok := c.(*mcp.TextContent) if !ok { continue } if _, err := textResponse.WriteString(textContent.Text); err != nil { return nil, fmt.Errorf("failed to write text response: %w", err) } } if textResponse.Len() == 0 { return nil, errors.New("no text content in tool response") } return map[string]any{ "output": textResponse.String(), }, nil } var ( _ toolinternal.FunctionTool = (*mcpTool)(nil) _ toolinternal.RequestProcessor = (*mcpTool)(nil) ) ================================================ FILE: tool/preloadmemorytool/tool.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package preloadmemorytool provides a tool that automatically preloads memory // for the current user at the start of each LLM request. // // Unlike loadmemorytool which is called explicitly by the model, this tool // runs automatically for each LLM request and injects relevant memory context // into the system instructions. package preloadmemorytool import ( "fmt" "strings" "time" "google.golang.org/adk/internal/utils" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/tool" ) const preloadInstructions = `The following content is from your previous conversations with the user. They may be useful for answering the user's current query. %s ` // preloadMemoryTool is a tool that preloads the memory for the current user. // It is automatically executed for each LLM request and will not be called // directly by the model. type preloadMemoryTool struct { name string description string } // New creates a new preloadMemoryTool. func New() *preloadMemoryTool { return &preloadMemoryTool{ name: "preload_memory", description: "Preloads relevant memory for the current user.", } } // Name implements tool.Tool. func (t *preloadMemoryTool) Name() string { return t.name } // Description implements tool.Tool. func (t *preloadMemoryTool) Description() string { return t.description } // IsLongRunning implements tool.Tool. func (t *preloadMemoryTool) IsLongRunning() bool { return false } // ProcessRequest processes the LLM request by searching memory using the user's // current query and injecting relevant past conversations into system instructions. func (t *preloadMemoryTool) ProcessRequest(ctx tool.Context, req *model.LLMRequest) error { userContent := ctx.UserContent() if userContent == nil || len(userContent.Parts) == 0 || userContent.Parts[0] == nil || userContent.Parts[0].Text == "" { return nil } userQuery := userContent.Parts[0].Text searchResponse, err := ctx.SearchMemory(ctx, userQuery) if err != nil { return fmt.Errorf("preload memory search failed: %v", err) } if searchResponse == nil || len(searchResponse.Memories) == 0 { return nil } memoryText := formatMemories(searchResponse.Memories) if memoryText == "" { return nil } utils.AppendInstructions(req, fmt.Sprintf(preloadInstructions, memoryText)) return nil } func formatMemories(memories []memory.Entry) string { var lines []string for _, mem := range memories { memText := extractText(mem) if memText == "" { continue } if !mem.Timestamp.IsZero() { lines = append(lines, fmt.Sprintf("Time: %s", mem.Timestamp.Format(time.RFC3339))) } if mem.Author != "" { memText = fmt.Sprintf("%s: %s", mem.Author, memText) } lines = append(lines, memText) } return strings.Join(lines, "\n") } func extractText(mem memory.Entry) string { if mem.Content == nil || len(mem.Content.Parts) == 0 { return "" } var b strings.Builder for _, part := range mem.Content.Parts { if part.Text == "" { continue } if b.Len() > 0 { b.WriteByte(' ') } b.WriteString(part.Text) } return b.String() } ================================================ FILE: tool/preloadmemorytool/tool_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package preloadmemorytool_test import ( "context" "errors" "strings" "testing" "time" "google.golang.org/genai" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/preloadmemorytool" ) type mockMemory struct { memories []memory.Entry err error } func (m *mockMemory) AddSessionToMemory(ctx context.Context, s session.Session) error { return nil } func (m *mockMemory) SearchMemory(ctx context.Context, query string) (*memory.SearchResponse, error) { if m.err != nil { return nil, m.err } return &memory.SearchResponse{Memories: m.memories}, nil } func TestPreloadMemoryTool_BasicProperties(t *testing.T) { tool := preloadmemorytool.New() if got := tool.Name(); got != "preload_memory" { t.Errorf("Name() = %v, want preload_memory", got) } if got := tool.Description(); got != "Preloads relevant memory for the current user." { t.Errorf("Description() = %v, want 'Preloads relevant memory for the current user.'", got) } if got := tool.IsLongRunning(); got != false { t.Errorf("IsLongRunning() = %v, want false", got) } } func TestPreloadMemoryTool_ProcessRequest(t *testing.T) { tests := []struct { name string userContent *genai.Content memories []memory.Entry searchErr error wantErr bool wantInstruction bool wantTextContains []string }{ { name: "nil user content", userContent: nil, wantInstruction: false, }, { name: "empty user content parts", userContent: &genai.Content{Parts: []*genai.Part{}}, wantInstruction: false, }, { name: "user content with no text", userContent: &genai.Content{Parts: []*genai.Part{{InlineData: &genai.Blob{}}}}, wantInstruction: false, }, { name: "text in later part is ignored", userContent: &genai.Content{Parts: []*genai.Part{{InlineData: &genai.Blob{}}, genai.NewPartFromText("later text")}}, wantInstruction: false, }, { name: "no memories found", userContent: genai.NewContentFromText("test query", genai.RoleUser), memories: []memory.Entry{}, wantInstruction: false, }, { name: "memory search error", userContent: genai.NewContentFromText("test query", genai.RoleUser), searchErr: errors.New("search failed"), wantErr: true, wantInstruction: false, }, { name: "single memory entry", userContent: genai.NewContentFromText("test query", genai.RoleUser), memories: []memory.Entry{ { Author: "user", Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("Hello world", genai.RoleUser), }, }, wantInstruction: true, wantTextContains: []string{"PAST_CONVERSATIONS", "user: Hello world", "Time: " + time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC).Format(time.RFC3339)}, }, { name: "multiple memory entries", userContent: genai.NewContentFromText("search term", genai.RoleUser), memories: []memory.Entry{ { Author: "user", Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("First memory", genai.RoleUser), }, { Author: "assistant", Timestamp: time.Date(2025, 1, 2, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("Second memory", genai.RoleModel), }, }, wantInstruction: true, wantTextContains: []string{"First memory", "Second memory", "user:", "assistant:"}, }, { name: "memory entry without author", userContent: genai.NewContentFromText("test", genai.RoleUser), memories: []memory.Entry{ { Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: genai.NewContentFromText("Anonymous message", genai.RoleUser), }, }, wantInstruction: true, wantTextContains: []string{"Anonymous message"}, }, { name: "memory entry without timestamp", userContent: genai.NewContentFromText("test", genai.RoleUser), memories: []memory.Entry{ { Author: "user", Content: genai.NewContentFromText("No timestamp", genai.RoleUser), }, }, wantInstruction: true, wantTextContains: []string{"user: No timestamp"}, }, { name: "memory entry with empty content", userContent: genai.NewContentFromText("test", genai.RoleUser), memories: []memory.Entry{ { Author: "user", Timestamp: time.Date(2025, 1, 1, 12, 0, 0, 0, time.UTC), Content: nil, }, }, wantInstruction: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tc := createToolContext(t, &mockMemory{memories: tt.memories, err: tt.searchErr}, tt.userContent) llmRequest := &model.LLMRequest{} pmt := preloadmemorytool.New() err := pmt.ProcessRequest(tc, llmRequest) if tt.wantErr { if err == nil { t.Fatalf("ProcessRequest expected error, got nil") } } else if err != nil { t.Fatalf("ProcessRequest failed: %v", err) } hasInstruction := llmRequest.Config != nil && llmRequest.Config.SystemInstruction != nil if hasInstruction != tt.wantInstruction { t.Errorf("hasInstruction = %v, want %v", hasInstruction, tt.wantInstruction) } if tt.wantInstruction && hasInstruction { instruction := llmRequest.Config.SystemInstruction.Parts[0].Text for _, want := range tt.wantTextContains { if !strings.Contains(instruction, want) { t.Errorf("Instruction should contain %q, got: %v", want, instruction) } } } }) } } func createToolContext(t *testing.T, mem *mockMemory, userContent *genai.Content) tool.Context { t.Helper() ctx := icontext.NewInvocationContext(t.Context(), icontext.InvocationContextParams{ Memory: mem, UserContent: userContent, }) return toolinternal.NewToolContext(ctx, "", nil, nil) } ================================================ FILE: tool/tool.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package tool defines the interfaces for tools that can be called by an agent. // A tool is a piece of code that performs a specific task. You can either define // your own custom tools or use built-in ones, for example, GoogleSearch. package tool import ( "context" "errors" "fmt" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/toolinternal/toolutils" "google.golang.org/adk/memory" "google.golang.org/adk/model" "google.golang.org/adk/session" "google.golang.org/adk/tool/toolconfirmation" ) // ErrConfirmationRequired indicates that the tool requires confirmation. var ErrConfirmationRequired = errors.New("requires confirmation, please approve or reject") // ErrConfirmationRejected indicated that the tool call confirmation rejected. var ErrConfirmationRejected = errors.New("call is rejected") // Tool defines the interface for a callable tool. type Tool interface { // Name returns the name of the tool. Name() string // Description returns a description of the tool. Description() string // IsLongRunning indicates whether the tool is a long-running operation, // which typically returns a resource id first and finishes the operation later. IsLongRunning() bool } // Context defines the interface for the context passed to a tool when it's // called. It provides access to invocation-specific information and allows // the tool to interact with the agent's state and memory. type Context interface { agent.CallbackContext // FunctionCallID returns the unique identifier of the function call // that triggered this tool execution. FunctionCallID() string // Actions returns the EventActions for the current event. This can be // used by the tool to modify the agent's state, transfer to another // agent, or perform other actions. Actions() *session.EventActions // SearchMemory performs a semantic search on the agent's memory. SearchMemory(context.Context, string) (*memory.SearchResponse, error) // ToolConfirmation returns a handler for checking the Human-in-the-Loop // confirmation status for the current tool context. This should be used within a tool's logic // *before* performing any sensitive operations that require user approval. // // Example Usage: // if confirmation := ctx.ToolConfirmation(); confirmation == nil { // // Confirmation required, create confirmation or handle appropriately // ctx.RequestConfirmation("hint", payload) // } // // The returned *toolconfirmation.ToolConfirmation object provides methods to check the actual // confirmation state. ToolConfirmation() *toolconfirmation.ToolConfirmation // RequestConfirmation initiates the Human-in-the-Loop (HITL) process to ask the user for approval // before the tool proceeds with a specific action. Call this method when a tool needs // explicit user consent. // // This will typically result in the ADK emitting a special event // (e.g., a FunctionCall like "adk_request_confirmation") to the client application/UI, // prompting the user for a decision. // // Args: // - hint: A human-readable string explaining why confirmation is needed. This is usually // displayed to the user in the confirmation prompt. // - payload: Any additional data or context about the action requiring confirmation. // // Returns: // - nil: If the confirmation request was successfully enqueued or initiated within the ADK. // This indicates that the process of asking the user has begun. It does NOT mean the action // is approved. The tool's execution will likely pause or be suspended until the user responds. // - error: If there was a failure in initiating the confirmation process itself (e.g., invalid // arguments, issue with the event system). The request to ask the user has not been sent. RequestConfirmation(hint string, payload any) error } // Toolset is an interface for a collection of tools. It allows grouping // related tools together and providing them to an agent. type Toolset interface { // Name returns the name of the toolset. Name() string // Tools returns a list of tools in the toolset. The provided // ReadonlyContext can be used to dynamically determine which tools // to return based on the current invocation state. Tools(ctx agent.ReadonlyContext) ([]Tool, error) } // Predicate is a function which decides whether a tool should be exposed to LLM. type Predicate func(ctx agent.ReadonlyContext, tool Tool) bool // StringPredicate is a helper that creates a Predicate from a string slice. // Deprecated: use AllowedToolsPredicate instead. func StringPredicate(allowedTools []string) Predicate { return AllowedToolsPredicate(allowedTools) } // AllowedToolsPredicate returns a Predicate that allows only the tools with the given names. func AllowedToolsPredicate(allowedTools []string) Predicate { m := make(map[string]bool) for _, t := range allowedTools { m[t] = true } return func(ctx agent.ReadonlyContext, tool Tool) bool { return m[tool.Name()] } } // FilterToolset returns a Toolset that filters the tools in the given Toolset // using the given predicate. func FilterToolset(toolset Toolset, predicate Predicate) Toolset { if toolset == nil { panic("toolset must not be nil") } if predicate == nil { panic("predicate must not be nil") } return &filteredToolset{ toolset: toolset, predicate: predicate, } } type filteredToolset struct { toolset Toolset predicate Predicate } func (f *filteredToolset) Name() string { return f.toolset.Name() } func (f *filteredToolset) Tools(ctx agent.ReadonlyContext) ([]Tool, error) { tools, err := f.toolset.Tools(ctx) if err != nil { return nil, err } var filtered []Tool for _, tool := range tools { if f.predicate(ctx, tool) { filtered = append(filtered, tool) } } return filtered, nil } // ConfirmationProvider defines a function that dynamically determines whether // a specific tool execution requires user confirmation. // // It accepts the tool name and the input parameters as arguments. // Returning true signals that the system must wait for Human-in-the-Loop (HITL) // approval before proceeding with the execution. // // EXPERIMENTAL: ConfirmationProvider is experimental and not currently in scope for the v1.0 API. type ConfirmationProvider func(toolName string, toolInput any) bool // WithConfirmation wraps a toolset to inject confirmation logic in each tool. // Only tools within the provided Toolset that implement the `runnableTool` interface // (i.e., provide a FunctionDeclaration and a Run method) will be wrapped with // confirmation logic. Other tools will be included in the returned Toolset without // modification. // // EXPERIMENTAL: WithConfirmation is experimental and not currently in scope for the v1.0 API. func WithConfirmation(ts Toolset, requireConfirmation bool, requireConfirmationProvider ConfirmationProvider) Toolset { return &confirmationToolset{ toolset: ts, requireConfirmation: requireConfirmation, requireConfirmationProvider: requireConfirmationProvider, } } type confirmationToolset struct { toolset Toolset requireConfirmation bool requireConfirmationProvider ConfirmationProvider } func (c *confirmationToolset) Name() string { return c.toolset.Name() } func (c *confirmationToolset) Tools(ctx agent.ReadonlyContext) ([]Tool, error) { tools, err := c.toolset.Tools(ctx) if err != nil { return nil, err } wrappedTools := make([]Tool, 0, len(tools)) for _, t := range tools { if _, ok := t.(runnableTool); ok { wrappedTools = append(wrappedTools, &confirmationTool{ runnableTool: t.(runnableTool), requireConfirmation: c.requireConfirmation, provider: c.requireConfirmationProvider, }) } else { // Tools that are not runnableTool are not wrapped. wrappedTools = append(wrappedTools, t) } } return wrappedTools, nil } // confirmationTool is a wrapper around a tool that adds confirmation logic. // It implements tool.Tool and adk/internal/toolinternal.FunctionTool and adk/internal/toolinternal.RequestProcessor. type confirmationTool struct { runnableTool requireConfirmation bool provider ConfirmationProvider } type runnableTool interface { Tool Declaration() *genai.FunctionDeclaration Run(ctx Context, args any) (result map[string]any, err error) } func (t *confirmationTool) Declaration() *genai.FunctionDeclaration { return t.runnableTool.Declaration() } func (t *confirmationTool) ProcessRequest(ctx Context, req *model.LLMRequest) error { return toolutils.PackTool(req, t) } func (t *confirmationTool) Run(ctx Context, args any) (map[string]any, error) { ft := t.runnableTool // Check for Human-in-the-Loop confirmation. if confirmation := ctx.ToolConfirmation(); confirmation != nil { if !confirmation.Confirmed { return nil, fmt.Errorf("error tool %q %w", t.runnableTool.Name(), ErrConfirmationRejected) } } else { requireConfirmation := t.requireConfirmation if t.provider != nil { requireConfirmation = t.provider(t.Name(), args) } if requireConfirmation { err := ctx.RequestConfirmation( fmt.Sprintf("Please approve or reject the tool call %s() by responding with a FunctionResponse with an expected ToolConfirmation payload.", t.Name()), nil) if err != nil { return nil, err } ctx.Actions().SkipSummarization = true return nil, fmt.Errorf("error tool %q %w", t.Name(), ErrConfirmationRequired) } } return ft.Run(ctx, args) } ================================================ FILE: tool/tool_test.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tool_test import ( "context" "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/agent" "google.golang.org/adk/internal/toolinternal" "google.golang.org/adk/memory" "google.golang.org/adk/session" "google.golang.org/adk/tool" "google.golang.org/adk/tool/agenttool" "google.golang.org/adk/tool/functiontool" "google.golang.org/adk/tool/geminitool" "google.golang.org/adk/tool/loadartifactstool" "google.golang.org/adk/tool/toolconfirmation" ) func TestTypes(t *testing.T) { const ( functionTool = "FunctionTool" requestProc = "RequestProcessor" ) type intInput struct { Value int `json:"value"` } type intOutput struct { Value int `json:"value"` } tests := []struct { name string constructor func() (tool.Tool, error) expectedTypes []string }{ { name: "FunctionTool", constructor: func() (tool.Tool, error) { return functiontool.New(functiontool.Config{}, func(_ tool.Context, input intInput) (intOutput, error) { return intOutput(input), nil }) }, expectedTypes: []string{requestProc, functionTool}, }, { name: "geminitool", constructor: func() (tool.Tool, error) { return geminitool.New("", "", nil), nil }, expectedTypes: []string{requestProc}, }, { name: "geminitool.GoogleSearch{}", constructor: func() (tool.Tool, error) { return geminitool.GoogleSearch{}, nil }, expectedTypes: []string{requestProc}, }, { name: "LoadArtifactsTool", constructor: func() (tool.Tool, error) { return loadartifactstool.New(), nil }, expectedTypes: []string{requestProc, functionTool}, }, { name: "AgentTool", constructor: func() (tool.Tool, error) { return agenttool.New(nil, nil), nil }, expectedTypes: []string{requestProc, functionTool}, }, { name: "LoadArtifactsTool", constructor: func() (tool.Tool, error) { return loadartifactstool.New(), nil }, expectedTypes: []string{requestProc, functionTool}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tool, err := tt.constructor() if err != nil { t.Fatalf("Failed to create tool %s: %v", tt.name, err) } for _, s := range tt.expectedTypes { switch s { case functionTool: if _, ok := tool.(toolinternal.FunctionTool); !ok { t.Errorf("Expected %s to implement toolinternal.FunctionTool", tt.name) } case requestProc: if _, ok := tool.(toolinternal.RequestProcessor); !ok { t.Errorf("Expected %s to implement toolinternal.RequestProcessor", tt.name) } default: t.Fatalf("Unknown expected type: %s", s) } } }) } } type testContext struct { context.Context toolConfirmationResult *toolconfirmation.ToolConfirmation requestConfirmationCalled bool eventActions *session.EventActions } func (c *testContext) ToolConfirmation() *toolconfirmation.ToolConfirmation { return c.toolConfirmationResult } func (c *testContext) RequestConfirmation(string, any) error { c.requestConfirmationCalled = true return nil } func (c *testContext) Actions() *session.EventActions { if c.eventActions == nil { c.eventActions = &session.EventActions{} } return c.eventActions } func (c *testContext) FunctionCallID() string { return "test-function-call-id" } func (c *testContext) SearchMemory(context.Context, string) (*memory.SearchResponse, error) { return nil, nil } func (c *testContext) AgentName() string { return "test-agent" } func (c *testContext) ReadonlyState() session.ReadonlyState { return nil } func (c *testContext) State() session.State { return nil } func (c *testContext) Artifacts() agent.Artifacts { return nil } func (c *testContext) InvocationID() string { return "test-invocation-id" } func (c *testContext) UserContent() *genai.Content { return nil } func (c *testContext) AppName() string { return "test-app" } func (c *testContext) Branch() string { return "test-branch" } func (c *testContext) SessionID() string { return "test-session-id" } func (c *testContext) UserID() string { return "test-user-id" } type testToolset struct { tools []tool.Tool } func (tts *testToolset) Name() string { return "testToolset" } func (tts *testToolset) Tools(agent.ReadonlyContext) ([]tool.Tool, error) { return tts.tools, nil } func TestWithConfirmation(t *testing.T) { toolRan := false noOpTool, err := functiontool.New(functiontool.Config{Name: "noOpTool"}, func(ctx tool.Context, input struct{}) (struct{}, error) { toolRan = true return struct{}{}, nil }) if err != nil { t.Fatalf("functiontool.New() failed: %v", err) } ts := &testToolset{tools: []tool.Tool{noOpTool}} tests := []struct { name string requireConfirmation bool provider tool.ConfirmationProvider toolConfirmation *toolconfirmation.ToolConfirmation wantConfirmationRequested bool wantSkipSummarization bool wantErr bool wantErrMsg string wantToolRan bool }{ { name: "confirmation required, no confirmation in context", requireConfirmation: true, wantConfirmationRequested: true, wantSkipSummarization: true, wantErr: true, wantErrMsg: "requires confirmation", wantToolRan: false, }, { name: "confirmation required, confirmed in context", requireConfirmation: true, toolConfirmation: &toolconfirmation.ToolConfirmation{Confirmed: true}, wantToolRan: true, }, { name: "confirmation required, rejected in context", requireConfirmation: true, toolConfirmation: &toolconfirmation.ToolConfirmation{Confirmed: false}, wantErr: true, wantErrMsg: "call is rejected", wantToolRan: false, }, { name: "confirmation not required", requireConfirmation: false, wantConfirmationRequested: false, wantToolRan: true, }, { name: "confirmation provider requires confirmation", provider: func(toolName string, toolInput any) bool { return true }, wantConfirmationRequested: true, wantSkipSummarization: true, wantErr: true, wantErrMsg: "requires confirmation", wantToolRan: false, }, { name: "confirmation provider does not require confirmation", provider: func(toolName string, toolInput any) bool { return false }, wantConfirmationRequested: false, wantToolRan: true, }, { name: "requireConfirmation=true but provider returns false", requireConfirmation: true, provider: func(toolName string, toolInput any) bool { return false }, wantConfirmationRequested: false, wantToolRan: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { toolRan = false ctx := &testContext{Context: context.Background(), toolConfirmationResult: tt.toolConfirmation} cts := tool.WithConfirmation(ts, tt.requireConfirmation, tt.provider) tools, err := cts.Tools(nil) if err != nil { t.Fatalf("cts.Tools() failed: %v", err) } if len(tools) != 1 { t.Fatalf("cts.Tools() returned %d tools, want 1", len(tools)) } confirmedTool, ok := tools[0].(toolinternal.FunctionTool) if !ok { t.Fatalf("tools[0] is not a FunctionTool") } _, err = confirmedTool.Run(ctx, map[string]any{}) if (err != nil) != tt.wantErr { t.Errorf("Run() error = %v, wantErr %v", err, tt.wantErr) } if err != nil && tt.wantErrMsg != "" && !strings.Contains(err.Error(), tt.wantErrMsg) { t.Errorf("Run() error msg = %q, want it to contain %q", err.Error(), tt.wantErrMsg) } if ctx.Actions().SkipSummarization != tt.wantSkipSummarization { t.Errorf("Run() skipSummarization = %v, want %v", ctx.Actions().SkipSummarization, tt.wantSkipSummarization) } if ctx.requestConfirmationCalled != tt.wantConfirmationRequested { t.Errorf("Run() requestConfirmationCalled = %v, want %v", ctx.requestConfirmationCalled, tt.wantConfirmationRequested) } if toolRan != tt.wantToolRan { t.Errorf("toolRan = %v, want %v", toolRan, tt.wantToolRan) } }) } } ================================================ FILE: tool/toolconfirmation/tool_confirmation.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package toolconfirmation provides structures and utilities for handling // Human-in-the-Loop tool execution confirmations within the ADK. package toolconfirmation import ( "fmt" "google.golang.org/genai" "google.golang.org/adk/internal/converters" ) // FunctionCallName defines the specific name for the FunctionCall event // emitted by ADK when a Human-in-the-Loop confirmation is required. // // The 'args' of this FunctionCall include: // - "toolConfirmation": A toolConfirmation with the hint. // - "originalFunctionCall": The original FunctionCall (including its name and arguments) that the agent intended to execute. // // Client applications or frontends interacting with the ADK-powered agent must: // 1. Listen for events containing a FunctionCall with this name. // 2. Extract the details of the 'originalFunctionCall' from the arguments. // 3. Present a clear confirmation prompt to the human user, explaining the action and potential consequences. // 4. Capture the user's decision (e.g., true for yes/approve, false for no/deny). // 5. Send a FunctionResponse message back to the ADK. This FunctionResponse MUST: // - Have the same 'id' as the received "adk_request_confirmation" FunctionCall. // - Have the name set to "adk_request_confirmation". // - Include a response payload, typically a map like {"confirmed": bool}. // // Based on the boolean value in "confirmed", the ADK will either proceed to execute // the 'originalFunctionCall' or block it and return an error. const FunctionCallName = "adk_request_confirmation" // ToolConfirmation represents the state and details of a user confirmation request // for a tool execution. type ToolConfirmation struct { // Hint is the message provided to the user to explain why the confirmation // is needed and what action is being confirmed. Hint string `json:"hint"` // Confirmed indicates the user's decision. // true if the user approved the action, false if they denied it. // The state before the user has responded is typically handled outside // this struct (e.g., by the absence of a result or a pending status). Confirmed bool `json:"confirmed"` // Payload contains any additional data or context related to the confirmation request. // The structure of the Payload is application-specific. Payload any `json:"payload"` } // OriginalCallFrom retrieves the underlying, original function call from a tool confirmation wrapper. // // In the ADK Tool Confirmation workflow, the model will wrap a desired tool execution inside a // "RequestConfirmation" call. This helper extracts that inner intent so it can be mapped back // to pending requests or queued for execution. // // It handles the "originalFunctionCall" argument in two formats: // 1. *genai.FunctionCall: Returns the object directly if already typed. // 2. map[string]any: Deserializes the raw JSON map received from the model. // // Usage: // This is typically used when processing a "RequestConfirmation" event to identify which // tool the model actually wants to run. // // Parameters: // - functionCall: The wrapper function call (e.g., RequestConfirmation) containing the arguments. // // Returns: // - *genai.FunctionCall: The extracted original tool call. // - error: If the "originalFunctionCall" argument is missing or malformed. func OriginalCallFrom(functionCall *genai.FunctionCall) (*genai.FunctionCall, error) { if functionCall == nil || functionCall.Args == nil { return nil, fmt.Errorf("functionCall or its arguments cannot be nil") } const key = "originalFunctionCall" val, exists := functionCall.Args[key] if !exists { return nil, fmt.Errorf("required argument %q is missing from call with ID %s", key, functionCall.ID) } originalCall, ok := val.(*genai.FunctionCall) if ok { return originalCall, nil } originalCallRaw, ok := val.(map[string]any) if !ok { return nil, fmt.Errorf("argument %q has invalid type: expected JSON object (map[string]any) or *genai.FunctionCall, got %T", key, val) } originalFunctionCall, err := converters.FromMapStructure[genai.FunctionCall](originalCallRaw) if err != nil { return nil, fmt.Errorf("failed to decode %q structure for call ID %s: %w", key, functionCall.ID, err) } return originalFunctionCall, nil } ================================================ FILE: tool/toolconfirmation/tool_confirmation_test.go ================================================ // Copyright 2026 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package toolconfirmation_test import ( "strings" "testing" "google.golang.org/genai" "google.golang.org/adk/tool/toolconfirmation" ) // --- The Test Suite --- func TestOriginalCallFrom(t *testing.T) { tests := []struct { name string input *genai.FunctionCall wantErr bool wantErrSubstr string // Substring we expect to see in the error message }{ { name: "Success - Valid Structure", input: &genai.FunctionCall{ ID: "call_123", Args: map[string]any{ "originalFunctionCall": map[string]any{ "ID": "call_999", "Name": "weather_lookup", }, }, }, wantErr: false, }, { name: "Failure - Nil Input", input: nil, wantErr: true, wantErrSubstr: "cannot be nil", }, { name: "Failure - Missing Key", input: &genai.FunctionCall{ ID: "call_456", Args: map[string]any{ "someOtherKey": "foo", }, }, wantErr: true, wantErrSubstr: "required argument \"originalFunctionCall\" is missing", }, { name: "Failure - Invalid Type (String instead of Map)", input: &genai.FunctionCall{ ID: "call_789", Args: map[string]any{ // LLM hallucination: sending a string instead of an object "originalFunctionCall": "{\"Name\": \"bad_json\"}", }, }, wantErr: true, wantErrSubstr: "got string", // Verifies our %T check works }, { name: "Failure - Invalid Type (Nil value)", input: &genai.FunctionCall{ ID: "call_nil", Args: map[string]any{ "originalFunctionCall": nil, }, }, wantErr: true, wantErrSubstr: "got ", // Verifies %T handles nil gracefully }, { name: "Failure - Converter Error (Bad Internal Structure id with wrong type)", input: &genai.FunctionCall{ ID: "call_bad_struct", Args: map[string]any{ "originalFunctionCall": map[string]any{ "ID": 11, }, }, }, wantErr: true, wantErrSubstr: "failed to decode", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := toolconfirmation.OriginalCallFrom(tt.input) if (err != nil) != tt.wantErr { t.Errorf("OriginalCallFrom() error = %v, wantErr %v", err, tt.wantErr) return } if tt.wantErr && !strings.Contains(err.Error(), tt.wantErrSubstr) { t.Errorf("OriginalCallFrom() error = %q, expected substring %q", err.Error(), tt.wantErrSubstr) } if !tt.wantErr { if got == nil { t.Error("Expected result, got nil") } else { // Verify we actually extracted data from the inner map // This relies on the specific "Success" test case data if got.Name != "weather_lookup" { t.Errorf("Expected extracted name 'weather_lookup', got %q", got.Name) } } } }) } } ================================================ FILE: util/instructionutil/instruction.go ================================================ // Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package instructionutil provides utilities to work with agent instructions. package instructionutil import ( "fmt" "google.golang.org/adk/agent" icontext "google.golang.org/adk/internal/context" "google.golang.org/adk/internal/llminternal" ) // InjectSessionState populates values in the instruction template, e.g. state, // artifact, etc. // - There can be placeholders like {key_name} that will be resolved by ADK // at runtime using session state and context. // - key_name must match "^[a-zA-Z_][a-zA-Z0-9_]*$", otherwise it will be // treated as a literal. // - {artifact.key_name} can be used to insert the text content of the // artifact named key_name. // // If the state variable or artifact does not exist, the agent will raise an // error. If you want to ignore the error, you can append a ? to the // variable name as in {var?}. // // This method is intended to be used in InstructionProvider based Instruction // and GlobalInstruction which are called with ReadonlyContext. func InjectSessionState(ctx agent.ReadonlyContext, template string) (string, error) { ictx, ok := ctx.(*icontext.ReadonlyContext) if !ok { return "", fmt.Errorf("unexpected context type: %T", ctx) } return llminternal.InjectSessionState(ictx.InvocationContext, template) }