@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,498 @@
|
|
|
1
|
+
// framework/angular/permission-gate/permission-gate.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/permission-gate/PermissionGate.tsx.
|
|
4
|
+
// The agent asks before it acts: a card with the question, the scopes to tick,
|
|
5
|
+
// and a footer with how long the grant lasts and the two answers (Allow /
|
|
6
|
+
// decline). Once allowed it gives way to a shorter result row (a spinner while
|
|
7
|
+
// the agent works, a green check when done) with a Revoke button; declining
|
|
8
|
+
// shows an undoable notice. A follow-up ask mid-run turns the icon tile amber.
|
|
9
|
+
// Inputs mirror the React props; React callbacks become @Output EventEmitters.
|
|
10
|
+
//
|
|
11
|
+
// Icon note: the React default tile icon is a shield, which is not in the
|
|
12
|
+
// Angular core glyph set. The default here is `figma` (as in the Vanilla demo);
|
|
13
|
+
// pass any VoIconName via [iconName] to override. Available glyphs: see
|
|
14
|
+
// VoIconName in ../core/icon.component.
|
|
15
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, inject, } from '@angular/core';
|
|
16
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
17
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
/** The agent asks before it acts: pick the scopes and how long they last, then allow or decline. */
|
|
20
|
+
export class PermissionGateComponent {
|
|
21
|
+
constructor() {
|
|
22
|
+
/** The question, like "Allow the agent to edit Figma?". */
|
|
23
|
+
this.title = '';
|
|
24
|
+
/** The glyph in the tile beside the question. Defaults to figma (React uses a shield). */
|
|
25
|
+
this.iconName = 'figma';
|
|
26
|
+
this.scopes = [];
|
|
27
|
+
this.defaultValue = [];
|
|
28
|
+
this.valueChange = new EventEmitter();
|
|
29
|
+
/** How long the permission lasts, picked from a small dropdown in the footer. */
|
|
30
|
+
this.durations = ['This task', 'Today', 'Always'];
|
|
31
|
+
/** The quiet line under each duration in its menu, by duration. */
|
|
32
|
+
this.durationDetails = {
|
|
33
|
+
'This task': 'Until the task is done',
|
|
34
|
+
Today: 'Until midnight',
|
|
35
|
+
Always: 'Until you revoke it',
|
|
36
|
+
};
|
|
37
|
+
this.durationChange = new EventEmitter();
|
|
38
|
+
this.defaultStatus = 'asking';
|
|
39
|
+
this.statusChange = new EventEmitter();
|
|
40
|
+
/** Called with the ticked scopes and the duration. Return a promise and the button spins until it settles. */
|
|
41
|
+
this.allowEvent = new EventEmitter();
|
|
42
|
+
this.declineEvent = new EventEmitter();
|
|
43
|
+
/** Called by Revoke, after allowing. */
|
|
44
|
+
this.revokeEvent = new EventEmitter();
|
|
45
|
+
/** Called by Undo, after declining. */
|
|
46
|
+
this.undoEvent = new EventEmitter();
|
|
47
|
+
/** The agent is still working under the permission: a spinner instead of the green check. */
|
|
48
|
+
this.working = false;
|
|
49
|
+
/** A follow-up ask in the middle of a run, for one more scope: the icon tile turns amber. */
|
|
50
|
+
this.followUp = false;
|
|
51
|
+
/** The decline button. Defaults to "Not now"; a follow-up ask might say "Skip this frame". */
|
|
52
|
+
this.declineLabel = 'Not now';
|
|
53
|
+
/** Shown after Not now. */
|
|
54
|
+
this.declinedTitle = 'The agent will skip these changes';
|
|
55
|
+
/** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
|
|
56
|
+
this.bare = true;
|
|
57
|
+
this.motion = inject(ReducedMotionService);
|
|
58
|
+
/** Internal state when the matching input is left uncontrolled. */
|
|
59
|
+
this.innerTicked = [];
|
|
60
|
+
this.innerStatus = 'asking';
|
|
61
|
+
this.menuOpen = false;
|
|
62
|
+
this.waiting = false;
|
|
63
|
+
// a revoked permission fades out before the scopes come back
|
|
64
|
+
this.leaving = false;
|
|
65
|
+
// the scopes play their entrance when they come back, not when the card first appears
|
|
66
|
+
this.back = 0;
|
|
67
|
+
this.granted = 0;
|
|
68
|
+
// the scopes give way to a shorter result row: the gate keeps the height it had and centres the row
|
|
69
|
+
this.held = null;
|
|
70
|
+
}
|
|
71
|
+
ngOnChanges(changes) {
|
|
72
|
+
if (changes['defaultValue'] && this.value === undefined && !this.innerTicked.length) {
|
|
73
|
+
this.innerTicked = [...this.defaultValue];
|
|
74
|
+
}
|
|
75
|
+
if (changes['defaultStatus'] && this.status === undefined) {
|
|
76
|
+
this.innerStatus = this.defaultStatus;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
get ticked() {
|
|
80
|
+
return this.value ?? (this.innerTicked.length ? this.innerTicked : this.defaultValue);
|
|
81
|
+
}
|
|
82
|
+
get dur() {
|
|
83
|
+
return this.duration ?? this.innerDur ?? this.defaultDuration ?? this.durations[0] ?? '';
|
|
84
|
+
}
|
|
85
|
+
get state() {
|
|
86
|
+
return this.status ?? this.innerStatus;
|
|
87
|
+
}
|
|
88
|
+
get n() {
|
|
89
|
+
return this.ticked.length;
|
|
90
|
+
}
|
|
91
|
+
// "For this task" in the menu and "for this task" after Allowed; Always reads as it is
|
|
92
|
+
durLabel(d) {
|
|
93
|
+
return /^always$/i.test(d) ? d : 'For ' + d.toLowerCase();
|
|
94
|
+
}
|
|
95
|
+
durSpan(d) {
|
|
96
|
+
return /^always$/i.test(d) ? 'always' : 'for ' + d.toLowerCase();
|
|
97
|
+
}
|
|
98
|
+
setTicked(keys) {
|
|
99
|
+
if (this.value === undefined)
|
|
100
|
+
this.innerTicked = keys;
|
|
101
|
+
this.valueChange.emit(keys);
|
|
102
|
+
}
|
|
103
|
+
setStatus(s) {
|
|
104
|
+
if (this.status === undefined)
|
|
105
|
+
this.innerStatus = s;
|
|
106
|
+
this.statusChange.emit(s);
|
|
107
|
+
}
|
|
108
|
+
toggle(key) {
|
|
109
|
+
const next = this.ticked.includes(key)
|
|
110
|
+
? this.ticked.filter((k) => k !== key)
|
|
111
|
+
: this.scopes.map((s) => s.key).filter((k) => k === key || this.ticked.includes(k));
|
|
112
|
+
this.setTicked(next);
|
|
113
|
+
}
|
|
114
|
+
toggleMenu() {
|
|
115
|
+
this.menuOpen = !this.menuOpen;
|
|
116
|
+
}
|
|
117
|
+
pickDuration(d) {
|
|
118
|
+
if (this.duration === undefined)
|
|
119
|
+
this.innerDur = d;
|
|
120
|
+
this.durationChange.emit(d);
|
|
121
|
+
this.menuOpen = false;
|
|
122
|
+
}
|
|
123
|
+
hold() {
|
|
124
|
+
if (this.held === null)
|
|
125
|
+
this.held = 0;
|
|
126
|
+
}
|
|
127
|
+
async allow() {
|
|
128
|
+
if (!this.n || this.waiting)
|
|
129
|
+
return;
|
|
130
|
+
this.waiting = true;
|
|
131
|
+
this.granted = this.n;
|
|
132
|
+
this.allowEvent.emit({ keys: this.ticked, duration: this.dur });
|
|
133
|
+
// the Allow button spins briefly, as the React port awaits onAllow
|
|
134
|
+
await new Promise((r) => setTimeout(r, this.motion.reduce() ? 0 : 500));
|
|
135
|
+
this.waiting = false;
|
|
136
|
+
this.hold();
|
|
137
|
+
this.setStatus('allowed');
|
|
138
|
+
}
|
|
139
|
+
decline() {
|
|
140
|
+
this.hold();
|
|
141
|
+
this.setStatus('declined');
|
|
142
|
+
this.declineEvent.emit();
|
|
143
|
+
}
|
|
144
|
+
revoke() {
|
|
145
|
+
this.leaving = true;
|
|
146
|
+
clearTimeout(this.leaveTimer);
|
|
147
|
+
this.leaveTimer = setTimeout(() => {
|
|
148
|
+
this.leaving = false;
|
|
149
|
+
this.held = null;
|
|
150
|
+
this.setStatus('asking');
|
|
151
|
+
this.back += 1;
|
|
152
|
+
this.revokeEvent.emit();
|
|
153
|
+
}, this.motion.reduce() ? 0 : 300);
|
|
154
|
+
}
|
|
155
|
+
undo() {
|
|
156
|
+
this.held = null;
|
|
157
|
+
this.setStatus('asking');
|
|
158
|
+
this.back += 1;
|
|
159
|
+
this.undoEvent.emit();
|
|
160
|
+
}
|
|
161
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionGateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
162
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PermissionGateComponent, isStandalone: true, selector: "vo-permission-gate", inputs: { title: "title", subtitle: "subtitle", iconName: "iconName", scopes: "scopes", value: "value", defaultValue: "defaultValue", durations: "durations", durationDetails: "durationDetails", duration: "duration", defaultDuration: "defaultDuration", status: "status", defaultStatus: "defaultStatus", allowedDetail: "allowedDetail", allowedTitle: "allowedTitle", working: "working", meta: "meta", followUp: "followUp", declineLabel: "declineLabel", declinedTitle: "declinedTitle", declinedDetail: "declinedDetail", bare: "bare" }, outputs: { valueChange: "valueChange", durationChange: "durationChange", statusChange: "statusChange", allowEvent: "allowEvent", declineEvent: "declineEvent", revokeEvent: "revokeEvent", undoEvent: "undoEvent" }, usesOnChanges: true, ngImport: i0, template: `
|
|
163
|
+
<div
|
|
164
|
+
data-vo=""
|
|
165
|
+
class="vo-pgx"
|
|
166
|
+
[class.vo-panel]="!bare"
|
|
167
|
+
[class.vo-esc]="followUp && state === 'asking'"
|
|
168
|
+
[class.vo-held]="held !== null"
|
|
169
|
+
[style.minHeight.px]="held !== null ? held : null"
|
|
170
|
+
>
|
|
171
|
+
<div class="vo-pgx-h">
|
|
172
|
+
<span class="vo-pgx-ic"><vo-icon [name]="iconName"></vo-icon></span>
|
|
173
|
+
<div class="vo-pgx-ht">
|
|
174
|
+
<b>{{ title }}</b>
|
|
175
|
+
@if (subtitle) {
|
|
176
|
+
<span class="vo-muted">{{ subtitle }}</span>
|
|
177
|
+
}
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
@if (state === 'asking') {
|
|
182
|
+
<div class="vo-pgx-sc" [class.vo-enter]="back > 0">
|
|
183
|
+
@for (s of scopes; track s.key) {
|
|
184
|
+
<label class="vo-pgx-o">
|
|
185
|
+
<input
|
|
186
|
+
type="checkbox"
|
|
187
|
+
[checked]="ticked.includes(s.key)"
|
|
188
|
+
(change)="toggle(s.key)"
|
|
189
|
+
/>
|
|
190
|
+
<span class="vo-bx"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
191
|
+
<span class="vo-t"
|
|
192
|
+
>{{ s.label }}@if (s.detail) {<span class="vo-d">{{ s.detail }}</span>}</span
|
|
193
|
+
>
|
|
194
|
+
@if (s.risk) {
|
|
195
|
+
<span class="vo-tag vo-warn" [attr.title]="s.riskDetail ?? null">{{ s.risk }}</span>
|
|
196
|
+
}
|
|
197
|
+
</label>
|
|
198
|
+
}
|
|
199
|
+
</div>
|
|
200
|
+
<div class="vo-pgx-f" [class.vo-enter]="back > 0">
|
|
201
|
+
<button
|
|
202
|
+
type="button"
|
|
203
|
+
class="vo-pgx-db"
|
|
204
|
+
aria-haspopup="menu"
|
|
205
|
+
[attr.aria-expanded]="menuOpen"
|
|
206
|
+
aria-label="How long"
|
|
207
|
+
(click)="toggleMenu()"
|
|
208
|
+
>
|
|
209
|
+
<span class="vo-pgx-dv">{{ durLabel(dur) }}</span>
|
|
210
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
211
|
+
</button>
|
|
212
|
+
<span class="vo-sp"></span>
|
|
213
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-pgx-no" (click)="decline()">
|
|
214
|
+
{{ declineLabel }}
|
|
215
|
+
</button>
|
|
216
|
+
<button
|
|
217
|
+
type="button"
|
|
218
|
+
class="vo-pill vo-primary vo-sm vo-pgx-ok"
|
|
219
|
+
[disabled]="!n || waiting"
|
|
220
|
+
(click)="allow()"
|
|
221
|
+
>
|
|
222
|
+
@if (waiting) {
|
|
223
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
224
|
+
} @else {
|
|
225
|
+
{{ n ? 'Allow ' + n + (n > 1 ? ' scopes' : ' scope') : 'Pick a scope' }}
|
|
226
|
+
}
|
|
227
|
+
</button>
|
|
228
|
+
</div>
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
<div
|
|
232
|
+
class="vo-pop vo-pgx-pop"
|
|
233
|
+
role="menu"
|
|
234
|
+
aria-label="How long"
|
|
235
|
+
[hidden]="!menuOpen"
|
|
236
|
+
>
|
|
237
|
+
@for (d of durations; track d) {
|
|
238
|
+
<button
|
|
239
|
+
type="button"
|
|
240
|
+
class="vo-mi"
|
|
241
|
+
role="menuitemradio"
|
|
242
|
+
[attr.aria-checked]="d === dur"
|
|
243
|
+
(click)="pickDuration(d)"
|
|
244
|
+
>
|
|
245
|
+
<span
|
|
246
|
+
>{{ durLabel(d) }}@if (durationDetails[d]) {<span class="vo-d">{{
|
|
247
|
+
durationDetails[d]
|
|
248
|
+
}}</span>}</span
|
|
249
|
+
>
|
|
250
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
251
|
+
</button>
|
|
252
|
+
}
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
@if (state === 'allowed') {
|
|
256
|
+
<div
|
|
257
|
+
class="vo-pgx-done"
|
|
258
|
+
[class.vo-run]="working"
|
|
259
|
+
[class.vo-ok]="!working"
|
|
260
|
+
[class.vo-leave]="leaving"
|
|
261
|
+
[class.vo-enter]="!leaving"
|
|
262
|
+
>
|
|
263
|
+
<span class="vo-g">
|
|
264
|
+
@if (working) {
|
|
265
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
266
|
+
} @else {
|
|
267
|
+
<vo-icon name="ok"></vo-icon>
|
|
268
|
+
}
|
|
269
|
+
</span>
|
|
270
|
+
<span class="vo-t">
|
|
271
|
+
<b class="vo-pgx-a">{{
|
|
272
|
+
allowedTitle ??
|
|
273
|
+
'Allowed ' +
|
|
274
|
+
(granted || n) +
|
|
275
|
+
((granted || n) > 1 ? ' scopes ' : ' scope ') +
|
|
276
|
+
durSpan(dur)
|
|
277
|
+
}}</b>
|
|
278
|
+
@if (allowedDetail !== undefined) {
|
|
279
|
+
<span class="vo-pgx-d">{{ allowedDetail }}</span>
|
|
280
|
+
}
|
|
281
|
+
</span>
|
|
282
|
+
@if (meta !== undefined) {
|
|
283
|
+
<span class="vo-pgx-tm vo-num">{{ meta }}</span>
|
|
284
|
+
}
|
|
285
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="revoke()">Revoke</button>
|
|
286
|
+
</div>
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
@if (state === 'declined') {
|
|
290
|
+
<div class="vo-pgx-done vo-enter" style="background:var(--vo-chip)">
|
|
291
|
+
<vo-icon name="info"></vo-icon>
|
|
292
|
+
<span class="vo-t"
|
|
293
|
+
>{{ declinedTitle }}@if (declinedDetail) {<span>{{ declinedDetail }}</span>}</span
|
|
294
|
+
>
|
|
295
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="undo()">Undo</button>
|
|
296
|
+
</div>
|
|
297
|
+
}
|
|
298
|
+
</div>
|
|
299
|
+
`, isInline: true, styles: [".vo-pgx{position:relative;width:100%;max-width:400px;margin:0 auto;padding:var(--vo-s-1) 0;display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-pgx.vo-panel{padding:var(--vo-s-4)}.vo-pgx-h{display:flex;gap:var(--vo-s-3);align-items:center}.vo-pgx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;flex:none}.vo-pgx-ht{display:flex;flex-direction:column;min-width:0}.vo-pgx-ht b{font-weight:500;font-size:14px}.vo-pgx-ht span{font-size:13px}.vo-pgx-sc{display:flex;flex-direction:column;margin-inline:-8px}.vo-pgx-o{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-2);border-radius:calc(10px * var(--vo-rk));cursor:pointer;font-size:13.5px;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-pgx-o:hover{background:var(--vo-row)}}.vo-pgx-o input{position:absolute;opacity:0;pointer-events:none}.vo-pgx-o .vo-bx{width:18px;height:18px;border-radius:calc(6px * var(--vo-rk));box-shadow:inset 0 0 0 1.5px color-mix(in srgb,var(--vo-muted) 80%,var(--vo-surface));display:grid;place-items:center;color:transparent;flex:none;transition:background .3s var(--vo-ease),box-shadow .3s,color .3s}.vo-pgx-o .vo-bx svg{transform:scale(.4);transition:transform .35s var(--vo-ease)}.vo-pgx-o input:checked+.vo-bx{background:var(--vo-accent);box-shadow:inset 0 0 0 1px var(--vo-accent-mark,var(--vo-accent));color:var(--vo-on-accent)}.vo-pgx-o input:checked+.vo-bx svg{transform:none}.vo-pgx-o input:focus-visible+.vo-bx{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-pgx-o .vo-t{flex:1;min-width:0}.vo-pgx-o .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-pgx-f{display:flex;align-items:center;gap:6px;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-pgx-f .vo-sp{flex:1}@container (max-width:340px){.vo-pgx-f{flex-wrap:wrap}.vo-pgx-f .vo-sp{flex-basis:100%}.vo-pgx-no{margin:var(--vo-s-2) 0 0 auto}.vo-pgx-ok{margin-top:var(--vo-s-2)}}.vo-pgx-db{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;margin-left:-2px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}.vo-pgx-db[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-pgx-db:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pgx-db>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-pgx-db[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-pgx-pop{min-width:230px}.vo-pgx-ok[disabled]{opacity:1;cursor:not-allowed;background:var(--vo-dis-hatch),var(--vo-dis-fill);color:var(--vo-dis);box-shadow:var(--vo-soft-ring)}.vo-pgx-done{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-ok-bg);font-size:13.5px}.vo-pgx-done .vo-pill{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-pgx-done .vo-pill:hover{background:var(--vo-surface);box-shadow:var(--vo-shadow-pop)}}.vo-pgx-done .vo-t{flex:1;color:var(--vo-fg)}.vo-pgx-done .vo-t span{display:block;font-size:12px;color:var(--vo-fg2)}.vo-pgx-done>svg{color:var(--vo-ok)}.vo-pgx-done.vo-run{background:var(--vo-chip)}.vo-pgx-done .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-pgx-done.vo-ok .vo-g{color:var(--vo-ok)}.vo-pgx-done .vo-t b{display:block;font-weight:400}.vo-pgx-tm{font-size:12px;color:var(--vo-muted)}.vo-pgx-ic{transition:background .32s var(--vo-ease)}.vo-pgx.vo-esc .vo-pgx-ic{background:var(--vo-warn-bg)}.vo-pgx-scope{display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pop{position:absolute;z-index:40;top:100%;left:0;margin-top:6px;padding:6px;background:var(--vo-surface);border:1px solid var(--vo-line);border-radius:var(--vo-r-in);box-shadow:var(--vo-shadow-pop);display:flex;flex-direction:column;gap:2px}.vo-pop[hidden]{display:none}.vo-mi{display:flex;align-items:center;gap:var(--vo-s-3);padding:8px 10px;border-radius:calc(8px * var(--vo-rk));font-size:13px;color:var(--vo-fg);text-align:left;cursor:pointer;transition:background .14s}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi>span:first-child{flex:1;min-width:0}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{color:transparent;flex:none;display:grid;place-items:center}.vo-mi[aria-checked=true] .vo-ck{color:var(--vo-accent)}.vo-tag{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:var(--vo-r-pill);font-size:11.5px;font-weight:500;flex:none}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.vo-enter{animation:vo-pgxin .5s var(--vo-ease) both}@keyframes vo-pgxin{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.vo-leave{animation:vo-pgxout .3s var(--vo-ease) both}@keyframes vo-pgxout{to{opacity:0;transform:translateY(-6px)}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
300
|
+
}
|
|
301
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PermissionGateComponent, decorators: [{
|
|
302
|
+
type: Component,
|
|
303
|
+
args: [{ selector: 'vo-permission-gate', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
304
|
+
<div
|
|
305
|
+
data-vo=""
|
|
306
|
+
class="vo-pgx"
|
|
307
|
+
[class.vo-panel]="!bare"
|
|
308
|
+
[class.vo-esc]="followUp && state === 'asking'"
|
|
309
|
+
[class.vo-held]="held !== null"
|
|
310
|
+
[style.minHeight.px]="held !== null ? held : null"
|
|
311
|
+
>
|
|
312
|
+
<div class="vo-pgx-h">
|
|
313
|
+
<span class="vo-pgx-ic"><vo-icon [name]="iconName"></vo-icon></span>
|
|
314
|
+
<div class="vo-pgx-ht">
|
|
315
|
+
<b>{{ title }}</b>
|
|
316
|
+
@if (subtitle) {
|
|
317
|
+
<span class="vo-muted">{{ subtitle }}</span>
|
|
318
|
+
}
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
|
|
322
|
+
@if (state === 'asking') {
|
|
323
|
+
<div class="vo-pgx-sc" [class.vo-enter]="back > 0">
|
|
324
|
+
@for (s of scopes; track s.key) {
|
|
325
|
+
<label class="vo-pgx-o">
|
|
326
|
+
<input
|
|
327
|
+
type="checkbox"
|
|
328
|
+
[checked]="ticked.includes(s.key)"
|
|
329
|
+
(change)="toggle(s.key)"
|
|
330
|
+
/>
|
|
331
|
+
<span class="vo-bx"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
332
|
+
<span class="vo-t"
|
|
333
|
+
>{{ s.label }}@if (s.detail) {<span class="vo-d">{{ s.detail }}</span>}</span
|
|
334
|
+
>
|
|
335
|
+
@if (s.risk) {
|
|
336
|
+
<span class="vo-tag vo-warn" [attr.title]="s.riskDetail ?? null">{{ s.risk }}</span>
|
|
337
|
+
}
|
|
338
|
+
</label>
|
|
339
|
+
}
|
|
340
|
+
</div>
|
|
341
|
+
<div class="vo-pgx-f" [class.vo-enter]="back > 0">
|
|
342
|
+
<button
|
|
343
|
+
type="button"
|
|
344
|
+
class="vo-pgx-db"
|
|
345
|
+
aria-haspopup="menu"
|
|
346
|
+
[attr.aria-expanded]="menuOpen"
|
|
347
|
+
aria-label="How long"
|
|
348
|
+
(click)="toggleMenu()"
|
|
349
|
+
>
|
|
350
|
+
<span class="vo-pgx-dv">{{ durLabel(dur) }}</span>
|
|
351
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
352
|
+
</button>
|
|
353
|
+
<span class="vo-sp"></span>
|
|
354
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-pgx-no" (click)="decline()">
|
|
355
|
+
{{ declineLabel }}
|
|
356
|
+
</button>
|
|
357
|
+
<button
|
|
358
|
+
type="button"
|
|
359
|
+
class="vo-pill vo-primary vo-sm vo-pgx-ok"
|
|
360
|
+
[disabled]="!n || waiting"
|
|
361
|
+
(click)="allow()"
|
|
362
|
+
>
|
|
363
|
+
@if (waiting) {
|
|
364
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
365
|
+
} @else {
|
|
366
|
+
{{ n ? 'Allow ' + n + (n > 1 ? ' scopes' : ' scope') : 'Pick a scope' }}
|
|
367
|
+
}
|
|
368
|
+
</button>
|
|
369
|
+
</div>
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
<div
|
|
373
|
+
class="vo-pop vo-pgx-pop"
|
|
374
|
+
role="menu"
|
|
375
|
+
aria-label="How long"
|
|
376
|
+
[hidden]="!menuOpen"
|
|
377
|
+
>
|
|
378
|
+
@for (d of durations; track d) {
|
|
379
|
+
<button
|
|
380
|
+
type="button"
|
|
381
|
+
class="vo-mi"
|
|
382
|
+
role="menuitemradio"
|
|
383
|
+
[attr.aria-checked]="d === dur"
|
|
384
|
+
(click)="pickDuration(d)"
|
|
385
|
+
>
|
|
386
|
+
<span
|
|
387
|
+
>{{ durLabel(d) }}@if (durationDetails[d]) {<span class="vo-d">{{
|
|
388
|
+
durationDetails[d]
|
|
389
|
+
}}</span>}</span
|
|
390
|
+
>
|
|
391
|
+
<span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
392
|
+
</button>
|
|
393
|
+
}
|
|
394
|
+
</div>
|
|
395
|
+
|
|
396
|
+
@if (state === 'allowed') {
|
|
397
|
+
<div
|
|
398
|
+
class="vo-pgx-done"
|
|
399
|
+
[class.vo-run]="working"
|
|
400
|
+
[class.vo-ok]="!working"
|
|
401
|
+
[class.vo-leave]="leaving"
|
|
402
|
+
[class.vo-enter]="!leaving"
|
|
403
|
+
>
|
|
404
|
+
<span class="vo-g">
|
|
405
|
+
@if (working) {
|
|
406
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
407
|
+
} @else {
|
|
408
|
+
<vo-icon name="ok"></vo-icon>
|
|
409
|
+
}
|
|
410
|
+
</span>
|
|
411
|
+
<span class="vo-t">
|
|
412
|
+
<b class="vo-pgx-a">{{
|
|
413
|
+
allowedTitle ??
|
|
414
|
+
'Allowed ' +
|
|
415
|
+
(granted || n) +
|
|
416
|
+
((granted || n) > 1 ? ' scopes ' : ' scope ') +
|
|
417
|
+
durSpan(dur)
|
|
418
|
+
}}</b>
|
|
419
|
+
@if (allowedDetail !== undefined) {
|
|
420
|
+
<span class="vo-pgx-d">{{ allowedDetail }}</span>
|
|
421
|
+
}
|
|
422
|
+
</span>
|
|
423
|
+
@if (meta !== undefined) {
|
|
424
|
+
<span class="vo-pgx-tm vo-num">{{ meta }}</span>
|
|
425
|
+
}
|
|
426
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="revoke()">Revoke</button>
|
|
427
|
+
</div>
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
@if (state === 'declined') {
|
|
431
|
+
<div class="vo-pgx-done vo-enter" style="background:var(--vo-chip)">
|
|
432
|
+
<vo-icon name="info"></vo-icon>
|
|
433
|
+
<span class="vo-t"
|
|
434
|
+
>{{ declinedTitle }}@if (declinedDetail) {<span>{{ declinedDetail }}</span>}</span
|
|
435
|
+
>
|
|
436
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="undo()">Undo</button>
|
|
437
|
+
</div>
|
|
438
|
+
}
|
|
439
|
+
</div>
|
|
440
|
+
`, styles: [".vo-pgx{position:relative;width:100%;max-width:400px;margin:0 auto;padding:var(--vo-s-1) 0;display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-pgx.vo-panel{padding:var(--vo-s-4)}.vo-pgx-h{display:flex;gap:var(--vo-s-3);align-items:center}.vo-pgx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;flex:none}.vo-pgx-ht{display:flex;flex-direction:column;min-width:0}.vo-pgx-ht b{font-weight:500;font-size:14px}.vo-pgx-ht span{font-size:13px}.vo-pgx-sc{display:flex;flex-direction:column;margin-inline:-8px}.vo-pgx-o{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-2);border-radius:calc(10px * var(--vo-rk));cursor:pointer;font-size:13.5px;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-pgx-o:hover{background:var(--vo-row)}}.vo-pgx-o input{position:absolute;opacity:0;pointer-events:none}.vo-pgx-o .vo-bx{width:18px;height:18px;border-radius:calc(6px * var(--vo-rk));box-shadow:inset 0 0 0 1.5px color-mix(in srgb,var(--vo-muted) 80%,var(--vo-surface));display:grid;place-items:center;color:transparent;flex:none;transition:background .3s var(--vo-ease),box-shadow .3s,color .3s}.vo-pgx-o .vo-bx svg{transform:scale(.4);transition:transform .35s var(--vo-ease)}.vo-pgx-o input:checked+.vo-bx{background:var(--vo-accent);box-shadow:inset 0 0 0 1px var(--vo-accent-mark,var(--vo-accent));color:var(--vo-on-accent)}.vo-pgx-o input:checked+.vo-bx svg{transform:none}.vo-pgx-o input:focus-visible+.vo-bx{outline:2px solid var(--vo-focus);outline-offset:2px}.vo-pgx-o .vo-t{flex:1;min-width:0}.vo-pgx-o .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-pgx-f{display:flex;align-items:center;gap:6px;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-pgx-f .vo-sp{flex:1}@container (max-width:340px){.vo-pgx-f{flex-wrap:wrap}.vo-pgx-f .vo-sp{flex-basis:100%}.vo-pgx-no{margin:var(--vo-s-2) 0 0 auto}.vo-pgx-ok{margin-top:var(--vo-s-2)}}.vo-pgx-db{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;margin-left:-2px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);white-space:nowrap;cursor:pointer;transition:background .16s,color .16s}.vo-pgx-db[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-pgx-db:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pgx-db>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-pgx-db[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-pgx-pop{min-width:230px}.vo-pgx-ok[disabled]{opacity:1;cursor:not-allowed;background:var(--vo-dis-hatch),var(--vo-dis-fill);color:var(--vo-dis);box-shadow:var(--vo-soft-ring)}.vo-pgx-done{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-ok-bg);font-size:13.5px}.vo-pgx-done .vo-pill{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}@media (hover:hover) and (pointer:fine){.vo-pgx-done .vo-pill:hover{background:var(--vo-surface);box-shadow:var(--vo-shadow-pop)}}.vo-pgx-done .vo-t{flex:1;color:var(--vo-fg)}.vo-pgx-done .vo-t span{display:block;font-size:12px;color:var(--vo-fg2)}.vo-pgx-done>svg{color:var(--vo-ok)}.vo-pgx-done.vo-run{background:var(--vo-chip)}.vo-pgx-done .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-pgx-done.vo-ok .vo-g{color:var(--vo-ok)}.vo-pgx-done .vo-t b{display:block;font-weight:400}.vo-pgx-tm{font-size:12px;color:var(--vo-muted)}.vo-pgx-ic{transition:background .32s var(--vo-ease)}.vo-pgx.vo-esc .vo-pgx-ic{background:var(--vo-warn-bg)}.vo-pgx-scope{display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pop{position:absolute;z-index:40;top:100%;left:0;margin-top:6px;padding:6px;background:var(--vo-surface);border:1px solid var(--vo-line);border-radius:var(--vo-r-in);box-shadow:var(--vo-shadow-pop);display:flex;flex-direction:column;gap:2px}.vo-pop[hidden]{display:none}.vo-mi{display:flex;align-items:center;gap:var(--vo-s-3);padding:8px 10px;border-radius:calc(8px * var(--vo-rk));font-size:13px;color:var(--vo-fg);text-align:left;cursor:pointer;transition:background .14s}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi>span:first-child{flex:1;min-width:0}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{color:transparent;flex:none;display:grid;place-items:center}.vo-mi[aria-checked=true] .vo-ck{color:var(--vo-accent)}.vo-tag{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:var(--vo-r-pill);font-size:11.5px;font-weight:500;flex:none}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.vo-enter{animation:vo-pgxin .5s var(--vo-ease) both}@keyframes vo-pgxin{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.vo-leave{animation:vo-pgxout .3s var(--vo-ease) both}@keyframes vo-pgxout{to{opacity:0;transform:translateY(-6px)}}\n"] }]
|
|
441
|
+
}], propDecorators: { title: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], subtitle: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], iconName: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], scopes: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], value: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], defaultValue: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], valueChange: [{
|
|
454
|
+
type: Output
|
|
455
|
+
}], durations: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], durationDetails: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], duration: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], defaultDuration: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], durationChange: [{
|
|
464
|
+
type: Output
|
|
465
|
+
}], status: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], defaultStatus: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], statusChange: [{
|
|
470
|
+
type: Output
|
|
471
|
+
}], allowEvent: [{
|
|
472
|
+
type: Output
|
|
473
|
+
}], declineEvent: [{
|
|
474
|
+
type: Output
|
|
475
|
+
}], revokeEvent: [{
|
|
476
|
+
type: Output
|
|
477
|
+
}], undoEvent: [{
|
|
478
|
+
type: Output
|
|
479
|
+
}], allowedDetail: [{
|
|
480
|
+
type: Input
|
|
481
|
+
}], allowedTitle: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], working: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], meta: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], followUp: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], declineLabel: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], declinedTitle: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], declinedDetail: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], bare: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}] } });
|
|
498
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1nYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Blcm1pc3Npb24tZ2F0ZS9wZXJtaXNzaW9uLWdhdGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsZ0ZBQWdGO0FBQ2hGLHdFQUF3RTtBQUN4RSx3Q0FBd0M7QUFFeEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBa0J0RSxvR0FBb0c7QUFrSnBHLE1BQU0sT0FBTyx1QkFBdUI7SUFqSnBDO1FBa0pFLDJEQUEyRDtRQUNsRCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBR3BCLDBGQUEwRjtRQUNqRixhQUFRLEdBQWUsT0FBTyxDQUFDO1FBQy9CLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBSS9CLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBQzNCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUVyRCxpRkFBaUY7UUFDeEUsY0FBUyxHQUFhLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRSxtRUFBbUU7UUFDMUQsb0JBQWUsR0FBMkI7WUFDakQsV0FBVyxFQUFFLHdCQUF3QjtZQUNyQyxLQUFLLEVBQUUsZ0JBQWdCO1lBQ3ZCLE1BQU0sRUFBRSxxQkFBcUI7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LGlCQUNELGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxlQUFlLENBQUMsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUlUOzhCQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0UsU0FBUztzQkFBakIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUdFLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTTtnQkFHRSxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3Blcm1pc3Npb24tZ2F0ZS9wZXJtaXNzaW9uLWdhdGUuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvcGVybWlzc2lvbi1nYXRlL1Blcm1pc3Npb25HYXRlLnRzeC5cbi8vIFRoZSBhZ2VudCBhc2tzIGJlZm9yZSBpdCBhY3RzOiBhIGNhcmQgd2l0aCB0aGUgcXVlc3Rpb24sIHRoZSBzY29wZXMgdG8gdGljayxcbi8vIGFuZCBhIGZvb3RlciB3aXRoIGhvdyBsb25nIHRoZSBncmFudCBsYXN0cyBhbmQgdGhlIHR3byBhbnN3ZXJzIChBbGxvdyAvXG4vLyBkZWNsaW5lKS4gT25jZSBhbGxvd2VkIGl0IGdpdmVzIHdheSB0byBhIHNob3J0ZXIgcmVzdWx0IHJvdyAoYSBzcGlubmVyIHdoaWxlXG4vLyB0aGUgYWdlbnQgd29ya3MsIGEgZ3JlZW4gY2hlY2sgd2hlbiBkb25lKSB3aXRoIGEgUmV2b2tlIGJ1dHRvbjsgZGVjbGluaW5nXG4vLyBzaG93cyBhbiB1bmRvYWJsZSBub3RpY2UuIEEgZm9sbG93LXVwIGFzayBtaWQtcnVuIHR1cm5zIHRoZSBpY29uIHRpbGUgYW1iZXIuXG4vLyBJbnB1dHMgbWlycm9yIHRoZSBSZWFjdCBwcm9wczsgUmVhY3QgY2FsbGJhY2tzIGJlY29tZSBAT3V0cHV0IEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gSWNvbiBub3RlOiB0aGUgUmVhY3QgZGVmYXVsdCB0aWxlIGljb24gaXMgYSBzaGllbGQsIHdoaWNoIGlzIG5vdCBpbiB0aGVcbi8vIEFuZ3VsYXIgY29yZSBnbHlwaCBzZXQuIFRoZSBkZWZhdWx0IGhlcmUgaXMgYGZpZ21hYCAoYXMgaW4gdGhlIFZhbmlsbGEgZGVtbyk7XG4vLyBwYXNzIGFueSBWb0ljb25OYW1lIHZpYSBbaWNvbk5hbWVdIHRvIG92ZXJyaWRlLiBBdmFpbGFibGUgZ2x5cGhzOiBzZWVcbi8vIFZvSWNvbk5hbWUgaW4gLi4vY29yZS9pY29uLmNvbXBvbmVudC5cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQsIHR5cGUgVm9JY29uTmFtZSB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogU29tZXRoaW5nIHRoZSBhZ2VudCBpcyBhc2tpbmcgdG8gYmUgYWxsb3dlZCB0byBkby4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvblNjb3BlIHtcbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwiRWRpdCBmcmFtZXNcIi4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFRoZSBxdWlldCBsaW5lIHVuZGVyIGl0LCBsaWtlIFwiT25seSBvbiBhIG5ldyBwYWdlXCIuICovXG4gIGRldGFpbD86IHN0cmluZztcbiAgLyoqIEEgd2FybmluZyB0YWcgYWZ0ZXIgaXQsIGxpa2UgXCJSaXNreVwiLiAqL1xuICByaXNrPzogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgcmlzayB0YWcgcmV2ZWFscyBvbiBob3ZlciwgbGlrZSBcIkNoZWNrb3V0IGFuZCBEb2NzIHVzZSB0aGlzIGxpYnJhcnlcIi4gKi9cbiAgcmlza0RldGFpbD86IHN0cmluZztcbn1cblxuLyoqIGFza2luZywgYWxsb3dlZCBvciBkZWNsaW5lZC4gKi9cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25TdGF0dXMgPSAnYXNraW5nJyB8ICdhbGxvd2VkJyB8ICdkZWNsaW5lZCc7XG5cbi8qKiBUaGUgYWdlbnQgYXNrcyBiZWZvcmUgaXQgYWN0czogcGljayB0aGUgc2NvcGVzIGFuZCBob3cgbG9uZyB0aGV5IGxhc3QsIHRoZW4gYWxsb3cgb3IgZGVjbGluZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLXBlcm1pc3Npb24tZ2F0ZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1wZ3hcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtjbGFzcy52by1lc2NdPVwiZm9sbG93VXAgJiYgc3RhdGUgPT09ICdhc2tpbmcnXCJcbiAgICAgIFtjbGFzcy52by1oZWxkXT1cImhlbGQgIT09IG51bGxcIlxuICAgICAgW3N0eWxlLm1pbkhlaWdodC5weF09XCJoZWxkICE9PSBudWxsID8gaGVsZCA6IG51bGxcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1wZ3gtaFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXBneC1pY1wiPjx2by1pY29uIFtuYW1lXT1cImljb25OYW1lXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLXBneC1odFwiPlxuICAgICAgICAgIDxiPnt7IHRpdGxlIH19PC9iPlxuICAgICAgICAgIEBpZiAoc3VidGl0bGUpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyBzdWJ0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoc3RhdGUgPT09ICdhc2tpbmcnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1wZ3gtc2NcIiBbY2xhc3Mudm8tZW50ZXJdPVwiYmFjayA+IDBcIj5cbiAgICAgICAgICBAZm9yIChzIG9mIHNjb3BlczsgdHJhY2sgcy5rZXkpIHtcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInZvLXBneC1vXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidGlja2VkLmluY2x1ZGVzKHMua2V5KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGUocy5rZXkpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ieFwiPjx2by1pY29uIG5hbWU9XCJjaGVja1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdFwiXG4gICAgICAgICAgICAgICAgPnt7IHMubGFiZWwgfX1AaWYgKHMuZGV0YWlsKSB7PHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgcy5kZXRhaWwgfX08L3NwYW4+fTwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAocy5yaXNrKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8td2FyblwiIFthdHRyLnRpdGxlXT1cInMucmlza0RldGFpbCA/PyBudWxsXCI+e3sgcy5yaXNrIH19PC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1wZ3gtZlwiIFtjbGFzcy52by1lbnRlcl09XCJiYWNrID4gMFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ2by1wZ3gtZGJcIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiSG93IGxvbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1lbnUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1wZ3gtZHZcIj57eyBkdXJMYWJlbChkdXIpIH19PC9zcGFuPlxuICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwXCI+PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1naG9zdCB2by1zbSB2by1wZ3gtbm9cIiAoY2xpY2spPVwiZGVjbGluZSgpXCI+XG4gICAgICAgICAgICB7eyBkZWNsaW5lTGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidm8tcGlsbCB2by1wcmltYXJ5IHZvLXNtIHZvLXBneC1va1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW4gfHwgd2FpdGluZ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWxsb3coKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICB7eyBuID8gJ0FsbG93ICcgKyBuICsgKG4gPiAxID8gJyBzY29wZXMnIDogJyBzY29wZScpIDogJ1BpY2sgYSBzY29wZScgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ2by1wb3Agdm8tcGd4LXBvcFwiXG4gICAgICAgIHJvbGU9XCJtZW51XCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkhvdyBsb25nXCJcbiAgICAgICAgW2hpZGRlbl09XCIhbWVudU9wZW5cIlxuICAgICAgPlxuICAgICAgICBAZm9yIChkIG9mIGR1cmF0aW9uczsgdHJhY2sgZCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ2by1taVwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1yYWRpb1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiZCA9PT0gZHVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJwaWNrRHVyYXRpb24oZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgID57eyBkdXJMYWJlbChkKSB9fUBpZiAoZHVyYXRpb25EZXRhaWxzW2RdKSB7PHNwYW4gY2xhc3M9XCJ2by1kXCI+e3tcbiAgICAgICAgICAgICAgICBkdXJhdGlvbkRldGFpbHNbZF1cbiAgICAgICAgICAgICAgfX08L3NwYW4+fTwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ja1wiPjx2by1pY29uIG5hbWU9XCJjaGVja1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHN0YXRlID09PSAnYWxsb3dlZCcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidm8tcGd4LWRvbmVcIlxuICAgICAgICAgIFtjbGFzcy52by1ydW5dPVwid29ya2luZ1wiXG4gICAgICAgICAgW2NsYXNzLnZvLW9rXT1cIiF3b3JraW5nXCJcbiAgICAgICAgICBbY2xhc3Mudm8tbGVhdmVdPVwibGVhdmluZ1wiXG4gICAgICAgICAgW2NsYXNzLnZvLWVudGVyXT1cIiFsZWF2aW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPlxuICAgICAgICAgICAgQGlmICh3b3JraW5nKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwib2tcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdFwiPlxuICAgICAgICAgICAgPGIgY2xhc3M9XCJ2by1wZ3gtYVwiPnt7XG4gICAgICAgICAgICAgIGFsbG93ZWRUaXRsZSA/P1xuICAgICAgICAgICAgICAgICdBbGxvd2VkICcgK1xuICAgICAgICAgICAgICAgICAgKGdyYW50ZWQgfHwgbikgK1xuICAgICAgICAgICAgICAgICAgKChncmFudGVkIHx8IG4pID4gMSA/ICcgc2NvcGVzICcgOiAnIHNjb3BlICcpICtcbiAgICAgICAgICAgICAgICAgIGR1clNwYW4oZHVyKVxuICAgICAgICAgICAgfX08L2I+XG4gICAgICAgICAgICBAaWYgKGFsbG93ZWREZXRhaWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXBneC1kXCI+e3sgYWxsb3dlZERldGFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgQGlmIChtZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcGd4LXRtIHZvLW51bVwiPnt7IG1ldGEgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1naG9zdCB2by1zbVwiIChjbGljayk9XCJyZXZva2UoKVwiPlJldm9rZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzdGF0ZSA9PT0gJ2RlY2xpbmVkJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcGd4LWRvbmUgdm8tZW50ZXJcIiBzdHlsZT1cImJhY2tncm91bmQ6dmFyKC0tdm8tY2hpcClcIj5cbiAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiaW5mb1wiPjwvdm8taWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIlxuICAgICAgICAgICAgPnt7IGRlY2xpbmVkVGl0bGUgfX1AaWYgKGRlY2xpbmVkRGV0YWlsKSB7PHNwYW4+e3sgZGVjbGluZWREZXRhaWwgfX08L3NwYW4+fTwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tZ2hvc3Qgdm8tc21cIiAoY2xpY2spPVwidW5kbygpXCI+VW5kbzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3Blcm1pc3Npb24tZ2F0ZS5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uR2F0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgcXVlc3Rpb24sIGxpa2UgXCJBbGxvdyB0aGUgYWdlbnQgdG8gZWRpdCBGaWdtYT9cIi4gKi9cbiAgQElucHV0KCkgdGl0bGUgPSAnJztcbiAgLyoqIFdoeSBpdCBhc2tzLiAqL1xuICBASW5wdXQoKSBzdWJ0aXRsZT86IHN0cmluZztcbiAgLyoqIFRoZSBnbHlwaCBpbiB0aGUgdGlsZSBiZXNpZGUgdGhlIHF1ZXN0aW9uLiBEZWZhdWx0cyB0byBmaWdtYSAoUmVhY3QgdXNlcyBhIHNoaWVsZCkuICovXG4gIEBJbnB1dCgpIGljb25OYW1lOiBWb0ljb25OYW1lID0gJ2ZpZ21hJztcbiAgQElucHV0KCkgc2NvcGVzOiBQZXJtaXNzaW9uU2NvcGVbXSA9IFtdO1xuXG4gIC8qKiBLZXlzIG9mIHRoZSB0aWNrZWQgc2NvcGVzLiBMZWF2ZSBpdCBvdXQgdG8gbGV0IHRoZSBjaGVja2JveGVzIGhvbGQgdGhlaXIgb3duLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IHN0cmluZ1tdID0gW107XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgLyoqIEhvdyBsb25nIHRoZSBwZXJtaXNzaW9uIGxhc3RzLCBwaWNrZWQgZnJvbSBhIHNtYWxsIGRyb3Bkb3duIGluIHRoZSBmb290ZXIuICovXG4gIEBJbnB1dCgpIGR1cmF0aW9uczogc3RyaW5nW10gPSBbJ1RoaXMgdGFzaycsICdUb2RheScsICdBbHdheXMnXTtcbiAgLyoqIFRoZSBxdWlldCBsaW5lIHVuZGVyIGVhY2ggZHVyYXRpb24gaW4gaXRzIG1lbnUsIGJ5IGR1cmF0aW9uLiAqL1xuICBASW5wdXQoKSBkdXJhdGlvbkRldGFpbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ1RoaXMgdGFzayc6ICdVbnRpbCB0aGUgdGFzayBpcyBkb25lJyxcbiAgICBUb2RheTogJ1VudGlsIG1pZG5pZ2h0JyxcbiAgICBBbHdheXM6ICdVbnRpbCB5b3UgcmV2b2tlIGl0JyxcbiAgfTtcbiAgQElucHV0KCkgZHVyYXRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlZmF1bHREdXJhdGlvbj86IHN0cmluZztcbiAgQE91dHB1dCgpIGR1cmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIGFza2luZywgYWxsb3dlZCBvciBkZWNsaW5lZC4gTGVhdmUgaXQgb3V0IHRvIGxldCB0aGUgYnV0dG9ucyBtb3ZlIGl0LiAqL1xuICBASW5wdXQoKSBzdGF0dXM/OiBQZXJtaXNzaW9uU3RhdHVzO1xuICBASW5wdXQoKSBkZWZhdWx0U3RhdHVzOiBQZXJtaXNzaW9uU3RhdHVzID0gJ2Fza2luZyc7XG4gIEBPdXRwdXQoKSBzdGF0dXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBlcm1pc3Npb25TdGF0dXM+KCk7XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSB0aWNrZWQgc2NvcGVzIGFuZCB0aGUgZHVyYXRpb24uIFJldHVybiBhIHByb21pc2UgYW5kIHRoZSBidXR0b24gc3BpbnMgdW50aWwgaXQgc2V0dGxlcy4gKi9cbiAgQE91dHB1dCgpIGFsbG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5czogc3RyaW5nW107IGR1cmF0aW9uOiBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIGRlY2xpbmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIENhbGxlZCBieSBSZXZva2UsIGFmdGVyIGFsbG93aW5nLiAqL1xuICBAT3V0cHV0KCkgcmV2b2tlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBDYWxsZWQgYnkgVW5kbywgYWZ0ZXIgZGVjbGluaW5nLiAqL1xuICBAT3V0cHV0KCkgdW5kb0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBUaGUgbGluZSB1bmRlciBcIkFsbG93ZWQg4oCmXCIsIGxpa2UgXCJBcHBseWluZyB0aGUgcHJpY2luZyBmaXhlcyBub3dcIi4gKi9cbiAgQElucHV0KCkgYWxsb3dlZERldGFpbD86IHN0cmluZztcbiAgLyoqIFJlcGxhY2VzIFwiQWxsb3dlZCAyIHNjb3BlcyBmb3IgdGhpcyB0YXNrXCIsIGxpa2UgXCJEb25lLiA2IGZyYW1lcyBlZGl0ZWRcIi4gKi9cbiAgQElucHV0KCkgYWxsb3dlZFRpdGxlPzogc3RyaW5nO1xuICAvKiogVGhlIGFnZW50IGlzIHN0aWxsIHdvcmtpbmcgdW5kZXIgdGhlIHBlcm1pc3Npb246IGEgc3Bpbm5lciBpbnN0ZWFkIG9mIHRoZSBncmVlbiBjaGVjay4gKi9cbiAgQElucHV0KCkgd29ya2luZyA9IGZhbHNlO1xuICAvKiogUXVpZXQgdGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBhbGxvd2VkIHJvdywgbGlrZSBhbiBlbGFwc2VkIHRpbWUgXCIwOjA0XCIuICovXG4gIEBJbnB1dCgpIG1ldGE/OiBzdHJpbmc7XG4gIC8qKiBBIGZvbGxvdy11cCBhc2sgaW4gdGhlIG1pZGRsZSBvZiBhIHJ1biwgZm9yIG9uZSBtb3JlIHNjb3BlOiB0aGUgaWNvbiB0aWxlIHR1cm5zIGFtYmVyLiAqL1xuICBASW5wdXQoKSBmb2xsb3dVcCA9IGZhbHNlO1xuICAvKiogVGhlIGRlY2xpbmUgYnV0dG9uLiBEZWZhdWx0cyB0byBcIk5vdCBub3dcIjsgYSBmb2xsb3ctdXAgYXNrIG1pZ2h0IHNheSBcIlNraXAgdGhpcyBmcmFtZVwiLiAqL1xuICBASW5wdXQoKSBkZWNsaW5lTGFiZWwgPSAnTm90IG5vdyc7XG4gIC8qKiBTaG93biBhZnRlciBOb3Qgbm93LiAqL1xuICBASW5wdXQoKSBkZWNsaW5lZFRpdGxlID0gJ1RoZSBhZ2VudCB3aWxsIHNraXAgdGhlc2UgY2hhbmdlcyc7XG4gIEBJbnB1dCgpIGRlY2xpbmVkRGV0YWlsPzogc3RyaW5nO1xuICAvKiogU2l0cyBmbGF0IGluIGEgY2hhdCB0aHJlYWQgKHRoZSBkZWZhdWx0KS4gU2V0IGZhbHNlIHRvIGdpdmUgaXQgYSBjYXJkIG9mIGl0cyBvd24uICovXG4gIEBJbnB1dCgpIGJhcmUgPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW90aW9uID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcblxuICAvKiogSW50ZXJuYWwgc3RhdGUgd2hlbiB0aGUgbWF0Y2hpbmcgaW5wdXQgaXMgbGVmdCB1bmNvbnRyb2xsZWQuICovXG4gIHByaXZhdGUgaW5uZXJUaWNrZWQ6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaW5uZXJEdXI/OiBzdHJpbmc7XG4gIHByaXZhdGUgaW5uZXJTdGF0dXM6IFBlcm1pc3Npb25TdGF0dXMgPSAnYXNraW5nJztcblxuICBtZW51T3BlbiA9IGZhbHNlO1xuICB3YWl0aW5nID0gZmFsc2U7XG4gIC8vIGEgcmV2b2tlZCBwZXJtaXNzaW9uIGZhZGVzIG91dCBiZWZvcmUgdGhlIHNjb3BlcyBjb21lIGJhY2tcbiAgbGVhdmluZyA9IGZhbHNlO1xuICAvLyB0aGUgc2NvcGVzIHBsYXkgdGhlaXIgZW50cmFuY2Ugd2hlbiB0aGV5IGNvbWUgYmFjaywgbm90IHdoZW4gdGhlIGNhcmQgZmlyc3QgYXBwZWFyc1xuICBiYWNrID0gMDtcbiAgZ3JhbnRlZCA9IDA7XG4gIC8vIHRoZSBzY29wZXMgZ2l2ZSB3YXkgdG8gYSBzaG9ydGVyIHJlc3VsdCByb3c6IHRoZSBnYXRlIGtlZXBzIHRoZSBoZWlnaHQgaXQgaGFkIGFuZCBjZW50cmVzIHRoZSByb3dcbiAgaGVsZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGVhdmVUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGVmYXVsdFZhbHVlJ10gJiYgdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkICYmICF0aGlzLmlubmVyVGlja2VkLmxlbmd0aCkge1xuICAgICAgdGhpcy5pbm5lclRpY2tlZCA9IFsuLi50aGlzLmRlZmF1bHRWYWx1ZV07XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkZWZhdWx0U3RhdHVzJ10gJiYgdGhpcy5zdGF0dXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbm5lclN0YXR1cyA9IHRoaXMuZGVmYXVsdFN0YXR1cztcbiAgICB9XG4gIH1cblxuICBnZXQgdGlja2VkKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA/PyAodGhpcy5pbm5lclRpY2tlZC5sZW5ndGggPyB0aGlzLmlubmVyVGlja2VkIDogdGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgZ2V0IGR1cigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uID8/IHRoaXMuaW5uZXJEdXIgPz8gdGhpcy5kZWZhdWx0RHVyYXRpb24gPz8gdGhpcy5kdXJhdGlvbnNbMF0gPz8gJyc7XG4gIH1cblxuICBnZXQgc3RhdGUoKTogUGVybWlzc2lvblN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID8/IHRoaXMuaW5uZXJTdGF0dXM7XG4gIH1cblxuICBnZXQgbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRpY2tlZC5sZW5ndGg7XG4gIH1cblxuICAvLyBcIkZvciB0aGlzIHRhc2tcIiBpbiB0aGUgbWVudSBhbmQgXCJmb3IgdGhpcyB0YXNrXCIgYWZ0ZXIgQWxsb3dlZDsgQWx3YXlzIHJlYWRzIGFzIGl0IGlzXG4gIGR1ckxhYmVsKGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIC9eYWx3YXlzJC9pLnRlc3QoZCkgPyBkIDogJ0ZvciAnICsgZC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIGR1clNwYW4oZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gL15hbHdheXMkL2kudGVzdChkKSA/ICdhbHdheXMnIDogJ2ZvciAnICsgZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUaWNrZWQoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmlubmVyVGlja2VkID0ga2V5cztcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoa2V5cyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRTdGF0dXMoczogUGVybWlzc2lvblN0YXR1cyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB0aGlzLmlubmVyU3RhdHVzID0gcztcbiAgICB0aGlzLnN0YXR1c0NoYW5nZS5lbWl0KHMpO1xuICB9XG5cbiAgdG9nZ2xlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMudGlja2VkLmluY2x1ZGVzKGtleSlcbiAgICAgID8gdGhpcy50aWNrZWQuZmlsdGVyKChrKSA9PiBrICE9PSBrZXkpXG4gICAgICA6IHRoaXMuc2NvcGVzLm1hcCgocykgPT4gcy5rZXkpLmZpbHRlcigoaykgPT4gayA9PT0ga2V5IHx8IHRoaXMudGlja2VkLmluY2x1ZGVzKGspKTtcbiAgICB0aGlzLnNldFRpY2tlZChuZXh0KTtcbiAgfVxuXG4gIHRvZ2dsZU1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5tZW51T3BlbiA9ICF0aGlzLm1lbnVPcGVuO1xuICB9XG5cbiAgcGlja0R1cmF0aW9uKGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmR1cmF0aW9uID09PSB1bmRlZmluZWQpIHRoaXMuaW5uZXJEdXIgPSBkO1xuICAgIHRoaXMuZHVyYXRpb25DaGFuZ2UuZW1pdChkKTtcbiAgICB0aGlzLm1lbnVPcGVuID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhvbGQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZCA9PT0gbnVsbCkgdGhpcy5oZWxkID0gMDtcbiAgfVxuXG4gIGFzeW5jIGFsbG93KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5uIHx8IHRoaXMud2FpdGluZykgcmV0dXJuO1xuICAgIHRoaXMud2FpdGluZyA9IHRydWU7XG4gICAgdGhpcy5ncmFudGVkID0gdGhpcy5uO1xuICAgIHRoaXMuYWxsb3dFdmVudC5lbWl0KHsga2V5czogdGhpcy50aWNrZWQsIGR1cmF0aW9uOiB0aGlzLmR1ciB9KTtcbiAgICAvLyB0aGUgQWxsb3cgYnV0dG9uIHNwaW5zIGJyaWVmbHksIGFzIHRoZSBSZWFjdCBwb3J0IGF3YWl0cyBvbkFsbG93XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgdGhpcy5tb3Rpb24ucmVkdWNlKCkgPyAwIDogNTAwKSk7XG4gICAgdGhpcy53YWl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5ob2xkKCk7XG4gICAgdGhpcy5zZXRTdGF0dXMoJ2FsbG93ZWQnKTtcbiAgfVxuXG4gIGRlY2xpbmUoKTogdm9pZCB7XG4gICAgdGhpcy5ob2xkKCk7XG4gICAgdGhpcy5zZXRTdGF0dXMoJ2RlY2xpbmVkJyk7XG4gICAgdGhpcy5kZWNsaW5lRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgcmV2b2tlKCk6IHZvaWQge1xuICAgIHRoaXMubGVhdmluZyA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubGVhdmVUaW1lcik7XG4gICAgdGhpcy5sZWF2ZVRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5sZWF2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGVsZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2V0U3RhdHVzKCdhc2tpbmcnKTtcbiAgICAgICAgdGhpcy5iYWNrICs9IDE7XG4gICAgICAgIHRoaXMucmV2b2tlRXZlbnQuZW1pdCgpO1xuICAgICAgfSxcbiAgICAgIHRoaXMubW90aW9uLnJlZHVjZSgpID8gMCA6IDMwMCxcbiAgICApO1xuICB9XG5cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLmhlbGQgPSBudWxsO1xuICAgIHRoaXMuc2V0U3RhdHVzKCdhc2tpbmcnKTtcbiAgICB0aGlzLmJhY2sgKz0gMTtcbiAgICB0aGlzLnVuZG9FdmVudC5lbWl0KCk7XG4gIH1cbn1cbiJdfQ==
|