google-adk 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- google_adk-0.2.0/PKG-INFO +212 -0
- google_adk-0.2.0/README.md +130 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/pyproject.toml +4 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/base_agent.py +4 -4
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/invocation_context.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/remote_agent.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/run_config.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/auth_preprocessor.py +2 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/auth_tool.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/index.html +2 -2
- google_adk-0.1.0/src/google/adk/cli/browser/main-SLIAU2JL.js → google_adk-0.2.0/src/google/adk/cli/browser/main-ZBO76GRM.js +65 -81
- google_adk-0.2.0/src/google/adk/cli/cli_create.py +279 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/cli_deploy.py +4 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/cli_eval.py +2 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/cli_tools_click.py +67 -7
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/fast_api.py +51 -16
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/utils/envs.py +0 -3
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/utils/evals.py +2 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/evaluation_generator.py +4 -4
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/response_evaluator.py +15 -3
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/events/event.py +3 -3
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/_nl_planning.py +10 -4
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/contents.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/lite_llm.py +51 -34
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/planners/plan_re_act_planner.py +2 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/runners.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/database_session_service.py +84 -23
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/state.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/telemetry.py +2 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/application_integration_tool/clients/integration_client.py +3 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/base_tool.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/function_parameter_parse_util.py +2 -2
- google_adk-0.2.0/src/google/adk/tools/google_api_tool/__init__.py +87 -0
- google_adk-0.2.0/src/google/adk/tools/google_api_tool/google_api_tool_sets.py +112 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +3 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/load_memory_tool.py +25 -2
- google_adk-0.2.0/src/google/adk/tools/mcp_tool/mcp_session_manager.py +176 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/mcp_tool/mcp_tool.py +15 -2
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/mcp_tool/mcp_toolset.py +31 -37
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/toolbox_tool.py +1 -1
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/version.py +1 -1
- google_adk-0.1.0/PKG-INFO +0 -160
- google_adk-0.1.0/README.md +0 -82
- google_adk-0.1.0/src/google/adk/tools/google_api_tool/__init__.py +0 -14
- google_adk-0.1.0/src/google/adk/tools/google_api_tool/google_api_tool_sets.py +0 -55
- {google_adk-0.1.0 → google_adk-0.2.0}/LICENSE +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/active_streaming_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/callback_context.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/langgraph_agent.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/live_request_queue.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/llm_agent.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/loop_agent.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/parallel_agent.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/readonly_context.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/sequential_agent.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/agents/transcription_entry.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/artifacts/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/artifacts/base_artifact_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/artifacts/gcs_artifact_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/artifacts/in_memory_artifact_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/auth_credential.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/auth_handler.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/auth/auth_schemes.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/__main__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/agent_graph.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/adk_favicon.svg +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/assets/audio-processor.js +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/assets/config/runtime-config.json +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/polyfills-FFHMD2TL.js +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/browser/styles-4VDSPQ37.css +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/cli.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/utils/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/cli/utils/logs.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/base_code_executor.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/code_execution_utils.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/code_executor_context.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/container_code_executor.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/unsafe_local_code_executor.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/code_executors/vertex_ai_code_executor.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/agent_evaluator.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/evaluation_constants.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/evaluation/trajectory_evaluator.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/events/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/events/event_actions.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/examples/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/examples/base_example_provider.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/examples/example.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/examples/example_util.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/examples/vertex_ai_example_store.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/_base_llm_processor.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/_code_execution.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/agent_transfer.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/audio_transcriber.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/auto_flow.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/base_llm_flow.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/basic.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/functions.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/identity.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/instructions.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/flows/llm_flows/single_flow.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/memory/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/memory/base_memory_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/memory/in_memory_memory_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/memory/vertex_ai_rag_memory_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/anthropic_llm.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/base_llm.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/base_llm_connection.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/gemini_llm_connection.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/google_llm.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/llm_request.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/llm_response.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/models/registry.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/planners/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/planners/base_planner.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/planners/built_in_planner.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/base_session_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/in_memory_session_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/session.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/sessions/vertex_ai_session_service.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/_automatic_function_calling_util.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/agent_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/apihub_tool/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/apihub_tool/apihub_toolset.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/apihub_tool/clients/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/apihub_tool/clients/apihub_client.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/apihub_tool/clients/secret_client.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/application_integration_tool/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/application_integration_tool/application_integration_toolset.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/application_integration_tool/clients/connections_client.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/built_in_code_execution_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/crewai_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/example_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/exit_loop_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/function_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/get_user_choice_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/google_api_tool/google_api_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/google_api_tool/google_api_tool_set.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/google_search_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/langchain_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/load_artifacts_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/load_web_page.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/long_running_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/mcp_tool/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/mcp_tool/conversion_utils.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/auth_helpers.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/common/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/common/common.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/preload_memory_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/retrieval/__init__.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/retrieval/base_retrieval_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/retrieval/files_retrieval.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/retrieval/llama_index_retrieval.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/tool_context.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/transfer_to_agent_tool.py +0 -0
- {google_adk-0.1.0 → google_adk-0.2.0}/src/google/adk/tools/vertex_ai_search_tool.py +0 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: google-adk
|
3
|
+
Version: 0.2.0
|
4
|
+
Summary: Agent Development Kit
|
5
|
+
Author-email: Google LLC <googleapis-packages@google.com>
|
6
|
+
Requires-Python: >=3.9
|
7
|
+
Description-Content-Type: text/markdown
|
8
|
+
Classifier: Typing :: Typed
|
9
|
+
Classifier: Intended Audience :: Developers
|
10
|
+
Classifier: Intended Audience :: Science/Research
|
11
|
+
Classifier: Programming Language :: Python
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
18
|
+
Classifier: Operating System :: OS Independent
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
20
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
21
|
+
License-File: LICENSE
|
22
|
+
Requires-Dist: authlib>=1.5.1
|
23
|
+
Requires-Dist: click>=8.1.8
|
24
|
+
Requires-Dist: fastapi>=0.115.0
|
25
|
+
Requires-Dist: google-api-python-client>=2.157.0
|
26
|
+
Requires-Dist: google-cloud-aiplatform>=1.87.0
|
27
|
+
Requires-Dist: google-cloud-secret-manager>=2.22.0
|
28
|
+
Requires-Dist: google-cloud-speech>=2.30.0
|
29
|
+
Requires-Dist: google-cloud-storage>=2.18.0, <3.0.0
|
30
|
+
Requires-Dist: google-genai>=1.9.0
|
31
|
+
Requires-Dist: graphviz>=0.20.2
|
32
|
+
Requires-Dist: mcp>=1.5.0;python_version>='3.10'
|
33
|
+
Requires-Dist: opentelemetry-api>=1.31.0
|
34
|
+
Requires-Dist: opentelemetry-exporter-gcp-trace>=1.9.0
|
35
|
+
Requires-Dist: opentelemetry-sdk>=1.31.0
|
36
|
+
Requires-Dist: pydantic>=2.0, <3.0.0
|
37
|
+
Requires-Dist: python-dotenv>=1.0.0
|
38
|
+
Requires-Dist: PyYAML>=6.0.2
|
39
|
+
Requires-Dist: sqlalchemy>=2.0
|
40
|
+
Requires-Dist: tzlocal>=5.3
|
41
|
+
Requires-Dist: uvicorn>=0.34.0
|
42
|
+
Requires-Dist: flit>=3.10.0 ; extra == "dev"
|
43
|
+
Requires-Dist: isort>=6.0.0 ; extra == "dev"
|
44
|
+
Requires-Dist: pyink>=24.10.0 ; extra == "dev"
|
45
|
+
Requires-Dist: pylint>=2.6.0 ; extra == "dev"
|
46
|
+
Requires-Dist: autodoc_pydantic ; extra == "docs"
|
47
|
+
Requires-Dist: furo ; extra == "docs"
|
48
|
+
Requires-Dist: myst-parser ; extra == "docs"
|
49
|
+
Requires-Dist: sphinx ; extra == "docs"
|
50
|
+
Requires-Dist: sphinx-autodoc-typehints ; extra == "docs"
|
51
|
+
Requires-Dist: sphinx-rtd-theme ; extra == "docs"
|
52
|
+
Requires-Dist: google-cloud-aiplatform[evaluation]>=1.87.0 ; extra == "eval"
|
53
|
+
Requires-Dist: pandas>=2.2.3 ; extra == "eval"
|
54
|
+
Requires-Dist: tabulate>=0.9.0 ; extra == "eval"
|
55
|
+
Requires-Dist: anthropic>=0.43.0 ; extra == "extensions"
|
56
|
+
Requires-Dist: beautifulsoup4>=3.2.2 ; extra == "extensions"
|
57
|
+
Requires-Dist: crewai[tools] ; extra == "extensions" and (python_version>='3.10')
|
58
|
+
Requires-Dist: docker>=7.0.0 ; extra == "extensions"
|
59
|
+
Requires-Dist: langgraph>=0.2.60 ; extra == "extensions"
|
60
|
+
Requires-Dist: litellm>=1.63.11 ; extra == "extensions"
|
61
|
+
Requires-Dist: llama-index-readers-file>=0.4.0 ; extra == "extensions"
|
62
|
+
Requires-Dist: lxml>=5.3.0 ; extra == "extensions"
|
63
|
+
Requires-Dist: anthropic>=0.43.0 ; extra == "test"
|
64
|
+
Requires-Dist: langchain-community>=0.3.17 ; extra == "test"
|
65
|
+
Requires-Dist: langgraph>=0.2.60 ; extra == "test"
|
66
|
+
Requires-Dist: litellm>=1.63.11 ; extra == "test"
|
67
|
+
Requires-Dist: llama-index-readers-file>=0.4.0 ; extra == "test"
|
68
|
+
Requires-Dist: pytest-asyncio>=0.25.0 ; extra == "test"
|
69
|
+
Requires-Dist: pytest-mock>=3.14.0 ; extra == "test"
|
70
|
+
Requires-Dist: pytest-xdist>=3.6.1 ; extra == "test"
|
71
|
+
Requires-Dist: pytest>=8.3.4 ; extra == "test"
|
72
|
+
Project-URL: changelog, https://github.com/google/adk-python/blob/main/CHANGELOG.md
|
73
|
+
Project-URL: documentation, https://google.github.io/adk-docs/
|
74
|
+
Project-URL: homepage, https://google.github.io/adk-docs/
|
75
|
+
Project-URL: repository, https://github.com/google/adk-python
|
76
|
+
Provides-Extra: dev
|
77
|
+
Provides-Extra: docs
|
78
|
+
Provides-Extra: eval
|
79
|
+
Provides-Extra: extensions
|
80
|
+
Provides-Extra: test
|
81
|
+
|
82
|
+
# Agent Development Kit (ADK)
|
83
|
+
|
84
|
+
[](LICENSE)
|
85
|
+
[](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml)
|
86
|
+
[](https://www.reddit.com/r/agentdevelopmentkit/)
|
87
|
+
|
88
|
+
<html>
|
89
|
+
<h2 align="center">
|
90
|
+
<img src="https://raw.githubusercontent.com/google/adk-python/main/assets/agent-development-kit.png" width="256"/>
|
91
|
+
</h2>
|
92
|
+
<h3 align="center">
|
93
|
+
An open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.
|
94
|
+
</h3>
|
95
|
+
<h3 align="center">
|
96
|
+
Important Links:
|
97
|
+
<a href="https://google.github.io/adk-docs/">Docs</a> &
|
98
|
+
<a href="https://github.com/google/adk-samples">Samples</a>.
|
99
|
+
</h3>
|
100
|
+
</html>
|
101
|
+
|
102
|
+
Agent Development Kit (ADK) is designed for developers seeking fine-grained
|
103
|
+
control and flexibility when building advanced AI agents that are tightly
|
104
|
+
integrated with services in Google Cloud. It allows you to define agent
|
105
|
+
behavior, orchestration, and tool use directly in code, enabling robust
|
106
|
+
debugging, versioning, and deployment anywhere – from your laptop to the cloud.
|
107
|
+
|
108
|
+
|
109
|
+
---
|
110
|
+
|
111
|
+
## ✨ Key Features
|
112
|
+
|
113
|
+
- **Rich Tool Ecosystem**: Utilize pre-built tools, custom functions,
|
114
|
+
OpenAPI specs, or integrate existing tools to give agents diverse
|
115
|
+
capabilities, all for tight integration with the Google ecosystem.
|
116
|
+
|
117
|
+
- **Code-First Development**: Define agent logic, tools, and orchestration
|
118
|
+
directly in Python for ultimate flexibility, testability, and versioning.
|
119
|
+
|
120
|
+
- **Modular Multi-Agent Systems**: Design scalable applications by composing
|
121
|
+
multiple specialized agents into flexible hierarchies.
|
122
|
+
|
123
|
+
- **Deploy Anywhere**: Easily containerize and deploy agents on Cloud Run or
|
124
|
+
scale seamlessly with Vertex AI Agent Engine.
|
125
|
+
|
126
|
+
|
127
|
+
## 🚀 Installation
|
128
|
+
|
129
|
+
You can install the ADK using `pip`:
|
130
|
+
|
131
|
+
```bash
|
132
|
+
pip install google-adk
|
133
|
+
```
|
134
|
+
|
135
|
+
## 📚 Documentation
|
136
|
+
|
137
|
+
Explore the full documentation for detailed guides on building, evaluating, and
|
138
|
+
deploying agents:
|
139
|
+
|
140
|
+
* **[Documentation](https://google.github.io/adk-docs)**
|
141
|
+
|
142
|
+
## 🏁 Feature Highlight
|
143
|
+
|
144
|
+
### Define a single agent:
|
145
|
+
|
146
|
+
```python
|
147
|
+
from google.adk.agents import Agent
|
148
|
+
from google.adk.tools import google_search
|
149
|
+
|
150
|
+
root_agent = Agent(
|
151
|
+
name="search_assistant",
|
152
|
+
model="gemini-2.0-flash", # Or your preferred Gemini model
|
153
|
+
instruction="You are a helpful assistant. Answer user questions using Google Search when needed.",
|
154
|
+
description="An assistant that can search the web.",
|
155
|
+
tools=[google_search]
|
156
|
+
)
|
157
|
+
```
|
158
|
+
|
159
|
+
### Define a multi-agent system:
|
160
|
+
|
161
|
+
Define a multi-agent system with coordinator agent, greeter agent, and task execution agent. Then ADK engine and the model will guide the agents works together to accomplish the task.
|
162
|
+
|
163
|
+
```python
|
164
|
+
from google.adk.agents import LlmAgent, BaseAgent
|
165
|
+
|
166
|
+
# Define individual agents
|
167
|
+
greeter = LlmAgent(name="greeter", model="gemini-2.0-flash", ...)
|
168
|
+
task_executor = LlmAgent(name="task_executor", model="gemini-2.0-flash", ...)
|
169
|
+
|
170
|
+
# Create parent agent and assign children via sub_agents
|
171
|
+
coordinator = LlmAgent(
|
172
|
+
name="Coordinator",
|
173
|
+
model="gemini-2.0-flash",
|
174
|
+
description="I coordinate greetings and tasks.",
|
175
|
+
sub_agents=[ # Assign sub_agents here
|
176
|
+
greeter,
|
177
|
+
task_executor
|
178
|
+
]
|
179
|
+
)
|
180
|
+
```
|
181
|
+
|
182
|
+
### Development UI
|
183
|
+
|
184
|
+
A built-in development UI to help you test, evaluate, debug, and showcase your agent(s).
|
185
|
+
|
186
|
+
<img src="https://raw.githubusercontent.com/google/adk-python/main/assets/adk-web-dev-ui-function-call.png"/>
|
187
|
+
|
188
|
+
### Evaluate Agents
|
189
|
+
|
190
|
+
```bash
|
191
|
+
adk eval \
|
192
|
+
samples_for_testing/hello_world \
|
193
|
+
samples_for_testing/hello_world/hello_world_eval_set_001.evalset.json
|
194
|
+
```
|
195
|
+
|
196
|
+
|
197
|
+
## 🤝 Contributing
|
198
|
+
|
199
|
+
We welcome contributions from the community! Whether it's bug reports, feature requests, documentation improvements, or code contributions, please see our [**Contributing Guidelines**](./CONTRIBUTING.md) to get started.
|
200
|
+
|
201
|
+
## 📄 License
|
202
|
+
|
203
|
+
This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details.
|
204
|
+
|
205
|
+
## Preview
|
206
|
+
|
207
|
+
This feature is subject to the "Pre-GA Offerings Terms" in the General Service Terms section of the [Service Specific Terms](https://cloud.google.com/terms/service-terms#1). Pre-GA features are available "as is" and might have limited support. For more information, see the [launch stage descriptions](https://cloud.google.com/products?hl=en#product-launch-stages).
|
208
|
+
|
209
|
+
---
|
210
|
+
|
211
|
+
*Happy Agent Building!*
|
212
|
+
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# Agent Development Kit (ADK)
|
2
|
+
|
3
|
+
[](LICENSE)
|
4
|
+
[](https://github.com/google/adk-python/actions/workflows/python-unit-tests.yml)
|
5
|
+
[](https://www.reddit.com/r/agentdevelopmentkit/)
|
6
|
+
|
7
|
+
<html>
|
8
|
+
<h2 align="center">
|
9
|
+
<img src="https://raw.githubusercontent.com/google/adk-python/main/assets/agent-development-kit.png" width="256"/>
|
10
|
+
</h2>
|
11
|
+
<h3 align="center">
|
12
|
+
An open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.
|
13
|
+
</h3>
|
14
|
+
<h3 align="center">
|
15
|
+
Important Links:
|
16
|
+
<a href="https://google.github.io/adk-docs/">Docs</a> &
|
17
|
+
<a href="https://github.com/google/adk-samples">Samples</a>.
|
18
|
+
</h3>
|
19
|
+
</html>
|
20
|
+
|
21
|
+
Agent Development Kit (ADK) is designed for developers seeking fine-grained
|
22
|
+
control and flexibility when building advanced AI agents that are tightly
|
23
|
+
integrated with services in Google Cloud. It allows you to define agent
|
24
|
+
behavior, orchestration, and tool use directly in code, enabling robust
|
25
|
+
debugging, versioning, and deployment anywhere – from your laptop to the cloud.
|
26
|
+
|
27
|
+
|
28
|
+
---
|
29
|
+
|
30
|
+
## ✨ Key Features
|
31
|
+
|
32
|
+
- **Rich Tool Ecosystem**: Utilize pre-built tools, custom functions,
|
33
|
+
OpenAPI specs, or integrate existing tools to give agents diverse
|
34
|
+
capabilities, all for tight integration with the Google ecosystem.
|
35
|
+
|
36
|
+
- **Code-First Development**: Define agent logic, tools, and orchestration
|
37
|
+
directly in Python for ultimate flexibility, testability, and versioning.
|
38
|
+
|
39
|
+
- **Modular Multi-Agent Systems**: Design scalable applications by composing
|
40
|
+
multiple specialized agents into flexible hierarchies.
|
41
|
+
|
42
|
+
- **Deploy Anywhere**: Easily containerize and deploy agents on Cloud Run or
|
43
|
+
scale seamlessly with Vertex AI Agent Engine.
|
44
|
+
|
45
|
+
|
46
|
+
## 🚀 Installation
|
47
|
+
|
48
|
+
You can install the ADK using `pip`:
|
49
|
+
|
50
|
+
```bash
|
51
|
+
pip install google-adk
|
52
|
+
```
|
53
|
+
|
54
|
+
## 📚 Documentation
|
55
|
+
|
56
|
+
Explore the full documentation for detailed guides on building, evaluating, and
|
57
|
+
deploying agents:
|
58
|
+
|
59
|
+
* **[Documentation](https://google.github.io/adk-docs)**
|
60
|
+
|
61
|
+
## 🏁 Feature Highlight
|
62
|
+
|
63
|
+
### Define a single agent:
|
64
|
+
|
65
|
+
```python
|
66
|
+
from google.adk.agents import Agent
|
67
|
+
from google.adk.tools import google_search
|
68
|
+
|
69
|
+
root_agent = Agent(
|
70
|
+
name="search_assistant",
|
71
|
+
model="gemini-2.0-flash", # Or your preferred Gemini model
|
72
|
+
instruction="You are a helpful assistant. Answer user questions using Google Search when needed.",
|
73
|
+
description="An assistant that can search the web.",
|
74
|
+
tools=[google_search]
|
75
|
+
)
|
76
|
+
```
|
77
|
+
|
78
|
+
### Define a multi-agent system:
|
79
|
+
|
80
|
+
Define a multi-agent system with coordinator agent, greeter agent, and task execution agent. Then ADK engine and the model will guide the agents works together to accomplish the task.
|
81
|
+
|
82
|
+
```python
|
83
|
+
from google.adk.agents import LlmAgent, BaseAgent
|
84
|
+
|
85
|
+
# Define individual agents
|
86
|
+
greeter = LlmAgent(name="greeter", model="gemini-2.0-flash", ...)
|
87
|
+
task_executor = LlmAgent(name="task_executor", model="gemini-2.0-flash", ...)
|
88
|
+
|
89
|
+
# Create parent agent and assign children via sub_agents
|
90
|
+
coordinator = LlmAgent(
|
91
|
+
name="Coordinator",
|
92
|
+
model="gemini-2.0-flash",
|
93
|
+
description="I coordinate greetings and tasks.",
|
94
|
+
sub_agents=[ # Assign sub_agents here
|
95
|
+
greeter,
|
96
|
+
task_executor
|
97
|
+
]
|
98
|
+
)
|
99
|
+
```
|
100
|
+
|
101
|
+
### Development UI
|
102
|
+
|
103
|
+
A built-in development UI to help you test, evaluate, debug, and showcase your agent(s).
|
104
|
+
|
105
|
+
<img src="https://raw.githubusercontent.com/google/adk-python/main/assets/adk-web-dev-ui-function-call.png"/>
|
106
|
+
|
107
|
+
### Evaluate Agents
|
108
|
+
|
109
|
+
```bash
|
110
|
+
adk eval \
|
111
|
+
samples_for_testing/hello_world \
|
112
|
+
samples_for_testing/hello_world/hello_world_eval_set_001.evalset.json
|
113
|
+
```
|
114
|
+
|
115
|
+
|
116
|
+
## 🤝 Contributing
|
117
|
+
|
118
|
+
We welcome contributions from the community! Whether it's bug reports, feature requests, documentation improvements, or code contributions, please see our [**Contributing Guidelines**](./CONTRIBUTING.md) to get started.
|
119
|
+
|
120
|
+
## 📄 License
|
121
|
+
|
122
|
+
This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details.
|
123
|
+
|
124
|
+
## Preview
|
125
|
+
|
126
|
+
This feature is subject to the "Pre-GA Offerings Terms" in the General Service Terms section of the [Service Specific Terms](https://cloud.google.com/terms/service-terms#1). Pre-GA features are available "as is" and might have limited support. For more information, see the [launch stage descriptions](https://cloud.google.com/products?hl=en#product-launch-stages).
|
127
|
+
|
128
|
+
---
|
129
|
+
|
130
|
+
*Happy Agent Building!*
|
@@ -79,7 +79,11 @@ eval = [
|
|
79
79
|
|
80
80
|
test = [
|
81
81
|
# go/keep-sorted start
|
82
|
+
"anthropic>=0.43.0", # For anthropic model tests
|
82
83
|
"langchain-community>=0.3.17",
|
84
|
+
"langgraph>=0.2.60", # For LangGraphAgent
|
85
|
+
"litellm>=1.63.11", # For LiteLLM tests
|
86
|
+
"llama-index-readers-file>=0.4.0", # for retrieval tests
|
83
87
|
"pytest-asyncio>=0.25.0",
|
84
88
|
"pytest-mock>=3.14.0",
|
85
89
|
"pytest-xdist>=3.6.1",
|
@@ -120,7 +120,7 @@ class BaseAgent(BaseModel):
|
|
120
120
|
self,
|
121
121
|
parent_context: InvocationContext,
|
122
122
|
) -> AsyncGenerator[Event, None]:
|
123
|
-
"""Entry method to run an agent via text-based
|
123
|
+
"""Entry method to run an agent via text-based conversation.
|
124
124
|
|
125
125
|
Args:
|
126
126
|
parent_context: InvocationContext, the invocation context of the parent
|
@@ -152,7 +152,7 @@ class BaseAgent(BaseModel):
|
|
152
152
|
self,
|
153
153
|
parent_context: InvocationContext,
|
154
154
|
) -> AsyncGenerator[Event, None]:
|
155
|
-
"""Entry method to run an agent via video/audio-based
|
155
|
+
"""Entry method to run an agent via video/audio-based conversation.
|
156
156
|
|
157
157
|
Args:
|
158
158
|
parent_context: InvocationContext, the invocation context of the parent
|
@@ -171,7 +171,7 @@ class BaseAgent(BaseModel):
|
|
171
171
|
async def _run_async_impl(
|
172
172
|
self, ctx: InvocationContext
|
173
173
|
) -> AsyncGenerator[Event, None]:
|
174
|
-
"""Core logic to run this agent via text-based
|
174
|
+
"""Core logic to run this agent via text-based conversation.
|
175
175
|
|
176
176
|
Args:
|
177
177
|
ctx: InvocationContext, the invocation context for this agent.
|
@@ -187,7 +187,7 @@ class BaseAgent(BaseModel):
|
|
187
187
|
async def _run_live_impl(
|
188
188
|
self, ctx: InvocationContext
|
189
189
|
) -> AsyncGenerator[Event, None]:
|
190
|
-
"""Core logic to run this agent via video/audio-based
|
190
|
+
"""Core logic to run this agent via video/audio-based conversation.
|
191
191
|
|
192
192
|
Args:
|
193
193
|
ctx: InvocationContext, the invocation context for this agent.
|
@@ -124,7 +124,7 @@ class InvocationContext(BaseModel):
|
|
124
124
|
agent_2, and agent_2 is the parent of agent_3.
|
125
125
|
|
126
126
|
Branch is used when multiple sub-agents shouldn't see their peer agents'
|
127
|
-
|
127
|
+
conversation history.
|
128
128
|
"""
|
129
129
|
agent: BaseAgent
|
130
130
|
"""The current agent of this invocation context. Readonly."""
|
@@ -32,7 +32,7 @@ class RemoteAgent(BaseAgent):
|
|
32
32
|
sub_agents: list[BaseAgent] = Field(
|
33
33
|
default_factory=list, init=False, frozen=True
|
34
34
|
)
|
35
|
-
"""Sub-agent is
|
35
|
+
"""Sub-agent is disabled in RemoteAgent."""
|
36
36
|
|
37
37
|
@override
|
38
38
|
async def _run_async_impl(
|
@@ -42,7 +42,7 @@ class RunConfig(BaseModel):
|
|
42
42
|
"""Speech configuration for the live agent."""
|
43
43
|
|
44
44
|
response_modalities: Optional[list[str]] = None
|
45
|
-
"""The output modalities. If not set,
|
45
|
+
"""The output modalities. If not set, it's default to AUDIO."""
|
46
46
|
|
47
47
|
save_input_blobs_as_artifacts: bool = False
|
48
48
|
"""Whether or not to save the input blobs as artifacts."""
|
@@ -76,7 +76,7 @@ class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
|
|
76
76
|
|
77
77
|
for i in range(len(events) - 2, -1, -1):
|
78
78
|
event = events[i]
|
79
|
-
# looking for the system long running
|
79
|
+
# looking for the system long running request euc function call
|
80
80
|
function_calls = event.get_function_calls()
|
81
81
|
if not function_calls:
|
82
82
|
continue
|
@@ -92,7 +92,7 @@ class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
|
|
92
92
|
if not tools_to_resume:
|
93
93
|
continue
|
94
94
|
|
95
|
-
# found the the system long running
|
95
|
+
# found the the system long running request euc function call
|
96
96
|
# looking for original function call that requests euc
|
97
97
|
for j in range(i - 1, -1, -1):
|
98
98
|
event = events[j]
|
@@ -19,7 +19,7 @@ from .auth_schemes import AuthScheme
|
|
19
19
|
|
20
20
|
|
21
21
|
class AuthConfig(BaseModel):
|
22
|
-
"""The auth config sent by tool asking client to collect auth
|
22
|
+
"""The auth config sent by tool asking client to collect auth credentials and
|
23
23
|
|
24
24
|
adk and client will help to fill in the response
|
25
25
|
"""
|
@@ -25,9 +25,9 @@
|
|
25
25
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
26
26
|
<style>@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
|
27
27
|
<style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;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;}</style>
|
28
|
-
<style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/
|
28
|
+
<style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v241/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;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;}</style>
|
29
29
|
<style>html{color-scheme:dark}html{--mat-sys-background:light-dark(#fcf9f8, #131314);--mat-sys-error:light-dark(#ba1a1a, #ffb4ab);--mat-sys-error-container:light-dark(#ffdad6, #93000a);--mat-sys-inverse-on-surface:light-dark(#f3f0f0, #313030);--mat-sys-inverse-primary:light-dark(#c1c7cd, #595f65);--mat-sys-inverse-surface:light-dark(#313030, #e5e2e2);--mat-sys-on-background:light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-error:light-dark(#ffffff, #690005);--mat-sys-on-error-container:light-dark(#410002, #ffdad6);--mat-sys-on-primary:light-dark(#ffffff, #2b3136);--mat-sys-on-primary-container:light-dark(#161c21, #dde3e9);--mat-sys-on-primary-fixed:light-dark(#161c21, #161c21);--mat-sys-on-primary-fixed-variant:light-dark(#41474d, #41474d);--mat-sys-on-secondary:light-dark(#ffffff, #003061);--mat-sys-on-secondary-container:light-dark(#001b3c, #d5e3ff);--mat-sys-on-secondary-fixed:light-dark(#001b3c, #001b3c);--mat-sys-on-secondary-fixed-variant:light-dark(#0f4784, #0f4784);--mat-sys-on-surface:light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-surface-variant:light-dark(#44474a, #e1e2e6);--mat-sys-on-tertiary:light-dark(#ffffff, #2b3136);--mat-sys-on-tertiary-container:light-dark(#161c21, #dde3e9);--mat-sys-on-tertiary-fixed:light-dark(#161c21, #161c21);--mat-sys-on-tertiary-fixed-variant:light-dark(#41474d, #41474d);--mat-sys-outline:light-dark(#74777b, #8e9194);--mat-sys-outline-variant:light-dark(#c4c7ca, #44474a);--mat-sys-primary:light-dark(#595f65, #c1c7cd);--mat-sys-primary-container:light-dark(#dde3e9, #41474d);--mat-sys-primary-fixed:light-dark(#dde3e9, #dde3e9);--mat-sys-primary-fixed-dim:light-dark(#c1c7cd, #c1c7cd);--mat-sys-scrim:light-dark(#000000, #000000);--mat-sys-secondary:light-dark(#305f9d, #a7c8ff);--mat-sys-secondary-container:light-dark(#d5e3ff, #0f4784);--mat-sys-secondary-fixed:light-dark(#d5e3ff, #d5e3ff);--mat-sys-secondary-fixed-dim:light-dark(#a7c8ff, #a7c8ff);--mat-sys-shadow:light-dark(#000000, #000000);--mat-sys-surface:light-dark(#fcf9f8, #131314);--mat-sys-surface-bright:light-dark(#fcf9f8, #393939);--mat-sys-surface-container:light-dark(#f0eded, #201f20);--mat-sys-surface-container-high:light-dark(#eae7e7, #2a2a2a);--mat-sys-surface-container-highest:light-dark(#e5e2e2, #393939);--mat-sys-surface-container-low:light-dark(#f6f3f3, #1c1b1c);--mat-sys-surface-container-lowest:light-dark(#ffffff, #0e0e0e);--mat-sys-surface-dim:light-dark(#dcd9d9, #131314);--mat-sys-surface-tint:light-dark(#595f65, #c1c7cd);--mat-sys-surface-variant:light-dark(#e1e2e6, #44474a);--mat-sys-tertiary:light-dark(#595f65, #c1c7cd);--mat-sys-tertiary-container:light-dark(#dde3e9, #41474d);--mat-sys-tertiary-fixed:light-dark(#dde3e9, #dde3e9);--mat-sys-tertiary-fixed-dim:light-dark(#c1c7cd, #c1c7cd);--mat-sys-neutral-variant20:#2d3134;--mat-sys-neutral10:#1c1b1c}html{--mat-sys-level0:0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level1:0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level2:0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level3:0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level4:0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-sys-level5:0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--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}html{--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}:root{--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}:root{--mdc-dialog-container-color:#2b2b2f}:root{--mdc-dialog-subhead-color:white}:root{--mdc-circular-progress-active-indicator-color:#a8c7fa}:root{--mdc-circular-progress-size:80}</style><link rel="stylesheet" href="styles-4VDSPQ37.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-4VDSPQ37.css"></noscript></head>
|
30
30
|
<body>
|
31
31
|
<app-root></app-root>
|
32
|
-
<script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-
|
32
|
+
<script src="polyfills-FFHMD2TL.js" type="module"></script><script src="main-ZBO76GRM.js" type="module"></script></body>
|
33
33
|
</html>
|