max-agent-ui 0.0.38 → 0.0.39
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.
- package/fesm2022/max-agent-ui.mjs +27 -19
- package/fesm2022/max-agent-ui.mjs.map +1 -1
- package/index.d.ts +7 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/components/assistant/assistant-conversation-state.ts","../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.component.ts","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.component.html","../../../projects/max-agent-ui/src/lib/config/assistant-endpoint.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-export.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-feedback.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-support.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { Subject } from 'rxjs';\nimport type { AssistantChatResponse, AssistantConversationMessage } from '../../models/assistant.models';\n\n/** Owned by one assistant component. Never persists, shares across tabs, or decodes signed state. */\nexport class AssistantConversationState {\n readonly resetRequests = new Subject<void>();\n token?: string;\n private identity?: string;\n\n reset(): void {\n this.resetRequests.next();\n this.token = undefined;\n }\n\n accept(response: AssistantChatResponse): void {\n this.token = response.conversationState?.length && response.conversationState.length <= 250_000\n ? response.conversationState : undefined;\n }\n\n changedIdentity(identity: string): boolean {\n const changed = this.identity !== undefined && this.identity !== identity;\n this.identity = identity;\n return changed;\n }\n\n history(messages: AssistantConversationMessage[], question = ''): AssistantConversationMessage[] {\n let candidates = messages.slice(-8);\n if (question && messages.length > 8) {\n const ignored = new Set(['show', 'tell', 'what', 'that', 'this', 'with', 'from', 'have', 'were', 'many', 'about', 'please']);\n const words = [...new Set(question.toLowerCase().match(/[\\p{L}\\p{N}]{4,}/gu) ?? [])].filter(word => !ignored.has(word));\n const older = messages.slice(0, -4).map((message, index) => ({ message, index,\n score: message.role === 'user' ? words.filter(word => message.content.toLowerCase().includes(word)).length : 0\n })).filter(item => item.score > 0).sort((a, b) => b.score - a.score || b.index - a.index).slice(0, 2).sort((a, b) => a.index - b.index);\n if (older.length) candidates = [...older.flatMap(item => messages.slice(item.index,\n messages[item.index + 1]?.role === 'assistant' ? item.index + 2 : item.index + 1)), ...messages.slice(-4)];\n }\n const encoder = new TextEncoder();\n let remaining = 8_000;\n return candidates.reverse().flatMap(message => {\n let content = '';\n let bytes = 0;\n for (const character of message.content) {\n const size = encoder.encode(character).length;\n if (bytes + size > Math.min(3_000, remaining)) break;\n content += character;\n bytes += size;\n }\n remaining -= bytes;\n return content ? [{ ...message, content }] : [];\n }).reverse();\n }\n}\n","import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n /** Per-request transient state supplied by the assistant, never persisted by the host. */\n conversationStateVersion?: 1;\n conversationState?: string;\n apiBaseUrl?: string;\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(\n value: string | null | undefined,\n variant: 'default' | 'information' = 'default'\n ): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n\n const rendered = marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n\n return variant === 'information'\n ? rendered.replaceAll(\n '<li>',\n '<li><i class=\"fa-solid fa-arrow-right\" aria-hidden=\"true\"></i>'\n )\n : rendered;\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { AssistantSuggestionEntity } from '../../models/assistant.models';\n\nconst ENTITY_ICONS: Readonly<Partial<Record<AssistantSuggestionEntity['kind'], string>>> = {\n team: 'pi pi-users',\n role: 'pi pi-id-card',\n location: 'pi pi-map-marker',\n position: 'pi pi-briefcase',\n department: 'pi pi-building',\n entity: 'pi pi-tag',\n};\n\n@Component({\n selector: 'max-agent-entity-option',\n templateUrl: './max-agent-entity-option.component.html',\n styleUrl: './max-agent-entity-option.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MaxAgentEntityOptionComponent {\n @Input({ required: true }) entity!: AssistantSuggestionEntity;\n @Input() disabled = false;\n\n @Output() selected = new EventEmitter<void>();\n\n protected get isPerson(): boolean {\n return this.entity.kind === 'person' || this.entity.kind === 'employee';\n }\n\n protected get displayCode(): string | number | undefined {\n return this.entity.code ?? this.entity.id;\n }\n\n protected get initials(): string {\n return this.entity.name\n .split(/\\s+/u)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase())\n .join('');\n }\n\n protected get entityColor(): string | undefined {\n return this.normaliseColor(this.entity.color);\n }\n\n protected get entityTextColor(): string | undefined {\n return this.normaliseColor(this.entity.textColor);\n }\n\n protected get entityIcon(): string {\n return ENTITY_ICONS[this.entity.kind] ?? 'pi pi-tag';\n }\n\n protected choose(): void {\n if (!this.disabled) {\n this.selected.emit();\n }\n }\n\n private normaliseColor(value: string | undefined): string | undefined {\n const color = value?.trim();\n if (!color) {\n return undefined;\n }\n return /^[\\da-f]{3,8}$/iu.test(color) ? `#${color}` : color;\n }\n}\n","<button\n type=\"button\"\n class=\"entity-option\"\n [class.entity-option-person]=\"isPerson\"\n [class.entity-option-tag]=\"!isPerson\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Choose ' + entity.name\"\n [style.--max-agent-entity-color]=\"entityColor\"\n [style.--max-agent-entity-text-color]=\"entityTextColor\"\n (click)=\"choose()\"\n>\n @if (isPerson) {\n <span class=\"person-photo\" aria-hidden=\"true\">\n @if (entity.photo) {\n <img [src]=\"entity.photo\" [alt]=\"''\" />\n } @else {\n <span>{{ initials }}</span>\n }\n </span>\n <span class=\"person-copy\">\n <span class=\"person-name\">{{ entity.name }}</span>\n @if (displayCode !== undefined && displayCode !== '') {\n <small>#{{ displayCode }}</small>\n }\n </span>\n <i class=\"pi pi-arrow-right option-arrow\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"entity-icon\" aria-hidden=\"true\">\n <i [class]=\"entityIcon\"></i>\n </span>\n <span class=\"entity-name\">{{ entity.name }}</span>\n }\n</button>\n","import { isDevMode } from '@angular/core';\n\nexport const ASSISTANT_CHAT_ENDPOINTS = {\n development: '/agent-api/v1/chat',\n production: 'https://agent.maxtime.cloud/v1/chat'\n} as const;\n\nexport const ASSISTANT_FEEDBACK_ENDPOINTS = {\n development: '/agent-api/v1/feedback',\n production: 'https://agent.maxtime.cloud/v1/feedback'\n} as const;\n\nexport function getDefaultAssistantChatUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_CHAT_ENDPOINTS.development\n : ASSISTANT_CHAT_ENDPOINTS.production;\n}\n\nexport function getDefaultAssistantFeedbackUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_FEEDBACK_ENDPOINTS.development\n : ASSISTANT_FEEDBACK_ENDPOINTS.production;\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantChatUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantChatRequest,\n AssistantChatActivity,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantAnalyticsPage,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\nconst STREAM_IDLE_TIMEOUT_MS = 45_000;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n retrieveAnalyticsPage(\n message: string,\n analyticsPage: AssistantAnalyticsPage,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n analyticsPage\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n request = { ...request,\n ...(config.conversationStateVersion ? { conversationStateVersion: config.conversationStateVersion } : {}),\n ...(request.conversationId && config.conversationState ? { conversationState: config.conversationState } : {})\n };\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const streamError = (message: string, code: string) => new HttpErrorResponse({\n error: { message, code },\n status: code === 'request_timeout' ? 504 : 502,\n url: this.getChatUrl(config)\n });\n let idleTimer: ReturnType<typeof setTimeout>;\n const resetIdleTimer = () => {\n clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n subscriber.error(streamError(\n 'This request is taking longer than expected. Please try again.',\n 'request_timeout'\n ));\n controller.abort();\n }, STREAM_IDLE_TIMEOUT_MS);\n };\n resetIdleTimer();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n if (subscriber.closed) return;\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'delta' || event.type === 'data') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw streamError(event.message, event.code ?? 'request_failed');\n }\n\n if (event.type === 'result') {\n receivedResult = true;\n subscriber.next(event.response);\n subscriber.complete();\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n resetIdleTimer();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n if (receivedResult || subscriber.closed) {\n return;\n }\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n );\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed) {\n subscriber.error(error?.name === 'AbortError'\n ? streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n )\n : error);\n }\n });\n\n return () => {\n clearTimeout(idleTimer);\n controller.abort();\n };\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || getDefaultAssistantChatUrl();\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private getRequestUser(\n config: MaxAssistantConfig\n ): Pick<AssistantUser, 'name' | 'username' | 'email'> | undefined {\n const configuredUser = this.getUser(config);\n const user = {\n ...this.getOptionalText('name', configuredUser.name),\n ...this.getOptionalText('username', configuredUser.username),\n ...this.getOptionalText('email', configuredUser.email)\n };\n\n return Object.keys(user).length > 0 ? user : undefined;\n }\n\n private getOptionalText<Key extends 'name' | 'username' | 'email'>(\n key: Key,\n value: AssistantUser[Key]\n ): Partial<Pick<AssistantUser, Key>> {\n if (typeof value !== 'string' || !value.trim()) {\n return {};\n }\n\n return { [key]: value.trim() } as Partial<Pick<AssistantUser, Key>>;\n }\n\n private getContext(config: MaxAssistantConfig): AssistantRequestContext | undefined {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context;\n\n if (!configured) {\n return undefined;\n }\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...this.compactConfig(config)\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport {\n AssistantFieldValue,\n AssistantResponseTable,\n AssistantVisualisation,\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantExportService {\n async exportTableToExcel(table: AssistantResponseTable): Promise<void> {\n const XLSX = await import('xlsx');\n const worksheetData = [\n table.columns.map(column => column.header),\n ...table.rows.map(row =>\n table.columns.map(column => this.toExportCellValue(row[column.field]))\n ),\n ];\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n const workbook = XLSX.utils.book_new();\n\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Results');\n const file = XLSX.write(workbook, {\n bookType: 'xlsx',\n compression: true,\n type: 'array',\n });\n this.downloadFile(\n new Blob([file], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n }),\n `${this.exportFileName(table.title, 'agent-results')}.xlsx`\n );\n }\n\n async exportVisualisationToPdf(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): Promise<void> {\n const canvas = visualisationElement.querySelector('canvas');\n if (!canvas || !canvas.width || !canvas.height) {\n throw new Error('The rendered chart is not available for export.');\n }\n\n const { jsPDF } = await import('jspdf');\n const orientation = canvas.width > canvas.height ? 'landscape' : 'portrait';\n const document = new jsPDF({ format: 'a4', orientation, unit: 'mm' });\n const pageWidth = document.internal.pageSize.getWidth();\n const pageHeight = document.internal.pageSize.getHeight();\n const margin = 16;\n const contentWidth = pageWidth - (margin * 2);\n const chartTop = 30;\n const availableHeight = pageHeight - chartTop - margin;\n const scale = Math.min(contentWidth / canvas.width, availableHeight / canvas.height);\n const imageWidth = canvas.width * scale;\n const imageHeight = canvas.height * scale;\n const imageX = (pageWidth - imageWidth) / 2;\n const { Chart } = await import('chart.js');\n const chart = Chart.getChart(canvas);\n let chartImage: string;\n\n if (chart) {\n const originalPixelRatio = chart.options.devicePixelRatio;\n // Render fresh chart pixels at 300 DPI; enlarging the screen bitmap blurs labels.\n const printPixelRatio = Math.ceil((imageWidth / 25.4 * 300) / chart.width);\n try {\n chart.options.devicePixelRatio = Math.max(originalPixelRatio ?? 1, printPixelRatio);\n chart.resize();\n chart.update('none');\n chartImage = canvas.toDataURL('image/png', 1);\n } finally {\n chart.options.devicePixelRatio = originalPixelRatio;\n chart.resize();\n chart.update('none');\n }\n } else {\n chartImage = canvas.toDataURL('image/png', 1);\n }\n\n document.setFont('helvetica', 'bold');\n document.setFontSize(16);\n document.text(visualisation.title, margin, 20, { maxWidth: contentWidth });\n document.addImage(\n chartImage,\n 'PNG',\n imageX,\n chartTop,\n imageWidth,\n imageHeight,\n undefined,\n 'FAST'\n );\n\n this.downloadFile(\n new Blob([document.output('arraybuffer')], { type: 'application/pdf' }),\n `${this.exportFileName(visualisation.title, 'agent-chart')}.pdf`\n );\n }\n\n private toExportCellValue(value: AssistantFieldValue | undefined): string | number | boolean {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.toExportCellValue(item)).join(', ');\n }\n\n if (typeof value === 'object') {\n const preferredValue = value['label'] ?? value['name'] ?? value['code'];\n return preferredValue === undefined\n ? JSON.stringify(value)\n : String(this.toExportCellValue(preferredValue));\n }\n\n return value;\n }\n\n private exportFileName(title: string | undefined, fallback: string): string {\n const normalised = (title || fallback)\n .trim()\n .toLocaleLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return normalised || fallback;\n }\n\n private downloadFile(file: Blob, fileName: string): void {\n const url = URL.createObjectURL(file);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantFeedbackUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = getDefaultAssistantFeedbackUrl();\n readonly method = 'POST' as const;\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n submitFeedback(\n feedback: AssistantFeedbackRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantFeedbackResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n return this.http.post<AssistantFeedbackResponse>(\n this.getFeedbackUrl(mergedConfig),\n feedback,\n { headers: this.getHeaders(mergedConfig) }\n );\n }\n\n private getFeedbackUrl(config: MaxAssistantConfig): string {\n const configuredChatUrl = config.assistantApiUrl?.trim();\n return configuredChatUrl\n ? configuredChatUrl.replace(/\\/chat\\/?$/, '/feedback')\n : getDefaultAssistantFeedbackUrl();\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n return headers;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { map, Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantSupportTag,\n AssistantSelectableEntity,\n AssistantSupportSeverity,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly ticketsEndpoint = '/ticket';\n readonly tagsEndpoint = '/selection/lookup/supportticket/tag';\n readonly severitiesEndpoint = '/selection/lookup/supportticket/severity';\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSelectableEntity[]>(\n this.getEndpoint(this.tagsEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n ).pipe(\n map(tags => tags.map(tag => ({\n ...tag,\n icon: 'pi pi-tag',\n severity: 'info' as const\n })))\n );\n }\n\n getSupportSeverities(): Observable<AssistantSupportSeverity[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSupportSeverity[]>(\n this.getEndpoint(this.severitiesEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n );\n }\n\n submitTicket(\n ticket: AssistantSupportTicketRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantSupportTicketResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n const response$ = this.http.post(\n this.getEndpoint(this.ticketsEndpoint, mergedConfig),\n {\n subject: ticket.subject,\n body: ticket.query,\n severity: ticket.severity,\n tags: ticket.tags.map(({ id, label }) => ({ id, label }))\n },\n {\n headers: this.getHeaders(mergedConfig),\n responseType: 'text'\n }\n );\n\n return response$.pipe(map(response => this.toTicketResponse(response)));\n }\n\n private toTicketResponse(_response: string): AssistantSupportTicketResponse {\n return {\n success: true,\n message: 'Your support ticket has been created. You will receive an email with your reference number shortly.',\n submittedAt: new Date().toISOString()\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private getEndpoint(path: string, config: MaxAssistantConfig): string {\n const baseUrl = config.apiBaseUrl?.trim();\n return baseUrl ? `${baseUrl.replace(/\\/$/, '')}${path}` : path;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n DoCheck,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n OnInit,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { ChartModule } from 'primeng/chart';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { SelectModule } from 'primeng/select';\nimport { TagModule } from 'primeng/tag';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap, takeUntil } from 'rxjs';\nimport { AssistantConversationState } from './assistant-conversation-state';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig,\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatActivity,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantSuggestionEntity,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantHelpGuide,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantResponseTablePagination,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportSeverity,\n AssistantSupportTag,\n AssistantSupportTicketResponse,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation,\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantFeedbackService } from './max-assistant-feedback.service';\nimport { MaxAssistantExportService } from './max-assistant-export.service';\nimport { MaxAssistantSupportService } from './max-assistant-support.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\nimport { MaxAgentEntityOptionComponent } from '../entity-option/max-agent-entity-option.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max AI',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n closeLabel: 'Close AI assistant',\n closeTooltip: 'Close AI assistant',\n feedbackLabel: 'Provide feedback on this response',\n feedbackTooltip: 'Provide feedback',\n placeholder: 'Ask Max AI',\n startingMessage: 'Preparing your answer…',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.',\n};\n\nconst ASSISTANT_SEARCH_RESULT_ICONS: Readonly<Record<string, string>> = {\n EMPLOYEE: 'pi pi-user',\n PERSON: 'pi pi-user',\n TEAM: 'pi pi-users',\n SCHEDULE: 'pi pi-calendar',\n LOCATION: 'pi pi-map-marker',\n POSITION: 'pi pi-briefcase',\n TIMESHEET: 'pi pi-clock',\n CONFIGTEAM: 'pi pi-cog',\n CONFIGLOCATION: 'pi pi-cog',\n DEFAULT: 'pi pi-search',\n};\n\nconst ASSISTANT_HELP_ICONS: Readonly<Record<AssistantHelpGuide['icon'], string>> = {\n action: 'pi pi-bolt',\n analytics: 'pi pi-chart-bar',\n budget: 'pi pi-wallet',\n calendar: 'pi pi-calendar-plus',\n document: 'pi pi-file',\n knowledge: 'pi pi-book',\n megaphone: 'pi pi-megaphone',\n people: 'pi pi-user',\n team: 'pi pi-users',\n 'time-off': 'pi pi-calendar-times',\n timesheet: 'pi pi-clock',\n workflow: 'pi pi-sitemap',\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n subject: string;\n query: string;\n severity: AssistantSupportSeverity | null;\n tags: AssistantSupportTag[];\n}\n\ninterface FeedbackFormValue {\n category: AssistantFeedbackCategory;\n query: string;\n assistantResponse: string;\n feedback: string;\n}\n\ninterface AssistantEntitySuggestionOption extends AssistantSuggestionOption {\n presentation: 'person_card' | 'entity_tag';\n entity: AssistantSuggestionEntity;\n}\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n ChartModule,\n MultiSelectModule,\n SelectModule,\n TagModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentEntityOptionComponent,\n MaxAgentShiftCardComponent,\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: ['./max-assistant.component.scss', './max-assistant.workspace.scss'],\n})\nexport class MaxAssistantComponent implements OnInit, DoCheck {\n private readonly sessionState = new AssistantConversationState();\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n private activeTurnAnchorMessageId?: string;\n\n private scrollToLatestTimer?: ReturnType<typeof setTimeout>;\n\n private readonly visualisationDataCache = new WeakMap<\n AssistantVisualisation,\n { labels: string[]; datasets: Array<Record<string, unknown>> }\n >();\n\n private readonly visualisationOptionsCache = new WeakMap<\n AssistantVisualisation,\n Record<string, unknown>\n >();\n\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n\n @Input() assistantApiUrl?: string;\n\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n\n @Input() developerDetailsEnabled = true;\n\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n\n @Output() closeRequested = new EventEmitter<void>();\n\n protected readonly isSending = signal(false);\n\n protected readonly input = signal('');\n\n protected readonly conversationId = signal<string | undefined>(undefined);\n\n protected readonly messages = signal<AssistantMessage[]>([]);\n\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly loadingTablePage = signal<string | undefined>(undefined);\n\n protected readonly tablePageErrors = signal<Readonly<Record<string, string>>>({});\n\n protected readonly feedbackVisible = signal(false);\n\n protected readonly feedbackSubmitting = signal(false);\n\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n\n protected readonly feedbackError = signal<string | undefined>(undefined);\n\n protected readonly feedbackCategoryOptions: Array<{\n label: string;\n value: AssistantFeedbackCategory;\n }> = [\n { label: 'Incorrect answer', value: 'incorrect' },\n { label: 'Incomplete answer', value: 'incomplete' },\n { label: 'Hard to understand', value: 'unclear' },\n { label: 'Unexpected behaviour', value: 'unexpected' },\n { label: 'Suggestion', value: 'suggestion' },\n { label: 'Other', value: 'other' }\n ];\n\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n\n protected readonly supportTicketVisible = signal(false);\n\n protected readonly supportTicketSubmitting = signal(false);\n\n protected readonly supportTagsLoading = signal(false);\n\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n\n protected readonly supportSeverities = signal<AssistantSupportSeverity[]>([]);\n\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n\n protected readonly supportTicketSubmissionFailed = signal(false);\n\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly exportService: MaxAssistantExportService,\n private readonly feedbackService: MaxAssistantFeedbackService,\n private readonly supportService: MaxAssistantSupportService,\n private readonly destroyRef: DestroyRef,\n @Inject(MAX_ASSISTANT_CONFIG) private readonly defaultConfig: MaxAssistantConfig\n ) {}\n\n ngOnInit(): void {\n this.messages.set(this.createDefaultMessages());\n this.destroyRef.onDestroy(() => {\n this.sessionState.reset();\n this.sessionState.resetRequests.complete();\n clearTimeout(this.scrollToLatestTimer);\n });\n }\n\n ngDoCheck(): void {\n const configuredUser = typeof this.defaultConfig.user === 'function' ? this.defaultConfig.user() : this.defaultConfig.user;\n const localUser = typeof this.user === 'function' ? this.user() : this.user;\n const user = { ...configuredUser, ...localUser };\n const contextSource = this.context ?? this.defaultConfig.context;\n const context = typeof contextSource === 'function' ? contextSource() : contextSource;\n if (this.sessionState.changedIdentity(JSON.stringify([this.app ?? this.defaultConfig.app,\n user.token, user.version, user.username, user.email, context?.tenantId, context?.organisationId, context?.userId]))) {\n this.clearChatSession();\n }\n }\n\n resetSession(): void { this.clearChatSession(); }\n\n // Also clears memory if the browser keeps this document in its back/forward cache.\n @HostListener('window:pagehide')\n protected onPageHide(): void { this.clearChatSession(); }\n\n focusComposer(): void {\n this.composerInput?.nativeElement.focus();\n }\n\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\n return ASSISTANT_UI_COPY;\n }\n\n protected get bootstrapConfig(): AssistantBootstrapConfig {\n return getAssistantBootstrapConfig(this.app);\n }\n\n protected isWelcomeMessage(message: AssistantMessage): boolean {\n return (\n this.messages()[0]?.id === message.id &&\n message.role === 'assistant' &&\n !message.displayResponse &&\n !message.isStreaming\n );\n }\n\n protected isWelcomeState(message: AssistantMessage): boolean {\n return this.messages().length === 1 && this.isWelcomeMessage(message);\n }\n\n @HostListener('document:keydown.escape')\n protected onDocumentEscape() {\n if (this.feedbackVisible()) {\n this.closeFeedback();\n return;\n }\n\n if (this.supportTicketVisible()) {\n this.closeSupportTicket();\n return;\n }\n\n if (this.expandedDetailMessageIds().size) {\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n }\n }\n\n protected clearChatSession() {\n this.sessionState.reset();\n this.closeFeedback(false);\n this.closeSupportTicket(false);\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n this.loadingTablePage.set(undefined);\n this.tablePageErrors.set({});\n this.activeTurnAnchorMessageId = undefined;\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory(trimmedMessage);\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const initialProgress: AssistantChatProgress = {\n type: 'progress',\n stage: 'request',\n message: this.uiCopy.startingMessage,\n };\n const streamingMessage: AssistantMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true,\n processingUpdates: [initialProgress],\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n activity => this.updateStreamingMessage(streamingMessage.id, activity)\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n const preview = this.messages().find(message => message.id === streamingMessage.id);\n if (preview?.displayResponse || preview?.cards?.length) {\n this.replaceMessage(streamingMessage.id, {\n ...preview,\n content: 'The data was retrieved, but the explanation could not be completed.',\n streamingContent: undefined,\n });\n this.isSending.set(false);\n return;\n }\n this.replaceMessage(streamingMessage.id, {\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected isListMetric(metric: { label: string; value: string; list?: boolean }): boolean {\n if (metric.list) {\n return true;\n }\n return /\\b(?:teams?|roles?)\\b/iu.test(metric.label) &&\n metric.value.split(/,|;|\\n/u).filter((value) => value.trim()).length > 1;\n }\n\n protected hasCapabilitySuggestions(\n suggestions: AssistantSuggestion[] = []\n ): boolean {\n return suggestions.some(\n suggestion =>\n typeof suggestion !== 'string' &&\n suggestion.presentation === 'capability_card'\n );\n }\n\n protected capabilitySuggestionGroups(\n suggestions: AssistantSuggestion[] = []\n ): Array<{ section: string; options: AssistantSuggestionOption[] }> {\n const groups = new Map<string, AssistantSuggestionOption[]>();\n for (const suggestion of suggestions) {\n if (\n typeof suggestion === 'string' ||\n suggestion.presentation !== 'capability_card'\n ) {\n continue;\n }\n const section = suggestion.section?.trim() || 'More';\n groups.set(section, [...(groups.get(section) ?? []), suggestion]);\n }\n return [...groups.entries()].map(([section, options]) => ({\n section,\n options\n }));\n }\n\n protected hasOptionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): boolean {\n return suggestions.some(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected optionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): AssistantSuggestion[] {\n return suggestions.filter(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected hasEntitySuggestions(suggestions: AssistantSuggestion[] = []): boolean {\n return suggestions.some(\n (suggestion) =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected entitySuggestionOptions(\n suggestions: AssistantSuggestion[] = [],\n ): AssistantEntitySuggestionOption[] {\n return suggestions.filter(\n (suggestion): suggestion is AssistantEntitySuggestionOption =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected useSuggestion(suggestion: AssistantSuggestion) {\n if (typeof suggestion === 'string' || !suggestion.structuredAction) {\n this.sendMessage(\n typeof suggestion === 'string' ? suggestion : suggestion.message\n );\n return;\n }\n\n const label = suggestion.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n suggestion.message,\n suggestion.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, suggestion.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected performHostAction(action: AssistantHostAction) {\n this.hostAction.emit(action);\n }\n\n protected requestClose(): void {\n this.closeRequested.emit();\n }\n\n protected hasConversationStarted(): boolean {\n return this.messages().some(message => message.role === 'user');\n }\n\n protected openSupportTicket(): void {\n this.closeFeedback(false);\n const user = this.getConfiguredUser();\n this.supportTicketForm = this.createSupportTicketForm(user);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n this.supportTags.set([]);\n this.supportSeverities.set([]);\n this.supportTagsLoading.set(true);\n this.supportTicketVisible.set(true);\n\n this.supportService\n .getSupportTags()\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: tags => {\n this.supportTags.set(tags);\n this.supportTagsLoading.set(false);\n },\n error: () => {\n this.supportTagsLoading.set(false);\n this.supportTicketError.set('Support tags could not be loaded. You can still submit the ticket.');\n }\n });\n\n this.supportService\n .getSupportSeverities()\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: severities => this.supportSeverities.set(severities),\n error: () => this.supportTicketError.set(\n 'Severity options could not be loaded. Please try again.'\n )\n });\n\n setTimeout(() => this.supportQueryInput?.nativeElement.focus());\n }\n\n protected closeSupportTicket(restoreComposerFocus = true): void {\n this.supportTicketVisible.set(false);\n this.supportTicketSubmitting.set(false);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitSupportTicket(): boolean {\n return Boolean(\n this.supportTicketForm.name.trim() &&\n this.supportTicketForm.email.trim() &&\n this.supportTicketForm.subject.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected supportSeverityColor(color: string): string {\n const value = color?.trim() ?? '';\n return value ? (value.startsWith('#') ? value : `#${value}`) : 'var(--max-accent)';\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n const severity = this.supportTicketForm.severity;\n if (!severity) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n this.supportService\n .submitTicket({\n name: this.supportTicketForm.name.trim(),\n email: this.supportTicketForm.email.trim(),\n ...(this.supportTicketForm.phone.trim()\n ? { phone: this.supportTicketForm.phone.trim() }\n : {}),\n subject: this.supportTicketForm.subject.trim(),\n query: this.supportTicketForm.query.trim(),\n severity,\n tags: this.supportTicketForm.tags.map(({ id, label }) => ({ id, label })),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n }, this.getAssistantConfig(false))\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.supportTicketResult.set(result);\n this.supportTicketSubmitting.set(false);\n },\n error: () => {\n this.supportTicketSubmitting.set(false);\n this.supportTicketSubmissionFailed.set(true);\n this.supportTicketError.set(\n 'Your ticket could not be created. Please try again shortly.'\n );\n }\n });\n }\n\n protected openFeedback(responseMessage: AssistantMessage): void {\n this.closeSupportTicket(false);\n this.feedbackForm = this.createFeedbackForm(responseMessage);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n this.feedbackVisible.set(true);\n setTimeout(() => this.feedbackInput?.nativeElement.focus());\n }\n\n protected closeFeedback(restoreComposerFocus = true): void {\n this.feedbackVisible.set(false);\n this.feedbackSubmitting.set(false);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitFeedback(): boolean {\n return Boolean(\n this.feedbackForm.category &&\n this.feedbackForm.query.trim() &&\n this.feedbackForm.feedback.trim() &&\n !this.feedbackSubmitting()\n );\n }\n\n protected submitFeedback(): void {\n if (!this.canSubmitFeedback()) {\n return;\n }\n\n this.feedbackSubmitting.set(true);\n this.feedbackError.set(undefined);\n this.feedbackService\n .submitFeedback({\n category: this.feedbackForm.category,\n query: this.feedbackForm.query.trim(),\n ...(this.feedbackForm.assistantResponse.trim()\n ? { assistantResponse: this.feedbackForm.assistantResponse.trim() }\n : {}),\n feedback: this.feedbackForm.feedback.trim(),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys',\n ...(this.conversationId() ? { conversationId: this.conversationId() } : {})\n }, this.getAssistantConfig(false))\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.feedbackResult.set(result);\n this.feedbackSubmitting.set(false);\n },\n error: () => {\n this.feedbackSubmitting.set(false);\n this.feedbackError.set(\n 'Your feedback could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected searchResultIcon(type: string): string {\n return ASSISTANT_SEARCH_RESULT_ICONS[type.trim().toUpperCase()]\n ?? ASSISTANT_SEARCH_RESULT_ICONS['DEFAULT'];\n }\n\n protected searchActionIcon(action: AssistantSearchResult['actions'][number]): string {\n const linkType = action.hostAction.payload['linkType'];\n return this.searchResultIcon(typeof linkType === 'string' ? linkType : action.label);\n }\n\n protected helpIcon(icon: AssistantHelpGuide['icon']): string {\n return ASSISTANT_HELP_ICONS[icon];\n }\n\n protected helpGuideLabel(kind: AssistantHelpGuide['kind']): string {\n switch (kind) {\n case 'knowledge':\n case 'information':\n return 'Maxtime Knowledge Guide';\n case 'analytics':\n return 'Maxtime Analytics';\n case 'action':\n return 'Maxtime Action';\n default:\n return 'Maxtime Help Guide';\n }\n }\n\n protected isContentGuide(kind: AssistantHelpGuide['kind']): boolean {\n return kind === 'knowledge'\n || kind === 'information'\n || kind === 'analytics'\n || kind === 'action';\n }\n\n protected helpGuideMarkdownVariant(\n kind: AssistantHelpGuide['kind']\n ): 'default' | 'information' {\n return this.isContentGuide(kind) ? 'information' : 'default';\n }\n\n protected getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntil(this.sessionState.resetRequests),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected retrieveNextTablePage(\n message: AssistantMessage,\n table: AssistantResponseTable,\n tableIndex: number\n ): void {\n const pagination = table.pagination;\n if (!pagination || !this.hasNextTablePage(table) || this.isSending()) {\n return;\n }\n const nextOffset = table.rows.length;\n if (nextOffset % pagination.pageSize !== 0) {\n return;\n }\n const tableKey = this.tablePageKey(message.id, tableIndex);\n const history = this.getConversationHistory();\n this.tablePageErrors.update(errors => {\n const next = { ...errors };\n delete next[tableKey];\n return next;\n });\n this.loadingTablePage.set(tableKey);\n this.isSending.set(true);\n\n this.assistantService\n .retrieveAnalyticsPage(\n pagination.query,\n { offset: nextOffset, pageSize: 100 },\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n // Paging an older table must not replace the active conversational topic.\n this.mergeTablePage(message.id, tableIndex, response, pagination.query);\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n },\n error: error => {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: this.resolveErrorMessage(error)\n }));\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n }\n });\n }\n\n protected tablePageStatus(table: AssistantResponseTable): string {\n const pagination = table.pagination;\n if (!pagination) {\n return '';\n }\n const retrieved = table.rows.length;\n return pagination.totalRecordsExact === false\n ? `${retrieved.toLocaleString()} ${retrieved === 1 ? 'record' : 'records'} retrieved`\n : `${Math.min(retrieved, pagination.totalRecords).toLocaleString()} of ${pagination.totalRecords.toLocaleString()} records retrieved`;\n }\n\n protected hasNextTablePage(table: AssistantResponseTable): boolean {\n const pagination = table.pagination;\n if (!pagination || pagination.nextOffset === undefined) {\n return false;\n }\n if (pagination.hasMore !== undefined) {\n return pagination.hasMore;\n }\n return Boolean(\n pagination.remainingRecords > 0 &&\n table.rows.length < pagination.totalRecords\n );\n }\n\n protected nextTablePageLabel(pagination: AssistantResponseTablePagination): string {\n const recordCount = pagination.totalRecordsExact === false\n ? pagination.pageSize\n : Math.min(pagination.pageSize, pagination.remainingRecords);\n return `Retrieve next ${recordCount.toLocaleString()} ${recordCount === 1 ? 'record' : 'records'}`;\n }\n\n protected isTablePageLoading(messageId: string, tableIndex: number): boolean {\n return this.loadingTablePage() === this.tablePageKey(messageId, tableIndex);\n }\n\n protected tablePageError(messageId: string, tableIndex: number): string | undefined {\n return this.tablePageErrors()[this.tablePageKey(messageId, tableIndex)];\n }\n\n protected exportTable(table: AssistantResponseTable): void {\n void this.exportService.exportTableToExcel(table);\n }\n\n protected exportVisualisation(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): void {\n void this.exportService.exportVisualisationToPdf(visualisation, visualisationElement);\n }\n\n protected chartType(\n visualisation: AssistantVisualisation\n ): 'bar' | 'line' | 'doughnut' | 'pie' | 'radar' | 'polarArea' {\n switch (visualisation.type) {\n case 'doughnut':\n case 'pie':\n case 'polarArea':\n case 'radar':\n case 'line':\n case 'lineStyles':\n return visualisation.type === 'lineStyles' ? 'line' : visualisation.type;\n default:\n return 'bar';\n }\n }\n\n protected chartData(\n visualisation: AssistantVisualisation\n ): { labels: string[]; datasets: Array<Record<string, unknown>> } {\n const cached = this.visualisationDataCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const sourceDatasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{\n label: visualisation.valueLabel || 'Value',\n values: visualisation.values,\n colors: visualisation.colors,\n }];\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie' || chartType === 'polarArea';\n const data = {\n labels: visualisation.labels,\n datasets: sourceDatasets.map((dataset, index) => {\n const colour = dataset.color || this.chartColour(visualisation, index);\n const categoryColours = dataset.colors?.length\n ? dataset.colors\n : visualisation.colors?.length\n ? visualisation.colors\n : visualisation.labels.map((_label, labelIndex) =>\n this.chartColour(visualisation, labelIndex)\n );\n const datasetType = dataset.type || (\n visualisation.type === 'barLine'\n ? index === 0 ? 'bar' : 'line'\n : undefined\n );\n const isLineDataset = datasetType === 'line' || chartType === 'line' || chartType === 'radar';\n return {\n label: dataset.label,\n data: dataset.values.map(value => Number(value) || 0),\n ...(datasetType ? { type: datasetType } : {}),\n backgroundColor: isArcChart || (!isLineDataset && sourceDatasets.length === 1)\n ? categoryColours\n : this.colourWithOpacity(colour, isLineDataset ? 0.14 : 0.78),\n borderColor: isArcChart ? '#ffffff' : colour,\n borderWidth: isLineDataset ? 2 : isArcChart ? 2 : 1,\n borderRadius: isLineDataset || isArcChart ? 0 : 6,\n borderDash: dataset.borderDash || [],\n fill: dataset.fill ?? false,\n tension: isLineDataset ? 0.32 : 0,\n pointStyle: ['circle', 'rectRot', 'triangle', 'rectRounded'][index % 4],\n pointRadius: isLineDataset ? 3 : 0,\n pointHoverRadius: isLineDataset ? 5 : 0,\n ...(visualisation.type === 'stackedBar' ? { stack: 'combined' } : {}),\n };\n }),\n };\n this.visualisationDataCache.set(visualisation, data);\n return data;\n }\n\n protected chartOptions(visualisation: AssistantVisualisation): Record<string, unknown> {\n const cached = this.visualisationOptionsCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie';\n const isRadialChart = chartType === 'polarArea' || chartType === 'radar';\n const isHorizontal = visualisation.type === 'horizontalBar';\n const isStacked = visualisation.type === 'stackedBar';\n const axis = (title: string | undefined, stacked = false, beginAtZero = false) => ({\n stacked,\n beginAtZero,\n border: { display: false },\n grid: { color: '#e5e7eb', drawTicks: false },\n ticks: { color: '#64748b', padding: 8, font: { size: 10 } },\n title: {\n display: Boolean(title),\n text: title,\n color: '#475569',\n font: { size: 11, weight: 500 },\n },\n });\n const options: Record<string, unknown> = {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500 },\n interaction: { intersect: false, mode: 'index' },\n plugins: {\n legend: {\n display: this.shouldShowChartLegend(visualisation),\n position: 'bottom',\n labels: {\n color: '#475569',\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n font: { size: 10 },\n },\n },\n tooltip: {\n enabled: true,\n padding: 10,\n usePointStyle: true,\n },\n },\n ...(isArcChart\n ? { cutout: chartType === 'doughnut' ? '58%' : 0 }\n : isRadialChart\n ? {\n scales: {\n r: {\n beginAtZero: true,\n grid: { color: '#e5e7eb' },\n angleLines: { color: '#e5e7eb' },\n ticks: { color: '#64748b', backdropColor: 'transparent', font: { size: 9 } },\n pointLabels: { color: '#475569', font: { size: 10 } },\n },\n },\n }\n : {\n indexAxis: isHorizontal ? 'y' : 'x',\n scales: {\n x: axis(\n isHorizontal ? visualisation.yAxisLabel : visualisation.xAxisLabel,\n isStacked,\n isHorizontal\n ),\n y: axis(\n isHorizontal ? visualisation.xAxisLabel : visualisation.yAxisLabel,\n isStacked,\n !isHorizontal\n ),\n },\n }),\n };\n this.visualisationOptionsCache.set(visualisation, options);\n return options;\n }\n\n protected chartHeight(visualisation: AssistantVisualisation): number {\n return visualisation.type === 'horizontalBar'\n ? Math.max(300, Math.min(620, visualisation.labels.length * 34 + 90))\n : 340;\n }\n\n private shouldShowChartLegend(visualisation: AssistantVisualisation): boolean {\n if (['doughnut', 'pie', 'polarArea'].includes(visualisation.type)) {\n return true;\n }\n\n return (visualisation.datasets?.length ?? 1) > 1;\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const datasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{ label: visualisation.valueLabel || 'Value', values: visualisation.values }];\n const values = datasets.flatMap(dataset =>\n visualisation.labels.map(\n (label, index) => `${dataset.label}, ${label}: ${Number(dataset.values[index]) || 0}`\n )\n );\n return `${visualisation.title} chart. ${values.join(', ')}.`;\n }\n\n private chartColour(visualisation: AssistantVisualisation, index: number): string {\n const fallback = [\n '#3B82F6', '#EC4899', '#10B981', '#F59E0B', '#8B5CF6', '#06B6D4',\n '#EF4444', '#84CC16', '#F97316', '#6366F1', '#14B8A6', '#D946EF',\n ];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n private colourWithOpacity(colour: string, opacity: number): string {\n const match = /^#([0-9a-f]{6})$/iu.exec(colour.trim());\n if (!match) {\n return colour;\n }\n const value = Number.parseInt(match[1]!, 16);\n return `rgba(${(value >> 16) & 255}, ${(value >> 8) & 255}, ${value & 255}, ${opacity})`;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\n }\n\n private getAssistantConfig(includeConversation = true): MaxAssistantConfig {\n const config: MaxAssistantConfig = includeConversation\n ? { conversationStateVersion: 1, ...(this.sessionState.token ? { conversationState: this.sessionState.token } : {}) }\n : {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n if (message.role === 'user') {\n this.activeTurnAnchorMessageId = message.id;\n }\n this.messages.update(messages => [...messages, message]);\n if (this.activeTurnAnchorMessageId) {\n this.scrollToMessage(this.activeTurnAnchorMessageId);\n } else {\n this.scrollToLatest();\n }\n }\n\n private updateStreamingMessage(messageId: string, activity: AssistantChatActivity) {\n let messageUpdated = false;\n this.messages.update(messages =>\n messages.map(message => {\n if (message.id !== messageId || !message.isStreaming) {\n return message;\n }\n\n if (activity.type === 'delta') {\n if (!activity.delta) {\n return message;\n }\n messageUpdated = true;\n return {\n ...message,\n streamingContent: `${message.streamingContent ?? ''}${activity.delta}`,\n ...(message.displayResponse || message.cards?.length\n ? { content: `${message.streamingContent ?? ''}${activity.delta}` }\n : {}),\n };\n }\n\n if (activity.type === 'data') {\n messageUpdated = true;\n return {\n ...message,\n ...activity.data,\n displayResponse: activity.data.displayResponse ?? {},\n content: message.streamingContent ?? '',\n processingUpdates: [],\n };\n }\n\n if (message.displayResponse || message.cards?.length) {\n return message;\n }\n\n const progressMessage = activity.message.trim();\n if (!progressMessage) {\n return message;\n }\n const processingUpdates = message.processingUpdates ?? [];\n const latestUpdate = processingUpdates.at(-1);\n if (\n latestUpdate?.stage === activity.stage &&\n latestUpdate.message === progressMessage\n ) {\n return message;\n }\n\n messageUpdated = true;\n return {\n ...message,\n content: progressMessage,\n processingUpdates: [\n { ...activity, message: progressMessage },\n ],\n };\n })\n );\n if (messageUpdated) {\n this.scrollToLatest();\n }\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\n }\n\n private mergeTablePage(\n messageId: string,\n tableIndex: number,\n response: AssistantChatResponse,\n userQuery: string\n ): void {\n const nextDisplay = this.createDisplayResponse(response, userQuery);\n const nextTable = this.getResponseGrid(nextDisplay)[0];\n const tableKey = this.tablePageKey(messageId, tableIndex);\n this.messages.update(messages => messages.map(message => {\n if (message.id !== messageId) {\n return message;\n }\n const developerTrace = this.mergeDeveloperTraces(\n message.developerTrace,\n response.developerTrace\n );\n if (!nextTable || !message.displayResponse) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: response.answer\n }));\n return { ...message, developerTrace };\n }\n const tables = [...this.getResponseGrid(message.displayResponse)];\n const currentTable = tables[tableIndex];\n if (!currentTable) {\n return { ...message, developerTrace };\n }\n const rowOffset = currentTable.rows.length;\n if (\n nextTable.pagination &&\n nextTable.pagination.offset !== rowOffset\n ) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: 'The next records could not be retrieved in sequence. Please try the query again.'\n }));\n return { ...message, developerTrace };\n }\n const nextPagination = nextTable.pagination;\n const totalRecords = nextPagination?.totalRecords ?? rowOffset + nextTable.rows.length;\n const totalRecordsExact = nextPagination?.totalRecordsExact !== false;\n const combinedRows = [...currentTable.rows, ...nextTable.rows];\n const rows = totalRecordsExact\n ? combinedRows.slice(0, totalRecords)\n : combinedRows;\n const hasMore = nextPagination?.hasMore ??\n ((nextPagination?.remainingRecords ?? 0) > 0);\n const remainingRecords = totalRecordsExact\n ? Math.max(totalRecords - rows.length, 0)\n : (nextPagination?.remainingRecords ?? 0);\n const pagination = nextTable.pagination\n ? {\n query: nextTable.pagination.query,\n offset: 0,\n pageSize: nextTable.pagination.pageSize,\n totalRecords,\n totalRecordsExact,\n returnedRecords: rows.length,\n remainingRecords,\n hasMore,\n ...(hasMore ? { nextOffset: rows.length } : {})\n }\n : currentTable.pagination;\n tables[tableIndex] = {\n ...currentTable,\n rows,\n ...(nextTable.actions?.length\n ? {\n actions: [\n ...(currentTable.actions ?? []),\n ...nextTable.actions.map(action => ({\n ...action,\n rowIndex: action.rowIndex + rowOffset\n }))\n ]\n }\n : {}),\n ...(pagination ? { pagination } : {})\n };\n return {\n ...message,\n displayResponse: {\n ...message.displayResponse,\n grid: tables,\n tables\n },\n developerTrace\n };\n }));\n this.scrollToLatest();\n }\n\n private mergeDeveloperTraces(\n current?: AssistantDeveloperTrace,\n next?: AssistantDeveloperTrace\n ): AssistantDeveloperTrace | undefined {\n if (!current) {\n return next;\n }\n if (!next) {\n return current;\n }\n const lastId = Math.max(0, ...current.steps.map(step => step.id));\n const steps = [\n ...current.steps,\n ...next.steps.map((step, index) => ({ ...step, id: lastId + index + 1 }))\n ];\n if (!current.run || !next.run) {\n return { ...(next.run ?? current.run ? { run: next.run ?? current.run } : {}), steps };\n }\n return {\n run: {\n ...current.run,\n completedAt: next.run.completedAt,\n durationMs: current.run.durationMs + next.run.durationMs,\n llmCalls: current.run.llmCalls + next.run.llmCalls,\n embeddingCalls: current.run.embeddingCalls + next.run.embeddingCalls,\n apiCalls: current.run.apiCalls + next.run.apiCalls\n },\n steps\n };\n }\n\n private tablePageKey(messageId: string, tableIndex: number): string {\n return `${messageId}:${tableIndex}`;\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const user = this.getConfiguredUser();\n const preferredName = [\n user?.['firstName'],\n user?.['firstname'],\n user?.['displayName'],\n user?.['name'],\n user?.['username']\n ].find(value => typeof value === 'string' && value.trim());\n\n if (typeof preferredName !== 'string') {\n return initialMessage;\n }\n\n const firstName = preferredName\n .trim()\n .split(/\\s|@/)[0];\n\n if (!firstName) {\n return initialMessage;\n }\n\n if (initialMessage.startsWith('Hi!')) {\n return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);\n }\n\n return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);\n }\n\n private getConfiguredUser(): Partial<AssistantUser> | undefined {\n const configuredUser = this.user ?? this.defaultConfig.user;\n return typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\n }\n\n private createSupportTicketForm(\n user?: Partial<AssistantUser>\n ): SupportTicketFormValue {\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n subject: '',\n query: '',\n severity: null,\n tags: []\n };\n }\n\n private createFeedbackForm(responseMessage?: AssistantMessage): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\n category: 'suggestion',\n query: conversation.query,\n assistantResponse: conversation.assistantResponse,\n feedback: ''\n };\n }\n\n private getConversationPair(responseMessage: AssistantMessage): {\n query: string;\n assistantResponse: string;\n } {\n const messages = this.messages();\n const responseIndex = messages.findIndex(message => message.id === responseMessage.id);\n let precedingUserIndex = -1;\n for (let index = responseIndex - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === 'user') {\n precedingUserIndex = index;\n break;\n }\n }\n\n return {\n query: messages[precedingUserIndex]?.content ?? '',\n assistantResponse: responseMessage.content\n };\n }\n\n private getUserText(\n user: Partial<AssistantUser> | undefined,\n keys: string[]\n ): string {\n const value = keys\n .map(key => user?.[key])\n .find(field => typeof field === 'string' && field.trim());\n return typeof value === 'string' ? value.trim() : '';\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app ?? response.product,\n response.productLabel,\n response.apiModule ?? response.contextResolution?.moduleKey,\n response.confidence ?? response.contextResolution?.confidence,\n response.parameters ?? response.entities,\n response.apiCalls ?? this.getToolApiCalls(response),\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse,\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: AssistantSuggestion[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n apiResult?: AssistantFieldMap,\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse,\n status?: AssistantChatResponse['status'],\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n apiResult,\n mockResult,\n llmUsed,\n availableModules,\n status,\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n const grid = this.getDisplayTables(provided, response);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? response.apiResult,\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\n grid,\n tables: grid,\n helpGuide: this.typedHelpGuide(provided.helpGuide),\n searchResults: provided.searchResults,\n visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\n markdown: provided.markdown\n };\n }\n\n private typedHelpGuide(\n guide: AssistantHelpGuide | undefined\n ): AssistantHelpGuide | undefined {\n return guide?.kind === 'analytics' || guide?.kind === 'action'\n ? undefined\n : guide;\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\n }];\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(question = ''): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return this.sessionState.history(messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .map(message => ({\n role: message.role,\n content: message.content,\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n })), question);\n }\n\n private scrollToLatest() {\n if (this.scrollToLatestTimer) {\n clearTimeout(this.scrollToLatestTimer);\n }\n this.scrollToLatestTimer = setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n this.scrollToLatestTimer = undefined;\n });\n }\n\n private scrollToMessage(messageId: string) {\n setTimeout(() => {\n const viewport = this.messagesViewport?.nativeElement;\n const message = viewport?.querySelector<HTMLElement>(\n `[data-message-id=\"${messageId}\"]`\n );\n if (!viewport || !message) {\n return;\n }\n const viewportTop = viewport.getBoundingClientRect().top;\n const messageTop = message.getBoundingClientRect().top;\n const paddingTop = Number.parseFloat(getComputedStyle(viewport).paddingTop) || 0;\n viewport.scrollTop = Math.max(\n 0,\n viewport.scrollTop + messageTop - viewportTop - paddingTop\n );\n });\n }\n}\n","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <img\n class=\"max-assistant-sparkles\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n aria-hidden=\"true\"\n >\n <div class=\"assistant-identity\">\n <div class=\"assistant-name-row\">\n <h2 class=\"assistant-name\">\n <img\n class=\"assistant-wordmark\"\n src=\"assets/max/max-ai-wordmark-styled-gradient.png\"\n [alt]=\"uiCopy.title\"\n >\n </h2>\n <span class=\"assistant-beta-tag\">Beta</span>\n </div>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n >\n <i class=\"header-action-icon pi pi-refresh\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n [pTooltip]=\"uiCopy.closeTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"requestClose()\"\n >\n <i class=\"header-action-icon pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [attr.data-message-id]=\"message.id\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming && !message.displayResponse && !message.cards?.length) {\n <div class=\"assistant-processing\" aria-label=\"Max AI activity\">\n @if(!message.streamingContent) {\n <p class=\"assistant-processing-update active\">\n <span class=\"assistant-processing-sparkles\" aria-hidden=\"true\">\n @for (star of ['main', 'upper', 'lower', 'small']; track star) {\n <img\n class=\"assistant-processing-star {{ star }}\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n >\n }\n </span>\n <span>{{ message.content }}</span>\n </p>\n }\n @if(message.streamingContent) {\n <div class=\"assistant-streaming-answer assistant-markdown\">\n <span class=\"assistant-streaming-answer-text\">{{ message.streamingContent }}</span>\n <span class=\"assistant-streaming-cursor\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n } @else if(message.displayResponse; as responseDetails) {\n @if(responseDetails.helpGuide; as guide) {\n <section\n class=\"assistant-help-guide\"\n [class.assistant-information-guide]=\"isContentGuide(guide.kind)\"\n [class.assistant-continuation-guide]=\"guide.continuation\"\n [attr.aria-label]=\"helpGuideLabel(guide.kind)\"\n >\n @if(!guide.continuation) {\n <header class=\"assistant-help-heading\">\n <span class=\"assistant-help-topic-icon\" aria-hidden=\"true\">\n <i [class]=\"helpIcon(guide.icon)\"></i>\n </span>\n <div>\n <span class=\"assistant-help-eyebrow\">\n {{ helpGuideLabel(guide.kind) }}\n </span>\n <h3>{{ guide.title }}</h3>\n </div>\n </header>\n }\n\n @if(guide.summary) {\n <p class=\"assistant-help-summary\">{{ guide.summary }}</p>\n }\n\n @if(guide.content) {\n <div\n class=\"assistant-help-content assistant-information-content assistant-markdown\"\n [innerHTML]=\"guide.content | maxAssistantMarkdown: helpGuideMarkdownVariant(guide.kind)\"\n ></div>\n }\n\n @if(guide.steps.length) {\n <section class=\"assistant-help-section assistant-help-steps\">\n <h4>Steps to follow</h4>\n <ol>\n @for(step of guide.steps; track $index) {\n <li>{{ step }}</li>\n }\n </ol>\n </section>\n }\n\n @if(guide.tips?.length) {\n <aside class=\"assistant-help-callout assistant-help-tips\">\n <i class=\"pi pi-lightbulb\" aria-hidden=\"true\"></i>\n <div>\n <h4>Good to know</h4>\n <ul>\n @for(tip of guide.tips ?? []; track $index) {\n <li>{{ tip }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.restrictions?.length) {\n <aside class=\"assistant-help-callout assistant-help-restrictions\">\n <i class=\"pi pi-info-circle\" aria-hidden=\"true\"></i>\n <div>\n <h4>Keep in mind</h4>\n <ul>\n @for(restriction of guide.restrictions ?? []; track $index) {\n <li>{{ restriction }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.accessNote) {\n <p class=\"assistant-help-access\">\n <i class=\"pi pi-lock\" aria-hidden=\"true\"></i>\n <span>{{ guide.accessNote }}</span>\n </p>\n }\n\n @if(guide.navigation; as navigation) {\n <div class=\"assistant-help-navigation-row\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n class=\"assistant-help-navigation\"\n [label]=\"navigation.label\"\n [icon]=\"helpIcon(guide.icon)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(navigation.hostAction)\"\n ></button>\n </div>\n }\n </section>\n } @else if(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n }\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <span class=\"assistant-card-title\">{{ card.title }}</span>\n @if(card.subtitle) {\n <span class=\"assistant-card-subtitle\">{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [class.assistant-card-metric-wide]=\"isListMetric(metric)\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span class=\"assistant-card-label\">{{ metric.label }}</span>\n <span class=\"assistant-card-value\">{{ metric.value }}</span>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(responseDetails.searchResults?.length) {\n <div class=\"assistant-cards assistant-search-results\" aria-label=\"Search results\">\n @for(result of responseDetails.searchResults ?? []; track $index) {\n <section class=\"assistant-card assistant-search-result\">\n <header>\n <i\n class=\"assistant-search-result-icon\"\n [class]=\"searchResultIcon(result.type)\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"assistant-search-result-copy\">\n <strong>{{ result.title }}</strong>\n <span>{{ result.type }}</span>\n </div>\n </header>\n <div class=\"suggestions\" aria-label=\"Available destinations\">\n @for(action of result.actions; track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"action.label\"\n [icon]=\"searchActionIcon(action)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(action.hostAction)\"\n ></button>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <header class=\"assistant-export-heading\">\n <h3>{{ visualisation.title }}</h3>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-pdf\"\n icon=\"pi pi-file-pdf\"\n [attr.aria-label]=\"'Export ' + visualisation.title + ' as PDF'\"\n (click)=\"exportVisualisation(visualisation, chartCanvas)\"\n ></button>\n </header>\n <div\n #chartCanvas\n class=\"assistant-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n [style.height.px]=\"chartHeight(visualisation)\"\n >\n <p-chart\n class=\"assistant-prime-chart\"\n [type]=\"chartType(visualisation)\"\n [data]=\"chartData(visualisation)\"\n [options]=\"chartOptions(visualisation)\"\n ></p-chart>\n </div>\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index; let tableIndex = $index) {\n <section class=\"assistant-table-section\">\n <header class=\"assistant-export-heading\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-excel\"\n icon=\"pi pi-file-excel\"\n [attr.aria-label]=\"'Export ' + (table.title || 'results') + ' to Excel'\"\n (click)=\"exportTable(table)\"\n ></button>\n </header>\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @if(table.pagination) {\n <th>SL. No</th>\n }\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @if(table.pagination) {\n <td>{{ rowIndex + 1 }}</td>\n }\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if(table.pagination; as pagination) {\n <footer class=\"assistant-table-pagination\">\n <span>{{ tablePageStatus(table) }}</span>\n @if(hasNextTablePage(table)) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-table-page-action\"\n icon=\"pi pi-arrow-down\"\n [label]=\"nextTablePageLabel(pagination)\"\n [loading]=\"isTablePageLoading(message.id, tableIndex)\"\n [disabled]=\"isSending()\"\n (click)=\"retrieveNextTablePage(message, table, tableIndex)\"\n ></button>\n }\n </footer>\n @if(tablePageError(message.id, tableIndex); as pageError) {\n <p class=\"assistant-table-page-error\" role=\"alert\">{{ pageError }}</p>\n }\n }\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n @if(traceField(step.input, 'sql'); as sql) {\n <div class=\"trace-tool-call trace-sql-query\">\n <span>SQL sent to MySQL MCP</span>\n <strong>{{ formatTraceScalar(traceField(step.input, 'toolName')) }}</strong>\n <pre>{{ formatTraceScalar(sql) }}</pre>\n </div>\n }\n @if(traceField(step.input, 'method') || traceField(step.input, 'path')) {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n }\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n @if(traceField(step.input, 'sql') && step.output !== undefined) {\n <section><span>MySQL MCP execution details</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n @if(isWelcomeState(message)) {\n <button\n type=\"button\"\n class=\"support-welcome-card\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <span class=\"support-welcome-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <span class=\"support-welcome-copy\">\n <strong>Raise a support ticket</strong>\n <small>Send details directly to our support team.</small>\n </span>\n <i class=\"support-welcome-arrow pi pi-arrow-right\" aria-hidden=\"true\"></i>\n </button>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n @if(hasCapabilitySuggestions(message.suggestions)) {\n <div class=\"capability-options\" aria-label=\"Available Maxtime capabilities\">\n @for(group of capabilitySuggestionGroups(message.suggestions); track group.section) {\n <section class=\"capability-option-section\">\n <h3>{{ group.section }}</h3>\n <div class=\"capability-option-grid\">\n @for(suggestion of group.options; track suggestion.structuredAction?.capabilityKey ?? suggestion.label; let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose capability: ' + suggestion.label\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestion.label }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </section>\n }\n </div>\n } @else if(hasOptionCardSuggestions(message.suggestions, message.status)) {\n <div class=\"clarification-options\" aria-label=\"Clarification options\">\n <div class=\"capability-option-grid clarification-option-grid\">\n @for(suggestion of optionCardSuggestions(message.suggestions, message.status); track suggestionLabel(suggestion); let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card clarification-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose option: ' + suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestionLabel(suggestion) }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n } @else if(hasEntitySuggestions(message.suggestions)) {\n <div class=\"entity-options\" aria-label=\"Matching options\">\n @for(suggestion of entitySuggestionOptions(message.suggestions); track suggestion.entity.id ?? suggestion.label) {\n <max-agent-entity-option\n [entity]=\"suggestion.entity\"\n [disabled]=\"isSending()\"\n (selected)=\"useSuggestion(suggestion)\"\n ></max-agent-entity-option>\n }\n </div>\n } @else {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n }\n @if(message.role === 'assistant' && !isWelcomeMessage(message) && !message.isStreaming) {\n <div class=\"response-actions\">\n <button\n type=\"button\"\n class=\"response-feedback-action\"\n [attr.aria-label]=\"uiCopy.feedbackLabel\"\n [pTooltip]=\"uiCopy.feedbackTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"openFeedback(message)\"\n >\n <i class=\"pi pi-comment\" aria-hidden=\"true\"></i>\n </button>\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Developer Trace' : 'Show Developer Trace' }}\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <footer class=\"assistant-footer\">\n @if(hasConversationStarted()) {\n <button\n type=\"button\"\n class=\"support-ticket-shortcut\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <i class=\"far fa-user-headset\" aria-hidden=\"true\"></i>\n <span>Raise a support ticket</span>\n </button>\n }\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n #composerInput\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </footer>\n </section>\n\n @if(supportTicketVisible()) {\n <section class=\"support-ticket-overlay\" aria-label=\"Support ticket form\">\n <div\n class=\"support-ticket-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"supportTicketTitle\"\n >\n <header class=\"support-ticket-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <div>\n <h2 id=\"supportTicketTitle\">Raise a support ticket</h2>\n <p>Share the details and our support team will take it from here.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close\"\n aria-label=\"Close support ticket form\"\n (click)=\"closeSupportTicket()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(supportTicketSubmissionFailed()) {\n <div class=\"support-ticket-error-page\" role=\"alert\">\n <span class=\"support-ticket-error-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-times-circle\"></i>\n </span>\n <h3>Ticket could not be created</h3>\n <p>{{ supportTicketError() }}</p>\n <button\n pButton\n type=\"button\"\n label=\"Close\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else if(supportTicketResult(); as result) {\n <div class=\"support-ticket-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Ticket raised</h3>\n <p>{{ result.message }}</p>\n @if(result.ticketReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n }\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form\" (ngSubmit)=\"submitSupportTicket()\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"supportName\"\n autocomplete=\"name\"\n [value]=\"supportTicketForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"supportEmail\"\n autocomplete=\"email\"\n [value]=\"supportTicketForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"supportPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"supportTicketForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Severity</span>\n <p-select\n inputId=\"supportSeverity\"\n name=\"supportSeverity\"\n [options]=\"supportSeverities()\"\n optionLabel=\"label\"\n [fluid]=\"true\"\n [loading]=\"supportSeverities().length === 0\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n <ng-template #item let-severity>\n <p-tag\n class=\"support-severity-option\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Tags</span>\n <p-multiselect\n inputId=\"supportTags\"\n name=\"supportTags\"\n placeholder=\"Select relevant areas\"\n [options]=\"supportTags()\"\n optionLabel=\"label\"\n dataKey=\"id\"\n display=\"chip\"\n [filter]=\"true\"\n filterBy=\"label\"\n [showToggleAll]=\"false\"\n [loading]=\"supportTagsLoading()\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.tags\"\n >\n <ng-template #selecteditems let-selectedTags>\n <span class=\"support-selected-tags\">\n @for(tag of selectedTags; track tag.id) {\n <p-tag\n class=\"support-selected-tag\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n }\n </span>\n </ng-template>\n <ng-template #item let-tag>\n <p-tag\n class=\"support-tag-option\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-multiselect>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Subject</span>\n <input\n type=\"text\"\n name=\"supportSubject\"\n maxlength=\"200\"\n placeholder=\"Summarise the issue\"\n required\n [(ngModel)]=\"supportTicketForm.subject\"\n />\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>How can we help?</span>\n <textarea\n #supportQueryInput\n pTextarea\n name=\"supportQuery\"\n rows=\"5\"\n placeholder=\"Describe the issue, what you expected, and anything you've already tried.\"\n required\n [(ngModel)]=\"supportTicketForm.query\"\n ></textarea>\n </label>\n </div>\n\n @if(!supportTicketForm.name || !supportTicketForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(supportTicketError(); as supportError) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ supportError }}</p>\n }\n\n <div class=\"support-ticket-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeSupportTicket()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Submit ticket\"\n icon=\"pi pi-send\"\n [loading]=\"supportTicketSubmitting()\"\n [disabled]=\"!canSubmitSupportTicket()\"\n ></button>\n </div>\n </form>\n }\n </div>\n </section>\n }\n\n @if(feedbackVisible()) {\n <section\n class=\"support-ticket-overlay feedback-overlay\"\n aria-label=\"Feedback form\"\n >\n <div\n class=\"support-ticket-dialog feedback-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"feedbackTitle\"\n >\n <header class=\"support-ticket-header feedback-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-comment\"></i>\n </span>\n <div>\n <h2 id=\"feedbackTitle\">Help Max improve</h2>\n <p>Tell us what Max could do better.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close feedback-close\"\n aria-label=\"Close feedback form\"\n (click)=\"closeFeedback()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(feedbackResult(); as result) {\n <div class=\"support-ticket-success feedback-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>We value your feedback</h3>\n <p>{{ result.message }}</p>\n @if(result.feedbackReference; as feedbackReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ feedbackReference }}</strong>\n </div>\n }\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeFeedback()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form feedback-form\" (ngSubmit)=\"submitFeedback()\">\n <div class=\"feedback-form-body\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Feedback type</span>\n <p-select\n inputId=\"feedbackCategory\"\n name=\"feedbackCategory\"\n [options]=\"feedbackCategoryOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"feedbackForm.category\"\n ></p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Your query</span>\n <textarea\n pTextarea\n name=\"feedbackQuery\"\n rows=\"2\"\n placeholder=\"Enter the question or request you gave Max.\"\n readonly\n required\n [(ngModel)]=\"feedbackForm.query\"\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Assistant response <small>Added automatically when available</small></span>\n <textarea\n pTextarea\n name=\"feedbackAssistantResponse\"\n rows=\"3\"\n placeholder=\"No assistant response is available yet.\"\n [value]=\"feedbackForm.assistantResponse\"\n readonly\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>What could be improved?</span>\n <textarea\n #feedbackInput\n pTextarea\n name=\"feedbackDetails\"\n rows=\"3\"\n placeholder=\"Tell us what you expected, what was missing, or how the response could be more useful.\"\n required\n [(ngModel)]=\"feedbackForm.feedback\"\n ></textarea>\n </label>\n </div>\n\n @if(feedbackError(); as error) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ error }}</p>\n }\n </div>\n\n <footer class=\"support-ticket-actions feedback-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeFeedback()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Send feedback\"\n icon=\"pi pi-send\"\n [loading]=\"feedbackSubmitting()\"\n [disabled]=\"!canSubmitFeedback()\"\n ></button>\n </footer>\n </form>\n }\n </div>\n </section>\n }\n</aside>\n","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/components/assistant/max-assistant-feedback.service';\nexport * from './lib/components/assistant/max-assistant.service';\nexport * from './lib/components/assistant/max-assistant-support.service';\nexport * from './lib/components/entity-option/max-agent-entity-option.component';\nexport * from './lib/components/shift-card/max-agent-shift-card.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/components/assistant/assistant-conversation-state.ts","../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.component.ts","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.component.html","../../../projects/max-agent-ui/src/lib/config/assistant-endpoint.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-export.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-feedback.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-support.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { Subject } from 'rxjs';\nimport type { AssistantChatResponse, AssistantConversationMessage } from '../../models/assistant.models';\n\n/** Owned by one assistant component. Never persists, shares across tabs, or decodes signed state. */\nexport class AssistantConversationState {\n readonly resetRequests = new Subject<void>();\n token?: string;\n private identity?: string;\n\n reset(): void {\n this.resetRequests.next();\n this.token = undefined;\n }\n\n accept(response: AssistantChatResponse): void {\n this.token = response.conversationState?.length && response.conversationState.length <= 250_000\n ? response.conversationState : undefined;\n }\n\n changedIdentity(identity: string): boolean {\n const changed = this.identity !== undefined && this.identity !== identity;\n this.identity = identity;\n return changed;\n }\n\n history(messages: AssistantConversationMessage[], question = ''): AssistantConversationMessage[] {\n let candidates = messages.slice(-8);\n if (question && messages.length > 8) {\n const ignored = new Set(['show', 'tell', 'what', 'that', 'this', 'with', 'from', 'have', 'were', 'many', 'about', 'please']);\n const words = [...new Set(question.toLowerCase().match(/[\\p{L}\\p{N}]{4,}/gu) ?? [])].filter(word => !ignored.has(word));\n const older = messages.slice(0, -4).map((message, index) => ({ message, index,\n score: message.role === 'user' ? words.filter(word => message.content.toLowerCase().includes(word)).length : 0\n })).filter(item => item.score > 0).sort((a, b) => b.score - a.score || b.index - a.index).slice(0, 2).sort((a, b) => a.index - b.index);\n if (older.length) candidates = [...older.flatMap(item => messages.slice(item.index,\n messages[item.index + 1]?.role === 'assistant' ? item.index + 2 : item.index + 1)), ...messages.slice(-4)];\n }\n const encoder = new TextEncoder();\n let remaining = 8_000;\n return candidates.reverse().flatMap(message => {\n let content = '';\n let bytes = 0;\n for (const character of message.content) {\n const size = encoder.encode(character).length;\n if (bytes + size > Math.min(3_000, remaining)) break;\n content += character;\n bytes += size;\n }\n remaining -= bytes;\n return content ? [{ ...message, content }] : [];\n }).reverse();\n }\n}\n","import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n /** Per-request transient state supplied by the assistant, never persisted by the host. */\n conversationStateVersion?: 1;\n conversationState?: string;\n apiBaseUrl?: string;\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(\n value: string | null | undefined,\n variant: 'default' | 'information' = 'default'\n ): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n\n const rendered = marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n\n return variant === 'information'\n ? rendered.replaceAll(\n '<li>',\n '<li><i class=\"fa-solid fa-arrow-right\" aria-hidden=\"true\"></i>'\n )\n : rendered;\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { AssistantSuggestionEntity } from '../../models/assistant.models';\n\nconst ENTITY_ICONS: Readonly<Partial<Record<AssistantSuggestionEntity['kind'], string>>> = {\n team: 'pi pi-users',\n role: 'pi pi-id-card',\n location: 'pi pi-map-marker',\n position: 'pi pi-briefcase',\n department: 'pi pi-building',\n entity: 'pi pi-tag',\n};\n\n@Component({\n selector: 'max-agent-entity-option',\n templateUrl: './max-agent-entity-option.component.html',\n styleUrl: './max-agent-entity-option.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MaxAgentEntityOptionComponent {\n @Input({ required: true }) entity!: AssistantSuggestionEntity;\n @Input() disabled = false;\n\n @Output() selected = new EventEmitter<void>();\n\n protected get isPerson(): boolean {\n return this.entity.kind === 'person' || this.entity.kind === 'employee';\n }\n\n protected get displayCode(): string | number | undefined {\n return this.entity.code ?? this.entity.id;\n }\n\n protected get initials(): string {\n return this.entity.name\n .split(/\\s+/u)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase())\n .join('');\n }\n\n protected get entityColor(): string | undefined {\n return this.normaliseColor(this.entity.color);\n }\n\n protected get entityTextColor(): string | undefined {\n return this.normaliseColor(this.entity.textColor);\n }\n\n protected get entityIcon(): string {\n return ENTITY_ICONS[this.entity.kind] ?? 'pi pi-tag';\n }\n\n protected choose(): void {\n if (!this.disabled) {\n this.selected.emit();\n }\n }\n\n private normaliseColor(value: string | undefined): string | undefined {\n const color = value?.trim();\n if (!color) {\n return undefined;\n }\n return /^[\\da-f]{3,8}$/iu.test(color) ? `#${color}` : color;\n }\n}\n","<button\n type=\"button\"\n class=\"entity-option\"\n [class.entity-option-person]=\"isPerson\"\n [class.entity-option-tag]=\"!isPerson\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Choose ' + entity.name\"\n [style.--max-agent-entity-color]=\"entityColor\"\n [style.--max-agent-entity-text-color]=\"entityTextColor\"\n (click)=\"choose()\"\n>\n @if (isPerson) {\n <span class=\"person-photo\" aria-hidden=\"true\">\n @if (entity.photo) {\n <img [src]=\"entity.photo\" [alt]=\"''\" />\n } @else {\n <span>{{ initials }}</span>\n }\n </span>\n <span class=\"person-copy\">\n <span class=\"person-name\">{{ entity.name }}</span>\n @if (displayCode !== undefined && displayCode !== '') {\n <small>#{{ displayCode }}</small>\n }\n </span>\n <i class=\"pi pi-arrow-right option-arrow\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"entity-icon\" aria-hidden=\"true\">\n <i [class]=\"entityIcon\"></i>\n </span>\n <span class=\"entity-name\">{{ entity.name }}</span>\n }\n</button>\n","import { isDevMode } from '@angular/core';\n\nexport const ASSISTANT_CHAT_ENDPOINTS = {\n development: '/agent-api/v1/chat',\n production: 'https://agent.maxtime.cloud/v1/chat'\n} as const;\n\nexport const ASSISTANT_FEEDBACK_ENDPOINTS = {\n development: '/agent-api/v1/feedback',\n production: 'https://agent.maxtime.cloud/v1/feedback'\n} as const;\n\nexport function getDefaultAssistantChatUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_CHAT_ENDPOINTS.development\n : ASSISTANT_CHAT_ENDPOINTS.production;\n}\n\nexport function getDefaultAssistantFeedbackUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_FEEDBACK_ENDPOINTS.development\n : ASSISTANT_FEEDBACK_ENDPOINTS.production;\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantChatUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantChatRequest,\n AssistantChatActivity,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantAnalyticsPage,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\nconst STREAM_IDLE_TIMEOUT_MS = 45_000;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n retrieveAnalyticsPage(\n message: string,\n analyticsPage: AssistantAnalyticsPage,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n analyticsPage\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n request = { ...request,\n ...(config.conversationStateVersion ? { conversationStateVersion: config.conversationStateVersion } : {}),\n ...(request.conversationId && config.conversationState ? { conversationState: config.conversationState } : {})\n };\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const streamError = (message: string, code: string) => new HttpErrorResponse({\n error: { message, code },\n status: code === 'request_timeout' ? 504 : 502,\n url: this.getChatUrl(config)\n });\n let idleTimer: ReturnType<typeof setTimeout>;\n const resetIdleTimer = () => {\n clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n subscriber.error(streamError(\n 'This request is taking longer than expected. Please try again.',\n 'request_timeout'\n ));\n controller.abort();\n }, STREAM_IDLE_TIMEOUT_MS);\n };\n resetIdleTimer();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n if (subscriber.closed) return;\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'delta' || event.type === 'data') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw streamError(event.message, event.code ?? 'request_failed');\n }\n\n if (event.type === 'result') {\n receivedResult = true;\n subscriber.next(event.response);\n subscriber.complete();\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n resetIdleTimer();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n if (receivedResult || subscriber.closed) {\n return;\n }\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n );\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed) {\n subscriber.error(error?.name === 'AbortError'\n ? streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n )\n : error);\n }\n });\n\n return () => {\n clearTimeout(idleTimer);\n controller.abort();\n };\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || getDefaultAssistantChatUrl();\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private getRequestUser(\n config: MaxAssistantConfig\n ): Pick<AssistantUser, 'name' | 'username' | 'email'> | undefined {\n const configuredUser = this.getUser(config);\n const user = {\n ...this.getOptionalText('name', configuredUser.name),\n ...this.getOptionalText('username', configuredUser.username),\n ...this.getOptionalText('email', configuredUser.email)\n };\n\n return Object.keys(user).length > 0 ? user : undefined;\n }\n\n private getOptionalText<Key extends 'name' | 'username' | 'email'>(\n key: Key,\n value: AssistantUser[Key]\n ): Partial<Pick<AssistantUser, Key>> {\n if (typeof value !== 'string' || !value.trim()) {\n return {};\n }\n\n return { [key]: value.trim() } as Partial<Pick<AssistantUser, Key>>;\n }\n\n private getContext(config: MaxAssistantConfig): AssistantRequestContext | undefined {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context;\n\n if (!configured) {\n return undefined;\n }\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...this.compactConfig(config)\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport {\n AssistantFieldValue,\n AssistantResponseTable,\n AssistantVisualisation,\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantExportService {\n async exportTableToExcel(table: AssistantResponseTable): Promise<void> {\n const XLSX = await import('xlsx');\n const worksheetData = [\n table.columns.map(column => column.header),\n ...table.rows.map(row =>\n table.columns.map(column => this.toExportCellValue(row[column.field]))\n ),\n ];\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n const workbook = XLSX.utils.book_new();\n\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Results');\n const file = XLSX.write(workbook, {\n bookType: 'xlsx',\n compression: true,\n type: 'array',\n });\n this.downloadFile(\n new Blob([file], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n }),\n `${this.exportFileName(table.title, 'agent-results')}.xlsx`\n );\n }\n\n async exportVisualisationToPdf(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): Promise<void> {\n const canvas = visualisationElement.querySelector('canvas');\n if (!canvas || !canvas.width || !canvas.height) {\n throw new Error('The rendered chart is not available for export.');\n }\n\n const { jsPDF } = await import('jspdf');\n const orientation = canvas.width > canvas.height ? 'landscape' : 'portrait';\n const document = new jsPDF({ format: 'a4', orientation, unit: 'mm' });\n const pageWidth = document.internal.pageSize.getWidth();\n const pageHeight = document.internal.pageSize.getHeight();\n const margin = 16;\n const contentWidth = pageWidth - (margin * 2);\n const chartTop = 30;\n const availableHeight = pageHeight - chartTop - margin;\n const scale = Math.min(contentWidth / canvas.width, availableHeight / canvas.height);\n const imageWidth = canvas.width * scale;\n const imageHeight = canvas.height * scale;\n const imageX = (pageWidth - imageWidth) / 2;\n const { Chart } = await import('chart.js');\n const chart = Chart.getChart(canvas);\n let chartImage: string;\n\n if (chart) {\n const originalPixelRatio = chart.options.devicePixelRatio;\n // Render fresh chart pixels at 300 DPI; enlarging the screen bitmap blurs labels.\n const printPixelRatio = Math.ceil((imageWidth / 25.4 * 300) / chart.width);\n try {\n chart.options.devicePixelRatio = Math.max(originalPixelRatio ?? 1, printPixelRatio);\n chart.resize();\n chart.update('none');\n chartImage = canvas.toDataURL('image/png', 1);\n } finally {\n chart.options.devicePixelRatio = originalPixelRatio;\n chart.resize();\n chart.update('none');\n }\n } else {\n chartImage = canvas.toDataURL('image/png', 1);\n }\n\n document.setFont('helvetica', 'bold');\n document.setFontSize(16);\n document.text(visualisation.title, margin, 20, { maxWidth: contentWidth });\n document.addImage(\n chartImage,\n 'PNG',\n imageX,\n chartTop,\n imageWidth,\n imageHeight,\n undefined,\n 'FAST'\n );\n\n this.downloadFile(\n new Blob([document.output('arraybuffer')], { type: 'application/pdf' }),\n `${this.exportFileName(visualisation.title, 'agent-chart')}.pdf`\n );\n }\n\n private toExportCellValue(value: AssistantFieldValue | undefined): string | number | boolean {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.toExportCellValue(item)).join(', ');\n }\n\n if (typeof value === 'object') {\n const preferredValue = value['label'] ?? value['name'] ?? value['code'];\n return preferredValue === undefined\n ? JSON.stringify(value)\n : String(this.toExportCellValue(preferredValue));\n }\n\n return value;\n }\n\n private exportFileName(title: string | undefined, fallback: string): string {\n const normalised = (title || fallback)\n .trim()\n .toLocaleLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return normalised || fallback;\n }\n\n private downloadFile(file: Blob, fileName: string): void {\n const url = URL.createObjectURL(file);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantFeedbackUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = getDefaultAssistantFeedbackUrl();\n readonly method = 'POST' as const;\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n submitFeedback(\n feedback: AssistantFeedbackRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantFeedbackResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n return this.http.post<AssistantFeedbackResponse>(\n this.getFeedbackUrl(mergedConfig),\n feedback,\n { headers: this.getHeaders(mergedConfig) }\n );\n }\n\n private getFeedbackUrl(config: MaxAssistantConfig): string {\n const configuredChatUrl = config.assistantApiUrl?.trim();\n return configuredChatUrl\n ? configuredChatUrl.replace(/\\/chat\\/?$/, '/feedback')\n : getDefaultAssistantFeedbackUrl();\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n return headers;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { map, Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantSupportTag,\n AssistantSelectableEntity,\n AssistantSupportSeverity,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly ticketsEndpoint = '/ticket';\n readonly tagsEndpoint = '/selection/lookup/supportticket/tag';\n readonly severitiesEndpoint = '/selection/lookup/supportticket/severity';\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSelectableEntity[]>(\n this.getEndpoint(this.tagsEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n ).pipe(\n map(tags => tags.map(tag => ({\n ...tag,\n icon: 'pi pi-tag',\n severity: 'info' as const\n })))\n );\n }\n\n getSupportSeverities(): Observable<AssistantSupportSeverity[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSupportSeverity[]>(\n this.getEndpoint(this.severitiesEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n );\n }\n\n submitTicket(\n ticket: AssistantSupportTicketRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantSupportTicketResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n const response$ = this.http.post(\n this.getEndpoint(this.ticketsEndpoint, mergedConfig),\n {\n subject: ticket.subject,\n body: ticket.query,\n severity: ticket.severity,\n tags: ticket.tags.map(({ id, label }) => ({ id, label }))\n },\n {\n headers: this.getHeaders(mergedConfig),\n responseType: 'text'\n }\n );\n\n return response$.pipe(map(response => this.toTicketResponse(response)));\n }\n\n private toTicketResponse(_response: string): AssistantSupportTicketResponse {\n return {\n success: true,\n message: 'Your support ticket has been created. You will receive an email with your reference number shortly.',\n submittedAt: new Date().toISOString()\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private getEndpoint(path: string, config: MaxAssistantConfig): string {\n const baseUrl = config.apiBaseUrl?.trim();\n return baseUrl ? `${baseUrl.replace(/\\/$/, '')}${path}` : path;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n DoCheck,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n OnInit,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { ChartModule } from 'primeng/chart';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { SelectModule } from 'primeng/select';\nimport { TagModule } from 'primeng/tag';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap, takeUntil } from 'rxjs';\nimport { AssistantConversationState } from './assistant-conversation-state';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig,\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatActivity,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantSuggestionEntity,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantHelpGuide,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantResponseTablePagination,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportSeverity,\n AssistantSupportTag,\n AssistantSupportTicketResponse,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation,\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantFeedbackService } from './max-assistant-feedback.service';\nimport { MaxAssistantExportService } from './max-assistant-export.service';\nimport { MaxAssistantSupportService } from './max-assistant-support.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\nimport { MaxAgentEntityOptionComponent } from '../entity-option/max-agent-entity-option.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max AI',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n closeLabel: 'Close AI assistant',\n closeTooltip: 'Close AI assistant',\n feedbackLabel: 'Provide feedback on this response',\n feedbackTooltip: 'Provide feedback',\n placeholder: 'Ask Max AI',\n startingMessage: 'Preparing your answer…',\n errorMessage: 'Sorry, something went wrong while preparing your response. Please try again in a little while.',\n offlineTitle: \"I'm currently offline\",\n accessUnavailableTitle: \"I can't verify your access right now\",\n accessUnavailableMessage: \"Sorry, I can't verify your access right now, so I can't answer your request. Please try again in a little while. You can continue using Maxtime in the meantime. If this continues, contact your administrator.\",\n offlineMessage: \"Sorry, I can't connect right now. Please try again in a little while. You can continue using Maxtime in the meantime.\",\n};\n\nconst ASSISTANT_SEARCH_RESULT_ICONS: Readonly<Record<string, string>> = {\n EMPLOYEE: 'pi pi-user',\n PERSON: 'pi pi-user',\n TEAM: 'pi pi-users',\n SCHEDULE: 'pi pi-calendar',\n LOCATION: 'pi pi-map-marker',\n POSITION: 'pi pi-briefcase',\n TIMESHEET: 'pi pi-clock',\n CONFIGTEAM: 'pi pi-cog',\n CONFIGLOCATION: 'pi pi-cog',\n DEFAULT: 'pi pi-search',\n};\n\nconst ASSISTANT_HELP_ICONS: Readonly<Record<AssistantHelpGuide['icon'], string>> = {\n action: 'pi pi-bolt',\n analytics: 'pi pi-chart-bar',\n budget: 'pi pi-wallet',\n calendar: 'pi pi-calendar-plus',\n document: 'pi pi-file',\n knowledge: 'pi pi-book',\n megaphone: 'pi pi-megaphone',\n people: 'pi pi-user',\n team: 'pi pi-users',\n 'time-off': 'pi pi-calendar-times',\n timesheet: 'pi pi-clock',\n workflow: 'pi pi-sitemap',\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n subject: string;\n query: string;\n severity: AssistantSupportSeverity | null;\n tags: AssistantSupportTag[];\n}\n\ninterface FeedbackFormValue {\n category: AssistantFeedbackCategory;\n query: string;\n assistantResponse: string;\n feedback: string;\n}\n\ninterface AssistantEntitySuggestionOption extends AssistantSuggestionOption {\n presentation: 'person_card' | 'entity_tag';\n entity: AssistantSuggestionEntity;\n}\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n ChartModule,\n MultiSelectModule,\n SelectModule,\n TagModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentEntityOptionComponent,\n MaxAgentShiftCardComponent,\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: ['./max-assistant.component.scss', './max-assistant.workspace.scss'],\n})\nexport class MaxAssistantComponent implements OnInit, DoCheck {\n private readonly sessionState = new AssistantConversationState();\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n private activeTurnAnchorMessageId?: string;\n\n private scrollToLatestTimer?: ReturnType<typeof setTimeout>;\n\n private readonly visualisationDataCache = new WeakMap<\n AssistantVisualisation,\n { labels: string[]; datasets: Array<Record<string, unknown>> }\n >();\n\n private readonly visualisationOptionsCache = new WeakMap<\n AssistantVisualisation,\n Record<string, unknown>\n >();\n\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n\n @Input() assistantApiUrl?: string;\n\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n\n @Input() developerDetailsEnabled = true;\n\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n\n @Output() closeRequested = new EventEmitter<void>();\n\n protected readonly isSending = signal(false);\n\n protected readonly input = signal('');\n\n protected readonly conversationId = signal<string | undefined>(undefined);\n\n protected readonly messages = signal<AssistantMessage[]>([]);\n\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly loadingTablePage = signal<string | undefined>(undefined);\n\n protected readonly tablePageErrors = signal<Readonly<Record<string, string>>>({});\n\n protected readonly feedbackVisible = signal(false);\n\n protected readonly feedbackSubmitting = signal(false);\n\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n\n protected readonly feedbackError = signal<string | undefined>(undefined);\n\n protected readonly feedbackCategoryOptions: Array<{\n label: string;\n value: AssistantFeedbackCategory;\n }> = [\n { label: 'Incorrect answer', value: 'incorrect' },\n { label: 'Incomplete answer', value: 'incomplete' },\n { label: 'Hard to understand', value: 'unclear' },\n { label: 'Unexpected behaviour', value: 'unexpected' },\n { label: 'Suggestion', value: 'suggestion' },\n { label: 'Other', value: 'other' }\n ];\n\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n\n protected readonly supportTicketVisible = signal(false);\n\n protected readonly supportTicketSubmitting = signal(false);\n\n protected readonly supportTagsLoading = signal(false);\n\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n\n protected readonly supportSeverities = signal<AssistantSupportSeverity[]>([]);\n\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n\n protected readonly supportTicketSubmissionFailed = signal(false);\n\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly exportService: MaxAssistantExportService,\n private readonly feedbackService: MaxAssistantFeedbackService,\n private readonly supportService: MaxAssistantSupportService,\n private readonly destroyRef: DestroyRef,\n @Inject(MAX_ASSISTANT_CONFIG) private readonly defaultConfig: MaxAssistantConfig\n ) {}\n\n ngOnInit(): void {\n this.messages.set(this.createDefaultMessages());\n this.destroyRef.onDestroy(() => {\n this.sessionState.reset();\n this.sessionState.resetRequests.complete();\n clearTimeout(this.scrollToLatestTimer);\n });\n }\n\n ngDoCheck(): void {\n const configuredUser = typeof this.defaultConfig.user === 'function' ? this.defaultConfig.user() : this.defaultConfig.user;\n const localUser = typeof this.user === 'function' ? this.user() : this.user;\n const user = { ...configuredUser, ...localUser };\n const contextSource = this.context ?? this.defaultConfig.context;\n const context = typeof contextSource === 'function' ? contextSource() : contextSource;\n if (this.sessionState.changedIdentity(JSON.stringify([this.app ?? this.defaultConfig.app,\n user.token, user.version, user.username, user.email, context?.tenantId, context?.organisationId, context?.userId]))) {\n this.clearChatSession();\n }\n }\n\n resetSession(): void { this.clearChatSession(); }\n\n // Also clears memory if the browser keeps this document in its back/forward cache.\n @HostListener('window:pagehide')\n protected onPageHide(): void { this.clearChatSession(); }\n\n focusComposer(): void {\n this.composerInput?.nativeElement.focus();\n }\n\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\n return ASSISTANT_UI_COPY;\n }\n\n protected get bootstrapConfig(): AssistantBootstrapConfig {\n return getAssistantBootstrapConfig(this.app);\n }\n\n protected isWelcomeMessage(message: AssistantMessage): boolean {\n return (\n this.messages()[0]?.id === message.id &&\n message.role === 'assistant' &&\n !message.displayResponse &&\n !message.isStreaming\n );\n }\n\n protected isWelcomeState(message: AssistantMessage): boolean {\n return this.messages().length === 1 && this.isWelcomeMessage(message);\n }\n\n @HostListener('document:keydown.escape')\n protected onDocumentEscape() {\n if (this.feedbackVisible()) {\n this.closeFeedback();\n return;\n }\n\n if (this.supportTicketVisible()) {\n this.closeSupportTicket();\n return;\n }\n\n if (this.expandedDetailMessageIds().size) {\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n }\n }\n\n protected clearChatSession() {\n this.sessionState.reset();\n this.closeFeedback(false);\n this.closeSupportTicket(false);\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n this.loadingTablePage.set(undefined);\n this.tablePageErrors.set({});\n this.activeTurnAnchorMessageId = undefined;\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory(trimmedMessage);\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const initialProgress: AssistantChatProgress = {\n type: 'progress',\n stage: 'request',\n message: this.uiCopy.startingMessage,\n };\n const streamingMessage: AssistantMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true,\n processingUpdates: [initialProgress],\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n activity => this.updateStreamingMessage(streamingMessage.id, activity)\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n const preview = this.messages().find(message => message.id === streamingMessage.id);\n if (preview?.displayResponse || preview?.cards?.length) {\n this.replaceMessage(streamingMessage.id, {\n ...preview,\n content: 'The data was retrieved, but the explanation could not be completed.',\n streamingContent: undefined,\n });\n this.isSending.set(false);\n return;\n }\n this.replaceMessage(streamingMessage.id, this.createErrorMessage(error));\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected isListMetric(metric: { label: string; value: string; list?: boolean }): boolean {\n if (metric.list) {\n return true;\n }\n return /\\b(?:teams?|roles?)\\b/iu.test(metric.label) &&\n metric.value.split(/,|;|\\n/u).filter((value) => value.trim()).length > 1;\n }\n\n protected hasCapabilitySuggestions(\n suggestions: AssistantSuggestion[] = []\n ): boolean {\n return suggestions.some(\n suggestion =>\n typeof suggestion !== 'string' &&\n suggestion.presentation === 'capability_card'\n );\n }\n\n protected capabilitySuggestionGroups(\n suggestions: AssistantSuggestion[] = []\n ): Array<{ section: string; options: AssistantSuggestionOption[] }> {\n const groups = new Map<string, AssistantSuggestionOption[]>();\n for (const suggestion of suggestions) {\n if (\n typeof suggestion === 'string' ||\n suggestion.presentation !== 'capability_card'\n ) {\n continue;\n }\n const section = suggestion.section?.trim() || 'More';\n groups.set(section, [...(groups.get(section) ?? []), suggestion]);\n }\n return [...groups.entries()].map(([section, options]) => ({\n section,\n options\n }));\n }\n\n protected hasOptionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): boolean {\n return suggestions.some(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected optionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): AssistantSuggestion[] {\n return suggestions.filter(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected hasEntitySuggestions(suggestions: AssistantSuggestion[] = []): boolean {\n return suggestions.some(\n (suggestion) =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected entitySuggestionOptions(\n suggestions: AssistantSuggestion[] = [],\n ): AssistantEntitySuggestionOption[] {\n return suggestions.filter(\n (suggestion): suggestion is AssistantEntitySuggestionOption =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected useSuggestion(suggestion: AssistantSuggestion) {\n if (typeof suggestion === 'string' || !suggestion.structuredAction) {\n this.sendMessage(\n typeof suggestion === 'string' ? suggestion : suggestion.message\n );\n return;\n }\n\n const label = suggestion.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n suggestion.message,\n suggestion.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, suggestion.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage(this.createErrorMessage(error));\n this.isSending.set(false);\n }\n });\n }\n\n protected performHostAction(action: AssistantHostAction) {\n this.hostAction.emit(action);\n }\n\n protected requestClose(): void {\n this.closeRequested.emit();\n }\n\n protected hasConversationStarted(): boolean {\n return this.messages().some(message => message.role === 'user');\n }\n\n protected openSupportTicket(): void {\n this.closeFeedback(false);\n const user = this.getConfiguredUser();\n this.supportTicketForm = this.createSupportTicketForm(user);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n this.supportTags.set([]);\n this.supportSeverities.set([]);\n this.supportTagsLoading.set(true);\n this.supportTicketVisible.set(true);\n\n this.supportService\n .getSupportTags()\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: tags => {\n this.supportTags.set(tags);\n this.supportTagsLoading.set(false);\n },\n error: () => {\n this.supportTagsLoading.set(false);\n this.supportTicketError.set('Support tags could not be loaded. You can still submit the ticket.');\n }\n });\n\n this.supportService\n .getSupportSeverities()\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: severities => this.supportSeverities.set(severities),\n error: () => this.supportTicketError.set(\n 'Severity options could not be loaded. Please try again.'\n )\n });\n\n setTimeout(() => this.supportQueryInput?.nativeElement.focus());\n }\n\n protected closeSupportTicket(restoreComposerFocus = true): void {\n this.supportTicketVisible.set(false);\n this.supportTicketSubmitting.set(false);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitSupportTicket(): boolean {\n return Boolean(\n this.supportTicketForm.name.trim() &&\n this.supportTicketForm.email.trim() &&\n this.supportTicketForm.subject.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected supportSeverityColor(color: string): string {\n const value = color?.trim() ?? '';\n return value ? (value.startsWith('#') ? value : `#${value}`) : 'var(--max-accent)';\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n const severity = this.supportTicketForm.severity;\n if (!severity) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\n this.supportService\n .submitTicket({\n name: this.supportTicketForm.name.trim(),\n email: this.supportTicketForm.email.trim(),\n ...(this.supportTicketForm.phone.trim()\n ? { phone: this.supportTicketForm.phone.trim() }\n : {}),\n subject: this.supportTicketForm.subject.trim(),\n query: this.supportTicketForm.query.trim(),\n severity,\n tags: this.supportTicketForm.tags.map(({ id, label }) => ({ id, label })),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n }, this.getAssistantConfig(false))\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.supportTicketResult.set(result);\n this.supportTicketSubmitting.set(false);\n },\n error: () => {\n this.supportTicketSubmitting.set(false);\n this.supportTicketSubmissionFailed.set(true);\n this.supportTicketError.set(\n 'Your ticket could not be created. Please try again shortly.'\n );\n }\n });\n }\n\n protected openFeedback(responseMessage: AssistantMessage): void {\n this.closeSupportTicket(false);\n this.feedbackForm = this.createFeedbackForm(responseMessage);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n this.feedbackVisible.set(true);\n setTimeout(() => this.feedbackInput?.nativeElement.focus());\n }\n\n protected closeFeedback(restoreComposerFocus = true): void {\n this.feedbackVisible.set(false);\n this.feedbackSubmitting.set(false);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitFeedback(): boolean {\n return Boolean(\n this.feedbackForm.category &&\n this.feedbackForm.query.trim() &&\n this.feedbackForm.feedback.trim() &&\n !this.feedbackSubmitting()\n );\n }\n\n protected submitFeedback(): void {\n if (!this.canSubmitFeedback()) {\n return;\n }\n\n this.feedbackSubmitting.set(true);\n this.feedbackError.set(undefined);\n this.feedbackService\n .submitFeedback({\n category: this.feedbackForm.category,\n query: this.feedbackForm.query.trim(),\n ...(this.feedbackForm.assistantResponse.trim()\n ? { assistantResponse: this.feedbackForm.assistantResponse.trim() }\n : {}),\n feedback: this.feedbackForm.feedback.trim(),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys',\n ...(this.conversationId() ? { conversationId: this.conversationId() } : {})\n }, this.getAssistantConfig(false))\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.feedbackResult.set(result);\n this.feedbackSubmitting.set(false);\n },\n error: () => {\n this.feedbackSubmitting.set(false);\n this.feedbackError.set(\n 'Your feedback could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected searchResultIcon(type: string): string {\n return ASSISTANT_SEARCH_RESULT_ICONS[type.trim().toUpperCase()]\n ?? ASSISTANT_SEARCH_RESULT_ICONS['DEFAULT'];\n }\n\n protected searchActionIcon(action: AssistantSearchResult['actions'][number]): string {\n const linkType = action.hostAction.payload['linkType'];\n return this.searchResultIcon(typeof linkType === 'string' ? linkType : action.label);\n }\n\n protected helpIcon(icon: AssistantHelpGuide['icon']): string {\n return ASSISTANT_HELP_ICONS[icon];\n }\n\n protected helpGuideLabel(kind: AssistantHelpGuide['kind']): string {\n switch (kind) {\n case 'knowledge':\n case 'information':\n return 'Maxtime Knowledge Guide';\n case 'analytics':\n return 'Maxtime Analytics';\n case 'action':\n return 'Maxtime Action';\n default:\n return 'Maxtime Help Guide';\n }\n }\n\n protected isContentGuide(kind: AssistantHelpGuide['kind']): boolean {\n return kind === 'knowledge'\n || kind === 'information'\n || kind === 'analytics'\n || kind === 'action';\n }\n\n protected helpGuideMarkdownVariant(\n kind: AssistantHelpGuide['kind']\n ): 'default' | 'information' {\n return this.isContentGuide(kind) ? 'information' : 'default';\n }\n\n protected getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntil(this.sessionState.resetRequests),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage(this.createErrorMessage(error));\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(response);\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage(this.createErrorMessage(error));\n this.isSending.set(false);\n }\n });\n }\n\n private createErrorMessage(error: unknown): AssistantMessage {\n const isAccessUnavailable = error instanceof HttpErrorResponse && (\n error.error?.code === 'authorization_unavailable' ||\n error.error?.error === 'authorization_unavailable' ||\n error.error?.message === 'Access could not be verified with the calling Maxtime product.'\n );\n // Do not label permissions, validation or a model timeout as an outage.\n const isOffline = !isAccessUnavailable && (error instanceof HttpErrorResponse\n ? error.status === 0 || (error.status === 500 && !error.error) ||\n ([502, 503, 504].includes(error.status) && !error.error?.code)\n : error instanceof TypeError && /fetch|network|load failed/iu.test(error.message));\n return {\n ...this.createMessage('assistant', isAccessUnavailable ? this.uiCopy.accessUnavailableMessage : isOffline ? this.uiCopy.offlineMessage : this.resolveErrorMessage(error)),\n isError: true,\n isOffline,\n isAccessUnavailable\n };\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected retrieveNextTablePage(\n message: AssistantMessage,\n table: AssistantResponseTable,\n tableIndex: number\n ): void {\n const pagination = table.pagination;\n if (!pagination || !this.hasNextTablePage(table) || this.isSending()) {\n return;\n }\n const nextOffset = table.rows.length;\n if (nextOffset % pagination.pageSize !== 0) {\n return;\n }\n const tableKey = this.tablePageKey(message.id, tableIndex);\n const history = this.getConversationHistory();\n this.tablePageErrors.update(errors => {\n const next = { ...errors };\n delete next[tableKey];\n return next;\n });\n this.loadingTablePage.set(tableKey);\n this.isSending.set(true);\n\n this.assistantService\n .retrieveAnalyticsPage(\n pagination.query,\n { offset: nextOffset, pageSize: 100 },\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n // Paging an older table must not replace the active conversational topic.\n this.mergeTablePage(message.id, tableIndex, response, pagination.query);\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n },\n error: error => {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: this.resolveErrorMessage(error)\n }));\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n }\n });\n }\n\n protected tablePageStatus(table: AssistantResponseTable): string {\n const pagination = table.pagination;\n if (!pagination) {\n return '';\n }\n const retrieved = table.rows.length;\n return pagination.totalRecordsExact === false\n ? `${retrieved.toLocaleString()} ${retrieved === 1 ? 'record' : 'records'} retrieved`\n : `${Math.min(retrieved, pagination.totalRecords).toLocaleString()} of ${pagination.totalRecords.toLocaleString()} records retrieved`;\n }\n\n protected hasNextTablePage(table: AssistantResponseTable): boolean {\n const pagination = table.pagination;\n if (!pagination || pagination.nextOffset === undefined) {\n return false;\n }\n if (pagination.hasMore !== undefined) {\n return pagination.hasMore;\n }\n return Boolean(\n pagination.remainingRecords > 0 &&\n table.rows.length < pagination.totalRecords\n );\n }\n\n protected nextTablePageLabel(pagination: AssistantResponseTablePagination): string {\n const recordCount = pagination.totalRecordsExact === false\n ? pagination.pageSize\n : Math.min(pagination.pageSize, pagination.remainingRecords);\n return `Retrieve next ${recordCount.toLocaleString()} ${recordCount === 1 ? 'record' : 'records'}`;\n }\n\n protected isTablePageLoading(messageId: string, tableIndex: number): boolean {\n return this.loadingTablePage() === this.tablePageKey(messageId, tableIndex);\n }\n\n protected tablePageError(messageId: string, tableIndex: number): string | undefined {\n return this.tablePageErrors()[this.tablePageKey(messageId, tableIndex)];\n }\n\n protected exportTable(table: AssistantResponseTable): void {\n void this.exportService.exportTableToExcel(table);\n }\n\n protected exportVisualisation(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): void {\n void this.exportService.exportVisualisationToPdf(visualisation, visualisationElement);\n }\n\n protected chartType(\n visualisation: AssistantVisualisation\n ): 'bar' | 'line' | 'doughnut' | 'pie' | 'radar' | 'polarArea' {\n switch (visualisation.type) {\n case 'doughnut':\n case 'pie':\n case 'polarArea':\n case 'radar':\n case 'line':\n case 'lineStyles':\n return visualisation.type === 'lineStyles' ? 'line' : visualisation.type;\n default:\n return 'bar';\n }\n }\n\n protected chartData(\n visualisation: AssistantVisualisation\n ): { labels: string[]; datasets: Array<Record<string, unknown>> } {\n const cached = this.visualisationDataCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const sourceDatasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{\n label: visualisation.valueLabel || 'Value',\n values: visualisation.values,\n colors: visualisation.colors,\n }];\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie' || chartType === 'polarArea';\n const data = {\n labels: visualisation.labels,\n datasets: sourceDatasets.map((dataset, index) => {\n const colour = dataset.color || this.chartColour(visualisation, index);\n const categoryColours = dataset.colors?.length\n ? dataset.colors\n : visualisation.colors?.length\n ? visualisation.colors\n : visualisation.labels.map((_label, labelIndex) =>\n this.chartColour(visualisation, labelIndex)\n );\n const datasetType = dataset.type || (\n visualisation.type === 'barLine'\n ? index === 0 ? 'bar' : 'line'\n : undefined\n );\n const isLineDataset = datasetType === 'line' || chartType === 'line' || chartType === 'radar';\n return {\n label: dataset.label,\n data: dataset.values.map(value => Number(value) || 0),\n ...(datasetType ? { type: datasetType } : {}),\n backgroundColor: isArcChart || (!isLineDataset && sourceDatasets.length === 1)\n ? categoryColours\n : this.colourWithOpacity(colour, isLineDataset ? 0.14 : 0.78),\n borderColor: isArcChart ? '#ffffff' : colour,\n borderWidth: isLineDataset ? 2 : isArcChart ? 2 : 1,\n borderRadius: isLineDataset || isArcChart ? 0 : 6,\n borderDash: dataset.borderDash || [],\n fill: dataset.fill ?? false,\n tension: isLineDataset ? 0.32 : 0,\n pointStyle: ['circle', 'rectRot', 'triangle', 'rectRounded'][index % 4],\n pointRadius: isLineDataset ? 3 : 0,\n pointHoverRadius: isLineDataset ? 5 : 0,\n ...(visualisation.type === 'stackedBar' ? { stack: 'combined' } : {}),\n };\n }),\n };\n this.visualisationDataCache.set(visualisation, data);\n return data;\n }\n\n protected chartOptions(visualisation: AssistantVisualisation): Record<string, unknown> {\n const cached = this.visualisationOptionsCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie';\n const isRadialChart = chartType === 'polarArea' || chartType === 'radar';\n const isHorizontal = visualisation.type === 'horizontalBar';\n const isStacked = visualisation.type === 'stackedBar';\n const axis = (title: string | undefined, stacked = false, beginAtZero = false) => ({\n stacked,\n beginAtZero,\n border: { display: false },\n grid: { color: '#e5e7eb', drawTicks: false },\n ticks: { color: '#64748b', padding: 8, font: { size: 10 } },\n title: {\n display: Boolean(title),\n text: title,\n color: '#475569',\n font: { size: 11, weight: 500 },\n },\n });\n const options: Record<string, unknown> = {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500 },\n interaction: { intersect: false, mode: 'index' },\n plugins: {\n legend: {\n display: this.shouldShowChartLegend(visualisation),\n position: 'bottom',\n labels: {\n color: '#475569',\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n font: { size: 10 },\n },\n },\n tooltip: {\n enabled: true,\n padding: 10,\n usePointStyle: true,\n },\n },\n ...(isArcChart\n ? { cutout: chartType === 'doughnut' ? '58%' : 0 }\n : isRadialChart\n ? {\n scales: {\n r: {\n beginAtZero: true,\n grid: { color: '#e5e7eb' },\n angleLines: { color: '#e5e7eb' },\n ticks: { color: '#64748b', backdropColor: 'transparent', font: { size: 9 } },\n pointLabels: { color: '#475569', font: { size: 10 } },\n },\n },\n }\n : {\n indexAxis: isHorizontal ? 'y' : 'x',\n scales: {\n x: axis(\n isHorizontal ? visualisation.yAxisLabel : visualisation.xAxisLabel,\n isStacked,\n isHorizontal\n ),\n y: axis(\n isHorizontal ? visualisation.xAxisLabel : visualisation.yAxisLabel,\n isStacked,\n !isHorizontal\n ),\n },\n }),\n };\n this.visualisationOptionsCache.set(visualisation, options);\n return options;\n }\n\n protected chartHeight(visualisation: AssistantVisualisation): number {\n return visualisation.type === 'horizontalBar'\n ? Math.max(300, Math.min(620, visualisation.labels.length * 34 + 90))\n : 340;\n }\n\n private shouldShowChartLegend(visualisation: AssistantVisualisation): boolean {\n if (['doughnut', 'pie', 'polarArea'].includes(visualisation.type)) {\n return true;\n }\n\n return (visualisation.datasets?.length ?? 1) > 1;\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const datasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{ label: visualisation.valueLabel || 'Value', values: visualisation.values }];\n const values = datasets.flatMap(dataset =>\n visualisation.labels.map(\n (label, index) => `${dataset.label}, ${label}: ${Number(dataset.values[index]) || 0}`\n )\n );\n return `${visualisation.title} chart. ${values.join(', ')}.`;\n }\n\n private chartColour(visualisation: AssistantVisualisation, index: number): string {\n const fallback = [\n '#3B82F6', '#EC4899', '#10B981', '#F59E0B', '#8B5CF6', '#06B6D4',\n '#EF4444', '#84CC16', '#F97316', '#6366F1', '#14B8A6', '#D946EF',\n ];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n private colourWithOpacity(colour: string, opacity: number): string {\n const match = /^#([0-9a-f]{6})$/iu.exec(colour.trim());\n if (!match) {\n return colour;\n }\n const value = Number.parseInt(match[1]!, 16);\n return `rgba(${(value >> 16) & 255}, ${(value >> 8) & 255}, ${value & 255}, ${opacity})`;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\n }\n\n private getAssistantConfig(includeConversation = true): MaxAssistantConfig {\n const config: MaxAssistantConfig = includeConversation\n ? { conversationStateVersion: 1, ...(this.sessionState.token ? { conversationState: this.sessionState.token } : {}) }\n : {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n if (message.role === 'user') {\n this.activeTurnAnchorMessageId = message.id;\n }\n this.messages.update(messages => [...messages, message]);\n if (this.activeTurnAnchorMessageId) {\n this.scrollToMessage(this.activeTurnAnchorMessageId);\n } else {\n this.scrollToLatest();\n }\n }\n\n private updateStreamingMessage(messageId: string, activity: AssistantChatActivity) {\n let messageUpdated = false;\n this.messages.update(messages =>\n messages.map(message => {\n if (message.id !== messageId || !message.isStreaming) {\n return message;\n }\n\n if (activity.type === 'delta') {\n if (!activity.delta) {\n return message;\n }\n messageUpdated = true;\n return {\n ...message,\n streamingContent: `${message.streamingContent ?? ''}${activity.delta}`,\n ...(message.displayResponse || message.cards?.length\n ? { content: `${message.streamingContent ?? ''}${activity.delta}` }\n : {}),\n };\n }\n\n if (activity.type === 'data') {\n messageUpdated = true;\n return {\n ...message,\n ...activity.data,\n displayResponse: activity.data.displayResponse ?? {},\n content: message.streamingContent ?? '',\n processingUpdates: [],\n };\n }\n\n if (message.displayResponse || message.cards?.length) {\n return message;\n }\n\n const progressMessage = activity.message.trim();\n if (!progressMessage) {\n return message;\n }\n const processingUpdates = message.processingUpdates ?? [];\n const latestUpdate = processingUpdates.at(-1);\n if (\n latestUpdate?.stage === activity.stage &&\n latestUpdate.message === progressMessage\n ) {\n return message;\n }\n\n messageUpdated = true;\n return {\n ...message,\n content: progressMessage,\n processingUpdates: [\n { ...activity, message: progressMessage },\n ],\n };\n })\n );\n if (messageUpdated) {\n this.scrollToLatest();\n }\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\n }\n\n private mergeTablePage(\n messageId: string,\n tableIndex: number,\n response: AssistantChatResponse,\n userQuery: string\n ): void {\n const nextDisplay = this.createDisplayResponse(response, userQuery);\n const nextTable = this.getResponseGrid(nextDisplay)[0];\n const tableKey = this.tablePageKey(messageId, tableIndex);\n this.messages.update(messages => messages.map(message => {\n if (message.id !== messageId) {\n return message;\n }\n const developerTrace = this.mergeDeveloperTraces(\n message.developerTrace,\n response.developerTrace\n );\n if (!nextTable || !message.displayResponse) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: response.answer\n }));\n return { ...message, developerTrace };\n }\n const tables = [...this.getResponseGrid(message.displayResponse)];\n const currentTable = tables[tableIndex];\n if (!currentTable) {\n return { ...message, developerTrace };\n }\n const rowOffset = currentTable.rows.length;\n if (\n nextTable.pagination &&\n nextTable.pagination.offset !== rowOffset\n ) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: 'The next records could not be retrieved in sequence. Please try the query again.'\n }));\n return { ...message, developerTrace };\n }\n const nextPagination = nextTable.pagination;\n const totalRecords = nextPagination?.totalRecords ?? rowOffset + nextTable.rows.length;\n const totalRecordsExact = nextPagination?.totalRecordsExact !== false;\n const combinedRows = [...currentTable.rows, ...nextTable.rows];\n const rows = totalRecordsExact\n ? combinedRows.slice(0, totalRecords)\n : combinedRows;\n const hasMore = nextPagination?.hasMore ??\n ((nextPagination?.remainingRecords ?? 0) > 0);\n const remainingRecords = totalRecordsExact\n ? Math.max(totalRecords - rows.length, 0)\n : (nextPagination?.remainingRecords ?? 0);\n const pagination = nextTable.pagination\n ? {\n query: nextTable.pagination.query,\n offset: 0,\n pageSize: nextTable.pagination.pageSize,\n totalRecords,\n totalRecordsExact,\n returnedRecords: rows.length,\n remainingRecords,\n hasMore,\n ...(hasMore ? { nextOffset: rows.length } : {})\n }\n : currentTable.pagination;\n tables[tableIndex] = {\n ...currentTable,\n rows,\n ...(nextTable.actions?.length\n ? {\n actions: [\n ...(currentTable.actions ?? []),\n ...nextTable.actions.map(action => ({\n ...action,\n rowIndex: action.rowIndex + rowOffset\n }))\n ]\n }\n : {}),\n ...(pagination ? { pagination } : {})\n };\n return {\n ...message,\n displayResponse: {\n ...message.displayResponse,\n grid: tables,\n tables\n },\n developerTrace\n };\n }));\n this.scrollToLatest();\n }\n\n private mergeDeveloperTraces(\n current?: AssistantDeveloperTrace,\n next?: AssistantDeveloperTrace\n ): AssistantDeveloperTrace | undefined {\n if (!current) {\n return next;\n }\n if (!next) {\n return current;\n }\n const lastId = Math.max(0, ...current.steps.map(step => step.id));\n const steps = [\n ...current.steps,\n ...next.steps.map((step, index) => ({ ...step, id: lastId + index + 1 }))\n ];\n if (!current.run || !next.run) {\n return { ...(next.run ?? current.run ? { run: next.run ?? current.run } : {}), steps };\n }\n return {\n run: {\n ...current.run,\n completedAt: next.run.completedAt,\n durationMs: current.run.durationMs + next.run.durationMs,\n llmCalls: current.run.llmCalls + next.run.llmCalls,\n embeddingCalls: current.run.embeddingCalls + next.run.embeddingCalls,\n apiCalls: current.run.apiCalls + next.run.apiCalls\n },\n steps\n };\n }\n\n private tablePageKey(messageId: string, tableIndex: number): string {\n return `${messageId}:${tableIndex}`;\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const user = this.getConfiguredUser();\n const preferredName = [\n user?.['firstName'],\n user?.['firstname'],\n user?.['displayName'],\n user?.['name'],\n user?.['username']\n ].find(value => typeof value === 'string' && value.trim());\n\n if (typeof preferredName !== 'string') {\n return initialMessage;\n }\n\n const firstName = preferredName\n .trim()\n .split(/\\s|@/)[0];\n\n if (!firstName) {\n return initialMessage;\n }\n\n if (initialMessage.startsWith('Hi!')) {\n return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);\n }\n\n return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);\n }\n\n private getConfiguredUser(): Partial<AssistantUser> | undefined {\n const configuredUser = this.user ?? this.defaultConfig.user;\n return typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\n }\n\n private createSupportTicketForm(\n user?: Partial<AssistantUser>\n ): SupportTicketFormValue {\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n subject: '',\n query: '',\n severity: null,\n tags: []\n };\n }\n\n private createFeedbackForm(responseMessage?: AssistantMessage): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\n category: 'suggestion',\n query: conversation.query,\n assistantResponse: conversation.assistantResponse,\n feedback: ''\n };\n }\n\n private getConversationPair(responseMessage: AssistantMessage): {\n query: string;\n assistantResponse: string;\n } {\n const messages = this.messages();\n const responseIndex = messages.findIndex(message => message.id === responseMessage.id);\n let precedingUserIndex = -1;\n for (let index = responseIndex - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === 'user') {\n precedingUserIndex = index;\n break;\n }\n }\n\n return {\n query: messages[precedingUserIndex]?.content ?? '',\n assistantResponse: responseMessage.content\n };\n }\n\n private getUserText(\n user: Partial<AssistantUser> | undefined,\n keys: string[]\n ): string {\n const value = keys\n .map(key => user?.[key])\n .find(field => typeof field === 'string' && field.trim());\n return typeof value === 'string' ? value.trim() : '';\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app ?? response.product,\n response.productLabel,\n response.apiModule ?? response.contextResolution?.moduleKey,\n response.confidence ?? response.contextResolution?.confidence,\n response.parameters ?? response.entities,\n response.apiCalls ?? this.getToolApiCalls(response),\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse,\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: AssistantSuggestion[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n apiResult?: AssistantFieldMap,\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse,\n status?: AssistantChatResponse['status'],\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n apiResult,\n mockResult,\n llmUsed,\n availableModules,\n status,\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n const grid = this.getDisplayTables(provided, response);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? response.apiResult,\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\n grid,\n tables: grid,\n helpGuide: this.typedHelpGuide(provided.helpGuide),\n searchResults: provided.searchResults,\n visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\n markdown: provided.markdown\n };\n }\n\n private typedHelpGuide(\n guide: AssistantHelpGuide | undefined\n ): AssistantHelpGuide | undefined {\n return guide?.kind === 'analytics' || guide?.kind === 'action'\n ? undefined\n : guide;\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\n }];\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(question = ''): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return this.sessionState.history(messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .map(message => ({\n role: message.role,\n content: message.content,\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n })), question);\n }\n\n private scrollToLatest() {\n if (this.scrollToLatestTimer) {\n clearTimeout(this.scrollToLatestTimer);\n }\n this.scrollToLatestTimer = setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n this.scrollToLatestTimer = undefined;\n });\n }\n\n private scrollToMessage(messageId: string) {\n setTimeout(() => {\n const viewport = this.messagesViewport?.nativeElement;\n const message = viewport?.querySelector<HTMLElement>(\n `[data-message-id=\"${messageId}\"]`\n );\n if (!viewport || !message) {\n return;\n }\n const viewportTop = viewport.getBoundingClientRect().top;\n const messageTop = message.getBoundingClientRect().top;\n const paddingTop = Number.parseFloat(getComputedStyle(viewport).paddingTop) || 0;\n viewport.scrollTop = Math.max(\n 0,\n viewport.scrollTop + messageTop - viewportTop - paddingTop\n );\n });\n }\n}\n","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <img\n class=\"max-assistant-sparkles\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n aria-hidden=\"true\"\n >\n <div class=\"assistant-identity\">\n <div class=\"assistant-name-row\">\n <h2 class=\"assistant-name\">\n <img\n class=\"assistant-wordmark\"\n src=\"assets/max/max-ai-wordmark-styled-gradient.png\"\n [alt]=\"uiCopy.title\"\n >\n </h2>\n <span class=\"assistant-beta-tag\">Beta</span>\n </div>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n >\n <i class=\"header-action-icon pi pi-refresh\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n [pTooltip]=\"uiCopy.closeTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"requestClose()\"\n >\n <i class=\"header-action-icon pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [attr.data-message-id]=\"message.id\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError && !message.isOffline && !message.isAccessUnavailable\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isAccessUnavailable) {\n <section class=\"assistant-offline assistant-access-unavailable\" role=\"status\" aria-live=\"polite\">\n <svg class=\"assistant-offline-art\" viewBox=\"0 0 200 160\" role=\"img\" [attr.aria-label]=\"uiCopy.accessUnavailableTitle\" focusable=\"false\">\n <ellipse class=\"offline-shadow\" cx=\"100\" cy=\"143\" rx=\"52\" ry=\"6\" />\n <path class=\"offline-cloud-body\" d=\"M100 16 151 36v39c0 31-24 49-51 61-27-12-51-30-51-61V36Z\" />\n <path d=\"M84 73V60a16 16 0 0 1 32 0v13\" />\n <path class=\"offline-plug\" d=\"M77 73h46v37H77Z\" />\n <path d=\"M100 86v11\" />\n </svg>\n <p>{{ message.content }}</p>\n <p-button label=\"Continue in Maxtime\" severity=\"secondary\" [outlined]=\"true\" (onClick)=\"requestClose()\" />\n </section>\n } @else if(message.isOffline) {\n <section class=\"assistant-offline\" role=\"status\" aria-live=\"polite\">\n <svg class=\"assistant-offline-art\" viewBox=\"0 0 200 160\" role=\"img\" [attr.aria-label]=\"uiCopy.offlineTitle\" focusable=\"false\">\n <ellipse class=\"offline-shadow\" cx=\"100\" cy=\"143\" rx=\"61\" ry=\"6\" />\n <g class=\"offline-cloud\">\n <path class=\"offline-cloud-body\" d=\"M61 86a23 23 0 0 1-3-46 32 32 0 0 1 61-9 27 27 0 0 1 20 55Z\" />\n <path class=\"offline-face\" d=\"M80 58q5 4 10 0m18 0q5 4 10 0M95 72h9\" />\n </g>\n <g class=\"offline-plug-left\">\n <path class=\"offline-cable\" d=\"M25 98v7q0 11 11 11h20\" />\n <path class=\"offline-plug\" d=\"M56 107h15v18H56q-5 0-5-5v-8q0-5 5-5Z\" />\n <path class=\"offline-cable\" d=\"M71 111h8m-8 10h8\" />\n </g>\n <g class=\"offline-plug-right\">\n <path class=\"offline-cable\" d=\"M174 98v7q0 11-11 11h-20\" />\n <path class=\"offline-plug\" d=\"M143 107h-15v18h15q5 0 5-5v-8q0-5-5-5Z\" />\n <path class=\"offline-cable\" d=\"M132 113v6\" />\n </g>\n <g class=\"offline-disconnected\" aria-hidden=\"true\">\n <path d=\"m101 105-5 22m-9-23-3-5m29 5 3-5\" />\n </g>\n </svg>\n <p>{{ message.content }}</p>\n <p-button label=\"Continue in Maxtime\" severity=\"secondary\" [outlined]=\"true\" (onClick)=\"requestClose()\" />\n </section>\n } @else if(message.isStreaming && !message.displayResponse && !message.cards?.length) {\n <div class=\"assistant-processing\" aria-label=\"Max AI activity\">\n @if(!message.streamingContent) {\n <p class=\"assistant-processing-update active\">\n <span class=\"assistant-processing-sparkles\" aria-hidden=\"true\">\n @for (star of ['main', 'upper', 'lower', 'small']; track star) {\n <img\n class=\"assistant-processing-star {{ star }}\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n >\n }\n </span>\n <span>{{ message.content }}</span>\n </p>\n }\n @if(message.streamingContent) {\n <div class=\"assistant-streaming-answer assistant-markdown\">\n <span class=\"assistant-streaming-answer-text\">{{ message.streamingContent }}</span>\n <span class=\"assistant-streaming-cursor\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n } @else if(message.displayResponse; as responseDetails) {\n @if(responseDetails.helpGuide; as guide) {\n <section\n class=\"assistant-help-guide\"\n [class.assistant-information-guide]=\"isContentGuide(guide.kind)\"\n [class.assistant-continuation-guide]=\"guide.continuation\"\n [attr.aria-label]=\"helpGuideLabel(guide.kind)\"\n >\n @if(!guide.continuation) {\n <header class=\"assistant-help-heading\">\n <span class=\"assistant-help-topic-icon\" aria-hidden=\"true\">\n <i [class]=\"helpIcon(guide.icon)\"></i>\n </span>\n <div>\n <span class=\"assistant-help-eyebrow\">\n {{ helpGuideLabel(guide.kind) }}\n </span>\n <h3>{{ guide.title }}</h3>\n </div>\n </header>\n }\n\n @if(guide.summary) {\n <p class=\"assistant-help-summary\">{{ guide.summary }}</p>\n }\n\n @if(guide.content) {\n <div\n class=\"assistant-help-content assistant-information-content assistant-markdown\"\n [innerHTML]=\"guide.content | maxAssistantMarkdown: helpGuideMarkdownVariant(guide.kind)\"\n ></div>\n }\n\n @if(guide.steps.length) {\n <section class=\"assistant-help-section assistant-help-steps\">\n <h4>Steps to follow</h4>\n <ol>\n @for(step of guide.steps; track $index) {\n <li>{{ step }}</li>\n }\n </ol>\n </section>\n }\n\n @if(guide.tips?.length) {\n <aside class=\"assistant-help-callout assistant-help-tips\">\n <i class=\"pi pi-lightbulb\" aria-hidden=\"true\"></i>\n <div>\n <h4>Good to know</h4>\n <ul>\n @for(tip of guide.tips ?? []; track $index) {\n <li>{{ tip }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.restrictions?.length) {\n <aside class=\"assistant-help-callout assistant-help-restrictions\">\n <i class=\"pi pi-info-circle\" aria-hidden=\"true\"></i>\n <div>\n <h4>Keep in mind</h4>\n <ul>\n @for(restriction of guide.restrictions ?? []; track $index) {\n <li>{{ restriction }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.accessNote) {\n <p class=\"assistant-help-access\">\n <i class=\"pi pi-lock\" aria-hidden=\"true\"></i>\n <span>{{ guide.accessNote }}</span>\n </p>\n }\n\n @if(guide.navigation; as navigation) {\n <div class=\"assistant-help-navigation-row\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n class=\"assistant-help-navigation\"\n [label]=\"navigation.label\"\n [icon]=\"helpIcon(guide.icon)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(navigation.hostAction)\"\n ></button>\n </div>\n }\n </section>\n } @else if(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n }\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <span class=\"assistant-card-title\">{{ card.title }}</span>\n @if(card.subtitle) {\n <span class=\"assistant-card-subtitle\">{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [class.assistant-card-metric-wide]=\"isListMetric(metric)\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span class=\"assistant-card-label\">{{ metric.label }}</span>\n <span class=\"assistant-card-value\">{{ metric.value }}</span>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(responseDetails.searchResults?.length) {\n <div class=\"assistant-cards assistant-search-results\" aria-label=\"Search results\">\n @for(result of responseDetails.searchResults ?? []; track $index) {\n <section class=\"assistant-card assistant-search-result\">\n <header>\n <i\n class=\"assistant-search-result-icon\"\n [class]=\"searchResultIcon(result.type)\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"assistant-search-result-copy\">\n <strong>{{ result.title }}</strong>\n <span>{{ result.type }}</span>\n </div>\n </header>\n <div class=\"suggestions\" aria-label=\"Available destinations\">\n @for(action of result.actions; track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"action.label\"\n [icon]=\"searchActionIcon(action)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(action.hostAction)\"\n ></button>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <header class=\"assistant-export-heading\">\n <h3>{{ visualisation.title }}</h3>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-pdf\"\n icon=\"pi pi-file-pdf\"\n [attr.aria-label]=\"'Export ' + visualisation.title + ' as PDF'\"\n (click)=\"exportVisualisation(visualisation, chartCanvas)\"\n ></button>\n </header>\n <div\n #chartCanvas\n class=\"assistant-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n [style.height.px]=\"chartHeight(visualisation)\"\n >\n <p-chart\n class=\"assistant-prime-chart\"\n [type]=\"chartType(visualisation)\"\n [data]=\"chartData(visualisation)\"\n [options]=\"chartOptions(visualisation)\"\n ></p-chart>\n </div>\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index; let tableIndex = $index) {\n <section class=\"assistant-table-section\">\n <header class=\"assistant-export-heading\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-excel\"\n icon=\"pi pi-file-excel\"\n [attr.aria-label]=\"'Export ' + (table.title || 'results') + ' to Excel'\"\n (click)=\"exportTable(table)\"\n ></button>\n </header>\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @if(table.pagination) {\n <th>SL. No</th>\n }\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @if(table.pagination) {\n <td>{{ rowIndex + 1 }}</td>\n }\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n @if(table.pagination; as pagination) {\n <footer class=\"assistant-table-pagination\">\n <span>{{ tablePageStatus(table) }}</span>\n @if(hasNextTablePage(table)) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-table-page-action\"\n icon=\"pi pi-arrow-down\"\n [label]=\"nextTablePageLabel(pagination)\"\n [loading]=\"isTablePageLoading(message.id, tableIndex)\"\n [disabled]=\"isSending()\"\n (click)=\"retrieveNextTablePage(message, table, tableIndex)\"\n ></button>\n }\n </footer>\n @if(tablePageError(message.id, tableIndex); as pageError) {\n <p class=\"assistant-table-page-error\" role=\"alert\">{{ pageError }}</p>\n }\n }\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n @if(traceField(step.input, 'sql'); as sql) {\n <div class=\"trace-tool-call trace-sql-query\">\n <span>SQL sent to MySQL MCP</span>\n <strong>{{ formatTraceScalar(traceField(step.input, 'toolName')) }}</strong>\n <pre>{{ formatTraceScalar(sql) }}</pre>\n </div>\n }\n @if(traceField(step.input, 'method') || traceField(step.input, 'path')) {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n }\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n @if(traceField(step.input, 'sql') && step.output !== undefined) {\n <section><span>MySQL MCP execution details</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n @if(isWelcomeState(message)) {\n <button\n type=\"button\"\n class=\"support-welcome-card\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <span class=\"support-welcome-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <span class=\"support-welcome-copy\">\n <strong>Raise a support ticket</strong>\n <small>Send details directly to our support team.</small>\n </span>\n <i class=\"support-welcome-arrow pi pi-arrow-right\" aria-hidden=\"true\"></i>\n </button>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n @if(hasCapabilitySuggestions(message.suggestions)) {\n <div class=\"capability-options\" aria-label=\"Available Maxtime capabilities\">\n @for(group of capabilitySuggestionGroups(message.suggestions); track group.section) {\n <section class=\"capability-option-section\">\n <h3>{{ group.section }}</h3>\n <div class=\"capability-option-grid\">\n @for(suggestion of group.options; track suggestion.structuredAction?.capabilityKey ?? suggestion.label; let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose capability: ' + suggestion.label\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestion.label }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </section>\n }\n </div>\n } @else if(hasOptionCardSuggestions(message.suggestions, message.status)) {\n <div class=\"clarification-options\" aria-label=\"Clarification options\">\n <div class=\"capability-option-grid clarification-option-grid\">\n @for(suggestion of optionCardSuggestions(message.suggestions, message.status); track suggestionLabel(suggestion); let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card clarification-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose option: ' + suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestionLabel(suggestion) }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n } @else if(hasEntitySuggestions(message.suggestions)) {\n <div class=\"entity-options\" aria-label=\"Matching options\">\n @for(suggestion of entitySuggestionOptions(message.suggestions); track suggestion.entity.id ?? suggestion.label) {\n <max-agent-entity-option\n [entity]=\"suggestion.entity\"\n [disabled]=\"isSending()\"\n (selected)=\"useSuggestion(suggestion)\"\n ></max-agent-entity-option>\n }\n </div>\n } @else {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n }\n @if(message.role === 'assistant' && !isWelcomeMessage(message) && !message.isStreaming && !message.isOffline && !message.isAccessUnavailable) {\n <div class=\"response-actions\">\n <button\n type=\"button\"\n class=\"response-feedback-action\"\n [attr.aria-label]=\"uiCopy.feedbackLabel\"\n [pTooltip]=\"uiCopy.feedbackTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"openFeedback(message)\"\n >\n <i class=\"pi pi-comment\" aria-hidden=\"true\"></i>\n </button>\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Developer Trace' : 'Show Developer Trace' }}\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <footer class=\"assistant-footer\">\n @if(hasConversationStarted()) {\n <button\n type=\"button\"\n class=\"support-ticket-shortcut\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <i class=\"far fa-user-headset\" aria-hidden=\"true\"></i>\n <span>Raise a support ticket</span>\n </button>\n }\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n #composerInput\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </footer>\n </section>\n\n @if(supportTicketVisible()) {\n <section class=\"support-ticket-overlay\" aria-label=\"Support ticket form\">\n <div\n class=\"support-ticket-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"supportTicketTitle\"\n >\n <header class=\"support-ticket-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <div>\n <h2 id=\"supportTicketTitle\">Raise a support ticket</h2>\n <p>Share the details and our support team will take it from here.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close\"\n aria-label=\"Close support ticket form\"\n (click)=\"closeSupportTicket()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(supportTicketSubmissionFailed()) {\n <div class=\"support-ticket-error-page\" role=\"alert\">\n <span class=\"support-ticket-error-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-times-circle\"></i>\n </span>\n <h3>Ticket could not be created</h3>\n <p>{{ supportTicketError() }}</p>\n <button\n pButton\n type=\"button\"\n label=\"Close\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else if(supportTicketResult(); as result) {\n <div class=\"support-ticket-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Ticket raised</h3>\n <p>{{ result.message }}</p>\n @if(result.ticketReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n }\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form\" (ngSubmit)=\"submitSupportTicket()\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"supportName\"\n autocomplete=\"name\"\n [value]=\"supportTicketForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"supportEmail\"\n autocomplete=\"email\"\n [value]=\"supportTicketForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"supportPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"supportTicketForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Severity</span>\n <p-select\n inputId=\"supportSeverity\"\n name=\"supportSeverity\"\n [options]=\"supportSeverities()\"\n optionLabel=\"label\"\n [fluid]=\"true\"\n [loading]=\"supportSeverities().length === 0\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n <ng-template #item let-severity>\n <p-tag\n class=\"support-severity-option\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Tags</span>\n <p-multiselect\n inputId=\"supportTags\"\n name=\"supportTags\"\n placeholder=\"Select relevant areas\"\n [options]=\"supportTags()\"\n optionLabel=\"label\"\n dataKey=\"id\"\n display=\"chip\"\n [filter]=\"true\"\n filterBy=\"label\"\n [showToggleAll]=\"false\"\n [loading]=\"supportTagsLoading()\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.tags\"\n >\n <ng-template #selecteditems let-selectedTags>\n <span class=\"support-selected-tags\">\n @for(tag of selectedTags; track tag.id) {\n <p-tag\n class=\"support-selected-tag\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n }\n </span>\n </ng-template>\n <ng-template #item let-tag>\n <p-tag\n class=\"support-tag-option\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-multiselect>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Subject</span>\n <input\n type=\"text\"\n name=\"supportSubject\"\n maxlength=\"200\"\n placeholder=\"Summarise the issue\"\n required\n [(ngModel)]=\"supportTicketForm.subject\"\n />\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>How can we help?</span>\n <textarea\n #supportQueryInput\n pTextarea\n name=\"supportQuery\"\n rows=\"5\"\n placeholder=\"Describe the issue, what you expected, and anything you've already tried.\"\n required\n [(ngModel)]=\"supportTicketForm.query\"\n ></textarea>\n </label>\n </div>\n\n @if(!supportTicketForm.name || !supportTicketForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(supportTicketError(); as supportError) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ supportError }}</p>\n }\n\n <div class=\"support-ticket-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeSupportTicket()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Submit ticket\"\n icon=\"pi pi-send\"\n [loading]=\"supportTicketSubmitting()\"\n [disabled]=\"!canSubmitSupportTicket()\"\n ></button>\n </div>\n </form>\n }\n </div>\n </section>\n }\n\n @if(feedbackVisible()) {\n <section\n class=\"support-ticket-overlay feedback-overlay\"\n aria-label=\"Feedback form\"\n >\n <div\n class=\"support-ticket-dialog feedback-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"feedbackTitle\"\n >\n <header class=\"support-ticket-header feedback-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-comment\"></i>\n </span>\n <div>\n <h2 id=\"feedbackTitle\">Help Max improve</h2>\n <p>Tell us what Max could do better.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close feedback-close\"\n aria-label=\"Close feedback form\"\n (click)=\"closeFeedback()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(feedbackResult(); as result) {\n <div class=\"support-ticket-success feedback-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>We value your feedback</h3>\n <p>{{ result.message }}</p>\n @if(result.feedbackReference; as feedbackReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ feedbackReference }}</strong>\n </div>\n }\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeFeedback()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form feedback-form\" (ngSubmit)=\"submitFeedback()\">\n <div class=\"feedback-form-body\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Feedback type</span>\n <p-select\n inputId=\"feedbackCategory\"\n name=\"feedbackCategory\"\n [options]=\"feedbackCategoryOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"feedbackForm.category\"\n ></p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Your query</span>\n <textarea\n pTextarea\n name=\"feedbackQuery\"\n rows=\"2\"\n placeholder=\"Enter the question or request you gave Max.\"\n readonly\n required\n [(ngModel)]=\"feedbackForm.query\"\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Assistant response <small>Added automatically when available</small></span>\n <textarea\n pTextarea\n name=\"feedbackAssistantResponse\"\n rows=\"3\"\n placeholder=\"No assistant response is available yet.\"\n [value]=\"feedbackForm.assistantResponse\"\n readonly\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>What could be improved?</span>\n <textarea\n #feedbackInput\n pTextarea\n name=\"feedbackDetails\"\n rows=\"3\"\n placeholder=\"Tell us what you expected, what was missing, or how the response could be more useful.\"\n required\n [(ngModel)]=\"feedbackForm.feedback\"\n ></textarea>\n </label>\n </div>\n\n @if(feedbackError(); as error) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ error }}</p>\n }\n </div>\n\n <footer class=\"support-ticket-actions feedback-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeFeedback()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Send feedback\"\n icon=\"pi pi-send\"\n [loading]=\"feedbackSubmitting()\"\n [disabled]=\"!canSubmitFeedback()\"\n ></button>\n </footer>\n </form>\n }\n </div>\n </section>\n }\n</aside>\n","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/components/assistant/max-assistant-feedback.service';\nexport * from './lib/components/assistant/max-assistant.service';\nexport * from './lib/components/assistant/max-assistant-support.service';\nexport * from './lib/components/entity-option/max-agent-entity-option.component';\nexport * from './lib/components/shift-card/max-agent-shift-card.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;MACa,0BAA0B,CAAA;AAC5B,IAAA,aAAa,GAAG,IAAI,OAAO,EAAQ;AAC5C,IAAA,KAAK;AACG,IAAA,QAAQ;IAEhB,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;IACxB;AAEA,IAAA,MAAM,CAAC,QAA+B,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,iBAAiB,EAAE,MAAM,IAAI,QAAQ,CAAC,iBAAiB,CAAC,MAAM,IAAI;cACpF,QAAQ,CAAC,iBAAiB,GAAG,SAAS;IAC5C;AAEA,IAAA,eAAe,CAAC,QAAgB,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;AACzE,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,OAAO,CAAC,QAAwC,EAAE,QAAQ,GAAG,EAAE,EAAA;QAC7D,IAAI,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5H,YAAA,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK;AAC3E,gBAAA,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG;AAC9G,aAAA,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACvI,IAAI,KAAK,CAAC,MAAM;gBAAE,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAChF,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9G;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,IAAI,SAAS,GAAG,KAAK;QACrB,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,IAAG;YAC5C,IAAI,OAAO,GAAG,EAAE;YAChB,IAAI,KAAK,GAAG,CAAC;AACb,YAAA,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE;gBACvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;gBAC7C,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;oBAAE;gBAC/C,OAAO,IAAI,SAAS;gBACpB,KAAK,IAAI,IAAI;YACf;YACA,SAAS,IAAI,KAAK;AAClB,YAAA,OAAO,OAAO,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE;AACjD,QAAA,CAAC,CAAC,CAAC,OAAO,EAAE;IACd;AACD;;AC5CD,MAAM,eAAe,GAAG,QAAQ;AAChC,MAAM,mBAAmB,GACvB,6TAA6T;AAE/T,MAAM,2BAA2B,GAA6B;AAC5D,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,kBAAkB,EAAE;CACrB;AAED,MAAM,0BAA0B,GAA6C;AAC3E,IAAA,MAAM,EAAE;AACN,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB;CACF;AAEK,SAAU,2BAA2B,CAAC,GAAsB,EAAA;IAChE,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,2BAA2B;IACpC;AAEA,IAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC,IAAI,2BAA2B;AAC1E;;MCpBa,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB,EACtB;AACE,IAAA,OAAO,EAAE,OAAO,EAAE;AACnB,CAAA;;MClBU,wBAAwB,CAAA;AACnC,IAAA,SAAS,CACP,KAAgC,EAChC,OAAA,GAAqC,SAAS,EAAA;QAE9C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;;;;QAKA,MAAM,YAAY,GAAG;AAClB,aAAA,UAAU,CAAC,GAAG,EAAE,OAAO;AACvB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM;AACtB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;AAE1B,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;AAC1C,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,GAAG,EAAE;AACN,SAAA,CAAC;QAEF,OAAO,OAAO,KAAK;cACf,QAAQ,CAAC,UAAU,CACjB,MAAM,EACN,gEAAgE;cAElE,QAAQ;IACd;wGA7BW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sBAAsB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACP,iBAAA;;;MCIY,0BAA0B,CAAA;AACV,IAAA,KAAK;IACvB,OAAO,GAA6B,MAAM;AAEnD,IAAA,IAAc,WAAW,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACtC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,4CAA4C,CAAC,IAAI,CAAC,KAAK;cAC1D,CAAA,CAAA,EAAI,KAAK,CAAA;cACT,KAAK;IACX;AAEA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,KAAK;cAC/B,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,UAAU;QACnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACzC,QAAA,OAAO,KAAK,IAAI,GAAG,GAAG,GAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,GAAG,KAAK,IAAI,GAAG,IAAI,SAAS;IACvE;AAEA,IAAA,IAAc,eAAe,GAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;AACjD,QAAA,OAAO;AACL,cAAE,CAAA,EAAG,KAAK,CAAA,WAAA,EAAc,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;cAC5C,iBAAiB;IACvB;AAEA,IAAA,IAAc,SAAS,GAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC;AACvC,QAAA,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;IACjD;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;IAClD;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QAC1C,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;IACjE;wGA/CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,gICXvC,swCAkCA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA,CAAA;;4FDvBa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,swCAAA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA;;sBAK/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;;AETH,MAAM,YAAY,GAAyE;AACzF,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,QAAQ,EAAE,kBAAkB;AAC5B,IAAA,QAAQ,EAAE,iBAAiB;AAC3B,IAAA,UAAU,EAAE,gBAAgB;AAC5B,IAAA,MAAM,EAAE,WAAW;CACpB;MAQY,6BAA6B,CAAA;AACb,IAAA,MAAM;IACxB,QAAQ,GAAG,KAAK;AAEf,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AAE7C,IAAA,IAAc,QAAQ,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;IACzE;AAEA,IAAA,IAAc,WAAW,GAAA;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;IAC3C;AAEA,IAAA,IAAc,QAAQ,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC;aAChB,KAAK,CAAC,MAAM;aACZ,MAAM,CAAC,OAAO;AACd,aAAA,KAAK,CAAC,CAAC,EAAE,CAAC;AACV,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE;aAC1C,IAAI,CAAC,EAAE,CAAC;IACb;AAEA,IAAA,IAAc,WAAW,GAAA;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/C;AAEA,IAAA,IAAc,eAAe,GAAA;QAC3B,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IACnD;AAEA,IAAA,IAAc,UAAU,GAAA;QACtB,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW;IACtD;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB;IACF;AAEQ,IAAA,cAAc,CAAC,KAAyB,EAAA;AAC9C,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE;QAC3B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,GAAG,KAAK;IAC7D;wGA/CW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,0KCnB1C,4jCAiCA,EAAA,MAAA,EAAA,CAAA,u3DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDda,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;+BACE,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4jCAAA,EAAA,MAAA,EAAA,CAAA,u3DAAA,CAAA,EAAA;;sBAG9C,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBAEA;;;AErBI,MAAM,wBAAwB,GAAG;AACtC,IAAA,WAAW,EAAE,oBAAoB;AACjC,IAAA,UAAU,EAAE;CACJ;AAEH,MAAM,4BAA4B,GAAG;AAC1C,IAAA,WAAW,EAAE,wBAAwB;AACrC,IAAA,UAAU,EAAE;CACJ;SAEM,0BAA0B,CAAC,eAAe,GAAG,SAAS,EAAE,EAAA;AACtE,IAAA,OAAO;UACH,wBAAwB,CAAC;AAC3B,UAAE,wBAAwB,CAAC,UAAU;AACzC;SAEgB,8BAA8B,CAAC,eAAe,GAAG,SAAS,EAAE,EAAA;AAC1E,IAAA,OAAO;UACH,4BAA4B,CAAC;AAC/B,UAAE,4BAA4B,CAAC,UAAU;AAC7C;;ACFA,MAAM,WAAW,GAAG,QAAQ;AAC5B,MAAM,gBAAgB,GAAG,KAAK;AAC9B,MAAM,sBAAsB,GAAG,MAAM;MAKxB,mBAAmB,CAAA;AAEmB,IAAA,MAAA;AAClB,IAAA,IAAA;IAF/B,WAAA,CACiD,MAA0B,EAC5C,IAAuB,EAAA;QADL,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAChC;AAEH,IAAA,WAAW,CACT,OAAe,EACf,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,YAAoC,EACpC,OAAA,GAA0C,EAAE,EAC5C,UAAsD,EAAA;QAEtD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;AACjD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;AACP,YAAA,IAAI,UAAU,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC/B,YAAA,IAAI,YAAY,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;SACzC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;IAC/D;IAEA,aAAa,CACX,QAAgB,EAChB,QAA2C,EAC3C,cAAsB,EACtB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;AAE5C,QAAA,OAAO,IAAI,CAAC,WAAW,CACrB,QAAQ,KAAK,SAAS,GAAG,gBAAgB,GAAG,eAAe,EAC3D,cAAc,EACd,MAAM,EACN,EAAE,QAAQ,EAAE,QAAQ,EAAE,EACtB,OAAO,CACR;IACH;IAEA,oBAAoB,CAClB,OAAe,EACf,MAAiC,EACjC,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;QAE5C,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;AACjD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;YACP,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC/B,YAAA,gBAAgB,EAAE;SACnB;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD;IAEA,qBAAqB,CACnB,OAAe,EACf,aAAqC,EACrC,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;QAE5C,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;AACjD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;YACP,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AACzB,YAAA,IAAI,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAC/B;SACD;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD;AAEQ,IAAA,WAAW,CACjB,OAA6B,EAC7B,MAA0B,EAC1B,UAAsD,EAAA;QAEtD,OAAO,GAAG,EAAE,GAAG,OAAO;AACpB,YAAA,IAAI,MAAM,CAAC,wBAAwB,GAAG,EAAE,wBAAwB,EAAE,MAAM,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC;YACzG,IAAI,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,iBAAiB,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE;SAC9G;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,IAAI,UAAU,EAAE;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EACvB,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CACrC;IACH;AAEQ,IAAA,aAAa,CACnB,OAA6B,EAC7B,MAA0B,EAC1B,UAAqD,EAAA;AAErD,QAAA,OAAO,IAAI,UAAU,CAAC,UAAU,IAAG;AACjC,YAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;YACxC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,KAAK,IAAI,iBAAiB,CAAC;AAC3E,gBAAA,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxB,MAAM,EAAE,IAAI,KAAK,iBAAiB,GAAG,GAAG,GAAG,GAAG;AAC9C,gBAAA,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;AAC5B,aAAA,CAAC;AACF,YAAA,IAAI,SAAwC;YAC5C,MAAM,cAAc,GAAG,MAAK;gBAC1B,YAAY,CAAC,SAAS,CAAC;AACvB,gBAAA,SAAS,GAAG,UAAU,CAAC,MAAK;oBAC1B,UAAU,CAAC,KAAK,CAAC,WAAW,CAC1B,gEAAgE,EAChE,iBAAiB,CAClB,CAAC;oBACF,UAAU,CAAC,KAAK,EAAE;gBACpB,CAAC,EAAE,sBAAsB,CAAC;AAC5B,YAAA,CAAC;AACD,YAAA,cAAc,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACvC,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5D;YAED,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAClC,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC;AACpB,aAAA,CAAC,CAAC,IAAI,CAAC,OAAM,QAAQ,KAAG;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,oBAAA,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC1D,MAAM,IAAI,iBAAiB,CAAC;wBAC1B,KAAK;wBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,GAAG,EAAE,QAAQ,CAAC;AACf,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,oBAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;gBACnE;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,IAAI,MAAM,GAAG,EAAE;gBACf,IAAI,cAAc,GAAG,KAAK;AAE1B,gBAAA,MAAM,WAAW,GAAG,CAAC,IAAY,KAAI;oBACnC,IAAI,UAAU,CAAC,MAAM;wBAAE;AACvB,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC/B,IAAI,CAAC,WAAW,EAAE;wBAChB;oBACF;oBAEA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA6B;AACjE,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;wBAC7B,UAAU,CAAC,KAAK,CAAC;wBACjB;oBACF;AACA,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;wBACnD,UAAU,CAAC,KAAK,CAAC;wBACjB;oBACF;AACA,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,wBAAA,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB,CAAC;oBAClE;AAEA,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;wBAC3B,cAAc,GAAG,IAAI;AACrB,wBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;wBAC/B,UAAU,CAAC,QAAQ,EAAE;oBACvB;AACF,gBAAA,CAAC;gBAED,OAAO,IAAI,EAAE;oBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;oBAC3C,IAAI,IAAI,EAAE;wBACR;oBACF;AAEA,oBAAA,cAAc,EAAE;AAChB,oBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,oBAAA,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AAC1B,oBAAA,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AAC1B,oBAAA,IAAI,cAAc,IAAI,UAAU,CAAC,MAAM,EAAE;wBACvC;oBACF;gBACF;AAEA,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC1B,WAAW,CAAC,MAAM,CAAC;gBAEnB,IAAI,CAAC,cAAc,EAAE;AACnB,oBAAA,MAAM,WAAW,CACf,+EAA+E,EAC/E,oBAAoB,CACrB;gBACH;gBAEA,UAAU,CAAC,QAAQ,EAAE;AACvB,YAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACf,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACtB,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK;AAC/B,0BAAE,WAAW,CACT,+EAA+E,EAC/E,oBAAoB;0BAEtB,KAAK,CAAC;gBACZ;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAK;gBACV,YAAY,CAAC,SAAS,CAAC;gBACvB,UAAU,CAAC,KAAK,EAAE;AACpB,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,0BAA0B,EAAE;IACvE;AAEQ,IAAA,MAAM,CAAC,MAA0B,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,GAAG,IAAI,WAAW;IAClC;AAEQ,IAAA,OAAO,CAAC,MAA0B,EAAA;AACxC,QAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AACrC,YAAA,OAAO,MAAM,CAAC,IAAI,EAAE;QACtB;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE;IAC1B;AAEQ,IAAA,cAAc,CACpB,MAA0B,EAAA;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAC3C,QAAA,MAAM,IAAI,GAAG;YACX,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC;YACpD,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC;YAC5D,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK;SACtD;AAED,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS;IACxD;IAEQ,eAAe,CACrB,GAAQ,EACR,KAAyB,EAAA;QAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;AAC9C,YAAA,OAAO,EAAE;QACX;QAEA,OAAO,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,EAAuC;IACrE;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;AAC3C,QAAA,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK;AAC3C,cAAE,MAAM,CAAC,OAAO;AAChB,cAAE,MAAM,CAAC,OAAO;QAElB,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO;AACL,YAAA,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;YACzC,QAAQ,EAAE,UAAU,CAAC;AAChB,mBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC;mBACxC,gBAAgB;AACrB,YAAA,IAAI,UAAU,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YACjE,IAAI,UAAU,CAAC;AACb,kBAAE,EAAE,cAAc,EAAE,UAAU,CAAC,cAAc;kBAC3C,EAAE,CAAC;AACP,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3D,YAAA,IAAI,UAAU,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACrD,YAAA,IAAI,UAAU,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AACxD,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE;SAC3D;IACH;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AACrE,QAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK;AACzD,cAAE,MAAM,CAAC,cAAc;AACvB,cAAE,MAAM,CAAC,cAAc,IAAI,EAAE;AAE/B,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;AAC7D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;AAEjC,YAAA,IAAI,WAAW,IAAI,YAAY,EAAE;gBAC/B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D;AAEA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,aAAa,CAAC,MAA0B,EAAA;QAC9C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,CAAC,CAC5C;IACzB;AAEQ,IAAA,WAAW,CAAC,MAA0B,EAAA;AAC5C,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,MAAM;AACd,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;SAC7B;AAED,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,MAAM;QACf;QAEA,OAAO;AACL,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5B,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;AACvB;SACF;IACH;AAxWW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAEpB,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAFnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAGI,MAAM;2BAAC,oBAAoB;;0BAC3B;;;MCrBQ,yBAAyB,CAAA;IACpC,MAAM,kBAAkB,CAAC,KAA6B,EAAA;AACpD,QAAA,MAAM,IAAI,GAAG,MAAM,OAAO,MAAM,CAAC;AACjC,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;AAC1C,YAAA,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IACnB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACvE;SACF;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QAEtC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;AAC5D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAChC,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,IAAI,EAAE,OAAO;AACd,SAAA,CAAC;QACF,IAAI,CAAC,YAAY,CACf,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;AACf,YAAA,IAAI,EAAE,mEAAmE;AAC1E,SAAA,CAAC,EACF,CAAA,EAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,eAAe,CAAC,CAAA,KAAA,CAAO,CAC5D;IACH;AAEA,IAAA,MAAM,wBAAwB,CAC5B,aAAqC,EACrC,oBAAiC,EAAA;QAEjC,MAAM,MAAM,GAAG,oBAAoB,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC3D,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;QACpE;QAEA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,OAAO,CAAC;AACvC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,WAAW,GAAG,UAAU;AAC3E,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE;QACzD,MAAM,MAAM,GAAG,EAAE;QACjB,MAAM,YAAY,GAAG,SAAS,IAAI,MAAM,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,EAAE;AACnB,QAAA,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;AACpF,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK;AACvC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK;QACzC,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,UAAU,IAAI,CAAC;QAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,UAAU,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;AACpC,QAAA,IAAI,UAAkB;QAEtB,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB;;AAEzD,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC;AAC1E,YAAA,IAAI;AACF,gBAAA,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,EAAE,eAAe,CAAC;gBACnF,KAAK,CAAC,MAAM,EAAE;AACd,gBAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBACpB,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/C;oBAAU;AACR,gBAAA,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,kBAAkB;gBACnD,KAAK,CAAC,MAAM,EAAE;AACd,gBAAA,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACtB;QACF;aAAO;YACL,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C;AAEA,QAAA,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;AACrC,QAAA,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;AACxB,QAAA,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAC1E,QAAA,QAAQ,CAAC,QAAQ,CACf,UAAU,EACV,KAAK,EACL,MAAM,EACN,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,CACP;AAED,QAAA,IAAI,CAAC,YAAY,CACf,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EACvE,CAAA,EAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA,IAAA,CAAM,CACjE;IACH;AAEQ,IAAA,iBAAiB,CAAC,KAAsC,EAAA;QAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACnE;AAEA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;YACvE,OAAO,cAAc,KAAK;AACxB,kBAAE,IAAI,CAAC,SAAS,CAAC,KAAK;kBACpB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACpD;AAEA,QAAA,OAAO,KAAK;IACd;IAEQ,cAAc,CAAC,KAAyB,EAAE,QAAgB,EAAA;AAChE,QAAA,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,QAAQ;AAClC,aAAA,IAAI;AACJ,aAAA,iBAAiB;AACjB,aAAA,OAAO,CAAC,aAAa,EAAE,GAAG;AAC1B,aAAA,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAE1B,OAAO,UAAU,IAAI,QAAQ;IAC/B;IAEQ,YAAY,CAAC,IAAU,EAAE,QAAgB,EAAA;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAExC,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;wGA/HW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA;;4FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCKrB,2BAA2B,CAAA;AAKW,IAAA,MAAA;AAClB,IAAA,IAAA;IALtB,QAAQ,GAAG,8BAA8B,EAAE;IAC3C,MAAM,GAAG,MAAe;IAEjC,WAAA,CACiD,MAA0B,EAC5C,IAAuB,EAAA;QADL,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAChC;AAEH,IAAA,cAAc,CACZ,QAAkC,EAClC,MAAA,GAA6B,EAAE,EAAA;AAE/B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EACjC,QAAQ,EACR,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAC3C;IACH;AAEQ,IAAA,cAAc,CAAC,MAA0B,EAAA;QAC/C,MAAM,iBAAiB,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE;AACxD,QAAA,OAAO;cACH,iBAAiB,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW;cACnD,8BAA8B,EAAE;IACtC;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACjC,QAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK;AACzD,cAAE,MAAM,CAAC,cAAc;AACvB,cAAE,MAAM,CAAC,cAAc,IAAI,EAAE;QAC/B,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AAErE,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC/B,gBAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D;AACA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D;AACA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,OAAO,CAAC,MAA0B,EAAA;QACxC,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;IAC9E;AAEQ,IAAA,WAAW,CAAC,MAA0B,EAAA;AAC5C,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,CAAC;SACxF;AAED,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,MAAM;QACf;QAEA,OAAO;AACL,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5B,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;AACvB;SACF;IACH;AA7EW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,kBAK5B,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AALnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cADd,MAAM,EAAA,CAAA;;4FACnB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAM7B,MAAM;2BAAC,oBAAoB;;0BAC3B;;;MCJQ,0BAA0B,CAAA;AAMY,IAAA,MAAA;AAClB,IAAA,IAAA;IANtB,eAAe,GAAG,SAAS;IAC3B,YAAY,GAAG,qCAAqC;IACpD,kBAAkB,GAAG,0CAA0C;IAExE,WAAA,CACiD,MAA0B,EAC5C,IAAuB,EAAA;QADL,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAChC;IAEH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EACzD,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CACnD,CAAC,IAAI,CACJ,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;AAC3B,YAAA,GAAG,GAAG;AACN,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,QAAQ,EAAE;SACX,CAAC,CAAC,CAAC,CACL;IACH;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAC/D,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CACnD;IACH;AAEA,IAAA,YAAY,CACV,MAAqC,EACrC,MAAA,GAA6B,EAAE,EAAA;AAE/B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AAC7C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EACpD;YACE,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;SACzD,EACD;AACE,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;AACtC,YAAA,YAAY,EAAE;AACf,SAAA,CACF;AAED,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzE;AAEQ,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QACxC,OAAO;AACL,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,qGAAqG;AAC9G,YAAA,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW;SACpC;IACH;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACjC,QAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK;AACzD,cAAE,MAAM,CAAC,cAAc;AACvB,cAAE,MAAM,CAAC,cAAc,IAAI,EAAE;QAC/B,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AAErE,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;YAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC/B,gBAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D;AACA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D;AAEA,QAAA,OAAO,OAAO;IAChB;IAEQ,WAAW,CAAC,IAAY,EAAE,MAA0B,EAAA;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE;QACzC,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAA,CAAE,GAAG,IAAI;IAChE;AAEQ,IAAA,OAAO,CAAC,MAA0B,EAAA;QACxC,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE;IAC9E;AAEQ,IAAA,WAAW,CAAC,MAA0B,EAAA;AAC5C,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,MAAM;YACd,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,CAAC;SACxF;AAED,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;AAC7B,YAAA,OAAO,MAAM;QACf;QAEA,OAAO;AACL,YAAA,GAAG,MAAM;AACT,YAAA,IAAI,EAAE;AACJ,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5B,gBAAA,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;AACvB;SACF;IACH;AA/HW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,kBAM3B,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AANnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA;;4FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAO7B,MAAM;2BAAC,oBAAoB;;0BAC3B;;;ACoDL,MAAM,iBAAiB,GAAG;AACxB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,QAAQ,EAAE,4BAA4B;AACtC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,aAAa,EAAE,mCAAmC;AAClD,IAAA,eAAe,EAAE,kBAAkB;AACnC,IAAA,WAAW,EAAE,YAAY;AACzB,IAAA,eAAe,EAAE,wBAAwB;AACzC,IAAA,YAAY,EAAE,gGAAgG;AAC9G,IAAA,YAAY,EAAE,uBAAuB;AACrC,IAAA,sBAAsB,EAAE,sCAAsC;AAC9D,IAAA,wBAAwB,EAAE,iNAAiN;AAC3O,IAAA,cAAc,EAAE,uHAAuH;CACxI;AAED,MAAM,6BAA6B,GAAqC;AACtE,IAAA,QAAQ,EAAE,YAAY;AACtB,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,QAAQ,EAAE,kBAAkB;AAC5B,IAAA,QAAQ,EAAE,iBAAiB;AAC3B,IAAA,SAAS,EAAE,aAAa;AACxB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,OAAO,EAAE,cAAc;CACxB;AAED,MAAM,oBAAoB,GAAyD;AACjF,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,QAAQ,EAAE,qBAAqB;AAC/B,IAAA,QAAQ,EAAE,YAAY;AACtB,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,UAAU,EAAE,sBAAsB;AAClC,IAAA,SAAS,EAAE,aAAa;AACxB,IAAA,QAAQ,EAAE,eAAe;CAC1B;MA4CY,qBAAqB,CAAA;AAyGb,IAAA,gBAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;AACA,IAAA,cAAA;AACA,IAAA,UAAA;AAC8B,IAAA,aAAA;AA7GhC,IAAA,YAAY,GAAG,IAAI,0BAA0B,EAAE;AACzB,IAAA,gBAAgB;AAE/C,IAAA,yBAAyB;AAEzB,IAAA,mBAAmB;AAEV,IAAA,sBAAsB,GAAG,IAAI,OAAO,EAGlD;AAEc,IAAA,yBAAyB,GAAG,IAAI,OAAO,EAGrD;AAEiC,IAAA,aAAa;AAET,IAAA,iBAAiB;AAErB,IAAA,aAAa;AAExC,IAAA,GAAG;AAEH,IAAA,eAAe;AAEf,IAAA,IAAI;AAIJ,IAAA,OAAO;AAIP,IAAA,cAAc;IAId,uBAAuB,GAAG,IAAI;AAE7B,IAAA,UAAU,GAAG,IAAI,YAAY,EAAuB;AAEpD,IAAA,cAAc,GAAG,IAAI,YAAY,EAAQ;AAEhC,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AAEzB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAElB,IAAA,cAAc,GAAG,MAAM,CAAqB,SAAS,0DAAC;AAEtD,IAAA,QAAQ,GAAG,MAAM,CAAqB,EAAE,oDAAC;AAEzC,IAAA,wBAAwB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,oEAAC;AAEzE,IAAA,qBAAqB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,iEAAC;AAEtE,IAAA,gBAAgB,GAAG,MAAM,CAAqB,SAAS,4DAAC;AAExD,IAAA,eAAe,GAAG,MAAM,CAAmC,EAAE,2DAAC;AAE9D,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;AAE/B,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAElC,IAAA,cAAc,GAAG,MAAM,CAAwC,SAAS,0DAAC;AAEzE,IAAA,aAAa,GAAG,MAAM,CAAqB,SAAS,yDAAC;AAErD,IAAA,uBAAuB,GAGrC;AACH,QAAA,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;AACjD,QAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE;AACnD,QAAA,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;AACjD,QAAA,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE;AACtD,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;AAC5C,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;KACjC;AAES,IAAA,YAAY,GAAsB,IAAI,CAAC,kBAAkB,EAAE;AAElD,IAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AAEpC,IAAA,uBAAuB,GAAG,MAAM,CAAC,KAAK,mEAAC;AAEvC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAElC,IAAA,WAAW,GAAG,MAAM,CAAwB,EAAE,uDAAC;AAE/C,IAAA,iBAAiB,GAAG,MAAM,CAA6B,EAAE,6DAAC;AAE1D,IAAA,mBAAmB,GAAG,MAAM,CAC7C,SAAS,+DACV;AAEkB,IAAA,kBAAkB,GAAG,MAAM,CAAqB,SAAS,8DAAC;AAE1D,IAAA,6BAA6B,GAAG,MAAM,CAAC,KAAK,yEAAC;AAEtD,IAAA,iBAAiB,GAA2B,IAAI,CAAC,uBAAuB,EAAE;IAEpF,WAAA,CACmB,gBAAqC,EACrC,aAAwC,EACxC,eAA4C,EAC5C,cAA0C,EAC1C,UAAsB,EACQ,aAAiC,EAAA;QAL/D,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,UAAU,GAAV,UAAU;QACoB,IAAA,CAAA,aAAa,GAAb,aAAa;IAC3D;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC/C,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC1C,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;QACP,MAAM,cAAc,GAAG,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;QAC1H,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI;QAC3E,MAAM,IAAI,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE;QAChD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO;AAChE,QAAA,MAAM,OAAO,GAAG,OAAO,aAAa,KAAK,UAAU,GAAG,aAAa,EAAE,GAAG,aAAa;AACrF,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG;AACtF,YAAA,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;YACrH,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEA,IAAA,YAAY,KAAW,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;;AAItC,IAAA,UAAU,KAAW,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAExD,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,EAAE;IAC3C;AAEA,IAAA,IAAc,MAAM,GAAA;AAClB,QAAA,OAAO,iBAAiB;IAC1B;AAEA,IAAA,IAAc,eAAe,GAAA;AAC3B,QAAA,OAAO,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9C;AAEU,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AAClD,QAAA,QACE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,KAAK,WAAW;YAC5B,CAAC,OAAO,CAAC,eAAe;AACxB,YAAA,CAAC,OAAO,CAAC,WAAW;IAExB;AAEU,IAAA,cAAc,CAAC,OAAyB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACvE;IAGU,gBAAgB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAC/B,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE;YACxC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;YACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACnD;IACF;IAEU,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;AACjD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,yBAAyB,GAAG,SAAS;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;IACvB;AAEU,IAAA,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,EAAA;AAC1C,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;QAErC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACvC;QACF;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,GAA0B;AAC7C,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;SACrC;AACD,QAAA,MAAM,gBAAgB,GAAqB;YACzC,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAC/D,YAAA,WAAW,EAAE,IAAI;YACjB,iBAAiB,EAAE,CAAC,eAAe,CAAC;SACrC;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CACV,cAAc,EACd,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,SAAS,EACT,OAAO,EACP,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC;AAEvE,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,cAAc,CACjB,gBAAgB,CAAC,EAAE,EACnB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,gBAAgB,CAAC,EAAE,CAAC;gBACnF,IAAI,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AACtD,oBAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE;AACvC,wBAAA,GAAG,OAAO;AACV,wBAAA,OAAO,EAAE,qEAAqE;AAC9E,wBAAA,gBAAgB,EAAE,SAAS;AAC5B,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;oBACzB;gBACF;AACA,gBAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACxE,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,eAAe,CAAC,UAA+B,EAAA;AACvD,QAAA,OAAO,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK;IACvE;AAEU,IAAA,YAAY,CAAC,MAAwD,EAAA;AAC7E,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;IAC5E;IAEU,wBAAwB,CAChC,cAAqC,EAAE,EAAA;QAEvC,OAAO,WAAW,CAAC,IAAI,CACrB,UAAU,IACR,OAAO,UAAU,KAAK,QAAQ;AAC9B,YAAA,UAAU,CAAC,YAAY,KAAK,iBAAiB,CAChD;IACH;IAEU,0BAA0B,CAClC,cAAqC,EAAE,EAAA;AAEvC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuC;AAC7D,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YACpC,IACE,OAAO,UAAU,KAAK,QAAQ;AAC9B,gBAAA,UAAU,CAAC,YAAY,KAAK,iBAAiB,EAC7C;gBACA;YACF;YACA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM;YACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACnE;AACA,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;YACxD,OAAO;YACP;AACD,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,wBAAwB,CAChC,WAAA,GAAqC,EAAE,EACvC,MAAwC,EAAA;AAExC,QAAA,OAAO,WAAW,CAAC,IAAI,CACrB,UAAU,IAAG;AACX,YAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;gBAClC,OAAO,MAAM,KAAK,wBAAwB;YAC5C;AACA,YAAA,OAAO,UAAU,CAAC,YAAY,KAAK,aAAa;iBAC7C,MAAM,KAAK,wBAAwB;oBAClC,UAAU,CAAC,YAAY,KAAK,iBAAiB;oBAC7C,UAAU,CAAC,YAAY,KAAK,aAAa;AACzC,oBAAA,UAAU,CAAC,YAAY,KAAK,YAAY,CAAC;AAC/C,QAAA,CAAC,CACF;IACH;AAEU,IAAA,qBAAqB,CAC7B,WAAA,GAAqC,EAAE,EACvC,MAAwC,EAAA;AAExC,QAAA,OAAO,WAAW,CAAC,MAAM,CACvB,UAAU,IAAG;AACX,YAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;gBAClC,OAAO,MAAM,KAAK,wBAAwB;YAC5C;AACA,YAAA,OAAO,UAAU,CAAC,YAAY,KAAK,aAAa;iBAC7C,MAAM,KAAK,wBAAwB;oBAClC,UAAU,CAAC,YAAY,KAAK,iBAAiB;oBAC7C,UAAU,CAAC,YAAY,KAAK,aAAa;AACzC,oBAAA,UAAU,CAAC,YAAY,KAAK,YAAY,CAAC;AAC/C,QAAA,CAAC,CACF;IACH;IAEU,oBAAoB,CAAC,cAAqC,EAAE,EAAA;AACpE,QAAA,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,UAAU,KACT,OAAO,UAAU,KAAK,QAAQ;aAC7B,UAAU,CAAC,YAAY,KAAK,aAAa,IAAI,UAAU,CAAC,YAAY,KAAK,YAAY,CAAC;AACvF,YAAA,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC7B;IACH;IAEU,uBAAuB,CAC/B,cAAqC,EAAE,EAAA;AAEvC,QAAA,OAAO,WAAW,CAAC,MAAM,CACvB,CAAC,UAAU,KACT,OAAO,UAAU,KAAK,QAAQ;aAC7B,UAAU,CAAC,YAAY,KAAK,aAAa,IAAI,UAAU,CAAC,YAAY,KAAK,YAAY,CAAC;AACvF,YAAA,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAC7B;IACH;AAEU,IAAA,aAAa,CAAC,UAA+B,EAAA;QACrD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;AAClE,YAAA,IAAI,CAAC,WAAW,CACd,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CACjE;YACD;QACF;QAEA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,gBAAgB,EAC3B,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAClE;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,iBAAiB,CAAC,MAA2B,EAAA;AACrD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;IAEU,sBAAsB,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACjE;IAEU,iBAAiB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAC3D,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnC,QAAA,IAAI,CAAC;AACF,aAAA,cAAc;AACd,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,IAAI,IAAG;AACX,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,oEAAoE,CAAC;YACnG;AACD,SAAA,CAAC;AAEJ,QAAA,IAAI,CAAC;AACF,aAAA,oBAAoB;AACpB,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;YAC1D,KAAK,EAAE,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACtC,yDAAyD;AAE5D,SAAA,CAAC;AAEJ,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IACjE;IAEU,kBAAkB,CAAC,oBAAoB,GAAG,IAAI,EAAA;AACtD,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC;QAE7C,IAAI,oBAAoB,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC;IACF;IAEU,sBAAsB,GAAA;QAC9B,OAAO,OAAO,CACZ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;AACnC,YAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;YACnC,IAAI,CAAC,iBAAiB,CAAC,QAAQ;AAC/B,YAAA,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAChC;IACH;AAEU,IAAA,oBAAoB,CAAC,KAAa,EAAA;QAC1C,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;QACjC,OAAO,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,IAAI,mBAAmB;IACpF;IAEU,mBAAmB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE;YAClC;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ;QAChD,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;AAEA,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC;AACF,aAAA,YAAY,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;YACxC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;YAC1C,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI;AACnC,kBAAE,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;kBAC5C,EAAE,CAAC;YACP,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE;YAC9C,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;YAC1C,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;AAC5C,SAAA,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAM,IAAG;AACb,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AACpC,gBAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;YACzC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,gBAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5C,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,6DAA6D,CAC9D;YACH;AACD,SAAA,CAAC;IACN;AAEU,IAAA,YAAY,CAAC,eAAiC,EAAA;AACtD,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;AAC5D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7D;IAEU,aAAa,CAAC,oBAAoB,GAAG,IAAI,EAAA;AACjD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QAEjC,IAAI,oBAAoB,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC;IACF;IAEU,iBAAiB,GAAA;AACzB,QAAA,OAAO,OAAO,CACZ,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;AACjC,YAAA,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAC3B;IACH;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC;AACF,aAAA,cAAc,CAAC;AACd,YAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ;YACpC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI;AAC1C,kBAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE;kBAC/D,EAAE,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS;YACpD,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE;AAC3E,SAAA,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAChC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAM,IAAG;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,+EAA+E,CAChF;YACH;AACD,SAAA,CAAC;IACN;AAEU,IAAA,gBAAgB,CAAC,IAAY,EAAA;QACrC,OAAO,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;eACzD,6BAA6B,CAAC,SAAS,CAAC;IAC/C;AAEU,IAAA,gBAAgB,CAAC,MAAgD,EAAA;QACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;IACtF;AAEU,IAAA,QAAQ,CAAC,IAAgC,EAAA;AACjD,QAAA,OAAO,oBAAoB,CAAC,IAAI,CAAC;IACnC;AAEU,IAAA,cAAc,CAAC,IAAgC,EAAA;QACvD,QAAQ,IAAI;AACV,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,yBAAyB;AAClC,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,mBAAmB;AAC5B,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,gBAAgB;AACzB,YAAA;AACE,gBAAA,OAAO,oBAAoB;;IAEjC;AAEU,IAAA,cAAc,CAAC,IAAgC,EAAA;QACvD,OAAO,IAAI,KAAK;AACX,eAAA,IAAI,KAAK;AACT,eAAA,IAAI,KAAK;eACT,IAAI,KAAK,QAAQ;IACxB;AAEU,IAAA,wBAAwB,CAChC,IAAgC,EAAA;AAEhC,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,aAAa,GAAG,SAAS;IAC9D;IAEU,kBAAkB,CAC1B,KAA6B,EAC7B,QAAgB,EAAA;AAEhB,QAAA,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE;IAC5E;AAEU,IAAA,cAAc,CAAC,MAAoC,EAAA;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,gBAAgB,EACvB,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CACH,SAAS,CAAC,QAAQ,IAAG;YACnB,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AACrD,gBAAA,OAAO,EAAE,CAAC,QAAQ,CAAC;YACrB;YACA,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,EACzB,SAAS,EACT,QAAQ,CAAC,cAAc,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO,CACR;AACH,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAC1C,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;IAEU,oBAAoB,CAC5B,OAAyB,EACzB,QAA2C,EAAA;AAE3C,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;AAC3C,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,EAAE;AAEnD,QAAA,IACE,CAAC,aAAa;AACd,YAAA,CAAC,qBAAqB;AACtB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,IAAI,CAAC,SAAS,EAAE,EAChB;YACA;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CACtE,CACF;AACD,QAAA,MAAM,WAAW,GAAG,QAAQ,KAAK;AAC/B,cAAE,CAAA,SAAA,EAAY,aAAa,CAAC,OAAO,CAAA;AACnC,cAAE,CAAA,QAAA,EAAW,aAAa,CAAC,OAAO,EAAE;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CACZ,aAAa,CAAC,EAAE,EAChB,QAAQ,EACR,qBAAqB,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;AACf,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9E,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,CACvE,CACF;gBACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEQ,IAAA,kBAAkB,CAAC,KAAc,EAAA;AACvC,QAAA,MAAM,mBAAmB,GAAG,KAAK,YAAY,iBAAiB,KAC5D,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,2BAA2B;AACjD,YAAA,KAAK,CAAC,KAAK,EAAE,KAAK,KAAK,2BAA2B;AAClD,YAAA,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,gEAAgE,CAC1F;;QAED,MAAM,SAAS,GAAG,CAAC,mBAAmB,KAAK,KAAK,YAAY;AAC1D,cAAE,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;iBAC3D,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI;AAC/D,cAAE,KAAK,YAAY,SAAS,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpF,OAAO;AACL,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,wBAAwB,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACzK,YAAA,OAAO,EAAE,IAAI;YACb,SAAS;YACT;SACD;IACH;AAEQ,IAAA,mBAAmB,CAAC,KAAc,EAAA;QACxC,IACE,KAAK,YAAY,iBAAiB;AAClC,YAAA,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK,KAAK,IAAI;YACpB,SAAS,IAAI,KAAK,CAAC,KAAK;AACxB,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;YACvC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAC1B;YACA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACnC;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY;IACjC;AAEU,IAAA,iBAAiB,CAAC,KAAoB,EAAA;QAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEU,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QAC1C,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACvD;IAEU,aAAa,CAAC,SAAiB,EAAE,aAAsB,EAAA;QAC/D,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACjD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAC/B,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,EAAU,CACnD;QACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,OAAO,IAAI,aAAa,KAAK;AAC3B,cAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvD,cAAE,IAAI,GAAG,EAAU,CACtB;IACH;IAEU,mBAAmB,CAAC,SAAiB,EAAE,MAAc,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/E;IAEU,eAAe,CAAC,SAAiB,EAAE,MAAc,EAAA;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;AAChD,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,YAAY,IAAG;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;AAClC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACf;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,eAAe,CAAC,eAAyC,EAAA;AACjE,QAAA,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,IAAI,EAAE;IAC3F;AAEU,IAAA,qBAAqB,CAC7B,OAAyB,EACzB,KAA6B,EAC7B,UAAkB,EAAA;AAElB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;AACnC,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpE;QACF;AACA,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM;QACpC,IAAI,UAAU,GAAG,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE;YAC1C;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC;AAC1D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,IAAG;AACnC,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC;AACrB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;aACF,qBAAqB,CACpB,UAAU,CAAC,KAAK,EAChB,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,EACrC,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACpF,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;;AAEf,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC;AACvE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK;AACrC,oBAAA,GAAG,MAAM;oBACT,CAAC,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK;AAC3C,iBAAA,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpC,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,eAAe,CAAC,KAA6B,EAAA;AACrD,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;QACnC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM;AACnC,QAAA,OAAO,UAAU,CAAC,iBAAiB,KAAK;AACtC,cAAE,CAAA,EAAG,SAAS,CAAC,cAAc,EAAE,IAAI,SAAS,KAAK,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAA,UAAA;cACvE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAA,IAAA,EAAO,UAAU,CAAC,YAAY,CAAC,cAAc,EAAE,CAAA,kBAAA,CAAoB;IACzI;AAEU,IAAA,gBAAgB,CAAC,KAA6B,EAAA;AACtD,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;QACnC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE;AACtD,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,UAAU,CAAC,OAAO,KAAK,SAAS,EAAE;YACpC,OAAO,UAAU,CAAC,OAAO;QAC3B;AACA,QAAA,OAAO,OAAO,CACZ,UAAU,CAAC,gBAAgB,GAAG,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,YAAY,CAC5C;IACH;AAEU,IAAA,kBAAkB,CAAC,UAA4C,EAAA;AACvE,QAAA,MAAM,WAAW,GAAG,UAAU,CAAC,iBAAiB,KAAK;cACjD,UAAU,CAAC;AACb,cAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,gBAAgB,CAAC;AAC9D,QAAA,OAAO,iBAAiB,WAAW,CAAC,cAAc,EAAE,CAAA,CAAA,EAAI,WAAW,KAAK,CAAC,GAAG,QAAQ,GAAG,SAAS,EAAE;IACpG;IAEU,kBAAkB,CAAC,SAAiB,EAAE,UAAkB,EAAA;AAChE,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC;IAC7E;IAEU,cAAc,CAAC,SAAiB,EAAE,UAAkB,EAAA;AAC5D,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACzE;AAEU,IAAA,WAAW,CAAC,KAA6B,EAAA;QACjD,KAAK,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC;IACnD;IAEU,mBAAmB,CAC3B,aAAqC,EACrC,oBAAiC,EAAA;QAEjC,KAAK,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,aAAa,EAAE,oBAAoB,CAAC;IACvF;AAEU,IAAA,SAAS,CACjB,aAAqC,EAAA;AAErC,QAAA,QAAQ,aAAa,CAAC,IAAI;AACxB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,YAAY;AACf,gBAAA,OAAO,aAAa,CAAC,IAAI,KAAK,YAAY,GAAG,MAAM,GAAG,aAAa,CAAC,IAAI;AAC1E,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;AAEU,IAAA,SAAS,CACjB,aAAqC,EAAA;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC;QAC7D,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,EAAE;cAC3C,aAAa,CAAC;AAChB,cAAE,CAAC;AACC,oBAAA,KAAK,EAAE,aAAa,CAAC,UAAU,IAAI,OAAO;oBAC1C,MAAM,EAAE,aAAa,CAAC,MAAM;oBAC5B,MAAM,EAAE,aAAa,CAAC,MAAM;AAC7B,iBAAA,CAAC;QACN,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;AAC/C,QAAA,MAAM,UAAU,GAAG,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,WAAW;AAC/F,QAAA,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;AAC9C,gBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC;AACtE,gBAAA,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE;sBACpC,OAAO,CAAC;AACV,sBAAE,aAAa,CAAC,MAAM,EAAE;0BACpB,aAAa,CAAC;0BACd,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,KAC1C,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAC5C;gBACP,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAC9B,aAAa,CAAC,IAAI,KAAK;sBACnB,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG;sBACtB,SAAS,CACd;AACD,gBAAA,MAAM,aAAa,GAAG,WAAW,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO;gBAC7F,OAAO;oBACL,KAAK,EAAE,OAAO,CAAC,KAAK;AACpB,oBAAA,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrD,oBAAA,IAAI,WAAW,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AAC7C,oBAAA,eAAe,EAAE,UAAU,KAAK,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;AAC3E,0BAAE;AACF,0BAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;oBAC/D,WAAW,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM;AAC5C,oBAAA,WAAW,EAAE,aAAa,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC;oBACnD,YAAY,EAAE,aAAa,IAAI,UAAU,GAAG,CAAC,GAAG,CAAC;AACjD,oBAAA,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;AACpC,oBAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;oBAC3B,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,CAAC;AACjC,oBAAA,UAAU,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;oBACvE,WAAW,EAAE,aAAa,GAAG,CAAC,GAAG,CAAC;oBAClC,gBAAgB,EAAE,aAAa,GAAG,CAAC,GAAG,CAAC;AACvC,oBAAA,IAAI,aAAa,CAAC,IAAI,KAAK,YAAY,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;iBACtE;AACH,YAAA,CAAC,CAAC;SACH;QACD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;AACpD,QAAA,OAAO,IAAI;IACb;AAEU,IAAA,YAAY,CAAC,aAAqC,EAAA;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC;QAChE,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/C,MAAM,UAAU,GAAG,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,KAAK;QAClE,MAAM,aAAa,GAAG,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,OAAO;AACxE,QAAA,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,KAAK,eAAe;AAC3D,QAAA,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,KAAK,YAAY;AACrD,QAAA,MAAM,IAAI,GAAG,CAAC,KAAyB,EAAE,OAAO,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,MAAM;YACjF,OAAO;YACP,WAAW;AACX,YAAA,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE;AAC5C,YAAA,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;AAC3D,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;AACvB,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;AAChC,aAAA;AACF,SAAA,CAAC;AACF,QAAA,MAAM,OAAO,GAA4B;AACvC,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,mBAAmB,EAAE,KAAK;AAC1B,YAAA,SAAS,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE;YAC5B,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;AAChD,YAAA,OAAO,EAAE;AACP,gBAAA,MAAM,EAAE;AACN,oBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC;AAClD,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,MAAM,EAAE;AACN,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,aAAa,EAAE,IAAI;AACnB,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,SAAS,EAAE,CAAC;AACZ,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AACnB,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,EAAE;AACP,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,aAAa,EAAE,IAAI;AACpB,iBAAA;AACF,aAAA;AACD,YAAA,IAAI;AACF,kBAAE,EAAE,MAAM,EAAE,SAAS,KAAK,UAAU,GAAG,KAAK,GAAG,CAAC;AAChD,kBAAE;AACA,sBAAE;AACE,wBAAA,MAAM,EAAE;AACN,4BAAA,CAAC,EAAE;AACD,gCAAA,WAAW,EAAE,IAAI;AACjB,gCAAA,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1B,gCAAA,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AAChC,gCAAA,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;AAC5E,gCAAA,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;AACtD,6BAAA;AACF,yBAAA;AACF;AACH,sBAAE;wBACE,SAAS,EAAE,YAAY,GAAG,GAAG,GAAG,GAAG;AACnC,wBAAA,MAAM,EAAE;4BACN,CAAC,EAAE,IAAI,CACL,YAAY,GAAG,aAAa,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,EAClE,SAAS,EACT,YAAY,CACb;4BACD,CAAC,EAAE,IAAI,CACL,YAAY,GAAG,aAAa,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,EAClE,SAAS,EACT,CAAC,YAAY,CACd;AACF,yBAAA;qBACF,CAAC;SACT;QACD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC;AAC1D,QAAA,OAAO,OAAO;IAChB;AAEU,IAAA,WAAW,CAAC,aAAqC,EAAA;AACzD,QAAA,OAAO,aAAa,CAAC,IAAI,KAAK;cAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;cAClE,GAAG;IACT;AAEQ,IAAA,qBAAqB,CAAC,aAAqC,EAAA;AACjE,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;AACjE,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;IAClD;AAEU,IAAA,cAAc,CAAC,aAAqC,EAAA;AAC5D,QAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE;cACrC,aAAa,CAAC;AAChB,cAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,UAAU,IAAI,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC;QAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,IACrC,aAAa,CAAC,MAAM,CAAC,GAAG,CACtB,CAAC,KAAK,EAAE,KAAK,KAAK,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA,CAAE,CACtF,CACF;AACD,QAAA,OAAO,CAAA,EAAG,aAAa,CAAC,KAAK,CAAA,QAAA,EAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;IAC9D;IAEQ,WAAW,CAAC,aAAqC,EAAE,KAAa,EAAA;AACtE,QAAA,MAAM,QAAQ,GAAG;YACf,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;YAChE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;SACjE;AACD,QAAA,OAAO,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC3E;IAEQ,iBAAiB,CAAC,MAAc,EAAE,OAAe,EAAA;QACvD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AACA,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAA,KAAA,EAAQ,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,CAAA,EAAA,EAAK,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,KAAK,GAAG,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG;IAC1F;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;QAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEU,IAAA,QAAQ,CAAC,KAAsC,EAAA;AACvD,QAAA,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;AACxE,cAAE;cACA,SAAS;IACf;IAEU,aAAa,CACrB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACnD;IAEU,eAAe,CACvB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACzC,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;IAC1C;IAEU,UAAU,CAClB,KAAsC,EACtC,GAAW,EAAA;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IACpC;AAEU,IAAA,YAAY,CACpB,KAA0D,EAC1D,YAAA,GAAyB,EAAE,EAAA;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1E,QAAA,OAAO;AACL,cAAE,MAAM,CAAC,OAAO,CAAC,MAAM;iBAClB,MAAM,CACL,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KACX,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;iBAEhE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;gBACtB,GAAG;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AACjC,gBAAA,KAAK,EAAE;AACR,aAAA,CAAC;cACJ,EAAE;IACR;AAEU,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEU,IAAA,iBAAiB,CAAC,KAAsC,EAAA;AAChE,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,MAAM;QACf;AACA,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,cAAc;QACvB;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YAC9B,OAAO,KAAK,GAAG,KAAK,GAAG,IAAI;QAC7B;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,KAAK,IAAI,OAAO;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;AAC/D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;IAC3D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU;AACvF,QAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS;IACxD;AAEU,IAAA,gBAAgB,CAAC,IAAwB,EAAA;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACvC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IAC9D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI;AAC/D,cAAE;AACF,cAAE,IAAI,CAAC,MAAM;IACjB;AAEU,IAAA,eAAe,CAAC,IAAwB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,QAAQ,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,EAAE;YAC9E;AACA,YAAA,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,GAAG,kBAAkB,GAAG,WAAW;QACpE;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK;AACrB,cAAE;AACF,cAAE,IAAI,CAAC,MAAM,KAAK;AAChB,kBAAE;kBACA,SAAS;IACjB;AAEU,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC5C,QAAA,MAAM,MAAM,GAA2B;AACrC,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,iBAAiB,EAAE,uBAAuB;AAC1C,YAAA,SAAS,EAAE,kBAAkB;AAC7B,YAAA,kBAAkB,EAAE,qBAAqB;AACzC,YAAA,mBAAmB,EAAE,qBAAqB;AAC1C,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,QAAQ,EAAE;SACX;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IAC5D;IAEQ,kBAAkB,CAAC,mBAAmB,GAAG,IAAI,EAAA;QACnD,MAAM,MAAM,GAAuB;AACjC,cAAE,EAAE,wBAAwB,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;cACjH,EAAE;AAEN,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;QACvB;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;QACzB;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC/B;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;QAC7C;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,aAAa,CAAC,OAAyB,EAAA;AAC7C,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;AAC3B,YAAA,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,EAAE;QAC7C;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,yBAAyB,CAAC;QACtD;aAAO;YACL,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEQ,sBAAsB,CAAC,SAAiB,EAAE,QAA+B,EAAA;QAC/E,IAAI,cAAc,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAG;YACrB,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AACpD,gBAAA,OAAO,OAAO;YAChB;AAEA,YAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACnB,oBAAA,OAAO,OAAO;gBAChB;gBACA,cAAc,GAAG,IAAI;gBACrB,OAAO;AACL,oBAAA,GAAG,OAAO;oBACV,gBAAgB,EAAE,CAAA,EAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAA,EAAG,QAAQ,CAAC,KAAK,CAAA,CAAE;oBACtE,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE;AAC5C,0BAAE,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAA,EAAG,QAAQ,CAAC,KAAK,EAAE;0BAC/D,EAAE,CAAC;iBACR;YACH;AAEA,YAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC5B,cAAc,GAAG,IAAI;gBACrB,OAAO;AACL,oBAAA,GAAG,OAAO;oBACV,GAAG,QAAQ,CAAC,IAAI;AAChB,oBAAA,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE;AACpD,oBAAA,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE;AACvC,oBAAA,iBAAiB,EAAE,EAAE;iBACtB;YACH;YAEA,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE;AACpD,gBAAA,OAAO,OAAO;YAChB;YAEA,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;YAC/C,IAAI,CAAC,eAAe,EAAE;AACpB,gBAAA,OAAO,OAAO;YAChB;AACA,YAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE;YACzD,MAAM,YAAY,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,YAAA,IACE,YAAY,EAAE,KAAK,KAAK,QAAQ,CAAC,KAAK;AACtC,gBAAA,YAAY,CAAC,OAAO,KAAK,eAAe,EACxC;AACA,gBAAA,OAAO,OAAO;YAChB;YAEA,cAAc,GAAG,IAAI;YACrB,OAAO;AACL,gBAAA,GAAG,OAAO;AACV,gBAAA,OAAO,EAAE,eAAe;AACxB,gBAAA,iBAAiB,EAAE;AACjB,oBAAA,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE;AAC1C,iBAAA;aACF;QACH,CAAC,CAAC,CACH;QACD,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEQ,cAAc,CAAC,SAAiB,EAAE,WAA6B,EAAA;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAClB,OAAO,CAAC,EAAE,KAAK;AACb,cAAE,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK;AACrD,cAAE,OAAO,CACZ,CACF;IACH;AAEQ,IAAA,cAAc,CACpB,SAAiB,EACjB,UAAkB,EAClB,QAA+B,EAC/B,SAAiB,EAAA;QAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAG;AACtD,YAAA,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE;AAC5B,gBAAA,OAAO,OAAO;YAChB;AACA,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAC9C,OAAO,CAAC,cAAc,EACtB,QAAQ,CAAC,cAAc,CACxB;YACD,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;gBAC1C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK;AACrC,oBAAA,GAAG,MAAM;AACT,oBAAA,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACtB,iBAAA,CAAC,CAAC;AACH,gBAAA,OAAO,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE;YACvC;AACA,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACjE,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;YACvC,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,OAAO,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE;YACvC;AACA,YAAA,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM;YAC1C,IACE,SAAS,CAAC,UAAU;AACpB,gBAAA,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,EACzC;gBACA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,KAAK;AACrC,oBAAA,GAAG,MAAM;oBACT,CAAC,QAAQ,GAAG;AACb,iBAAA,CAAC,CAAC;AACH,gBAAA,OAAO,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE;YACvC;AACA,YAAA,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU;AAC3C,YAAA,MAAM,YAAY,GAAG,cAAc,EAAE,YAAY,IAAI,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM;AACtF,YAAA,MAAM,iBAAiB,GAAG,cAAc,EAAE,iBAAiB,KAAK,KAAK;AACrE,YAAA,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;YAC9D,MAAM,IAAI,GAAG;kBACT,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY;kBAClC,YAAY;AAChB,YAAA,MAAM,OAAO,GAAG,cAAc,EAAE,OAAO;iBACpC,CAAC,cAAc,EAAE,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,gBAAgB,GAAG;AACvB,kBAAE,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;mBACrC,cAAc,EAAE,gBAAgB,IAAI,CAAC,CAAC;AAC3C,YAAA,MAAM,UAAU,GAAG,SAAS,CAAC;AAC3B,kBAAE;AACE,oBAAA,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK;AACjC,oBAAA,MAAM,EAAE,CAAC;AACT,oBAAA,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ;oBACvC,YAAY;oBACZ,iBAAiB;oBACjB,eAAe,EAAE,IAAI,CAAC,MAAM;oBAC5B,gBAAgB;oBAChB,OAAO;AACP,oBAAA,IAAI,OAAO,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;AAC/C;AACH,kBAAE,YAAY,CAAC,UAAU;YAC3B,MAAM,CAAC,UAAU,CAAC,GAAG;AACnB,gBAAA,GAAG,YAAY;gBACf,IAAI;AACJ,gBAAA,IAAI,SAAS,CAAC,OAAO,EAAE;AACrB,sBAAE;AACE,wBAAA,OAAO,EAAE;AACP,4BAAA,IAAI,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;4BAC/B,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK;AAClC,gCAAA,GAAG,MAAM;AACT,gCAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG;AAC7B,6BAAA,CAAC;AACH;AACF;sBACD,EAAE,CAAC;AACP,gBAAA,IAAI,UAAU,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;aACrC;YACD,OAAO;AACL,gBAAA,GAAG,OAAO;AACV,gBAAA,eAAe,EAAE;oBACf,GAAG,OAAO,CAAC,eAAe;AAC1B,oBAAA,IAAI,EAAE,MAAM;oBACZ;AACD,iBAAA;gBACD;aACD;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,oBAAoB,CAC1B,OAAiC,EACjC,IAA8B,EAAA;QAE9B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;QACA,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,OAAO;QAChB;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACjE,QAAA,MAAM,KAAK,GAAG;YACZ,GAAG,OAAO,CAAC,KAAK;YAChB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;SACzE;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AAC7B,YAAA,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE;QACxF;QACA,OAAO;AACL,YAAA,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;AACd,gBAAA,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;gBACjC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;gBACxD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ;gBAClD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc;gBACpE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;AAC3C,aAAA;YACD;SACD;IACH;IAEQ,YAAY,CAAC,SAAiB,EAAE,UAAkB,EAAA;AACxD,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,UAAU,EAAE;IACrC;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;YACL,IAAI,CAAC,aAAa,CAChB,WAAW,EACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,EAC3D,IAAI,CAAC,eAAe,CAAC,kBAAkB;SAE1C;IACH;AAEQ,IAAA,iBAAiB,CAAC,cAAsB,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACrC,QAAA,MAAM,aAAa,GAAG;YACpB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,aAAa,CAAC;YACrB,IAAI,GAAG,MAAM,CAAC;YACd,IAAI,GAAG,UAAU;AAClB,SAAA,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAE1D,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrC,YAAA,OAAO,cAAc;QACvB;QAEA,MAAM,SAAS,GAAG;AACf,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,IAAI,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACpC,OAAO,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA,CAAG,CAAC;QAC3D;QAEA,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,CAAC;IACjE;IAEQ,iBAAiB,GAAA;QACvB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI;QAC3D,OAAO,OAAO,cAAc,KAAK;cAC7B,cAAc;cACd,cAAc;IACpB;AAEQ,IAAA,uBAAuB,CAC7B,IAA6B,EAAA;QAE7B,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC3B,aAAa;gBACb,MAAM;gBACN,UAAU;gBACV,WAAW;gBACX;aACD,CAAC;AACF,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACxD,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjE,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,IAAI,EAAE;SACP;IACH;AAEQ,IAAA,kBAAkB,CAAC,eAAkC,EAAA;QAC3D,MAAM,YAAY,GAAG;AACnB,cAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe;cACxC,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAExC,OAAO;AACL,YAAA,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;AACjD,YAAA,QAAQ,EAAE;SACX;IACH;AAEQ,IAAA,mBAAmB,CAAC,eAAiC,EAAA;AAI3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;AACtF,QAAA,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAC3B,QAAA,KAAK,IAAI,KAAK,GAAG,aAAa,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YAC1D,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE;gBACpC,kBAAkB,GAAG,KAAK;gBAC1B;YACF;QACF;QAEA,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,IAAI,EAAE;YAClD,iBAAiB,EAAE,eAAe,CAAC;SACpC;IACH;IAEQ,WAAW,CACjB,IAAwC,EACxC,IAAc,EAAA;QAEd,MAAM,KAAK,GAAG;aACX,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AACtB,aAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAC3D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;IACtD;IAEQ,8BAA8B,CACpC,QAA+B,EAC/B,SAAiB,EAAA;QAEjB,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC;AAEvE,QAAA,OAAO,IAAI,CAAC,aAAa,CACvB,WAAW,EACX,eAAe,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM,EACxD,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,EAChC,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS,EAC3D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,iBAAiB,EAAE,UAAU,EAC7D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACxC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EACnD,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,gBAAgB,EACzB,eAAe,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,iBAAiB,CAAC,aAAa,EACxC,QAAQ,CAAC,cAAc,CACxB;IACH;IAEQ,aAAa,CACnB,IAA8B,EAC9B,OAAe,EACf,WAAA,GAAqC,EAAE,EACvC,OAAA,GAAuC,EAAE,EACzC,MAAe,EACf,WAAoB,EACpB,GAAY,EACZ,YAAqB,EACrB,SAAkB,EAClB,UAAmB,EACnB,UAA8B,EAC9B,QAAuC,EACvC,SAA6B,EAC7B,UAA8B,EAC9B,OAAiB,EACjB,gBAA2B,EAC3B,eAA0C,EAC1C,MAAwC,EACxC,aAAiD,EACjD,aAAiD,EACjD,KAAiC,EACjC,aAAsB,EACtB,cAAwC,EAAA;QAExC,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;YACnB,IAAI;YACJ,OAAO;YACP,eAAe;YACf,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,UAAU,CAAC;AACvF,YAAA,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,OAAO,CAAC;AACzF,YAAA,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC;YACnF,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC;YACnE,2BAA2B,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACjF,WAAW;YACX,OAAO;YACP,MAAM;YACN,WAAW;YACX,GAAG;YACH,YAAY;YACZ,SAAS;YACT,UAAU;YACV,UAAU;AACV,YAAA,QAAQ,EAAE,UAAU;YACpB,QAAQ;YACR,SAAS;YACT,UAAU;YACV,OAAO;YACP,gBAAgB;YAChB,MAAM;YACN,aAAa;YACb,aAAa;YACb,KAAK;YACL,aAAa;YACb,cAAc;YACd,SAAS,EAAE,IAAI,IAAI;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,SAAiB,EAAA;AAEjB,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEtD,OAAO;AACL,YAAA,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,SAAS;AAC1C,YAAA,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM;AACxE,YAAA,oBAAoB,EAAE,eAAe;AACrC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS;YACvD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC;YAC/F,IAAI;AACJ,YAAA,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC;YAClD,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ,CAAC;SACpB;IACH;AAEQ,IAAA,cAAc,CACpB,KAAqC,EAAA;QAErC,OAAO,KAAK,EAAE,IAAI,KAAK,WAAW,IAAI,KAAK,EAAE,IAAI,KAAK;AACpD,cAAE;cACA,KAAK;IACX;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,QAAmC,EAAA;QAEnC,OAAO;AACL,YAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;YACvF,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;AACpE,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS;AACvF,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,aAAa;YACxF,WAAW,EACT,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,eAAe;YAChD,UAAU,EACR,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,UAAU;YAC3C,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ;YAC5E,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;SACnF;IACH;AAEQ,IAAA,eAAe,CACrB,QAA+B,EAAA;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AAC3B,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,CAAC;AACN,gBAAA,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM;AACrC,gBAAA,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ;AACpC,gBAAA,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC;AACjC,aAAA,CAAC;IACJ;AAEQ,IAAA,6BAA6B,CAAC,QAA+B,EAAA;AACnE,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;AACpE,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,QAAQ,CAAC,UAAU;IAC5B;IAEQ,gBAAgB,CACtB,QAAkC,EAClC,QAA+B,EAAA;AAE/B,QAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;YACzB,OAAO,QAAQ,CAAC,IAAI;QACtB;AAEA,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;YAC3B,OAAO,QAAQ,CAAC,MAAM;QACxB;QAEA,IAAI,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE;AACrD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC;AAE9E,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE1C,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,cAAc;gBACrB,OAAO;AACP,gBAAA,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF;SACF;IACH;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAE1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC;AAEA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;AAE5B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;AAEA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,eAAe,CAAC,IAAyB,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAErF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YAC1B,KAAK;AACL,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK;AAClC,SAAA,CAAC,CAAC;IACL;IAEQ,cAAc,CAAC,GAAsB,EAAE,MAAgB,EAAA;QAC7D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1C;IACxB;AAEQ,IAAA,eAAe,CAAC,KAAsC,EAAA;AAC5D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAClF;QAEA,OAAO,KAAK,IAAI,EAAE;IACpB;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,QAAQ,EAAE,GAAG;AACrB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEQ,IAAA,aAAa,CAAC,KAAc,EAAA;QAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;IACpG;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;AAC/B,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACtE;IAEQ,QAAQ,GAAA;AACd,QAAA,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,EAAE;IAC9E;IAEQ,YAAY,CAAC,SAAiB,EAAE,MAAc,EAAA;AACpD,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,EAAE;IACjC;IAEQ,sBAAsB,CAAC,QAAQ,GAAG,EAAE,EAAA;AAC1C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7E,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;aAC9B,KAAK,CAAC,cAAc;AACpB,aAAA,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;AAC1D,aAAA,GAAG,CAAC,OAAO,KAAK;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,YAAA,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE;AAC1E,SAAA,CAAC,CAAC,EAAE,QAAQ,CAAC;IAClB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACxC;AACA,QAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,MAAK;AACzC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa;YAEpD,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;YAC1C;AACA,YAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS;AACtC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,SAAiB,EAAA;QACvC,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa;YACrD,MAAM,OAAO,GAAG,QAAQ,EAAE,aAAa,CACrC,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CACnC;AACD,YAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;gBACzB;YACF;YACA,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG;YACxD,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG;AACtD,YAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;AAChF,YAAA,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,QAAQ,CAAC,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAC3D;AACH,QAAA,CAAC,CAAC;IACJ;AAz4DW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,iMA8GtB,oBAAoB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FA9GnB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClKlC,45wEAi7CA,EAAA,MAAA,EAAA,CAAA,y97BAAA,EAAA,gqkCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhyCI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,iBAAiB,8xCACjB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,SAAS,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACT,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,QAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,0BAA0B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAF1B,wBAAwB,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,CAAA;;4FAQf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBApBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,WAAW;wBACX,iBAAiB;wBACjB,YAAY;wBACZ,SAAS;wBACT,cAAc;wBACd,aAAa;wBACb,wBAAwB;wBACxB,6BAA6B;wBAC7B,0BAA0B;qBAC3B,EAAA,aAAA,EAEc,iBAAiB,CAAC,QAAQ,EAAA,QAAA,EAAA,45wEAAA,EAAA,MAAA,EAAA,CAAA,y97BAAA,EAAA,gqkCAAA,CAAA,EAAA;;0BAiHtC,MAAM;2BAAC,oBAAoB;;sBA5G7B,SAAS;uBAAC,kBAAkB;;sBAgB5B,SAAS;uBAAC,eAAe;;sBAEzB,SAAS;uBAAC,mBAAmB;;sBAE7B,SAAS;uBAAC,eAAe;;sBAEzB;;sBAEA;;sBAEA;;sBAIA;;sBAIA;;sBAIA;;sBAEA;;sBAEA;;sBA6FA,YAAY;uBAAC,iBAAiB;;sBA4B9B,YAAY;uBAAC,yBAAyB;;;AEvUzC;;AAEG;;ACFH;;AAEG;;;;"}
|