@visuno/angular 0.0.0-stage → 0.1.0

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 (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,491 @@
1
+ // framework/angular/model-picker/model-picker.component.ts
2
+ //
3
+ // Native Angular port of framework/react/model-picker/ModelPicker.tsx.
4
+ // A trigger names the picked model and how hard it thinks; it opens the list of
5
+ // models, each with speed, quality and cost as five-step meters (the real numbers
6
+ // on hover), and the thinking effort under them as a small dropdown. A busy model
7
+ // can offer a way out — a short notice with its own buttons. Inputs mirror the
8
+ // React props; callbacks become @Output EventEmitters.
9
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
10
+ import { VoIconComponent } from '../core/icon.component';
11
+ import { ReducedMotionService } from '../core/reduced-motion.service';
12
+ import * as i0 from "@angular/core";
13
+ const EFFORTS = [
14
+ { label: 'Off', detail: 'Answers straight away' },
15
+ { label: 'Low', detail: 'Up to 2k thinking tokens' },
16
+ { label: 'Medium', detail: 'Up to 8k thinking tokens' },
17
+ { label: 'High', detail: 'Up to 24k thinking tokens' },
18
+ ];
19
+ /** Choose the model for a chat by speed, quality and cost, and how hard it thinks. */
20
+ export class ModelPickerComponent {
21
+ constructor() {
22
+ /** The models to choose from. */
23
+ this.models = [];
24
+ /** The thinking efforts. Defaults to Off, Low, Medium and High. */
25
+ this.efforts = EFFORTS;
26
+ /** A way out when the picked model can't take the request. */
27
+ this.suggestion = null;
28
+ /** The confirmation under the picker, shown with a green check. */
29
+ this.note = '';
30
+ /** The label beside the trigger. Defaults to "Model for this chat". */
31
+ this.label = 'Model for this chat';
32
+ this.defaultOpen = true;
33
+ /** Emitted when a row is picked, busy or not, so you can check the model first. */
34
+ this.valueChange = new EventEmitter();
35
+ this.effortChange = new EventEmitter();
36
+ this.openChange = new EventEmitter();
37
+ this.motion = inject(ReducedMotionService);
38
+ /** The five meter steps. */
39
+ this.bars = [1, 2, 3, 4, 5];
40
+ // internal state holds its own when the matching input is left out (uncontrolled)
41
+ this.curId = '';
42
+ this.effLabel = '';
43
+ this.openState = true;
44
+ this.effOpen = false;
45
+ this.onOutside = (e) => {
46
+ if (!this.effOpen)
47
+ return;
48
+ const t = e.target;
49
+ if (this.pop?.nativeElement.contains(t) || this.effBtn?.nativeElement.contains(t))
50
+ return;
51
+ this.effOpen = false;
52
+ };
53
+ }
54
+ ngOnChanges(changes) {
55
+ if (changes['value'] || changes['defaultValue'] || changes['models']) {
56
+ this.curId = this.value ?? this.defaultValue ?? this.models[0]?.id ?? this.curId ?? '';
57
+ }
58
+ if (changes['effort'] || changes['defaultEffort'] || changes['efforts']) {
59
+ this.effLabel =
60
+ this.effort ??
61
+ this.defaultEffort ??
62
+ this.efforts[Math.min(2, this.efforts.length - 1)]?.label ??
63
+ this.effLabel ??
64
+ '';
65
+ }
66
+ if (changes['open'] || changes['defaultOpen']) {
67
+ this.openState = this.open ?? this.defaultOpen;
68
+ }
69
+ }
70
+ ngAfterViewInit() {
71
+ // close the effort menu on an outside click
72
+ document.addEventListener('pointerdown', this.onOutside, true);
73
+ }
74
+ ngOnDestroy() {
75
+ document.removeEventListener('pointerdown', this.onOutside, true);
76
+ if (this.closeTimer)
77
+ clearTimeout(this.closeTimer);
78
+ }
79
+ get picked() {
80
+ return this.models.find((m) => m.id === this.curId) ?? this.models[0];
81
+ }
82
+ get eff() {
83
+ return this.effLabel;
84
+ }
85
+ get isOpen() {
86
+ return this.open ?? this.openState;
87
+ }
88
+ get effortDetail() {
89
+ return this.efforts.find((e) => e.label === this.eff)?.detail ?? '';
90
+ }
91
+ rowNote(m) {
92
+ return (m.status && m.status !== 'ready' && m.statusText) || m.note || '';
93
+ }
94
+ pick(i) {
95
+ const id = this.models[i]?.id;
96
+ if (id === undefined)
97
+ return;
98
+ if (this.value === undefined)
99
+ this.curId = id;
100
+ this.valueChange.emit(id);
101
+ }
102
+ chooseEffort(label) {
103
+ if (this.effort === undefined)
104
+ this.effLabel = label;
105
+ this.effortChange.emit(label);
106
+ this.closeEffSoon();
107
+ }
108
+ toggleOpen() {
109
+ this.setOpen(!this.isOpen);
110
+ }
111
+ setOpen(v) {
112
+ if (this.open === undefined)
113
+ this.openState = v;
114
+ this.openChange.emit(v);
115
+ }
116
+ toggleEff() {
117
+ this.effOpen = !this.effOpen;
118
+ }
119
+ closeEffSoon() {
120
+ if (this.closeTimer)
121
+ clearTimeout(this.closeTimer);
122
+ this.closeTimer = setTimeout(() => (this.effOpen = false), this.motion.reduce() ? 0 : 120);
123
+ }
124
+ onKeydown(e) {
125
+ // Escape closes the open list and gives the trigger the focus back
126
+ if (e.key === 'Escape') {
127
+ if (this.effOpen) {
128
+ this.effOpen = false;
129
+ this.effBtn?.nativeElement.focus({ preventScroll: true });
130
+ return;
131
+ }
132
+ if (this.isOpen) {
133
+ this.setOpen(false);
134
+ this.trigger?.nativeElement.focus({ preventScroll: true });
135
+ }
136
+ return;
137
+ }
138
+ // arrow keys move through the models, as in any radio group
139
+ const target = e.target;
140
+ const row = target?.closest('.vo-mpk-o');
141
+ if (!row)
142
+ return;
143
+ const step = { ArrowDown: 1, ArrowRight: 1, ArrowUp: -1, ArrowLeft: -1 }[e.key];
144
+ if (!step)
145
+ return;
146
+ e.preventDefault();
147
+ const rows = Array.from(row.parentElement?.querySelectorAll('.vo-mpk-o') ?? []);
148
+ const from = rows.indexOf(row);
149
+ const i = (from + step + this.models.length) % this.models.length;
150
+ rows[i]?.focus({ preventScroll: true });
151
+ this.pick(i);
152
+ }
153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ModelPickerComponent, isStandalone: true, selector: "vo-model-picker", inputs: { models: "models", value: "value", defaultValue: "defaultValue", efforts: "efforts", effort: "effort", defaultEffort: "defaultEffort", suggestion: "suggestion", note: "note", label: "label", open: "open", defaultOpen: "defaultOpen" }, outputs: { valueChange: "valueChange", effortChange: "effortChange", openChange: "openChange" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "effBtn", first: true, predicate: ["effBtn"], descendants: true }, { propertyName: "pop", first: true, predicate: ["pop"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
155
+ <div
156
+ #root
157
+ data-vo=""
158
+ class="vo-mpk"
159
+ (keydown)="onKeydown($event)"
160
+ >
161
+ <div class="vo-mpk-top">
162
+ <span class="vo-muted vo-mpk-lb">{{ label }}</span>
163
+ <button
164
+ #trigger
165
+ type="button"
166
+ class="vo-mpk-tr"
167
+ aria-haspopup="true"
168
+ [attr.aria-expanded]="isOpen"
169
+ (click)="toggleOpen()"
170
+ >
171
+ <span class="vo-mpk-mk" [style.--vo-mc]="picked?.color" [style.--vo-mt]="picked?.markText">
172
+ {{ picked?.mark ?? picked?.name?.[0] }}
173
+ </span>
174
+ <span class="vo-mpk-nm">{{ picked?.name ?? '' }}</span>
175
+ <span class="vo-mpk-ef vo-muted">{{ eff }}</span>
176
+ <vo-icon name="chev-d" size="xs"></vo-icon>
177
+ </button>
178
+ </div>
179
+
180
+ <div class="vo-fold vo-mpk-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
181
+ <div>
182
+ <div class="vo-mpk-p vo-panel">
183
+ <div class="vo-mpk-hd" aria-hidden="true">
184
+ <span></span><span></span><span>Speed</span><span>Quality</span><span>Cost</span>
185
+ </div>
186
+
187
+ <div class="vo-mpk-list" role="radiogroup" aria-label="Model">
188
+ @for (m of models; track m.id; let i = $index) {
189
+ <button
190
+ type="button"
191
+ role="radio"
192
+ [attr.aria-checked]="m.id === picked?.id"
193
+ [tabIndex]="m.id === picked?.id ? 0 : -1"
194
+ class="vo-mpk-o"
195
+ [class.vo-busy]="m.status === 'busy'"
196
+ (click)="pick(i)"
197
+ >
198
+ <span class="vo-mpk-mk" [style.--vo-mc]="m.color" [style.--vo-mt]="m.markText">
199
+ {{ m.mark ?? m.name[0] }}
200
+ </span>
201
+ <span class="vo-t">
202
+ <b
203
+ >{{ m.name
204
+ }}<span class="vo-ck">
205
+ @if (m.status === 'checking') {
206
+ <span class="vo-spin" aria-hidden="true"></span>
207
+ } @else {
208
+ <vo-icon name="check" size="xs"></vo-icon>
209
+ }
210
+ </span></b
211
+ >
212
+ <span class="vo-d">{{ rowNote(m) }}</span>
213
+ </span>
214
+ <span class="vo-mpk-m" [attr.data-tip]="m.speedDetail" [attr.aria-hidden]="m.speedDetail ? null : true">
215
+ @for (k of bars; track k) {
216
+ <i [class.vo-on]="k <= m.speed"></i>
217
+ }
218
+ </span>
219
+ <span class="vo-mpk-m" [attr.data-tip]="m.qualityDetail" [attr.aria-hidden]="m.qualityDetail ? null : true">
220
+ @for (k of bars; track k) {
221
+ <i [class.vo-on]="k <= m.quality"></i>
222
+ }
223
+ </span>
224
+ <span class="vo-mpk-m" [attr.data-tip]="m.costDetail" [attr.aria-hidden]="m.costDetail ? null : true">
225
+ @for (k of bars; track k) {
226
+ <i [class.vo-on]="k <= m.cost"></i>
227
+ }
228
+ </span>
229
+ </button>
230
+ }
231
+ </div>
232
+
233
+ <div class="vo-fold" [class.vo-shut]="!suggestion" [attr.inert]="suggestion ? null : ''">
234
+ <div>
235
+ <div class="vo-mpk-sg" aria-live="polite">
236
+ <p class="vo-mpk-sgt">{{ suggestion?.text }}</p>
237
+ <div class="vo-mpk-sga">
238
+ @for (a of suggestion?.actions ?? []; track a.label; let last = $last) {
239
+ <button
240
+ type="button"
241
+ class="vo-pill vo-sm"
242
+ [class.vo-primary]="last"
243
+ [class.vo-ghost]="!last"
244
+ (click)="a.onClick()"
245
+ >
246
+ {{ a.label }}
247
+ </button>
248
+ }
249
+ </div>
250
+ </div>
251
+ </div>
252
+ </div>
253
+
254
+ <div class="vo-mpk-th">
255
+ <div class="vo-mpk-thh">
256
+ <b><vo-icon name="cpu" size="xs"></vo-icon>Thinking</b>
257
+ <span class="vo-muted vo-mpk-thd">{{ effortDetail }}</span>
258
+ </div>
259
+ <button
260
+ #effBtn
261
+ type="button"
262
+ class="vo-mpk-eb"
263
+ aria-haspopup="menu"
264
+ [attr.aria-expanded]="effOpen"
265
+ aria-label="Thinking effort"
266
+ (click)="toggleEff()"
267
+ >
268
+ <span class="vo-mpk-ev">{{ eff }}</span>
269
+ <vo-icon name="chev-d" size="xs"></vo-icon>
270
+ </button>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </div>
275
+
276
+ <div #pop class="vo-pop vo-mpk-pop" [class.vo-open]="effOpen" role="menu" aria-label="Thinking effort">
277
+ @for (e of efforts; track e.label) {
278
+ <button
279
+ type="button"
280
+ class="vo-mi"
281
+ role="menuitemradio"
282
+ [attr.aria-checked]="e.label === eff"
283
+ (click)="chooseEffort(e.label)"
284
+ >
285
+ <span
286
+ >{{ e.label }}@if (e.detail) {
287
+ <span class="vo-d">{{ e.detail }}</span>
288
+ }</span
289
+ >
290
+ <span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
291
+ </button>
292
+ }
293
+ </div>
294
+
295
+ <p class="vo-mpk-note vo-muted" aria-live="polite">
296
+ @if (note) {
297
+ <vo-icon name="ok" size="xs"></vo-icon><span>{{ note }}</span>
298
+ }
299
+ </p>
300
+ </div>
301
+ `, isInline: true, styles: [".vo-mpk{position:relative;display:flex;flex-direction:column;gap:var(--vo-s-2);width:100%;max-width:420px;margin:0 auto}.vo-mpk-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px}.vo-mpk-lb{font-size:12.5px}.vo-mpk-tr{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px 0 6px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:var(--vo-shadow);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:box-shadow .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-tr:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-tr>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-tr[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-tr:focus-visible{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-mpk-ef{font-weight:400;font-size:12.5px}.vo-mpk-mk{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:11px;font-weight:500;color:var(--vo-mt,var(--vo-on-ink));background:var(--vo-mc,var(--vo-fg2));flex:none;transition:background .32s}.vo-mpk-p{padding:6px;display:flex;flex-direction:column}.vo-mpk-hd,.vo-mpk-o{display:grid;grid-template-columns:20px minmax(0,1fr) repeat(3,34px);align-items:center;gap:10px}.vo-mpk-hd{padding:var(--vo-s-1) 10px 2px;font-size:11px;color:var(--vo-muted)}.vo-mpk-hd span{text-align:center}.vo-mpk-o{width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13px;cursor:pointer;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-o:hover{background:var(--vo-row)}}.vo-mpk-o[aria-checked=true]{background:var(--vo-sel)}.vo-mpk-o[aria-checked=true] .vo-d{color:var(--vo-fg2)}.vo-mpk-o:focus-visible{outline:2px solid var(--vo-focus);outline-offset:-2px}.vo-mpk-o .vo-t{display:flex;flex-direction:column;min-width:0}.vo-mpk-o .vo-t b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-o .vo-ck{display:grid;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transform:scale(.6);transition:opacity .16s,transform .32s var(--vo-ease)}.vo-mpk-o[aria-checked=true] .vo-ck,.vo-mpk-o .vo-ck:has(.vo-spin){opacity:1;transform:none}.vo-mpk-o .vo-ck .vo-spin{width:10px;height:10px;color:var(--vo-muted)}.vo-mpk-o .vo-d{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-mpk-o.vo-busy .vo-d{color:var(--vo-warn)}.vo-mpk-o.vo-busy .vo-mpk-mk{background:var(--vo-warn-mark);color:var(--vo-on-ink)}.vo-mpk-m{display:flex;gap:2px;height:8px}.vo-mpk-m i{flex:1;border-radius:2px;background:var(--vo-rail);transition:background .32s}.vo-mpk-m i.vo-on{background:var(--vo-fg2)}.vo-mpk-o[aria-checked=true]:not(.vo-busy) .vo-mpk-m i.vo-on{background:var(--vo-accent-mark,var(--vo-accent))}.vo-mpk-sg{margin:var(--vo-s-1) var(--vo-s-1) 2px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-warn-bg);display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-mpk-sgt{margin:0;font-size:12.5px;line-height:1.45}.vo-mpk-sga{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:6px}.vo-mpk-sg .vo-pill.vo-ghost{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-mpk-sg .vo-pill.vo-ghost:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-th{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-2) var(--vo-s-3);padding:var(--vo-s-3) 10px 6px;margin:6px var(--vo-s-1) 0;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-mpk-thh{display:flex;flex-direction:column;min-width:0;font-size:13px}.vo-mpk-thh b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-thh b .vo-i{color:var(--vo-muted)}.vo-mpk-thd{font-size:12px}.vo-mpk-eb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);background:var(--vo-chip);font-size:13px;cursor:pointer;transition:background .16s}.vo-mpk-eb[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-mpk-eb:hover{background:var(--vo-hover)}}.vo-mpk-eb>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-eb[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-pop{min-width:220px}.vo-mpk-note{margin:0;padding:0 2px;font-size:12.5px;min-height:20px;display:flex;align-items:center;gap:6px}.vo-mpk-note .vo-i{color:var(--vo-ok);flex:none}@media (max-width:480px){.vo-mpk-hd,.vo-mpk-o{grid-template-columns:20px minmax(0,1fr) repeat(3,34px);gap:6px}.vo-mpk-hd{font-size:10.5px;padding-inline:6px}.vo-mpk-o{padding-inline:6px}.vo-mpk-o .vo-d{white-space:normal}}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-pop{position:absolute;right:0;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:top right;filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
302
+ }
303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ModelPickerComponent, decorators: [{
304
+ type: Component,
305
+ args: [{ selector: 'vo-model-picker', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
306
+ <div
307
+ #root
308
+ data-vo=""
309
+ class="vo-mpk"
310
+ (keydown)="onKeydown($event)"
311
+ >
312
+ <div class="vo-mpk-top">
313
+ <span class="vo-muted vo-mpk-lb">{{ label }}</span>
314
+ <button
315
+ #trigger
316
+ type="button"
317
+ class="vo-mpk-tr"
318
+ aria-haspopup="true"
319
+ [attr.aria-expanded]="isOpen"
320
+ (click)="toggleOpen()"
321
+ >
322
+ <span class="vo-mpk-mk" [style.--vo-mc]="picked?.color" [style.--vo-mt]="picked?.markText">
323
+ {{ picked?.mark ?? picked?.name?.[0] }}
324
+ </span>
325
+ <span class="vo-mpk-nm">{{ picked?.name ?? '' }}</span>
326
+ <span class="vo-mpk-ef vo-muted">{{ eff }}</span>
327
+ <vo-icon name="chev-d" size="xs"></vo-icon>
328
+ </button>
329
+ </div>
330
+
331
+ <div class="vo-fold vo-mpk-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
332
+ <div>
333
+ <div class="vo-mpk-p vo-panel">
334
+ <div class="vo-mpk-hd" aria-hidden="true">
335
+ <span></span><span></span><span>Speed</span><span>Quality</span><span>Cost</span>
336
+ </div>
337
+
338
+ <div class="vo-mpk-list" role="radiogroup" aria-label="Model">
339
+ @for (m of models; track m.id; let i = $index) {
340
+ <button
341
+ type="button"
342
+ role="radio"
343
+ [attr.aria-checked]="m.id === picked?.id"
344
+ [tabIndex]="m.id === picked?.id ? 0 : -1"
345
+ class="vo-mpk-o"
346
+ [class.vo-busy]="m.status === 'busy'"
347
+ (click)="pick(i)"
348
+ >
349
+ <span class="vo-mpk-mk" [style.--vo-mc]="m.color" [style.--vo-mt]="m.markText">
350
+ {{ m.mark ?? m.name[0] }}
351
+ </span>
352
+ <span class="vo-t">
353
+ <b
354
+ >{{ m.name
355
+ }}<span class="vo-ck">
356
+ @if (m.status === 'checking') {
357
+ <span class="vo-spin" aria-hidden="true"></span>
358
+ } @else {
359
+ <vo-icon name="check" size="xs"></vo-icon>
360
+ }
361
+ </span></b
362
+ >
363
+ <span class="vo-d">{{ rowNote(m) }}</span>
364
+ </span>
365
+ <span class="vo-mpk-m" [attr.data-tip]="m.speedDetail" [attr.aria-hidden]="m.speedDetail ? null : true">
366
+ @for (k of bars; track k) {
367
+ <i [class.vo-on]="k <= m.speed"></i>
368
+ }
369
+ </span>
370
+ <span class="vo-mpk-m" [attr.data-tip]="m.qualityDetail" [attr.aria-hidden]="m.qualityDetail ? null : true">
371
+ @for (k of bars; track k) {
372
+ <i [class.vo-on]="k <= m.quality"></i>
373
+ }
374
+ </span>
375
+ <span class="vo-mpk-m" [attr.data-tip]="m.costDetail" [attr.aria-hidden]="m.costDetail ? null : true">
376
+ @for (k of bars; track k) {
377
+ <i [class.vo-on]="k <= m.cost"></i>
378
+ }
379
+ </span>
380
+ </button>
381
+ }
382
+ </div>
383
+
384
+ <div class="vo-fold" [class.vo-shut]="!suggestion" [attr.inert]="suggestion ? null : ''">
385
+ <div>
386
+ <div class="vo-mpk-sg" aria-live="polite">
387
+ <p class="vo-mpk-sgt">{{ suggestion?.text }}</p>
388
+ <div class="vo-mpk-sga">
389
+ @for (a of suggestion?.actions ?? []; track a.label; let last = $last) {
390
+ <button
391
+ type="button"
392
+ class="vo-pill vo-sm"
393
+ [class.vo-primary]="last"
394
+ [class.vo-ghost]="!last"
395
+ (click)="a.onClick()"
396
+ >
397
+ {{ a.label }}
398
+ </button>
399
+ }
400
+ </div>
401
+ </div>
402
+ </div>
403
+ </div>
404
+
405
+ <div class="vo-mpk-th">
406
+ <div class="vo-mpk-thh">
407
+ <b><vo-icon name="cpu" size="xs"></vo-icon>Thinking</b>
408
+ <span class="vo-muted vo-mpk-thd">{{ effortDetail }}</span>
409
+ </div>
410
+ <button
411
+ #effBtn
412
+ type="button"
413
+ class="vo-mpk-eb"
414
+ aria-haspopup="menu"
415
+ [attr.aria-expanded]="effOpen"
416
+ aria-label="Thinking effort"
417
+ (click)="toggleEff()"
418
+ >
419
+ <span class="vo-mpk-ev">{{ eff }}</span>
420
+ <vo-icon name="chev-d" size="xs"></vo-icon>
421
+ </button>
422
+ </div>
423
+ </div>
424
+ </div>
425
+ </div>
426
+
427
+ <div #pop class="vo-pop vo-mpk-pop" [class.vo-open]="effOpen" role="menu" aria-label="Thinking effort">
428
+ @for (e of efforts; track e.label) {
429
+ <button
430
+ type="button"
431
+ class="vo-mi"
432
+ role="menuitemradio"
433
+ [attr.aria-checked]="e.label === eff"
434
+ (click)="chooseEffort(e.label)"
435
+ >
436
+ <span
437
+ >{{ e.label }}@if (e.detail) {
438
+ <span class="vo-d">{{ e.detail }}</span>
439
+ }</span
440
+ >
441
+ <span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
442
+ </button>
443
+ }
444
+ </div>
445
+
446
+ <p class="vo-mpk-note vo-muted" aria-live="polite">
447
+ @if (note) {
448
+ <vo-icon name="ok" size="xs"></vo-icon><span>{{ note }}</span>
449
+ }
450
+ </p>
451
+ </div>
452
+ `, styles: [".vo-mpk{position:relative;display:flex;flex-direction:column;gap:var(--vo-s-2);width:100%;max-width:420px;margin:0 auto}.vo-mpk-top{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px}.vo-mpk-lb{font-size:12.5px}.vo-mpk-tr{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px 0 6px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:var(--vo-shadow);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:box-shadow .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-tr:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-tr>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-tr[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-tr:focus-visible{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-mpk-ef{font-weight:400;font-size:12.5px}.vo-mpk-mk{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:11px;font-weight:500;color:var(--vo-mt,var(--vo-on-ink));background:var(--vo-mc,var(--vo-fg2));flex:none;transition:background .32s}.vo-mpk-p{padding:6px;display:flex;flex-direction:column}.vo-mpk-hd,.vo-mpk-o{display:grid;grid-template-columns:20px minmax(0,1fr) repeat(3,34px);align-items:center;gap:10px}.vo-mpk-hd{padding:var(--vo-s-1) 10px 2px;font-size:11px;color:var(--vo-muted)}.vo-mpk-hd span{text-align:center}.vo-mpk-o{width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13px;cursor:pointer;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-mpk-o:hover{background:var(--vo-row)}}.vo-mpk-o[aria-checked=true]{background:var(--vo-sel)}.vo-mpk-o[aria-checked=true] .vo-d{color:var(--vo-fg2)}.vo-mpk-o:focus-visible{outline:2px solid var(--vo-focus);outline-offset:-2px}.vo-mpk-o .vo-t{display:flex;flex-direction:column;min-width:0}.vo-mpk-o .vo-t b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-o .vo-ck{display:grid;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transform:scale(.6);transition:opacity .16s,transform .32s var(--vo-ease)}.vo-mpk-o[aria-checked=true] .vo-ck,.vo-mpk-o .vo-ck:has(.vo-spin){opacity:1;transform:none}.vo-mpk-o .vo-ck .vo-spin{width:10px;height:10px;color:var(--vo-muted)}.vo-mpk-o .vo-d{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-mpk-o.vo-busy .vo-d{color:var(--vo-warn)}.vo-mpk-o.vo-busy .vo-mpk-mk{background:var(--vo-warn-mark);color:var(--vo-on-ink)}.vo-mpk-m{display:flex;gap:2px;height:8px}.vo-mpk-m i{flex:1;border-radius:2px;background:var(--vo-rail);transition:background .32s}.vo-mpk-m i.vo-on{background:var(--vo-fg2)}.vo-mpk-o[aria-checked=true]:not(.vo-busy) .vo-mpk-m i.vo-on{background:var(--vo-accent-mark,var(--vo-accent))}.vo-mpk-sg{margin:var(--vo-s-1) var(--vo-s-1) 2px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-warn-bg);display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-mpk-sgt{margin:0;font-size:12.5px;line-height:1.45}.vo-mpk-sga{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:6px}.vo-mpk-sg .vo-pill.vo-ghost{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-mpk-sg .vo-pill.vo-ghost:hover{box-shadow:var(--vo-shadow-pop)}}.vo-mpk-th{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:var(--vo-s-2) var(--vo-s-3);padding:var(--vo-s-3) 10px 6px;margin:6px var(--vo-s-1) 0;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-mpk-thh{display:flex;flex-direction:column;min-width:0;font-size:13px}.vo-mpk-thh b{font-weight:500;display:flex;align-items:center;gap:6px}.vo-mpk-thh b .vo-i{color:var(--vo-muted)}.vo-mpk-thd{font-size:12px}.vo-mpk-eb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);background:var(--vo-chip);font-size:13px;cursor:pointer;transition:background .16s}.vo-mpk-eb[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-mpk-eb:hover{background:var(--vo-hover)}}.vo-mpk-eb>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-mpk-eb[aria-expanded=true]>.vo-i{transform:rotate(180deg)}.vo-mpk-pop{min-width:220px}.vo-mpk-note{margin:0;padding:0 2px;font-size:12.5px;min-height:20px;display:flex;align-items:center;gap:6px}.vo-mpk-note .vo-i{color:var(--vo-ok);flex:none}@media (max-width:480px){.vo-mpk-hd,.vo-mpk-o{grid-template-columns:20px minmax(0,1fr) repeat(3,34px);gap:6px}.vo-mpk-hd{font-size:10.5px;padding-inline:6px}.vo-mpk-o{padding-inline:6px}.vo-mpk-o .vo-d{white-space:normal}}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-pop{position:absolute;right:0;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:top right;filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"] }]
453
+ }], propDecorators: { models: [{
454
+ type: Input
455
+ }], value: [{
456
+ type: Input
457
+ }], defaultValue: [{
458
+ type: Input
459
+ }], efforts: [{
460
+ type: Input
461
+ }], effort: [{
462
+ type: Input
463
+ }], defaultEffort: [{
464
+ type: Input
465
+ }], suggestion: [{
466
+ type: Input
467
+ }], note: [{
468
+ type: Input
469
+ }], label: [{
470
+ type: Input
471
+ }], open: [{
472
+ type: Input
473
+ }], defaultOpen: [{
474
+ type: Input
475
+ }], valueChange: [{
476
+ type: Output
477
+ }], effortChange: [{
478
+ type: Output
479
+ }], openChange: [{
480
+ type: Output
481
+ }], trigger: [{
482
+ type: ViewChild,
483
+ args: ['trigger']
484
+ }], effBtn: [{
485
+ type: ViewChild,
486
+ args: ['effBtn']
487
+ }], pop: [{
488
+ type: ViewChild,
489
+ args: ['pop']
490
+ }] } });
491
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21vZGVsLXBpY2tlci9tb2RlbC1waWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLGdGQUFnRjtBQUNoRixrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLCtFQUErRTtBQUMvRSx1REFBdUQ7QUFFdkQsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBK0N0RSxNQUFNLE9BQU8sR0FBcUI7SUFDaEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRTtJQUNqRCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFO0lBQ3BELEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsMEJBQTBCLEVBQUU7SUFDdkQsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsRUFBRTtDQUN2RCxDQUFDO0FBRUYsc0ZBQXNGO0FBNEp0RixNQUFNLE9BQU8sb0JBQW9CO0lBM0pqQztRQTRKRSxpQ0FBaUM7UUFDeEIsV0FBTSxHQUFrQixFQUFFLENBQUM7UUFJcEMsbUVBQW1FO1FBQzFELFlBQU8sR0FBcUIsT0FBTyxDQUFDO1FBRzdDLDhEQUE4RDtRQUNyRCxlQUFVLEdBQXNCLElBQUksQ0FBQztRQUM5QyxtRUFBbUU7UUFDMUQsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQix1RUFB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SyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL21vZGVsLXBpY2tlci9tb2RlbC1waWNrZXIuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvbW9kZWwtcGlja2VyL01vZGVsUGlja2VyLnRzeC5cbi8vIEEgdHJpZ2dlciBuYW1lcyB0aGUgcGlja2VkIG1vZGVsIGFuZCBob3cgaGFyZCBpdCB0aGlua3M7IGl0IG9wZW5zIHRoZSBsaXN0IG9mXG4vLyBtb2RlbHMsIGVhY2ggd2l0aCBzcGVlZCwgcXVhbGl0eSBhbmQgY29zdCBhcyBmaXZlLXN0ZXAgbWV0ZXJzICh0aGUgcmVhbCBudW1iZXJzXG4vLyBvbiBob3ZlciksIGFuZCB0aGUgdGhpbmtpbmcgZWZmb3J0IHVuZGVyIHRoZW0gYXMgYSBzbWFsbCBkcm9wZG93bi4gQSBidXN5IG1vZGVsXG4vLyBjYW4gb2ZmZXIgYSB3YXkgb3V0IOKAlCBhIHNob3J0IG5vdGljZSB3aXRoIGl0cyBvd24gYnV0dG9ucy4gSW5wdXRzIG1pcnJvciB0aGVcbi8vIFJlYWN0IHByb3BzOyBjYWxsYmFja3MgYmVjb21lIEBPdXRwdXQgRXZlbnRFbWl0dGVycy5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBPbmUgbW9kZWwgaW4gdGhlIGxpc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3B0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIExpa2UgXCJTb25uZXQgNS41XCIuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBsZXR0ZXIgaW4gaXRzIGNvbG91cmVkIHRpbGUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUuICovXG4gIG1hcms/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGlsZSdzIGNvbG91ciwgbGlrZSBcInZhcigtLXZvLWMxKVwiLiAqL1xuICBjb2xvcj86IHN0cmluZztcbiAgLyoqIFRoZSBsZXR0ZXIgY29sb3VyIHRoYXQgcmVhZHMgb24gdGhlIHRpbGUsIGxpa2UgXCJ2YXIoLS12by1vbi1hY2NlbnQpXCIuICovXG4gIG1hcmtUZXh0Pzogc3RyaW5nO1xuICAvKiogVGhlIHF1aWV0IGxpbmUgdW5kZXIgdGhlIG5hbWUsIGxpa2UgXCJCYWxhbmNlZCwgdGhlIGRlZmF1bHQgZm9yIGRlc2lnbiB3b3JrXCIuICovXG4gIG5vdGU/OiBzdHJpbmc7XG4gIC8qKiBTcGVlZCwgcXVhbGl0eSBhbmQgY29zdCwgZWFjaCBmcm9tIDEgdG8gNS4gRm9yIGNvc3QsIDUgaXMgdGhlIG1vc3QgZXhwZW5zaXZlLiAqL1xuICBzcGVlZDogbnVtYmVyO1xuICBxdWFsaXR5OiBudW1iZXI7XG4gIGNvc3Q6IG51bWJlcjtcbiAgLyoqIFdoYXQgZWFjaCBtZXRlciBzaG93cyBvbiBob3ZlciwgbGlrZSBcIjc0IHRva2VucyBhIHNlY29uZFwiLiAqL1xuICBzcGVlZERldGFpbD86IHN0cmluZztcbiAgcXVhbGl0eURldGFpbD86IHN0cmluZztcbiAgY29zdERldGFpbD86IHN0cmluZztcbiAgLyoqIGNoZWNraW5nIHNwaW5zIGJlc2lkZSB0aGUgbmFtZTsgYnVzeSB0dXJucyB0aGUgcm93IGFtYmVyLiBCb3RoIHJlcGxhY2UgdGhlIG5vdGUgd2l0aCBzdGF0dXNUZXh0LiAqL1xuICBzdGF0dXM/OiAncmVhZHknIHwgJ2NoZWNraW5nJyB8ICdidXN5JztcbiAgLyoqIExpa2UgXCJBdCBjYXBhY2l0eSwgYWJvdXQgMjBzIHdhaXRcIi4gKi9cbiAgc3RhdHVzVGV4dD86IHN0cmluZztcbn1cblxuLyoqIEEgdGhpbmtpbmcgZWZmb3J0OiBpdHMgbGFiZWwsIGFuZCB0aGUgbGluZSBzaG93biB1bmRlciBcIlRoaW5raW5nXCIgd2hlbiBpdCBpcyBwaWNrZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoaW5raW5nRWZmb3J0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKiogT25lIGJ1dHRvbiBpbiB0aGUgc3VnZ2VzdGlvbiBub3RpY2UuIFRoZSBsYXN0IG9uZSBpcyBmaWxsZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3Rpb25BY3Rpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICBvbkNsaWNrOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogQSB3YXkgb3V0IHdoZW4gdGhlIHBpY2tlZCBtb2RlbCBjYW4ndCB0YWtlIHRoZSByZXF1ZXN0OiBhIHNob3J0IHRleHQgYW5kIGl0cyBidXR0b25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uIHtcbiAgdGV4dDogc3RyaW5nO1xuICBhY3Rpb25zOiBTdWdnZXN0aW9uQWN0aW9uW107XG59XG5cbmNvbnN0IEVGRk9SVFM6IFRoaW5raW5nRWZmb3J0W10gPSBbXG4gIHsgbGFiZWw6ICdPZmYnLCBkZXRhaWw6ICdBbnN3ZXJzIHN0cmFpZ2h0IGF3YXknIH0sXG4gIHsgbGFiZWw6ICdMb3cnLCBkZXRhaWw6ICdVcCB0byAyayB0aGlua2luZyB0b2tlbnMnIH0sXG4gIHsgbGFiZWw6ICdNZWRpdW0nLCBkZXRhaWw6ICdVcCB0byA4ayB0aGlua2luZyB0b2tlbnMnIH0sXG4gIHsgbGFiZWw6ICdIaWdoJywgZGV0YWlsOiAnVXAgdG8gMjRrIHRoaW5raW5nIHRva2VucycgfSxcbl07XG5cbi8qKiBDaG9vc2UgdGhlIG1vZGVsIGZvciBhIGNoYXQgYnkgc3BlZWQsIHF1YWxpdHkgYW5kIGNvc3QsIGFuZCBob3cgaGFyZCBpdCB0aGlua3MuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1tb2RlbC1waWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjcm9vdFxuICAgICAgZGF0YS12bz1cIlwiXG4gICAgICBjbGFzcz1cInZvLW1wa1wiXG4gICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLW1way10b3BcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1tcGstbGJcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICN0cmlnZ2VyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ2by1tcGstdHJcIlxuICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW4oKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1ta1wiIFtzdHlsZS4tLXZvLW1jXT1cInBpY2tlZD8uY29sb3JcIiBbc3R5bGUuLS12by1tdF09XCJwaWNrZWQ/Lm1hcmtUZXh0XCI+XG4gICAgICAgICAgICB7eyBwaWNrZWQ/Lm1hcmsgPz8gcGlja2VkPy5uYW1lPy5bMF0gfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstbm1cIj57eyBwaWNrZWQ/Lm5hbWUgPz8gJycgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstZWYgdm8tbXV0ZWRcIj57eyBlZmYgfX08L3NwYW4+XG4gICAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZvLWZvbGQgdm8tbXBrLWZvbGRcIiBbY2xhc3Mudm8tc2h1dF09XCIhaXNPcGVuXCIgW2F0dHIuaW5lcnRdPVwiaXNPcGVuID8gbnVsbCA6ICcnXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLW1way1wIHZvLXBhbmVsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tbXBrLWhkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+U3BlZWQ8L3NwYW4+PHNwYW4+UXVhbGl0eTwvc3Bhbj48c3Bhbj5Db3N0PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstbGlzdFwiIHJvbGU9XCJyYWRpb2dyb3VwXCIgYXJpYS1sYWJlbD1cIk1vZGVsXCI+XG4gICAgICAgICAgICAgIEBmb3IgKG0gb2YgbW9kZWxzOyB0cmFjayBtLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJtLmlkID09PSBwaWNrZWQ/LmlkXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJtLmlkID09PSBwaWNrZWQ/LmlkID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8tbXBrLW9cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLWJ1c3ldPVwibS5zdGF0dXMgPT09ICdidXN5J1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGljayhpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tcGstbWtcIiBbc3R5bGUuLS12by1tY109XCJtLmNvbG9yXCIgW3N0eWxlLi0tdm8tbXRdPVwibS5tYXJrVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtLm1hcmsgPz8gbS5uYW1lWzBdIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgbS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfX08c3BhbiBjbGFzcz1cInZvLWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG0uc3RhdHVzID09PSAnY2hlY2tpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvYlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IHJvd05vdGUobSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5zcGVlZERldGFpbFwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIm0uc3BlZWREZXRhaWwgPyBudWxsIDogdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChrIG9mIGJhcnM7IHRyYWNrIGspIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3Mudm8tb25dPVwiayA8PSBtLnNwZWVkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5xdWFsaXR5RGV0YWlsXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwibS5xdWFsaXR5RGV0YWlsID8gbnVsbCA6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoayBvZiBiYXJzOyB0cmFjayBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzLnZvLW9uXT1cImsgPD0gbS5xdWFsaXR5XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1tXCIgW2F0dHIuZGF0YS10aXBdPVwibS5jb3N0RGV0YWlsXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwibS5jb3N0RGV0YWlsID8gbnVsbCA6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoayBvZiBiYXJzOyB0cmFjayBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzLnZvLW9uXT1cImsgPD0gbS5jb3N0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiFzdWdnZXN0aW9uXCIgW2F0dHIuaW5lcnRdPVwic3VnZ2VzdGlvbiA/IG51bGwgOiAnJ1wiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstc2dcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidm8tbXBrLXNndFwiPnt7IHN1Z2dlc3Rpb24/LnRleHQgfX08L3A+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tbXBrLXNnYVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChhIG9mIHN1Z2dlc3Rpb24/LmFjdGlvbnMgPz8gW107IHRyYWNrIGEubGFiZWw7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8tcGlsbCB2by1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tcHJpbWFyeV09XCJsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1naG9zdF09XCIhbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYS5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1tcGstdGhcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLW1way10aGhcIj5cbiAgICAgICAgICAgICAgICA8Yj48dm8taWNvbiBuYW1lPVwiY3B1XCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlRoaW5raW5nPC9iPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWQgdm8tbXBrLXRoZFwiPnt7IGVmZm9ydERldGFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAjZWZmQnRuXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1tcGstZWJcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImVmZk9wZW5cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUaGlua2luZyBlZmZvcnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFZmYoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1way1ldlwiPnt7IGVmZiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1kXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICNwb3AgY2xhc3M9XCJ2by1wb3Agdm8tbXBrLXBvcFwiIFtjbGFzcy52by1vcGVuXT1cImVmZk9wZW5cIiByb2xlPVwibWVudVwiIGFyaWEtbGFiZWw9XCJUaGlua2luZyBlZmZvcnRcIj5cbiAgICAgICAgQGZvciAoZSBvZiBlZmZvcnRzOyB0cmFjayBlLmxhYmVsKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLW1pXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbXJhZGlvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJlLmxhYmVsID09PSBlZmZcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNob29zZUVmZm9ydChlLmxhYmVsKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgPnt7IGUubGFiZWwgfX1AaWYgKGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgZS5kZXRhaWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tY2tcIj48dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAgY2xhc3M9XCJ2by1tcGstbm90ZSB2by1tdXRlZFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICBAaWYgKG5vdGUpIHtcbiAgICAgICAgICA8dm8taWNvbiBuYW1lPVwib2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4+e3sgbm90ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vbW9kZWwtcGlja2VyLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIG1vZGVscyB0byBjaG9vc2UgZnJvbS4gKi9cbiAgQElucHV0KCkgbW9kZWxzOiBNb2RlbE9wdGlvbltdID0gW107XG4gIC8qKiBUaGUgcGlja2VkIG1vZGVsJ3MgaWQuIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIGxpc3QgaG9sZCBpdHMgb3duLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuICAvKiogVGhlIHRoaW5raW5nIGVmZm9ydHMuIERlZmF1bHRzIHRvIE9mZiwgTG93LCBNZWRpdW0gYW5kIEhpZ2guICovXG4gIEBJbnB1dCgpIGVmZm9ydHM6IFRoaW5raW5nRWZmb3J0W10gPSBFRkZPUlRTO1xuICBASW5wdXQoKSBlZmZvcnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHRFZmZvcnQ/OiBzdHJpbmc7XG4gIC8qKiBBIHdheSBvdXQgd2hlbiB0aGUgcGlja2VkIG1vZGVsIGNhbid0IHRha2UgdGhlIHJlcXVlc3QuICovXG4gIEBJbnB1dCgpIHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjb25maXJtYXRpb24gdW5kZXIgdGhlIHBpY2tlciwgc2hvd24gd2l0aCBhIGdyZWVuIGNoZWNrLiAqL1xuICBASW5wdXQoKSBub3RlID0gJyc7XG4gIC8qKiBUaGUgbGFiZWwgYmVzaWRlIHRoZSB0cmlnZ2VyLiBEZWZhdWx0cyB0byBcIk1vZGVsIGZvciB0aGlzIGNoYXRcIi4gKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnTW9kZWwgZm9yIHRoaXMgY2hhdCc7XG4gIC8qKiBXaGV0aGVyIHRoZSBsaXN0IGlzIG9wZW4uIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIHRyaWdnZXIgYW5kIEVzY2FwZSBvcGVuIGFuZCBjbG9zZSBpdC4gKi9cbiAgQElucHV0KCkgb3Blbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlZmF1bHRPcGVuID0gdHJ1ZTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IGlzIHBpY2tlZCwgYnVzeSBvciBub3QsIHNvIHlvdSBjYW4gY2hlY2sgdGhlIG1vZGVsIGZpcnN0LiAqL1xuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGVmZm9ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgcHJpdmF0ZSB0cmlnZ2VyITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2VmZkJ0bicpIHByaXZhdGUgZWZmQnRuITogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BvcCcpIHByaXZhdGUgcG9wITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIC8qKiBUaGUgZml2ZSBtZXRlciBzdGVwcy4gKi9cbiAgcmVhZG9ubHkgYmFycyA9IFsxLCAyLCAzLCA0LCA1XTtcblxuICAvLyBpbnRlcm5hbCBzdGF0ZSBob2xkcyBpdHMgb3duIHdoZW4gdGhlIG1hdGNoaW5nIGlucHV0IGlzIGxlZnQgb3V0ICh1bmNvbnRyb2xsZWQpXG4gIHByaXZhdGUgY3VySWQgPSAnJztcbiAgcHJpdmF0ZSBlZmZMYWJlbCA9ICcnO1xuICBwcml2YXRlIG9wZW5TdGF0ZSA9IHRydWU7XG4gIGVmZk9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddIHx8IGNoYW5nZXNbJ2RlZmF1bHRWYWx1ZSddIHx8IGNoYW5nZXNbJ21vZGVscyddKSB7XG4gICAgICB0aGlzLmN1cklkID0gdGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZSA/PyB0aGlzLm1vZGVsc1swXT8uaWQgPz8gdGhpcy5jdXJJZCA/PyAnJztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2VmZm9ydCddIHx8IGNoYW5nZXNbJ2RlZmF1bHRFZmZvcnQnXSB8fCBjaGFuZ2VzWydlZmZvcnRzJ10pIHtcbiAgICAgIHRoaXMuZWZmTGFiZWwgPVxuICAgICAgICB0aGlzLmVmZm9ydCA/P1xuICAgICAgICB0aGlzLmRlZmF1bHRFZmZvcnQgPz9cbiAgICAgICAgdGhpcy5lZmZvcnRzW01hdGgubWluKDIsIHRoaXMuZWZmb3J0cy5sZW5ndGggLSAxKV0/LmxhYmVsID8/XG4gICAgICAgIHRoaXMuZWZmTGFiZWwgPz9cbiAgICAgICAgJyc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydvcGVuJ10gfHwgY2hhbmdlc1snZGVmYXVsdE9wZW4nXSkge1xuICAgICAgdGhpcy5vcGVuU3RhdGUgPSB0aGlzLm9wZW4gPz8gdGhpcy5kZWZhdWx0T3BlbjtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gY2xvc2UgdGhlIGVmZm9ydCBtZW51IG9uIGFuIG91dHNpZGUgY2xpY2tcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xuICAgIGlmICh0aGlzLmNsb3NlVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZXIpO1xuICB9XG5cbiAgZ2V0IHBpY2tlZCgpOiBNb2RlbE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzLmZpbmQoKG0pID0+IG0uaWQgPT09IHRoaXMuY3VySWQpID8/IHRoaXMubW9kZWxzWzBdO1xuICB9XG5cbiAgZ2V0IGVmZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVmZkxhYmVsO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuID8/IHRoaXMub3BlblN0YXRlO1xuICB9XG5cbiAgZ2V0IGVmZm9ydERldGFpbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVmZm9ydHMuZmluZCgoZSkgPT4gZS5sYWJlbCA9PT0gdGhpcy5lZmYpPy5kZXRhaWwgPz8gJyc7XG4gIH1cblxuICByb3dOb3RlKG06IE1vZGVsT3B0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKG0uc3RhdHVzICYmIG0uc3RhdHVzICE9PSAncmVhZHknICYmIG0uc3RhdHVzVGV4dCkgfHwgbS5ub3RlIHx8ICcnO1xuICB9XG5cbiAgcGljayhpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMubW9kZWxzW2ldPy5pZDtcbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMuY3VySWQgPSBpZDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoaWQpO1xuICB9XG5cbiAgY2hvb3NlRWZmb3J0KGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZmZvcnQgPT09IHVuZGVmaW5lZCkgdGhpcy5lZmZMYWJlbCA9IGxhYmVsO1xuICAgIHRoaXMuZWZmb3J0Q2hhbmdlLmVtaXQobGFiZWwpO1xuICAgIHRoaXMuY2xvc2VFZmZTb29uKCk7XG4gIH1cblxuICB0b2dnbGVPcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5pc09wZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuKHY6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcGVuID09PSB1bmRlZmluZWQpIHRoaXMub3BlblN0YXRlID0gdjtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdCh2KTtcbiAgfVxuXG4gIHRvZ2dsZUVmZigpOiB2b2lkIHtcbiAgICB0aGlzLmVmZk9wZW4gPSAhdGhpcy5lZmZPcGVuO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUVmZlNvb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lcik7XG4gICAgdGhpcy5jbG9zZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5lZmZPcGVuID0gZmFsc2UpLCB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiAxMjApO1xuICB9XG5cbiAgb25LZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBFc2NhcGUgY2xvc2VzIHRoZSBvcGVuIGxpc3QgYW5kIGdpdmVzIHRoZSB0cmlnZ2VyIHRoZSBmb2N1cyBiYWNrXG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKHRoaXMuZWZmT3Blbikge1xuICAgICAgICB0aGlzLmVmZk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lZmZCdG4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgdGhpcy5zZXRPcGVuKGZhbHNlKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYXJyb3cga2V5cyBtb3ZlIHRocm91Z2ggdGhlIG1vZGVscywgYXMgaW4gYW55IHJhZGlvIGdyb3VwXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHRhcmdldD8uY2xvc2VzdDxIVE1MQnV0dG9uRWxlbWVudD4oJy52by1tcGstbycpO1xuICAgIGlmICghcm93KSByZXR1cm47XG4gICAgY29uc3Qgc3RlcCA9ICh7IEFycm93RG93bjogMSwgQXJyb3dSaWdodDogMSwgQXJyb3dVcDogLTEsIEFycm93TGVmdDogLTEgfSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KVtlLmtleV07XG4gICAgaWYgKCFzdGVwKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHJvdy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignLnZvLW1way1vJykgPz8gW10pO1xuICAgIGNvbnN0IGZyb20gPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBjb25zdCBpID0gKGZyb20gKyBzdGVwICsgdGhpcy5tb2RlbHMubGVuZ3RoKSAlIHRoaXMubW9kZWxzLmxlbmd0aDtcbiAgICByb3dzW2ldPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgdGhpcy5waWNrKGkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbk91dHNpZGUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmVmZk9wZW4pIHJldHVybjtcbiAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAodGhpcy5wb3A/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgfHwgdGhpcy5lZmZCdG4/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkpIHJldHVybjtcbiAgICB0aGlzLmVmZk9wZW4gPSBmYWxzZTtcbiAgfTtcbn1cbiJdfQ==