@copilotkitnext/angular 0.0.9-alpha.2 → 0.0.10
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/dist/esm2022/index.mjs +2 -70
- package/dist/esm2022/lib/agent.mjs +73 -0
- package/dist/esm2022/lib/chat-config.mjs +35 -0
- package/dist/esm2022/lib/chat-state.mjs +18 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
- package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
- package/dist/esm2022/lib/config.mjs +9 -0
- package/dist/esm2022/lib/copilotkit.mjs +124 -0
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
- package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
- package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
- package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
- package/dist/esm2022/lib/resize-observer.mjs +152 -0
- package/dist/esm2022/lib/scroll-position.mjs +124 -0
- package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
- package/dist/esm2022/lib/slots/index.mjs +4 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
- package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
- package/dist/esm2022/lib/tools.mjs +31 -0
- package/dist/esm2022/lib/utils.mjs +3 -3
- package/dist/esm2022/public-api.mjs +47 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/index.d.ts +1 -55
- package/dist/lib/agent.d.ts +53 -0
- package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
- package/dist/lib/chat-state.d.ts +10 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
- package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
- package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
- package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
- package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
- package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
- package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
- package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
- package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
- package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
- package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
- package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
- package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
- package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
- package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
- package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
- package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
- package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
- package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/copilotkit.d.ts +29 -0
- package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
- package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
- package/dist/lib/directives/tooltip.d.ts +33 -0
- package/dist/lib/human-in-the-loop.d.ts +13 -0
- package/dist/lib/render-tool-calls.d.ts +75 -0
- package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
- package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
- package/dist/lib/slots/copilot-slot.d.ts +34 -0
- package/dist/lib/slots/index.d.ts +3 -0
- package/dist/lib/slots/slot.types.d.ts +1 -1
- package/dist/lib/slots/slot.utils.d.ts +6 -4
- package/dist/lib/tools.d.ts +63 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/public-api.d.ts +46 -0
- package/dist/styles.css +0 -69
- package/package.json +3 -3
- package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
- package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
- package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
- package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
- package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
- package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
- package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
- package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
- package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
- package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
- package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
- package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
- package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
- package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
- package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
- package/dist/components/chat/copilot-chat.component.d.ts +0 -36
- package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
- package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
- package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
- package/dist/core/copilotkit.providers.d.ts +0 -13
- package/dist/core/copilotkit.service.d.ts +0 -119
- package/dist/core/copilotkit.types.d.ts +0 -81
- package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
- package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
- package/dist/directives/copilotkit-config.directive.d.ts +0 -44
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
- package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
- package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
- package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
- package/dist/esm2022/core/copilotkit.service.mjs +0 -411
- package/dist/esm2022/core/copilotkit.types.mjs +0 -13
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
- package/dist/esm2022/services/resize-observer.service.mjs +0 -152
- package/dist/esm2022/services/scroll-position.service.mjs +0 -124
- package/dist/esm2022/types/frontend-tool.mjs +0 -2
- package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
- package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
- package/dist/esm2022/utils/agent.utils.mjs +0 -212
- package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
- package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
- package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
- package/dist/lib/directives/tooltip.directive.d.ts +0 -33
- package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
- package/dist/types/frontend-tool.d.ts +0 -37
- package/dist/types/human-in-the-loop.d.ts +0 -44
- package/dist/utils/agent-context.utils.d.ts +0 -75
- package/dist/utils/agent.utils.d.ts +0 -108
- package/dist/utils/chat-config.utils.d.ts +0 -166
- package/dist/utils/copilotkit.utils.d.ts +0 -16
- package/dist/utils/frontend-tool.utils.d.ts +0 -119
- package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, inject, ElementRef, ViewChild, } from "@angular/core";
|
|
2
|
-
import { CommonModule } from "@angular/common";
|
|
3
|
-
import { Marked } from "marked";
|
|
4
|
-
import hljs from "highlight.js";
|
|
5
|
-
import * as katex from "katex";
|
|
6
|
-
import { completePartialMarkdown } from "@copilotkitnext/core";
|
|
7
|
-
import { LucideAngularModule } from "lucide-angular";
|
|
8
|
-
import { CopilotChatConfigurationService } from "../../core/chat-configuration/chat-configuration.service";
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class CopilotChatAssistantMessageRendererComponent {
|
|
11
|
-
_content = "";
|
|
12
|
-
set content(value) {
|
|
13
|
-
this._content = value;
|
|
14
|
-
this.contentSignal.set(value);
|
|
15
|
-
}
|
|
16
|
-
get content() {
|
|
17
|
-
return this._content;
|
|
18
|
-
}
|
|
19
|
-
inputClass;
|
|
20
|
-
contentSignal = signal("");
|
|
21
|
-
markdownContainer;
|
|
22
|
-
chatConfig = inject(CopilotChatConfigurationService);
|
|
23
|
-
elementRef = inject(ElementRef);
|
|
24
|
-
// Track copy states for code blocks
|
|
25
|
-
copyStates = new Map();
|
|
26
|
-
copyStateSignal = signal(new Map());
|
|
27
|
-
renderedHtml = computed(() => {
|
|
28
|
-
const currentContent = this.contentSignal();
|
|
29
|
-
const completedMarkdown = completePartialMarkdown(currentContent);
|
|
30
|
-
return this.renderMarkdown(completedMarkdown);
|
|
31
|
-
});
|
|
32
|
-
get labels() {
|
|
33
|
-
return this.chatConfig.labels();
|
|
34
|
-
}
|
|
35
|
-
ngOnChanges(changes) {
|
|
36
|
-
if (changes["content"]) {
|
|
37
|
-
// Reset copy states when content changes
|
|
38
|
-
this.copyStates.clear();
|
|
39
|
-
this.copyStateSignal.set(new Map());
|
|
40
|
-
// Update content if container exists
|
|
41
|
-
if (this.markdownContainer) {
|
|
42
|
-
this.updateContent();
|
|
43
|
-
this.renderMathEquations();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
ngAfterViewInit() {
|
|
48
|
-
this.updateContent();
|
|
49
|
-
this.renderMathEquations();
|
|
50
|
-
}
|
|
51
|
-
updateContent() {
|
|
52
|
-
if (!this.markdownContainer)
|
|
53
|
-
return;
|
|
54
|
-
const container = this.markdownContainer.nativeElement;
|
|
55
|
-
const html = this.renderedHtml();
|
|
56
|
-
container.innerHTML = html;
|
|
57
|
-
}
|
|
58
|
-
codeBlocksMap = new Map();
|
|
59
|
-
markedInstance = null;
|
|
60
|
-
initializeMarked() {
|
|
61
|
-
if (this.markedInstance)
|
|
62
|
-
return;
|
|
63
|
-
// Store highlighted code blocks temporarily
|
|
64
|
-
const highlightedBlocks = new Map();
|
|
65
|
-
// Create a new Marked instance
|
|
66
|
-
this.markedInstance = new Marked();
|
|
67
|
-
// Configure marked options
|
|
68
|
-
this.markedInstance.setOptions({
|
|
69
|
-
gfm: true,
|
|
70
|
-
breaks: true,
|
|
71
|
-
});
|
|
72
|
-
// Add a walkTokens function to process code tokens before rendering
|
|
73
|
-
this.markedInstance.use({
|
|
74
|
-
walkTokens: (token) => {
|
|
75
|
-
if (token.type === "code") {
|
|
76
|
-
const rawCode = token.text;
|
|
77
|
-
const lang = token.lang || "";
|
|
78
|
-
const blockId = this.generateBlockId(rawCode);
|
|
79
|
-
// Store the raw code in our map for copying
|
|
80
|
-
this.codeBlocksMap.set(blockId, rawCode);
|
|
81
|
-
const copied = this.copyStateSignal().get(blockId) || false;
|
|
82
|
-
const copyLabel = copied
|
|
83
|
-
? this.labels.assistantMessageToolbarCopyCodeCopiedLabel
|
|
84
|
-
: this.labels.assistantMessageToolbarCopyCodeLabel;
|
|
85
|
-
// Manually highlight the code
|
|
86
|
-
const language = hljs.getLanguage(lang) ? lang : "plaintext";
|
|
87
|
-
const highlighted = hljs.highlight(rawCode, { language }).value;
|
|
88
|
-
const codeClass = lang ? `hljs language-${lang}` : "hljs";
|
|
89
|
-
// Create the full HTML with header and highlighted code
|
|
90
|
-
const fullHtml = `
|
|
91
|
-
<div class="code-block-container">
|
|
92
|
-
<div class="code-block-header">
|
|
93
|
-
${lang ? `<span class="code-block-language">${lang}</span>` : "<span></span>"}
|
|
94
|
-
<button
|
|
95
|
-
class="code-block-copy-button"
|
|
96
|
-
data-code-block-id="${blockId}"
|
|
97
|
-
aria-label="${copyLabel} code">
|
|
98
|
-
${copied
|
|
99
|
-
? '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>'
|
|
100
|
-
: '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.11 0-2-.9-2-2V4c0-1.11.89-2 2-2h10c1.11 0 2 .89 2 2"/></svg>'}
|
|
101
|
-
<span>${copyLabel}</span>
|
|
102
|
-
</button>
|
|
103
|
-
</div>
|
|
104
|
-
<pre><code class="${codeClass}">${highlighted}</code></pre>
|
|
105
|
-
</div>
|
|
106
|
-
`;
|
|
107
|
-
// Store the highlighted HTML
|
|
108
|
-
highlightedBlocks.set(blockId, fullHtml);
|
|
109
|
-
// Change the token to an html token to bypass marked's escaping
|
|
110
|
-
token.type = "html";
|
|
111
|
-
token.text = fullHtml;
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
renderMarkdown(content) {
|
|
117
|
-
// Initialize marked if not already done
|
|
118
|
-
this.initializeMarked();
|
|
119
|
-
// Clear the code blocks map for new render
|
|
120
|
-
this.codeBlocksMap.clear();
|
|
121
|
-
// Parse markdown
|
|
122
|
-
let html = this.markedInstance.parse(content);
|
|
123
|
-
// Process math equations
|
|
124
|
-
html = this.processMathEquations(html);
|
|
125
|
-
return html;
|
|
126
|
-
}
|
|
127
|
-
processMathEquations(html) {
|
|
128
|
-
// First, temporarily replace code blocks with placeholders to protect them from math processing
|
|
129
|
-
const codeBlocks = [];
|
|
130
|
-
const placeholder = "___CODE_BLOCK_PLACEHOLDER_";
|
|
131
|
-
// Store code blocks and replace with placeholders
|
|
132
|
-
html = html.replace(/<pre><code[\s\S]*?<\/code><\/pre>/g, (match) => {
|
|
133
|
-
const index = codeBlocks.length;
|
|
134
|
-
codeBlocks.push(match);
|
|
135
|
-
return `${placeholder}${index}___`;
|
|
136
|
-
});
|
|
137
|
-
// Also protect inline code
|
|
138
|
-
const inlineCode = [];
|
|
139
|
-
const inlinePlaceholder = "___INLINE_CODE_PLACEHOLDER_";
|
|
140
|
-
html = html.replace(/<code>[\s\S]*?<\/code>/g, (match) => {
|
|
141
|
-
const index = inlineCode.length;
|
|
142
|
-
inlineCode.push(match);
|
|
143
|
-
return `${inlinePlaceholder}${index}___`;
|
|
144
|
-
});
|
|
145
|
-
// Process display math $$ ... $$
|
|
146
|
-
html = html.replace(/\$\$([\s\S]*?)\$\$/g, (match, equation) => {
|
|
147
|
-
try {
|
|
148
|
-
return katex.renderToString(equation, {
|
|
149
|
-
displayMode: true,
|
|
150
|
-
throwOnError: false,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return match;
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
// Process inline math $ ... $
|
|
158
|
-
html = html.replace(/\$([^\$]+)\$/g, (match, equation) => {
|
|
159
|
-
try {
|
|
160
|
-
return katex.renderToString(equation, {
|
|
161
|
-
displayMode: false,
|
|
162
|
-
throwOnError: false,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
catch {
|
|
166
|
-
return match;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
// Restore code blocks
|
|
170
|
-
codeBlocks.forEach((block, index) => {
|
|
171
|
-
html = html.replace(`${placeholder}${index}___`, block);
|
|
172
|
-
});
|
|
173
|
-
// Restore inline code
|
|
174
|
-
inlineCode.forEach((code, index) => {
|
|
175
|
-
html = html.replace(`${inlinePlaceholder}${index}___`, code);
|
|
176
|
-
});
|
|
177
|
-
return html;
|
|
178
|
-
}
|
|
179
|
-
renderMathEquations() {
|
|
180
|
-
if (!this.markdownContainer)
|
|
181
|
-
return;
|
|
182
|
-
const container = this.markdownContainer.nativeElement;
|
|
183
|
-
// Find all math placeholders and render them
|
|
184
|
-
const mathElements = container.querySelectorAll(".math-placeholder");
|
|
185
|
-
mathElements.forEach((element) => {
|
|
186
|
-
const equation = element.getAttribute("data-equation");
|
|
187
|
-
const displayMode = element.getAttribute("data-display") === "true";
|
|
188
|
-
if (equation) {
|
|
189
|
-
try {
|
|
190
|
-
katex.render(equation, element, {
|
|
191
|
-
displayMode,
|
|
192
|
-
throwOnError: false,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
catch (error) {
|
|
196
|
-
console.error("Failed to render math equation:", error);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
handleClick(event) {
|
|
202
|
-
const target = event.target;
|
|
203
|
-
// Check if clicked on copy button or its children
|
|
204
|
-
const copyButton = target.closest(".code-block-copy-button");
|
|
205
|
-
if (copyButton) {
|
|
206
|
-
event.preventDefault();
|
|
207
|
-
const blockId = copyButton.getAttribute("data-code-block-id");
|
|
208
|
-
if (blockId) {
|
|
209
|
-
// Get the raw code from our map instead of from DOM
|
|
210
|
-
const code = this.codeBlocksMap.get(blockId);
|
|
211
|
-
if (code) {
|
|
212
|
-
this.copyCodeBlock(blockId, code);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
copyCodeBlock(blockId, code) {
|
|
218
|
-
navigator.clipboard.writeText(code).then(() => {
|
|
219
|
-
// Update copy state
|
|
220
|
-
const newStates = new Map(this.copyStateSignal());
|
|
221
|
-
newStates.set(blockId, true);
|
|
222
|
-
this.copyStateSignal.set(newStates);
|
|
223
|
-
// Update the button in the DOM
|
|
224
|
-
const button = this.elementRef.nativeElement.querySelector(`[data-code-block-id="${blockId}"]`);
|
|
225
|
-
if (button) {
|
|
226
|
-
const originalHTML = button.innerHTML;
|
|
227
|
-
button.innerHTML = `
|
|
228
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
|
|
229
|
-
<span>${this.labels.assistantMessageToolbarCopyCodeCopiedLabel}</span>
|
|
230
|
-
`;
|
|
231
|
-
button.setAttribute("aria-label", `${this.labels.assistantMessageToolbarCopyCodeCopiedLabel} code`);
|
|
232
|
-
// Reset after 2 seconds
|
|
233
|
-
setTimeout(() => {
|
|
234
|
-
const states = new Map(this.copyStateSignal());
|
|
235
|
-
states.set(blockId, false);
|
|
236
|
-
this.copyStateSignal.set(states);
|
|
237
|
-
button.innerHTML = originalHTML;
|
|
238
|
-
button.setAttribute("aria-label", `${this.labels.assistantMessageToolbarCopyCodeLabel} code`);
|
|
239
|
-
}, 2000);
|
|
240
|
-
}
|
|
241
|
-
}, (err) => {
|
|
242
|
-
console.error("Failed to copy code:", err);
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
generateBlockId(code) {
|
|
246
|
-
// Simple hash function for generating unique IDs
|
|
247
|
-
let hash = 0;
|
|
248
|
-
for (let i = 0; i < code.length; i++) {
|
|
249
|
-
const char = code.charCodeAt(i);
|
|
250
|
-
hash = (hash << 5) - hash + char;
|
|
251
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
252
|
-
}
|
|
253
|
-
return `code-block-${hash}`;
|
|
254
|
-
}
|
|
255
|
-
escapeHtml(text) {
|
|
256
|
-
const div = document.createElement("div");
|
|
257
|
-
div.textContent = text;
|
|
258
|
-
return div.innerHTML;
|
|
259
|
-
}
|
|
260
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
261
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAssistantMessageRendererComponent, isStandalone: true, selector: "copilot-chat-assistant-message-renderer", inputs: { content: "content", inputClass: "inputClass" }, viewQueries: [{ propertyName: "markdownContainer", first: true, predicate: ["markdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
262
|
-
<div
|
|
263
|
-
#markdownContainer
|
|
264
|
-
[class]="inputClass"
|
|
265
|
-
(click)="handleClick($event)"
|
|
266
|
-
></div>
|
|
267
|
-
`, isInline: true, styles: ["copilot-chat-assistant-message-renderer{display:block;width:100%}copilot-chat-assistant-message-renderer code:not(pre code){padding:2.5px 4.8px;background-color:#ececec;border-radius:.25rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace;font-weight:500;color:#000}.dark copilot-chat-assistant-message-renderer code:not(pre code){background-color:#171717;color:#f8fafc}copilot-chat-assistant-message-renderer .code-block-container{position:relative;margin:.25rem 0;background-color:#f9f9f9;border-radius:1rem}.dark copilot-chat-assistant-message-renderer .code-block-container{background-color:#171717}copilot-chat-assistant-message-renderer .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;font-size:.75rem;background-color:transparent}copilot-chat-assistant-message-renderer .code-block-language{font-weight:400;color:#737373}.dark copilot-chat-assistant-message-renderer .code-block-language{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button{display:flex;align-items:center;gap:.125rem;padding:0 .5rem;font-size:.75rem;color:#737373;cursor:pointer;background:none;border:none;transition:opacity .2s}.dark copilot-chat-assistant-message-renderer .code-block-copy-button{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button:hover{opacity:.8}copilot-chat-assistant-message-renderer .code-block-copy-button svg{width:10px;height:10px}copilot-chat-assistant-message-renderer .code-block-copy-button span{font-size:11px}copilot-chat-assistant-message-renderer pre{margin:0;padding:0 1rem 1rem;overflow-x:auto;background-color:transparent;border-radius:1rem}.dark copilot-chat-assistant-message-renderer pre{background-color:transparent}copilot-chat-assistant-message-renderer pre code{background-color:transparent;padding:0;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#383a42}.dark copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#abb2bf}copilot-chat-assistant-message-renderer .katex-display{overflow-x:auto;overflow-y:hidden;padding:1rem 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
268
|
-
}
|
|
269
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageRendererComponent, decorators: [{
|
|
270
|
-
type: Component,
|
|
271
|
-
args: [{ selector: "copilot-chat-assistant-message-renderer", standalone: true, imports: [CommonModule, LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
272
|
-
<div
|
|
273
|
-
#markdownContainer
|
|
274
|
-
[class]="inputClass"
|
|
275
|
-
(click)="handleClick($event)"
|
|
276
|
-
></div>
|
|
277
|
-
`, styles: ["copilot-chat-assistant-message-renderer{display:block;width:100%}copilot-chat-assistant-message-renderer code:not(pre code){padding:2.5px 4.8px;background-color:#ececec;border-radius:.25rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace;font-weight:500;color:#000}.dark copilot-chat-assistant-message-renderer code:not(pre code){background-color:#171717;color:#f8fafc}copilot-chat-assistant-message-renderer .code-block-container{position:relative;margin:.25rem 0;background-color:#f9f9f9;border-radius:1rem}.dark copilot-chat-assistant-message-renderer .code-block-container{background-color:#171717}copilot-chat-assistant-message-renderer .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;font-size:.75rem;background-color:transparent}copilot-chat-assistant-message-renderer .code-block-language{font-weight:400;color:#737373}.dark copilot-chat-assistant-message-renderer .code-block-language{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button{display:flex;align-items:center;gap:.125rem;padding:0 .5rem;font-size:.75rem;color:#737373;cursor:pointer;background:none;border:none;transition:opacity .2s}.dark copilot-chat-assistant-message-renderer .code-block-copy-button{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button:hover{opacity:.8}copilot-chat-assistant-message-renderer .code-block-copy-button svg{width:10px;height:10px}copilot-chat-assistant-message-renderer .code-block-copy-button span{font-size:11px}copilot-chat-assistant-message-renderer pre{margin:0;padding:0 1rem 1rem;overflow-x:auto;background-color:transparent;border-radius:1rem}.dark copilot-chat-assistant-message-renderer pre{background-color:transparent}copilot-chat-assistant-message-renderer pre code{background-color:transparent;padding:0;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#383a42}.dark copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#abb2bf}copilot-chat-assistant-message-renderer .katex-display{overflow-x:auto;overflow-y:hidden;padding:1rem 0}\n"] }]
|
|
278
|
-
}], propDecorators: { content: [{
|
|
279
|
-
type: Input
|
|
280
|
-
}], inputClass: [{
|
|
281
|
-
type: Input
|
|
282
|
-
}], markdownContainer: [{
|
|
283
|
-
type: ViewChild,
|
|
284
|
-
args: ["markdownContainer", { static: false }]
|
|
285
|
-
}] } });
|
|
286
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBR2pCLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFFVixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDOztBQTZJM0csTUFBTSxPQUFPLDRDQUE0QztJQUcvQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRVEsVUFBVSxDQUFVO0lBRXJCLGFBQWEsR0FBRyxNQUFNLENBQVMsRUFB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LENBQUM7UUFDMUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7d0dBclRVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLDBTQXJJN0M7Ozs7OztHQU1ULGl5RUFUUyxZQUFZLDhCQUFFLG1CQUFtQjs7NEZBd0loQyw0Q0FBNEM7a0JBM0l4RCxTQUFTOytCQUNFLHlDQUF5QyxjQUN2QyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsbUJBQzNCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7OztHQU1UOzhCQW9JRyxPQUFPO3NCQURWLEtBQUs7Z0JBU0csVUFBVTtzQkFBbEIsS0FBSztnQkFLTixpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSBcIm1hcmtlZFwiO1xuaW1wb3J0IGhsanMgZnJvbSBcImhpZ2hsaWdodC5qc1wiO1xuaW1wb3J0ICogYXMga2F0ZXggZnJvbSBcImthdGV4XCI7XG5pbXBvcnQgeyBjb21wbGV0ZVBhcnRpYWxNYXJrZG93biB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSwgQ29weSwgQ2hlY2sgfSBmcm9tIFwibHVjaWRlLWFuZ3VsYXJcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LWNvbmZpZ3VyYXRpb24vY2hhdC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlclwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMdWNpZGVBbmd1bGFyTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI21hcmtkb3duQ29udGFpbmVyXG4gICAgICBbY2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXG4gICAgPjwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC8qIElubGluZSBjb2RlIHN0eWxpbmcgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgICAgICBwYWRkaW5nOiAyLjVweCA0LjhweDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNiwgMjM2LCAyMzYpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBmb250LWZhbWlseTpcbiAgICAgICAgICB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBcIlNGIE1vbm9cIiwgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsXG4gICAgICAgICAgTWVubG8sIG1vbm9zcGFjZTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY29sb3I6ICMwMDAwMDA7XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTcxNzE3OyAvKiBzYW1lIGFzIGNvZGUgYmxvY2tzICovXG4gICAgICAgIGNvbG9yOiByZ2IoMjQ4LCAyNTAsIDI1Mik7IC8qIHRleHQtZm9yZWdyb3VuZCBpbiBkYXJrIG1vZGUgKi9cbiAgICAgIH1cblxuICAgICAgLyogQ29kZSBibG9jayBjb250YWluZXIgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG1hcmdpbjogMC4yNXJlbSAwO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ5LCAyNDksIDI0OSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb250YWluZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTcxNzE3O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2staGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nOiAwLjc1cmVtIDFyZW0gMC43NXJlbSAxcmVtO1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stbGFuZ3VhZ2Uge1xuICAgICAgICBmb250LXdlaWdodDogNDAwO1xuICAgICAgICBjb2xvcjogcmdiYSgxMTUsIDExNSwgMTE1LCAxKTtcbiAgICAgIH1cblxuICAgICAgLmRhcmsgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIC5jb2RlLWJsb2NrLWxhbmd1YWdlIHtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDAuMTI1cmVtO1xuICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBjb2xvcjogcmdiYSgxMTUsIDExNSwgMTE1LCAxKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcbiAgICAgIH1cblxuICAgICAgLmRhcmsgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIC5jb2RlLWJsb2NrLWNvcHktYnV0dG9uIHtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b246aG92ZXIge1xuICAgICAgICBvcGFjaXR5OiAwLjg7XG4gICAgICB9XG5cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb3B5LWJ1dHRvbiBzdmcge1xuICAgICAgICB3aWR0aDogMTBweDtcbiAgICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b24gc3BhbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIH1cblxuICAgICAgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIHByZSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMCAxcmVtIDFyZW0gMXJlbTtcbiAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBwcmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIHByZSBjb2RlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtZmFtaWx5OlxuICAgICAgICAgIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIFwiU0YgTW9ub1wiLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIixcbiAgICAgICAgICBNZW5sbywgbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAvKiBIaWdobGlnaHQuanMgdGhlbWUgYWRqdXN0bWVudHMgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuaGxqcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBjb2xvcjogcmdiKDU2LCA1OCwgNjYpO1xuICAgICAgfVxuXG4gICAgICAuZGFyayBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmhsanMge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6ICNhYmIyYmY7XG4gICAgICB9XG5cbiAgICAgIC8qIE1hdGggZXF1YXRpb25zICovXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmthdGV4LWRpc3BsYXkge1xuICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gMDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdEFzc2lzdGFudE1lc3NhZ2VSZW5kZXJlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxue1xuICBwcml2YXRlIF9jb250ZW50ID0gXCJcIjtcbiAgQElucHV0KClcbiAgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbnRlbnRTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuICBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICB9XG5cbiAgQElucHV0KCkgaW5wdXRDbGFzcz86IHN0cmluZztcblxuICBwcml2YXRlIGNvbnRlbnRTaWduYWwgPSBzaWduYWw8c3RyaW5nPihcIlwiKTtcblxuICBAVmlld0NoaWxkKFwibWFya2Rvd25Db250YWluZXJcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIG1hcmtkb3duQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgLy8gVHJhY2sgY29weSBzdGF0ZXMgZm9yIGNvZGUgYmxvY2tzXG4gIHByaXZhdGUgY29weVN0YXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICBwcml2YXRlIGNvcHlTdGF0ZVNpZ25hbCA9IHNpZ25hbChuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKSk7XG5cbiAgcmVuZGVyZWRIdG1sID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5jb250ZW50U2lnbmFsKCk7XG4gICAgY29uc3QgY29tcGxldGVkTWFya2Rvd24gPSBjb21wbGV0ZVBhcnRpYWxNYXJrZG93bihjdXJyZW50Q29udGVudCk7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTWFya2Rvd24oY29tcGxldGVkTWFya2Rvd24pO1xuICB9KTtcblxuICBnZXQgbGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmNoYXRDb25maWcubGFiZWxzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJjb250ZW50XCJdKSB7XG4gICAgICAvLyBSZXNldCBjb3B5IHN0YXRlcyB3aGVuIGNvbnRlbnQgY2hhbmdlc1xuICAgICAgdGhpcy5jb3B5U3RhdGVzLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvcHlTdGF0ZVNpZ25hbC5zZXQobmV3IE1hcCgpKTtcbiAgICAgIC8vIFVwZGF0ZSBjb250ZW50IGlmIGNvbnRhaW5lciBleGlzdHNcbiAgICAgIGlmICh0aGlzLm1hcmtkb3duQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLnJlbmRlck1hdGhFcXVhdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgdGhpcy5yZW5kZXJNYXRoRXF1YXRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcmtkb3duQ29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5tYXJrZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLnJlbmRlcmVkSHRtbCgpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2RlQmxvY2tzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBtYXJrZWRJbnN0YW5jZTogTWFya2VkIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplTWFya2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcmtlZEluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSBoaWdobGlnaHRlZCBjb2RlIGJsb2NrcyB0ZW1wb3JhcmlseVxuICAgIGNvbnN0IGhpZ2hsaWdodGVkQmxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBNYXJrZWQgaW5zdGFuY2VcbiAgICB0aGlzLm1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuXG4gICAgLy8gQ29uZmlndXJlIG1hcmtlZCBvcHRpb25zXG4gICAgdGhpcy5tYXJrZWRJbnN0YW5jZS5zZXRPcHRpb25zKHtcbiAgICAgIGdmbTogdHJ1ZSxcbiAgICAgIGJyZWFrczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBhIHdhbGtUb2tlbnMgZnVuY3Rpb24gdG8gcHJvY2VzcyBjb2RlIHRva2VucyBiZWZvcmUgcmVuZGVyaW5nXG4gICAgdGhpcy5tYXJrZWRJbnN0YW5jZS51c2Uoe1xuICAgICAgd2Fsa1Rva2VuczogKHRva2VuOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFwiY29kZVwiKSB7XG4gICAgICAgICAgY29uc3QgcmF3Q29kZSA9IHRva2VuLnRleHQ7XG4gICAgICAgICAgY29uc3QgbGFuZyA9IHRva2VuLmxhbmcgfHwgXCJcIjtcblxuICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSB0aGlzLmdlbmVyYXRlQmxvY2tJZChyYXdDb2RlKTtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgcmF3IGNvZGUgaW4gb3VyIG1hcCBmb3IgY29weWluZ1xuICAgICAgICAgIHRoaXMuY29kZUJsb2Nrc01hcC5zZXQoYmxvY2tJZCwgcmF3Q29kZSk7XG5cbiAgICAgICAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlTdGF0ZVNpZ25hbCgpLmdldChibG9ja0lkKSB8fCBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjb3B5TGFiZWwgPSBjb3BpZWRcbiAgICAgICAgICAgID8gdGhpcy5sYWJlbHMuYXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb3B5Q29kZUNvcGllZExhYmVsXG4gICAgICAgICAgICA6IHRoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVMYWJlbDtcblxuICAgICAgICAgIC8vIE1hbnVhbGx5IGhpZ2hsaWdodCB0aGUgY29kZVxuICAgICAgICAgIGNvbnN0IGxhbmd1YWdlID0gaGxqcy5nZXRMYW5ndWFnZShsYW5nKSA/IGxhbmcgOiBcInBsYWludGV4dFwiO1xuICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkID0gaGxqcy5oaWdobGlnaHQocmF3Q29kZSwgeyBsYW5ndWFnZSB9KS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjb2RlQ2xhc3MgPSBsYW5nID8gYGhsanMgbGFuZ3VhZ2UtJHtsYW5nfWAgOiBcImhsanNcIjtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBIVE1MIHdpdGggaGVhZGVyIGFuZCBoaWdobGlnaHRlZCBjb2RlXG4gICAgICAgICAgY29uc3QgZnVsbEh0bWwgPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1ibG9jay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZGUtYmxvY2staGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgJHtsYW5nID8gYDxzcGFuIGNsYXNzPVwiY29kZS1ibG9jay1sYW5ndWFnZVwiPiR7bGFuZ308L3NwYW4+YCA6IFwiPHNwYW4+PC9zcGFuPlwifVxuICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvZGUtYmxvY2stY29weS1idXR0b25cIiBcbiAgICAgICAgICAgICAgICAgIGRhdGEtY29kZS1ibG9jay1pZD1cIiR7YmxvY2tJZH1cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Y29weUxhYmVsfSBjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICA/ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0yMCA2IDkgMTdsLTUtNVwiLz48L3N2Zz4nXG4gICAgICAgICAgICAgICAgICAgICAgOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHg9XCI4XCIgeT1cIjhcIiByeD1cIjJcIiByeT1cIjJcIi8+PHBhdGggZD1cIk00IDE2Yy0xLjExIDAtMi0uOS0yLTJWNGMwLTEuMTEuODktMiAyLTJoMTBjMS4xMSAwIDIgLjg5IDIgMlwiLz48L3N2Zz4nXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ke2NvcHlMYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cHJlPjxjb2RlIGNsYXNzPVwiJHtjb2RlQ2xhc3N9XCI+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgLy8gU3RvcmUgdGhlIGhpZ2hsaWdodGVkIEhUTUxcbiAgICAgICAgICBoaWdobGlnaHRlZEJsb2Nrcy5zZXQoYmxvY2tJZCwgZnVsbEh0bWwpO1xuXG4gICAgICAgICAgLy8gQ2hhbmdlIHRoZSB0b2tlbiB0byBhbiBodG1sIHRva2VuIHRvIGJ5cGFzcyBtYXJrZWQncyBlc2NhcGluZ1xuICAgICAgICAgIHRva2VuLnR5cGUgPSBcImh0bWxcIjtcbiAgICAgICAgICB0b2tlbi50ZXh0ID0gZnVsbEh0bWw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1hcmtkb3duKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZWQgaWYgbm90IGFscmVhZHkgZG9uZVxuICAgIHRoaXMuaW5pdGlhbGl6ZU1hcmtlZCgpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGNvZGUgYmxvY2tzIG1hcCBmb3IgbmV3IHJlbmRlclxuICAgIHRoaXMuY29kZUJsb2Nrc01hcC5jbGVhcigpO1xuXG4gICAgLy8gUGFyc2UgbWFya2Rvd25cbiAgICBsZXQgaHRtbCA9IHRoaXMubWFya2VkSW5zdGFuY2UhLnBhcnNlKGNvbnRlbnQpIGFzIHN0cmluZztcblxuICAgIC8vIFByb2Nlc3MgbWF0aCBlcXVhdGlvbnNcbiAgICBodG1sID0gdGhpcy5wcm9jZXNzTWF0aEVxdWF0aW9ucyhodG1sKTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTWF0aEVxdWF0aW9ucyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEZpcnN0LCB0ZW1wb3JhcmlseSByZXBsYWNlIGNvZGUgYmxvY2tzIHdpdGggcGxhY2Vob2xkZXJzIHRvIHByb3RlY3QgdGhlbSBmcm9tIG1hdGggcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGNvZGVCbG9ja3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBcIl9fX0NPREVfQkxPQ0tfUExBQ0VIT0xERVJfXCI7XG5cbiAgICAvLyBTdG9yZSBjb2RlIGJsb2NrcyBhbmQgcmVwbGFjZSB3aXRoIHBsYWNlaG9sZGVyc1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxwcmU+PGNvZGVbXFxzXFxTXSo/PFxcL2NvZGU+PFxcL3ByZT4vZywgKG1hdGNoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGNvZGVCbG9ja3MubGVuZ3RoO1xuICAgICAgY29kZUJsb2Nrcy5wdXNoKG1hdGNoKTtcbiAgICAgIHJldHVybiBgJHtwbGFjZWhvbGRlcn0ke2luZGV4fV9fX2A7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIHByb3RlY3QgaW5saW5lIGNvZGVcbiAgICBjb25zdCBpbmxpbmVDb2RlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGlubGluZVBsYWNlaG9sZGVyID0gXCJfX19JTkxJTkVfQ09ERV9QTEFDRUhPTERFUl9cIjtcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC88Y29kZT5bXFxzXFxTXSo/PFxcL2NvZGU+L2csIChtYXRjaCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBpbmxpbmVDb2RlLmxlbmd0aDtcbiAgICAgIGlubGluZUNvZGUucHVzaChtYXRjaCk7XG4gICAgICByZXR1cm4gYCR7aW5saW5lUGxhY2Vob2xkZXJ9JHtpbmRleH1fX19gO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBkaXNwbGF5IG1hdGggJCQgLi4uICQkXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwkXFwkKFtcXHNcXFNdKj8pXFwkXFwkL2csIChtYXRjaCwgZXF1YXRpb24pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBrYXRleC5yZW5kZXJUb1N0cmluZyhlcXVhdGlvbiwge1xuICAgICAgICAgIGRpc3BsYXlNb2RlOiB0cnVlLFxuICAgICAgICAgIHRocm93T25FcnJvcjogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByb2Nlc3MgaW5saW5lIG1hdGggJCAuLi4gJFxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcJChbXlxcJF0rKVxcJC9nLCAobWF0Y2gsIGVxdWF0aW9uKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4ga2F0ZXgucmVuZGVyVG9TdHJpbmcoZXF1YXRpb24sIHtcbiAgICAgICAgICBkaXNwbGF5TW9kZTogZmFsc2UsXG4gICAgICAgICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBjb2RlIGJsb2Nrc1xuICAgIGNvZGVCbG9ja3MuZm9yRWFjaCgoYmxvY2ssIGluZGV4KSA9PiB7XG4gICAgICBodG1sID0gaHRtbC5yZXBsYWNlKGAke3BsYWNlaG9sZGVyfSR7aW5kZXh9X19fYCwgYmxvY2spO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBpbmxpbmUgY29kZVxuICAgIGlubGluZUNvZGUuZm9yRWFjaCgoY29kZSwgaW5kZXgpID0+IHtcbiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoYCR7aW5saW5lUGxhY2Vob2xkZXJ9JHtpbmRleH1fX19gLCBjb2RlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNYXRoRXF1YXRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXJrZG93bkNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5tYXJrZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gRmluZCBhbGwgbWF0aCBwbGFjZWhvbGRlcnMgYW5kIHJlbmRlciB0aGVtXG4gICAgY29uc3QgbWF0aEVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubWF0aC1wbGFjZWhvbGRlclwiKTtcbiAgICBtYXRoRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgZXF1YXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZXF1YXRpb25cIik7XG4gICAgICBjb25zdCBkaXNwbGF5TW9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1kaXNwbGF5XCIpID09PSBcInRydWVcIjtcblxuICAgICAgaWYgKGVxdWF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAga2F0ZXgucmVuZGVyKGVxdWF0aW9uLCBlbGVtZW50IGFzIEhUTUxFbGVtZW50LCB7XG4gICAgICAgICAgICBkaXNwbGF5TW9kZSxcbiAgICAgICAgICAgIHRocm93T25FcnJvcjogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byByZW5kZXIgbWF0aCBlcXVhdGlvbjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIENoZWNrIGlmIGNsaWNrZWQgb24gY29weSBidXR0b24gb3IgaXRzIGNoaWxkcmVuXG4gICAgY29uc3QgY29weUJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KFxuICAgICAgXCIuY29kZS1ibG9jay1jb3B5LWJ1dHRvblwiXG4gICAgKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAoY29weUJ1dHRvbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGJsb2NrSWQgPSBjb3B5QnV0dG9uLmdldEF0dHJpYnV0ZShcImRhdGEtY29kZS1ibG9jay1pZFwiKTtcblxuICAgICAgaWYgKGJsb2NrSWQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSByYXcgY29kZSBmcm9tIG91ciBtYXAgaW5zdGVhZCBvZiBmcm9tIERPTVxuICAgICAgICBjb25zdCBjb2RlID0gdGhpcy5jb2RlQmxvY2tzTWFwLmdldChibG9ja0lkKTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICB0aGlzLmNvcHlDb2RlQmxvY2soYmxvY2tJZCwgY29kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvcHlDb2RlQmxvY2soYmxvY2tJZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2RlKS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgY29weSBzdGF0ZVxuICAgICAgICBjb25zdCBuZXdTdGF0ZXMgPSBuZXcgTWFwKHRoaXMuY29weVN0YXRlU2lnbmFsKCkpO1xuICAgICAgICBuZXdTdGF0ZXMuc2V0KGJsb2NrSWQsIHRydWUpO1xuICAgICAgICB0aGlzLmNvcHlTdGF0ZVNpZ25hbC5zZXQobmV3U3RhdGVzKTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1dHRvbiBpbiB0aGUgRE9NXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYFtkYXRhLWNvZGUtYmxvY2staWQ9XCIke2Jsb2NrSWR9XCJdYFxuICAgICAgICApO1xuICAgICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxIVE1MID0gYnV0dG9uLmlubmVySFRNTDtcbiAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgNiA5IDE3bC01LTVcIi8+PC9zdmc+XG4gICAgICAgICAgICA8c3Bhbj4ke3RoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVDb3BpZWRMYWJlbH08L3NwYW4+XG4gICAgICAgICAgYDtcbiAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICBgJHt0aGlzLmxhYmVscy5hc3Npc3RhbnRNZXNzYWdlVG9vbGJhckNvcHlDb2RlQ29waWVkTGFiZWx9IGNvZGVgXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlc2V0IGFmdGVyIDIgc2Vjb25kc1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0gbmV3IE1hcCh0aGlzLmNvcHlTdGF0ZVNpZ25hbCgpKTtcbiAgICAgICAgICAgIHN0YXRlcy5zZXQoYmxvY2tJZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jb3B5U3RhdGVTaWduYWwuc2V0KHN0YXRlcyk7XG4gICAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gb3JpZ2luYWxIVE1MO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgIGAke3RoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVMYWJlbH0gY29kZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY29weSBjb2RlOlwiLCBlcnIpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQmxvY2tJZChjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNpbXBsZSBoYXNoIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBJRHNcbiAgICBsZXQgaGFzaCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gY29kZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7XG4gICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzItYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGBjb2RlLWJsb2NrLSR7aGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG59XG4iXX0=
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Directive, Input, signal, computed } from '@angular/core';
|
|
2
|
-
import { cn } from '../../lib/utils';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class CopilotChatAssistantMessageToolbarComponent {
|
|
5
|
-
set inputClass(value) {
|
|
6
|
-
this.customClass.set(value);
|
|
7
|
-
}
|
|
8
|
-
customClass = signal(undefined);
|
|
9
|
-
computedClass = computed(() => {
|
|
10
|
-
return cn('w-full bg-transparent flex items-center -ml-[5px] -mt-[0px]', this.customClass());
|
|
11
|
-
});
|
|
12
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
13
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAssistantMessageToolbarComponent, isStandalone: true, selector: "[copilotChatAssistantMessageToolbar]", inputs: { inputClass: "inputClass" }, host: { properties: { "class": "computedClass()" } }, ngImport: i0 });
|
|
14
|
-
}
|
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageToolbarComponent, decorators: [{
|
|
16
|
-
type: Directive,
|
|
17
|
-
args: [{
|
|
18
|
-
selector: '[copilotChatAssistantMessageToolbar]',
|
|
19
|
-
standalone: true,
|
|
20
|
-
host: {
|
|
21
|
-
'[class]': 'computedClass()'
|
|
22
|
-
}
|
|
23
|
-
}]
|
|
24
|
-
}], propDecorators: { inputClass: [{
|
|
25
|
-
type: Input
|
|
26
|
-
}] } });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBU3JDLE1BQU0sT0FBTywyQ0FBMkM7SUFDdEQsSUFBYSxVQUFVLENBQUMsS0FBeUI7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLFdBQVcsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRTVELGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzVCLE9BQU8sRUFBRSxDQUNQLDZEQUE2RCxFQUM3RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQzt3R0FaUSwyQ0FBMkM7NEZBQTNDLDJDQUEyQzs7NEZBQTNDLDJDQUEyQztrQkFQdkQsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0NBQXNDO29CQUNoRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKLFNBQVMsRUFBRSxpQkFBaUI7cUJBQzdCO2lCQUNGOzhCQUVjLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcygpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb21wb25lbnQge1xuICBASW5wdXQoKSBzZXQgaW5wdXRDbGFzcyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jdXN0b21DbGFzcy5zZXQodmFsdWUpO1xuICB9XG4gIFxuICBwcml2YXRlIGN1c3RvbUNsYXNzID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgXG4gIGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3ctZnVsbCBiZy10cmFuc3BhcmVudCBmbGV4IGl0ZW1zLWNlbnRlciAtbWwtWzVweF0gLW10LVswcHhdJyxcbiAgICAgIHRoaXMuY3VzdG9tQ2xhc3MoKVxuICAgICk7XG4gIH0pO1xufSJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc2lzdGFudE1lc3NhZ2UgfSBmcm9tICdAYWctdWkvY2xpZW50JztcblxuLy8gQ29udGV4dCBpbnRlcmZhY2VzIGZvciBzbG90c1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRNZXNzYWdlTWFya2Rvd25SZW5kZXJlckNvbnRleHQge1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb250ZXh0IHtcbiAgY2hpbGRyZW4/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TWVzc2FnZUNvcHlCdXR0b25Db250ZXh0IHtcbiAgY29udGVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNVcEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHVtYnNEb3duQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRBbG91ZEJ1dHRvbkNvbnRleHQge1xuICAvLyBFbXB0eSBjb250ZXh0IC0gY2xpY2sgaGFuZGxlZCB2aWEgb3V0cHV0cyBtYXBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdlbmVyYXRlQnV0dG9uQ29udGV4dCB7XG4gIC8vIEVtcHR5IGNvbnRleHQgLSBjbGljayBoYW5kbGVkIHZpYSBvdXRwdXRzIG1hcFxufVxuXG4vLyBFdmVudCBoYW5kbGVyIHByb3BzXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uVGh1bWJzVXBQcm9wcyB7XG4gIG1lc3NhZ2U6IEFzc2lzdGFudE1lc3NhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlT25UaHVtYnNEb3duUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVhZEFsb3VkUHJvcHMge1xuICBtZXNzYWdlOiBBc3Npc3RhbnRNZXNzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZU9uUmVnZW5lcmF0ZVByb3BzIHtcbiAgbWVzc2FnZTogQXNzaXN0YW50TWVzc2FnZTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBBc3Npc3RhbnRNZXNzYWdlIH07Il19
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ViewChild, signal, computed, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { AudioRecorderError } from './copilot-chat-input.types';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class CopilotChatAudioRecorderComponent {
|
|
5
|
-
canvasRef;
|
|
6
|
-
set inputClass(val) {
|
|
7
|
-
this.customClass.set(val);
|
|
8
|
-
}
|
|
9
|
-
set inputShowControls(val) {
|
|
10
|
-
this.showControls.set(val ?? false);
|
|
11
|
-
}
|
|
12
|
-
stateChange = new EventEmitter();
|
|
13
|
-
error = new EventEmitter();
|
|
14
|
-
// Signals for state management
|
|
15
|
-
state = signal('idle');
|
|
16
|
-
customClass = signal(undefined);
|
|
17
|
-
showControls = signal(false);
|
|
18
|
-
// Computed values
|
|
19
|
-
computedClass = computed(() => {
|
|
20
|
-
const baseClasses = 'h-11 w-full px-5';
|
|
21
|
-
return `${baseClasses} ${this.customClass() || ''}`;
|
|
22
|
-
});
|
|
23
|
-
statusText = computed(() => {
|
|
24
|
-
switch (this.state()) {
|
|
25
|
-
case 'recording':
|
|
26
|
-
return 'Recording...';
|
|
27
|
-
case 'processing':
|
|
28
|
-
return 'Processing...';
|
|
29
|
-
default:
|
|
30
|
-
return 'Ready';
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
// Animation and canvas properties
|
|
34
|
-
animationFrameId;
|
|
35
|
-
ngAfterViewInit() {
|
|
36
|
-
this.startAnimation();
|
|
37
|
-
}
|
|
38
|
-
ngOnDestroy() {
|
|
39
|
-
this.dispose();
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Start recording audio
|
|
43
|
-
*/
|
|
44
|
-
async start() {
|
|
45
|
-
try {
|
|
46
|
-
if (this.state() === 'recording') {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
this.setState('recording');
|
|
50
|
-
this.startAnimation();
|
|
51
|
-
// In a real implementation, this would start actual audio recording
|
|
52
|
-
// For now, we just simulate the recording state
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to start recording');
|
|
56
|
-
this.error.emit(error);
|
|
57
|
-
this.setState('idle');
|
|
58
|
-
throw error;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Stop recording audio and return blob
|
|
63
|
-
*/
|
|
64
|
-
async stop() {
|
|
65
|
-
try {
|
|
66
|
-
this.setState('idle');
|
|
67
|
-
// Return empty blob - stub implementation
|
|
68
|
-
const emptyBlob = new Blob([], { type: 'audio/webm' });
|
|
69
|
-
return emptyBlob;
|
|
70
|
-
}
|
|
71
|
-
catch (err) {
|
|
72
|
-
const error = new AudioRecorderError(err instanceof Error ? err.message : 'Failed to stop recording');
|
|
73
|
-
this.error.emit(error);
|
|
74
|
-
this.setState('idle');
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Get current recorder state
|
|
80
|
-
*/
|
|
81
|
-
getState() {
|
|
82
|
-
return this.state();
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Dispose of resources
|
|
86
|
-
*/
|
|
87
|
-
dispose() {
|
|
88
|
-
this.stopAnimation();
|
|
89
|
-
}
|
|
90
|
-
setState(state) {
|
|
91
|
-
this.state.set(state);
|
|
92
|
-
this.stateChange.emit(state);
|
|
93
|
-
}
|
|
94
|
-
startAnimation() {
|
|
95
|
-
const canvas = this.canvasRef.nativeElement;
|
|
96
|
-
if (!canvas)
|
|
97
|
-
return;
|
|
98
|
-
const ctx = canvas.getContext('2d');
|
|
99
|
-
if (!ctx)
|
|
100
|
-
return;
|
|
101
|
-
const draw = () => {
|
|
102
|
-
const rect = canvas.getBoundingClientRect();
|
|
103
|
-
const dpr = window.devicePixelRatio || 1;
|
|
104
|
-
// Update canvas dimensions if container resized
|
|
105
|
-
if (canvas.width !== rect.width * dpr ||
|
|
106
|
-
canvas.height !== rect.height * dpr) {
|
|
107
|
-
canvas.width = rect.width * dpr;
|
|
108
|
-
canvas.height = rect.height * dpr;
|
|
109
|
-
ctx.scale(dpr, dpr);
|
|
110
|
-
ctx.imageSmoothingEnabled = false;
|
|
111
|
-
}
|
|
112
|
-
// Configuration
|
|
113
|
-
const barWidth = 2;
|
|
114
|
-
const minHeight = 2;
|
|
115
|
-
const maxHeight = 20;
|
|
116
|
-
const gap = 2;
|
|
117
|
-
const numSamples = Math.ceil(rect.width / (barWidth + gap));
|
|
118
|
-
// Get loudness data
|
|
119
|
-
const loudnessData = this.getLoudness(numSamples);
|
|
120
|
-
// Clear canvas
|
|
121
|
-
ctx.clearRect(0, 0, rect.width, rect.height);
|
|
122
|
-
// Get current foreground color
|
|
123
|
-
const computedStyle = getComputedStyle(canvas);
|
|
124
|
-
const currentForeground = computedStyle.color;
|
|
125
|
-
// Draw bars
|
|
126
|
-
ctx.fillStyle = currentForeground;
|
|
127
|
-
const centerY = rect.height / 2;
|
|
128
|
-
for (let i = 0; i < loudnessData.length; i++) {
|
|
129
|
-
const sample = loudnessData[i] ?? 0;
|
|
130
|
-
const barHeight = Math.round(sample * (maxHeight - minHeight) + minHeight);
|
|
131
|
-
const x = Math.round(i * (barWidth + gap));
|
|
132
|
-
const y = Math.round(centerY - barHeight / 2);
|
|
133
|
-
ctx.fillRect(x, y, barWidth, barHeight);
|
|
134
|
-
}
|
|
135
|
-
this.animationFrameId = requestAnimationFrame(draw);
|
|
136
|
-
};
|
|
137
|
-
draw();
|
|
138
|
-
}
|
|
139
|
-
stopAnimation() {
|
|
140
|
-
if (this.animationFrameId) {
|
|
141
|
-
cancelAnimationFrame(this.animationFrameId);
|
|
142
|
-
this.animationFrameId = undefined;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
getLoudness(n) {
|
|
146
|
-
const elapsed = Date.now() / 1000; // Use current timestamp directly
|
|
147
|
-
const samples = [];
|
|
148
|
-
for (let i = 0; i < n; i++) {
|
|
149
|
-
// Create a position that moves from left to right over time
|
|
150
|
-
const position = (i / n) * 10 + elapsed * 0.5; // Scroll speed (slower)
|
|
151
|
-
// Generate waveform using multiple sine waves for realism
|
|
152
|
-
const wave1 = Math.sin(position * 2) * 0.3;
|
|
153
|
-
const wave2 = Math.sin(position * 5 + elapsed) * 0.2;
|
|
154
|
-
const wave3 = Math.sin(position * 0.5 + elapsed * 0.3) * 0.4;
|
|
155
|
-
// Add some randomness for natural variation
|
|
156
|
-
const noise = (Math.random() - 0.5) * 0.1;
|
|
157
|
-
// Combine waves and add envelope for realistic amplitude variation
|
|
158
|
-
const envelope = Math.sin(elapsed * 0.7) * 0.5 + 0.5; // Slow amplitude modulation
|
|
159
|
-
let amplitude = (wave1 + wave2 + wave3 + noise) * envelope;
|
|
160
|
-
// Clamp to 0-1 range
|
|
161
|
-
amplitude = Math.max(0, Math.min(1, amplitude * 0.5 + 0.3));
|
|
162
|
-
samples.push(amplitude);
|
|
163
|
-
}
|
|
164
|
-
return samples;
|
|
165
|
-
}
|
|
166
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
167
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAudioRecorderComponent, isStandalone: true, selector: "copilot-chat-audio-recorder", inputs: { inputClass: "inputClass", inputShowControls: "inputShowControls" }, outputs: { stateChange: "stateChange", error: "error" }, host: { properties: { "class.copilot-chat-audio-recorder": "true" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvasRef"], descendants: true, static: true }], ngImport: i0, template: `
|
|
168
|
-
<div [class]="computedClass()">
|
|
169
|
-
<canvas
|
|
170
|
-
#canvasRef
|
|
171
|
-
class="w-full h-full"
|
|
172
|
-
[style.imageRendering]="'pixelated'"
|
|
173
|
-
></canvas>
|
|
174
|
-
</div>
|
|
175
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
176
|
-
}
|
|
177
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAudioRecorderComponent, decorators: [{
|
|
178
|
-
type: Component,
|
|
179
|
-
args: [{ selector: 'copilot-chat-audio-recorder', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
180
|
-
<div [class]="computedClass()">
|
|
181
|
-
<canvas
|
|
182
|
-
#canvasRef
|
|
183
|
-
class="w-full h-full"
|
|
184
|
-
[style.imageRendering]="'pixelated'"
|
|
185
|
-
></canvas>
|
|
186
|
-
</div>
|
|
187
|
-
`, host: {
|
|
188
|
-
'[class.copilot-chat-audio-recorder]': 'true'
|
|
189
|
-
} }]
|
|
190
|
-
}], propDecorators: { canvasRef: [{
|
|
191
|
-
type: ViewChild,
|
|
192
|
-
args: ['canvasRef', { static: true }]
|
|
193
|
-
}], inputClass: [{
|
|
194
|
-
type: Input
|
|
195
|
-
}], inputShowControls: [{
|
|
196
|
-
type: Input
|
|
197
|
-
}], stateChange: [{
|
|
198
|
-
type: Output
|
|
199
|
-
}], error: [{
|
|
200
|
-
type: Output
|
|
201
|
-
}] } });
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFJVCxNQUFNLEVBQ04sUUFBUSxFQUNSLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFCcEYsTUFBTSxPQUFPLGlDQUFpQztJQUNGLFNBQVMsQ0FBaUM7SUFFcEYsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsR0FBd0I7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDckQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBRXpELCtCQUErQjtJQUMvQixLQUFLLEdBQUcsTUFBTSxDQUFxQixNQUFNLENBQUMsQ0FBQztJQUMzQyxXQUFXLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLEdBQUcsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLEtBQUssWUFBWTtnQkFDZixPQUFPLGVBQWUsQ0FBQztZQUN6QjtnQkFDRSxPQUFPLE9BQU8sQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxrQ0FBa0M7SUFDMUIsZ0JBQWdCLENBQVU7SUFFbEMsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNqQyxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXRCLG9FQUFvRTtZQUNwRSxnREFBZ0Q7UUFFbEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLGtCQUFrQixDQUNsQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FDakUsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLDBDQUEwQztZQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN2RCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksa0JBQWtCLENBQ2xDLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUNoRSxDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQXlCO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUVqQixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQztZQUV6QyxnREFBZ0Q7WUFDaEQsSUFDRSxNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRztnQkFDakMsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFDbkMsQ0FBQztnQkFDRCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNsQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNwQyxDQUFDO1lBRUQsZ0JBQWdCO1lBQ2hCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNuQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDcEIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNkLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTVELG9CQUFvQjtZQUNwQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRWxELGVBQWU7WUFDZixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFN0MsK0JBQStCO1lBQy9CLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUU5QyxZQUFZO1lBQ1osR0FBRyxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztZQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUVoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUMxQixNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUM3QyxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFOUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztRQUVGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLENBQVM7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztRQUNwRSxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFFN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLDREQUE0RDtZQUM1RCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLHdCQUF3QjtZQUV2RSwwREFBMEQ7WUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFFN0QsNENBQTRDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUUxQyxtRUFBbUU7WUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLDRCQUE0QjtZQUNsRixJQUFJLFNBQVMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUUzRCxxQkFBcUI7WUFDckIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3dHQTVNVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQywyWkFkbEM7Ozs7Ozs7O0dBUVQ7OzRGQU1VLGlDQUFpQztrQkFuQjdDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxZQUMzQjs7Ozs7Ozs7R0FRVCxRQUVLO3dCQUNKLHFDQUFxQyxFQUFFLE1BQU07cUJBQzlDOzhCQUd5QyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTNCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU3RhdGUsIEF1ZGlvUmVjb3JkZXJFcnJvciB9IGZyb20gJy4vY29waWxvdC1jaGF0LWlucHV0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNSZWZcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgW3N0eWxlLmltYWdlUmVuZGVyaW5nXT1cIidwaXhlbGF0ZWQnXCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBcbiAgQElucHV0KCkgc2V0IGlucHV0Q2xhc3ModmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmN1c3RvbUNsYXNzLnNldCh2YWwpO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgaW5wdXRTaG93Q29udHJvbHModmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zaG93Q29udHJvbHMuc2V0KHZhbCA/PyBmYWxzZSk7XG4gIH1cbiAgXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXVkaW9SZWNvcmRlclN0YXRlPigpO1xuICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEF1ZGlvUmVjb3JkZXJFcnJvcj4oKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAgc3RhdGUgPSBzaWduYWw8QXVkaW9SZWNvcmRlclN0YXRlPignaWRsZScpO1xuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNob3dDb250cm9scyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIFxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdoLTExIHctZnVsbCBweC01JztcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9ICR7dGhpcy5jdXN0b21DbGFzcygpIHx8ICcnfWA7XG4gIH0pO1xuICBcbiAgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUoKSkge1xuICAgICAgY2FzZSAncmVjb3JkaW5nJzpcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcuLi4nO1xuICAgICAgY2FzZSAncHJvY2Vzc2luZyc6XG4gICAgICAgIHJldHVybiAnUHJvY2Vzc2luZy4uLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1JlYWR5JztcbiAgICB9XG4gIH0pO1xuICBcbiAgLy8gQW5pbWF0aW9uIGFuZCBjYW52YXMgcHJvcGVydGllc1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBhdWRpb1xuICAgKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlKCkgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5zZXRTdGF0ZSgncmVjb3JkaW5nJyk7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzdGFydCBhY3R1YWwgYXVkaW8gcmVjb3JkaW5nXG4gICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IHNpbXVsYXRlIHRoZSByZWNvcmRpbmcgc3RhdGVcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcnXG4gICAgICApO1xuICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoJ2lkbGUnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0b3AgcmVjb3JkaW5nIGF1ZGlvIGFuZCByZXR1cm4gYmxvYlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPEJsb2I+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGJsb2IgLSBzdHViIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBlbXB0eUJsb2IgPSBuZXcgQmxvYihbXSwgeyB0eXBlOiAnYXVkaW8vd2VibScgfSk7XG4gICAgICByZXR1cm4gZW1wdHlCbG9iO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdG9wIHJlY29yZGluZydcbiAgICAgICk7XG4gICAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmVjb3JkZXIgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEF1ZGlvUmVjb3JkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShzdGF0ZTogQXVkaW9SZWNvcmRlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgLy8gVXBkYXRlIGNhbnZhcyBkaW1lbnNpb25zIGlmIGNvbnRhaW5lciByZXNpemVkXG4gICAgICBpZiAoXG4gICAgICAgIGNhbnZhcy53aWR0aCAhPT0gcmVjdC53aWR0aCAqIGRwciB8fFxuICAgICAgICBjYW52YXMuaGVpZ2h0ICE9PSByZWN0LmhlaWdodCAqIGRwclxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHI7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZWN0LmhlaWdodCAqIGRwcjtcbiAgICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBiYXJXaWR0aCA9IDI7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSAyO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gMjA7XG4gICAgICBjb25zdCBnYXAgPSAyO1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IE1hdGguY2VpbChyZWN0LndpZHRoIC8gKGJhcldpZHRoICsgZ2FwKSk7XG5cbiAgICAgIC8vIEdldCBsb3VkbmVzcyBkYXRhXG4gICAgICBjb25zdCBsb3VkbmVzc0RhdGEgPSB0aGlzLmdldExvdWRuZXNzKG51bVNhbXBsZXMpO1xuXG4gICAgICAvLyBDbGVhciBjYW52YXNcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgICAgY29uc3QgY3VycmVudEZvcmVncm91bmQgPSBjb21wdXRlZFN0eWxlLmNvbG9yO1xuXG4gICAgICAvLyBEcmF3IGJhcnNcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBjdXJyZW50Rm9yZWdyb3VuZDtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG91ZG5lc3NEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IGxvdWRuZXNzRGF0YVtpXSA/PyAwO1xuICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIHNhbXBsZSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpICsgbWluSGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKGkgKiAoYmFyV2lkdGggKyBnYXApKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQoY2VudGVyWSAtIGJhckhlaWdodCAvIDIpO1xuXG4gICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCBiYXJXaWR0aCwgYmFySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXcpO1xuICAgIH07XG5cbiAgICBkcmF3KCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG91ZG5lc3MobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC8gMTAwMDsgLy8gVXNlIGN1cnJlbnQgdGltZXN0YW1wIGRpcmVjdGx5XG4gICAgY29uc3Qgc2FtcGxlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiB0aGF0IG1vdmVzIGZyb20gbGVmdCB0byByaWdodCBvdmVyIHRpbWVcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKGkgLyBuKSAqIDEwICsgZWxhcHNlZCAqIDAuNTsgLy8gU2Nyb2xsIHNwZWVkIChzbG93ZXIpXG5cbiAgICAgIC8vIEdlbmVyYXRlIHdhdmVmb3JtIHVzaW5nIG11bHRpcGxlIHNpbmUgd2F2ZXMgZm9yIHJlYWxpc21cbiAgICAgIGNvbnN0IHdhdmUxID0gTWF0aC5zaW4ocG9zaXRpb24gKiAyKSAqIDAuMztcbiAgICAgIGNvbnN0IHdhdmUyID0gTWF0aC5zaW4ocG9zaXRpb24gKiA1ICsgZWxhcHNlZCkgKiAwLjI7XG4gICAgICBjb25zdCB3YXZlMyA9IE1hdGguc2luKHBvc2l0aW9uICogMC41ICsgZWxhcHNlZCAqIDAuMykgKiAwLjQ7XG5cbiAgICAgIC8vIEFkZCBzb21lIHJhbmRvbW5lc3MgZm9yIG5hdHVyYWwgdmFyaWF0aW9uXG4gICAgICBjb25zdCBub2lzZSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMTtcblxuICAgICAgLy8gQ29tYmluZSB3YXZlcyBhbmQgYWRkIGVudmVsb3BlIGZvciByZWFsaXN0aWMgYW1wbGl0dWRlIHZhcmlhdGlvblxuICAgICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLnNpbihlbGFwc2VkICogMC43KSAqIDAuNSArIDAuNTsgLy8gU2xvdyBhbXBsaXR1ZGUgbW9kdWxhdGlvblxuICAgICAgbGV0IGFtcGxpdHVkZSA9ICh3YXZlMSArIHdhdmUyICsgd2F2ZTMgKyBub2lzZSkgKiBlbnZlbG9wZTtcblxuICAgICAgLy8gQ2xhbXAgdG8gMC0xIHJhbmdlXG4gICAgICBhbXBsaXR1ZGUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhbXBsaXR1ZGUgKiAwLjUgKyAwLjMpKTtcblxuICAgICAgc2FtcGxlcy5wdXNoKGFtcGxpdHVkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbXBsZXM7XG4gIH1cbn0iXX0=
|