@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,259 @@
|
|
|
1
|
+
// framework/angular/decision-prompt/decision-prompt.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/decision-prompt/DecisionPrompt.tsx.
|
|
4
|
+
// The agent asks a few quick questions before it starts: one question at a time,
|
|
5
|
+
// number keys pick an option, Enter continues and Skip lets the agent decide.
|
|
6
|
+
// Once every question is answered the body settles into a summary with a line
|
|
7
|
+
// that says the agent is getting going. Inputs mirror the React props; the React
|
|
8
|
+
// callbacks become @Output EventEmitters, and the keyboard / stagger behaviour is
|
|
9
|
+
// ported from the vanilla source (decision-prompt.js).
|
|
10
|
+
//
|
|
11
|
+
// Icon substitution: the React summary uses the Phosphor "check" glyph for the
|
|
12
|
+
// started line; the Angular icon set has `check`, so it is used unchanged.
|
|
13
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
14
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
/** The agent asks a few quick questions before it starts. Number keys pick, Enter continues. */
|
|
17
|
+
export class DecisionPromptComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
/** The questions the agent asks, in order. */
|
|
20
|
+
this.questions = [];
|
|
21
|
+
/** The answers the prompt starts with when uncontrolled. */
|
|
22
|
+
this.defaultAnswers = [];
|
|
23
|
+
/** What the summary says for a skipped question. */
|
|
24
|
+
this.skippedLabel = 'Agent decides';
|
|
25
|
+
/** The line under the summary while the agent gets going. */
|
|
26
|
+
this.startLabel = 'Starting';
|
|
27
|
+
/** The agent has got going: the line under the summary settles with a check. */
|
|
28
|
+
this.started = false;
|
|
29
|
+
/** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
|
|
30
|
+
this.bare = true;
|
|
31
|
+
/** Emitted whenever the answers change (a pick, or a skip). */
|
|
32
|
+
this.answersChange = new EventEmitter();
|
|
33
|
+
/** Emitted once every question is answered, with the picked option's index for each, or null where the person skipped. */
|
|
34
|
+
this.complete = new EventEmitter();
|
|
35
|
+
/** The highlighted option for the current question. */
|
|
36
|
+
this.sel = 0;
|
|
37
|
+
// the internal answer list used when `answers` is not provided
|
|
38
|
+
this.internal = [];
|
|
39
|
+
}
|
|
40
|
+
ngOnChanges(changes) {
|
|
41
|
+
if (changes['defaultAnswers'] && this.answers === undefined) {
|
|
42
|
+
this.internal = [...this.defaultAnswers];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
get list() {
|
|
46
|
+
return this.answers ?? (this.internal.length ? this.internal : (this.internal = [...this.defaultAnswers]));
|
|
47
|
+
}
|
|
48
|
+
/** How many questions there are. */
|
|
49
|
+
get n() {
|
|
50
|
+
return this.questions.length;
|
|
51
|
+
}
|
|
52
|
+
/** How many have been answered so far. */
|
|
53
|
+
get at() {
|
|
54
|
+
return this.list.length;
|
|
55
|
+
}
|
|
56
|
+
/** Every question has an answer. */
|
|
57
|
+
get done() {
|
|
58
|
+
return this.at >= this.n;
|
|
59
|
+
}
|
|
60
|
+
/** The question being asked now. */
|
|
61
|
+
get current() {
|
|
62
|
+
return this.questions[Math.min(this.at, this.n - 1)];
|
|
63
|
+
}
|
|
64
|
+
summaryAnswer(i) {
|
|
65
|
+
const a = this.list[i];
|
|
66
|
+
return a === null || a === undefined
|
|
67
|
+
? this.skippedLabel
|
|
68
|
+
: this.questions[i]?.options[a]?.label ?? this.skippedLabel;
|
|
69
|
+
}
|
|
70
|
+
next(skipped = false) {
|
|
71
|
+
if (this.done)
|
|
72
|
+
return;
|
|
73
|
+
const all = [...this.list, skipped ? null : this.sel];
|
|
74
|
+
if (this.answers === undefined)
|
|
75
|
+
this.internal = all;
|
|
76
|
+
this.sel = 0;
|
|
77
|
+
this.answersChange.emit(all);
|
|
78
|
+
if (all.length >= this.n)
|
|
79
|
+
this.complete.emit(all);
|
|
80
|
+
}
|
|
81
|
+
onKey(e) {
|
|
82
|
+
if (this.done)
|
|
83
|
+
return;
|
|
84
|
+
const count = this.current.options.length;
|
|
85
|
+
if (/^[1-9]$/.test(e.key) && +e.key <= count) {
|
|
86
|
+
this.sel = +e.key - 1;
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
}
|
|
89
|
+
else if (e.key === 'Enter') {
|
|
90
|
+
this.next();
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
}
|
|
93
|
+
else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
94
|
+
this.sel = (this.sel + (e.key === 'ArrowDown' ? 1 : count - 1)) % count;
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DecisionPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
99
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DecisionPromptComponent, isStandalone: true, selector: "vo-decision-prompt", inputs: { questions: "questions", answers: "answers", defaultAnswers: "defaultAnswers", skippedLabel: "skippedLabel", startLabel: "startLabel", started: "started", startedLabel: "startedLabel", bare: "bare" }, outputs: { answersChange: "answersChange", complete: "complete" }, usesOnChanges: true, ngImport: i0, template: `
|
|
100
|
+
<div
|
|
101
|
+
data-vo=""
|
|
102
|
+
class="vo-dpx"
|
|
103
|
+
[class.vo-panel]="!bare"
|
|
104
|
+
tabindex="0"
|
|
105
|
+
(keydown)="onKey($event)"
|
|
106
|
+
>
|
|
107
|
+
<div class="vo-dpx-h">
|
|
108
|
+
<span class="vo-dpx-k vo-muted vo-num">{{ done ? 'All set' : 'Question ' + (at + 1) + ' of ' + n }}</span>
|
|
109
|
+
<div class="vo-dpx-dots" aria-hidden="true">
|
|
110
|
+
@for (q of questions; track $index) {
|
|
111
|
+
<i [class.vo-on]="!done && $index === at" [class.vo-done]="done || $index < at"></i>
|
|
112
|
+
}
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
<!-- keyed by question, so each one plays its entrance -->
|
|
116
|
+
@if (done) {
|
|
117
|
+
<div class="vo-dpx-body" aria-live="polite">
|
|
118
|
+
<div class="vo-dpx-sum">
|
|
119
|
+
@for (x of questions; track $index) {
|
|
120
|
+
<div class="vo-dpx-sr vo-enter" [style.animationDelay.ms]="$index * 70">
|
|
121
|
+
<span>{{ x.label }}</span>{{ summaryAnswer($index) }}
|
|
122
|
+
</div>
|
|
123
|
+
}
|
|
124
|
+
<div class="vo-dpx-run vo-enter" [style.animationDelay.ms]="n * 70">
|
|
125
|
+
@if (started) {
|
|
126
|
+
<span style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
127
|
+
<span>{{ startedLabel ?? startLabel }}</span>
|
|
128
|
+
} @else {
|
|
129
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
130
|
+
<span class="vo-shim">{{ startLabel }}</span>
|
|
131
|
+
}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
} @else {
|
|
136
|
+
<div class="vo-dpx-body" aria-live="polite">
|
|
137
|
+
<div class="vo-dpx-q vo-enter">{{ current.question }}</div>
|
|
138
|
+
<div role="radiogroup" [attr.aria-label]="current.question">
|
|
139
|
+
@for (o of current.options; track $index) {
|
|
140
|
+
<button
|
|
141
|
+
type="button"
|
|
142
|
+
role="radio"
|
|
143
|
+
[attr.aria-checked]="$index === sel"
|
|
144
|
+
class="vo-dpx-o vo-enter"
|
|
145
|
+
[class.vo-on]="$index === sel"
|
|
146
|
+
[style.animationDelay.ms]="60 + $index * 50"
|
|
147
|
+
(click)="sel = $index"
|
|
148
|
+
(dblclick)="next()"
|
|
149
|
+
>
|
|
150
|
+
<span class="vo-kbd">{{ $index + 1 }}</span>{{ o.label }}
|
|
151
|
+
@if (o.detail) {
|
|
152
|
+
<span class="vo-d">{{ o.detail }}</span>
|
|
153
|
+
}
|
|
154
|
+
</button>
|
|
155
|
+
}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
}
|
|
159
|
+
<div class="vo-dpx-f" [class.vo-leave]="done" [attr.inert]="done ? '' : null">
|
|
160
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-dpx-skip" (click)="next(true)">Skip</button>
|
|
161
|
+
<button type="button" class="vo-pill vo-primary vo-sm vo-dpx-go" (click)="next()">
|
|
162
|
+
Continue <span class="vo-kbd">↵</span>
|
|
163
|
+
</button>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
`, isInline: true, styles: [".vo-dpx{padding:var(--vo-s-4) 0;display:flex;flex-direction:column;gap:var(--vo-s-3);outline:0;border-radius:var(--vo-r-in)}.vo-dpx.vo-panel{padding:var(--vo-s-4);border-radius:var(--vo-r-card)}.vo-dpx:focus-visible{outline:2px solid var(--vo-focus);outline-offset:6px}.vo-dpx-h{display:flex;align-items:center;justify-content:space-between}.vo-dpx-k{font-size:12px}.vo-dpx-dots{display:flex;gap:var(--vo-s-1)}.vo-dpx-dots i{width:6px;height:6px;border-radius:3px;background:var(--vo-line);transition:width .45s var(--vo-ease),background .35s}.vo-dpx-dots i.vo-on{width:16px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dpx-dots i.vo-done{background:var(--vo-accent-mark,var(--vo-accent));opacity:.4}.vo-dpx-body{min-height:168px}.vo-dpx-q{font-size:14px;font-weight:500;margin-bottom:10px;text-wrap:balance}.vo-dpx-o{display:flex;align-items:center;gap:10px;width:calc(100% + 20px);margin-inline:-10px;padding:9px 10px;border-radius:var(--vo-r-in);font-size:13.5px;text-align:left;color:var(--vo-fg2);transition:background .25s,color .25s}@media (hover:hover) and (pointer:fine){.vo-dpx-o:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-dpx-o.vo-on{background:var(--vo-sel);color:var(--vo-fg)}.vo-dpx-o .vo-kbd{width:20px;text-align:center;transition:background .25s,color .25s}.vo-dpx-o.vo-on .vo-kbd{background:var(--vo-accent);color:var(--vo-on-accent)}.vo-dpx-o .vo-d{margin-left:auto;font-size:12px;color:var(--vo-muted)}.vo-dpx-f{display:flex;justify-content:flex-end;gap:6px}.vo-dpx-sum{display:flex;flex-direction:column;gap:6px}.vo-dpx-sr{display:flex;gap:10px;font-size:13px;padding:7px 0;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-dpx-sr:last-child{border:0}.vo-dpx-sr span{color:var(--vo-muted);width:92px;flex:none}.vo-dpx-run{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px;margin-top:6px}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{font-family:inherit;font-size:11px;padding:1px 5px;border-radius:5px;background:var(--vo-chip);color:var(--vo-fg2)}.vo-pill .vo-kbd{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 var(--vo-s-1);margin-right:-6px}.vo-pill.vo-primary .vo-kbd{background:color-mix(in srgb,var(--vo-accent) 80%,#000);color:inherit}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover .vo-kbd{background:var(--vo-surface)}}.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-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-leave{animation:vo-leave .35s var(--vo-ease) both}@keyframes vo-leave{to{opacity:0;transform:translateY(-6px);filter:blur(4px)}}@media (prefers-reduced-motion:reduce){:where([data-vo]) *,:where([data-vo]) *:before,:where([data-vo]) *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.vo-shim{color:var(--vo-fg);background:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
167
|
+
}
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DecisionPromptComponent, decorators: [{
|
|
169
|
+
type: Component,
|
|
170
|
+
args: [{ selector: 'vo-decision-prompt', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
171
|
+
<div
|
|
172
|
+
data-vo=""
|
|
173
|
+
class="vo-dpx"
|
|
174
|
+
[class.vo-panel]="!bare"
|
|
175
|
+
tabindex="0"
|
|
176
|
+
(keydown)="onKey($event)"
|
|
177
|
+
>
|
|
178
|
+
<div class="vo-dpx-h">
|
|
179
|
+
<span class="vo-dpx-k vo-muted vo-num">{{ done ? 'All set' : 'Question ' + (at + 1) + ' of ' + n }}</span>
|
|
180
|
+
<div class="vo-dpx-dots" aria-hidden="true">
|
|
181
|
+
@for (q of questions; track $index) {
|
|
182
|
+
<i [class.vo-on]="!done && $index === at" [class.vo-done]="done || $index < at"></i>
|
|
183
|
+
}
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
<!-- keyed by question, so each one plays its entrance -->
|
|
187
|
+
@if (done) {
|
|
188
|
+
<div class="vo-dpx-body" aria-live="polite">
|
|
189
|
+
<div class="vo-dpx-sum">
|
|
190
|
+
@for (x of questions; track $index) {
|
|
191
|
+
<div class="vo-dpx-sr vo-enter" [style.animationDelay.ms]="$index * 70">
|
|
192
|
+
<span>{{ x.label }}</span>{{ summaryAnswer($index) }}
|
|
193
|
+
</div>
|
|
194
|
+
}
|
|
195
|
+
<div class="vo-dpx-run vo-enter" [style.animationDelay.ms]="n * 70">
|
|
196
|
+
@if (started) {
|
|
197
|
+
<span style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
198
|
+
<span>{{ startedLabel ?? startLabel }}</span>
|
|
199
|
+
} @else {
|
|
200
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
201
|
+
<span class="vo-shim">{{ startLabel }}</span>
|
|
202
|
+
}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
} @else {
|
|
207
|
+
<div class="vo-dpx-body" aria-live="polite">
|
|
208
|
+
<div class="vo-dpx-q vo-enter">{{ current.question }}</div>
|
|
209
|
+
<div role="radiogroup" [attr.aria-label]="current.question">
|
|
210
|
+
@for (o of current.options; track $index) {
|
|
211
|
+
<button
|
|
212
|
+
type="button"
|
|
213
|
+
role="radio"
|
|
214
|
+
[attr.aria-checked]="$index === sel"
|
|
215
|
+
class="vo-dpx-o vo-enter"
|
|
216
|
+
[class.vo-on]="$index === sel"
|
|
217
|
+
[style.animationDelay.ms]="60 + $index * 50"
|
|
218
|
+
(click)="sel = $index"
|
|
219
|
+
(dblclick)="next()"
|
|
220
|
+
>
|
|
221
|
+
<span class="vo-kbd">{{ $index + 1 }}</span>{{ o.label }}
|
|
222
|
+
@if (o.detail) {
|
|
223
|
+
<span class="vo-d">{{ o.detail }}</span>
|
|
224
|
+
}
|
|
225
|
+
</button>
|
|
226
|
+
}
|
|
227
|
+
</div>
|
|
228
|
+
</div>
|
|
229
|
+
}
|
|
230
|
+
<div class="vo-dpx-f" [class.vo-leave]="done" [attr.inert]="done ? '' : null">
|
|
231
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-dpx-skip" (click)="next(true)">Skip</button>
|
|
232
|
+
<button type="button" class="vo-pill vo-primary vo-sm vo-dpx-go" (click)="next()">
|
|
233
|
+
Continue <span class="vo-kbd">↵</span>
|
|
234
|
+
</button>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
`, styles: [".vo-dpx{padding:var(--vo-s-4) 0;display:flex;flex-direction:column;gap:var(--vo-s-3);outline:0;border-radius:var(--vo-r-in)}.vo-dpx.vo-panel{padding:var(--vo-s-4);border-radius:var(--vo-r-card)}.vo-dpx:focus-visible{outline:2px solid var(--vo-focus);outline-offset:6px}.vo-dpx-h{display:flex;align-items:center;justify-content:space-between}.vo-dpx-k{font-size:12px}.vo-dpx-dots{display:flex;gap:var(--vo-s-1)}.vo-dpx-dots i{width:6px;height:6px;border-radius:3px;background:var(--vo-line);transition:width .45s var(--vo-ease),background .35s}.vo-dpx-dots i.vo-on{width:16px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dpx-dots i.vo-done{background:var(--vo-accent-mark,var(--vo-accent));opacity:.4}.vo-dpx-body{min-height:168px}.vo-dpx-q{font-size:14px;font-weight:500;margin-bottom:10px;text-wrap:balance}.vo-dpx-o{display:flex;align-items:center;gap:10px;width:calc(100% + 20px);margin-inline:-10px;padding:9px 10px;border-radius:var(--vo-r-in);font-size:13.5px;text-align:left;color:var(--vo-fg2);transition:background .25s,color .25s}@media (hover:hover) and (pointer:fine){.vo-dpx-o:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-dpx-o.vo-on{background:var(--vo-sel);color:var(--vo-fg)}.vo-dpx-o .vo-kbd{width:20px;text-align:center;transition:background .25s,color .25s}.vo-dpx-o.vo-on .vo-kbd{background:var(--vo-accent);color:var(--vo-on-accent)}.vo-dpx-o .vo-d{margin-left:auto;font-size:12px;color:var(--vo-muted)}.vo-dpx-f{display:flex;justify-content:flex-end;gap:6px}.vo-dpx-sum{display:flex;flex-direction:column;gap:6px}.vo-dpx-sr{display:flex;gap:10px;font-size:13px;padding:7px 0;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-dpx-sr:last-child{border:0}.vo-dpx-sr span{color:var(--vo-muted);width:92px;flex:none}.vo-dpx-run{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px;margin-top:6px}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{font-family:inherit;font-size:11px;padding:1px 5px;border-radius:5px;background:var(--vo-chip);color:var(--vo-fg2)}.vo-pill .vo-kbd{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 var(--vo-s-1);margin-right:-6px}.vo-pill.vo-primary .vo-kbd{background:color-mix(in srgb,var(--vo-accent) 80%,#000);color:inherit}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover .vo-kbd{background:var(--vo-surface)}}.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-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-leave{animation:vo-leave .35s var(--vo-ease) both}@keyframes vo-leave{to{opacity:0;transform:translateY(-6px);filter:blur(4px)}}@media (prefers-reduced-motion:reduce){:where([data-vo]) *,:where([data-vo]) *:before,:where([data-vo]) *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.vo-shim{color:var(--vo-fg);background:none}}\n"] }]
|
|
238
|
+
}], propDecorators: { questions: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], answers: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], defaultAnswers: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], skippedLabel: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}], startLabel: [{
|
|
247
|
+
type: Input
|
|
248
|
+
}], started: [{
|
|
249
|
+
type: Input
|
|
250
|
+
}], startedLabel: [{
|
|
251
|
+
type: Input
|
|
252
|
+
}], bare: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], answersChange: [{
|
|
255
|
+
type: Output
|
|
256
|
+
}], complete: [{
|
|
257
|
+
type: Output
|
|
258
|
+
}] } });
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaXNpb24tcHJvbXB0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RlY2lzaW9uLXByb21wdC9kZWNpc2lvbi1wcm9tcHQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLGlGQUFpRjtBQUNqRiw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLGlGQUFpRjtBQUNqRixrRkFBa0Y7QUFDbEYsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBRTNFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFpQnpELGdHQUFnRztBQTRFaEcsTUFBTSxPQUFPLHVCQUF1QjtJQTNFcEM7UUE0RUUsOENBQThDO1FBQ3JDLGNBQVMsR0FBdUIsRUFBRSxDQUFDO1FBRzVDLDREQUE0RDtRQUNuRCxtQkFBYyxHQUFzQixFQUFFLENBQUM7UUFDaEQsb0RBQW9EO1FBQzNDLGlCQUFZLEdBQUcsZUFBZSxDQUFDO1FBQ3hDLDZEQUE2RDtRQUNwRCxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ2pDLGdGQUFnRjtRQUN2RSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBR3pCLHdGQUF3RjtRQUMvRSxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBRXJCLCtEQUErRDtRQUNyRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDO1FBQ2hFLDBIQUEwSDtRQUNoSCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFM0QsdURBQXVEO1FBQ3ZELFFBQUcsR0FBRyxDQUFDLENBQUM7UUFDUiwrREFBK0Q7UUFDdkQsYUFBUSxHQUFzQixFQUFFLENBQUM7S0E4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QUF0QixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmcmFtZXdvcmsvYW5ndWxhci9kZWNpc2lvbi1wcm9tcHQvZGVjaXNpb24tcHJvbXB0LmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2RlY2lzaW9uLXByb21wdC9EZWNpc2lvblByb21wdC50c3guXG4vLyBUaGUgYWdlbnQgYXNrcyBhIGZldyBxdWljayBxdWVzdGlvbnMgYmVmb3JlIGl0IHN0YXJ0czogb25lIHF1ZXN0aW9uIGF0IGEgdGltZSxcbi8vIG51bWJlciBrZXlzIHBpY2sgYW4gb3B0aW9uLCBFbnRlciBjb250aW51ZXMgYW5kIFNraXAgbGV0cyB0aGUgYWdlbnQgZGVjaWRlLlxuLy8gT25jZSBldmVyeSBxdWVzdGlvbiBpcyBhbnN3ZXJlZCB0aGUgYm9keSBzZXR0bGVzIGludG8gYSBzdW1tYXJ5IHdpdGggYSBsaW5lXG4vLyB0aGF0IHNheXMgdGhlIGFnZW50IGlzIGdldHRpbmcgZ29pbmcuIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyB0aGUgUmVhY3Rcbi8vIGNhbGxiYWNrcyBiZWNvbWUgQE91dHB1dCBFdmVudEVtaXR0ZXJzLCBhbmQgdGhlIGtleWJvYXJkIC8gc3RhZ2dlciBiZWhhdmlvdXIgaXNcbi8vIHBvcnRlZCBmcm9tIHRoZSB2YW5pbGxhIHNvdXJjZSAoZGVjaXNpb24tcHJvbXB0LmpzKS5cbi8vXG4vLyBJY29uIHN1YnN0aXR1dGlvbjogdGhlIFJlYWN0IHN1bW1hcnkgdXNlcyB0aGUgUGhvc3Bob3IgXCJjaGVja1wiIGdseXBoIGZvciB0aGVcbi8vIHN0YXJ0ZWQgbGluZTsgdGhlIEFuZ3VsYXIgaWNvbiBzZXQgaGFzIGBjaGVja2AsIHNvIGl0IGlzIHVzZWQgdW5jaGFuZ2VkLlxuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcblxuLyoqIE9uZSBvcHRpb24gaW4gYSBxdWVzdGlvbjogaXRzIGxhYmVsIGFuZCBhbiBvcHRpb25hbCBxdWlldCBkZXRhaWwgYXQgdGhlIGVuZCBvZiB0aGUgcm93LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWNpc2lvbk9wdGlvbiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBRdWlldCB0ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIHJvdywgbGlrZSBcIjMgZnJhbWVzXCIgb3IgXCJSZWNvbW1lbmRlZFwiLiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcXVlc3Rpb24gdGhlIGFnZW50IGFza3MsIHdpdGggYSBzaG9ydCBuYW1lIGZvciB0aGUgc3VtbWFyeSBhbmQgaXRzIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2lzaW9uUXVlc3Rpb24ge1xuICBxdWVzdGlvbjogc3RyaW5nO1xuICAvKiogQSBzaG9ydCBuYW1lIGZvciB0aGUgcXVlc3Rpb24gaW4gdGhlIHN1bW1hcnksIGxpa2UgXCJTY29wZVwiLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICBvcHRpb25zOiBEZWNpc2lvbk9wdGlvbltdO1xufVxuXG4vKiogVGhlIGFnZW50IGFza3MgYSBmZXcgcXVpY2sgcXVlc3Rpb25zIGJlZm9yZSBpdCBzdGFydHMuIE51bWJlciBrZXlzIHBpY2ssIEVudGVyIGNvbnRpbnVlcy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLWRlY2lzaW9uLXByb21wdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1kcHhcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAoa2V5ZG93bik9XCJvbktleSgkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tZHB4LWhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kcHgtayB2by1tdXRlZCB2by1udW1cIj57eyBkb25lID8gJ0FsbCBzZXQnIDogJ1F1ZXN0aW9uICcgKyAoYXQgKyAxKSArICcgb2YgJyArIG4gfX08L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1kcHgtZG90c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIEBmb3IgKHEgb2YgcXVlc3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxpIFtjbGFzcy52by1vbl09XCIhZG9uZSAmJiAkaW5kZXggPT09IGF0XCIgW2NsYXNzLnZvLWRvbmVdPVwiZG9uZSB8fCAkaW5kZXggPCBhdFwiPjwvaT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIGtleWVkIGJ5IHF1ZXN0aW9uLCBzbyBlYWNoIG9uZSBwbGF5cyBpdHMgZW50cmFuY2UgLS0+XG4gICAgICBAaWYgKGRvbmUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWRweC1ib2R5XCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWRweC1zdW1cIj5cbiAgICAgICAgICAgIEBmb3IgKHggb2YgcXVlc3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWRweC1zciB2by1lbnRlclwiIFtzdHlsZS5hbmltYXRpb25EZWxheS5tc109XCIkaW5kZXggKiA3MFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHgubGFiZWwgfX08L3NwYW4+e3sgc3VtbWFyeUFuc3dlcigkaW5kZXgpIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWRweC1ydW4gdm8tZW50ZXJcIiBbc3R5bGUuYW5pbWF0aW9uRGVsYXkubXNdPVwibiAqIDcwXCI+XG4gICAgICAgICAgICAgIEBpZiAoc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tdm8tb2spXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydGVkTGFiZWwgPz8gc3RhcnRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10aGluayB2by1vblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxpPjwvaT48aT48L2k+PGk+PC9pPjxpPjwvaT48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zaGltXCI+e3sgc3RhcnRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1kcHgtYm9keVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1kcHgtcSB2by1lbnRlclwiPnt7IGN1cnJlbnQucXVlc3Rpb24gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IHJvbGU9XCJyYWRpb2dyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjdXJyZW50LnF1ZXN0aW9uXCI+XG4gICAgICAgICAgICBAZm9yIChvIG9mIGN1cnJlbnQub3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCIkaW5kZXggPT09IHNlbFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1kcHgtbyB2by1lbnRlclwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnZvLW9uXT1cIiRpbmRleCA9PT0gc2VsXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYW5pbWF0aW9uRGVsYXkubXNdPVwiNjAgKyAkaW5kZXggKiA1MFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbCA9ICRpbmRleFwiXG4gICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm5leHQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWtiZFwiPnt7ICRpbmRleCArIDEgfX08L3NwYW4+e3sgby5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIEBpZiAoby5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IG8uZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cInZvLWRweC1mXCIgW2NsYXNzLnZvLWxlYXZlXT1cImRvbmVcIiBbYXR0ci5pbmVydF09XCJkb25lID8gJycgOiBudWxsXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1naG9zdCB2by1zbSB2by1kcHgtc2tpcFwiIChjbGljayk9XCJuZXh0KHRydWUpXCI+U2tpcDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tcHJpbWFyeSB2by1zbSB2by1kcHgtZ29cIiAoY2xpY2spPVwibmV4dCgpXCI+XG4gICAgICAgICAgQ29udGludWUgPHNwYW4gY2xhc3M9XCJ2by1rYmRcIj7ihrU8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9kZWNpc2lvbi1wcm9tcHQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGVjaXNpb25Qcm9tcHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogVGhlIHF1ZXN0aW9ucyB0aGUgYWdlbnQgYXNrcywgaW4gb3JkZXIuICovXG4gIEBJbnB1dCgpIHF1ZXN0aW9uczogRGVjaXNpb25RdWVzdGlvbltdID0gW107XG4gIC8qKiBUaGUgYW5zd2VycyBzbyBmYXIsIGFuIG9wdGlvbidzIGluZGV4IG9yIG51bGwgZm9yIGEgc2tpcHBlZCBxdWVzdGlvbi4gTGVhdmUgaXQgb3V0IHRvIGxldCBDb250aW51ZSBhbmQgU2tpcCBmaWxsIGl0LiAqL1xuICBASW5wdXQoKSBhbnN3ZXJzPzogKG51bWJlciB8IG51bGwpW107XG4gIC8qKiBUaGUgYW5zd2VycyB0aGUgcHJvbXB0IHN0YXJ0cyB3aXRoIHdoZW4gdW5jb250cm9sbGVkLiAqL1xuICBASW5wdXQoKSBkZWZhdWx0QW5zd2VyczogKG51bWJlciB8IG51bGwpW10gPSBbXTtcbiAgLyoqIFdoYXQgdGhlIHN1bW1hcnkgc2F5cyBmb3IgYSBza2lwcGVkIHF1ZXN0aW9uLiAqL1xuICBASW5wdXQoKSBza2lwcGVkTGFiZWwgPSAnQWdlbnQgZGVjaWRlcyc7XG4gIC8qKiBUaGUgbGluZSB1bmRlciB0aGUgc3VtbWFyeSB3aGlsZSB0aGUgYWdlbnQgZ2V0cyBnb2luZy4gKi9cbiAgQElucHV0KCkgc3RhcnRMYWJlbCA9ICdTdGFydGluZyc7XG4gIC8qKiBUaGUgYWdlbnQgaGFzIGdvdCBnb2luZzogdGhlIGxpbmUgdW5kZXIgdGhlIHN1bW1hcnkgc2V0dGxlcyB3aXRoIGEgY2hlY2suICovXG4gIEBJbnB1dCgpIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgLyoqIFdoYXQgdGhhdCBsaW5lIHNheXMgb25jZSBzdGFydGVkLiBEZWZhdWx0cyB0byBzdGFydExhYmVsLiAqL1xuICBASW5wdXQoKSBzdGFydGVkTGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBTaXRzIGZsYXQgaW4gYSBjaGF0IHRocmVhZCAodGhlIGRlZmF1bHQpLiBTZXQgZmFsc2UgdG8gZ2l2ZSBpdCBhIGNhcmQgb2YgaXRzIG93bi4gKi9cbiAgQElucHV0KCkgYmFyZSA9IHRydWU7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGFuc3dlcnMgY2hhbmdlIChhIHBpY2ssIG9yIGEgc2tpcCkuICovXG4gIEBPdXRwdXQoKSBhbnN3ZXJzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwobnVtYmVyIHwgbnVsbClbXT4oKTtcbiAgLyoqIEVtaXR0ZWQgb25jZSBldmVyeSBxdWVzdGlvbiBpcyBhbnN3ZXJlZCwgd2l0aCB0aGUgcGlja2VkIG9wdGlvbidzIGluZGV4IGZvciBlYWNoLCBvciBudWxsIHdoZXJlIHRoZSBwZXJzb24gc2tpcHBlZC4gKi9cbiAgQE91dHB1dCgpIGNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjwobnVtYmVyIHwgbnVsbClbXT4oKTtcblxuICAvKiogVGhlIGhpZ2hsaWdodGVkIG9wdGlvbiBmb3IgdGhlIGN1cnJlbnQgcXVlc3Rpb24uICovXG4gIHNlbCA9IDA7XG4gIC8vIHRoZSBpbnRlcm5hbCBhbnN3ZXIgbGlzdCB1c2VkIHdoZW4gYGFuc3dlcnNgIGlzIG5vdCBwcm92aWRlZFxuICBwcml2YXRlIGludGVybmFsOiAobnVtYmVyIHwgbnVsbClbXSA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGVmYXVsdEFuc3dlcnMnXSAmJiB0aGlzLmFuc3dlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnRlcm5hbCA9IFsuLi50aGlzLmRlZmF1bHRBbnN3ZXJzXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBsaXN0KCk6IChudW1iZXIgfCBudWxsKVtdIHtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXJzID8/ICh0aGlzLmludGVybmFsLmxlbmd0aCA/IHRoaXMuaW50ZXJuYWwgOiAodGhpcy5pbnRlcm5hbCA9IFsuLi50aGlzLmRlZmF1bHRBbnN3ZXJzXSkpO1xuICB9XG5cbiAgLyoqIEhvdyBtYW55IHF1ZXN0aW9ucyB0aGVyZSBhcmUuICovXG4gIGdldCBuKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBIb3cgbWFueSBoYXZlIGJlZW4gYW5zd2VyZWQgc28gZmFyLiAqL1xuICBnZXQgYXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5saXN0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBxdWVzdGlvbiBoYXMgYW4gYW5zd2VyLiAqL1xuICBnZXQgZG9uZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdCA+PSB0aGlzLm47XG4gIH1cblxuICAvKiogVGhlIHF1ZXN0aW9uIGJlaW5nIGFza2VkIG5vdy4gKi9cbiAgZ2V0IGN1cnJlbnQoKTogRGVjaXNpb25RdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zW01hdGgubWluKHRoaXMuYXQsIHRoaXMubiAtIDEpXTtcbiAgfVxuXG4gIHN1bW1hcnlBbnN3ZXIoaTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhID0gdGhpcy5saXN0W2ldO1xuICAgIHJldHVybiBhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLnNraXBwZWRMYWJlbFxuICAgICAgOiB0aGlzLnF1ZXN0aW9uc1tpXT8ub3B0aW9uc1thXT8ubGFiZWwgPz8gdGhpcy5za2lwcGVkTGFiZWw7XG4gIH1cblxuICBuZXh0KHNraXBwZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvbmUpIHJldHVybjtcbiAgICBjb25zdCBhbGwgPSBbLi4udGhpcy5saXN0LCBza2lwcGVkID8gbnVsbCA6IHRoaXMuc2VsXTtcbiAgICBpZiAodGhpcy5hbnN3ZXJzID09PSB1bmRlZmluZWQpIHRoaXMuaW50ZXJuYWwgPSBhbGw7XG4gICAgdGhpcy5zZWwgPSAwO1xuICAgIHRoaXMuYW5zd2Vyc0NoYW5nZS5lbWl0KGFsbCk7XG4gICAgaWYgKGFsbC5sZW5ndGggPj0gdGhpcy5uKSB0aGlzLmNvbXBsZXRlLmVtaXQoYWxsKTtcbiAgfVxuXG4gIG9uS2V5KGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb25lKSByZXR1cm47XG4gICAgY29uc3QgY291bnQgPSB0aGlzLmN1cnJlbnQub3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKC9eWzEtOV0kLy50ZXN0KGUua2V5KSAmJiArZS5rZXkgPD0gY291bnQpIHtcbiAgICAgIHRoaXMuc2VsID0gK2Uua2V5IC0gMTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJyB8fCBlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICB0aGlzLnNlbCA9ICh0aGlzLnNlbCArIChlLmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogY291bnQgLSAxKSkgJSBjb3VudDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|