@copilotkitnext/angular 0.0.9-alpha.3 → 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.
Files changed (210) hide show
  1. package/dist/esm2022/index.mjs +2 -70
  2. package/dist/esm2022/lib/agent.mjs +73 -0
  3. package/dist/esm2022/lib/chat-config.mjs +35 -0
  4. package/dist/esm2022/lib/chat-state.mjs +18 -0
  5. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  6. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  7. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  8. package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
  9. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  10. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  37. package/dist/esm2022/lib/config.mjs +9 -0
  38. package/dist/esm2022/lib/copilotkit.mjs +124 -0
  39. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  40. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  41. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  42. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  43. package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
  44. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  45. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  46. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  47. package/dist/esm2022/lib/slots/index.mjs +4 -0
  48. package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
  49. package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
  50. package/dist/esm2022/lib/tools.mjs +31 -0
  51. package/dist/esm2022/lib/utils.mjs +3 -3
  52. package/dist/esm2022/public-api.mjs +47 -0
  53. package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
  54. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  55. package/dist/index.d.ts +1 -55
  56. package/dist/lib/agent.d.ts +53 -0
  57. package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
  58. package/dist/lib/chat-state.d.ts +10 -0
  59. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  60. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  61. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  62. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
  63. package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
  64. package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
  65. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  66. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  67. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  68. package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
  69. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  70. package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
  71. package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
  72. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  73. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
  74. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  75. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  76. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
  77. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  78. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  79. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  80. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
  81. package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
  82. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  83. package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
  84. package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
  85. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  86. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  87. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
  88. package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
  89. package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
  90. package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
  91. package/dist/lib/config.d.ts +16 -0
  92. package/dist/lib/copilotkit.d.ts +29 -0
  93. package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
  94. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  95. package/dist/lib/directives/tooltip.d.ts +33 -0
  96. package/dist/lib/human-in-the-loop.d.ts +13 -0
  97. package/dist/lib/render-tool-calls.d.ts +75 -0
  98. package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
  99. package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
  100. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  101. package/dist/lib/slots/index.d.ts +3 -0
  102. package/dist/lib/slots/slot.types.d.ts +1 -1
  103. package/dist/lib/slots/slot.utils.d.ts +6 -4
  104. package/dist/lib/tools.d.ts +63 -0
  105. package/dist/lib/utils.d.ts +1 -1
  106. package/dist/public-api.d.ts +46 -0
  107. package/dist/styles.css +0 -69
  108. package/package.json +3 -3
  109. package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
  110. package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
  111. package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
  112. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
  113. package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
  114. package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
  115. package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
  116. package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
  117. package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
  118. package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
  119. package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
  120. package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
  121. package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
  122. package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
  123. package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
  124. package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
  125. package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
  126. package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
  127. package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
  128. package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
  129. package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
  130. package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
  131. package/dist/components/chat/copilot-chat.component.d.ts +0 -36
  132. package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
  133. package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
  134. package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
  135. package/dist/core/copilotkit.providers.d.ts +0 -13
  136. package/dist/core/copilotkit.service.d.ts +0 -119
  137. package/dist/core/copilotkit.types.d.ts +0 -81
  138. package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
  139. package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
  140. package/dist/directives/copilotkit-config.directive.d.ts +0 -44
  141. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
  142. package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
  143. package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
  144. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
  145. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
  146. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
  147. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  148. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
  149. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
  150. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
  151. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
  152. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
  153. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
  154. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
  155. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
  156. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
  157. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
  158. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
  159. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
  160. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
  161. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
  162. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
  163. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
  164. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
  165. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
  166. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
  167. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
  168. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
  169. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
  170. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
  171. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
  172. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
  173. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
  174. package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
  175. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
  176. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
  177. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
  178. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
  179. package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
  180. package/dist/esm2022/core/copilotkit.service.mjs +0 -411
  181. package/dist/esm2022/core/copilotkit.types.mjs +0 -13
  182. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
  183. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
  184. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
  185. package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
  186. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
  187. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
  188. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
  189. package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
  190. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
  191. package/dist/esm2022/services/resize-observer.service.mjs +0 -152
  192. package/dist/esm2022/services/scroll-position.service.mjs +0 -124
  193. package/dist/esm2022/types/frontend-tool.mjs +0 -2
  194. package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
  195. package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
  196. package/dist/esm2022/utils/agent.utils.mjs +0 -212
  197. package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
  198. package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
  199. package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
  200. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
  201. package/dist/lib/directives/tooltip.directive.d.ts +0 -33
  202. package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
  203. package/dist/types/frontend-tool.d.ts +0 -37
  204. package/dist/types/human-in-the-loop.d.ts +0 -44
  205. package/dist/utils/agent-context.utils.d.ts +0 -75
  206. package/dist/utils/agent.utils.d.ts +0 -108
  207. package/dist/utils/chat-config.utils.d.ts +0 -166
  208. package/dist/utils/copilotkit.utils.d.ts +0 -16
  209. package/dist/utils/frontend-tool.utils.d.ts +0 -119
  210. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFNBQVMsRUFJVCxNQUFNLEVBQ04sUUFBUSxFQUNSLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFCcEYsTUFBTSxPQUFPLGlDQUFpQztJQUNGLFNBQVMsQ0FBaUM7SUFFcEYsSUFBYSxVQUFVLENBQUMsR0FBdUI7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsR0FBd0I7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDckQsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO0lBRXpELCtCQUErQjtJQUMvQixLQUFLLEdBQUcsTUFBTSxDQUFxQixNQUFNLENBQUMsQ0FBQztJQUMzQyxXQUFXLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNwRCxZQUFZLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRXRDLGtCQUFrQjtJQUNsQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLEdBQUcs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QUFHLFFBQVEsQ0FBQztZQUUzRCxxQkFBcUI7WUFDckIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO3dHQTVNVSxpQ0FBaUM7NEZBQWpDLGlDQUFpQywyWkFkbEM7Ozs7Ozs7O0dBUVQ7OzRGQU1VLGlDQUFpQztrQkFuQjdDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxZQUMzQjs7Ozs7Ozs7R0FRVCxRQUVLO3dCQUNKLHFDQUFxQyxFQUFFLE1BQU07cUJBQzlDOzhCQUd5QyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTNCLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8saUJBQWlCO3NCQUE3QixLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdWRpb1JlY29yZGVyU3RhdGUsIEF1ZGlvUmVjb3JkZXJFcnJvciB9IGZyb20gJy4vY29waWxvdC1jaGF0LWlucHV0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICA8Y2FudmFzXG4gICAgICAgICNjYW52YXNSZWZcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgW3N0eWxlLmltYWdlUmVuZGVyaW5nXT1cIidwaXhlbGF0ZWQnXCJcbiAgICAgID48L2NhbnZhcz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3MuY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc1JlZicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBcbiAgQElucHV0KCkgc2V0IGlucHV0Q2xhc3ModmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmN1c3RvbUNsYXNzLnNldCh2YWwpO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgaW5wdXRTaG93Q29udHJvbHModmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zaG93Q29udHJvbHMuc2V0KHZhbCA/PyBmYWxzZSk7XG4gIH1cbiAgXG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXVkaW9SZWNvcmRlclN0YXRlPigpO1xuICBAT3V0cHV0KCkgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPEF1ZGlvUmVjb3JkZXJFcnJvcj4oKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHN0YXRlIG1hbmFnZW1lbnRcbiAgc3RhdGUgPSBzaWduYWw8QXVkaW9SZWNvcmRlclN0YXRlPignaWRsZScpO1xuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNob3dDb250cm9scyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIFxuICAvLyBDb21wdXRlZCB2YWx1ZXNcbiAgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdoLTExIHctZnVsbCBweC01JztcbiAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9ICR7dGhpcy5jdXN0b21DbGFzcygpIHx8ICcnfWA7XG4gIH0pO1xuICBcbiAgc3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUoKSkge1xuICAgICAgY2FzZSAncmVjb3JkaW5nJzpcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcuLi4nO1xuICAgICAgY2FzZSAncHJvY2Vzc2luZyc6XG4gICAgICAgIHJldHVybiAnUHJvY2Vzc2luZy4uLic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ1JlYWR5JztcbiAgICB9XG4gIH0pO1xuICBcbiAgLy8gQW5pbWF0aW9uIGFuZCBjYW52YXMgcHJvcGVydGllc1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0YXJ0IHJlY29yZGluZyBhdWRpb1xuICAgKi9cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlKCkgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGhpcy5zZXRTdGF0ZSgncmVjb3JkaW5nJyk7XG4gICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgICBcbiAgICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzdGFydCBhY3R1YWwgYXVkaW8gcmVjb3JkaW5nXG4gICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IHNpbXVsYXRlIHRoZSByZWNvcmRpbmcgc3RhdGVcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcnXG4gICAgICApO1xuICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoJ2lkbGUnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFN0b3AgcmVjb3JkaW5nIGF1ZGlvIGFuZCByZXR1cm4gYmxvYlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPEJsb2I+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgLy8gUmV0dXJuIGVtcHR5IGJsb2IgLSBzdHViIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBlbXB0eUJsb2IgPSBuZXcgQmxvYihbXSwgeyB0eXBlOiAnYXVkaW8vd2VibScgfSk7XG4gICAgICByZXR1cm4gZW1wdHlCbG9iO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQXVkaW9SZWNvcmRlckVycm9yKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdG9wIHJlY29yZGluZydcbiAgICAgICk7XG4gICAgICB0aGlzLmVycm9yLmVtaXQoZXJyb3IpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSgnaWRsZScpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmVjb3JkZXIgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEF1ZGlvUmVjb3JkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzXG4gICAqL1xuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcEFuaW1hdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGF0ZShzdGF0ZTogQXVkaW9SZWNvcmRlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5zZXQoc3RhdGUpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RhcnRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgLy8gVXBkYXRlIGNhbnZhcyBkaW1lbnNpb25zIGlmIGNvbnRhaW5lciByZXNpemVkXG4gICAgICBpZiAoXG4gICAgICAgIGNhbnZhcy53aWR0aCAhPT0gcmVjdC53aWR0aCAqIGRwciB8fFxuICAgICAgICBjYW52YXMuaGVpZ2h0ICE9PSByZWN0LmhlaWdodCAqIGRwclxuICAgICAgKSB7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHJlY3Qud2lkdGggKiBkcHI7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSByZWN0LmhlaWdodCAqIGRwcjtcbiAgICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgICBjb25zdCBiYXJXaWR0aCA9IDI7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSAyO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gMjA7XG4gICAgICBjb25zdCBnYXAgPSAyO1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IE1hdGguY2VpbChyZWN0LndpZHRoIC8gKGJhcldpZHRoICsgZ2FwKSk7XG5cbiAgICAgIC8vIEdldCBsb3VkbmVzcyBkYXRhXG4gICAgICBjb25zdCBsb3VkbmVzc0RhdGEgPSB0aGlzLmdldExvdWRuZXNzKG51bVNhbXBsZXMpO1xuXG4gICAgICAvLyBDbGVhciBjYW52YXNcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjYW52YXMpO1xuICAgICAgY29uc3QgY3VycmVudEZvcmVncm91bmQgPSBjb21wdXRlZFN0eWxlLmNvbG9yO1xuXG4gICAgICAvLyBEcmF3IGJhcnNcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBjdXJyZW50Rm9yZWdyb3VuZDtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG91ZG5lc3NEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IGxvdWRuZXNzRGF0YVtpXSA/PyAwO1xuICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIHNhbXBsZSAqIChtYXhIZWlnaHQgLSBtaW5IZWlnaHQpICsgbWluSGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKGkgKiAoYmFyV2lkdGggKyBnYXApKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGgucm91bmQoY2VudGVyWSAtIGJhckhlaWdodCAvIDIpO1xuXG4gICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCBiYXJXaWR0aCwgYmFySGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRyYXcpO1xuICAgIH07XG5cbiAgICBkcmF3KCk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc3RvcEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG91ZG5lc3MobjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC8gMTAwMDsgLy8gVXNlIGN1cnJlbnQgdGltZXN0YW1wIGRpcmVjdGx5XG4gICAgY29uc3Qgc2FtcGxlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb3NpdGlvbiB0aGF0IG1vdmVzIGZyb20gbGVmdCB0byByaWdodCBvdmVyIHRpbWVcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gKGkgLyBuKSAqIDEwICsgZWxhcHNlZCAqIDAuNTsgLy8gU2Nyb2xsIHNwZWVkIChzbG93ZXIpXG5cbiAgICAgIC8vIEdlbmVyYXRlIHdhdmVmb3JtIHVzaW5nIG11bHRpcGxlIHNpbmUgd2F2ZXMgZm9yIHJlYWxpc21cbiAgICAgIGNvbnN0IHdhdmUxID0gTWF0aC5zaW4ocG9zaXRpb24gKiAyKSAqIDAuMztcbiAgICAgIGNvbnN0IHdhdmUyID0gTWF0aC5zaW4ocG9zaXRpb24gKiA1ICsgZWxhcHNlZCkgKiAwLjI7XG4gICAgICBjb25zdCB3YXZlMyA9IE1hdGguc2luKHBvc2l0aW9uICogMC41ICsgZWxhcHNlZCAqIDAuMykgKiAwLjQ7XG5cbiAgICAgIC8vIEFkZCBzb21lIHJhbmRvbW5lc3MgZm9yIG5hdHVyYWwgdmFyaWF0aW9uXG4gICAgICBjb25zdCBub2lzZSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDAuMTtcblxuICAgICAgLy8gQ29tYmluZSB3YXZlcyBhbmQgYWRkIGVudmVsb3BlIGZvciByZWFsaXN0aWMgYW1wbGl0dWRlIHZhcmlhdGlvblxuICAgICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLnNpbihlbGFwc2VkICogMC43KSAqIDAuNSArIDAuNTsgLy8gU2xvdyBhbXBsaXR1ZGUgbW9kdWxhdGlvblxuICAgICAgbGV0IGFtcGxpdHVkZSA9ICh3YXZlMSArIHdhdmUyICsgd2F2ZTMgKyBub2lzZSkgKiBlbnZlbG9wZTtcblxuICAgICAgLy8gQ2xhbXAgdG8gMC0xIHJhbmdlXG4gICAgICBhbXBsaXR1ZGUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhbXBsaXR1ZGUgKiAwLjUgKyAwLjMpKTtcblxuICAgICAgc2FtcGxlcy5wdXNoKGFtcGxpdHVkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbXBsZXM7XG4gIH1cbn0iXX0=