@copilotkitnext/angular 0.0.2 → 0.0.5

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 (173) 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/core/copilotkit.providers.d.ts +1 -1
  7. package/dist/core/copilotkit.service.d.ts +5 -5
  8. package/dist/core/copilotkit.types.d.ts +8 -10
  9. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +1 -1
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  11. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  12. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  13. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  14. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  15. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  16. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  17. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  18. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  19. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  20. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  21. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  22. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  23. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  24. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  25. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  26. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  29. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  30. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  31. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  32. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  37. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  38. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  39. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  40. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  41. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  42. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  43. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  44. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  45. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  46. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  47. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  48. package/dist/esm2022/core/copilotkit.service.mjs +426 -0
  49. package/dist/esm2022/core/copilotkit.types.mjs +13 -0
  50. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  52. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  53. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  54. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +128 -0
  55. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +265 -0
  56. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  57. package/dist/esm2022/index.mjs +70 -0
  58. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  59. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  60. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  61. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  62. package/dist/esm2022/lib/utils.mjs +10 -0
  63. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  64. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  65. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  66. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  67. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  68. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  69. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  70. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  71. package/dist/esm2022/utils/frontend-tool.utils.mjs +224 -0
  72. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +293 -0
  73. package/dist/fesm2022/copilotkitnext-angular.mjs +174 -187
  74. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  75. package/dist/utils/frontend-tool.utils.d.ts +1 -1
  76. package/package.json +23 -20
  77. package/vitest.config.mts +32 -21
  78. package/.turbo/turbo-build.log +0 -38
  79. package/.turbo/turbo-check-types.log +0 -0
  80. package/.turbo/turbo-test.log +0 -71
  81. package/ng-package.json +0 -19
  82. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  83. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  84. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  85. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  86. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  87. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  88. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  89. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  90. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  91. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  92. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  93. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  94. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  95. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  96. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  97. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  98. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  99. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  100. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  101. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  102. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  103. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  104. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  105. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  106. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  107. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  108. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  109. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  110. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  111. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  112. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  113. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  114. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  115. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  116. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  117. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  118. package/src/components/chat/copilot-chat.component.ts +0 -232
  119. package/src/components/copilotkit-tool-render.component.ts +0 -169
  120. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  121. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  122. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  123. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  124. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  125. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  126. package/src/core/copilotkit.providers.ts +0 -59
  127. package/src/core/copilotkit.service.ts +0 -542
  128. package/src/core/copilotkit.types.ts +0 -132
  129. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  130. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  131. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  132. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  133. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  134. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  135. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  136. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  137. package/src/directives/copilotkit-agent.directive.ts +0 -225
  138. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  139. package/src/directives/copilotkit-config.directive.ts +0 -81
  140. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  141. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  142. package/src/directives/stick-to-bottom.directive.ts +0 -204
  143. package/src/index.ts +0 -105
  144. package/src/lib/directives/tooltip.directive.ts +0 -292
  145. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  146. package/src/lib/slots/copilot-slot.component.ts +0 -135
  147. package/src/lib/slots/index.ts +0 -3
  148. package/src/lib/slots/slot.types.ts +0 -64
  149. package/src/lib/slots/slot.utils.ts +0 -289
  150. package/src/lib/utils.ts +0 -10
  151. package/src/public-api.ts +0 -1
  152. package/src/services/resize-observer.service.ts +0 -181
  153. package/src/services/scroll-position.service.ts +0 -169
  154. package/src/styles/globals.css +0 -266
  155. package/src/styles/index.css +0 -3
  156. package/src/test-setup.ts +0 -15
  157. package/src/testing/index.ts +0 -3
  158. package/src/testing/testing.utils.ts +0 -248
  159. package/src/types/frontend-tool.ts +0 -44
  160. package/src/types/human-in-the-loop.ts +0 -52
  161. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  162. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  163. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  164. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  165. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  166. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  167. package/src/utils/agent-context.utils.ts +0 -133
  168. package/src/utils/agent.utils.ts +0 -239
  169. package/src/utils/chat-config.utils.ts +0 -221
  170. package/src/utils/copilotkit.utils.ts +0 -20
  171. package/src/utils/frontend-tool.utils.ts +0 -266
  172. package/src/utils/human-in-the-loop.utils.ts +0 -359
  173. package/tsconfig.spec.json +0 -12
@@ -0,0 +1,181 @@
1
+ import { Directive, Input, Output, EventEmitter, ElementRef, inject } from '@angular/core';
2
+ import { ScrollPositionService } from '../services/scroll-position.service';
3
+ import { ResizeObserverService } from '../services/resize-observer.service';
4
+ import { Subject } from 'rxjs';
5
+ import { takeUntil, debounceTime, filter, distinctUntilChanged } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Directive for implementing stick-to-bottom scroll behavior
9
+ * Similar to the React use-stick-to-bottom library
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <div copilotStickToBottom
14
+ * [enabled]="true"
15
+ * [threshold]="10"
16
+ * [initialBehavior]="'smooth'"
17
+ * [resizeBehavior]="'smooth'"
18
+ * (isAtBottomChange)="onBottomChange($event)">
19
+ * <!-- Content -->
20
+ * </div>
21
+ * ```
22
+ */
23
+ export class StickToBottomDirective {
24
+ enabled = true;
25
+ threshold = 10;
26
+ initialBehavior = 'smooth';
27
+ resizeBehavior = 'smooth';
28
+ debounceMs = 100;
29
+ isAtBottomChange = new EventEmitter();
30
+ scrollToBottomRequested = new EventEmitter();
31
+ elementRef = inject(ElementRef);
32
+ scrollService = inject(ScrollPositionService);
33
+ resizeService = inject(ResizeObserverService);
34
+ destroy$ = new Subject();
35
+ contentElement;
36
+ wasAtBottom = true;
37
+ hasInitialized = false;
38
+ userHasScrolled = false;
39
+ ngOnInit() {
40
+ // Setup will happen in ngAfterViewInit
41
+ }
42
+ ngAfterViewInit() {
43
+ const element = this.elementRef.nativeElement;
44
+ // Find or create content wrapper
45
+ this.contentElement = element.querySelector('[data-stick-to-bottom-content]');
46
+ if (!this.contentElement) {
47
+ this.contentElement = element;
48
+ }
49
+ this.setupScrollMonitoring();
50
+ this.setupResizeMonitoring();
51
+ this.setupContentMutationObserver();
52
+ // Initial scroll to bottom if enabled
53
+ setTimeout(() => {
54
+ this.hasInitialized = true;
55
+ if (this.enabled) {
56
+ this.scrollToBottom(this.initialBehavior);
57
+ }
58
+ }, 0);
59
+ }
60
+ setupScrollMonitoring() {
61
+ if (!this.enabled)
62
+ return;
63
+ const element = this.elementRef.nativeElement;
64
+ // Monitor scroll position
65
+ this.scrollService.monitorScrollPosition(element, this.threshold)
66
+ .pipe(takeUntil(this.destroy$), debounceTime(this.debounceMs), distinctUntilChanged((a, b) => a.isAtBottom === b.isAtBottom))
67
+ .subscribe(state => {
68
+ const wasAtBottom = this.wasAtBottom;
69
+ this.wasAtBottom = state.isAtBottom;
70
+ // Detect user scroll
71
+ if (!state.isAtBottom && wasAtBottom && this.hasInitialized) {
72
+ this.userHasScrolled = true;
73
+ }
74
+ else if (state.isAtBottom) {
75
+ this.userHasScrolled = false;
76
+ }
77
+ // Emit change
78
+ this.isAtBottomChange.emit(state.isAtBottom);
79
+ });
80
+ }
81
+ setupResizeMonitoring() {
82
+ if (!this.enabled || !this.contentElement)
83
+ return;
84
+ // Monitor content resize
85
+ this.resizeService.observeElement(this.contentElement, 0, 250)
86
+ .pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled))
87
+ .subscribe(state => {
88
+ // Auto-scroll on resize if we were at bottom
89
+ if (this.wasAtBottom && !state.isResizing) {
90
+ this.scrollToBottom(this.resizeBehavior);
91
+ }
92
+ });
93
+ // Monitor container resize
94
+ const element = this.elementRef.nativeElement;
95
+ this.resizeService.observeElement(element, 0, 250)
96
+ .pipe(takeUntil(this.destroy$), filter(() => this.enabled && !this.userHasScrolled && this.wasAtBottom))
97
+ .subscribe(() => {
98
+ // Adjust scroll on container resize
99
+ this.scrollToBottom(this.resizeBehavior);
100
+ });
101
+ }
102
+ setupContentMutationObserver() {
103
+ if (!this.enabled || !this.contentElement)
104
+ return;
105
+ const mutationObserver = new MutationObserver(() => {
106
+ if (this.enabled && this.wasAtBottom && !this.userHasScrolled) {
107
+ // Content changed, scroll to bottom if we were there
108
+ requestAnimationFrame(() => {
109
+ this.scrollToBottom(this.resizeBehavior);
110
+ });
111
+ }
112
+ });
113
+ mutationObserver.observe(this.contentElement, {
114
+ childList: true,
115
+ subtree: true,
116
+ characterData: true
117
+ });
118
+ // Cleanup on destroy
119
+ this.destroy$.subscribe(() => {
120
+ mutationObserver.disconnect();
121
+ });
122
+ }
123
+ /**
124
+ * Public method to scroll to bottom
125
+ * Can be called from parent component
126
+ */
127
+ scrollToBottom(behavior = 'smooth') {
128
+ const element = this.elementRef.nativeElement;
129
+ const smooth = behavior === 'smooth';
130
+ this.scrollService.scrollToBottom(element, smooth);
131
+ this.userHasScrolled = false;
132
+ this.scrollToBottomRequested.emit();
133
+ }
134
+ /**
135
+ * Check if currently at bottom
136
+ */
137
+ isAtBottom() {
138
+ return this.scrollService.isAtBottom(this.elementRef.nativeElement, this.threshold);
139
+ }
140
+ /**
141
+ * Get current scroll state
142
+ */
143
+ getScrollState() {
144
+ const element = this.elementRef.nativeElement;
145
+ return {
146
+ scrollTop: element.scrollTop,
147
+ scrollHeight: element.scrollHeight,
148
+ clientHeight: element.clientHeight,
149
+ isAtBottom: this.isAtBottom()
150
+ };
151
+ }
152
+ ngOnDestroy() {
153
+ this.destroy$.next();
154
+ this.destroy$.complete();
155
+ }
156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
157
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: StickToBottomDirective, isStandalone: true, selector: "[copilotStickToBottom]", inputs: { enabled: "enabled", threshold: "threshold", initialBehavior: "initialBehavior", resizeBehavior: "resizeBehavior", debounceMs: "debounceMs" }, outputs: { isAtBottomChange: "isAtBottomChange", scrollToBottomRequested: "scrollToBottomRequested" }, providers: [ScrollPositionService, ResizeObserverService], ngImport: i0 });
158
+ }
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickToBottomDirective, decorators: [{
160
+ type: Directive,
161
+ args: [{
162
+ selector: '[copilotStickToBottom]',
163
+ standalone: true,
164
+ providers: [ScrollPositionService, ResizeObserverService]
165
+ }]
166
+ }], propDecorators: { enabled: [{
167
+ type: Input
168
+ }], threshold: [{
169
+ type: Input
170
+ }], initialBehavior: [{
171
+ type: Input
172
+ }], resizeBehavior: [{
173
+ type: Input
174
+ }], debounceMs: [{
175
+ type: Input
176
+ }], isAtBottomChange: [{
177
+ type: Output
178
+ }], scrollToBottomRequested: [{
179
+ type: Output
180
+ }] } });
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2stdG8tYm90dG9tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBSVYsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxPQUFPLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUl2Rjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3hCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDeEIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixlQUFlLEdBQW1CLFFBQVEsQ0FBQztJQUMzQyxjQUFjLEdBQW1CLFFBQVEsQ0FBQztJQUMxQyxVQUFVLEdBQVcsR0FBRyxDQUFDO0lBRXhCLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDL0MsdUJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVyRCxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLGFBQWEsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM5QyxhQUFhLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFOUMsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsY0FBYyxDQUFlO0lBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLFFBQVE7UUFDTix1Q0FBdUM7SUFDekMsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQTRCLENBQUM7UUFFN0QsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBZ0IsQ0FBQztRQUM3RixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwQyxzQ0FBc0M7UUFDdEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBRTlDLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQzlELElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUM3QixvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUM5RDthQUNBLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUVwQyxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDL0IsQ0FBQztZQUVELGNBQWM7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFbEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMzRCxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ3BEO2FBQ0EsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLDZDQUE2QztZQUM3QyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLDJCQUEyQjtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQzthQUMvQyxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDeEU7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2Qsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUVsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM5RCxxREFBcUQ7Z0JBQ3JELHFCQUFxQixDQUFDLEdBQUcsRUFBRTtvQkFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDNUMsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsSUFBSTtZQUNiLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLFdBQTJCLFFBQVE7UUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxLQUFLLFFBQVEsQ0FBQztRQUVyQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLE9BQU87WUFDTCxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FuS1Usc0JBQXNCOzRGQUF0QixzQkFBc0Isb1VBRnRCLENBQUMscUJBQXFCLEVBQUUscUJBQXFCLENBQUM7OzRGQUU5QyxzQkFBc0I7a0JBTGxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO2lCQUMxRDs4QkFFVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY3JvbGxQb3NpdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zY3JvbGwtcG9zaXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCB0eXBlIFNjcm9sbEJlaGF2aW9yID0gJ3Ntb290aCcgfCAnaW5zdGFudCcgfCAnYXV0byc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBpbXBsZW1lbnRpbmcgc3RpY2stdG8tYm90dG9tIHNjcm9sbCBiZWhhdmlvclxuICogU2ltaWxhciB0byB0aGUgUmVhY3QgdXNlLXN0aWNrLXRvLWJvdHRvbSBsaWJyYXJ5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGNvcGlsb3RTdGlja1RvQm90dG9tXG4gKiAgICAgIFtlbmFibGVkXT1cInRydWVcIlxuICogICAgICBbdGhyZXNob2xkXT1cIjEwXCJcbiAqICAgICAgW2luaXRpYWxCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIFtyZXNpemVCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gKiAgICAgIChpc0F0Qm90dG9tQ2hhbmdlKT1cIm9uQm90dG9tQ2hhbmdlKCRldmVudClcIj5cbiAqICAgPCEtLSBDb250ZW50IC0tPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvcGlsb3RTdGlja1RvQm90dG9tXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1Njcm9sbFBvc2l0aW9uU2VydmljZSwgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBTdGlja1RvQm90dG9tRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgdGhyZXNob2xkOiBudW1iZXIgPSAxMDtcbiAgQElucHV0KCkgaW5pdGlhbEJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnO1xuICBASW5wdXQoKSByZXNpemVCZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSAnc21vb3RoJztcbiAgQElucHV0KCkgZGVib3VuY2VNczogbnVtYmVyID0gMTAwO1xuICBcbiAgQE91dHB1dCgpIGlzQXRCb3R0b21DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzY3JvbGxUb0JvdHRvbVJlcXVlc3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlID0gaW5qZWN0KFNjcm9sbFBvc2l0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVzaXplU2VydmljZSA9IGluamVjdChSZXNpemVPYnNlcnZlclNlcnZpY2UpO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgY29udGVudEVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB3YXNBdEJvdHRvbSA9IHRydWU7XG4gIHByaXZhdGUgaGFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSB1c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHdpbGwgaGFwcGVuIGluIG5nQWZ0ZXJWaWV3SW5pdFxuICB9XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIFxuICAgIC8vIEZpbmQgb3IgY3JlYXRlIGNvbnRlbnQgd3JhcHBlclxuICAgIHRoaXMuY29udGVudEVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN0aWNrLXRvLWJvdHRvbS1jb250ZW50XScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGhpcy5jb250ZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5jb250ZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2V0dXBTY3JvbGxNb25pdG9yaW5nKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZU1vbml0b3JpbmcoKTtcbiAgICB0aGlzLnNldHVwQ29udGVudE11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsIHNjcm9sbCB0byBib3R0b20gaWYgZW5hYmxlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5pbml0aWFsQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNldHVwU2Nyb2xsTW9uaXRvcmluZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBcbiAgICAvLyBNb25pdG9yIHNjcm9sbCBwb3NpdGlvblxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5tb25pdG9yU2Nyb2xsUG9zaXRpb24oZWxlbWVudCwgdGhpcy50aHJlc2hvbGQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZU1zKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGEuaXNBdEJvdHRvbSA9PT0gYi5pc0F0Qm90dG9tKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHdhc0F0Qm90dG9tID0gdGhpcy53YXNBdEJvdHRvbTtcbiAgICAgICAgdGhpcy53YXNBdEJvdHRvbSA9IHN0YXRlLmlzQXRCb3R0b207XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgdXNlciBzY3JvbGxcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0F0Qm90dG9tICYmIHdhc0F0Qm90dG9tICYmIHRoaXMuaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaXNBdEJvdHRvbSkge1xuICAgICAgICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEVtaXQgY2hhbmdlXG4gICAgICAgIHRoaXMuaXNBdEJvdHRvbUNoYW5nZS5lbWl0KHN0YXRlLmlzQXRCb3R0b20pO1xuICAgICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2V0dXBSZXNpemVNb25pdG9yaW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgLy8gTW9uaXRvciBjb250ZW50IHJlc2l6ZVxuICAgIHRoaXMucmVzaXplU2VydmljZS5vYnNlcnZlRWxlbWVudCh0aGlzLmNvbnRlbnRFbGVtZW50LCAwLCAyNTApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkICYmICF0aGlzLnVzZXJIYXNTY3JvbGxlZClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICAvLyBBdXRvLXNjcm9sbCBvbiByZXNpemUgaWYgd2Ugd2VyZSBhdCBib3R0b21cbiAgICAgICAgaWYgKHRoaXMud2FzQXRCb3R0b20gJiYgIXN0YXRlLmlzUmVzaXppbmcpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBNb25pdG9yIGNvbnRhaW5lciByZXNpemVcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZXNpemVTZXJ2aWNlLm9ic2VydmVFbGVtZW50KGVsZW1lbnQsIDAsIDI1MClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQgJiYgIXRoaXMudXNlckhhc1Njcm9sbGVkICYmIHRoaXMud2FzQXRCb3R0b20pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQWRqdXN0IHNjcm9sbCBvbiBjb250YWluZXIgcmVzaXplXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5yZXNpemVCZWhhdmlvcik7XG4gICAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXR1cENvbnRlbnRNdXRhdGlvbk9ic2VydmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdGhpcy53YXNBdEJvdHRvbSAmJiAhdGhpcy51c2VySGFzU2Nyb2xsZWQpIHtcbiAgICAgICAgLy8gQ29udGVudCBjaGFuZ2VkLCBzY3JvbGwgdG8gYm90dG9tIGlmIHdlIHdlcmUgdGhlcmVcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMucmVzaXplQmVoYXZpb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5jb250ZW50RWxlbWVudCwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3kkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBtdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gc2Nyb2xsIHRvIGJvdHRvbVxuICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvQm90dG9tKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNtb290aCA9IGJlaGF2aW9yID09PSAnc21vb3RoJztcbiAgICBcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9Cb3R0b20oZWxlbWVudCwgc21vb3RoKTtcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21SZXF1ZXN0ZWQuZW1pdCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudGx5IGF0IGJvdHRvbVxuICAgKi9cbiAgcHVibGljIGlzQXRCb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsU2VydmljZS5pc0F0Qm90dG9tKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnRocmVzaG9sZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBzY3JvbGwgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3AsXG4gICAgICBzY3JvbGxIZWlnaHQ6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgY2xpZW50SGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgIGlzQXRCb3R0b206IHRoaXMuaXNBdEJvdHRvbSgpXG4gICAgfTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59Il19
@@ -0,0 +1,70 @@
1
+ export * from "./core/copilotkit.service";
2
+ export * from "./core/copilotkit.types";
3
+ export * from "./core/copilotkit.providers";
4
+ export * from "./core/chat-configuration/chat-configuration.types";
5
+ export * from "./core/chat-configuration/chat-configuration.service";
6
+ export * from "./core/chat-configuration/chat-configuration.providers";
7
+ export * from "./utils/copilotkit.utils";
8
+ export * from "./utils/agent-context.utils";
9
+ export * from "./utils/frontend-tool.utils";
10
+ // Note: tool-render.utils removed in favor of direct ToolCallRender<T> usage
11
+ // Export all except AgentWatchResult which is already exported from copilotkit.types
12
+ export { watchAgent, getAgent, subscribeToAgent, registerAgentWatcher, } from "./utils/agent.utils";
13
+ export * from "./utils/human-in-the-loop.utils";
14
+ export * from "./utils/chat-config.utils";
15
+ // Slot utilities are internal only, not exported
16
+ // export * from "./lib/slots/slot.types";
17
+ // export * from "./lib/slots/slot.utils";
18
+ // export { CopilotSlotComponent } from "./lib/slots/copilot-slot.component";
19
+ export { CopilotTooltipDirective } from "./lib/directives/tooltip.directive";
20
+ export { CopilotKitConfigDirective } from "./directives/copilotkit-config.directive";
21
+ export { CopilotKitAgentContextDirective } from "./directives/copilotkit-agent-context.directive";
22
+ export { CopilotKitFrontendToolDirective } from "./directives/copilotkit-frontend-tool.directive";
23
+ export { CopilotKitAgentDirective } from "./directives/copilotkit-agent.directive";
24
+ export { CopilotKitHumanInTheLoopDirective, CopilotKitHumanInTheLoopRespondDirective, } from "./directives/copilotkit-human-in-the-loop.directive";
25
+ export { CopilotKitChatConfigDirective } from "./directives/copilotkit-chat-config.directive";
26
+ export { CopilotKitToolRenderComponent } from "./components/copilotkit-tool-render.component";
27
+ // Chat Input Components
28
+ export * from "./components/chat/copilot-chat-input.types";
29
+ export { CopilotChatInputComponent } from "./components/chat/copilot-chat-input.component";
30
+ export { CopilotChatInputDefaults } from "./components/chat/copilot-chat-input-defaults";
31
+ export { CopilotChatTextareaComponent } from "./components/chat/copilot-chat-textarea.component";
32
+ export { CopilotChatAudioRecorderComponent } from "./components/chat/copilot-chat-audio-recorder.component";
33
+ export { CopilotChatSendButtonComponent, CopilotChatToolbarButtonComponent, CopilotChatStartTranscribeButtonComponent, CopilotChatCancelTranscribeButtonComponent, CopilotChatFinishTranscribeButtonComponent, CopilotChatAddFileButtonComponent, } from "./components/chat/copilot-chat-buttons.component";
34
+ export { CopilotChatToolbarComponent } from "./components/chat/copilot-chat-toolbar.component";
35
+ export { CopilotChatToolsMenuComponent } from "./components/chat/copilot-chat-tools-menu.component";
36
+ // Chat User Message Components
37
+ export * from "./components/chat/copilot-chat-user-message.types";
38
+ export { CopilotChatUserMessageComponent } from "./components/chat/copilot-chat-user-message.component";
39
+ export { CopilotChatUserMessageRendererComponent } from "./components/chat/copilot-chat-user-message-renderer.component";
40
+ export { CopilotChatUserMessageToolbarButtonComponent, CopilotChatUserMessageCopyButtonComponent, CopilotChatUserMessageEditButtonComponent, } from "./components/chat/copilot-chat-user-message-buttons.component";
41
+ export { CopilotChatUserMessageToolbarComponent } from "./components/chat/copilot-chat-user-message-toolbar.component";
42
+ export { CopilotChatUserMessageBranchNavigationComponent } from "./components/chat/copilot-chat-user-message-branch-navigation.component";
43
+ // Chat Assistant Message Components
44
+ export * from "./components/chat/copilot-chat-assistant-message.types";
45
+ export { CopilotChatAssistantMessageComponent } from "./components/chat/copilot-chat-assistant-message.component";
46
+ export { CopilotChatAssistantMessageRendererComponent } from "./components/chat/copilot-chat-assistant-message-renderer.component";
47
+ export { CopilotChatAssistantMessageToolbarButtonComponent, CopilotChatAssistantMessageCopyButtonComponent, CopilotChatAssistantMessageThumbsUpButtonComponent, CopilotChatAssistantMessageThumbsDownButtonComponent, CopilotChatAssistantMessageReadAloudButtonComponent, CopilotChatAssistantMessageRegenerateButtonComponent, } from "./components/chat/copilot-chat-assistant-message-buttons.component";
48
+ export { CopilotChatAssistantMessageToolbarComponent } from "./components/chat/copilot-chat-assistant-message-toolbar.component";
49
+ // Chat Message View Components
50
+ export * from "./components/chat/copilot-chat-message-view.types";
51
+ export { CopilotChatMessageViewComponent } from "./components/chat/copilot-chat-message-view.component";
52
+ export { CopilotChatMessageViewCursorComponent } from "./components/chat/copilot-chat-message-view-cursor.component";
53
+ export { CopilotChatToolCallsViewComponent } from "./components/chat/copilot-chat-tool-calls-view.component";
54
+ // Chat View Components
55
+ export * from "./components/chat/copilot-chat-view.types";
56
+ export { CopilotChatViewComponent } from "./components/chat/copilot-chat-view.component";
57
+ export { CopilotChatViewScrollViewComponent } from "./components/chat/copilot-chat-view-scroll-view.component";
58
+ export { CopilotChatViewScrollToBottomButtonComponent } from "./components/chat/copilot-chat-view-scroll-to-bottom-button.component";
59
+ export { CopilotChatViewFeatherComponent } from "./components/chat/copilot-chat-view-feather.component";
60
+ export { CopilotChatViewInputContainerComponent } from "./components/chat/copilot-chat-view-input-container.component";
61
+ export { CopilotChatViewDisclaimerComponent } from "./components/chat/copilot-chat-view-disclaimer.component";
62
+ // Main Chat Component
63
+ export { CopilotChatComponent } from "./components/chat/copilot-chat.component";
64
+ // Services and Directives for Chat View
65
+ export { ScrollPositionService } from "./services/scroll-position.service";
66
+ export { ResizeObserverService } from "./services/resize-observer.service";
67
+ export { StickToBottomDirective } from "./directives/stick-to-bottom.directive";
68
+ // Testing utilities are not exported from the main entry point
69
+ // They should be imported directly from '@copilotkitnext/angular/testing' if needed
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFHNUMsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLHNEQUFzRCxDQUFDO0FBQ3JFLGNBQWMsd0RBQXdELENBQUM7QUFDdkUsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsNkVBQTZFO0FBQzdFLHFGQUFxRjtBQUNyRixPQUFPLEVBQ0wsVUFBVSxFQUNWLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGlEQUFpRDtBQUNqRCwwQ0FBMEM7QUFDMUMsMENBQTBDO0FBQzFDLDZFQUE2RTtBQUM3RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQ0wsaUNBQWlDLEVBQ2pDLHdDQUF3QyxHQUN6QyxNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRTlGLHdCQUF3QjtBQUN4QixjQUFjLDRDQUE0QyxDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzVHLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLHlDQUF5QyxFQUN6QywwQ0FBMEMsRUFDMUMsMENBQTBDLEVBQzFDLGlDQUFpQyxHQUNsQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBRXBHLCtCQUErQjtBQUMvQixjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ3pILE9BQU8sRUFDTCw0Q0FBNEMsRUFDNUMseUNBQXlDLEVBQ3pDLHlDQUF5QyxHQUMxQyxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBRTFJLG9DQUFvQztBQUNwQyxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ2xILE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQ25JLE9BQU8sRUFDTCxpREFBaUQsRUFDakQsOENBQThDLEVBQzlDLGtEQUFrRCxFQUNsRCxvREFBb0QsRUFDcEQsbURBQW1ELEVBQ25ELG9EQUFvRCxHQUNyRCxNQUFNLG9FQUFvRSxDQUFDO0FBQzVFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBRWpJLCtCQUErQjtBQUMvQixjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBRTdHLHVCQUF1QjtBQUN2QixjQUFjLDJDQUEyQyxDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQy9HLE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBRTlHLHNCQUFzQjtBQUN0QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVoRix3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFaEYsK0RBQStEO0FBQy9ELG9GQUFvRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlL2NvcGlsb3RraXQudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY29waWxvdGtpdC5wcm92aWRlcnNcIjtcbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIEBhZy11aS9jb3JlIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBNZXNzYWdlLCBUb29sQ2FsbCwgVG9vbE1lc3NhZ2UgfSBmcm9tIFwiQGFnLXVpL2NvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS9jaGF0LWNvbmZpZ3VyYXRpb24vY2hhdC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUvY2hhdC1jb25maWd1cmF0aW9uL2NoYXQtY29uZmlndXJhdGlvbi5wcm92aWRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2NvcGlsb3RraXQudXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2FnZW50LWNvbnRleHQudXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2Zyb250ZW5kLXRvb2wudXRpbHNcIjtcbi8vIE5vdGU6IHRvb2wtcmVuZGVyLnV0aWxzIHJlbW92ZWQgaW4gZmF2b3Igb2YgZGlyZWN0IFRvb2xDYWxsUmVuZGVyPFQ+IHVzYWdlXG4vLyBFeHBvcnQgYWxsIGV4Y2VwdCBBZ2VudFdhdGNoUmVzdWx0IHdoaWNoIGlzIGFscmVhZHkgZXhwb3J0ZWQgZnJvbSBjb3BpbG90a2l0LnR5cGVzXG5leHBvcnQge1xuICB3YXRjaEFnZW50LFxuICBnZXRBZ2VudCxcbiAgc3Vic2NyaWJlVG9BZ2VudCxcbiAgcmVnaXN0ZXJBZ2VudFdhdGNoZXIsXG59IGZyb20gXCIuL3V0aWxzL2FnZW50LnV0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlscy9odW1hbi1pbi10aGUtbG9vcC51dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvY2hhdC1jb25maWcudXRpbHNcIjtcbi8vIFNsb3QgdXRpbGl0aWVzIGFyZSBpbnRlcm5hbCBvbmx5LCBub3QgZXhwb3J0ZWRcbi8vIGV4cG9ydCAqIGZyb20gXCIuL2xpYi9zbG90cy9zbG90LnR5cGVzXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi9saWIvc2xvdHMvc2xvdC51dGlsc1wiO1xuLy8gZXhwb3J0IHsgQ29waWxvdFNsb3RDb21wb25lbnQgfSBmcm9tIFwiLi9saWIvc2xvdHMvY29waWxvdC1zbG90LmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tIFwiLi9saWIvZGlyZWN0aXZlcy90b29sdGlwLmRpcmVjdGl2ZVwiO1xuZXhwb3J0IHsgQ29waWxvdEtpdENvbmZpZ0RpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvY29waWxvdGtpdC1jb25maWcuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0QWdlbnRDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWFnZW50LWNvbnRleHQuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0RnJvbnRlbmRUb29sRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWZyb250ZW5kLXRvb2wuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBDb3BpbG90S2l0QWdlbnREaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2NvcGlsb3RraXQtYWdlbnQuZGlyZWN0aXZlXCI7XG5leHBvcnQge1xuICBDb3BpbG90S2l0SHVtYW5JblRoZUxvb3BEaXJlY3RpdmUsXG4gIENvcGlsb3RLaXRIdW1hbkluVGhlTG9vcFJlc3BvbmREaXJlY3RpdmUsXG59IGZyb20gXCIuL2RpcmVjdGl2ZXMvY29waWxvdGtpdC1odW1hbi1pbi10aGUtbG9vcC5kaXJlY3RpdmVcIjtcbmV4cG9ydCB7IENvcGlsb3RLaXRDaGF0Q29uZmlnRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9jb3BpbG90a2l0LWNoYXQtY29uZmlnLmRpcmVjdGl2ZVwiO1xuZXhwb3J0IHsgQ29waWxvdEtpdFRvb2xSZW5kZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NvcGlsb3RraXQtdG9vbC1yZW5kZXIuY29tcG9uZW50XCI7XG5cbi8vIENoYXQgSW5wdXQgQ29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1pbnB1dC50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRJbnB1dENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtaW5wdXQuY29tcG9uZW50XCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdElucHV0RGVmYXVsdHMgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWlucHV0LWRlZmF1bHRzXCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdFRleHRhcmVhQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC10ZXh0YXJlYS5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0QXVkaW9SZWNvcmRlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXVkaW8tcmVjb3JkZXIuY29tcG9uZW50XCI7XG5leHBvcnQge1xuICBDb3BpbG90Q2hhdFNlbmRCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0VG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0Q2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRGaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50LFxuICBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b25Db21wb25lbnQsXG59IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYnV0dG9ucy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0VG9vbGJhckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdG9vbGJhci5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0VG9vbHNNZW51Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC10b29scy1tZW51LmNvbXBvbmVudFwiO1xuXG4vLyBDaGF0IFVzZXIgTWVzc2FnZSBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdXNlci1tZXNzYWdlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZVJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC11c2VyLW1lc3NhZ2UtcmVuZGVyZXIuY29tcG9uZW50XCI7XG5leHBvcnQge1xuICBDb3BpbG90Q2hhdFVzZXJNZXNzYWdlVG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRVc2VyTWVzc2FnZUNvcHlCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0VXNlck1lc3NhZ2VFZGl0QnV0dG9uQ29tcG9uZW50LFxufSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS1idXR0b25zLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZVRvb2xiYXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS10b29sYmFyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRVc2VyTWVzc2FnZUJyYW5jaE5hdmlnYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXVzZXItbWVzc2FnZS1icmFuY2gtbmF2aWdhdGlvbi5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBBc3Npc3RhbnQgTWVzc2FnZSBDb21wb25lbnRzXG5leHBvcnQgKiBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLnR5cGVzXCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdEFzc2lzdGFudE1lc3NhZ2VDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHtcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhckJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlQ29weUJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXBCdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd25CdXR0b25Db21wb25lbnQsXG4gIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZEJ1dHRvbkNvbXBvbmVudCxcbiAgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZUJ1dHRvbkNvbXBvbmVudCxcbn0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1idXR0b25zLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtdG9vbGJhci5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBNZXNzYWdlIFZpZXcgQ29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC1tZXNzYWdlLXZpZXcudHlwZXNcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LW1lc3NhZ2Utdmlldy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDdXJzb3JDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LW1lc3NhZ2Utdmlldy1jdXJzb3IuY29tcG9uZW50XCI7XG5leHBvcnQgeyBDb3BpbG90Q2hhdFRvb2xDYWxsc1ZpZXdDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXRvb2wtY2FsbHMtdmlldy5jb21wb25lbnRcIjtcblxuLy8gQ2hhdCBWaWV3IENvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50eXBlc1wiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3Q29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdmlldy5jb21wb25lbnRcIjtcbmV4cG9ydCB7IENvcGlsb3RDaGF0Vmlld1Njcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC10by1ib3R0b20tYnV0dG9uLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3RmVhdGhlckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1mZWF0aGVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXJDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LXZpZXctaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ29waWxvdENoYXRWaWV3RGlzY2xhaW1lckNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1kaXNjbGFpbWVyLmNvbXBvbmVudFwiO1xuXG4vLyBNYWluIENoYXQgQ29tcG9uZW50XG5leHBvcnQgeyBDb3BpbG90Q2hhdENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQuY29tcG9uZW50XCI7XG5cbi8vIFNlcnZpY2VzIGFuZCBEaXJlY3RpdmVzIGZvciBDaGF0IFZpZXdcbmV4cG9ydCB7IFNjcm9sbFBvc2l0aW9uU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL3Njcm9sbC1wb3NpdGlvbi5zZXJ2aWNlXCI7XG5leHBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZVwiO1xuZXhwb3J0IHsgU3RpY2tUb0JvdHRvbURpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvc3RpY2stdG8tYm90dG9tLmRpcmVjdGl2ZVwiO1xuXG4vLyBUZXN0aW5nIHV0aWxpdGllcyBhcmUgbm90IGV4cG9ydGVkIGZyb20gdGhlIG1haW4gZW50cnkgcG9pbnRcbi8vIFRoZXkgc2hvdWxkIGJlIGltcG9ydGVkIGRpcmVjdGx5IGZyb20gJ0Bjb3BpbG90a2l0bmV4dC9hbmd1bGFyL3Rlc3RpbmcnIGlmIG5lZWRlZFxuIl19
@@ -0,0 +1,211 @@
1
+ import { Directive, Input, ElementRef, HostListener, inject, ViewContainerRef } from '@angular/core';
2
+ import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
3
+ import { ComponentPortal } from '@angular/cdk/portal';
4
+ import { Component, ChangeDetectionStrategy } from '@angular/core';
5
+ import * as i0 from "@angular/core";
6
+ export class TooltipContentComponent {
7
+ cdr;
8
+ text = '';
9
+ _position = 'below';
10
+ get position() {
11
+ return this._position;
12
+ }
13
+ set position(value) {
14
+ this._position = value;
15
+ this.cdr.markForCheck();
16
+ }
17
+ constructor(cdr) {
18
+ this.cdr = cdr;
19
+ }
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TooltipContentComponent, isStandalone: true, selector: "copilot-tooltip-content", ngImport: i0, template: `
22
+ <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
23
+ <div class="copilot-tooltip">
24
+ {{ text }}
25
+ </div>
26
+ <div class="copilot-tooltip-arrow"></div>
27
+ </div>
28
+ `, isInline: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TooltipContentComponent, decorators: [{
31
+ type: Component,
32
+ args: [{ selector: 'copilot-tooltip-content', template: `
33
+ <div class="copilot-tooltip-wrapper" [attr.data-position]="position">
34
+ <div class="copilot-tooltip">
35
+ {{ text }}
36
+ </div>
37
+ <div class="copilot-tooltip-arrow"></div>
38
+ </div>
39
+ `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, styles: [".copilot-tooltip-wrapper{position:relative;display:inline-block;animation:fadeIn .15s ease-in-out}.copilot-tooltip{background-color:#1a1a1a;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-weight:500;white-space:nowrap;max-width:200px;box-shadow:0 2px 8px #00000026}.copilot-tooltip-arrow{position:absolute;width:0;height:0;border-style:solid}.copilot-tooltip-wrapper[data-position=below] .copilot-tooltip-arrow{top:-4px;left:50%;transform:translate(-50%);border-width:0 4px 4px 4px;border-color:transparent transparent #1a1a1a transparent}.copilot-tooltip-wrapper[data-position=above] .copilot-tooltip-arrow{bottom:-4px;left:50%;transform:translate(-50%);border-width:4px 4px 0 4px;border-color:#1a1a1a transparent transparent transparent}.copilot-tooltip-wrapper[data-position=left] .copilot-tooltip-arrow{right:-4px;top:50%;transform:translateY(-50%);border-width:4px 0 4px 4px;border-color:transparent transparent transparent #1a1a1a}.copilot-tooltip-wrapper[data-position=right] .copilot-tooltip-arrow{left:-4px;top:50%;transform:translateY(-50%);border-width:4px 4px 4px 0;border-color:transparent #1a1a1a transparent transparent}@keyframes fadeIn{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}\n"] }]
40
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
41
+ export class CopilotTooltipDirective {
42
+ tooltipText = '';
43
+ tooltipPosition = 'below';
44
+ tooltipDelay = 500; // milliseconds
45
+ overlay = inject(Overlay);
46
+ overlayPositionBuilder = inject(OverlayPositionBuilder);
47
+ elementRef = inject(ElementRef);
48
+ viewContainerRef = inject(ViewContainerRef);
49
+ overlayRef;
50
+ tooltipTimeout;
51
+ originalTitle;
52
+ onMouseEnter() {
53
+ if (!this.tooltipText)
54
+ return;
55
+ // Store and remove native title to prevent OS tooltip
56
+ const element = this.elementRef.nativeElement;
57
+ if (element.hasAttribute('title')) {
58
+ this.originalTitle = element.getAttribute('title');
59
+ element.removeAttribute('title');
60
+ }
61
+ // Clear any existing timeout
62
+ if (this.tooltipTimeout) {
63
+ clearTimeout(this.tooltipTimeout);
64
+ }
65
+ // Set timeout to show tooltip after delay
66
+ this.tooltipTimeout = window.setTimeout(() => {
67
+ this.show();
68
+ }, this.tooltipDelay);
69
+ }
70
+ onMouseLeave() {
71
+ // Clear timeout if mouse leaves before tooltip shows
72
+ if (this.tooltipTimeout) {
73
+ clearTimeout(this.tooltipTimeout);
74
+ this.tooltipTimeout = undefined;
75
+ }
76
+ // Restore original title if it existed
77
+ if (this.originalTitle !== undefined) {
78
+ this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
79
+ this.originalTitle = undefined;
80
+ }
81
+ // Hide tooltip if it's showing
82
+ this.hide();
83
+ }
84
+ show() {
85
+ if (this.overlayRef) {
86
+ return;
87
+ }
88
+ // Create overlay
89
+ const positionStrategy = this.overlayPositionBuilder
90
+ .flexibleConnectedTo(this.elementRef)
91
+ .withPositions(this.getPositions())
92
+ .withPush(false);
93
+ this.overlayRef = this.overlay.create({
94
+ positionStrategy,
95
+ scrollStrategy: this.overlay.scrollStrategies.close(),
96
+ hasBackdrop: false
97
+ });
98
+ // Create component portal and attach
99
+ const portal = new ComponentPortal(TooltipContentComponent, this.viewContainerRef);
100
+ const componentRef = this.overlayRef.attach(portal);
101
+ componentRef.instance.text = this.tooltipText;
102
+ // Detect actual position after overlay is positioned
103
+ setTimeout(() => {
104
+ if (this.overlayRef && this.elementRef.nativeElement) {
105
+ const tooltipRect = this.overlayRef.overlayElement.getBoundingClientRect();
106
+ const elementRect = this.elementRef.nativeElement.getBoundingClientRect();
107
+ let actualPosition = 'below';
108
+ // Determine actual position based on relative positions
109
+ if (tooltipRect.bottom <= elementRect.top) {
110
+ actualPosition = 'above';
111
+ }
112
+ else if (tooltipRect.top >= elementRect.bottom) {
113
+ actualPosition = 'below';
114
+ }
115
+ else if (tooltipRect.right <= elementRect.left) {
116
+ actualPosition = 'left';
117
+ }
118
+ else if (tooltipRect.left >= elementRect.right) {
119
+ actualPosition = 'right';
120
+ }
121
+ componentRef.instance.position = actualPosition;
122
+ }
123
+ }, 0);
124
+ }
125
+ hide() {
126
+ if (this.overlayRef) {
127
+ this.overlayRef.dispose();
128
+ this.overlayRef = undefined;
129
+ }
130
+ }
131
+ getPositions() {
132
+ const positions = {
133
+ above: [
134
+ {
135
+ originX: 'center',
136
+ originY: 'top',
137
+ overlayX: 'center',
138
+ overlayY: 'bottom',
139
+ offsetY: -12
140
+ }
141
+ ],
142
+ below: [
143
+ {
144
+ originX: 'center',
145
+ originY: 'bottom',
146
+ overlayX: 'center',
147
+ overlayY: 'top',
148
+ offsetY: 12
149
+ }
150
+ ],
151
+ left: [
152
+ {
153
+ originX: 'start',
154
+ originY: 'center',
155
+ overlayX: 'end',
156
+ overlayY: 'center',
157
+ offsetX: -12
158
+ }
159
+ ],
160
+ right: [
161
+ {
162
+ originX: 'end',
163
+ originY: 'center',
164
+ overlayX: 'start',
165
+ overlayY: 'center',
166
+ offsetX: 12
167
+ }
168
+ ]
169
+ };
170
+ // Prefer below position, but use above as fallback
171
+ const primary = positions[this.tooltipPosition] || positions.below;
172
+ // For below position, add above as first fallback
173
+ const fallbacks = this.tooltipPosition === 'below'
174
+ ? [...(positions.above || []), ...(positions.left || []), ...(positions.right || [])]
175
+ : Object.values(positions).filter(p => p !== primary).flat();
176
+ return [...(primary || []), ...fallbacks];
177
+ }
178
+ ngOnDestroy() {
179
+ if (this.tooltipTimeout) {
180
+ clearTimeout(this.tooltipTimeout);
181
+ }
182
+ // Restore original title if it existed
183
+ if (this.originalTitle !== undefined) {
184
+ this.elementRef.nativeElement.setAttribute('title', this.originalTitle);
185
+ }
186
+ this.hide();
187
+ }
188
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
189
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotTooltipDirective, isStandalone: true, selector: "[copilotTooltip]", inputs: { tooltipText: ["copilotTooltip", "tooltipText"], tooltipPosition: "tooltipPosition", tooltipDelay: "tooltipDelay" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 });
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotTooltipDirective, decorators: [{
192
+ type: Directive,
193
+ args: [{
194
+ selector: '[copilotTooltip]',
195
+ standalone: true
196
+ }]
197
+ }], propDecorators: { tooltipText: [{
198
+ type: Input,
199
+ args: ['copilotTooltip']
200
+ }], tooltipPosition: [{
201
+ type: Input
202
+ }], tooltipDelay: [{
203
+ type: Input
204
+ }], onMouseEnter: [{
205
+ type: HostListener,
206
+ args: ['mouseenter']
207
+ }], onMouseLeave: [{
208
+ type: HostListener,
209
+ args: ['mouseleave']
210
+ }] } });
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFFWixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBRVAsc0JBQXNCLEVBRXZCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQXFCLE1BQU0sZUFBZSxDQUFDOztBQXdGdEYsTUFBTSxPQUFPLHVCQUF1QjtJQWFkO0lBWnBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDRixTQUFTLEdBQXlDLE9BQU8sQ0FBQztJQUVsRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQTJDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQzt3R0FibkMsdUJBQXVCOzRGQUF2Qix1QkFBdUIsbUZBcEZ4Qjs7Ozs7OztHQU9UOzs0RkE2RVUsdUJBQXVCO2tCQXRGbkMsU0FBUzsrQkFDRSx5QkFBeUIsWUFDekI7Ozs7Ozs7R0FPVCxtQkEwRWdCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs7QUFzQmxCLE1BQU0sT0FBTyx1QkFBdUI7SUFDVCxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLGVB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LEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQzt3R0F0S1UsdUJBQXVCOzRGQUF2Qix1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzhCQUUwQixXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBWU4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBdUIxQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25EZXN0cm95LFxuICBpbmplY3QsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxuICBDb25uZWN0ZWRQb3NpdGlvblxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtdG9vbHRpcC1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwLXdyYXBwZXJcIiBbYXR0ci5kYXRhLXBvc2l0aW9uXT1cInBvc2l0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29waWxvdC10b29sdGlwXCI+XG4gICAgICAgIHt7IHRleHQgfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvcGlsb3QtdG9vbHRpcC1hcnJvd1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMTVzIGVhc2UtaW4tb3V0O1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICMxYTFhMWE7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgbWF4LXdpZHRoOiAyMDBweDtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgIH1cbiAgICBcbiAgICAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYmVsb3cgZWxlbWVudCAoYXJyb3cgcG9pbnRzIHVwIHRvIHRvb2x0aXApICovXG4gICAgLmNvcGlsb3QtdG9vbHRpcC13cmFwcGVyW2RhdGEtcG9zaXRpb249XCJiZWxvd1wiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHRvcDogLTRweDtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIGJvcmRlci13aWR0aDogMCA0cHggNHB4IDRweDtcbiAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzFhMWExYSB0cmFuc3BhcmVudDtcbiAgICB9XG4gICAgXG4gICAgLyogQXJyb3cgZm9yIHRvb2x0aXAgYWJvdmUgZWxlbWVudCAoYXJyb3cgcG9pbnRzIGRvd24gdG8gZWxlbWVudCkgKi9cbiAgICAuY29waWxvdC10b29sdGlwLXdyYXBwZXJbZGF0YS1wb3NpdGlvbj1cImFib3ZlXCJdIC5jb3BpbG90LXRvb2x0aXAtYXJyb3cge1xuICAgICAgYm90dG9tOiAtNHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgYm9yZGVyLXdpZHRoOiA0cHggNHB4IDAgNHB4O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMWExYTFhIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBcbiAgICAvKiBBcnJvdyBmb3IgdG9vbHRpcCB0byB0aGUgbGVmdCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwibGVmdFwiXSAuY29waWxvdC10b29sdGlwLWFycm93IHtcbiAgICAgIHJpZ2h0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCAwIDRweCA0cHg7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMxYTFhMWE7XG4gICAgfVxuICAgIFxuICAgIC8qIEFycm93IGZvciB0b29sdGlwIHRvIHRoZSByaWdodCAqL1xuICAgIC5jb3BpbG90LXRvb2x0aXAtd3JhcHBlcltkYXRhLXBvc2l0aW9uPVwicmlnaHRcIl0gLmNvcGlsb3QtdG9vbHRpcC1hcnJvdyB7XG4gICAgICBsZWZ0OiAtNHB4O1xuICAgICAgdG9wOiA1MCU7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICBib3JkZXItd2lkdGg6IDRweCA0cHggNHB4IDA7XG4gICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICMxYTFhMWEgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIFxuICAgIEBrZXlmcmFtZXMgZmFkZUluIHtcbiAgICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgICAgfVxuICAgIH1cbiAgYF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBDb250ZW50Q29tcG9uZW50IHtcbiAgdGV4dCA9ICcnO1xuICBwcml2YXRlIF9wb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgXG4gIGdldCBwb3NpdGlvbigpOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuICBcbiAgc2V0IHBvc2l0aW9uKHZhbHVlOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjb3BpbG90VG9vbHRpcF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KCdjb3BpbG90VG9vbHRpcCcpIHRvb2x0aXBUZXh0ID0gJyc7XG4gIEBJbnB1dCgpIHRvb2x0aXBQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JlbG93JztcbiAgQElucHV0KCkgdG9vbHRpcERlbGF5ID0gNTAwOyAvLyBtaWxsaXNlY29uZHNcbiAgXG4gIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyID0gaW5qZWN0KE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIpO1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgXG4gIHByaXZhdGUgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgdG9vbHRpcFRpbWVvdXQ/OiBudW1iZXI7XG4gIHByaXZhdGUgb3JpZ2luYWxUaXRsZT86IHN0cmluZztcbiAgXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZW50ZXInKVxuICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBUZXh0KSByZXR1cm47XG4gICAgXG4gICAgLy8gU3RvcmUgYW5kIHJlbW92ZSBuYXRpdmUgdGl0bGUgdG8gcHJldmVudCBPUyB0b29sdGlwXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGl0bGUnKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFRpdGxlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcbiAgICBpZiAodGhpcy50b29sdGlwVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXQgdGltZW91dCB0byBzaG93IHRvb2x0aXAgYWZ0ZXIgZGVsYXlcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfSwgdGhpcy50b29sdGlwRGVsYXkpO1xuICB9XG4gIFxuICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlJylcbiAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRpbWVvdXQgaWYgbW91c2UgbGVhdmVzIGJlZm9yZSB0b29sdGlwIHNob3dzXG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgdGl0bGUgaWYgaXQgZXhpc3RlZFxuICAgIGlmICh0aGlzLm9yaWdpbmFsVGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMub3JpZ2luYWxUaXRsZSk7XG4gICAgICB0aGlzLm9yaWdpbmFsVGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEhpZGUgdG9vbHRpcCBpZiBpdCdzIHNob3dpbmdcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzaG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG92ZXJsYXlcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXG4gICAgICAud2l0aFBvc2l0aW9ucyh0aGlzLmdldFBvc2l0aW9ucygpKVxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcbiAgICBcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuY2xvc2UoKSxcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb21wb25lbnQgcG9ydGFsIGFuZCBhdHRhY2hcbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFRvb2x0aXBDb250ZW50Q29tcG9uZW50LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gocG9ydGFsKTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudGV4dCA9IHRoaXMudG9vbHRpcFRleHQ7XG4gICAgXG4gICAgLy8gRGV0ZWN0IGFjdHVhbCBwb3NpdGlvbiBhZnRlciBvdmVybGF5IGlzIHBvc2l0aW9uZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYWN0dWFsUG9zaXRpb246ICdhYm92ZScgfCAnYmVsb3cnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdiZWxvdyc7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgYWN0dWFsIHBvc2l0aW9uIGJhc2VkIG9uIHJlbGF0aXZlIHBvc2l0aW9uc1xuICAgICAgICBpZiAodG9vbHRpcFJlY3QuYm90dG9tIDw9IGVsZW1lbnRSZWN0LnRvcCkge1xuICAgICAgICAgIGFjdHVhbFBvc2l0aW9uID0gJ2Fib3ZlJztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC50b3AgPj0gZWxlbWVudFJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAnYmVsb3cnO1xuICAgICAgICB9IGVsc2UgaWYgKHRvb2x0aXBSZWN0LnJpZ2h0IDw9IGVsZW1lbnRSZWN0LmxlZnQpIHtcbiAgICAgICAgICBhY3R1YWxQb3NpdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgfSBlbHNlIGlmICh0b29sdGlwUmVjdC5sZWZ0ID49IGVsZW1lbnRSZWN0LnJpZ2h0KSB7XG4gICAgICAgICAgYWN0dWFsUG9zaXRpb24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucG9zaXRpb24gPSBhY3R1YWxQb3NpdGlvbjtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBoaWRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGdldFBvc2l0aW9ucygpOiBDb25uZWN0ZWRQb3NpdGlvbltdIHtcbiAgICBjb25zdCBwb3NpdGlvbnM6IFJlY29yZDxzdHJpbmcsIENvbm5lY3RlZFBvc2l0aW9uW10+ID0ge1xuICAgICAgYWJvdmU6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXG4gICAgICAgICAgb2Zmc2V0WTogLTEyXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBiZWxvdzogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgICBvZmZzZXRZOiAxMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgbGVmdDogW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxuICAgICAgICAgIG9mZnNldFg6IC0xMlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgcmlnaHQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgICBvZmZzZXRYOiAxMlxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBcbiAgICAvLyBQcmVmZXIgYmVsb3cgcG9zaXRpb24sIGJ1dCB1c2UgYWJvdmUgYXMgZmFsbGJhY2tcbiAgICBjb25zdCBwcmltYXJ5ID0gcG9zaXRpb25zW3RoaXMudG9vbHRpcFBvc2l0aW9uXSB8fCBwb3NpdGlvbnMuYmVsb3c7XG4gICAgLy8gRm9yIGJlbG93IHBvc2l0aW9uLCBhZGQgYWJvdmUgYXMgZmlyc3QgZmFsbGJhY2tcbiAgICBjb25zdCBmYWxsYmFja3MgPSB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9PT0gJ2JlbG93JyBcbiAgICAgID8gWy4uLihwb3NpdGlvbnMuYWJvdmUgfHwgW10pLCAuLi4ocG9zaXRpb25zLmxlZnQgfHwgW10pLCAuLi4ocG9zaXRpb25zLnJpZ2h0IHx8IFtdKV1cbiAgICAgIDogT2JqZWN0LnZhbHVlcyhwb3NpdGlvbnMpLmZpbHRlcihwID0+IHAgIT09IHByaW1hcnkpLmZsYXQoKTtcbiAgICBcbiAgICByZXR1cm4gWy4uLihwcmltYXJ5IHx8IFtdKSwgLi4uZmFsbGJhY2tzXTtcbiAgfVxuICBcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCB0aXRsZSBpZiBpdCBleGlzdGVkXG4gICAgaWYgKHRoaXMub3JpZ2luYWxUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5vcmlnaW5hbFRpdGxlKTtcbiAgICB9XG4gICAgdGhpcy5oaWRlKCk7XG4gIH1cbn0iXX0=