@copilotkitnext/angular 0.0.2 → 0.0.4

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 (168) hide show
  1. package/README.md +3 -3
  2. package/dist/README.md +3 -3
  3. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
  4. package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
  5. package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  7. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  8. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  9. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  11. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  12. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  13. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  14. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  15. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  16. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  17. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  18. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  19. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  20. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  21. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  22. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  23. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  24. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  25. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  26. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  29. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  30. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  31. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  32. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  37. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  38. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  39. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  40. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  41. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  42. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  43. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  44. package/dist/esm2022/core/copilotkit.service.mjs +430 -0
  45. package/dist/esm2022/core/copilotkit.types.mjs +12 -0
  46. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  47. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  48. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  49. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  50. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
  52. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  53. package/dist/esm2022/index.mjs +70 -0
  54. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  55. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  56. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  57. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  58. package/dist/esm2022/lib/utils.mjs +10 -0
  59. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  60. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  61. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  62. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  63. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  64. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  65. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  66. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  67. package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
  68. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
  69. package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
  70. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  71. package/package.json +21 -18
  72. package/vitest.config.mts +32 -21
  73. package/.turbo/turbo-build.log +0 -38
  74. package/.turbo/turbo-check-types.log +0 -0
  75. package/.turbo/turbo-test.log +0 -71
  76. package/ng-package.json +0 -19
  77. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  78. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  79. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  80. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  81. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  82. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  83. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  84. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  85. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  86. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  87. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  88. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  89. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  90. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  91. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  92. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  93. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  94. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  95. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  96. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  97. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  98. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  99. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  100. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  101. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  102. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  103. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  104. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  105. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  106. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  107. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  108. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  109. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  110. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  111. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  112. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  113. package/src/components/chat/copilot-chat.component.ts +0 -232
  114. package/src/components/copilotkit-tool-render.component.ts +0 -169
  115. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  116. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  117. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  118. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  119. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  120. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  121. package/src/core/copilotkit.providers.ts +0 -59
  122. package/src/core/copilotkit.service.ts +0 -542
  123. package/src/core/copilotkit.types.ts +0 -132
  124. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  125. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  126. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  127. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  128. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  129. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  130. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  131. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  132. package/src/directives/copilotkit-agent.directive.ts +0 -225
  133. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  134. package/src/directives/copilotkit-config.directive.ts +0 -81
  135. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  136. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  137. package/src/directives/stick-to-bottom.directive.ts +0 -204
  138. package/src/index.ts +0 -105
  139. package/src/lib/directives/tooltip.directive.ts +0 -292
  140. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  141. package/src/lib/slots/copilot-slot.component.ts +0 -135
  142. package/src/lib/slots/index.ts +0 -3
  143. package/src/lib/slots/slot.types.ts +0 -64
  144. package/src/lib/slots/slot.utils.ts +0 -289
  145. package/src/lib/utils.ts +0 -10
  146. package/src/public-api.ts +0 -1
  147. package/src/services/resize-observer.service.ts +0 -181
  148. package/src/services/scroll-position.service.ts +0 -169
  149. package/src/styles/globals.css +0 -266
  150. package/src/styles/index.css +0 -3
  151. package/src/test-setup.ts +0 -15
  152. package/src/testing/index.ts +0 -3
  153. package/src/testing/testing.utils.ts +0 -248
  154. package/src/types/frontend-tool.ts +0 -44
  155. package/src/types/human-in-the-loop.ts +0 -52
  156. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  157. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  158. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  159. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  160. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  161. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  162. package/src/utils/agent-context.utils.ts +0 -133
  163. package/src/utils/agent.utils.ts +0 -239
  164. package/src/utils/chat-config.utils.ts +0 -221
  165. package/src/utils/copilotkit.utils.ts +0 -20
  166. package/src/utils/frontend-tool.utils.ts +0 -266
  167. package/src/utils/human-in-the-loop.utils.ts +0 -359
  168. package/tsconfig.spec.json +0 -12
@@ -0,0 +1,479 @@
1
+ import { Component, Input, Output, EventEmitter, ContentChild, ViewChild, ElementRef, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, effect } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { CopilotSlotComponent } from '../../lib/slots/copilot-slot.component';
4
+ import { CopilotChatMessageViewComponent } from './copilot-chat-message-view.component';
5
+ import { CopilotChatInputComponent } from './copilot-chat-input.component';
6
+ import { CopilotChatViewScrollViewComponent } from './copilot-chat-view-scroll-view.component';
7
+ import { CopilotChatViewScrollToBottomButtonComponent } from './copilot-chat-view-scroll-to-bottom-button.component';
8
+ import { CopilotChatViewFeatherComponent } from './copilot-chat-view-feather.component';
9
+ import { CopilotChatViewInputContainerComponent } from './copilot-chat-view-input-container.component';
10
+ import { CopilotChatViewDisclaimerComponent } from './copilot-chat-view-disclaimer.component';
11
+ import { cn } from '../../lib/utils';
12
+ import { ResizeObserverService } from '../../services/resize-observer.service';
13
+ import { CopilotChatViewHandlersService } from './copilot-chat-view-handlers.service';
14
+ import { Subject } from 'rxjs';
15
+ import { takeUntil } from 'rxjs/operators';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../../services/resize-observer.service";
18
+ import * as i2 from "./copilot-chat-view-handlers.service";
19
+ import * as i3 from "@angular/common";
20
+ /**
21
+ * CopilotChatView component - Angular port of the React component.
22
+ * A complete chat interface with message feed and input components.
23
+ *
24
+ * @example
25
+ * ```html
26
+ * <copilot-chat-view
27
+ * [messages]="messages"
28
+ * [autoScroll]="true"
29
+ * [messageViewProps]="{ assistantMessage: { onThumbsUp: handleThumbsUp } }">
30
+ * </copilot-chat-view>
31
+ * ```
32
+ */
33
+ export class CopilotChatViewComponent {
34
+ resizeObserverService;
35
+ cdr;
36
+ handlers;
37
+ // Core inputs matching React props
38
+ messages = [];
39
+ autoScroll = true;
40
+ showCursor = false;
41
+ // MessageView slot inputs
42
+ messageViewComponent;
43
+ messageViewTemplate;
44
+ messageViewClass;
45
+ // ScrollView slot inputs
46
+ scrollViewComponent;
47
+ scrollViewTemplate;
48
+ scrollViewClass;
49
+ // ScrollToBottomButton slot inputs
50
+ scrollToBottomButtonComponent;
51
+ scrollToBottomButtonTemplate;
52
+ scrollToBottomButtonClass;
53
+ // Input slot inputs
54
+ inputComponent;
55
+ inputTemplate;
56
+ // InputContainer slot inputs
57
+ inputContainerComponent;
58
+ inputContainerTemplate;
59
+ inputContainerClass;
60
+ // Feather slot inputs
61
+ featherComponent;
62
+ featherTemplate;
63
+ featherClass;
64
+ // Disclaimer slot inputs
65
+ disclaimerComponent;
66
+ disclaimerTemplate;
67
+ disclaimerClass;
68
+ disclaimerText;
69
+ // Custom layout template (render prop pattern)
70
+ customLayoutTemplate;
71
+ // Named template slots for deep customization
72
+ sendButtonTemplate;
73
+ toolbarTemplate;
74
+ textAreaTemplate;
75
+ audioRecorderTemplate;
76
+ assistantMessageMarkdownRendererTemplate;
77
+ thumbsUpButtonTemplate;
78
+ thumbsDownButtonTemplate;
79
+ readAloudButtonTemplate;
80
+ regenerateButtonTemplate;
81
+ // Output events for assistant message actions (bubbled from child components)
82
+ assistantMessageThumbsUp = new EventEmitter();
83
+ assistantMessageThumbsDown = new EventEmitter();
84
+ assistantMessageReadAloud = new EventEmitter();
85
+ assistantMessageRegenerate = new EventEmitter();
86
+ // Output events for user message actions (if applicable)
87
+ userMessageCopy = new EventEmitter();
88
+ userMessageEdit = new EventEmitter();
89
+ // ViewChild references
90
+ inputContainerSlotRef;
91
+ // Default components for slots
92
+ defaultScrollViewComponent = CopilotChatViewScrollViewComponent;
93
+ defaultScrollToBottomButtonComponent = CopilotChatViewScrollToBottomButtonComponent;
94
+ defaultInputContainerComponent = CopilotChatViewInputContainerComponent;
95
+ defaultFeatherComponent = CopilotChatViewFeatherComponent;
96
+ defaultDisclaimerComponent = CopilotChatViewDisclaimerComponent;
97
+ // Signals for reactive state
98
+ messagesSignal = signal([]);
99
+ autoScrollSignal = signal(true);
100
+ showCursorSignal = signal(false);
101
+ disclaimerTextSignal = signal(undefined);
102
+ disclaimerClassSignal = signal(undefined);
103
+ inputContainerHeight = signal(0);
104
+ isResizing = signal(false);
105
+ contentPaddingBottom = computed(() => this.inputContainerHeight() + 32);
106
+ // Computed signals
107
+ computedClass = computed(() => cn('relative h-full'));
108
+ // Slot resolution computed signals
109
+ messageViewSlot = computed(() => this.messageViewTemplate || this.messageViewComponent);
110
+ scrollViewSlot = computed(() => this.scrollViewTemplate || this.scrollViewComponent);
111
+ scrollToBottomButtonSlot = computed(() => this.scrollToBottomButtonTemplate || this.scrollToBottomButtonComponent);
112
+ inputSlot = computed(() => this.inputTemplate || this.inputComponent);
113
+ inputContainerSlot = computed(() => this.inputContainerTemplate || this.inputContainerComponent);
114
+ featherSlot = computed(() => this.featherTemplate || this.featherComponent);
115
+ disclaimerSlot = computed(() => this.disclaimerTemplate || this.disclaimerComponent);
116
+ // Context objects for slots
117
+ scrollViewContext = computed(() => ({
118
+ autoScroll: this.autoScrollSignal(),
119
+ scrollToBottomButton: this.scrollToBottomButtonSlot(),
120
+ scrollToBottomButtonClass: this.scrollToBottomButtonClass,
121
+ inputContainerHeight: this.inputContainerHeight(),
122
+ isResizing: this.isResizing(),
123
+ messages: this.messagesSignal(),
124
+ messageView: this.messageViewSlot(),
125
+ messageViewClass: this.messageViewClass
126
+ }));
127
+ // Removed scrollViewPropsComputed - no longer needed
128
+ inputContainerContext = computed(() => ({
129
+ input: this.inputSlot(),
130
+ disclaimer: this.disclaimerSlot(),
131
+ disclaimerText: this.disclaimerTextSignal(),
132
+ disclaimerClass: this.disclaimerClassSignal(),
133
+ inputContainerClass: this.inputContainerClass
134
+ }));
135
+ // Removed inputContainerPropsComputed - no longer needed
136
+ // Layout context for custom templates (render prop pattern)
137
+ layoutContext = computed(() => ({
138
+ messageView: this.messageViewSlot(),
139
+ input: this.inputSlot(),
140
+ scrollView: this.scrollViewSlot(),
141
+ scrollToBottomButton: this.scrollToBottomButtonSlot(),
142
+ feather: this.featherSlot(),
143
+ inputContainer: this.inputContainerSlot(),
144
+ disclaimer: this.disclaimerSlot()
145
+ }));
146
+ destroy$ = new Subject();
147
+ resizeTimeoutRef;
148
+ constructor(resizeObserverService, cdr, handlers) {
149
+ this.resizeObserverService = resizeObserverService;
150
+ this.cdr = cdr;
151
+ this.handlers = handlers;
152
+ // Set up effect to handle resize state timeout
153
+ effect(() => {
154
+ const resizing = this.isResizing();
155
+ if (resizing && this.resizeTimeoutRef) {
156
+ clearTimeout(this.resizeTimeoutRef);
157
+ this.resizeTimeoutRef = undefined;
158
+ }
159
+ });
160
+ }
161
+ ngOnInit() {
162
+ // Initialize signals with input values
163
+ this.messagesSignal.set(this.messages);
164
+ this.autoScrollSignal.set(this.autoScroll);
165
+ this.showCursorSignal.set(this.showCursor);
166
+ this.disclaimerTextSignal.set(this.disclaimerText);
167
+ this.disclaimerClassSignal.set(this.disclaimerClass);
168
+ // Initialize handler availability in the view-scoped service
169
+ this.handlers.hasAssistantThumbsUpHandler.set(this.assistantMessageThumbsUp.observed);
170
+ this.handlers.hasAssistantThumbsDownHandler.set(this.assistantMessageThumbsDown.observed);
171
+ this.handlers.hasAssistantReadAloudHandler.set(this.assistantMessageReadAloud.observed);
172
+ this.handlers.hasAssistantRegenerateHandler.set(this.assistantMessageRegenerate.observed);
173
+ this.handlers.hasUserCopyHandler.set(this.userMessageCopy.observed);
174
+ this.handlers.hasUserEditHandler.set(this.userMessageEdit.observed);
175
+ }
176
+ ngOnChanges() {
177
+ // Update signals when inputs change
178
+ this.messagesSignal.set(this.messages);
179
+ this.autoScrollSignal.set(this.autoScroll);
180
+ this.showCursorSignal.set(this.showCursor);
181
+ this.disclaimerTextSignal.set(this.disclaimerText);
182
+ this.disclaimerClassSignal.set(this.disclaimerClass);
183
+ // Keep handler availability in sync
184
+ this.handlers.hasAssistantThumbsUpHandler.set(this.assistantMessageThumbsUp.observed);
185
+ this.handlers.hasAssistantThumbsDownHandler.set(this.assistantMessageThumbsDown.observed);
186
+ this.handlers.hasAssistantReadAloudHandler.set(this.assistantMessageReadAloud.observed);
187
+ this.handlers.hasAssistantRegenerateHandler.set(this.assistantMessageRegenerate.observed);
188
+ this.handlers.hasUserCopyHandler.set(this.userMessageCopy.observed);
189
+ this.handlers.hasUserEditHandler.set(this.userMessageEdit.observed);
190
+ }
191
+ ngAfterViewInit() {
192
+ // Don't set a default height - measure it dynamically
193
+ // Set up input container height monitoring
194
+ const measureAndObserve = () => {
195
+ if (!this.inputContainerSlotRef || !this.inputContainerSlotRef.nativeElement) {
196
+ return false;
197
+ }
198
+ // The slot ref points to the copilot-slot element
199
+ // We need to find the actual input container component inside it
200
+ const slotElement = this.inputContainerSlotRef.nativeElement;
201
+ const componentElement = slotElement.querySelector('copilot-chat-view-input-container');
202
+ if (!componentElement) {
203
+ return false;
204
+ }
205
+ // Look for the absolute positioned div that contains the input
206
+ let innerDiv = componentElement.querySelector('div.absolute');
207
+ // If not found by class, try first child
208
+ if (!innerDiv) {
209
+ innerDiv = componentElement.firstElementChild;
210
+ }
211
+ if (!innerDiv) {
212
+ return false;
213
+ }
214
+ // Measure the actual height
215
+ const measuredHeight = innerDiv.offsetHeight;
216
+ if (measuredHeight === 0) {
217
+ return false;
218
+ }
219
+ // Success! Set the initial height
220
+ this.inputContainerHeight.set(measuredHeight);
221
+ this.cdr.detectChanges();
222
+ // Create an ElementRef wrapper for ResizeObserver
223
+ const innerDivRef = new ElementRef(innerDiv);
224
+ // Set up ResizeObserver to track changes
225
+ this.resizeObserverService.observeElement(innerDivRef, 0, 250)
226
+ .pipe(takeUntil(this.destroy$))
227
+ .subscribe(state => {
228
+ const newHeight = state.height;
229
+ if (newHeight !== this.inputContainerHeight() && newHeight > 0) {
230
+ this.inputContainerHeight.set(newHeight);
231
+ this.isResizing.set(true);
232
+ this.cdr.detectChanges();
233
+ // Clear existing timeout
234
+ if (this.resizeTimeoutRef) {
235
+ clearTimeout(this.resizeTimeoutRef);
236
+ }
237
+ // Set isResizing to false after a short delay
238
+ this.resizeTimeoutRef = window.setTimeout(() => {
239
+ this.isResizing.set(false);
240
+ this.resizeTimeoutRef = undefined;
241
+ this.cdr.detectChanges();
242
+ }, 250);
243
+ }
244
+ });
245
+ return true;
246
+ };
247
+ // Try to measure immediately
248
+ if (!measureAndObserve()) {
249
+ // If failed, retry with increasing delays
250
+ let attempts = 0;
251
+ const maxAttempts = 10;
252
+ const retry = () => {
253
+ attempts++;
254
+ if (measureAndObserve()) {
255
+ // Successfully measured
256
+ }
257
+ else if (attempts < maxAttempts) {
258
+ // Exponential backoff: 50ms, 100ms, 200ms, 400ms, etc.
259
+ const delay = 50 * Math.pow(2, Math.min(attempts - 1, 4));
260
+ setTimeout(retry, delay);
261
+ }
262
+ else {
263
+ // Failed to measure after max attempts
264
+ }
265
+ };
266
+ // Start retry with first delay
267
+ setTimeout(retry, 50);
268
+ }
269
+ }
270
+ ngOnDestroy() {
271
+ if (this.resizeTimeoutRef) {
272
+ clearTimeout(this.resizeTimeoutRef);
273
+ }
274
+ this.destroy$.next();
275
+ this.destroy$.complete();
276
+ }
277
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewComponent, deps: [{ token: i1.ResizeObserverService }, { token: i0.ChangeDetectorRef }, { token: i2.CopilotChatViewHandlersService }], target: i0.ɵɵFactoryTarget.Component });
278
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatViewComponent, isStandalone: true, selector: "copilot-chat-view", inputs: { messages: "messages", autoScroll: "autoScroll", showCursor: "showCursor", messageViewComponent: "messageViewComponent", messageViewTemplate: "messageViewTemplate", messageViewClass: "messageViewClass", scrollViewComponent: "scrollViewComponent", scrollViewTemplate: "scrollViewTemplate", scrollViewClass: "scrollViewClass", scrollToBottomButtonComponent: "scrollToBottomButtonComponent", scrollToBottomButtonTemplate: "scrollToBottomButtonTemplate", scrollToBottomButtonClass: "scrollToBottomButtonClass", inputComponent: "inputComponent", inputTemplate: "inputTemplate", inputContainerComponent: "inputContainerComponent", inputContainerTemplate: "inputContainerTemplate", inputContainerClass: "inputContainerClass", featherComponent: "featherComponent", featherTemplate: "featherTemplate", featherClass: "featherClass", disclaimerComponent: "disclaimerComponent", disclaimerTemplate: "disclaimerTemplate", disclaimerClass: "disclaimerClass", disclaimerText: "disclaimerText" }, outputs: { assistantMessageThumbsUp: "assistantMessageThumbsUp", assistantMessageThumbsDown: "assistantMessageThumbsDown", assistantMessageReadAloud: "assistantMessageReadAloud", assistantMessageRegenerate: "assistantMessageRegenerate", userMessageCopy: "userMessageCopy", userMessageEdit: "userMessageEdit" }, providers: [ResizeObserverService, CopilotChatViewHandlersService], queries: [{ propertyName: "customLayoutTemplate", first: true, predicate: ["customLayout"], descendants: true }, { propertyName: "sendButtonTemplate", first: true, predicate: ["sendButton"], descendants: true }, { propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "textAreaTemplate", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "audioRecorderTemplate", first: true, predicate: ["audioRecorder"], descendants: true }, { propertyName: "assistantMessageMarkdownRendererTemplate", first: true, predicate: ["assistantMessageMarkdownRenderer"], descendants: true }, { propertyName: "thumbsUpButtonTemplate", first: true, predicate: ["thumbsUpButton"], descendants: true }, { propertyName: "thumbsDownButtonTemplate", first: true, predicate: ["thumbsDownButton"], descendants: true }, { propertyName: "readAloudButtonTemplate", first: true, predicate: ["readAloudButton"], descendants: true }, { propertyName: "regenerateButtonTemplate", first: true, predicate: ["regenerateButton"], descendants: true }], viewQueries: [{ propertyName: "inputContainerSlotRef", first: true, predicate: ["inputContainerSlotRef"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
279
+ <!-- Custom layout template support (render prop pattern) -->
280
+ @if (customLayoutTemplate) {
281
+ <ng-container *ngTemplateOutlet="customLayoutTemplate; context: layoutContext()"></ng-container>
282
+ } @else {
283
+ <!-- Default layout - exact React DOM structure -->
284
+ <div [class]="computedClass()">
285
+ <!-- ScrollView -->
286
+ <copilot-chat-view-scroll-view
287
+ [autoScroll]="autoScrollSignal()"
288
+ [inputContainerHeight]="inputContainerHeight()"
289
+ [isResizing]="isResizing()"
290
+ [messages]="messagesSignal()"
291
+ [messageView]="messageViewSlot()"
292
+ [messageViewClass]="messageViewClass"
293
+ [scrollToBottomButton]="scrollToBottomButtonSlot()"
294
+ [scrollToBottomButtonClass]="scrollToBottomButtonClass"
295
+ [showCursor]="showCursorSignal()"
296
+ (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
297
+ (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
298
+ (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
299
+ (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
300
+ (userMessageCopy)="userMessageCopy.emit($event)"
301
+ (userMessageEdit)="userMessageEdit.emit($event)">
302
+ </copilot-chat-view-scroll-view>
303
+
304
+ <!-- Feather effect -->
305
+ <copilot-slot
306
+ [slot]="featherSlot()"
307
+ [context]="{ inputClass: featherClass }"
308
+ [defaultComponent]="defaultFeatherComponent">
309
+ </copilot-slot>
310
+
311
+ <!-- Input container -->
312
+ <copilot-slot
313
+ #inputContainerSlotRef
314
+ [slot]="inputContainerSlot()"
315
+ [context]="inputContainerContext()"
316
+ [defaultComponent]="defaultInputContainerComponent">
317
+ </copilot-slot>
318
+ </div>
319
+ }
320
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopilotSlotComponent, selector: "copilot-slot", inputs: ["slot", "context", "defaultComponent", "outputs"] }, { kind: "component", type: CopilotChatViewScrollViewComponent, selector: "copilot-chat-view-scroll-view", inputs: ["autoScroll", "inputContainerHeight", "isResizing", "inputClass", "messages", "messageView", "messageViewClass", "showCursor", "scrollToBottomButton", "scrollToBottomButtonClass"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
321
+ }
322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewComponent, decorators: [{
323
+ type: Component,
324
+ args: [{
325
+ selector: 'copilot-chat-view',
326
+ standalone: true,
327
+ imports: [
328
+ CommonModule,
329
+ CopilotSlotComponent,
330
+ CopilotChatMessageViewComponent,
331
+ CopilotChatInputComponent,
332
+ CopilotChatViewScrollViewComponent,
333
+ CopilotChatViewScrollToBottomButtonComponent,
334
+ CopilotChatViewFeatherComponent,
335
+ CopilotChatViewInputContainerComponent,
336
+ CopilotChatViewDisclaimerComponent
337
+ ],
338
+ changeDetection: ChangeDetectionStrategy.OnPush,
339
+ encapsulation: ViewEncapsulation.None,
340
+ providers: [ResizeObserverService, CopilotChatViewHandlersService],
341
+ template: `
342
+ <!-- Custom layout template support (render prop pattern) -->
343
+ @if (customLayoutTemplate) {
344
+ <ng-container *ngTemplateOutlet="customLayoutTemplate; context: layoutContext()"></ng-container>
345
+ } @else {
346
+ <!-- Default layout - exact React DOM structure -->
347
+ <div [class]="computedClass()">
348
+ <!-- ScrollView -->
349
+ <copilot-chat-view-scroll-view
350
+ [autoScroll]="autoScrollSignal()"
351
+ [inputContainerHeight]="inputContainerHeight()"
352
+ [isResizing]="isResizing()"
353
+ [messages]="messagesSignal()"
354
+ [messageView]="messageViewSlot()"
355
+ [messageViewClass]="messageViewClass"
356
+ [scrollToBottomButton]="scrollToBottomButtonSlot()"
357
+ [scrollToBottomButtonClass]="scrollToBottomButtonClass"
358
+ [showCursor]="showCursorSignal()"
359
+ (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
360
+ (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
361
+ (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
362
+ (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
363
+ (userMessageCopy)="userMessageCopy.emit($event)"
364
+ (userMessageEdit)="userMessageEdit.emit($event)">
365
+ </copilot-chat-view-scroll-view>
366
+
367
+ <!-- Feather effect -->
368
+ <copilot-slot
369
+ [slot]="featherSlot()"
370
+ [context]="{ inputClass: featherClass }"
371
+ [defaultComponent]="defaultFeatherComponent">
372
+ </copilot-slot>
373
+
374
+ <!-- Input container -->
375
+ <copilot-slot
376
+ #inputContainerSlotRef
377
+ [slot]="inputContainerSlot()"
378
+ [context]="inputContainerContext()"
379
+ [defaultComponent]="defaultInputContainerComponent">
380
+ </copilot-slot>
381
+ </div>
382
+ }
383
+ `
384
+ }]
385
+ }], ctorParameters: () => [{ type: i1.ResizeObserverService }, { type: i0.ChangeDetectorRef }, { type: i2.CopilotChatViewHandlersService }], propDecorators: { messages: [{
386
+ type: Input
387
+ }], autoScroll: [{
388
+ type: Input
389
+ }], showCursor: [{
390
+ type: Input
391
+ }], messageViewComponent: [{
392
+ type: Input
393
+ }], messageViewTemplate: [{
394
+ type: Input
395
+ }], messageViewClass: [{
396
+ type: Input
397
+ }], scrollViewComponent: [{
398
+ type: Input
399
+ }], scrollViewTemplate: [{
400
+ type: Input
401
+ }], scrollViewClass: [{
402
+ type: Input
403
+ }], scrollToBottomButtonComponent: [{
404
+ type: Input
405
+ }], scrollToBottomButtonTemplate: [{
406
+ type: Input
407
+ }], scrollToBottomButtonClass: [{
408
+ type: Input
409
+ }], inputComponent: [{
410
+ type: Input
411
+ }], inputTemplate: [{
412
+ type: Input
413
+ }], inputContainerComponent: [{
414
+ type: Input
415
+ }], inputContainerTemplate: [{
416
+ type: Input
417
+ }], inputContainerClass: [{
418
+ type: Input
419
+ }], featherComponent: [{
420
+ type: Input
421
+ }], featherTemplate: [{
422
+ type: Input
423
+ }], featherClass: [{
424
+ type: Input
425
+ }], disclaimerComponent: [{
426
+ type: Input
427
+ }], disclaimerTemplate: [{
428
+ type: Input
429
+ }], disclaimerClass: [{
430
+ type: Input
431
+ }], disclaimerText: [{
432
+ type: Input
433
+ }], customLayoutTemplate: [{
434
+ type: ContentChild,
435
+ args: ['customLayout']
436
+ }], sendButtonTemplate: [{
437
+ type: ContentChild,
438
+ args: ['sendButton']
439
+ }], toolbarTemplate: [{
440
+ type: ContentChild,
441
+ args: ['toolbar']
442
+ }], textAreaTemplate: [{
443
+ type: ContentChild,
444
+ args: ['textArea']
445
+ }], audioRecorderTemplate: [{
446
+ type: ContentChild,
447
+ args: ['audioRecorder']
448
+ }], assistantMessageMarkdownRendererTemplate: [{
449
+ type: ContentChild,
450
+ args: ['assistantMessageMarkdownRenderer']
451
+ }], thumbsUpButtonTemplate: [{
452
+ type: ContentChild,
453
+ args: ['thumbsUpButton']
454
+ }], thumbsDownButtonTemplate: [{
455
+ type: ContentChild,
456
+ args: ['thumbsDownButton']
457
+ }], readAloudButtonTemplate: [{
458
+ type: ContentChild,
459
+ args: ['readAloudButton']
460
+ }], regenerateButtonTemplate: [{
461
+ type: ContentChild,
462
+ args: ['regenerateButton']
463
+ }], assistantMessageThumbsUp: [{
464
+ type: Output
465
+ }], assistantMessageThumbsDown: [{
466
+ type: Output
467
+ }], assistantMessageReadAloud: [{
468
+ type: Output
469
+ }], assistantMessageRegenerate: [{
470
+ type: Output
471
+ }], userMessageCopy: [{
472
+ type: Output
473
+ }], userMessageEdit: [{
474
+ type: Output
475
+ }], inputContainerSlotRef: [{
476
+ type: ViewChild,
477
+ args: ['inputContainerSlotRef', { read: ElementRef }]
478
+ }] } });
479
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBR1osU0FBUyxFQUNULFVBQVUsRUFDVix1QkFBdUIsRUFFdkIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixRQUFRLEVBTVIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEVBQUUsNENBQTRDLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNySCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU5RixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FB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ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGVmZmVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb3BpbG90U2xvdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2xpYi9zbG90cy9jb3BpbG90LXNsb3QuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC1tZXNzYWdlLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0Vmlld1Njcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdG8tYm90dG9tLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3RmVhdGhlckNvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctZmVhdGhlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC12aWV3LWlucHV0LWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3RGlzY2xhaW1lckNvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctZGlzY2xhaW1lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ0BhZy11aS9jbGllbnQnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SGFuZGxlcnNTZXJ2aWNlIH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtdmlldy1oYW5kbGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBDb3BpbG90Q2hhdFZpZXcgY29tcG9uZW50IC0gQW5ndWxhciBwb3J0IG9mIHRoZSBSZWFjdCBjb21wb25lbnQuXG4gKiBBIGNvbXBsZXRlIGNoYXQgaW50ZXJmYWNlIHdpdGggbWVzc2FnZSBmZWVkIGFuZCBpbnB1dCBjb21wb25lbnRzLlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGNvcGlsb3QtY2hhdC12aWV3XG4gKiAgIFttZXNzYWdlc109XCJtZXNzYWdlc1wiXG4gKiAgIFthdXRvU2Nyb2xsXT1cInRydWVcIlxuICogICBbbWVzc2FnZVZpZXdQcm9wc109XCJ7IGFzc2lzdGFudE1lc3NhZ2U6IHsgb25UaHVtYnNVcDogaGFuZGxlVGh1bWJzVXAgfSB9XCI+XG4gKiA8L2NvcGlsb3QtY2hhdC12aWV3PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb3BpbG90U2xvdENvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdE1lc3NhZ2VWaWV3Q29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0SW5wdXRDb21wb25lbnQsXG4gICAgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyQ29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0Vmlld0lucHV0Q29udGFpbmVyQ29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0Vmlld0Rpc2NsYWltZXJDb21wb25lbnRcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1Jlc2l6ZU9ic2VydmVyU2VydmljZSwgQ29waWxvdENoYXRWaWV3SGFuZGxlcnNTZXJ2aWNlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIEN1c3RvbSBsYXlvdXQgdGVtcGxhdGUgc3VwcG9ydCAocmVuZGVyIHByb3AgcGF0dGVybikgLS0+XG4gICAgQGlmIChjdXN0b21MYXlvdXRUZW1wbGF0ZSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUxheW91dFRlbXBsYXRlOyBjb250ZXh0OiBsYXlvdXRDb250ZXh0KClcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gRGVmYXVsdCBsYXlvdXQgLSBleGFjdCBSZWFjdCBET00gc3RydWN0dXJlIC0tPlxuICAgICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsVmlldyAtLT5cbiAgICAgICAgPGNvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3XG4gICAgICAgICAgW2F1dG9TY3JvbGxdPVwiYXV0b1Njcm9sbFNpZ25hbCgpXCJcbiAgICAgICAgICBbaW5wdXRDb250YWluZXJIZWlnaHRdPVwiaW5wdXRDb250YWluZXJIZWlnaHQoKVwiXG4gICAgICAgICAgW2lzUmVzaXppbmddPVwiaXNSZXNpemluZygpXCJcbiAgICAgICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXNTaWduYWwoKVwiXG4gICAgICAgICAgW21lc3NhZ2VWaWV3XT1cIm1lc3NhZ2VWaWV3U2xvdCgpXCJcbiAgICAgICAgICBbbWVzc2FnZVZpZXdDbGFzc109XCJtZXNzYWdlVmlld0NsYXNzXCJcbiAgICAgICAgICBbc2Nyb2xsVG9Cb3R0b21CdXR0b25dPVwic2Nyb2xsVG9Cb3R0b21CdXR0b25TbG90KClcIlxuICAgICAgICAgIFtzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzXT1cInNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3NcIlxuICAgICAgICAgIFtzaG93Q3Vyc29yXT1cInNob3dDdXJzb3JTaWduYWwoKVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNVcCk9XCJhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24pPVwiYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCk9XCJhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlKT1cImFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHVzZXJNZXNzYWdlQ29weSk9XCJ1c2VyTWVzc2FnZUNvcHkuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAodXNlck1lc3NhZ2VFZGl0KT1cInVzZXJNZXNzYWdlRWRpdC5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdmlldz5cblxuICAgICAgICA8IS0tIEZlYXRoZXIgZWZmZWN0IC0tPlxuICAgICAgICA8Y29waWxvdC1zbG90XG4gICAgICAgICAgW3Nsb3RdPVwiZmVhdGhlclNsb3QoKVwiXG4gICAgICAgICAgW2NvbnRleHRdPVwieyBpbnB1dENsYXNzOiBmZWF0aGVyQ2xhc3MgfVwiXG4gICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiZGVmYXVsdEZlYXRoZXJDb21wb25lbnRcIj5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG5cbiAgICAgICAgPCEtLSBJbnB1dCBjb250YWluZXIgLS0+XG4gICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAjaW5wdXRDb250YWluZXJTbG90UmVmXG4gICAgICAgICAgW3Nsb3RdPVwiaW5wdXRDb250YWluZXJTbG90KClcIlxuICAgICAgICAgIFtjb250ZXh0XT1cImlucHV0Q29udGFpbmVyQ29udGV4dCgpXCJcbiAgICAgICAgICBbZGVmYXVsdENvbXBvbmVudF09XCJkZWZhdWx0SW5wdXRDb250YWluZXJDb21wb25lbnRcIj5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vIENvcmUgaW5wdXRzIG1hdGNoaW5nIFJlYWN0IHByb3BzXG4gIEBJbnB1dCgpIG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgQElucHV0KCkgYXV0b1Njcm9sbDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDdXJzb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIE1lc3NhZ2VWaWV3IHNsb3QgaW5wdXRzXG4gIEBJbnB1dCgpIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBASW5wdXQoKSBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIC8vIFNjcm9sbFZpZXcgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgc2Nyb2xsVmlld0NvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgQElucHV0KCkgc2Nyb2xsVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgc2Nyb2xsVmlld0NsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gU2Nyb2xsVG9Cb3R0b21CdXR0b24gc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgc2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIHNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gSW5wdXQgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgaW5wdXRDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGlucHV0VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBcbiAgLy8gSW5wdXRDb250YWluZXIgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgaW5wdXRDb250YWluZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGlucHV0Q29udGFpbmVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBpbnB1dENvbnRhaW5lckNsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gRmVhdGhlciBzbG90IGlucHV0c1xuICBASW5wdXQoKSBmZWF0aGVyQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBASW5wdXQoKSBmZWF0aGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBmZWF0aGVyQ2xhc3M/OiBzdHJpbmc7XG4gIFxuICAvLyBEaXNjbGFpbWVyIHNsb3QgaW5wdXRzXG4gIEBJbnB1dCgpIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG4gIFxuICAvLyBDdXN0b20gbGF5b3V0IHRlbXBsYXRlIChyZW5kZXIgcHJvcCBwYXR0ZXJuKVxuICBAQ29udGVudENoaWxkKCdjdXN0b21MYXlvdXQnKSBjdXN0b21MYXlvdXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIFxuICAvLyBOYW1lZCB0ZW1wbGF0ZSBzbG90cyBmb3IgZGVlcCBjdXN0b21pemF0aW9uXG4gIEBDb250ZW50Q2hpbGQoJ3NlbmRCdXR0b24nKSBzZW5kQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0b29sYmFyJykgdG9vbGJhclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZCgndGV4dEFyZWEnKSB0ZXh0QXJlYVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZCgnYXVkaW9SZWNvcmRlcicpIGF1ZGlvUmVjb3JkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ2Fzc2lzdGFudE1lc3NhZ2VNYXJrZG93blJlbmRlcmVyJykgYXNzaXN0YW50TWVzc2FnZU1hcmtkb3duUmVuZGVyZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3RodW1ic1VwQnV0dG9uJykgdGh1bWJzVXBCdXR0b25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3RodW1ic0Rvd25CdXR0b24nKSB0aHVtYnNEb3duQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCdyZWFkQWxvdWRCdXR0b24nKSByZWFkQWxvdWRCdXR0b25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3JlZ2VuZXJhdGVCdXR0b24nKSByZWdlbmVyYXRlQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBcbiAgLy8gT3V0cHV0IGV2ZW50cyBmb3IgYXNzaXN0YW50IG1lc3NhZ2UgYWN0aW9ucyAoYnViYmxlZCBmcm9tIGNoaWxkIGNvbXBvbmVudHMpXG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBAT3V0cHV0KCkgYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBAT3V0cHV0KCkgYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIFxuICAvLyBPdXRwdXQgZXZlbnRzIGZvciB1c2VyIG1lc3NhZ2UgYWN0aW9ucyAoaWYgYXBwbGljYWJsZSlcbiAgQE91dHB1dCgpIHVzZXJNZXNzYWdlQ29weSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSB1c2VyTWVzc2FnZUVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBcbiAgLy8gVmlld0NoaWxkIHJlZmVyZW5jZXNcbiAgQFZpZXdDaGlsZCgnaW5wdXRDb250YWluZXJTbG90UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGlucHV0Q29udGFpbmVyU2xvdFJlZj86IEVsZW1lbnRSZWY7XG4gIFxuICAvLyBEZWZhdWx0IGNvbXBvbmVudHMgZm9yIHNsb3RzXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U2Nyb2xsVmlld0NvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld1Njcm9sbFZpZXdDb21wb25lbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRJbnB1dENvbnRhaW5lckNvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld0lucHV0Q29udGFpbmVyQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdEZlYXRoZXJDb21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdERpc2NsYWltZXJDb21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdEaXNjbGFpbWVyQ29tcG9uZW50O1xuICBcbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgcHJvdGVjdGVkIG1lc3NhZ2VzU2lnbmFsID0gc2lnbmFsPE1lc3NhZ2VbXT4oW10pO1xuICBwcm90ZWN0ZWQgYXV0b1Njcm9sbFNpZ25hbCA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHNob3dDdXJzb3JTaWduYWwgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgZGlzY2xhaW1lclRleHRTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGlzY2xhaW1lckNsYXNzU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVySGVpZ2h0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBpc1Jlc2l6aW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbnRlbnRQYWRkaW5nQm90dG9tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICsgMzIpO1xuICBcbiAgLy8gQ29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IGNuKCdyZWxhdGl2ZSBoLWZ1bGwnKSk7XG4gIFxuICAvLyBTbG90IHJlc29sdXRpb24gY29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgbWVzc2FnZVZpZXdTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5tZXNzYWdlVmlld1RlbXBsYXRlIHx8IHRoaXMubWVzc2FnZVZpZXdDb21wb25lbnRcbiAgKTtcbiAgXG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3U2xvdCA9IGNvbXB1dGVkKCgpID0+IFxuICAgIHRoaXMuc2Nyb2xsVmlld1RlbXBsYXRlIHx8IHRoaXMuc2Nyb2xsVmlld0NvbXBvbmVudFxuICApO1xuICBcbiAgcHJvdGVjdGVkIHNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCA9IGNvbXB1dGVkKCgpID0+IFxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21CdXR0b25UZW1wbGF0ZSB8fCB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50XG4gICk7XG4gIFxuICBwcm90ZWN0ZWQgaW5wdXRTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5pbnB1dFRlbXBsYXRlIHx8IHRoaXMuaW5wdXRDb21wb25lbnRcbiAgKTtcbiAgXG4gIHByb3RlY3RlZCBpbnB1dENvbnRhaW5lclNsb3QgPSBjb21wdXRlZCgoKSA9PiBcbiAgICB0aGlzLmlucHV0Q29udGFpbmVyVGVtcGxhdGUgfHwgdGhpcy5pbnB1dENvbnRhaW5lckNvbXBvbmVudFxuICApO1xuICBcbiAgcHJvdGVjdGVkIGZlYXRoZXJTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5mZWF0aGVyVGVtcGxhdGUgfHwgdGhpcy5mZWF0aGVyQ29tcG9uZW50XG4gICk7XG4gIFxuICBwcm90ZWN0ZWQgZGlzY2xhaW1lclNsb3QgPSBjb21wdXRlZCgoKSA9PiBcbiAgICB0aGlzLmRpc2NsYWltZXJUZW1wbGF0ZSB8fCB0aGlzLmRpc2NsYWltZXJDb21wb25lbnRcbiAgKTtcbiAgXG4gIC8vIENvbnRleHQgb2JqZWN0cyBmb3Igc2xvdHNcbiAgcHJvdGVjdGVkIHNjcm9sbFZpZXdDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBhdXRvU2Nyb2xsOiB0aGlzLmF1dG9TY3JvbGxTaWduYWwoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbjogdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvblNsb3QoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3MsXG4gICAgaW5wdXRDb250YWluZXJIZWlnaHQ6IHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQoKSxcbiAgICBpc1Jlc2l6aW5nOiB0aGlzLmlzUmVzaXppbmcoKSxcbiAgICBtZXNzYWdlczogdGhpcy5tZXNzYWdlc1NpZ25hbCgpLFxuICAgIG1lc3NhZ2VWaWV3OiB0aGlzLm1lc3NhZ2VWaWV3U2xvdCgpLFxuICAgIG1lc3NhZ2VWaWV3Q2xhc3M6IHRoaXMubWVzc2FnZVZpZXdDbGFzc1xuICB9KSk7XG4gIFxuICAvLyBSZW1vdmVkIHNjcm9sbFZpZXdQcm9wc0NvbXB1dGVkIC0gbm8gbG9uZ2VyIG5lZWRlZFxuICBcbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVyQ29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgaW5wdXQ6IHRoaXMuaW5wdXRTbG90KCksXG4gICAgZGlzY2xhaW1lcjogdGhpcy5kaXNjbGFpbWVyU2xvdCgpLFxuICAgIGRpc2NsYWltZXJUZXh0OiB0aGlzLmRpc2NsYWltZXJUZXh0U2lnbmFsKCksXG4gICAgZGlzY2xhaW1lckNsYXNzOiB0aGlzLmRpc2NsYWltZXJDbGFzc1NpZ25hbCgpLFxuICAgIGlucHV0Q29udGFpbmVyQ2xhc3M6IHRoaXMuaW5wdXRDb250YWluZXJDbGFzc1xuICB9KSk7XG4gIFxuICAvLyBSZW1vdmVkIGlucHV0Q29udGFpbmVyUHJvcHNDb21wdXRlZCAtIG5vIGxvbmdlciBuZWVkZWRcbiAgXG4gIC8vIExheW91dCBjb250ZXh0IGZvciBjdXN0b20gdGVtcGxhdGVzIChyZW5kZXIgcHJvcCBwYXR0ZXJuKVxuICBwcm90ZWN0ZWQgbGF5b3V0Q29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgbWVzc2FnZVZpZXc6IHRoaXMubWVzc2FnZVZpZXdTbG90KCksXG4gICAgaW5wdXQ6IHRoaXMuaW5wdXRTbG90KCksXG4gICAgc2Nyb2xsVmlldzogdGhpcy5zY3JvbGxWaWV3U2xvdCgpLFxuICAgIHNjcm9sbFRvQm90dG9tQnV0dG9uOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCgpLFxuICAgIGZlYXRoZXI6IHRoaXMuZmVhdGhlclNsb3QoKSxcbiAgICBpbnB1dENvbnRhaW5lcjogdGhpcy5pbnB1dENvbnRhaW5lclNsb3QoKSxcbiAgICBkaXNjbGFpbWVyOiB0aGlzLmRpc2NsYWltZXJTbG90KClcbiAgfSkpO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVzaXplVGltZW91dFJlZj86IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJTZXJ2aWNlOiBSZXNpemVPYnNlcnZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaGFuZGxlcnM6IENvcGlsb3RDaGF0Vmlld0hhbmRsZXJzU2VydmljZVxuICApIHtcbiAgICAvLyBTZXQgdXAgZWZmZWN0IHRvIGhhbmRsZSByZXNpemUgc3RhdGUgdGltZW91dFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNpemluZyA9IHRoaXMuaXNSZXNpemluZygpO1xuICAgICAgaWYgKHJlc2l6aW5nICYmIHRoaXMucmVzaXplVGltZW91dFJlZikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0UmVmKTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0UmVmID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIHNpZ25hbHMgd2l0aCBpbnB1dCB2YWx1ZXNcbiAgICB0aGlzLm1lc3NhZ2VzU2lnbmFsLnNldCh0aGlzLm1lc3NhZ2VzKTtcbiAgICB0aGlzLmF1dG9TY3JvbGxTaWduYWwuc2V0KHRoaXMuYXV0b1Njcm9sbCk7XG4gICAgdGhpcy5zaG93Q3Vyc29yU2lnbmFsLnNldCh0aGlzLnNob3dDdXJzb3IpO1xuICAgIHRoaXMuZGlzY2xhaW1lclRleHRTaWduYWwuc2V0KHRoaXMuZGlzY2xhaW1lclRleHQpO1xuICAgIHRoaXMuZGlzY2xhaW1lckNsYXNzU2lnbmFsLnNldCh0aGlzLmRpc2NsYWltZXJDbGFzcyk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHRoZSB2aWV3LXNjb3BlZCBzZXJ2aWNlXG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRUaHVtYnNVcEhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVRodW1ic1VwLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic0Rvd25IYW5kbGVyLnNldCh0aGlzLmFzc2lzdGFudE1lc3NhZ2VUaHVtYnNEb3duLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlYWRBbG91ZEhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZC5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRSZWdlbmVyYXRlSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZS5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNVc2VyQ29weUhhbmRsZXIuc2V0KHRoaXMudXNlck1lc3NhZ2VDb3B5Lm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJFZGl0SGFuZGxlci5zZXQodGhpcy51c2VyTWVzc2FnZUVkaXQub2JzZXJ2ZWQpO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2lnbmFscyB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICB0aGlzLm1lc3NhZ2VzU2lnbmFsLnNldCh0aGlzLm1lc3NhZ2VzKTtcbiAgICB0aGlzLmF1dG9TY3JvbGxTaWduYWwuc2V0KHRoaXMuYXV0b1Njcm9sbCk7XG4gICAgdGhpcy5zaG93Q3Vyc29yU2lnbmFsLnNldCh0aGlzLnNob3dDdXJzb3IpO1xuICAgIHRoaXMuZGlzY2xhaW1lclRleHRTaWduYWwuc2V0KHRoaXMuZGlzY2xhaW1lclRleHQpO1xuICAgIHRoaXMuZGlzY2xhaW1lckNsYXNzU2lnbmFsLnNldCh0aGlzLmRpc2NsYWltZXJDbGFzcyk7XG5cbiAgICAvLyBLZWVwIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHN5bmNcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic1VwSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzRG93bkhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVhZEFsb3VkSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlZ2VuZXJhdGVIYW5kbGVyLnNldCh0aGlzLmFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJDb3B5SGFuZGxlci5zZXQodGhpcy51c2VyTWVzc2FnZUNvcHkub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckVkaXRIYW5kbGVyLnNldCh0aGlzLnVzZXJNZXNzYWdlRWRpdC5vYnNlcnZlZCk7XG4gIH1cbiAgXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBEb24ndCBzZXQgYSBkZWZhdWx0IGhlaWdodCAtIG1lYXN1cmUgaXQgZHluYW1pY2FsbHlcbiAgICBcbiAgICAvLyBTZXQgdXAgaW5wdXQgY29udGFpbmVyIGhlaWdodCBtb25pdG9yaW5nXG4gICAgY29uc3QgbWVhc3VyZUFuZE9ic2VydmUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmIHx8ICF0aGlzLmlucHV0Q29udGFpbmVyU2xvdFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVGhlIHNsb3QgcmVmIHBvaW50cyB0byB0aGUgY29waWxvdC1zbG90IGVsZW1lbnRcbiAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB0aGUgYWN0dWFsIGlucHV0IGNvbnRhaW5lciBjb21wb25lbnQgaW5zaWRlIGl0XG4gICAgICBjb25zdCBzbG90RWxlbWVudCA9IHRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjb21wb25lbnRFbGVtZW50ID0gc2xvdEVsZW1lbnQucXVlcnlTZWxlY3RvcignY29waWxvdC1jaGF0LXZpZXctaW5wdXQtY29udGFpbmVyJyk7XG4gICAgICBcbiAgICAgIGlmICghY29tcG9uZW50RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExvb2sgZm9yIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmVkIGRpdiB0aGF0IGNvbnRhaW5zIHRoZSBpbnB1dFxuICAgICAgbGV0IGlubmVyRGl2ID0gY29tcG9uZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuYWJzb2x1dGUnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIFxuICAgICAgLy8gSWYgbm90IGZvdW5kIGJ5IGNsYXNzLCB0cnkgZmlyc3QgY2hpbGRcbiAgICAgIGlmICghaW5uZXJEaXYpIHtcbiAgICAgICAgaW5uZXJEaXYgPSBjb21wb25lbnRFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWlubmVyRGl2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGhlaWdodFxuICAgICAgY29uc3QgbWVhc3VyZWRIZWlnaHQgPSBpbm5lckRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgICBcbiAgICAgIGlmIChtZWFzdXJlZEhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFN1Y2Nlc3MhIFNldCB0aGUgaW5pdGlhbCBoZWlnaHRcbiAgICAgIHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQuc2V0KG1lYXN1cmVkSGVpZ2h0KTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGFuIEVsZW1lbnRSZWYgd3JhcHBlciBmb3IgUmVzaXplT2JzZXJ2ZXJcbiAgICAgIGNvbnN0IGlubmVyRGl2UmVmID0gbmV3IEVsZW1lbnRSZWYoaW5uZXJEaXYpO1xuICAgICAgXG4gICAgICAvLyBTZXQgdXAgUmVzaXplT2JzZXJ2ZXIgdG8gdHJhY2sgY2hhbmdlc1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2Uub2JzZXJ2ZUVsZW1lbnQoaW5uZXJEaXZSZWYsIDAsIDI1MClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBzdGF0ZS5oZWlnaHQ7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKG5ld0hlaWdodCAhPT0gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICYmIG5ld0hlaWdodCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQuc2V0KG5ld0hlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmlzUmVzaXppbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDbGVhciBleGlzdGluZyB0aW1lb3V0XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemVUaW1lb3V0UmVmKSB7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXRSZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTZXQgaXNSZXNpemluZyB0byBmYWxzZSBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXRSZWYgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNSZXNpemluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXRSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBUcnkgdG8gbWVhc3VyZSBpbW1lZGlhdGVseVxuICAgIGlmICghbWVhc3VyZUFuZE9ic2VydmUoKSkge1xuICAgICAgLy8gSWYgZmFpbGVkLCByZXRyeSB3aXRoIGluY3JlYXNpbmcgZGVsYXlzXG4gICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDtcbiAgICAgIFxuICAgICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgIGlmIChtZWFzdXJlQW5kT2JzZXJ2ZSgpKSB7XG4gICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IG1lYXN1cmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDUwbXMsIDEwMG1zLCAyMDBtcywgNDAwbXMsIGV0Yy5cbiAgICAgICAgICBjb25zdCBkZWxheSA9IDUwICogTWF0aC5wb3coMiwgTWF0aC5taW4oYXR0ZW1wdHMgLSAxLCA0KSk7XG4gICAgICAgICAgc2V0VGltZW91dChyZXRyeSwgZGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhaWxlZCB0byBtZWFzdXJlIGFmdGVyIG1heCBhdHRlbXB0c1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBTdGFydCByZXRyeSB3aXRoIGZpcnN0IGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KHJldHJ5LCA1MCk7XG4gICAgfVxuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNpemVUaW1lb3V0UmVmKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0UmVmKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ0BhZy11aS9jbGllbnQnO1xuXG4vKipcbiAqIFByb3BzIGZvciBDb3BpbG90Q2hhdFZpZXcgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29waWxvdENoYXRWaWV3UHJvcHMge1xuICBtZXNzYWdlcz86IE1lc3NhZ2VbXTtcbiAgYXV0b1Njcm9sbD86IGJvb2xlYW47XG4gIFxuICAvLyBTbG90IGNvbmZpZ3VyYXRpb25zXG4gIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIHNjcm9sbFZpZXdDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIHNjcm9sbFZpZXdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIHNjcm9sbFZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBzY3JvbGxUb0JvdHRvbUJ1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2Nyb2xsVG9Cb3R0b21CdXR0b25DbGFzcz86IHN0cmluZztcbiAgXG4gIGlucHV0Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgXG4gIGlucHV0Q29udGFpbmVyQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dENvbnRhaW5lclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgaW5wdXRDb250YWluZXJDbGFzcz86IHN0cmluZztcbiAgXG4gIGZlYXRoZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGZlYXRoZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGZlYXRoZXJDbGFzcz86IHN0cmluZztcbiAgXG4gIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGV4dCBmb3IgY3VzdG9tIGxheW91dCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0Vmlld0xheW91dENvbnRleHQge1xuICBtZXNzYWdlVmlldzogYW55O1xuICBpbnB1dDogYW55O1xuICBzY3JvbGxWaWV3OiBhbnk7XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uOiBhbnk7XG4gIGZlYXRoZXI6IGFueTtcbiAgaW5wdXRDb250YWluZXI6IGFueTtcbiAgZGlzY2xhaW1lcjogYW55O1xufVxuIl19