@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,341 @@
|
|
|
1
|
+
// framework/angular/design-tuner/design-tuner.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/design-tuner/DesignTuner.tsx.
|
|
4
|
+
// A live preview beside a few sliders, with a button that hands the tuning to the
|
|
5
|
+
// agent. Drag a slider (or arrow-key it) to tweak the sample card by hand, or press
|
|
6
|
+
// the button to let the agent tween every value to a target, drop a note on what it
|
|
7
|
+
// changed, and flip the targets for the next run. Inputs mirror the React props.
|
|
8
|
+
//
|
|
9
|
+
// Icons: the React source uses a "wand" glyph for the agent button; the Angular
|
|
10
|
+
// icon set has no wand, so the closest magic/agent glyph "spark" is substituted.
|
|
11
|
+
// "check" is used unchanged for the sample card's feature list.
|
|
12
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, inject, } from '@angular/core';
|
|
13
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
14
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
const PARAMS = [
|
|
17
|
+
{ key: 'rad', label: 'Radius', min: 0, max: 28, value: 16, unit: 'px' },
|
|
18
|
+
{ key: 'pad', label: 'Padding', min: 8, max: 32, value: 18, unit: 'px' },
|
|
19
|
+
{ key: 'gap', label: 'Spacing', min: 4, max: 24, value: 12, unit: 'px' },
|
|
20
|
+
{ key: 'sh', label: 'Shadow', min: 0, max: 0.2, value: 0.08, decimals: 2 },
|
|
21
|
+
];
|
|
22
|
+
// the agent's first target per key, and the value it flips to on the next run
|
|
23
|
+
const TARGETS = {
|
|
24
|
+
rad: [20, 12],
|
|
25
|
+
pad: [24, 20],
|
|
26
|
+
gap: [14, 10],
|
|
27
|
+
sh: [0.05, 0.1],
|
|
28
|
+
};
|
|
29
|
+
const clamp = (p, v) => Math.max(p.min, Math.min(p.max, v));
|
|
30
|
+
export class DesignTunerComponent {
|
|
31
|
+
constructor() {
|
|
32
|
+
/** The sliders. Defaults to radius, padding, spacing and shadow for the sample card. */
|
|
33
|
+
this.params = PARAMS;
|
|
34
|
+
/** What is being tuned, like "Pricing card". */
|
|
35
|
+
this.title = 'Pricing card';
|
|
36
|
+
/** Quiet line beside the title, like "Edited by you" or "Agent is tuning". */
|
|
37
|
+
this.status = 'Edited by you';
|
|
38
|
+
/** The button's label, like "Tune with agent" or "Tune again". */
|
|
39
|
+
this.actionLabel = 'Tune with agent';
|
|
40
|
+
/** The preview lets the agent tune once on its own after a beat. Set false to turn that off. */
|
|
41
|
+
this.auto = true;
|
|
42
|
+
/** Emitted with the values by key whenever a slider or the agent moves one. */
|
|
43
|
+
this.valuesChange = new EventEmitter();
|
|
44
|
+
/** Emitted when the agent-tune button is pressed. */
|
|
45
|
+
this.tune_ = new EventEmitter();
|
|
46
|
+
this.motion = inject(ReducedMotionService);
|
|
47
|
+
this.rows = [];
|
|
48
|
+
/** The agent is tuning: the button thinks and stops taking clicks. */
|
|
49
|
+
this.tuning = false;
|
|
50
|
+
/** What the agent changed and why, shown above the button. */
|
|
51
|
+
this.note = '';
|
|
52
|
+
/** The sample card's feature list. */
|
|
53
|
+
this.features = ['Unlimited frames', 'Agent reviews', 'Shared tokens'];
|
|
54
|
+
this.timers = new Set();
|
|
55
|
+
this.touched = false;
|
|
56
|
+
}
|
|
57
|
+
ngAfterViewInit() {
|
|
58
|
+
this.rows = this.params.map((p) => {
|
|
59
|
+
const v = clamp(p, this.values?.[p.key] ?? p.value);
|
|
60
|
+
return { param: p, value: v, pct: 0, shown: '', drag: false, hot: false, target: TARGETS[p.key]?.[0] ?? p.max };
|
|
61
|
+
});
|
|
62
|
+
this.rows.forEach((r) => this.set(r, r.value));
|
|
63
|
+
// the preview lets the agent tune once on its own, unless you reach for a slider or the button first
|
|
64
|
+
if (this.auto && !this.motion.reduce()) {
|
|
65
|
+
const t = setTimeout(() => {
|
|
66
|
+
this.timers.delete(t);
|
|
67
|
+
if (!this.touched)
|
|
68
|
+
this.tune();
|
|
69
|
+
}, 1600);
|
|
70
|
+
this.timers.add(t);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** The css-ready `--vo-<key>` variables the preview card reads. */
|
|
74
|
+
get vars() {
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const r of this.rows) {
|
|
77
|
+
out['--vo-' + r.param.key] = r.param.decimals
|
|
78
|
+
? String(+r.value.toFixed(r.param.decimals))
|
|
79
|
+
: Math.round(r.value) + (r.param.unit ?? '');
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
valueNow(r) {
|
|
84
|
+
return r.param.decimals ? +r.value.toFixed(r.param.decimals) : Math.round(r.value);
|
|
85
|
+
}
|
|
86
|
+
set(r, v) {
|
|
87
|
+
r.value = clamp(r.param, v);
|
|
88
|
+
r.pct = ((r.value - r.param.min) / (r.param.max - r.param.min)) * 100;
|
|
89
|
+
r.shown = r.param.decimals ? r.value.toFixed(r.param.decimals) : Math.round(r.value) + (r.param.unit ?? '');
|
|
90
|
+
this.emit();
|
|
91
|
+
}
|
|
92
|
+
emit() {
|
|
93
|
+
const out = {};
|
|
94
|
+
for (const r of this.rows)
|
|
95
|
+
out[r.param.key] = r.value;
|
|
96
|
+
this.valuesChange.emit(out);
|
|
97
|
+
}
|
|
98
|
+
down(r, e) {
|
|
99
|
+
e.target.setPointerCapture?.(e.pointerId);
|
|
100
|
+
r.drag = true;
|
|
101
|
+
this.touched = true;
|
|
102
|
+
this.status = 'Edited by you';
|
|
103
|
+
this.at(r, e);
|
|
104
|
+
}
|
|
105
|
+
move(r, e) {
|
|
106
|
+
if (r.drag)
|
|
107
|
+
this.at(r, e);
|
|
108
|
+
}
|
|
109
|
+
up(r) {
|
|
110
|
+
r.drag = false;
|
|
111
|
+
}
|
|
112
|
+
at(r, e) {
|
|
113
|
+
const b = e.currentTarget.getBoundingClientRect();
|
|
114
|
+
const t = Math.max(0, Math.min(1, (e.clientX - b.left) / b.width));
|
|
115
|
+
this.set(r, r.param.min + (r.param.max - r.param.min) * t);
|
|
116
|
+
}
|
|
117
|
+
key(r, e) {
|
|
118
|
+
const dir = { ArrowRight: 1, ArrowUp: 1, ArrowLeft: -1, ArrowDown: -1 }[e.key];
|
|
119
|
+
if (!dir)
|
|
120
|
+
return;
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
this.touched = true;
|
|
123
|
+
this.status = 'Edited by you';
|
|
124
|
+
this.set(r, r.value + dir * (r.param.decimals ? Math.pow(10, -r.param.decimals) : 1));
|
|
125
|
+
}
|
|
126
|
+
tune() {
|
|
127
|
+
if (this.tuning)
|
|
128
|
+
return;
|
|
129
|
+
this.touched = true;
|
|
130
|
+
this.tune_.emit();
|
|
131
|
+
this.tuning = true;
|
|
132
|
+
this.status = 'Agent is tuning';
|
|
133
|
+
this.note = '';
|
|
134
|
+
void this.run();
|
|
135
|
+
}
|
|
136
|
+
async run() {
|
|
137
|
+
for (const r of this.rows) {
|
|
138
|
+
r.hot = true;
|
|
139
|
+
await this.tween(r, r.value, r.target);
|
|
140
|
+
await this.wait(120);
|
|
141
|
+
r.hot = false;
|
|
142
|
+
}
|
|
143
|
+
this.note = 'Matched the 4px grid and your card tokens. Softer shadow so the CTA leads.';
|
|
144
|
+
this.tuning = false;
|
|
145
|
+
this.status = 'Tuned by agent';
|
|
146
|
+
this.actionLabel = 'Tune again';
|
|
147
|
+
// flip each target so the next run tweaks the card the other way
|
|
148
|
+
for (const r of this.rows) {
|
|
149
|
+
const [a, b] = TARGETS[r.param.key] ?? [r.param.max, r.param.min];
|
|
150
|
+
r.target = r.target === a ? b : a;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
tween(r, from, to) {
|
|
154
|
+
if (this.motion.reduce()) {
|
|
155
|
+
this.set(r, to);
|
|
156
|
+
return Promise.resolve();
|
|
157
|
+
}
|
|
158
|
+
return new Promise((resolve) => {
|
|
159
|
+
const start = performance.now();
|
|
160
|
+
const dur = 650;
|
|
161
|
+
const step = (now) => {
|
|
162
|
+
const t = Math.min(1, (now - start) / dur);
|
|
163
|
+
const e = 1 - Math.pow(1 - t, 3); // ease-out-cubic ~ cubic-bezier(.22,1,.36,1)
|
|
164
|
+
this.set(r, from + (to - from) * e);
|
|
165
|
+
if (t < 1)
|
|
166
|
+
this.frame = requestAnimationFrame(step);
|
|
167
|
+
else
|
|
168
|
+
resolve();
|
|
169
|
+
};
|
|
170
|
+
this.frame = requestAnimationFrame(step);
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
wait(ms) {
|
|
174
|
+
if (this.motion.reduce())
|
|
175
|
+
return Promise.resolve();
|
|
176
|
+
return new Promise((resolve) => {
|
|
177
|
+
const t = setTimeout(() => {
|
|
178
|
+
this.timers.delete(t);
|
|
179
|
+
resolve();
|
|
180
|
+
}, ms);
|
|
181
|
+
this.timers.add(t);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
ngOnDestroy() {
|
|
185
|
+
this.timers.forEach((t) => clearTimeout(t));
|
|
186
|
+
this.timers.clear();
|
|
187
|
+
if (this.frame)
|
|
188
|
+
cancelAnimationFrame(this.frame);
|
|
189
|
+
}
|
|
190
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignTunerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignTunerComponent, isStandalone: true, selector: "vo-design-tuner", inputs: { params: "params", values: "values", title: "title", status: "status", actionLabel: "actionLabel", auto: "auto" }, outputs: { valuesChange: "valuesChange", tune_: "tune_" }, ngImport: i0, template: `
|
|
192
|
+
<!-- the site lays this out by the width of its card, so the box around it is the container its query measures -->
|
|
193
|
+
<div data-vo="" class="vo-dtx-box" [style.container-type]="'inline-size'" [style.width]="'100%'">
|
|
194
|
+
<div class="vo-dtx">
|
|
195
|
+
<div class="vo-dtx-prev">
|
|
196
|
+
<div class="vo-dtx-card" [style]="vars">
|
|
197
|
+
<span class="vo-tag vo-b vo-dtx-tg">Pro</span>
|
|
198
|
+
<div class="vo-dtx-pr"><b class="vo-num">$24</b><span class="vo-muted">per editor, monthly</span></div>
|
|
199
|
+
<div class="vo-dtx-li">
|
|
200
|
+
@for (f of features; track f) {
|
|
201
|
+
<span><vo-icon name="check" size="xs"></vo-icon>{{ f }}</span>
|
|
202
|
+
}
|
|
203
|
+
</div>
|
|
204
|
+
<button type="button" class="vo-pill vo-accent vo-dtx-cta">Start free trial</button>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
<div class="vo-dtx-insp vo-panel">
|
|
208
|
+
<div class="vo-dtx-ih"><b>{{ title }}</b><span class="vo-muted vo-dtx-st">{{ status }}</span></div>
|
|
209
|
+
<div class="vo-dtx-rows">
|
|
210
|
+
@for (row of rows; track row.param.key) {
|
|
211
|
+
<div class="vo-dtx-r" [class.vo-hot]="row.hot">
|
|
212
|
+
<span>{{ row.param.label }}</span>
|
|
213
|
+
<div
|
|
214
|
+
class="vo-dtx-sl"
|
|
215
|
+
[class.vo-drag]="row.drag"
|
|
216
|
+
role="slider"
|
|
217
|
+
tabindex="0"
|
|
218
|
+
[attr.aria-label]="row.param.label"
|
|
219
|
+
[attr.aria-valuemin]="row.param.min"
|
|
220
|
+
[attr.aria-valuemax]="row.param.max"
|
|
221
|
+
[attr.aria-valuenow]="valueNow(row)"
|
|
222
|
+
[attr.aria-valuetext]="row.shown"
|
|
223
|
+
(pointerdown)="down(row, $event)"
|
|
224
|
+
(pointermove)="move(row, $event)"
|
|
225
|
+
(pointerup)="up(row)"
|
|
226
|
+
(pointercancel)="up(row)"
|
|
227
|
+
(keydown)="key(row, $event)"
|
|
228
|
+
>
|
|
229
|
+
<span class="vo-f" [style.width.%]="row.pct"></span>
|
|
230
|
+
<span class="vo-k" [style.left.%]="row.pct"></span>
|
|
231
|
+
</div>
|
|
232
|
+
<span class="vo-v vo-num">{{ row.shown }}</span>
|
|
233
|
+
</div>
|
|
234
|
+
}
|
|
235
|
+
</div>
|
|
236
|
+
@if (note) {
|
|
237
|
+
<div class="vo-dtx-note vo-enter">{{ note }}</div>
|
|
238
|
+
}
|
|
239
|
+
<button
|
|
240
|
+
type="button"
|
|
241
|
+
class="vo-pill vo-primary vo-sm vo-dtx-go"
|
|
242
|
+
[class.vo-busy]="tuning"
|
|
243
|
+
[attr.aria-busy]="tuning ? true : null"
|
|
244
|
+
(click)="tune()"
|
|
245
|
+
>
|
|
246
|
+
@if (tuning) {
|
|
247
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>Tuning
|
|
248
|
+
} @else {
|
|
249
|
+
<vo-icon name="spark" size="xs"></vo-icon>{{ actionLabel }}
|
|
250
|
+
}
|
|
251
|
+
</button>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
`, isInline: true, styles: [".vo-dtx{display:grid;grid-template-columns:1fr 280px;gap:14px;align-items:stretch}@media (max-width:720px){.vo-dtx{grid-template-columns:1fr}}@container (max-width:600px){.vo-dtx{grid-template-columns:1fr}.vo-dtx-prev{min-height:240px}}.vo-dtx-prev{border-radius:calc(18px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;padding:var(--vo-s-6);min-height:300px;min-width:0}.vo-dtx-card{--vo-rad:16px;--vo-pad:18px;--vo-gap:12px;--vo-sh:.08;width:min(250px,100%);background:var(--vo-surface);border-radius:var(--vo-rad);padding:var(--vo-pad);display:flex;flex-direction:column;gap:var(--vo-gap);box-shadow:0 1px 2px rgba(0,0,0,var(--vo-sh)),0 8px 24px rgba(0,0,0,calc(var(--vo-sh) * .8))}.vo-dtx-tg{align-self:flex-start}.vo-dtx-pr{display:flex;align-items:baseline;gap:6px}.vo-dtx-pr b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-dtx-pr span{font-size:12px}.vo-dtx-li{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--vo-fg2)}.vo-dtx-li span{display:flex;align-items:center;gap:7px}.vo-dtx-li svg{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-cta{width:100%;border-radius:calc(var(--vo-rad) * .6)}.vo-dtx-insp{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);min-width:0}.vo-dtx-ih{display:flex;align-items:baseline;justify-content:space-between;font-size:13.5px}.vo-dtx-ih b{font-weight:500}.vo-dtx-st{font-size:12px}.vo-dtx-rows{display:flex;flex-direction:column;gap:10px}.vo-dtx-r{display:grid;grid-template-columns:62px 1fr 40px;align-items:center;gap:10px;font-size:12.5px;color:var(--vo-fg2)}.vo-dtx-r .vo-v{text-align:right;color:var(--vo-fg);font-size:12px}.vo-dtx-r.vo-hot .vo-v{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-sl{position:relative;height:22px;display:flex;align-items:center;cursor:pointer;touch-action:none}.vo-dtx-sl:before{content:\"\";position:absolute;left:0;right:0;height:4px;border-radius:2px;background:var(--vo-line)}.vo-dtx-sl .vo-f{position:absolute;left:0;height:4px;border-radius:2px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dtx-sl .vo-k{position:absolute;width:14px;height:14px;margin-left:-7px;border-radius:50%;background:#fff;box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent),0 1px 3px #0000002e;transition:transform .2s}.vo-dtx-sl.vo-drag .vo-k,.vo-dtx-sl:focus-visible .vo-k{transform:scale(1.15)}@media (hover:hover) and (pointer:fine){.vo-dtx-sl:hover .vo-k{transform:scale(1.15)}}.vo-dtx-sl:focus-visible{outline-offset:4px}.vo-dtx-go{align-self:stretch;margin-top:auto}.vo-dtx-go.vo-busy{pointer-events:none}.vo-dtx-note{font-size:12px;color:var(--vo-fg2);padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-accent-bg);line-height:1.45}.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-muted{color:var(--vo-muted)}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-b{background:var(--vo-pb-bg);color:var(--vo-pb)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.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-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}.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)}}@media (prefers-reduced-motion:reduce){.vo-think.vo-on,.vo-think.vo-on i,.vo-enter{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
256
|
+
}
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignTunerComponent, decorators: [{
|
|
258
|
+
type: Component,
|
|
259
|
+
args: [{ selector: 'vo-design-tuner', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
260
|
+
<!-- the site lays this out by the width of its card, so the box around it is the container its query measures -->
|
|
261
|
+
<div data-vo="" class="vo-dtx-box" [style.container-type]="'inline-size'" [style.width]="'100%'">
|
|
262
|
+
<div class="vo-dtx">
|
|
263
|
+
<div class="vo-dtx-prev">
|
|
264
|
+
<div class="vo-dtx-card" [style]="vars">
|
|
265
|
+
<span class="vo-tag vo-b vo-dtx-tg">Pro</span>
|
|
266
|
+
<div class="vo-dtx-pr"><b class="vo-num">$24</b><span class="vo-muted">per editor, monthly</span></div>
|
|
267
|
+
<div class="vo-dtx-li">
|
|
268
|
+
@for (f of features; track f) {
|
|
269
|
+
<span><vo-icon name="check" size="xs"></vo-icon>{{ f }}</span>
|
|
270
|
+
}
|
|
271
|
+
</div>
|
|
272
|
+
<button type="button" class="vo-pill vo-accent vo-dtx-cta">Start free trial</button>
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
<div class="vo-dtx-insp vo-panel">
|
|
276
|
+
<div class="vo-dtx-ih"><b>{{ title }}</b><span class="vo-muted vo-dtx-st">{{ status }}</span></div>
|
|
277
|
+
<div class="vo-dtx-rows">
|
|
278
|
+
@for (row of rows; track row.param.key) {
|
|
279
|
+
<div class="vo-dtx-r" [class.vo-hot]="row.hot">
|
|
280
|
+
<span>{{ row.param.label }}</span>
|
|
281
|
+
<div
|
|
282
|
+
class="vo-dtx-sl"
|
|
283
|
+
[class.vo-drag]="row.drag"
|
|
284
|
+
role="slider"
|
|
285
|
+
tabindex="0"
|
|
286
|
+
[attr.aria-label]="row.param.label"
|
|
287
|
+
[attr.aria-valuemin]="row.param.min"
|
|
288
|
+
[attr.aria-valuemax]="row.param.max"
|
|
289
|
+
[attr.aria-valuenow]="valueNow(row)"
|
|
290
|
+
[attr.aria-valuetext]="row.shown"
|
|
291
|
+
(pointerdown)="down(row, $event)"
|
|
292
|
+
(pointermove)="move(row, $event)"
|
|
293
|
+
(pointerup)="up(row)"
|
|
294
|
+
(pointercancel)="up(row)"
|
|
295
|
+
(keydown)="key(row, $event)"
|
|
296
|
+
>
|
|
297
|
+
<span class="vo-f" [style.width.%]="row.pct"></span>
|
|
298
|
+
<span class="vo-k" [style.left.%]="row.pct"></span>
|
|
299
|
+
</div>
|
|
300
|
+
<span class="vo-v vo-num">{{ row.shown }}</span>
|
|
301
|
+
</div>
|
|
302
|
+
}
|
|
303
|
+
</div>
|
|
304
|
+
@if (note) {
|
|
305
|
+
<div class="vo-dtx-note vo-enter">{{ note }}</div>
|
|
306
|
+
}
|
|
307
|
+
<button
|
|
308
|
+
type="button"
|
|
309
|
+
class="vo-pill vo-primary vo-sm vo-dtx-go"
|
|
310
|
+
[class.vo-busy]="tuning"
|
|
311
|
+
[attr.aria-busy]="tuning ? true : null"
|
|
312
|
+
(click)="tune()"
|
|
313
|
+
>
|
|
314
|
+
@if (tuning) {
|
|
315
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>Tuning
|
|
316
|
+
} @else {
|
|
317
|
+
<vo-icon name="spark" size="xs"></vo-icon>{{ actionLabel }}
|
|
318
|
+
}
|
|
319
|
+
</button>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
`, styles: [".vo-dtx{display:grid;grid-template-columns:1fr 280px;gap:14px;align-items:stretch}@media (max-width:720px){.vo-dtx{grid-template-columns:1fr}}@container (max-width:600px){.vo-dtx{grid-template-columns:1fr}.vo-dtx-prev{min-height:240px}}.vo-dtx-prev{border-radius:calc(18px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;padding:var(--vo-s-6);min-height:300px;min-width:0}.vo-dtx-card{--vo-rad:16px;--vo-pad:18px;--vo-gap:12px;--vo-sh:.08;width:min(250px,100%);background:var(--vo-surface);border-radius:var(--vo-rad);padding:var(--vo-pad);display:flex;flex-direction:column;gap:var(--vo-gap);box-shadow:0 1px 2px rgba(0,0,0,var(--vo-sh)),0 8px 24px rgba(0,0,0,calc(var(--vo-sh) * .8))}.vo-dtx-tg{align-self:flex-start}.vo-dtx-pr{display:flex;align-items:baseline;gap:6px}.vo-dtx-pr b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-dtx-pr span{font-size:12px}.vo-dtx-li{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--vo-fg2)}.vo-dtx-li span{display:flex;align-items:center;gap:7px}.vo-dtx-li svg{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-cta{width:100%;border-radius:calc(var(--vo-rad) * .6)}.vo-dtx-insp{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);min-width:0}.vo-dtx-ih{display:flex;align-items:baseline;justify-content:space-between;font-size:13.5px}.vo-dtx-ih b{font-weight:500}.vo-dtx-st{font-size:12px}.vo-dtx-rows{display:flex;flex-direction:column;gap:10px}.vo-dtx-r{display:grid;grid-template-columns:62px 1fr 40px;align-items:center;gap:10px;font-size:12.5px;color:var(--vo-fg2)}.vo-dtx-r .vo-v{text-align:right;color:var(--vo-fg);font-size:12px}.vo-dtx-r.vo-hot .vo-v{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-sl{position:relative;height:22px;display:flex;align-items:center;cursor:pointer;touch-action:none}.vo-dtx-sl:before{content:\"\";position:absolute;left:0;right:0;height:4px;border-radius:2px;background:var(--vo-line)}.vo-dtx-sl .vo-f{position:absolute;left:0;height:4px;border-radius:2px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dtx-sl .vo-k{position:absolute;width:14px;height:14px;margin-left:-7px;border-radius:50%;background:#fff;box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent),0 1px 3px #0000002e;transition:transform .2s}.vo-dtx-sl.vo-drag .vo-k,.vo-dtx-sl:focus-visible .vo-k{transform:scale(1.15)}@media (hover:hover) and (pointer:fine){.vo-dtx-sl:hover .vo-k{transform:scale(1.15)}}.vo-dtx-sl:focus-visible{outline-offset:4px}.vo-dtx-go{align-self:stretch;margin-top:auto}.vo-dtx-go.vo-busy{pointer-events:none}.vo-dtx-note{font-size:12px;color:var(--vo-fg2);padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-accent-bg);line-height:1.45}.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-muted{color:var(--vo-muted)}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-b{background:var(--vo-pb-bg);color:var(--vo-pb)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.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-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}.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)}}@media (prefers-reduced-motion:reduce){.vo-think.vo-on,.vo-think.vo-on i,.vo-enter{animation:none}}\n"] }]
|
|
324
|
+
}], propDecorators: { params: [{
|
|
325
|
+
type: Input
|
|
326
|
+
}], values: [{
|
|
327
|
+
type: Input
|
|
328
|
+
}], title: [{
|
|
329
|
+
type: Input
|
|
330
|
+
}], status: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], actionLabel: [{
|
|
333
|
+
type: Input
|
|
334
|
+
}], auto: [{
|
|
335
|
+
type: Input
|
|
336
|
+
}], valuesChange: [{
|
|
337
|
+
type: Output
|
|
338
|
+
}], tune_: [{
|
|
339
|
+
type: Output
|
|
340
|
+
}] } });
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLXR1bmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2Rlc2lnbi10dW5lci9kZXNpZ24tdHVuZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLGtGQUFrRjtBQUNsRixvRkFBb0Y7QUFDcEYsb0ZBQW9GO0FBQ3BGLGlGQUFpRjtBQUNqRixFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLGlGQUFpRjtBQUNqRixnRUFBZ0U7QUFFaEUsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFrQnRFLE1BQU0sTUFBTSxHQUFpQjtJQUMzQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3ZFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7SUFDeEUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtJQUN4RSxFQUFFLEdBQUcs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QUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDOytHQTFLVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixrUUFuRXJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VULGdtS0FqRVMsZUFBZTs7NEZBb0VkLG9CQUFvQjtrQkF4RWhDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZUFBZSxDQUFDLFlBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VUOzhCQUtRLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2Rlc2lnbi10dW5lci9kZXNpZ24tdHVuZXIuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvZGVzaWduLXR1bmVyL0Rlc2lnblR1bmVyLnRzeC5cbi8vIEEgbGl2ZSBwcmV2aWV3IGJlc2lkZSBhIGZldyBzbGlkZXJzLCB3aXRoIGEgYnV0dG9uIHRoYXQgaGFuZHMgdGhlIHR1bmluZyB0byB0aGVcbi8vIGFnZW50LiBEcmFnIGEgc2xpZGVyIChvciBhcnJvdy1rZXkgaXQpIHRvIHR3ZWFrIHRoZSBzYW1wbGUgY2FyZCBieSBoYW5kLCBvciBwcmVzc1xuLy8gdGhlIGJ1dHRvbiB0byBsZXQgdGhlIGFnZW50IHR3ZWVuIGV2ZXJ5IHZhbHVlIHRvIGEgdGFyZ2V0LCBkcm9wIGEgbm90ZSBvbiB3aGF0IGl0XG4vLyBjaGFuZ2VkLCBhbmQgZmxpcCB0aGUgdGFyZ2V0cyBmb3IgdGhlIG5leHQgcnVuLiBJbnB1dHMgbWlycm9yIHRoZSBSZWFjdCBwcm9wcy5cbi8vXG4vLyBJY29uczogdGhlIFJlYWN0IHNvdXJjZSB1c2VzIGEgXCJ3YW5kXCIgZ2x5cGggZm9yIHRoZSBhZ2VudCBidXR0b247IHRoZSBBbmd1bGFyXG4vLyBpY29uIHNldCBoYXMgbm8gd2FuZCwgc28gdGhlIGNsb3Nlc3QgbWFnaWMvYWdlbnQgZ2x5cGggXCJzcGFya1wiIGlzIHN1YnN0aXR1dGVkLlxuLy8gXCJjaGVja1wiIGlzIHVzZWQgdW5jaGFuZ2VkIGZvciB0aGUgc2FtcGxlIGNhcmQncyBmZWF0dXJlIGxpc3QuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBPbmUgc2xpZGVyOiBuYW1lcyBhIHZhbHVlIGFuZCB0aGUgQ1NTIHZhcmlhYmxlIGl0IHNldHMgb24gdGhlIHByZXZpZXcsIGAtLXZvLTxrZXk+YC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVuZXJQYXJhbSB7XG4gIC8qKiBOYW1lcyB0aGUgdmFsdWUgYW5kIHRoZSBDU1MgdmFyaWFibGUgaXQgc2V0cyBvbiB0aGUgcHJldmlldywgYC0tdm8tPGtleT5gLiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIFNob3duIGJlc2lkZSB0aGUgc2xpZGVyLCBsaWtlIFwiUmFkaXVzXCIuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIFdoZXJlIHRoZSBzbGlkZXIgc3RhcnRzIHdoZW4geW91IGRvbid0IHBhc3MgdmFsdWVzLiAqL1xuICB2YWx1ZTogbnVtYmVyO1xuICAvKiogQWRkZWQgYWZ0ZXIgd2hvbGUgbnVtYmVycywgbGlrZSBcInB4XCIuIExlYXZlIGl0IG91dCBmb3IgcGxhaW4gbnVtYmVycy4gKi9cbiAgdW5pdD86IHN0cmluZztcbiAgLyoqIFNob3dzIGFuZCBzZXRzIHRoZSB2YWx1ZSB3aXRoIHRoaXMgbWFueSBkZWNpbWFscyBpbnN0ZWFkIG9mIHJvdW5kaW5nLCBsaWtlIDIgZm9yIGEgc2hhZG93IHN0cmVuZ3RoLiAqL1xuICBkZWNpbWFscz86IG51bWJlcjtcbn1cblxuY29uc3QgUEFSQU1TOiBUdW5lclBhcmFtW10gPSBbXG4gIHsga2V5OiAncmFkJywgbGFiZWw6ICdSYWRpdXMnLCBtaW46IDAsIG1heDogMjgsIHZhbHVlOiAxNiwgdW5pdDogJ3B4JyB9LFxuICB7IGtleTogJ3BhZCcsIGxhYmVsOiAnUGFkZGluZycsIG1pbjogOCwgbWF4OiAzMiwgdmFsdWU6IDE4LCB1bml0OiAncHgnIH0sXG4gIHsga2V5OiAnZ2FwJywgbGFiZWw6ICdTcGFjaW5nJywgbWluOiA0LCBtYXg6IDI0LCB2YWx1ZTogMTIsIHVuaXQ6ICdweCcgfSxcbiAgeyBrZXk6ICdzaCcsIGxhYmVsOiAnU2hhZG93JywgbWluOiAwLCBtYXg6IDAuMiwgdmFsdWU6IDAuMDgsIGRlY2ltYWxzOiAyIH0sXG5dO1xuXG4vLyB0aGUgYWdlbnQncyBmaXJzdCB0YXJnZXQgcGVyIGtleSwgYW5kIHRoZSB2YWx1ZSBpdCBmbGlwcyB0byBvbiB0aGUgbmV4dCBydW5cbmNvbnN0IFRBUkdFVFM6IFJlY29yZDxzdHJpbmcsIFtudW1iZXIsIG51bWJlcl0+ID0ge1xuICByYWQ6IFsyMCwgMTJdLFxuICBwYWQ6IFsyNCwgMjBdLFxuICBnYXA6IFsxNCwgMTBdLFxuICBzaDogWzAuMDUsIDAuMV0sXG59O1xuXG5jb25zdCBjbGFtcCA9IChwOiBUdW5lclBhcmFtLCB2OiBudW1iZXIpID0+IE1hdGgubWF4KHAubWluLCBNYXRoLm1pbihwLm1heCwgdikpO1xuXG4vKiogQSBzbGlkZXIgcGx1cyBpdHMgbGl2ZSwgc2hvd24gYW5kIGNzcy1yZWFkeSB2YWx1ZS4gKi9cbmludGVyZmFjZSBSb3cge1xuICBwYXJhbTogVHVuZXJQYXJhbTtcbiAgdmFsdWU6IG51bWJlcjtcbiAgcGN0OiBudW1iZXI7XG4gIHNob3duOiBzdHJpbmc7XG4gIGRyYWc6IGJvb2xlYW47XG4gIGhvdDogYm9vbGVhbjtcbiAgdGFyZ2V0OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLWRlc2lnbi10dW5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gdGhlIHNpdGUgbGF5cyB0aGlzIG91dCBieSB0aGUgd2lkdGggb2YgaXRzIGNhcmQsIHNvIHRoZSBib3ggYXJvdW5kIGl0IGlzIHRoZSBjb250YWluZXIgaXRzIHF1ZXJ5IG1lYXN1cmVzIC0tPlxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8tZHR4LWJveFwiIFtzdHlsZS5jb250YWluZXItdHlwZV09XCInaW5saW5lLXNpemUnXCIgW3N0eWxlLndpZHRoXT1cIicxMDAlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWR0eFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXByZXZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWNhcmRcIiBbc3R5bGVdPVwidmFyc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8tYiB2by1kdHgtdGdcIj5Qcm88L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXByXCI+PGIgY2xhc3M9XCJ2by1udW1cIj4kMjQ8L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZFwiPnBlciBlZGl0b3IsIG1vbnRobHk8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWxpXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGYgb2YgZmVhdHVyZXM7IHRyYWNrIGYpIHtcbiAgICAgICAgICAgICAgICA8c3Bhbj48dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgZiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tYWNjZW50IHZvLWR0eC1jdGFcIj5TdGFydCBmcmVlIHRyaWFsPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWluc3Agdm8tcGFuZWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWloXCI+PGI+e3sgdGl0bGUgfX08L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1kdHgtc3RcIj57eyBzdGF0dXMgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWR0eC1yb3dzXCI+XG4gICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LnBhcmFtLmtleSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXJcIiBbY2xhc3Mudm8taG90XT1cInJvdy5ob3RcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cucGFyYW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1kdHgtc2xcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLWRyYWddPVwicm93LmRyYWdcIlxuICAgICAgICAgICAgICAgICAgcm9sZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyb3cucGFyYW0ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCJyb3cucGFyYW0ubWluXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtYXhdPVwicm93LnBhcmFtLm1heFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInZhbHVlTm93KHJvdylcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwicm93LnNob3duXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJkb3duKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAocG9pbnRlcm1vdmUpPVwibW92ZShyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHBvaW50ZXJ1cCk9XCJ1cChyb3cpXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyY2FuY2VsKT1cInVwKHJvdylcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1mXCIgW3N0eWxlLndpZHRoLiVdPVwicm93LnBjdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8ta1wiIFtzdHlsZS5sZWZ0LiVdPVwicm93LnBjdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXYgdm8tbnVtXCI+e3sgcm93LnNob3duIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKG5vdGUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1kdHgtbm90ZSB2by1lbnRlclwiPnt7IG5vdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXBpbGwgdm8tcHJpbWFyeSB2by1zbSB2by1kdHgtZ29cIlxuICAgICAgICAgICAgW2NsYXNzLnZvLWJ1c3ldPVwidHVuaW5nXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJ0dW5pbmcgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidHVuZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHR1bmluZykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRoaW5rIHZvLW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGk+PC9pPjxpPjwvaT48aT48L2k+PGk+PC9pPjwvc3Bhbj5UdW5pbmdcbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgYWN0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2Rlc2lnbi10dW5lci5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25UdW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgc2xpZGVycy4gRGVmYXVsdHMgdG8gcmFkaXVzLCBwYWRkaW5nLCBzcGFjaW5nIGFuZCBzaGFkb3cgZm9yIHRoZSBzYW1wbGUgY2FyZC4gKi9cbiAgQElucHV0KCkgcGFyYW1zOiBUdW5lclBhcmFtW10gPSBQQVJBTVM7XG4gIC8qKiBUaGUgdmFsdWUgb2YgZWFjaCBzbGlkZXIgYnkga2V5LiBMZWF2ZSBpdCBvdXQgdG8gbGV0IHRoZSBzbGlkZXJzIGtlZXAgdGhlaXIgb3duLiAqL1xuICBASW5wdXQoKSB2YWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAvKiogV2hhdCBpcyBiZWluZyB0dW5lZCwgbGlrZSBcIlByaWNpbmcgY2FyZFwiLiAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICdQcmljaW5nIGNhcmQnO1xuICAvKiogUXVpZXQgbGluZSBiZXNpZGUgdGhlIHRpdGxlLCBsaWtlIFwiRWRpdGVkIGJ5IHlvdVwiIG9yIFwiQWdlbnQgaXMgdHVuaW5nXCIuICovXG4gIEBJbnB1dCgpIHN0YXR1cyA9ICdFZGl0ZWQgYnkgeW91JztcbiAgLyoqIFRoZSBidXR0b24ncyBsYWJlbCwgbGlrZSBcIlR1bmUgd2l0aCBhZ2VudFwiIG9yIFwiVHVuZSBhZ2FpblwiLiAqL1xuICBASW5wdXQoKSBhY3Rpb25MYWJlbCA9ICdUdW5lIHdpdGggYWdlbnQnO1xuICAvKiogVGhlIHByZXZpZXcgbGV0cyB0aGUgYWdlbnQgdHVuZSBvbmNlIG9uIGl0cyBvd24gYWZ0ZXIgYSBiZWF0LiBTZXQgZmFsc2UgdG8gdHVybiB0aGF0IG9mZi4gKi9cbiAgQElucHV0KCkgYXV0byA9IHRydWU7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgdmFsdWVzIGJ5IGtleSB3aGVuZXZlciBhIHNsaWRlciBvciB0aGUgYWdlbnQgbW92ZXMgb25lLiAqL1xuICBAT3V0cHV0KCkgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBhZ2VudC10dW5lIGJ1dHRvbiBpcyBwcmVzc2VkLiAqL1xuICBAT3V0cHV0KCkgdHVuZV8gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIHJvd3M6IFJvd1tdID0gW107XG4gIC8qKiBUaGUgYWdlbnQgaXMgdHVuaW5nOiB0aGUgYnV0dG9uIHRoaW5rcyBhbmQgc3RvcHMgdGFraW5nIGNsaWNrcy4gKi9cbiAgdHVuaW5nID0gZmFsc2U7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBjaGFuZ2VkIGFuZCB3aHksIHNob3duIGFib3ZlIHRoZSBidXR0b24uICovXG4gIG5vdGUgPSAnJztcbiAgLyoqIFRoZSBzYW1wbGUgY2FyZCdzIGZlYXR1cmUgbGlzdC4gKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXMgPSBbJ1VubGltaXRlZCBmcmFtZXMnLCAnQWdlbnQgcmV2aWV3cycsICdTaGFyZWQgdG9rZW5zJ107XG5cbiAgcHJpdmF0ZSB0aW1lcnMgPSBuZXcgU2V0PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+PigpO1xuICBwcml2YXRlIGZyYW1lPzogUmV0dXJuVHlwZTx0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPjtcbiAgcHJpdmF0ZSB0b3VjaGVkID0gZmFsc2U7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMucGFyYW1zLm1hcCgocCkgPT4ge1xuICAgICAgY29uc3QgdiA9IGNsYW1wKHAsIHRoaXMudmFsdWVzPy5bcC5rZXldID8/IHAudmFsdWUpO1xuICAgICAgcmV0dXJuIHsgcGFyYW06IHAsIHZhbHVlOiB2LCBwY3Q6IDAsIHNob3duOiAnJywgZHJhZzogZmFsc2UsIGhvdDogZmFsc2UsIHRhcmdldDogVEFSR0VUU1twLmtleV0/LlswXSA/PyBwLm1heCB9O1xuICAgIH0pO1xuICAgIHRoaXMucm93cy5mb3JFYWNoKChyKSA9PiB0aGlzLnNldChyLCByLnZhbHVlKSk7XG4gICAgLy8gdGhlIHByZXZpZXcgbGV0cyB0aGUgYWdlbnQgdHVuZSBvbmNlIG9uIGl0cyBvd24sIHVubGVzcyB5b3UgcmVhY2ggZm9yIGEgc2xpZGVyIG9yIHRoZSBidXR0b24gZmlyc3RcbiAgICBpZiAodGhpcy5hdXRvICYmICF0aGlzLm1vdGlvbi5yZWR1Y2UoKSkge1xuICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUodCk7XG4gICAgICAgIGlmICghdGhpcy50b3VjaGVkKSB0aGlzLnR1bmUoKTtcbiAgICAgIH0sIDE2MDApO1xuICAgICAgdGhpcy50aW1lcnMuYWRkKHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgY3NzLXJlYWR5IGAtLXZvLTxrZXk+YCB2YXJpYWJsZXMgdGhlIHByZXZpZXcgY2FyZCByZWFkcy4gKi9cbiAgZ2V0IHZhcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucm93cykge1xuICAgICAgb3V0WyctLXZvLScgKyByLnBhcmFtLmtleV0gPSByLnBhcmFtLmRlY2ltYWxzXG4gICAgICAgID8gU3RyaW5nKCtyLnZhbHVlLnRvRml4ZWQoci5wYXJhbS5kZWNpbWFscykpXG4gICAgICAgIDogTWF0aC5yb3VuZChyLnZhbHVlKSArIChyLnBhcmFtLnVuaXQgPz8gJycpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgdmFsdWVOb3cocjogUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gci5wYXJhbS5kZWNpbWFscyA/ICtyLnZhbHVlLnRvRml4ZWQoci5wYXJhbS5kZWNpbWFscykgOiBNYXRoLnJvdW5kKHIudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXQocjogUm93LCB2OiBudW1iZXIpOiB2b2lkIHtcbiAgICByLnZhbHVlID0gY2xhbXAoci5wYXJhbSwgdik7XG4gICAgci5wY3QgPSAoKHIudmFsdWUgLSByLnBhcmFtLm1pbikgLyAoci5wYXJhbS5tYXggLSByLnBhcmFtLm1pbikpICogMTAwO1xuICAgIHIuc2hvd24gPSByLnBhcmFtLmRlY2ltYWxzID8gci52YWx1ZS50b0ZpeGVkKHIucGFyYW0uZGVjaW1hbHMpIDogTWF0aC5yb3VuZChyLnZhbHVlKSArIChyLnBhcmFtLnVuaXQgPz8gJycpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0KCk6IHZvaWQge1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJvd3MpIG91dFtyLnBhcmFtLmtleV0gPSByLnZhbHVlO1xuICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQob3V0KTtcbiAgfVxuXG4gIGRvd24ocjogUm93LCBlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICAgIHIuZHJhZyA9IHRydWU7XG4gICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXR1cyA9ICdFZGl0ZWQgYnkgeW91JztcbiAgICB0aGlzLmF0KHIsIGUpO1xuICB9XG5cbiAgbW92ZShyOiBSb3csIGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChyLmRyYWcpIHRoaXMuYXQociwgZSk7XG4gIH1cblxuICB1cChyOiBSb3cpOiB2b2lkIHtcbiAgICByLmRyYWcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXQocjogUm93LCBlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiID0gKGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChlLmNsaWVudFggLSBiLmxlZnQpIC8gYi53aWR0aCkpO1xuICAgIHRoaXMuc2V0KHIsIHIucGFyYW0ubWluICsgKHIucGFyYW0ubWF4IC0gci5wYXJhbS5taW4pICogdCk7XG4gIH1cblxuICBrZXkocjogUm93LCBlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZGlyID0gKHsgQXJyb3dSaWdodDogMSwgQXJyb3dVcDogMSwgQXJyb3dMZWZ0OiAtMSwgQXJyb3dEb3duOiAtMSB9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW2Uua2V5XTtcbiAgICBpZiAoIWRpcikgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzID0gJ0VkaXRlZCBieSB5b3UnO1xuICAgIHRoaXMuc2V0KHIsIHIudmFsdWUgKyBkaXIgKiAoci5wYXJhbS5kZWNpbWFscyA/IE1hdGgucG93KDEwLCAtci5wYXJhbS5kZWNpbWFscykgOiAxKSk7XG4gIH1cblxuICB0dW5lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR1bmluZykgcmV0dXJuO1xuICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy50dW5lXy5lbWl0KCk7XG4gICAgdGhpcy50dW5pbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzID0gJ0FnZW50IGlzIHR1bmluZyc7XG4gICAgdGhpcy5ub3RlID0gJyc7XG4gICAgdm9pZCB0aGlzLnJ1bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucm93cykge1xuICAgICAgci5ob3QgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy50d2VlbihyLCByLnZhbHVlLCByLnRhcmdldCk7XG4gICAgICBhd2FpdCB0aGlzLndhaXQoMTIwKTtcbiAgICAgIHIuaG90ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubm90ZSA9ICdNYXRjaGVkIHRoZSA0cHggZ3JpZCBhbmQgeW91ciBjYXJkIHRva2Vucy4gU29mdGVyIHNoYWRvdyBzbyB0aGUgQ1RBIGxlYWRzLic7XG4gICAgdGhpcy50dW5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXR1cyA9ICdUdW5lZCBieSBhZ2VudCc7XG4gICAgdGhpcy5hY3Rpb25MYWJlbCA9ICdUdW5lIGFnYWluJztcbiAgICAvLyBmbGlwIGVhY2ggdGFyZ2V0IHNvIHRoZSBuZXh0IHJ1biB0d2Vha3MgdGhlIGNhcmQgdGhlIG90aGVyIHdheVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGNvbnN0IFthLCBiXSA9IFRBUkdFVFNbci5wYXJhbS5rZXldID8/IFtyLnBhcmFtLm1heCwgci5wYXJhbS5taW5dO1xuICAgICAgci50YXJnZXQgPSByLnRhcmdldCA9PT0gYSA/IGIgOiBhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHdlZW4ocjogUm93LCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb3Rpb24ucmVkdWNlKCkpIHtcbiAgICAgIHRoaXMuc2V0KHIsIHRvKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgY29uc3QgZHVyID0gNjUwO1xuICAgICAgY29uc3Qgc3RlcCA9IChub3c6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0KSAvIGR1cik7XG4gICAgICAgIGNvbnN0IGUgPSAxIC0gTWF0aC5wb3coMSAtIHQsIDMpOyAvLyBlYXNlLW91dC1jdWJpYyB+IGN1YmljLWJlemllciguMjIsMSwuMzYsMSlcbiAgICAgICAgdGhpcy5zZXQociwgZnJvbSArICh0byAtIGZyb20pICogZSk7XG4gICAgICAgIGlmICh0IDwgMSkgdGhpcy5mcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5mcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FpdChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW90aW9uLnJlZHVjZSgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZSh0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgbXMpO1xuICAgICAgdGhpcy50aW1lcnMuYWRkKHQpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaCgodCkgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLnRpbWVycy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmZyYW1lKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lKTtcbiAgfVxufVxuIl19
|