@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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
// framework/angular/human-handoff/human-handoff.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/human-handoff/HumanHandoff.tsx.
|
|
4
|
+
// The agent passes a conversation to a person: why, who has it (with Reassign),
|
|
5
|
+
// when the reply is due, the context they need to pick it up, and what the
|
|
6
|
+
// customer was told — with a row at the foot that says where it stands. Inputs
|
|
7
|
+
// mirror the React props; callbacks become @Output EventEmitters.
|
|
8
|
+
//
|
|
9
|
+
// Icon substitutions (the Angular icon set has no "user" or "link"): the header
|
|
10
|
+
// badge uses "users" in place of the single-person "user" glyph, and the
|
|
11
|
+
// conversation link uses "ext" in place of "link". All other icons (chev-d,
|
|
12
|
+
// clock, edit, check, alert, ok) map 1:1.
|
|
13
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
14
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
15
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
const initialsOf = (p) => p.initials ??
|
|
18
|
+
p.name
|
|
19
|
+
.split(' ')
|
|
20
|
+
.map((w) => w[0])
|
|
21
|
+
.join('')
|
|
22
|
+
.slice(0, 2);
|
|
23
|
+
/** The agent hands a conversation to a person, with what they need to pick it up. */
|
|
24
|
+
export class HumanHandoffComponent {
|
|
25
|
+
constructor() {
|
|
26
|
+
/** The card's heading. */
|
|
27
|
+
this.title = 'Handed off to a person';
|
|
28
|
+
/** Why the agent handed off, like "Refund over $500 needs a person". */
|
|
29
|
+
this.reason = '';
|
|
30
|
+
/** Who has it, or null while the agent is still finding someone. */
|
|
31
|
+
this.assignee = null;
|
|
32
|
+
/** The two lines shown while assignee is null. */
|
|
33
|
+
this.finding = { title: 'Finding someone' };
|
|
34
|
+
/** Seconds left until the reply is due. Whole minutes; orange under five; overdue at 0 or less. */
|
|
35
|
+
this.secondsLeft = 0;
|
|
36
|
+
/** The whole window, for the bar and the line beside it ("15 min target"). */
|
|
37
|
+
this.targetSeconds = 900;
|
|
38
|
+
/** What the person needs to pick it up. */
|
|
39
|
+
this.summary = '';
|
|
40
|
+
/** A few key facts, as label and value rows. */
|
|
41
|
+
this.facts = [];
|
|
42
|
+
/** What the agent told the customer. */
|
|
43
|
+
this.message = '';
|
|
44
|
+
/** The label over the message, like "Sent to Dana". */
|
|
45
|
+
this.messageLabel = 'Sent to the customer';
|
|
46
|
+
/** Set to true to add Edit: the message turns editable, and Save emits messageChange. */
|
|
47
|
+
this.editable = false;
|
|
48
|
+
/** Adds "· edited" to the label. */
|
|
49
|
+
this.edited = false;
|
|
50
|
+
/** The row at the foot that says where it stands. */
|
|
51
|
+
this.status = { title: '' };
|
|
52
|
+
/** Overridable labels. */
|
|
53
|
+
this.labels = {};
|
|
54
|
+
/** Emitted when a row is picked in Reassign. */
|
|
55
|
+
this.reassign = new EventEmitter();
|
|
56
|
+
/** Emitted by Save with the new message text (only when editable). */
|
|
57
|
+
this.messageChange = new EventEmitter();
|
|
58
|
+
this.motion = inject(ReducedMotionService);
|
|
59
|
+
this.editing = false;
|
|
60
|
+
this.menuOpen = false;
|
|
61
|
+
// resolved labels, recomputed when inputs change
|
|
62
|
+
this.L = this.resolveLabels();
|
|
63
|
+
this.onOutside = (e) => {
|
|
64
|
+
if (!this.menuOpen)
|
|
65
|
+
return;
|
|
66
|
+
const t = e.target;
|
|
67
|
+
if (this.pop?.nativeElement.contains(t) || this.reassignBtn?.nativeElement.contains(t))
|
|
68
|
+
return;
|
|
69
|
+
this.menuOpen = false;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
ngOnChanges(changes) {
|
|
73
|
+
if (changes['labels'] || changes['targetSeconds']) {
|
|
74
|
+
this.L = this.resolveLabels();
|
|
75
|
+
}
|
|
76
|
+
// the box is drawn afresh each render in React; here we only overwrite its
|
|
77
|
+
// text when we are not editing, so what is typed is never clobbered
|
|
78
|
+
if (changes['message'] && !this.editing && this.box) {
|
|
79
|
+
this.box.nativeElement.textContent = this.message;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
ngAfterViewInit() {
|
|
83
|
+
document.addEventListener('pointerdown', this.onOutside, true);
|
|
84
|
+
}
|
|
85
|
+
ngOnDestroy() {
|
|
86
|
+
document.removeEventListener('pointerdown', this.onOutside, true);
|
|
87
|
+
if (this.closeTimer)
|
|
88
|
+
clearTimeout(this.closeTimer);
|
|
89
|
+
}
|
|
90
|
+
resolveLabels() {
|
|
91
|
+
return {
|
|
92
|
+
assignedTo: 'Assigned to',
|
|
93
|
+
context: 'Context passed along',
|
|
94
|
+
reassign: 'Reassign',
|
|
95
|
+
reassignTo: 'Reassign to',
|
|
96
|
+
target: `${Math.round(this.targetSeconds / 60)} min target`,
|
|
97
|
+
edit: 'Edit',
|
|
98
|
+
save: 'Save',
|
|
99
|
+
cancel: 'Cancel',
|
|
100
|
+
edited: 'edited',
|
|
101
|
+
...this.labels,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
initials(p) {
|
|
105
|
+
return initialsOf(p);
|
|
106
|
+
}
|
|
107
|
+
whoLine(p) {
|
|
108
|
+
return [p.team, p.presence].filter(Boolean).join(' · ');
|
|
109
|
+
}
|
|
110
|
+
metaLine(p) {
|
|
111
|
+
return [p.team, p.presence].filter(Boolean).join(' · ');
|
|
112
|
+
}
|
|
113
|
+
get hasMessageChange() {
|
|
114
|
+
return this.editable;
|
|
115
|
+
}
|
|
116
|
+
get left() {
|
|
117
|
+
return Math.max(0, this.secondsLeft);
|
|
118
|
+
}
|
|
119
|
+
get due() {
|
|
120
|
+
const s = this.secondsLeft;
|
|
121
|
+
const m = Math.floor(s / 60);
|
|
122
|
+
return s <= 0
|
|
123
|
+
? 'Reply overdue'
|
|
124
|
+
: m < 1
|
|
125
|
+
? 'Reply due in under a minute'
|
|
126
|
+
: `Reply due in ${m} min`;
|
|
127
|
+
}
|
|
128
|
+
get slaTone() {
|
|
129
|
+
return this.secondsLeft <= 0 ? 'vo-bad' : this.secondsLeft < 300 ? 'vo-warn' : '';
|
|
130
|
+
}
|
|
131
|
+
get barWidth() {
|
|
132
|
+
return Math.min(100, (this.left / this.targetSeconds) * 100);
|
|
133
|
+
}
|
|
134
|
+
get st() {
|
|
135
|
+
return this.status.tone ?? 'wait';
|
|
136
|
+
}
|
|
137
|
+
// ---- reassign menu ----
|
|
138
|
+
toggleMenu() {
|
|
139
|
+
this.menuOpen = !this.menuOpen;
|
|
140
|
+
}
|
|
141
|
+
choose(p) {
|
|
142
|
+
if (p.name !== this.assignee?.name)
|
|
143
|
+
this.reassign.emit(p);
|
|
144
|
+
this.closeMenuSoon();
|
|
145
|
+
}
|
|
146
|
+
closeMenuSoon() {
|
|
147
|
+
if (this.closeTimer)
|
|
148
|
+
clearTimeout(this.closeTimer);
|
|
149
|
+
this.closeTimer = setTimeout(() => (this.menuOpen = false), this.motion.reduce() ? 0 : 120);
|
|
150
|
+
}
|
|
151
|
+
// ---- in-place edit of the message ----
|
|
152
|
+
startEdit() {
|
|
153
|
+
this.editing = true;
|
|
154
|
+
const focus = () => {
|
|
155
|
+
const b = this.box?.nativeElement;
|
|
156
|
+
if (!b)
|
|
157
|
+
return;
|
|
158
|
+
b.focus();
|
|
159
|
+
const s = getSelection();
|
|
160
|
+
s?.selectAllChildren(b);
|
|
161
|
+
s?.collapseToEnd();
|
|
162
|
+
};
|
|
163
|
+
if (this.motion.reduce())
|
|
164
|
+
focus();
|
|
165
|
+
else
|
|
166
|
+
requestAnimationFrame(focus);
|
|
167
|
+
}
|
|
168
|
+
save() {
|
|
169
|
+
const t = (this.box?.nativeElement.innerText ?? '').trim();
|
|
170
|
+
if (t && t !== this.message)
|
|
171
|
+
this.messageChange.emit(t);
|
|
172
|
+
this.editing = false;
|
|
173
|
+
}
|
|
174
|
+
cancelEdit() {
|
|
175
|
+
this.editing = false;
|
|
176
|
+
if (this.box)
|
|
177
|
+
this.box.nativeElement.textContent = this.message;
|
|
178
|
+
}
|
|
179
|
+
onKeydown(e) {
|
|
180
|
+
if (e.key === 'Escape') {
|
|
181
|
+
if (this.menuOpen) {
|
|
182
|
+
this.menuOpen = false;
|
|
183
|
+
this.reassignBtn?.nativeElement.focus({ preventScroll: true });
|
|
184
|
+
}
|
|
185
|
+
else if (this.editing) {
|
|
186
|
+
this.cancelEdit();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanHandoffComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HumanHandoffComponent, isStandalone: true, selector: "vo-human-handoff", inputs: { title: "title", reason: "reason", assignee: "assignee", finding: "finding", people: "people", secondsLeft: "secondsLeft", targetSeconds: "targetSeconds", summary: "summary", facts: "facts", link: "link", message: "message", messageLabel: "messageLabel", editable: "editable", edited: "edited", status: "status", labels: "labels", className: "className" }, outputs: { reassign: "reassign", messageChange: "messageChange" }, viewQueries: [{ propertyName: "box", first: true, predicate: ["box"], descendants: true }, { propertyName: "reassignBtn", first: true, predicate: ["reassignBtn"], descendants: true }, { propertyName: "pop", first: true, predicate: ["pop"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
192
|
+
<div
|
|
193
|
+
#root
|
|
194
|
+
data-vo=""
|
|
195
|
+
[class]="className"
|
|
196
|
+
style="width:100%;container-type:inline-size"
|
|
197
|
+
(keydown)="onKeydown($event)"
|
|
198
|
+
>
|
|
199
|
+
<div class="vo-hox vo-panel">
|
|
200
|
+
<div class="vo-hox-h">
|
|
201
|
+
<span class="vo-hox-ic"><vo-icon name="users"></vo-icon></span>
|
|
202
|
+
<div class="vo-hox-ht">
|
|
203
|
+
<b>{{ title }}</b><span class="vo-muted">{{ reason }}</span>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
<div class="vo-hox-b">
|
|
208
|
+
<div class="vo-hox-col">
|
|
209
|
+
<span class="vo-hox-lb">{{ L.assignedTo }}</span>
|
|
210
|
+
<div class="vo-hox-who">
|
|
211
|
+
<span class="vo-hox-av">
|
|
212
|
+
@if (assignee) {
|
|
213
|
+
<span
|
|
214
|
+
class="vo-av vo-enter"
|
|
215
|
+
[style.background]="assignee.color ?? 'var(--vo-av-l)'"
|
|
216
|
+
>{{ initials(assignee) }}</span
|
|
217
|
+
>
|
|
218
|
+
} @else {
|
|
219
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
220
|
+
}
|
|
221
|
+
</span>
|
|
222
|
+
<span class="vo-hox-wt">
|
|
223
|
+
<b>{{ assignee ? assignee.name : finding.title }}</b>
|
|
224
|
+
@if (assignee) {
|
|
225
|
+
<span
|
|
226
|
+
class="vo-hox-wd vo-enter"
|
|
227
|
+
[class.vo-ok]="assignee.tone === 'ok'"
|
|
228
|
+
[class.vo-warn]="assignee.tone === 'warn'"
|
|
229
|
+
>
|
|
230
|
+
@if (assignee.presence) {
|
|
231
|
+
<span class="vo-dot"></span>
|
|
232
|
+
}
|
|
233
|
+
<span>{{ whoLine(assignee) }}</span>
|
|
234
|
+
</span>
|
|
235
|
+
} @else {
|
|
236
|
+
<span class="vo-hox-wd"><span>{{ finding.detail }}</span></span>
|
|
237
|
+
}
|
|
238
|
+
</span>
|
|
239
|
+
@if (people) {
|
|
240
|
+
<button
|
|
241
|
+
#reassignBtn
|
|
242
|
+
type="button"
|
|
243
|
+
class="vo-hox-rb"
|
|
244
|
+
aria-haspopup="menu"
|
|
245
|
+
[attr.aria-expanded]="menuOpen"
|
|
246
|
+
[disabled]="!assignee"
|
|
247
|
+
(click)="toggleMenu()"
|
|
248
|
+
>
|
|
249
|
+
{{ L.reassign }}<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
250
|
+
</button>
|
|
251
|
+
}
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<div
|
|
255
|
+
class="vo-hox-sla"
|
|
256
|
+
[class.vo-warn]="slaTone === 'vo-warn'"
|
|
257
|
+
[class.vo-bad]="slaTone === 'vo-bad'"
|
|
258
|
+
>
|
|
259
|
+
<div class="vo-hox-sl">
|
|
260
|
+
<vo-icon name="clock"></vo-icon>
|
|
261
|
+
<span class="vo-hox-due vo-num">{{ due }}</span>
|
|
262
|
+
<span class="vo-muted">{{ L.target }}</span>
|
|
263
|
+
</div>
|
|
264
|
+
<div
|
|
265
|
+
class="vo-hox-bar"
|
|
266
|
+
role="progressbar"
|
|
267
|
+
aria-label="Time left to reply"
|
|
268
|
+
[attr.aria-valuemin]="0"
|
|
269
|
+
[attr.aria-valuemax]="targetSeconds"
|
|
270
|
+
[attr.aria-valuenow]="left"
|
|
271
|
+
>
|
|
272
|
+
<i [style.width.%]="barWidth"></i>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
|
|
276
|
+
<div class="vo-hox-ms">
|
|
277
|
+
<div class="vo-hox-mh">
|
|
278
|
+
<span class="vo-hox-lb">{{
|
|
279
|
+
edited ? messageLabel + ' · ' + L.edited : messageLabel
|
|
280
|
+
}}</span>
|
|
281
|
+
<span class="vo-sp"></span>
|
|
282
|
+
@if (hasMessageChange && editing) {
|
|
283
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="cancelEdit()">
|
|
284
|
+
{{ L.cancel }}
|
|
285
|
+
</button>
|
|
286
|
+
}
|
|
287
|
+
@if (hasMessageChange) {
|
|
288
|
+
@if (editing) {
|
|
289
|
+
<button type="button" class="vo-pill vo-primary vo-sm" (click)="save()">
|
|
290
|
+
{{ L.save }}
|
|
291
|
+
</button>
|
|
292
|
+
} @else {
|
|
293
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="startEdit()">
|
|
294
|
+
<vo-icon name="edit" size="xs"></vo-icon>{{ L.edit }}
|
|
295
|
+
</button>
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
</div>
|
|
299
|
+
<div
|
|
300
|
+
#box
|
|
301
|
+
class="vo-hox-mb"
|
|
302
|
+
[attr.contenteditable]="editing ? 'true' : null"
|
|
303
|
+
role="textbox"
|
|
304
|
+
aria-multiline="true"
|
|
305
|
+
[attr.aria-readonly]="!editing"
|
|
306
|
+
[attr.aria-label]="messageLabel"
|
|
307
|
+
spellcheck="false"
|
|
308
|
+
>
|
|
309
|
+
{{ message }}
|
|
310
|
+
</div>
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
|
|
314
|
+
<div class="vo-hox-col">
|
|
315
|
+
<span class="vo-hox-lb">{{ L.context }}</span>
|
|
316
|
+
<p class="vo-hox-sum">{{ summary }}</p>
|
|
317
|
+
@if (facts.length > 0) {
|
|
318
|
+
<div class="vo-hox-facts">
|
|
319
|
+
@for (f of facts; track f.label) {
|
|
320
|
+
<div class="vo-hox-f">
|
|
321
|
+
<span class="vo-k">{{ f.label }}</span>
|
|
322
|
+
<span class="vo-v vo-num">{{ f.value }}</span>
|
|
323
|
+
</div>
|
|
324
|
+
}
|
|
325
|
+
</div>
|
|
326
|
+
}
|
|
327
|
+
@if (link) {
|
|
328
|
+
@if (link.href) {
|
|
329
|
+
<a
|
|
330
|
+
class="vo-fchip vo-lnk vo-hox-lnk"
|
|
331
|
+
[href]="link.href"
|
|
332
|
+
[attr.data-tip]="link.tip"
|
|
333
|
+
(click)="link.onClick && link.onClick()"
|
|
334
|
+
>
|
|
335
|
+
<vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
|
|
336
|
+
</a>
|
|
337
|
+
} @else {
|
|
338
|
+
<button
|
|
339
|
+
type="button"
|
|
340
|
+
class="vo-fchip vo-lnk vo-hox-lnk"
|
|
341
|
+
[attr.data-tip]="link.tip"
|
|
342
|
+
(click)="link.onClick && link.onClick()"
|
|
343
|
+
>
|
|
344
|
+
<vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
|
|
345
|
+
</button>
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
</div>
|
|
349
|
+
</div>
|
|
350
|
+
|
|
351
|
+
<div
|
|
352
|
+
class="vo-hox-st"
|
|
353
|
+
[class.vo-warn]="st === 'warn'"
|
|
354
|
+
[class.vo-ok]="st === 'ok'"
|
|
355
|
+
aria-live="polite"
|
|
356
|
+
>
|
|
357
|
+
<span class="vo-g">
|
|
358
|
+
@if (status.person; as p) {
|
|
359
|
+
<span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
|
|
360
|
+
initials(p)
|
|
361
|
+
}}</span>
|
|
362
|
+
} @else if (st === 'wait') {
|
|
363
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
364
|
+
} @else {
|
|
365
|
+
<vo-icon [name]="st === 'warn' ? 'alert' : 'ok'"></vo-icon>
|
|
366
|
+
}
|
|
367
|
+
</span>
|
|
368
|
+
<span class="vo-t">
|
|
369
|
+
<b>{{ status.title }}</b>
|
|
370
|
+
@if (status.detail) {
|
|
371
|
+
<span>{{ status.detail }}</span>
|
|
372
|
+
}
|
|
373
|
+
</span>
|
|
374
|
+
</div>
|
|
375
|
+
|
|
376
|
+
@if (people) {
|
|
377
|
+
<div
|
|
378
|
+
#pop
|
|
379
|
+
class="vo-pop vo-hox-pop"
|
|
380
|
+
[class.vo-open]="menuOpen"
|
|
381
|
+
role="menu"
|
|
382
|
+
[attr.aria-label]="L.reassignTo"
|
|
383
|
+
style="right:0;--vo-origin:top right"
|
|
384
|
+
>
|
|
385
|
+
<div class="vo-ph">{{ L.reassignTo }}</div>
|
|
386
|
+
@for (p of people; track p.name) {
|
|
387
|
+
<button
|
|
388
|
+
type="button"
|
|
389
|
+
class="vo-mi"
|
|
390
|
+
role="menuitemradio"
|
|
391
|
+
[attr.aria-checked]="p.name === assignee?.name"
|
|
392
|
+
(click)="choose(p)"
|
|
393
|
+
>
|
|
394
|
+
<span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
|
|
395
|
+
initials(p)
|
|
396
|
+
}}</span>
|
|
397
|
+
<span
|
|
398
|
+
>{{ p.name }}<span class="vo-d">{{ metaLine(p) }}</span></span
|
|
399
|
+
>
|
|
400
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
401
|
+
</button>
|
|
402
|
+
}
|
|
403
|
+
</div>
|
|
404
|
+
}
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
`, isInline: true, styles: [".vo-hox{position:relative;width:100%;margin:0 auto;padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-hox-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-hox-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);display:grid;place-items:center;flex:none}.vo-hox-ht{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-ht b{font-weight:500;font-size:14px}.vo-hox-ht span{font-size:13px}.vo-hox-b{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--vo-s-4) var(--vo-s-6);align-items:start;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}@container (max-width:600px){.vo-hox-b{grid-template-columns:minmax(0,1fr)}.vo-hox-col+.vo-hox-col{padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}}.vo-hox-col{display:flex;flex-direction:column;gap:var(--vo-s-2);min-width:0}.vo-hox-lb{font-size:12px;color:var(--vo-muted)}.vo-hox-who{display:flex;align-items:center;gap:10px;min-height:40px}.vo-hox-av{width:28px;height:28px;display:grid;place-items:center;flex:none;border-radius:50%;background:var(--vo-chip);color:var(--vo-fg2)}.vo-hox-av .vo-av{width:28px;height:28px;font-size:11px}.vo-hox-wt{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-wt b{font-weight:500;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-wd{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-hox-wd .vo-dot{color:var(--vo-faint)}.vo-hox-wd.vo-ok .vo-dot{color:var(--vo-ok-mark)}.vo-hox-wd.vo-warn{color:var(--vo-warn)}.vo-hox-wd.vo-warn .vo-dot{color:var(--vo-warn-mark)}.vo-hox-rb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);flex:none;transition:background .16s,color .16s}.vo-hox-rb[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-hox-rb:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-hox-rb>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-hox-rb[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-hox-rb[disabled]{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-hox-pop{min-width:240px}.vo-hox-pop .vo-mi .vo-av{width:20px;height:20px;font-size:9px}.vo-hox-pop .vo-mi>span:not(.vo-ck):not(.vo-av){flex:1;min-width:0}.vo-hox-sla{display:flex;flex-direction:column;gap:var(--vo-s-2);padding-top:var(--vo-s-2)}.vo-hox-sl{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px}.vo-hox-sl>svg{color:var(--vo-fg2);flex:none}.vo-hox-sl .vo-muted{margin-left:auto;font-size:12px;white-space:nowrap}.vo-hox-due{min-width:0}.vo-hox-bar{height:4px;border-radius:2px;background:var(--vo-chip);overflow:hidden}.vo-hox-bar i{display:block;height:100%;width:100%;border-radius:inherit;background:var(--vo-fg2);transition:width 1s linear,background .3s}.vo-hox-sla.vo-warn .vo-hox-sl>svg,.vo-hox-sla.vo-warn .vo-hox-due{color:var(--vo-warn)}.vo-hox-sla.vo-warn .vo-hox-bar i{background:var(--vo-warn-mark)}.vo-hox-sla.vo-bad .vo-hox-sl>svg,.vo-hox-sla.vo-bad .vo-hox-due{color:var(--vo-bad)}.vo-hox-sum{margin:0;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-hox-facts{display:flex;flex-direction:column;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-f{display:flex;align-items:center;gap:10px;min-height:32px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-hox-f .vo-k{width:72px;flex:none;color:var(--vo-muted)}.vo-hox-f .vo-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-lnk{align-self:flex-start;max-width:100%}.vo-hox-lnk>span{overflow:hidden;text-overflow:ellipsis}.vo-hox-ms{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-mh{display:flex;align-items:center;gap:var(--vo-s-2);min-height:28px}.vo-hox-mh .vo-sp{flex:1}.vo-hox-mb{padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13.5px;line-height:1.5;outline:0;transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}.vo-hox-mb[contenteditable=true]{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent)}@supports (corner-shape:squircle){.vo-hox-mb[contenteditable=true]{corner-shape:squircle;border-radius:var(--vo-r-box-sq)}}.vo-hox-mb[contenteditable=true]:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-hox-st{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-chip);font-size:13.5px;transition:background .32s}.vo-hox-st.vo-warn{background:var(--vo-warn-bg)}.vo-hox-st.vo-ok{background:var(--vo-ok-bg)}.vo-hox-st .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-hox-st.vo-warn .vo-g{color:var(--vo-warn)}.vo-hox-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-hox-st .vo-g .vo-av{width:18px;height:18px;font-size:8.5px}.vo-hox-st .vo-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-st .vo-t b{font-weight:400}.vo-hox-st .vo-t>span{font-size:13px;color:var(--vo-fg2)}.vo-hox-st .vo-t,.vo-hox-sum,.vo-hox-mb{text-wrap:pretty}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-av{width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;font-size:10px;font-weight:500;color:#fff;flex:none}.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-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fchip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px 0 var(--vo-s-2);border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:12.5px;color:var(--vo-fg);white-space:nowrap}.vo-fchip.vo-lnk{background:none;padding:0 2px;height:auto;color:var(--vo-accent-fg);box-shadow:none;cursor:pointer;transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-fchip.vo-lnk:hover{color:var(--vo-accent)}}.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-pop{position:absolute;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:var(--vo-origin,top left);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-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.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-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 }); }
|
|
408
|
+
}
|
|
409
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanHandoffComponent, decorators: [{
|
|
410
|
+
type: Component,
|
|
411
|
+
args: [{ selector: 'vo-human-handoff', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
412
|
+
<div
|
|
413
|
+
#root
|
|
414
|
+
data-vo=""
|
|
415
|
+
[class]="className"
|
|
416
|
+
style="width:100%;container-type:inline-size"
|
|
417
|
+
(keydown)="onKeydown($event)"
|
|
418
|
+
>
|
|
419
|
+
<div class="vo-hox vo-panel">
|
|
420
|
+
<div class="vo-hox-h">
|
|
421
|
+
<span class="vo-hox-ic"><vo-icon name="users"></vo-icon></span>
|
|
422
|
+
<div class="vo-hox-ht">
|
|
423
|
+
<b>{{ title }}</b><span class="vo-muted">{{ reason }}</span>
|
|
424
|
+
</div>
|
|
425
|
+
</div>
|
|
426
|
+
|
|
427
|
+
<div class="vo-hox-b">
|
|
428
|
+
<div class="vo-hox-col">
|
|
429
|
+
<span class="vo-hox-lb">{{ L.assignedTo }}</span>
|
|
430
|
+
<div class="vo-hox-who">
|
|
431
|
+
<span class="vo-hox-av">
|
|
432
|
+
@if (assignee) {
|
|
433
|
+
<span
|
|
434
|
+
class="vo-av vo-enter"
|
|
435
|
+
[style.background]="assignee.color ?? 'var(--vo-av-l)'"
|
|
436
|
+
>{{ initials(assignee) }}</span
|
|
437
|
+
>
|
|
438
|
+
} @else {
|
|
439
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
440
|
+
}
|
|
441
|
+
</span>
|
|
442
|
+
<span class="vo-hox-wt">
|
|
443
|
+
<b>{{ assignee ? assignee.name : finding.title }}</b>
|
|
444
|
+
@if (assignee) {
|
|
445
|
+
<span
|
|
446
|
+
class="vo-hox-wd vo-enter"
|
|
447
|
+
[class.vo-ok]="assignee.tone === 'ok'"
|
|
448
|
+
[class.vo-warn]="assignee.tone === 'warn'"
|
|
449
|
+
>
|
|
450
|
+
@if (assignee.presence) {
|
|
451
|
+
<span class="vo-dot"></span>
|
|
452
|
+
}
|
|
453
|
+
<span>{{ whoLine(assignee) }}</span>
|
|
454
|
+
</span>
|
|
455
|
+
} @else {
|
|
456
|
+
<span class="vo-hox-wd"><span>{{ finding.detail }}</span></span>
|
|
457
|
+
}
|
|
458
|
+
</span>
|
|
459
|
+
@if (people) {
|
|
460
|
+
<button
|
|
461
|
+
#reassignBtn
|
|
462
|
+
type="button"
|
|
463
|
+
class="vo-hox-rb"
|
|
464
|
+
aria-haspopup="menu"
|
|
465
|
+
[attr.aria-expanded]="menuOpen"
|
|
466
|
+
[disabled]="!assignee"
|
|
467
|
+
(click)="toggleMenu()"
|
|
468
|
+
>
|
|
469
|
+
{{ L.reassign }}<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
470
|
+
</button>
|
|
471
|
+
}
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<div
|
|
475
|
+
class="vo-hox-sla"
|
|
476
|
+
[class.vo-warn]="slaTone === 'vo-warn'"
|
|
477
|
+
[class.vo-bad]="slaTone === 'vo-bad'"
|
|
478
|
+
>
|
|
479
|
+
<div class="vo-hox-sl">
|
|
480
|
+
<vo-icon name="clock"></vo-icon>
|
|
481
|
+
<span class="vo-hox-due vo-num">{{ due }}</span>
|
|
482
|
+
<span class="vo-muted">{{ L.target }}</span>
|
|
483
|
+
</div>
|
|
484
|
+
<div
|
|
485
|
+
class="vo-hox-bar"
|
|
486
|
+
role="progressbar"
|
|
487
|
+
aria-label="Time left to reply"
|
|
488
|
+
[attr.aria-valuemin]="0"
|
|
489
|
+
[attr.aria-valuemax]="targetSeconds"
|
|
490
|
+
[attr.aria-valuenow]="left"
|
|
491
|
+
>
|
|
492
|
+
<i [style.width.%]="barWidth"></i>
|
|
493
|
+
</div>
|
|
494
|
+
</div>
|
|
495
|
+
|
|
496
|
+
<div class="vo-hox-ms">
|
|
497
|
+
<div class="vo-hox-mh">
|
|
498
|
+
<span class="vo-hox-lb">{{
|
|
499
|
+
edited ? messageLabel + ' · ' + L.edited : messageLabel
|
|
500
|
+
}}</span>
|
|
501
|
+
<span class="vo-sp"></span>
|
|
502
|
+
@if (hasMessageChange && editing) {
|
|
503
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="cancelEdit()">
|
|
504
|
+
{{ L.cancel }}
|
|
505
|
+
</button>
|
|
506
|
+
}
|
|
507
|
+
@if (hasMessageChange) {
|
|
508
|
+
@if (editing) {
|
|
509
|
+
<button type="button" class="vo-pill vo-primary vo-sm" (click)="save()">
|
|
510
|
+
{{ L.save }}
|
|
511
|
+
</button>
|
|
512
|
+
} @else {
|
|
513
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="startEdit()">
|
|
514
|
+
<vo-icon name="edit" size="xs"></vo-icon>{{ L.edit }}
|
|
515
|
+
</button>
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
</div>
|
|
519
|
+
<div
|
|
520
|
+
#box
|
|
521
|
+
class="vo-hox-mb"
|
|
522
|
+
[attr.contenteditable]="editing ? 'true' : null"
|
|
523
|
+
role="textbox"
|
|
524
|
+
aria-multiline="true"
|
|
525
|
+
[attr.aria-readonly]="!editing"
|
|
526
|
+
[attr.aria-label]="messageLabel"
|
|
527
|
+
spellcheck="false"
|
|
528
|
+
>
|
|
529
|
+
{{ message }}
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
</div>
|
|
533
|
+
|
|
534
|
+
<div class="vo-hox-col">
|
|
535
|
+
<span class="vo-hox-lb">{{ L.context }}</span>
|
|
536
|
+
<p class="vo-hox-sum">{{ summary }}</p>
|
|
537
|
+
@if (facts.length > 0) {
|
|
538
|
+
<div class="vo-hox-facts">
|
|
539
|
+
@for (f of facts; track f.label) {
|
|
540
|
+
<div class="vo-hox-f">
|
|
541
|
+
<span class="vo-k">{{ f.label }}</span>
|
|
542
|
+
<span class="vo-v vo-num">{{ f.value }}</span>
|
|
543
|
+
</div>
|
|
544
|
+
}
|
|
545
|
+
</div>
|
|
546
|
+
}
|
|
547
|
+
@if (link) {
|
|
548
|
+
@if (link.href) {
|
|
549
|
+
<a
|
|
550
|
+
class="vo-fchip vo-lnk vo-hox-lnk"
|
|
551
|
+
[href]="link.href"
|
|
552
|
+
[attr.data-tip]="link.tip"
|
|
553
|
+
(click)="link.onClick && link.onClick()"
|
|
554
|
+
>
|
|
555
|
+
<vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
|
|
556
|
+
</a>
|
|
557
|
+
} @else {
|
|
558
|
+
<button
|
|
559
|
+
type="button"
|
|
560
|
+
class="vo-fchip vo-lnk vo-hox-lnk"
|
|
561
|
+
[attr.data-tip]="link.tip"
|
|
562
|
+
(click)="link.onClick && link.onClick()"
|
|
563
|
+
>
|
|
564
|
+
<vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
|
|
565
|
+
</button>
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
</div>
|
|
569
|
+
</div>
|
|
570
|
+
|
|
571
|
+
<div
|
|
572
|
+
class="vo-hox-st"
|
|
573
|
+
[class.vo-warn]="st === 'warn'"
|
|
574
|
+
[class.vo-ok]="st === 'ok'"
|
|
575
|
+
aria-live="polite"
|
|
576
|
+
>
|
|
577
|
+
<span class="vo-g">
|
|
578
|
+
@if (status.person; as p) {
|
|
579
|
+
<span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
|
|
580
|
+
initials(p)
|
|
581
|
+
}}</span>
|
|
582
|
+
} @else if (st === 'wait') {
|
|
583
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
584
|
+
} @else {
|
|
585
|
+
<vo-icon [name]="st === 'warn' ? 'alert' : 'ok'"></vo-icon>
|
|
586
|
+
}
|
|
587
|
+
</span>
|
|
588
|
+
<span class="vo-t">
|
|
589
|
+
<b>{{ status.title }}</b>
|
|
590
|
+
@if (status.detail) {
|
|
591
|
+
<span>{{ status.detail }}</span>
|
|
592
|
+
}
|
|
593
|
+
</span>
|
|
594
|
+
</div>
|
|
595
|
+
|
|
596
|
+
@if (people) {
|
|
597
|
+
<div
|
|
598
|
+
#pop
|
|
599
|
+
class="vo-pop vo-hox-pop"
|
|
600
|
+
[class.vo-open]="menuOpen"
|
|
601
|
+
role="menu"
|
|
602
|
+
[attr.aria-label]="L.reassignTo"
|
|
603
|
+
style="right:0;--vo-origin:top right"
|
|
604
|
+
>
|
|
605
|
+
<div class="vo-ph">{{ L.reassignTo }}</div>
|
|
606
|
+
@for (p of people; track p.name) {
|
|
607
|
+
<button
|
|
608
|
+
type="button"
|
|
609
|
+
class="vo-mi"
|
|
610
|
+
role="menuitemradio"
|
|
611
|
+
[attr.aria-checked]="p.name === assignee?.name"
|
|
612
|
+
(click)="choose(p)"
|
|
613
|
+
>
|
|
614
|
+
<span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
|
|
615
|
+
initials(p)
|
|
616
|
+
}}</span>
|
|
617
|
+
<span
|
|
618
|
+
>{{ p.name }}<span class="vo-d">{{ metaLine(p) }}</span></span
|
|
619
|
+
>
|
|
620
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
621
|
+
</button>
|
|
622
|
+
}
|
|
623
|
+
</div>
|
|
624
|
+
}
|
|
625
|
+
</div>
|
|
626
|
+
</div>
|
|
627
|
+
`, styles: [".vo-hox{position:relative;width:100%;margin:0 auto;padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-hox-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-hox-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);display:grid;place-items:center;flex:none}.vo-hox-ht{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-ht b{font-weight:500;font-size:14px}.vo-hox-ht span{font-size:13px}.vo-hox-b{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--vo-s-4) var(--vo-s-6);align-items:start;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}@container (max-width:600px){.vo-hox-b{grid-template-columns:minmax(0,1fr)}.vo-hox-col+.vo-hox-col{padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}}.vo-hox-col{display:flex;flex-direction:column;gap:var(--vo-s-2);min-width:0}.vo-hox-lb{font-size:12px;color:var(--vo-muted)}.vo-hox-who{display:flex;align-items:center;gap:10px;min-height:40px}.vo-hox-av{width:28px;height:28px;display:grid;place-items:center;flex:none;border-radius:50%;background:var(--vo-chip);color:var(--vo-fg2)}.vo-hox-av .vo-av{width:28px;height:28px;font-size:11px}.vo-hox-wt{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-wt b{font-weight:500;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-wd{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-hox-wd .vo-dot{color:var(--vo-faint)}.vo-hox-wd.vo-ok .vo-dot{color:var(--vo-ok-mark)}.vo-hox-wd.vo-warn{color:var(--vo-warn)}.vo-hox-wd.vo-warn .vo-dot{color:var(--vo-warn-mark)}.vo-hox-rb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);flex:none;transition:background .16s,color .16s}.vo-hox-rb[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-hox-rb:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-hox-rb>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-hox-rb[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-hox-rb[disabled]{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-hox-pop{min-width:240px}.vo-hox-pop .vo-mi .vo-av{width:20px;height:20px;font-size:9px}.vo-hox-pop .vo-mi>span:not(.vo-ck):not(.vo-av){flex:1;min-width:0}.vo-hox-sla{display:flex;flex-direction:column;gap:var(--vo-s-2);padding-top:var(--vo-s-2)}.vo-hox-sl{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px}.vo-hox-sl>svg{color:var(--vo-fg2);flex:none}.vo-hox-sl .vo-muted{margin-left:auto;font-size:12px;white-space:nowrap}.vo-hox-due{min-width:0}.vo-hox-bar{height:4px;border-radius:2px;background:var(--vo-chip);overflow:hidden}.vo-hox-bar i{display:block;height:100%;width:100%;border-radius:inherit;background:var(--vo-fg2);transition:width 1s linear,background .3s}.vo-hox-sla.vo-warn .vo-hox-sl>svg,.vo-hox-sla.vo-warn .vo-hox-due{color:var(--vo-warn)}.vo-hox-sla.vo-warn .vo-hox-bar i{background:var(--vo-warn-mark)}.vo-hox-sla.vo-bad .vo-hox-sl>svg,.vo-hox-sla.vo-bad .vo-hox-due{color:var(--vo-bad)}.vo-hox-sum{margin:0;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-hox-facts{display:flex;flex-direction:column;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-f{display:flex;align-items:center;gap:10px;min-height:32px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-hox-f .vo-k{width:72px;flex:none;color:var(--vo-muted)}.vo-hox-f .vo-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-lnk{align-self:flex-start;max-width:100%}.vo-hox-lnk>span{overflow:hidden;text-overflow:ellipsis}.vo-hox-ms{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-mh{display:flex;align-items:center;gap:var(--vo-s-2);min-height:28px}.vo-hox-mh .vo-sp{flex:1}.vo-hox-mb{padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13.5px;line-height:1.5;outline:0;transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}.vo-hox-mb[contenteditable=true]{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent)}@supports (corner-shape:squircle){.vo-hox-mb[contenteditable=true]{corner-shape:squircle;border-radius:var(--vo-r-box-sq)}}.vo-hox-mb[contenteditable=true]:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-hox-st{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-chip);font-size:13.5px;transition:background .32s}.vo-hox-st.vo-warn{background:var(--vo-warn-bg)}.vo-hox-st.vo-ok{background:var(--vo-ok-bg)}.vo-hox-st .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-hox-st.vo-warn .vo-g{color:var(--vo-warn)}.vo-hox-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-hox-st .vo-g .vo-av{width:18px;height:18px;font-size:8.5px}.vo-hox-st .vo-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-st .vo-t b{font-weight:400}.vo-hox-st .vo-t>span{font-size:13px;color:var(--vo-fg2)}.vo-hox-st .vo-t,.vo-hox-sum,.vo-hox-mb{text-wrap:pretty}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-av{width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;font-size:10px;font-weight:500;color:#fff;flex:none}.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-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fchip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px 0 var(--vo-s-2);border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:12.5px;color:var(--vo-fg);white-space:nowrap}.vo-fchip.vo-lnk{background:none;padding:0 2px;height:auto;color:var(--vo-accent-fg);box-shadow:none;cursor:pointer;transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-fchip.vo-lnk:hover{color:var(--vo-accent)}}.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-pop{position:absolute;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:var(--vo-origin,top left);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-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.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-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"] }]
|
|
628
|
+
}], propDecorators: { title: [{
|
|
629
|
+
type: Input
|
|
630
|
+
}], reason: [{
|
|
631
|
+
type: Input
|
|
632
|
+
}], assignee: [{
|
|
633
|
+
type: Input
|
|
634
|
+
}], finding: [{
|
|
635
|
+
type: Input
|
|
636
|
+
}], people: [{
|
|
637
|
+
type: Input
|
|
638
|
+
}], secondsLeft: [{
|
|
639
|
+
type: Input
|
|
640
|
+
}], targetSeconds: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}], summary: [{
|
|
643
|
+
type: Input
|
|
644
|
+
}], facts: [{
|
|
645
|
+
type: Input
|
|
646
|
+
}], link: [{
|
|
647
|
+
type: Input
|
|
648
|
+
}], message: [{
|
|
649
|
+
type: Input
|
|
650
|
+
}], messageLabel: [{
|
|
651
|
+
type: Input
|
|
652
|
+
}], editable: [{
|
|
653
|
+
type: Input
|
|
654
|
+
}], edited: [{
|
|
655
|
+
type: Input
|
|
656
|
+
}], status: [{
|
|
657
|
+
type: Input
|
|
658
|
+
}], labels: [{
|
|
659
|
+
type: Input
|
|
660
|
+
}], className: [{
|
|
661
|
+
type: Input
|
|
662
|
+
}], reassign: [{
|
|
663
|
+
type: Output
|
|
664
|
+
}], messageChange: [{
|
|
665
|
+
type: Output
|
|
666
|
+
}], box: [{
|
|
667
|
+
type: ViewChild,
|
|
668
|
+
args: ['box']
|
|
669
|
+
}], reassignBtn: [{
|
|
670
|
+
type: ViewChild,
|
|
671
|
+
args: ['reassignBtn']
|
|
672
|
+
}], pop: [{
|
|
673
|
+
type: ViewChild,
|
|
674
|
+
args: ['pop']
|
|
675
|
+
}] } });
|
|
676
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taGFuZG9mZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9odW1hbi1oYW5kb2ZmL2h1bWFuLWhhbmRvZmYuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLGtFQUFrRTtBQUNsRSxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsMENBQTBDO0FBRTFDLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQTREdEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFnQixFQUFVLEVBQUUsQ0FDOUMsQ0FBQyxDQUFDLFFBQVE7SUFDVixDQUFDLENBQUMsSUFBSTtTQUNILEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ1IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVqQixxRkFBcUY7QUFpT3JGLE1BQU0sT0FBTyxxQkFBcUI7SUFoT2xDO1FBaU9FLDBCQUEwQjtRQUNqQixVQUFLLEdBQUcsd0JBQXdCLENBQUM7UUFDMUMsd0VBQXdFO1FBQy9ELFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDckIsb0VBQW9FO1FBQzNELGFBQVEsR0FBeUIsSUFBSSxDQUFDO1FB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QUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFbUIsR0FBRztzQkFBNUIsU0FBUzt1QkFBQyxLQUFLO2dCQUNrQixXQUFXO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0UsR0FBRztzQkFBNUIsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvaHVtYW4taGFuZG9mZi9odW1hbi1oYW5kb2ZmLmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2h1bWFuLWhhbmRvZmYvSHVtYW5IYW5kb2ZmLnRzeC5cbi8vIFRoZSBhZ2VudCBwYXNzZXMgYSBjb252ZXJzYXRpb24gdG8gYSBwZXJzb246IHdoeSwgd2hvIGhhcyBpdCAod2l0aCBSZWFzc2lnbiksXG4vLyB3aGVuIHRoZSByZXBseSBpcyBkdWUsIHRoZSBjb250ZXh0IHRoZXkgbmVlZCB0byBwaWNrIGl0IHVwLCBhbmQgd2hhdCB0aGVcbi8vIGN1c3RvbWVyIHdhcyB0b2xkIOKAlCB3aXRoIGEgcm93IGF0IHRoZSBmb290IHRoYXQgc2F5cyB3aGVyZSBpdCBzdGFuZHMuIElucHV0c1xuLy8gbWlycm9yIHRoZSBSZWFjdCBwcm9wczsgY2FsbGJhY2tzIGJlY29tZSBAT3V0cHV0IEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gSWNvbiBzdWJzdGl0dXRpb25zICh0aGUgQW5ndWxhciBpY29uIHNldCBoYXMgbm8gXCJ1c2VyXCIgb3IgXCJsaW5rXCIpOiB0aGUgaGVhZGVyXG4vLyBiYWRnZSB1c2VzIFwidXNlcnNcIiBpbiBwbGFjZSBvZiB0aGUgc2luZ2xlLXBlcnNvbiBcInVzZXJcIiBnbHlwaCwgYW5kIHRoZVxuLy8gY29udmVyc2F0aW9uIGxpbmsgdXNlcyBcImV4dFwiIGluIHBsYWNlIG9mIFwibGlua1wiLiBBbGwgb3RoZXIgaWNvbnMgKGNoZXYtZCxcbi8vIGNsb2NrLCBlZGl0LCBjaGVjaywgYWxlcnQsIG9rKSBtYXAgMToxLlxuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIEEgcGVyc29uIHRoZSBjb252ZXJzYXRpb24gY2FuIGdvIHRvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kb2ZmUGVyc29uIHtcbiAgLyoqIFVzZWQgYXMgdGhlIGtleSwgc28ga2VlcCBpdCB1bmlxdWUuICovXG4gIG5hbWU6IHN0cmluZztcbiAgaW5pdGlhbHM/OiBzdHJpbmc7XG4gIC8qKiBUaGUgYXZhdGFyJ3MgY29sb3VyLCBsaWtlICd2YXIoLS12by1hdi1tKScuICovXG4gIGNvbG9yPzogc3RyaW5nO1xuICAvKiogTGlrZSBcIkJpbGxpbmdcIi4gKi9cbiAgdGVhbT86IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhleSBjYW4gdGFrZSBpdCBub3csIGxpa2UgXCJBdmFpbGFibGVcIiwgXCJJbiBhIGNhbGxcIiBvciBcIk91dCB1bnRpbCAycG1cIi4gKi9cbiAgcHJlc2VuY2U/OiBzdHJpbmc7XG4gIC8qKiBvayBwdXRzIGEgZ3JlZW4gZG90IGJlZm9yZSB0aGUgcHJlc2VuY2UsIHdhcm4gdHVybnMgaXQgb3JhbmdlLiAqL1xuICB0b25lPzogJ29rJyB8ICd3YXJuJztcbn1cblxuLyoqIE9uZSBrZXkgZmFjdCBwYXNzZWQgYWxvbmcsIGFzIGEgbGFiZWwgYW5kIHZhbHVlIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZG9mZkZhY3Qge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKiogQSBsaW5rIHRvIHRoZSB3aG9sZSBjb252ZXJzYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRvZmZMaW5rIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaHJlZj86IHN0cmluZztcbiAgb25DbGljaz86ICgpID0+IHZvaWQ7XG4gIHRpcD86IHN0cmluZztcbn1cblxuLyoqIFRoZSB0d28gbGluZXMgc2hvd24gd2hpbGUgbm8gb25lIGhhcyBpdCB5ZXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRvZmZGaW5kaW5nIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIHJvdyBhdCB0aGUgZm9vdCB0aGF0IHNheXMgd2hlcmUgaXQgc3RhbmRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kb2ZmU3RhdHVzIHtcbiAgLyoqIHdhaXQgaXMgbmV1dHJhbCB3aXRoIGEgc3Bpbm5lciwgd2FybiBvcmFuZ2Ugd2l0aCBhbiBhbGVydCwgb2sgZ3JlZW4uICovXG4gIHRvbmU/OiAnd2FpdCcgfCAnd2FybicgfCAnb2snO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXRhaWw/OiBzdHJpbmc7XG4gIC8qKiBTaG93biBpbiBwbGFjZSBvZiB0aGUgaWNvbiwgbGlrZSB0aGUgcGVyc29uIHdobyBqdXN0IGpvaW5lZC4gKi9cbiAgcGVyc29uPzogSGFuZG9mZlBlcnNvbjtcbn1cblxuLyoqIE92ZXJyaWRhYmxlIGxhYmVscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZG9mZkxhYmVscyB7XG4gIGFzc2lnbmVkVG8/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBzdHJpbmc7XG4gIHJlYXNzaWduPzogc3RyaW5nO1xuICByZWFzc2lnblRvPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGVkaXQ/OiBzdHJpbmc7XG4gIHNhdmU/OiBzdHJpbmc7XG4gIGNhbmNlbD86IHN0cmluZztcbiAgZWRpdGVkPzogc3RyaW5nO1xufVxuXG5jb25zdCBpbml0aWFsc09mID0gKHA6IEhhbmRvZmZQZXJzb24pOiBzdHJpbmcgPT5cbiAgcC5pbml0aWFscyA/P1xuICBwLm5hbWVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAoKHcpID0+IHdbMF0pXG4gICAgLmpvaW4oJycpXG4gICAgLnNsaWNlKDAsIDIpO1xuXG4vKiogVGhlIGFnZW50IGhhbmRzIGEgY29udmVyc2F0aW9uIHRvIGEgcGVyc29uLCB3aXRoIHdoYXQgdGhleSBuZWVkIHRvIHBpY2sgaXQgdXAuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1odW1hbi1oYW5kb2ZmJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI3Jvb3RcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgW2NsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Y29udGFpbmVyLXR5cGU6aW5saW5lLXNpemVcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3ggdm8tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1oXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtaWNcIj48dm8taWNvbiBuYW1lPVwidXNlcnNcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtaHRcIj5cbiAgICAgICAgICAgIDxiPnt7IHRpdGxlIH19PC9iPjxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyByZWFzb24gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtYlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtY29sXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWhveC1sYlwiPnt7IEwuYXNzaWduZWRUbyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtd2hvXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LWF2XCI+XG4gICAgICAgICAgICAgICAgQGlmIChhc3NpZ25lZSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1hdiB2by1lbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImFzc2lnbmVlLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgaW5pdGlhbHMoYXNzaWduZWUpIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LXd0XCI+XG4gICAgICAgICAgICAgICAgPGI+e3sgYXNzaWduZWUgPyBhc3NpZ25lZS5uYW1lIDogZmluZGluZy50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgICAgICBAaWYgKGFzc2lnbmVlKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWhveC13ZCB2by1lbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1va109XCJhc3NpZ25lZS50b25lID09PSAnb2snXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLXdhcm5dPVwiYXNzaWduZWUudG9uZSA9PT0gJ3dhcm4nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChhc3NpZ25lZS5wcmVzZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHdob0xpbmUoYXNzaWduZWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtd2RcIj48c3Bhbj57eyBmaW5kaW5nLmRldGFpbCB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAocGVvcGxlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgI3JlYXNzaWduQnRuXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8taG94LXJiXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwibWVudU9wZW5cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhc3NpZ25lZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBMLnJlYXNzaWduIH19PHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1ob3gtc2xhXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnZvLXdhcm5dPVwic2xhVG9uZSA9PT0gJ3ZvLXdhcm4nXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnZvLWJhZF09XCJzbGFUb25lID09PSAndm8tYmFkJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtc2xcIj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2xvY2tcIj48L3ZvLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtZHVlIHZvLW51bVwiPnt7IGR1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+e3sgTC50YXJnZXQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1ob3gtYmFyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUaW1lIGxlZnQgdG8gcmVwbHlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCJ0YXJnZXRTZWNvbmRzXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cImxlZnRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW3N0eWxlLndpZHRoLiVdPVwiYmFyV2lkdGhcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtbXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1taFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LWxiXCI+e3tcbiAgICAgICAgICAgICAgICAgIGVkaXRlZCA/IG1lc3NhZ2VMYWJlbCArICcgwrcgJyArIEwuZWRpdGVkIDogbWVzc2FnZUxhYmVsXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc01lc3NhZ2VDaGFuZ2UgJiYgZWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWdob3N0IHZvLXNtXCIgKGNsaWNrKT1cImNhbmNlbEVkaXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBMLmNhbmNlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzTWVzc2FnZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgQGlmIChlZGl0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1wcmltYXJ5IHZvLXNtXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IEwuc2F2ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tZ2hvc3Qgdm8tc21cIiAoY2xpY2spPVwic3RhcnRFZGl0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiZWRpdFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj57eyBMLmVkaXQgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNib3hcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWhveC1tYlwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImVkaXRpbmcgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICByb2xlPVwidGV4dGJveFwiXG4gICAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cIiFlZGl0aW5nXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm1lc3NhZ2VMYWJlbFwiXG4gICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IG1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtY29sXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWhveC1sYlwiPnt7IEwuY29udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidm8taG94LXN1bVwiPnt7IHN1bW1hcnkgfX08L3A+XG4gICAgICAgICAgICBAaWYgKGZhY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1mYWN0c1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGYgb2YgZmFjdHM7IHRyYWNrIGYubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtZlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWtcIj57eyBmLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXYgdm8tbnVtXCI+e3sgZi52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgQGlmIChsaW5rLmhyZWYpIHtcbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1mY2hpcCB2by1sbmsgdm8taG94LWxua1wiXG4gICAgICAgICAgICAgICAgICBbaHJlZl09XCJsaW5rLmhyZWZcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXBdPVwibGluay50aXBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImxpbmsub25DbGljayAmJiBsaW5rLm9uQ2xpY2soKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImV4dFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3Bhbj57eyBsaW5rLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWZjaGlwIHZvLWxuayB2by1ob3gtbG5rXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGlwXT1cImxpbmsudGlwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsaW5rLm9uQ2xpY2sgJiYgbGluay5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJleHRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4+e3sgbGluay5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ2by1ob3gtc3RcIlxuICAgICAgICAgIFtjbGFzcy52by13YXJuXT1cInN0ID09PSAnd2FybidcIlxuICAgICAgICAgIFtjbGFzcy52by1va109XCJzdCA9PT0gJ29rJ1wiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPlxuICAgICAgICAgICAgQGlmIChzdGF0dXMucGVyc29uOyBhcyBwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYXZcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJwLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIj57e1xuICAgICAgICAgICAgICAgIGluaXRpYWxzKHApXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoc3QgPT09ICd3YWl0Jykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwic3QgPT09ICd3YXJuJyA/ICdhbGVydCcgOiAnb2snXCI+PC92by1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj5cbiAgICAgICAgICAgIDxiPnt7IHN0YXR1cy50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgIEBpZiAoc3RhdHVzLmRldGFpbCkge1xuICAgICAgICAgICAgICA8c3Bhbj57eyBzdGF0dXMuZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChwZW9wbGUpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjcG9wXG4gICAgICAgICAgICBjbGFzcz1cInZvLXBvcCB2by1ob3gtcG9wXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vcGVuXT1cIm1lbnVPcGVuXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiTC5yZWFzc2lnblRvXCJcbiAgICAgICAgICAgIHN0eWxlPVwicmlnaHQ6MDstLXZvLW9yaWdpbjp0b3AgcmlnaHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1waFwiPnt7IEwucmVhc3NpZ25UbyB9fTwvZGl2PlxuICAgICAgICAgICAgQGZvciAocCBvZiBwZW9wbGU7IHRyYWNrIHAubmFtZSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1taVwiXG4gICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtcmFkaW9cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJwLm5hbWUgPT09IGFzc2lnbmVlPy5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlKHApXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYXZcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJwLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIj57e1xuICAgICAgICAgICAgICAgICAgaW5pdGlhbHMocClcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgPnt7IHAubmFtZSB9fTxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IG1ldGFMaW5lKHApIH19PC9zcGFuPjwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWNrXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vaHVtYW4taGFuZG9mZi5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBIdW1hbkhhbmRvZmZDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgY2FyZCdzIGhlYWRpbmcuICovXG4gIEBJbnB1dCgpIHRpdGxlID0gJ0hhbmRlZCBvZmYgdG8gYSBwZXJzb24nO1xuICAvKiogV2h5IHRoZSBhZ2VudCBoYW5kZWQgb2ZmLCBsaWtlIFwiUmVmdW5kIG92ZXIgJDUwMCBuZWVkcyBhIHBlcnNvblwiLiAqL1xuICBASW5wdXQoKSByZWFzb24gPSAnJztcbiAgLyoqIFdobyBoYXMgaXQsIG9yIG51bGwgd2hpbGUgdGhlIGFnZW50IGlzIHN0aWxsIGZpbmRpbmcgc29tZW9uZS4gKi9cbiAgQElucHV0KCkgYXNzaWduZWU6IEhhbmRvZmZQZXJzb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSB0d28gbGluZXMgc2hvd24gd2hpbGUgYXNzaWduZWUgaXMgbnVsbC4gKi9cbiAgQElucHV0KCkgZmluZGluZzogSGFuZG9mZkZpbmRpbmcgPSB7IHRpdGxlOiAnRmluZGluZyBzb21lb25lJyB9O1xuICAvKiogVGhlIHBlb3BsZSBpdCBjYW4gZ28gdG8gaW5zdGVhZC4gTGVhdmUgaXQgb3V0IHRvIGhpZGUgUmVhc3NpZ24uICovXG4gIEBJbnB1dCgpIHBlb3BsZT86IEhhbmRvZmZQZXJzb25bXTtcbiAgLyoqIFNlY29uZHMgbGVmdCB1bnRpbCB0aGUgcmVwbHkgaXMgZHVlLiBXaG9sZSBtaW51dGVzOyBvcmFuZ2UgdW5kZXIgZml2ZTsgb3ZlcmR1ZSBhdCAwIG9yIGxlc3MuICovXG4gIEBJbnB1dCgpIHNlY29uZHNMZWZ0ID0gMDtcbiAgLyoqIFRoZSB3aG9sZSB3aW5kb3csIGZvciB0aGUgYmFyIGFuZCB0aGUgbGluZSBiZXNpZGUgaXQgKFwiMTUgbWluIHRhcmdldFwiKS4gKi9cbiAgQElucHV0KCkgdGFyZ2V0U2Vjb25kcyA9IDkwMDtcbiAgLyoqIFdoYXQgdGhlIHBlcnNvbiBuZWVkcyB0byBwaWNrIGl0IHVwLiAqL1xuICBASW5wdXQoKSBzdW1tYXJ5ID0gJyc7XG4gIC8qKiBBIGZldyBrZXkgZmFjdHMsIGFzIGxhYmVsIGFuZCB2YWx1ZSByb3dzLiAqL1xuICBASW5wdXQoKSBmYWN0czogSGFuZG9mZkZhY3RbXSA9IFtdO1xuICAvKiogQSBsaW5rIHRvIHRoZSB3aG9sZSBjb252ZXJzYXRpb24uICovXG4gIEBJbnB1dCgpIGxpbms/OiBIYW5kb2ZmTGluaztcbiAgLyoqIFdoYXQgdGhlIGFnZW50IHRvbGQgdGhlIGN1c3RvbWVyLiAqL1xuICBASW5wdXQoKSBtZXNzYWdlID0gJyc7XG4gIC8qKiBUaGUgbGFiZWwgb3ZlciB0aGUgbWVzc2FnZSwgbGlrZSBcIlNlbnQgdG8gRGFuYVwiLiAqL1xuICBASW5wdXQoKSBtZXNzYWdlTGFiZWwgPSAnU2VudCB0byB0aGUgY3VzdG9tZXInO1xuICAvKiogU2V0IHRvIHRydWUgdG8gYWRkIEVkaXQ6IHRoZSBtZXNzYWdlIHR1cm5zIGVkaXRhYmxlLCBhbmQgU2F2ZSBlbWl0cyBtZXNzYWdlQ2hhbmdlLiAqL1xuICBASW5wdXQoKSBlZGl0YWJsZSA9IGZhbHNlO1xuICAvKiogQWRkcyBcIsK3IGVkaXRlZFwiIHRvIHRoZSBsYWJlbC4gKi9cbiAgQElucHV0KCkgZWRpdGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgcm93IGF0IHRoZSBmb290IHRoYXQgc2F5cyB3aGVyZSBpdCBzdGFuZHMuICovXG4gIEBJbnB1dCgpIHN0YXR1czogSGFuZG9mZlN0YXR1cyA9IHsgdGl0bGU6ICcnIH07XG4gIC8qKiBPdmVycmlkYWJsZSBsYWJlbHMuICovXG4gIEBJbnB1dCgpIGxhYmVsczogSGFuZG9mZkxhYmVscyA9IHt9O1xuXG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IGlzIHBpY2tlZCBpbiBSZWFzc2lnbi4gKi9cbiAgQE91dHB1dCgpIHJlYXNzaWduID0gbmV3IEV2ZW50RW1pdHRlcjxIYW5kb2ZmUGVyc29uPigpO1xuICAvKiogRW1pdHRlZCBieSBTYXZlIHdpdGggdGhlIG5ldyBtZXNzYWdlIHRleHQgKG9ubHkgd2hlbiBlZGl0YWJsZSkuICovXG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnYm94JykgcHJpdmF0ZSBib3ghOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncmVhc3NpZ25CdG4nKSBwcml2YXRlIHJlYXNzaWduQnRuPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BvcCcpIHByaXZhdGUgcG9wPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIGVkaXRpbmcgPSBmYWxzZTtcbiAgbWVudU9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgLy8gcmVzb2x2ZWQgbGFiZWxzLCByZWNvbXB1dGVkIHdoZW4gaW5wdXRzIGNoYW5nZVxuICBMOiBSZXF1aXJlZDxIYW5kb2ZmTGFiZWxzPiA9IHRoaXMucmVzb2x2ZUxhYmVscygpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1sndGFyZ2V0U2Vjb25kcyddKSB7XG4gICAgICB0aGlzLkwgPSB0aGlzLnJlc29sdmVMYWJlbHMoKTtcbiAgICB9XG4gICAgLy8gdGhlIGJveCBpcyBkcmF3biBhZnJlc2ggZWFjaCByZW5kZXIgaW4gUmVhY3Q7IGhlcmUgd2Ugb25seSBvdmVyd3JpdGUgaXRzXG4gICAgLy8gdGV4dCB3aGVuIHdlIGFyZSBub3QgZWRpdGluZywgc28gd2hhdCBpcyB0eXBlZCBpcyBuZXZlciBjbG9iYmVyZWRcbiAgICBpZiAoY2hhbmdlc1snbWVzc2FnZSddICYmICF0aGlzLmVkaXRpbmcgJiYgdGhpcy5ib3gpIHtcbiAgICAgIHRoaXMuYm94Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lcik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMYWJlbHMoKTogUmVxdWlyZWQ8SGFuZG9mZkxhYmVscz4ge1xuICAgIHJldHVybiB7XG4gICAgICBhc3NpZ25lZFRvOiAnQXNzaWduZWQgdG8nLFxuICAgICAgY29udGV4dDogJ0NvbnRleHQgcGFzc2VkIGFsb25nJyxcbiAgICAgIHJlYXNzaWduOiAnUmVhc3NpZ24nLFxuICAgICAgcmVhc3NpZ25UbzogJ1JlYXNzaWduIHRvJyxcbiAgICAgIHRhcmdldDogYCR7TWF0aC5yb3VuZCh0aGlzLnRhcmdldFNlY29uZHMgLyA2MCl9IG1pbiB0YXJnZXRgLFxuICAgICAgZWRpdDogJ0VkaXQnLFxuICAgICAgc2F2ZTogJ1NhdmUnLFxuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIGVkaXRlZDogJ2VkaXRlZCcsXG4gICAgICAuLi50aGlzLmxhYmVscyxcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbHMocDogSGFuZG9mZlBlcnNvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluaXRpYWxzT2YocCk7XG4gIH1cblxuICB3aG9MaW5lKHA6IEhhbmRvZmZQZXJzb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBbcC50ZWFtLCBwLnByZXNlbmNlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpO1xuICB9XG5cbiAgbWV0YUxpbmUocDogSGFuZG9mZlBlcnNvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtwLnRlYW0sIHAucHJlc2VuY2VdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7XG4gIH1cblxuICBnZXQgaGFzTWVzc2FnZUNoYW5nZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZTtcbiAgfVxuXG4gIGdldCBsZWZ0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuc2Vjb25kc0xlZnQpO1xuICB9XG5cbiAgZ2V0IGR1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNlY29uZHNMZWZ0O1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKHMgLyA2MCk7XG4gICAgcmV0dXJuIHMgPD0gMFxuICAgICAgPyAnUmVwbHkgb3ZlcmR1ZSdcbiAgICAgIDogbSA8IDFcbiAgICAgICAgPyAnUmVwbHkgZHVlIGluIHVuZGVyIGEgbWludXRlJ1xuICAgICAgICA6IGBSZXBseSBkdWUgaW4gJHttfSBtaW5gO1xuICB9XG5cbiAgZ2V0IHNsYVRvbmUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmRzTGVmdCA8PSAwID8gJ3ZvLWJhZCcgOiB0aGlzLnNlY29uZHNMZWZ0IDwgMzAwID8gJ3ZvLXdhcm4nIDogJyc7XG4gIH1cblxuICBnZXQgYmFyV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCAodGhpcy5sZWZ0IC8gdGhpcy50YXJnZXRTZWNvbmRzKSAqIDEwMCk7XG4gIH1cblxuICBnZXQgc3QoKTogJ3dhaXQnIHwgJ3dhcm4nIHwgJ29rJyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzLnRvbmUgPz8gJ3dhaXQnO1xuICB9XG5cbiAgLy8gLS0tLSByZWFzc2lnbiBtZW51IC0tLS1cbiAgdG9nZ2xlTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVPcGVuID0gIXRoaXMubWVudU9wZW47XG4gIH1cblxuICBjaG9vc2UocDogSGFuZG9mZlBlcnNvbik6IHZvaWQge1xuICAgIGlmIChwLm5hbWUgIT09IHRoaXMuYXNzaWduZWU/Lm5hbWUpIHRoaXMucmVhc3NpZ24uZW1pdChwKTtcbiAgICB0aGlzLmNsb3NlTWVudVNvb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VNZW51U29vbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVyKTtcbiAgICB0aGlzLmNsb3NlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lbnVPcGVuID0gZmFsc2UpLCB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiAxMjApO1xuICB9XG5cbiAgLy8gLS0tLSBpbi1wbGFjZSBlZGl0IG9mIHRoZSBtZXNzYWdlIC0tLS1cbiAgc3RhcnRFZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XG4gICAgY29uc3QgZm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBiID0gdGhpcy5ib3g/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWIpIHJldHVybjtcbiAgICAgIGIuZm9jdXMoKTtcbiAgICAgIGNvbnN0IHMgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHM/LnNlbGVjdEFsbENoaWxkcmVuKGIpO1xuICAgICAgcz8uY29sbGFwc2VUb0VuZCgpO1xuICAgIH07XG4gICAgaWYgKHRoaXMubW90aW9uLnJlZHVjZSgpKSBmb2N1cygpO1xuICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZvY3VzKTtcbiAgfVxuXG4gIHNhdmUoKTogdm9pZCB7XG4gICAgY29uc3QgdCA9ICh0aGlzLmJveD8ubmF0aXZlRWxlbWVudC5pbm5lclRleHQgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAodCAmJiB0ICE9PSB0aGlzLm1lc3NhZ2UpIHRoaXMubWVzc2FnZUNoYW5nZS5lbWl0KHQpO1xuICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ib3gpIHRoaXMuYm94Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLm1lc3NhZ2U7XG4gIH1cblxuICBvbktleWRvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGlmICh0aGlzLm1lbnVPcGVuKSB7XG4gICAgICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFzc2lnbkJ0bj8ubmF0aXZlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWRpdGluZykge1xuICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uT3V0c2lkZSA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMubWVudU9wZW4pIHJldHVybjtcbiAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAodGhpcy5wb3A/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgfHwgdGhpcy5yZWFzc2lnbkJ0bj8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSkgcmV0dXJuO1xuICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcbiAgfTtcbn1cbiJdfQ==
|