@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,360 @@
|
|
|
1
|
+
// framework/angular/citation-hover-card/citation-hover-card.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/citation-hover-card/CitationHoverCard.tsx.
|
|
4
|
+
// An answer with numbered citations: hovering, focusing or tapping one shows its
|
|
5
|
+
// source in a small card underneath that rises in place. Inputs mirror the React
|
|
6
|
+
// props; React callbacks become @Output() EventEmitters. The hover/focus/tap and
|
|
7
|
+
// positioning behaviour is ported from the Vanilla citation-hover-card.js and kept
|
|
8
|
+
// inside the component (setup in ngAfterViewInit, cleanup in ngOnDestroy).
|
|
9
|
+
//
|
|
10
|
+
// Icons: the card's link uses the 'ext' icon (open external), as in the source.
|
|
11
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
12
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
/** An answer with numbered citations. Hovering, focusing or tapping one shows its source in a small card underneath. */
|
|
15
|
+
export class CitationHoverCardComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
/** The answer. `[n]` cites source n; a blank line starts a new paragraph. */
|
|
18
|
+
this.text = '';
|
|
19
|
+
this.sources = [];
|
|
20
|
+
/** The link in the card's corner. */
|
|
21
|
+
this.openLabel = 'Open source';
|
|
22
|
+
/** Called when the card's link is clicked, with the source and its index. */
|
|
23
|
+
this.openSource = new EventEmitter();
|
|
24
|
+
/** Called when a card opens or closes, with the source's index, or null. */
|
|
25
|
+
this.openChange = new EventEmitter();
|
|
26
|
+
/** Parsed paragraphs for the template. */
|
|
27
|
+
this.paragraphs = [];
|
|
28
|
+
/** The card kept on screen, or null. */
|
|
29
|
+
this.at = null;
|
|
30
|
+
// `cur` is the open citation; `last` keeps the content while it fades out
|
|
31
|
+
this.cur = null;
|
|
32
|
+
this.last = 0;
|
|
33
|
+
this.curEl = null;
|
|
34
|
+
// the first citation button of each source, which a card opened from outside sits under
|
|
35
|
+
this.marks = new Map();
|
|
36
|
+
// whether the card should take the focus once it shows (Enter or Space), and
|
|
37
|
+
// whether a focus coming back to the citation (from Escape) should leave it shut
|
|
38
|
+
this.focusLink = false;
|
|
39
|
+
this.back = false;
|
|
40
|
+
this.ready = false;
|
|
41
|
+
this.onDown = (e) => {
|
|
42
|
+
const t = e.target;
|
|
43
|
+
if (!this.cardRef?.nativeElement.contains(t) && !t.closest?.('.vo-chx-c'))
|
|
44
|
+
this.hide(true);
|
|
45
|
+
};
|
|
46
|
+
this.onKey = (e) => {
|
|
47
|
+
const b = this.boxRef?.nativeElement;
|
|
48
|
+
if (e.key === 'Escape' && this.cur !== null && b && (b.contains(document.activeElement) || b.matches(':hover'))) {
|
|
49
|
+
e.preventDefault();
|
|
50
|
+
const to = this.cardRef?.nativeElement.contains(document.activeElement) ? this.curEl : null;
|
|
51
|
+
this.hide(true);
|
|
52
|
+
if (to) {
|
|
53
|
+
this.back = true;
|
|
54
|
+
to.focus({ preventScroll: true });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
this.onResize = () => this.hide(true);
|
|
59
|
+
}
|
|
60
|
+
/** Opens a source's card from outside (0 is the first source), or closes it with null. */
|
|
61
|
+
set open(v) {
|
|
62
|
+
this._open = v;
|
|
63
|
+
this.applyOpen();
|
|
64
|
+
}
|
|
65
|
+
get open() {
|
|
66
|
+
return this._open;
|
|
67
|
+
}
|
|
68
|
+
/** True while a card is shown (as opposed to fading out). */
|
|
69
|
+
get isOpen() {
|
|
70
|
+
return !!this.at && this.at.i >= 0;
|
|
71
|
+
}
|
|
72
|
+
/** The source whose content the card shows: the open one, or the last while it fades. */
|
|
73
|
+
get shownSource() {
|
|
74
|
+
return this.sources[this.at && this.at.i >= 0 ? this.at.i : this.last];
|
|
75
|
+
}
|
|
76
|
+
ngOnChanges(changes) {
|
|
77
|
+
if (changes['text'] || changes['sources'])
|
|
78
|
+
this.parse();
|
|
79
|
+
}
|
|
80
|
+
ngAfterViewInit() {
|
|
81
|
+
this.ready = true;
|
|
82
|
+
// record the first citation button for each source
|
|
83
|
+
const buttons = this.boxRef.nativeElement.querySelectorAll('.vo-chx-c');
|
|
84
|
+
buttons.forEach((b) => {
|
|
85
|
+
const i = Number(b.dataset['i']);
|
|
86
|
+
if (!Number.isNaN(i) && !this.marks.has(i))
|
|
87
|
+
this.marks.set(i, b);
|
|
88
|
+
});
|
|
89
|
+
document.addEventListener('pointerdown', this.onDown);
|
|
90
|
+
document.addEventListener('keydown', this.onKey);
|
|
91
|
+
addEventListener('resize', this.onResize);
|
|
92
|
+
this.applyOpen();
|
|
93
|
+
}
|
|
94
|
+
ngOnDestroy() {
|
|
95
|
+
clearTimeout(this.hideT);
|
|
96
|
+
clearTimeout(this.showT);
|
|
97
|
+
document.removeEventListener('pointerdown', this.onDown);
|
|
98
|
+
document.removeEventListener('keydown', this.onKey);
|
|
99
|
+
removeEventListener('resize', this.onResize);
|
|
100
|
+
}
|
|
101
|
+
parse() {
|
|
102
|
+
this.paragraphs = this.text.split(/\n\s*\n/).map((p) => p.split(/\[(\d+)\]/).map((seg, j) => {
|
|
103
|
+
if (j % 2) {
|
|
104
|
+
const n = Number(seg);
|
|
105
|
+
const i = n - 1;
|
|
106
|
+
return this.sources[i]
|
|
107
|
+
? { cite: true, text: String(n), i }
|
|
108
|
+
: { cite: false, text: `[${n}]`, i: -1 };
|
|
109
|
+
}
|
|
110
|
+
return { cite: false, text: seg, i: -1 };
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
label(part) {
|
|
114
|
+
const s = this.sources[part.i];
|
|
115
|
+
return s ? `Source ${part.i + 1}: ${s.title}` : '';
|
|
116
|
+
}
|
|
117
|
+
show(i, el) {
|
|
118
|
+
clearTimeout(this.hideT);
|
|
119
|
+
if (this.cur === i)
|
|
120
|
+
return;
|
|
121
|
+
const b = this.boxRef?.nativeElement;
|
|
122
|
+
const c = this.cardRef?.nativeElement;
|
|
123
|
+
if (!b || !c)
|
|
124
|
+
return;
|
|
125
|
+
const br = b.getBoundingClientRect();
|
|
126
|
+
const cr = el.getBoundingClientRect();
|
|
127
|
+
const x = Math.max(0, Math.min(cr.left - br.left - 24, br.width - c.offsetWidth));
|
|
128
|
+
this.cur = i;
|
|
129
|
+
this.curEl = el;
|
|
130
|
+
this.last = i;
|
|
131
|
+
this.openChange.emit(i);
|
|
132
|
+
// a new key restarts the entrance, so the card always rises in place instead of sliding across
|
|
133
|
+
const wasOpen = this.isOpen;
|
|
134
|
+
this.at = { i, x, y: cr.bottom - br.top + 8, n: (this.at?.n ?? 0) + 1 };
|
|
135
|
+
// when moving straight from one citation to another the vo-show class stays on,
|
|
136
|
+
// so remove it and force a reflow before it goes back on to replay the entrance
|
|
137
|
+
if (wasOpen) {
|
|
138
|
+
c.classList.remove('vo-show');
|
|
139
|
+
void c.offsetWidth;
|
|
140
|
+
c.classList.add('vo-show');
|
|
141
|
+
}
|
|
142
|
+
// opened with Enter or Space, the card takes the focus on its link once it shows
|
|
143
|
+
if (this.focusLink) {
|
|
144
|
+
this.focusLink = false;
|
|
145
|
+
requestAnimationFrame(() => this.cardRef?.nativeElement.querySelector('a')?.focus({ preventScroll: true }));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
hide(now = false) {
|
|
149
|
+
clearTimeout(this.hideT);
|
|
150
|
+
clearTimeout(this.showT);
|
|
151
|
+
const go = () => {
|
|
152
|
+
if (this.cur !== null)
|
|
153
|
+
this.openChange.emit(null);
|
|
154
|
+
this.cur = null;
|
|
155
|
+
if (this.at)
|
|
156
|
+
this.at = { ...this.at, i: -1 };
|
|
157
|
+
};
|
|
158
|
+
if (now)
|
|
159
|
+
go();
|
|
160
|
+
else
|
|
161
|
+
this.hideT = setTimeout(go, 140);
|
|
162
|
+
}
|
|
163
|
+
applyOpen() {
|
|
164
|
+
if (!this.ready || this._open === undefined)
|
|
165
|
+
return;
|
|
166
|
+
if (this._open === null) {
|
|
167
|
+
if (this.cur !== null)
|
|
168
|
+
this.hide(true);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const el = this.marks.get(this._open);
|
|
172
|
+
if (el && this.cur !== this._open)
|
|
173
|
+
this.show(this._open, el);
|
|
174
|
+
}
|
|
175
|
+
/* ---------- citation events ---------- */
|
|
176
|
+
enter(i, e) {
|
|
177
|
+
if (e.pointerType === 'touch')
|
|
178
|
+
return;
|
|
179
|
+
const el = e.currentTarget;
|
|
180
|
+
clearTimeout(this.showT);
|
|
181
|
+
clearTimeout(this.hideT);
|
|
182
|
+
this.showT = setTimeout(() => this.show(i, el), this.cur !== null ? 0 : 90);
|
|
183
|
+
}
|
|
184
|
+
leave(e) {
|
|
185
|
+
if (e.pointerType === 'touch')
|
|
186
|
+
return;
|
|
187
|
+
clearTimeout(this.showT);
|
|
188
|
+
this.hide();
|
|
189
|
+
}
|
|
190
|
+
onFocus(i, e) {
|
|
191
|
+
if (this.back) {
|
|
192
|
+
this.back = false;
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
this.show(i, e.currentTarget);
|
|
196
|
+
}
|
|
197
|
+
onBlur(e) {
|
|
198
|
+
if (!this.cardRef?.nativeElement.contains(e.relatedTarget))
|
|
199
|
+
this.hide();
|
|
200
|
+
}
|
|
201
|
+
// touch has no hover: a tap shows the card, the next tap anywhere else hides it.
|
|
202
|
+
// Enter or Space (a click with no pointer) also puts the focus on the card's link.
|
|
203
|
+
onClick(i, e) {
|
|
204
|
+
const key = e.detail === 0;
|
|
205
|
+
if (this.cur !== i) {
|
|
206
|
+
this.focusLink = key;
|
|
207
|
+
this.show(i, e.currentTarget);
|
|
208
|
+
}
|
|
209
|
+
else if (key) {
|
|
210
|
+
this.cardRef?.nativeElement.querySelector('a')?.focus({ preventScroll: true });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/* ---------- card events ---------- */
|
|
214
|
+
cardEnter() {
|
|
215
|
+
clearTimeout(this.hideT);
|
|
216
|
+
}
|
|
217
|
+
cardLeave(e) {
|
|
218
|
+
if (e.pointerType !== 'touch')
|
|
219
|
+
this.hide();
|
|
220
|
+
}
|
|
221
|
+
cardFocusOut(e) {
|
|
222
|
+
const t = e.relatedTarget;
|
|
223
|
+
if (this.cur !== null && !this.cardRef?.nativeElement.contains(t) && t !== this.curEl)
|
|
224
|
+
this.hide();
|
|
225
|
+
}
|
|
226
|
+
follow(s, e) {
|
|
227
|
+
if (!s.href)
|
|
228
|
+
e.preventDefault();
|
|
229
|
+
this.openSource.emit({ source: s, index: this.sources.indexOf(s) });
|
|
230
|
+
}
|
|
231
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CitationHoverCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
232
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CitationHoverCardComponent, isStandalone: true, selector: "vo-citation-hover-card", inputs: { text: "text", sources: "sources", openLabel: "openLabel", className: "className", open: "open" }, outputs: { openSource: "openSource", openChange: "openChange" }, viewQueries: [{ propertyName: "boxRef", first: true, predicate: ["box"], descendants: true }, { propertyName: "cardRef", first: true, predicate: ["card"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
233
|
+
<div data-vo="" #box class="vo-chx" [class]="className">
|
|
234
|
+
@for (p of paragraphs; track $index) {
|
|
235
|
+
<p class="vo-msg vo-chx-p">@for (part of p; track $index) {@if (part.cite) {<button
|
|
236
|
+
type="button"
|
|
237
|
+
class="vo-chx-c"
|
|
238
|
+
[class.vo-on]="isOpen && at!.i === part.i"
|
|
239
|
+
[attr.data-i]="part.i"
|
|
240
|
+
[attr.aria-label]="label(part)"
|
|
241
|
+
(pointerenter)="enter(part.i, $event)"
|
|
242
|
+
(pointerleave)="leave($event)"
|
|
243
|
+
(focus)="onFocus(part.i, $event)"
|
|
244
|
+
(blur)="onBlur($event)"
|
|
245
|
+
(click)="onClick(part.i, $event)"
|
|
246
|
+
>{{ part.text }}</button>} @else {{{ part.text }}}}</p>
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
<div
|
|
250
|
+
#card
|
|
251
|
+
class="vo-chx-card vo-panel"
|
|
252
|
+
[class.vo-show]="isOpen"
|
|
253
|
+
role="dialog"
|
|
254
|
+
aria-label="Source"
|
|
255
|
+
[style.left.px]="at?.x ?? 0"
|
|
256
|
+
[style.top.px]="at?.y ?? 0"
|
|
257
|
+
(pointerenter)="cardEnter()"
|
|
258
|
+
(pointerleave)="cardLeave($event)"
|
|
259
|
+
(focusout)="cardFocusOut($event)"
|
|
260
|
+
>
|
|
261
|
+
@if (shownSource; as s) {
|
|
262
|
+
<div class="vo-chx-in">
|
|
263
|
+
<div class="vo-chx-sh">
|
|
264
|
+
<span class="vo-fv" [style.background]="s.color">{{ s.mark }}</span>
|
|
265
|
+
<span>{{ s.site }}</span>
|
|
266
|
+
</div>
|
|
267
|
+
<div class="vo-chx-t">{{ s.title }}</div>
|
|
268
|
+
<div class="vo-chx-q" [innerHTML]="s.quote"></div>
|
|
269
|
+
<div class="vo-chx-f">
|
|
270
|
+
<span>{{ s.meta }}</span>
|
|
271
|
+
<a
|
|
272
|
+
[attr.href]="s.href ?? '#'"
|
|
273
|
+
[attr.target]="s.href ? '_blank' : null"
|
|
274
|
+
rel="noreferrer"
|
|
275
|
+
(click)="follow(s, $event)"
|
|
276
|
+
>{{ openLabel }} <vo-icon name="ext" size="xs"></vo-icon></a
|
|
277
|
+
>
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
}
|
|
281
|
+
</div>
|
|
282
|
+
</div>
|
|
283
|
+
`, isInline: true, styles: [".vo-chx{position:relative;overflow:visible;padding-bottom:150px}.vo-chx-p{line-height:1.8}.vo-chx-c{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;margin:0 1px 0 3px;border-radius:calc(6px * var(--vo-rk));background:var(--vo-hover);color:var(--vo-fg2);font-size:11px;font-variant-numeric:tabular-nums;vertical-align:2px;transition:background .2s,color .2s;border:0;cursor:pointer;font-family:inherit}.vo-chx-c.vo-on{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-chx-c:hover{background:var(--vo-accent);color:var(--vo-on-accent)}}.vo-chx-card{position:absolute;left:0;top:0;width:min(290px,calc(100% - 8px));padding:var(--vo-s-3);opacity:0;visibility:hidden;pointer-events:none;z-index:4;box-shadow:var(--vo-shadow-pop);transform-origin:50% 0;transition:opacity .16s ease-out,visibility 0s .16s}.vo-chx-card.vo-show{opacity:1;visibility:visible;pointer-events:auto;animation:vo-chxin .5s var(--vo-ease) both;transition-property:opacity}@keyframes vo-chxin{0%{opacity:0;transform:translateY(10px) scale(.985);filter:blur(3px)}60%{filter:blur(0)}to{opacity:1;transform:none;filter:none}}.vo-chx-sh{display:flex;align-items:center;gap:var(--vo-s-2);font-size:12px;color:var(--vo-muted)}.vo-chx-sh .vo-fv{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:9px;font-weight:500;color:#fff;flex:none}.vo-chx-t{font-size:13px;font-weight:500;margin:var(--vo-s-2) 0 6px}.vo-chx-q{font-size:12.5px;line-height:1.55;color:var(--vo-fg2);padding-left:10px;box-shadow:inset 2px 0 0 var(--vo-accent-mark,var(--vo-accent))}.vo-chx-q mark{background:var(--vo-sel);color:var(--vo-fg);border-radius:3px;padding:0 2px}.vo-chx-f{display:flex;align-items:center;justify-content:space-between;margin-top:10px;font-size:12px;color:var(--vo-muted)}.vo-chx-f a{color:var(--vo-accent-fg,var(--vo-accent));display:inline-flex;align-items:center;gap:var(--vo-s-1);text-decoration:none}@media (hover:hover) and (pointer:fine){.vo-chx-f a:hover{text-decoration:underline;text-underline-offset:2px}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
284
|
+
}
|
|
285
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CitationHoverCardComponent, decorators: [{
|
|
286
|
+
type: Component,
|
|
287
|
+
args: [{ selector: 'vo-citation-hover-card', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
288
|
+
<div data-vo="" #box class="vo-chx" [class]="className">
|
|
289
|
+
@for (p of paragraphs; track $index) {
|
|
290
|
+
<p class="vo-msg vo-chx-p">@for (part of p; track $index) {@if (part.cite) {<button
|
|
291
|
+
type="button"
|
|
292
|
+
class="vo-chx-c"
|
|
293
|
+
[class.vo-on]="isOpen && at!.i === part.i"
|
|
294
|
+
[attr.data-i]="part.i"
|
|
295
|
+
[attr.aria-label]="label(part)"
|
|
296
|
+
(pointerenter)="enter(part.i, $event)"
|
|
297
|
+
(pointerleave)="leave($event)"
|
|
298
|
+
(focus)="onFocus(part.i, $event)"
|
|
299
|
+
(blur)="onBlur($event)"
|
|
300
|
+
(click)="onClick(part.i, $event)"
|
|
301
|
+
>{{ part.text }}</button>} @else {{{ part.text }}}}</p>
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
<div
|
|
305
|
+
#card
|
|
306
|
+
class="vo-chx-card vo-panel"
|
|
307
|
+
[class.vo-show]="isOpen"
|
|
308
|
+
role="dialog"
|
|
309
|
+
aria-label="Source"
|
|
310
|
+
[style.left.px]="at?.x ?? 0"
|
|
311
|
+
[style.top.px]="at?.y ?? 0"
|
|
312
|
+
(pointerenter)="cardEnter()"
|
|
313
|
+
(pointerleave)="cardLeave($event)"
|
|
314
|
+
(focusout)="cardFocusOut($event)"
|
|
315
|
+
>
|
|
316
|
+
@if (shownSource; as s) {
|
|
317
|
+
<div class="vo-chx-in">
|
|
318
|
+
<div class="vo-chx-sh">
|
|
319
|
+
<span class="vo-fv" [style.background]="s.color">{{ s.mark }}</span>
|
|
320
|
+
<span>{{ s.site }}</span>
|
|
321
|
+
</div>
|
|
322
|
+
<div class="vo-chx-t">{{ s.title }}</div>
|
|
323
|
+
<div class="vo-chx-q" [innerHTML]="s.quote"></div>
|
|
324
|
+
<div class="vo-chx-f">
|
|
325
|
+
<span>{{ s.meta }}</span>
|
|
326
|
+
<a
|
|
327
|
+
[attr.href]="s.href ?? '#'"
|
|
328
|
+
[attr.target]="s.href ? '_blank' : null"
|
|
329
|
+
rel="noreferrer"
|
|
330
|
+
(click)="follow(s, $event)"
|
|
331
|
+
>{{ openLabel }} <vo-icon name="ext" size="xs"></vo-icon></a
|
|
332
|
+
>
|
|
333
|
+
</div>
|
|
334
|
+
</div>
|
|
335
|
+
}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
`, styles: [".vo-chx{position:relative;overflow:visible;padding-bottom:150px}.vo-chx-p{line-height:1.8}.vo-chx-c{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;margin:0 1px 0 3px;border-radius:calc(6px * var(--vo-rk));background:var(--vo-hover);color:var(--vo-fg2);font-size:11px;font-variant-numeric:tabular-nums;vertical-align:2px;transition:background .2s,color .2s;border:0;cursor:pointer;font-family:inherit}.vo-chx-c.vo-on{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-chx-c:hover{background:var(--vo-accent);color:var(--vo-on-accent)}}.vo-chx-card{position:absolute;left:0;top:0;width:min(290px,calc(100% - 8px));padding:var(--vo-s-3);opacity:0;visibility:hidden;pointer-events:none;z-index:4;box-shadow:var(--vo-shadow-pop);transform-origin:50% 0;transition:opacity .16s ease-out,visibility 0s .16s}.vo-chx-card.vo-show{opacity:1;visibility:visible;pointer-events:auto;animation:vo-chxin .5s var(--vo-ease) both;transition-property:opacity}@keyframes vo-chxin{0%{opacity:0;transform:translateY(10px) scale(.985);filter:blur(3px)}60%{filter:blur(0)}to{opacity:1;transform:none;filter:none}}.vo-chx-sh{display:flex;align-items:center;gap:var(--vo-s-2);font-size:12px;color:var(--vo-muted)}.vo-chx-sh .vo-fv{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;font-size:9px;font-weight:500;color:#fff;flex:none}.vo-chx-t{font-size:13px;font-weight:500;margin:var(--vo-s-2) 0 6px}.vo-chx-q{font-size:12.5px;line-height:1.55;color:var(--vo-fg2);padding-left:10px;box-shadow:inset 2px 0 0 var(--vo-accent-mark,var(--vo-accent))}.vo-chx-q mark{background:var(--vo-sel);color:var(--vo-fg);border-radius:3px;padding:0 2px}.vo-chx-f{display:flex;align-items:center;justify-content:space-between;margin-top:10px;font-size:12px;color:var(--vo-muted)}.vo-chx-f a{color:var(--vo-accent-fg,var(--vo-accent));display:inline-flex;align-items:center;gap:var(--vo-s-1);text-decoration:none}@media (hover:hover) and (pointer:fine){.vo-chx-f a:hover{text-decoration:underline;text-underline-offset:2px}}\n"] }]
|
|
339
|
+
}], propDecorators: { text: [{
|
|
340
|
+
type: Input
|
|
341
|
+
}], sources: [{
|
|
342
|
+
type: Input
|
|
343
|
+
}], openLabel: [{
|
|
344
|
+
type: Input
|
|
345
|
+
}], className: [{
|
|
346
|
+
type: Input
|
|
347
|
+
}], open: [{
|
|
348
|
+
type: Input
|
|
349
|
+
}], openSource: [{
|
|
350
|
+
type: Output
|
|
351
|
+
}], openChange: [{
|
|
352
|
+
type: Output
|
|
353
|
+
}], boxRef: [{
|
|
354
|
+
type: ViewChild,
|
|
355
|
+
args: ['box']
|
|
356
|
+
}], cardRef: [{
|
|
357
|
+
type: ViewChild,
|
|
358
|
+
args: ['card']
|
|
359
|
+
}] } });
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0YXRpb24taG92ZXItY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jaXRhdGlvbi1ob3Zlci1jYXJkL2NpdGF0aW9uLWhvdmVyLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlFQUF5RTtBQUN6RSxFQUFFO0FBQ0Ysb0ZBQW9GO0FBQ3BGLGlGQUFpRjtBQUNqRixpRkFBaUY7QUFDakYsaUZBQWlGO0FBQ2pGLG1GQUFtRjtBQUNuRiwyRUFBMkU7QUFDM0UsRUFBRTtBQUNGLGdGQUFnRjtBQUVoRixPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQW9DekQsd0hBQXdIO0FBNER4SCxNQUFNLE9BQU8sMEJBQTBCO0lBM0R2QztRQTRERSw2RUFBNkU7UUFDcEUsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFlBQU8sR0FBOEIsRUFBRSxDQUFDO1FBQ2pELHFDQUFxQztRQUM1QixjQUFTLEdBQUcsYUFBYSxDQUFDO1FBY25DLDZFQUE2RTtRQUNuRSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXNELENBQUM7UUFDOUYsNEVBQTRFO1FBQ2xFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUt6RCwwQ0FBMEM7UUFDMUMsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQix3Q0FBd0M7UUFDeEMsT0FBRSxHQUFpQixJQUFJLENBQUM7UUFDeEIsMEVBQTBFO1FBQ2xFLFFBQUcsR0FBa0IsSUFBSSxDQUFDO1FBQzFCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFDVCxVQUFLLEdBQXVCLElBQUksQ0FBQztRQUN6Qyx3RkFBd0Y7UUFDaEYsVUFBSyxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFD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QkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVXLE1BQU07c0JBQXZCLFNBQVM7dUJBQUMsS0FBSztnQkFDRyxPQUFPO3NCQUF6QixTQUFTO3VCQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmcmFtZXdvcmsvYW5ndWxhci9jaXRhdGlvbi1ob3Zlci1jYXJkL2NpdGF0aW9uLWhvdmVyLWNhcmQuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvY2l0YXRpb24taG92ZXItY2FyZC9DaXRhdGlvbkhvdmVyQ2FyZC50c3guXG4vLyBBbiBhbnN3ZXIgd2l0aCBudW1iZXJlZCBjaXRhdGlvbnM6IGhvdmVyaW5nLCBmb2N1c2luZyBvciB0YXBwaW5nIG9uZSBzaG93cyBpdHNcbi8vIHNvdXJjZSBpbiBhIHNtYWxsIGNhcmQgdW5kZXJuZWF0aCB0aGF0IHJpc2VzIGluIHBsYWNlLiBJbnB1dHMgbWlycm9yIHRoZSBSZWFjdFxuLy8gcHJvcHM7IFJlYWN0IGNhbGxiYWNrcyBiZWNvbWUgQE91dHB1dCgpIEV2ZW50RW1pdHRlcnMuIFRoZSBob3Zlci9mb2N1cy90YXAgYW5kXG4vLyBwb3NpdGlvbmluZyBiZWhhdmlvdXIgaXMgcG9ydGVkIGZyb20gdGhlIFZhbmlsbGEgY2l0YXRpb24taG92ZXItY2FyZC5qcyBhbmQga2VwdFxuLy8gaW5zaWRlIHRoZSBjb21wb25lbnQgKHNldHVwIGluIG5nQWZ0ZXJWaWV3SW5pdCwgY2xlYW51cCBpbiBuZ09uRGVzdHJveSkuXG4vL1xuLy8gSWNvbnM6IHRoZSBjYXJkJ3MgbGluayB1c2VzIHRoZSAnZXh0JyBpY29uIChvcGVuIGV4dGVybmFsKSwgYXMgaW4gdGhlIHNvdXJjZS5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuXG4vKiogT25lIHNvdXJjZSBiZWhpbmQgYSBjaXRhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2l0YXRpb25Ib3ZlckNhcmRTb3VyY2Uge1xuICAvKiogT25lIG9yIHR3byBsZXR0ZXJzIG9uIHRoZSBzb3VyY2UncyBjb2xvdXJlZCBtYXJrLCBsaWtlIFwiQlwiLiAqL1xuICBtYXJrOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWFyaydzIGNvbG91ciwgbGlrZSAnIzRhNWE4YScgb3IgJ3ZhcigtLXZvLXBtKScuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBXaGVyZSBpdCBjb21lcyBmcm9tLCBsaWtlIFwiYmF5bWFyZC5jb21cIiBvciBcIkRyaXZlXCIuICovXG4gIHNpdGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIFRoZSBwYXNzYWdlIHRoZSBhbnN3ZXIgcmVsaWVzIG9uLiBXcmFwIHRoZSBwYXJ0IHRoYXQgbWF0dGVycyBpbiA8bWFyaz7igKY8L21hcms+LiAqL1xuICBxdW90ZTogc3RyaW5nO1xuICAvKiogVGhlIHF1aWV0IGxpbmUgaW4gdGhlIGNvcm5lciwgbGlrZSBcIlJlYWQgNCBkYXlzIGFnb1wiLiAqL1xuICBtZXRhPzogc3RyaW5nO1xuICAvKiogT3BlbnMgaW4gYSBuZXcgdGFiIGZyb20gdGhlIGNhcmQncyBsaW5rLiAqL1xuICBocmVmPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIHBhcnNlZCBwaWVjZXMgb2Ygb25lIHBhcmFncmFwaDogdGV4dCBydW5zIGFuZCBjaXRhdGlvbiBudW1iZXJzLiAqL1xuaW50ZXJmYWNlIFBhcnQge1xuICBjaXRlOiBib29sZWFuO1xuICAvKiogVGhlIHRleHQgZm9yIGEgcGxhaW4gcnVuLCBvciB0aGUgY2l0YXRpb24gbnVtYmVyIGZvciBhIGNpdGUuICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIFRoZSBzb3VyY2UgaW5kZXggKG51bWJlciDiiJIgMSkgZm9yIGEgY2l0ZSwgb3Ig4oiSMSB3aGVuIHRoZXJlIGlzIG5vIHN1Y2ggc291cmNlLiAqL1xuICBpOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgY2FyZCBrZXB0IG9uIHNjcmVlbiwgd2l0aCBpdHMgcmVzdGFydCBrZXkgYW5kIHBsYWNlbWVudC4gKi9cbmludGVyZmFjZSBTaG93biB7XG4gIGk6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIG46IG51bWJlcjtcbn1cblxuLyoqIEFuIGFuc3dlciB3aXRoIG51bWJlcmVkIGNpdGF0aW9ucy4gSG92ZXJpbmcsIGZvY3VzaW5nIG9yIHRhcHBpbmcgb25lIHNob3dzIGl0cyBzb3VyY2UgaW4gYSBzbWFsbCBjYXJkIHVuZGVybmVhdGguICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1jaXRhdGlvbi1ob3Zlci1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBkYXRhLXZvPVwiXCIgI2JveCBjbGFzcz1cInZvLWNoeFwiIFtjbGFzc109XCJjbGFzc05hbWVcIj5cbiAgICAgIEBmb3IgKHAgb2YgcGFyYWdyYXBoczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxwIGNsYXNzPVwidm8tbXNnIHZvLWNoeC1wXCI+QGZvciAocGFydCBvZiBwOyB0cmFjayAkaW5kZXgpIHtAaWYgKHBhcnQuY2l0ZSkgezxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tY2h4LWNcIlxuICAgICAgICAgICAgICBbY2xhc3Mudm8tb25dPVwiaXNPcGVuICYmIGF0IS5pID09PSBwYXJ0LmlcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWldPVwicGFydC5pXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbChwYXJ0KVwiXG4gICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwiZW50ZXIocGFydC5pLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHBvaW50ZXJsZWF2ZSk9XCJsZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMocGFydC5pLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGljayhwYXJ0LmksICRldmVudClcIlxuICAgICAgICAgICAgPnt7IHBhcnQudGV4dCB9fTwvYnV0dG9uPn0gQGVsc2Uge3t7IHBhcnQudGV4dCB9fX19PC9wPlxuICAgICAgfVxuXG4gICAgICA8ZGl2XG4gICAgICAgICNjYXJkXG4gICAgICAgIGNsYXNzPVwidm8tY2h4LWNhcmQgdm8tcGFuZWxcIlxuICAgICAgICBbY2xhc3Mudm8tc2hvd109XCJpc09wZW5cIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNvdXJjZVwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImF0Py54ID8/IDBcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cImF0Py55ID8/IDBcIlxuICAgICAgICAocG9pbnRlcmVudGVyKT1cImNhcmRFbnRlcigpXCJcbiAgICAgICAgKHBvaW50ZXJsZWF2ZSk9XCJjYXJkTGVhdmUoJGV2ZW50KVwiXG4gICAgICAgIChmb2N1c291dCk9XCJjYXJkRm9jdXNPdXQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIEBpZiAoc2hvd25Tb3VyY2U7IGFzIHMpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tY2h4LWluXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tY2h4LXNoXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZnZcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJzLmNvbG9yXCI+e3sgcy5tYXJrIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBzLnNpdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1jaHgtdFwiPnt7IHMudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1jaHgtcVwiIFtpbm5lckhUTUxdPVwicy5xdW90ZVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWNoeC1mXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHMubWV0YSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cInMuaHJlZiA/PyAnIydcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJzLmhyZWYgPyAnX2JsYW5rJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgIHJlbD1cIm5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb2xsb3cocywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPnt7IG9wZW5MYWJlbCB9fSA8dm8taWNvbiBuYW1lPVwiZXh0XCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvYVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9jaXRhdGlvbi1ob3Zlci1jYXJkLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIENpdGF0aW9uSG92ZXJDYXJkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIGFuc3dlci4gYFtuXWAgY2l0ZXMgc291cmNlIG47IGEgYmxhbmsgbGluZSBzdGFydHMgYSBuZXcgcGFyYWdyYXBoLiAqL1xuICBASW5wdXQoKSB0ZXh0ID0gJyc7XG4gIEBJbnB1dCgpIHNvdXJjZXM6IENpdGF0aW9uSG92ZXJDYXJkU291cmNlW10gPSBbXTtcbiAgLyoqIFRoZSBsaW5rIGluIHRoZSBjYXJkJ3MgY29ybmVyLiAqL1xuICBASW5wdXQoKSBvcGVuTGFiZWwgPSAnT3BlbiBzb3VyY2UnO1xuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfb3BlbjogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgLyoqIE9wZW5zIGEgc291cmNlJ3MgY2FyZCBmcm9tIG91dHNpZGUgKDAgaXMgdGhlIGZpcnN0IHNvdXJjZSksIG9yIGNsb3NlcyBpdCB3aXRoIG51bGwuICovXG4gIEBJbnB1dCgpXG4gIHNldCBvcGVuKHY6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9vcGVuID0gdjtcbiAgICB0aGlzLmFwcGx5T3BlbigpO1xuICB9XG4gIGdldCBvcGVuKCk6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9vcGVuO1xuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIHRoZSBjYXJkJ3MgbGluayBpcyBjbGlja2VkLCB3aXRoIHRoZSBzb3VyY2UgYW5kIGl0cyBpbmRleC4gKi9cbiAgQE91dHB1dCgpIG9wZW5Tb3VyY2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc291cmNlOiBDaXRhdGlvbkhvdmVyQ2FyZFNvdXJjZTsgaW5kZXg6IG51bWJlciB9PigpO1xuICAvKiogQ2FsbGVkIHdoZW4gYSBjYXJkIG9wZW5zIG9yIGNsb3Nlcywgd2l0aCB0aGUgc291cmNlJ3MgaW5kZXgsIG9yIG51bGwuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2JveCcpIGJveFJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjYXJkJykgY2FyZFJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIC8qKiBQYXJzZWQgcGFyYWdyYXBocyBmb3IgdGhlIHRlbXBsYXRlLiAqL1xuICBwYXJhZ3JhcGhzOiBQYXJ0W11bXSA9IFtdO1xuICAvKiogVGhlIGNhcmQga2VwdCBvbiBzY3JlZW4sIG9yIG51bGwuICovXG4gIGF0OiBTaG93biB8IG51bGwgPSBudWxsO1xuICAvLyBgY3VyYCBpcyB0aGUgb3BlbiBjaXRhdGlvbjsgYGxhc3RgIGtlZXBzIHRoZSBjb250ZW50IHdoaWxlIGl0IGZhZGVzIG91dFxuICBwcml2YXRlIGN1cjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdCA9IDA7XG4gIHByaXZhdGUgY3VyRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIC8vIHRoZSBmaXJzdCBjaXRhdGlvbiBidXR0b24gb2YgZWFjaCBzb3VyY2UsIHdoaWNoIGEgY2FyZCBvcGVuZWQgZnJvbSBvdXRzaWRlIHNpdHMgdW5kZXJcbiAgcHJpdmF0ZSBtYXJrcyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MQnV0dG9uRWxlbWVudD4oKTtcbiAgcHJpdmF0ZSBzaG93VD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGhpZGVUPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIC8vIHdoZXRoZXIgdGhlIGNhcmQgc2hvdWxkIHRha2UgdGhlIGZvY3VzIG9uY2UgaXQgc2hvd3MgKEVudGVyIG9yIFNwYWNlKSwgYW5kXG4gIC8vIHdoZXRoZXIgYSBmb2N1cyBjb21pbmcgYmFjayB0byB0aGUgY2l0YXRpb24gKGZyb20gRXNjYXBlKSBzaG91bGQgbGVhdmUgaXQgc2h1dFxuICBwcml2YXRlIGZvY3VzTGluayA9IGZhbHNlO1xuICBwcml2YXRlIGJhY2sgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25Eb3duID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBFbGVtZW50O1xuICAgIGlmICghdGhpcy5jYXJkUmVmPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpICYmICF0LmNsb3Nlc3Q/LignLnZvLWNoeC1jJykpIHRoaXMuaGlkZSh0cnVlKTtcbiAgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbktleSA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgYiA9IHRoaXMuYm94UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5jdXIgIT09IG51bGwgJiYgYiAmJiAoYi5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB8fCBiLm1hdGNoZXMoJzpob3ZlcicpKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdG8gPSB0aGlzLmNhcmRSZWY/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgPyB0aGlzLmN1ckVsIDogbnVsbDtcbiAgICAgIHRoaXMuaGlkZSh0cnVlKTtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLmJhY2sgPSB0cnVlO1xuICAgICAgICB0by5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVzaXplID0gKCkgPT4gdGhpcy5oaWRlKHRydWUpO1xuXG4gIC8qKiBUcnVlIHdoaWxlIGEgY2FyZCBpcyBzaG93biAoYXMgb3Bwb3NlZCB0byBmYWRpbmcgb3V0KS4gKi9cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmF0ICYmIHRoaXMuYXQuaSA+PSAwO1xuICB9XG5cbiAgLyoqIFRoZSBzb3VyY2Ugd2hvc2UgY29udGVudCB0aGUgY2FyZCBzaG93czogdGhlIG9wZW4gb25lLCBvciB0aGUgbGFzdCB3aGlsZSBpdCBmYWRlcy4gKi9cbiAgZ2V0IHNob3duU291cmNlKCk6IENpdGF0aW9uSG92ZXJDYXJkU291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzW3RoaXMuYXQgJiYgdGhpcy5hdC5pID49IDAgPyB0aGlzLmF0LmkgOiB0aGlzLmxhc3RdO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZXh0J10gfHwgY2hhbmdlc1snc291cmNlcyddKSB0aGlzLnBhcnNlKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgLy8gcmVjb3JkIHRoZSBmaXJzdCBjaXRhdGlvbiBidXR0b24gZm9yIGVhY2ggc291cmNlXG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuYm94UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJy52by1jaHgtYycpO1xuICAgIGJ1dHRvbnMuZm9yRWFjaCgoYikgPT4ge1xuICAgICAgY29uc3QgaSA9IE51bWJlcihiLmRhdGFzZXRbJ2knXSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihpKSAmJiAhdGhpcy5tYXJrcy5oYXMoaSkpIHRoaXMubWFya3Muc2V0KGksIGIpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbkRvd24pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5KTtcbiAgICBhZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcbiAgICB0aGlzLmFwcGx5T3BlbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Eb3duKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleSk7XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlKCk6IHZvaWQge1xuICAgIHRoaXMucGFyYWdyYXBocyA9IHRoaXMudGV4dC5zcGxpdCgvXFxuXFxzKlxcbi8pLm1hcCgocCkgPT5cbiAgICAgIHAuc3BsaXQoL1xcWyhcXGQrKVxcXS8pLm1hcCgoc2VnLCBqKTogUGFydCA9PiB7XG4gICAgICAgIGlmIChqICUgMikge1xuICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIoc2VnKTtcbiAgICAgICAgICBjb25zdCBpID0gbiAtIDE7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc1tpXVxuICAgICAgICAgICAgPyB7IGNpdGU6IHRydWUsIHRleHQ6IFN0cmluZyhuKSwgaSB9XG4gICAgICAgICAgICA6IHsgY2l0ZTogZmFsc2UsIHRleHQ6IGBbJHtufV1gLCBpOiAtMSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNpdGU6IGZhbHNlLCB0ZXh0OiBzZWcsIGk6IC0xIH07XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbGFiZWwocGFydDogUGFydCk6IHN0cmluZyB7XG4gICAgY29uc3QgcyA9IHRoaXMuc291cmNlc1twYXJ0LmldO1xuICAgIHJldHVybiBzID8gYFNvdXJjZSAke3BhcnQuaSArIDF9OiAke3MudGl0bGV9YCA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93KGk6IG51bWJlciwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVQpO1xuICAgIGlmICh0aGlzLmN1ciA9PT0gaSkgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLmJveFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBjID0gdGhpcy5jYXJkUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghYiB8fCAhYykgcmV0dXJuO1xuICAgIGNvbnN0IGJyID0gYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjci5sZWZ0IC0gYnIubGVmdCAtIDI0LCBici53aWR0aCAtIGMub2Zmc2V0V2lkdGgpKTtcbiAgICB0aGlzLmN1ciA9IGk7XG4gICAgdGhpcy5jdXJFbCA9IGVsO1xuICAgIHRoaXMubGFzdCA9IGk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoaSk7XG4gICAgLy8gYSBuZXcga2V5IHJlc3RhcnRzIHRoZSBlbnRyYW5jZSwgc28gdGhlIGNhcmQgYWx3YXlzIHJpc2VzIGluIHBsYWNlIGluc3RlYWQgb2Ygc2xpZGluZyBhY3Jvc3NcbiAgICBjb25zdCB3YXNPcGVuID0gdGhpcy5pc09wZW47XG4gICAgdGhpcy5hdCA9IHsgaSwgeCwgeTogY3IuYm90dG9tIC0gYnIudG9wICsgOCwgbjogKHRoaXMuYXQ/Lm4gPz8gMCkgKyAxIH07XG4gICAgLy8gd2hlbiBtb3Zpbmcgc3RyYWlnaHQgZnJvbSBvbmUgY2l0YXRpb24gdG8gYW5vdGhlciB0aGUgdm8tc2hvdyBjbGFzcyBzdGF5cyBvbixcbiAgICAvLyBzbyByZW1vdmUgaXQgYW5kIGZvcmNlIGEgcmVmbG93IGJlZm9yZSBpdCBnb2VzIGJhY2sgb24gdG8gcmVwbGF5IHRoZSBlbnRyYW5jZVxuICAgIGlmICh3YXNPcGVuKSB7XG4gICAgICBjLmNsYXNzTGlzdC5yZW1vdmUoJ3ZvLXNob3cnKTtcbiAgICAgIHZvaWQgYy5vZmZzZXRXaWR0aDtcbiAgICAgIGMuY2xhc3NMaXN0LmFkZCgndm8tc2hvdycpO1xuICAgIH1cbiAgICAvLyBvcGVuZWQgd2l0aCBFbnRlciBvciBTcGFjZSwgdGhlIGNhcmQgdGFrZXMgdGhlIGZvY3VzIG9uIGl0cyBsaW5rIG9uY2UgaXQgc2hvd3NcbiAgICBpZiAodGhpcy5mb2N1c0xpbmspIHtcbiAgICAgIHRoaXMuZm9jdXNMaW5rID0gZmFsc2U7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT5cbiAgICAgICAgdGhpcy5jYXJkUmVmPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdhJyk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoaWRlKG5vdyA9IGZhbHNlKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUKTtcbiAgICBjb25zdCBnbyA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1ciAhPT0gbnVsbCkgdGhpcy5vcGVuQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgICB0aGlzLmN1ciA9IG51bGw7XG4gICAgICBpZiAodGhpcy5hdCkgdGhpcy5hdCA9IHsgLi4udGhpcy5hdCwgaTogLTEgfTtcbiAgICB9O1xuICAgIGlmIChub3cpIGdvKCk7XG4gICAgZWxzZSB0aGlzLmhpZGVUID0gc2V0VGltZW91dChnbywgMTQwKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlPcGVuKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWFkeSB8fCB0aGlzLl9vcGVuID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5fb3BlbiA9PT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuY3VyICE9PSBudWxsKSB0aGlzLmhpZGUodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVsID0gdGhpcy5tYXJrcy5nZXQodGhpcy5fb3Blbik7XG4gICAgaWYgKGVsICYmIHRoaXMuY3VyICE9PSB0aGlzLl9vcGVuKSB0aGlzLnNob3codGhpcy5fb3BlbiwgZWwpO1xuICB9XG5cbiAgLyogLS0tLS0tLS0tLSBjaXRhdGlvbiBldmVudHMgLS0tLS0tLS0tLSAqL1xuXG4gIGVudGVyKGk6IG51bWJlciwgZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUucG9pbnRlclR5cGUgPT09ICd0b3VjaCcpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93VCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVQpO1xuICAgIHRoaXMuc2hvd1QgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvdyhpLCBlbCksIHRoaXMuY3VyICE9PSBudWxsID8gMCA6IDkwKTtcbiAgfVxuXG4gIGxlYXZlKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLnBvaW50ZXJUeXBlID09PSAndG91Y2gnKSByZXR1cm47XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd1QpO1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgb25Gb2N1cyhpOiBudW1iZXIsIGU6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYWNrKSB7XG4gICAgICB0aGlzLmJhY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93KGksIGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gIH1cblxuICBvbkJsdXIoZTogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYXJkUmVmPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgdGhpcy5oaWRlKCk7XG4gIH1cblxuICAvLyB0b3VjaCBoYXMgbm8gaG92ZXI6IGEgdGFwIHNob3dzIHRoZSBjYXJkLCB0aGUgbmV4dCB0YXAgYW55d2hlcmUgZWxzZSBoaWRlcyBpdC5cbiAgLy8gRW50ZXIgb3IgU3BhY2UgKGEgY2xpY2sgd2l0aCBubyBwb2ludGVyKSBhbHNvIHB1dHMgdGhlIGZvY3VzIG9uIHRoZSBjYXJkJ3MgbGluay5cbiAgb25DbGljayhpOiBudW1iZXIsIGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBlLmRldGFpbCA9PT0gMDtcbiAgICBpZiAodGhpcy5jdXIgIT09IGkpIHtcbiAgICAgIHRoaXMuZm9jdXNMaW5rID0ga2V5O1xuICAgICAgdGhpcy5zaG93KGksIGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChrZXkpIHtcbiAgICAgIHRoaXMuY2FyZFJlZj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYScpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0tLS0tLS0tLSBjYXJkIGV2ZW50cyAtLS0tLS0tLS0tICovXG5cbiAgY2FyZEVudGVyKCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUKTtcbiAgfVxuXG4gIGNhcmRMZWF2ZShlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gJ3RvdWNoJykgdGhpcy5oaWRlKCk7XG4gIH1cblxuICBjYXJkRm9jdXNPdXQoZTogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHQgPSBlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSB8IG51bGw7XG4gICAgaWYgKHRoaXMuY3VyICE9PSBudWxsICYmICF0aGlzLmNhcmRSZWY/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgJiYgdCAhPT0gdGhpcy5jdXJFbCkgdGhpcy5oaWRlKCk7XG4gIH1cblxuICBmb2xsb3coczogQ2l0YXRpb25Ib3ZlckNhcmRTb3VyY2UsIGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXMuaHJlZikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3BlblNvdXJjZS5lbWl0KHsgc291cmNlOiBzLCBpbmRleDogdGhpcy5zb3VyY2VzLmluZGV4T2YocykgfSk7XG4gIH1cbn1cbiJdfQ==
|