google-adk 1.1.0__py3-none-any.whl → 1.2.0__py3-none-any.whl

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.
Files changed (72) hide show
  1. google/adk/agents/base_agent.py +0 -2
  2. google/adk/agents/invocation_context.py +3 -3
  3. google/adk/agents/parallel_agent.py +17 -7
  4. google/adk/agents/sequential_agent.py +8 -8
  5. google/adk/auth/auth_preprocessor.py +18 -17
  6. google/adk/cli/agent_graph.py +165 -23
  7. google/adk/cli/browser/assets/ADK-512-color.svg +9 -0
  8. google/adk/cli/browser/index.html +2 -2
  9. google/adk/cli/browser/{main-PKDNKWJE.js → main-CS5OLUMF.js} +59 -59
  10. google/adk/cli/browser/polyfills-FFHMD2TL.js +17 -0
  11. google/adk/cli/cli.py +9 -9
  12. google/adk/cli/cli_deploy.py +157 -0
  13. google/adk/cli/cli_tools_click.py +228 -99
  14. google/adk/cli/fast_api.py +119 -34
  15. google/adk/cli/utils/agent_loader.py +60 -44
  16. google/adk/cli/utils/envs.py +1 -1
  17. google/adk/code_executors/unsafe_local_code_executor.py +11 -0
  18. google/adk/errors/__init__.py +13 -0
  19. google/adk/errors/not_found_error.py +28 -0
  20. google/adk/evaluation/agent_evaluator.py +1 -1
  21. google/adk/evaluation/eval_sets_manager.py +36 -6
  22. google/adk/evaluation/evaluation_generator.py +5 -4
  23. google/adk/evaluation/local_eval_sets_manager.py +101 -6
  24. google/adk/flows/llm_flows/agent_transfer.py +2 -2
  25. google/adk/flows/llm_flows/base_llm_flow.py +19 -0
  26. google/adk/flows/llm_flows/contents.py +4 -4
  27. google/adk/flows/llm_flows/functions.py +140 -127
  28. google/adk/memory/vertex_ai_rag_memory_service.py +2 -2
  29. google/adk/models/anthropic_llm.py +7 -10
  30. google/adk/models/google_llm.py +46 -18
  31. google/adk/models/lite_llm.py +63 -26
  32. google/adk/py.typed +0 -0
  33. google/adk/sessions/_session_util.py +10 -16
  34. google/adk/sessions/database_session_service.py +81 -66
  35. google/adk/sessions/vertex_ai_session_service.py +32 -6
  36. google/adk/telemetry.py +91 -24
  37. google/adk/tools/_automatic_function_calling_util.py +31 -25
  38. google/adk/tools/{function_parameter_parse_util.py → _function_parameter_parse_util.py} +9 -3
  39. google/adk/tools/_gemini_schema_util.py +158 -0
  40. google/adk/tools/apihub_tool/apihub_toolset.py +3 -2
  41. google/adk/tools/application_integration_tool/clients/connections_client.py +7 -0
  42. google/adk/tools/application_integration_tool/integration_connector_tool.py +5 -7
  43. google/adk/tools/base_tool.py +4 -8
  44. google/adk/tools/bigquery/__init__.py +11 -1
  45. google/adk/tools/bigquery/bigquery_credentials.py +9 -4
  46. google/adk/tools/bigquery/bigquery_toolset.py +86 -0
  47. google/adk/tools/bigquery/client.py +33 -0
  48. google/adk/tools/bigquery/metadata_tool.py +249 -0
  49. google/adk/tools/bigquery/query_tool.py +76 -0
  50. google/adk/tools/function_tool.py +4 -4
  51. google/adk/tools/langchain_tool.py +20 -13
  52. google/adk/tools/load_memory_tool.py +1 -0
  53. google/adk/tools/mcp_tool/conversion_utils.py +4 -2
  54. google/adk/tools/mcp_tool/mcp_session_manager.py +63 -5
  55. google/adk/tools/mcp_tool/mcp_tool.py +3 -2
  56. google/adk/tools/mcp_tool/mcp_toolset.py +15 -8
  57. google/adk/tools/openapi_tool/common/common.py +4 -43
  58. google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +0 -2
  59. google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +4 -2
  60. google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +4 -2
  61. google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +7 -127
  62. google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +2 -7
  63. google/adk/tools/transfer_to_agent_tool.py +8 -1
  64. google/adk/tools/vertex_ai_search_tool.py +8 -1
  65. google/adk/utils/variant_utils.py +51 -0
  66. google/adk/version.py +1 -1
  67. {google_adk-1.1.0.dist-info → google_adk-1.2.0.dist-info}/METADATA +7 -7
  68. {google_adk-1.1.0.dist-info → google_adk-1.2.0.dist-info}/RECORD +71 -61
  69. google/adk/cli/browser/polyfills-B6TNHZQ6.js +0 -17
  70. {google_adk-1.1.0.dist-info → google_adk-1.2.0.dist-info}/WHEEL +0 -0
  71. {google_adk-1.1.0.dist-info → google_adk-1.2.0.dist-info}/entry_points.txt +0 -0
  72. {google_adk-1.1.0.dist-info → google_adk-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -246,8 +246,6 @@ class BaseAgent(BaseModel):
246
246
  ) -> InvocationContext:
247
247
  """Creates a new invocation context for this agent."""
248
248
  invocation_context = parent_context.model_copy(update={'agent': self})
249
- if parent_context.branch:
250
- invocation_context.branch = f'{parent_context.branch}.{self.name}'
251
249
  return invocation_context
252
250
 
253
251
  @property
@@ -39,9 +39,9 @@ class LlmCallsLimitExceededError(Exception):
39
39
  class _InvocationCostManager(BaseModel):
40
40
  """A container to keep track of the cost of invocation.
41
41
 
42
- While we don't expected the metrics captured here to be a direct
43
- representatative of monetary cost incurred in executing the current
44
- invocation, but they, in someways have an indirect affect.
42
+ While we don't expect the metrics captured here to be a direct
43
+ representative of monetary cost incurred in executing the current
44
+ invocation, they in some ways have an indirect effect.
45
45
  """
46
46
 
47
47
  _number_of_llm_calls: int = 0
@@ -26,14 +26,20 @@ from ..events.event import Event
26
26
  from .base_agent import BaseAgent
27
27
 
28
28
 
29
- def _set_branch_for_current_agent(
30
- current_agent: BaseAgent, invocation_context: InvocationContext
31
- ):
29
+ def _create_branch_ctx_for_sub_agent(
30
+ agent: BaseAgent,
31
+ sub_agent: BaseAgent,
32
+ invocation_context: InvocationContext,
33
+ ) -> InvocationContext:
34
+ """Create isolated branch for every sub-agent."""
35
+ invocation_context = invocation_context.model_copy()
36
+ branch_suffix = f"{agent.name}.{sub_agent.name}"
32
37
  invocation_context.branch = (
33
- f"{invocation_context.branch}.{current_agent.name}"
38
+ f"{invocation_context.branch}.{branch_suffix}"
34
39
  if invocation_context.branch
35
- else current_agent.name
40
+ else branch_suffix
36
41
  )
42
+ return invocation_context
37
43
 
38
44
 
39
45
  async def _merge_agent_run(
@@ -90,8 +96,12 @@ class ParallelAgent(BaseAgent):
90
96
  async def _run_async_impl(
91
97
  self, ctx: InvocationContext
92
98
  ) -> AsyncGenerator[Event, None]:
93
- _set_branch_for_current_agent(self, ctx)
94
- agent_runs = [agent.run_async(ctx) for agent in self.sub_agents]
99
+ agent_runs = [
100
+ sub_agent.run_async(
101
+ _create_branch_ctx_for_sub_agent(self, sub_agent, ctx)
102
+ )
103
+ for sub_agent in self.sub_agents
104
+ ]
95
105
  async for event in _merge_agent_run(agent_runs):
96
106
  yield event
97
107
 
@@ -27,7 +27,7 @@ from .llm_agent import LlmAgent
27
27
 
28
28
 
29
29
  class SequentialAgent(BaseAgent):
30
- """A shell agent that run its sub-agents in sequence."""
30
+ """A shell agent that runs its sub-agents in sequence."""
31
31
 
32
32
  @override
33
33
  async def _run_async_impl(
@@ -43,11 +43,11 @@ class SequentialAgent(BaseAgent):
43
43
  ) -> AsyncGenerator[Event, None]:
44
44
  """Implementation for live SequentialAgent.
45
45
 
46
- Compared to non-live case, live agents process a continous streams of audio
47
- or video, so it doesn't have a way to tell if it's finished and should pass
48
- to next agent or not. So we introduce a task_compelted() function so the
46
+ Compared to the non-live case, live agents process a continuous stream of audio
47
+ or video, so there is no way to tell if it's finished and should pass
48
+ to the next agent or not. So we introduce a task_completed() function so the
49
49
  model can call this function to signal that it's finished the task and we
50
- can move on to next agent.
50
+ can move on to the next agent.
51
51
 
52
52
  Args:
53
53
  ctx: The invocation context of the agent.
@@ -66,10 +66,10 @@ class SequentialAgent(BaseAgent):
66
66
  # Use function name to dedupe.
67
67
  if task_completed.__name__ not in sub_agent.tools:
68
68
  sub_agent.tools.append(task_completed)
69
- sub_agent.instruction += f"""If you finished the user' request
70
- according to its description, call {task_completed.__name__} function
69
+ sub_agent.instruction += f"""If you finished the user's request
70
+ according to its description, call the {task_completed.__name__} function
71
71
  to exit so the next agents can take over. When calling this function,
72
- do not generate any text other than the function call.'"""
72
+ do not generate any text other than the function call."""
73
73
 
74
74
  for sub_agent in self.sub_agents:
75
75
  async for event in sub_agent.run_live(ctx):
@@ -100,23 +100,24 @@ class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
100
100
  function_calls = event.get_function_calls()
101
101
  if not function_calls:
102
102
  continue
103
- for function_call in function_calls:
104
- function_response_event = None
105
- if function_call.id in tools_to_resume:
106
- function_response_event = await functions.handle_function_calls_async(
107
- invocation_context,
108
- event,
109
- {
110
- tool.name: tool
111
- for tool in await agent.canonical_tools(
112
- ReadonlyContext(invocation_context)
113
- )
114
- },
115
- # there could be parallel function calls that require auth
116
- # auth response would be a dict keyed by function call id
117
- tools_to_resume,
118
- )
119
- if function_response_event:
103
+
104
+ if any([
105
+ function_call.id in tools_to_resume
106
+ for function_call in function_calls
107
+ ]):
108
+ if function_response_event := await functions.handle_function_calls_async(
109
+ invocation_context,
110
+ event,
111
+ {
112
+ tool.name: tool
113
+ for tool in await agent.canonical_tools(
114
+ ReadonlyContext(invocation_context)
115
+ )
116
+ },
117
+ # there could be parallel function calls that require auth
118
+ # auth response would be a dict keyed by function call id
119
+ tools_to_resume,
120
+ ):
120
121
  yield function_response_event
121
122
  return
122
123
  return
@@ -20,6 +20,9 @@ from typing import Union
20
20
  import graphviz
21
21
 
22
22
  from ..agents import BaseAgent
23
+ from ..agents import LoopAgent
24
+ from ..agents import ParallelAgent
25
+ from ..agents import SequentialAgent
23
26
  from ..agents.llm_agent import LlmAgent
24
27
  from ..tools.agent_tool import AgentTool
25
28
  from ..tools.base_tool import BaseTool
@@ -35,14 +38,39 @@ else:
35
38
  retrieval_tool_module_loaded = True
36
39
 
37
40
 
38
- async def build_graph(graph, agent: BaseAgent, highlight_pairs):
41
+ async def build_graph(
42
+ graph: graphviz.Digraph,
43
+ agent: BaseAgent,
44
+ highlight_pairs,
45
+ parent_agent=None,
46
+ ):
47
+ """
48
+ Build a graph of the agent and its sub-agents.
49
+ Args:
50
+ graph: The graph to build on.
51
+ agent: The agent to build the graph for.
52
+ highlight_pairs: A list of pairs of nodes to highlight.
53
+ parent_agent: The parent agent of the current agent. This is specifically used when building Workflow Agents to directly connect a node to nodes inside a Workflow Agent.
54
+
55
+ Returns:
56
+ None
57
+ """
39
58
  dark_green = '#0F5223'
40
59
  light_green = '#69CB87'
41
60
  light_gray = '#cccccc'
61
+ white = '#ffffff'
42
62
 
43
63
  def get_node_name(tool_or_agent: Union[BaseAgent, BaseTool]):
44
64
  if isinstance(tool_or_agent, BaseAgent):
45
- return tool_or_agent.name
65
+ # Added Workflow Agent checks for different agent types
66
+ if isinstance(tool_or_agent, SequentialAgent):
67
+ return tool_or_agent.name + f' (Sequential Agent)'
68
+ elif isinstance(tool_or_agent, LoopAgent):
69
+ return tool_or_agent.name + f' (Loop Agent)'
70
+ elif isinstance(tool_or_agent, ParallelAgent):
71
+ return tool_or_agent.name + f' (Parallel Agent)'
72
+ else:
73
+ return tool_or_agent.name
46
74
  elif isinstance(tool_or_agent, BaseTool):
47
75
  return tool_or_agent.name
48
76
  else:
@@ -73,6 +101,7 @@ async def build_graph(graph, agent: BaseAgent, highlight_pairs):
73
101
  def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]):
74
102
  if isinstance(tool_or_agent, BaseAgent):
75
103
  return 'ellipse'
104
+
76
105
  elif retrieval_tool_module_loaded and isinstance(
77
106
  tool_or_agent, BaseRetrievalTool
78
107
  ):
@@ -89,32 +118,131 @@ async def build_graph(graph, agent: BaseAgent, highlight_pairs):
89
118
  )
90
119
  return 'cylinder'
91
120
 
121
+ def should_build_agent_cluster(tool_or_agent: Union[BaseAgent, BaseTool]):
122
+ if isinstance(tool_or_agent, BaseAgent):
123
+ if isinstance(tool_or_agent, SequentialAgent):
124
+ return True
125
+ elif isinstance(tool_or_agent, LoopAgent):
126
+ return True
127
+ elif isinstance(tool_or_agent, ParallelAgent):
128
+ return True
129
+ else:
130
+ return False
131
+ elif retrieval_tool_module_loaded and isinstance(
132
+ tool_or_agent, BaseRetrievalTool
133
+ ):
134
+ return False
135
+ elif isinstance(tool_or_agent, FunctionTool):
136
+ return False
137
+ elif isinstance(tool_or_agent, BaseTool):
138
+ return False
139
+ else:
140
+ logger.warning(
141
+ 'Unsupported tool, type: %s, obj: %s',
142
+ type(tool_or_agent),
143
+ tool_or_agent,
144
+ )
145
+ return False
146
+
147
+ def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str):
148
+ if isinstance(agent, LoopAgent):
149
+ # Draw the edge from the parent agent to the first sub-agent
150
+ draw_edge(parent_agent.name, agent.sub_agents[0].name)
151
+ length = len(agent.sub_agents)
152
+ currLength = 0
153
+ # Draw the edges between the sub-agents
154
+ for sub_agent_int_sequential in agent.sub_agents:
155
+ build_graph(child, sub_agent_int_sequential, highlight_pairs)
156
+ # Draw the edge between the current sub-agent and the next one
157
+ # If it's the last sub-agent, draw an edge to the first one to indicating a loop
158
+ draw_edge(
159
+ agent.sub_agents[currLength].name,
160
+ agent.sub_agents[
161
+ 0 if currLength == length - 1 else currLength + 1
162
+ ].name,
163
+ )
164
+ currLength += 1
165
+ elif isinstance(agent, SequentialAgent):
166
+ # Draw the edge from the parent agent to the first sub-agent
167
+ draw_edge(parent_agent.name, agent.sub_agents[0].name)
168
+ length = len(agent.sub_agents)
169
+ currLength = 0
170
+
171
+ # Draw the edges between the sub-agents
172
+ for sub_agent_int_sequential in agent.sub_agents:
173
+ build_graph(child, sub_agent_int_sequential, highlight_pairs)
174
+ # Draw the edge between the current sub-agent and the next one
175
+ # If it's the last sub-agent, don't draw an edge to avoid a loop
176
+ draw_edge(
177
+ agent.sub_agents[currLength].name,
178
+ agent.sub_agents[currLength + 1].name,
179
+ ) if currLength != length - 1 else None
180
+ currLength += 1
181
+
182
+ elif isinstance(agent, ParallelAgent):
183
+ # Draw the edge from the parent agent to every sub-agent
184
+ for sub_agent in agent.sub_agents:
185
+ build_graph(child, sub_agent, highlight_pairs)
186
+ draw_edge(parent_agent.name, sub_agent.name)
187
+ else:
188
+ for sub_agent in agent.sub_agents:
189
+ build_graph(child, sub_agent, highlight_pairs)
190
+ draw_edge(agent.name, sub_agent.name)
191
+
192
+ child.attr(
193
+ label=name,
194
+ style='rounded',
195
+ color=white,
196
+ fontcolor=light_gray,
197
+ )
198
+
92
199
  def draw_node(tool_or_agent: Union[BaseAgent, BaseTool]):
93
200
  name = get_node_name(tool_or_agent)
94
201
  shape = get_node_shape(tool_or_agent)
95
202
  caption = get_node_caption(tool_or_agent)
203
+ asCluster = should_build_agent_cluster(tool_or_agent)
204
+ child = None
96
205
  if highlight_pairs:
97
206
  for highlight_tuple in highlight_pairs:
98
207
  if name in highlight_tuple:
99
- graph.node(
100
- name,
101
- caption,
102
- style='filled,rounded',
103
- fillcolor=dark_green,
104
- color=dark_green,
105
- shape=shape,
106
- fontcolor=light_gray,
107
- )
208
+ # if in highlight, draw highlight node
209
+ if asCluster:
210
+ cluster = graphviz.Digraph(
211
+ name='cluster_' + name
212
+ ) # adding "cluster_" to the name makes the graph render as a cluster subgraph
213
+ build_cluster(cluster, agent, name)
214
+ graph.subgraph(cluster)
215
+ else:
216
+ graph.node(
217
+ name,
218
+ caption,
219
+ style='filled,rounded',
220
+ fillcolor=dark_green,
221
+ color=dark_green,
222
+ shape=shape,
223
+ fontcolor=light_gray,
224
+ )
108
225
  return
109
- # if not in highlight, draw non-highliht node
110
- graph.node(
111
- name,
112
- caption,
113
- shape=shape,
114
- style='rounded',
115
- color=light_gray,
116
- fontcolor=light_gray,
117
- )
226
+ # if not in highlight, draw non-highlight node
227
+ if asCluster:
228
+
229
+ cluster = graphviz.Digraph(
230
+ name='cluster_' + name
231
+ ) # adding "cluster_" to the name makes the graph render as a cluster subgraph
232
+ build_cluster(cluster, agent, name)
233
+ graph.subgraph(cluster)
234
+
235
+ else:
236
+ graph.node(
237
+ name,
238
+ caption,
239
+ shape=shape,
240
+ style='rounded',
241
+ color=light_gray,
242
+ fontcolor=light_gray,
243
+ )
244
+
245
+ return
118
246
 
119
247
  def draw_edge(from_name, to_name):
120
248
  if highlight_pairs:
@@ -126,12 +254,26 @@ async def build_graph(graph, agent: BaseAgent, highlight_pairs):
126
254
  graph.edge(from_name, to_name, color=light_green, dir='back')
127
255
  return
128
256
  # if no need to highlight, color gray
129
- graph.edge(from_name, to_name, arrowhead='none', color=light_gray)
257
+ if should_build_agent_cluster(agent):
258
+
259
+ graph.edge(
260
+ from_name,
261
+ to_name,
262
+ color=light_gray,
263
+ )
264
+ else:
265
+ graph.edge(from_name, to_name, arrowhead='none', color=light_gray)
130
266
 
131
267
  draw_node(agent)
132
268
  for sub_agent in agent.sub_agents:
133
- build_graph(graph, sub_agent, highlight_pairs)
134
- draw_edge(agent.name, sub_agent.name)
269
+
270
+ build_graph(graph, sub_agent, highlight_pairs, agent)
271
+ if not should_build_agent_cluster(
272
+ sub_agent
273
+ ) and not should_build_agent_cluster(
274
+ agent
275
+ ): # This is to avoid making a node for a Workflow Agent
276
+ draw_edge(agent.name, sub_agent.name)
135
277
  if isinstance(agent, LlmAgent):
136
278
  for tool in await agent.canonical_tools():
137
279
  draw_node(tool)
@@ -0,0 +1,9 @@
1
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M16.3306 19.6098C16.6842 20.0341 16.6268 20.6646 16.2026 21.0182L13.5619 23.2187L16.2026 25.4193C16.6268 25.7728 16.6842 26.4034 16.3306 26.8277C15.977 27.2519 15.3465 27.3093 14.9222 26.9557L11.4173 24.035C10.9076 23.6102 10.9076 22.8273 11.4173 22.4025L14.9222 19.4818C15.3465 19.1282 15.977 19.1855 16.3306 19.6098Z" fill="#EA4335"/>
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M21.0444 19.6098C20.6908 20.0341 20.7482 20.6646 21.1724 21.0182L23.8131 23.2187L21.1724 25.4193C20.7482 25.7728 20.6908 26.4034 21.0444 26.8277C21.398 27.2519 22.0285 27.3093 22.4528 26.9557L25.9577 24.035C26.4674 23.6102 26.4674 22.8273 25.9577 22.4025L22.4528 19.4818C22.0285 19.1282 21.398 19.1855 21.0444 19.6098Z" fill="#EA4335"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.75 6C22.3043 6 24.375 8.07068 24.375 10.625C24.375 13.1793 22.3043 15.25 19.75 15.25H13.25C12.6977 15.25 12.25 15.6977 12.25 16.25C12.25 16.8023 12.6977 17.25 13.25 17.25H19.75C23.4089 17.25 26.375 14.2839 26.375 10.625C26.375 6.96611 23.4089 4 19.75 4H13.25C12.6977 4 12.25 4.44772 12.25 5C12.25 5.55228 12.6977 6 13.25 6H19.75Z" fill="#34A853"/>
5
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M7 20.625H8.625C9.17728 20.625 9.625 20.1773 9.625 19.625C9.625 19.0727 9.17728 18.625 8.625 18.625H6.625C5.72754 18.625 5 19.3525 5 20.25V26.25C5 27.1475 5.72754 27.875 6.625 27.875H8.625C9.17728 27.875 9.625 27.4273 9.625 26.875C9.625 26.3227 9.17728 25.875 8.625 25.875H7V20.625Z" fill="#FBBC04"/>
6
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M11.625 6C9.07068 6 7 8.07068 7 10.625C7 13.1793 9.07068 15.25 11.625 15.25H19.3196C19.8105 15.25 20.2084 15.648 20.2084 16.1389C20.2084 16.7525 19.711 17.25 19.0973 17.25H11.625C7.96611 17.25 5 14.2839 5 10.625C5 6.96611 7.96611 4 11.625 4H18.125C18.6773 4 19.125 4.44772 19.125 5C19.125 5.55228 18.6773 6 18.125 6H11.625Z" fill="#4285F4"/>
7
+ <path d="M13 10.625C13 11.2463 12.4963 11.75 11.875 11.75C11.2537 11.75 10.75 11.2463 10.75 10.625C10.75 10.0037 11.2537 9.5 11.875 9.5C12.4963 9.5 13 10.0037 13 10.625Z" fill="#4285F4"/>
8
+ <path d="M20.75 10.625C20.75 11.2463 20.2463 11.75 19.625 11.75C19.0037 11.75 18.5 11.2463 18.5 10.625C18.5 10.0037 19.0037 9.5 19.625 9.5C20.2463 9.5 20.75 10.0037 20.75 10.625Z" fill="#4285F4"/>
9
+ </svg>
@@ -23,11 +23,11 @@
23
23
  <link rel="icon" type="image/x-icon" href="adk_favicon.svg">
24
24
  <link rel="preconnect" href="https://fonts.googleapis.com">
25
25
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
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>
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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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/v43/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
28
  <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v247/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-B6TNHZQ6.js" type="module"></script><script src="./main-PKDNKWJE.js" type="module"></script></body>
32
+ <script src="./polyfills-FFHMD2TL.js" type="module"></script><script src="./main-CS5OLUMF.js" type="module"></script></body>
33
33
  </html>