valtech-components 4.0.987 → 4.0.989
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/esm2022/lib/components/organisms/attachment-uploader/attachment-uploader.component.mjs +41 -2
- package/esm2022/lib/components/organisms/attachment-uploader/types.mjs +1 -1
- package/esm2022/lib/components/organisms/request-review-panel/request-review-panel.component.mjs +316 -481
- package/esm2022/lib/components/organisms/request-review-panel/request-review-panel.i18n.mjs +21 -0
- package/esm2022/lib/components/organisms/request-review-panel/types.mjs +2 -0
- package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +21 -1
- package/esm2022/lib/components/organisms/survey-response/survey-response.i18n.mjs +5 -1
- package/esm2022/lib/components/organisms/survey-response/types.mjs +1 -1
- package/esm2022/lib/services/requests/types.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +3 -2
- package/fesm2022/valtech-components.mjs +699 -780
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/attachment-uploader/attachment-uploader.component.d.ts +14 -0
- package/lib/components/organisms/attachment-uploader/types.d.ts +30 -0
- package/lib/components/organisms/request-review-panel/request-review-panel.component.d.ts +72 -76
- package/lib/components/organisms/request-review-panel/request-review-panel.i18n.d.ts +2 -0
- package/lib/components/organisms/request-review-panel/types.d.ts +73 -0
- package/lib/components/organisms/survey-response/survey-response.component.d.ts +2 -0
- package/lib/components/organisms/survey-response/types.d.ts +6 -0
- package/lib/services/requests/types.d.ts +6 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -1
package/esm2022/lib/components/organisms/request-review-panel/request-review-panel.component.mjs
CHANGED
|
@@ -1,526 +1,361 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { RequestService } from '../../../services/requests/request.service';
|
|
5
|
-
import { I18nService } from '../../../services/i18n/i18n.service';
|
|
6
|
-
import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
|
|
7
|
-
import { ToastService } from '../../../services/toast.service';
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, Input, Output, computed, inject, input, signal } from '@angular/core';
|
|
3
|
+
import { ButtonComponent } from '../../atoms/button/button.component';
|
|
8
4
|
import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
|
|
9
5
|
import { SkeletonComponent } from '../../atoms/skeleton/skeleton.component';
|
|
10
|
-
import {
|
|
6
|
+
import { I18nService } from '../../../services/i18n';
|
|
7
|
+
import { REQUEST_REVIEW_PANEL_I18N } from './request-review-panel.i18n';
|
|
11
8
|
import * as i0 from "@angular/core";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
rejected: { bg: '#ef4444', color: '#fff' },
|
|
15
|
-
in_review: { bg: '#fef3c7', color: '#92400e' },
|
|
16
|
-
pending: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-dark, #222)' },
|
|
17
|
-
cancelled: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-medium, #636469)' },
|
|
18
|
-
closed: { bg: 'var(--ion-color-light, #f4f5f8)', color: 'var(--ion-color-medium, #636469)' },
|
|
19
|
-
};
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
const NAMESPACE = 'RequestReviewPanel';
|
|
20
11
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* consumer
|
|
12
|
+
* val-request-review-panel — cola de revisión del factory (ADR-062).
|
|
13
|
+
*
|
|
14
|
+
* Es **presentacional**: no carga datos, no conoce el backend ni el dominio. El
|
|
15
|
+
* consumer le pasa la cola ya normalizada y escucha `(decision)`.
|
|
16
|
+
*
|
|
17
|
+
* ## Por qué el cuerpo va proyectado y no configurado
|
|
18
|
+
*
|
|
19
|
+
* El ADR original proponía describir el cuerpo con arrays de nombres de campo
|
|
20
|
+
* (`fields.display: ['taxId', 'tagsRequested']`). Al implementarlo con los dos
|
|
21
|
+
* consumidores reales delante quedó claro que eso reinventa un motor de
|
|
22
|
+
* templating peor que Angular: Chesed necesita una lista de documentos con
|
|
23
|
+
* iconos y `target="_blank"`, Okhelia un enlace a la receta y un input de
|
|
24
|
+
* comentario. Ninguna lista de strings expresa eso sin agregarle un flag al
|
|
25
|
+
* componente por cada caso nuevo.
|
|
26
|
+
*
|
|
27
|
+
* Entonces el panel es dueño de lo que **de verdad** se repite — la cáscara, el
|
|
28
|
+
* chrome de la card, y la mecánica de decisión — y el cuerpo de cada ítem lo
|
|
29
|
+
* escribe cada vertical en un `ng-template` con su propio HTML.
|
|
30
|
+
*
|
|
31
|
+
* ```html
|
|
32
|
+
* <val-request-review-panel [props]="panelProps()" [itemBody]="body"
|
|
33
|
+
* (decision)="onDecision($event)" />
|
|
34
|
+
*
|
|
35
|
+
* <ng-template #body let-item>
|
|
36
|
+
* <a [routerLink]="['/app/recetas', recipeIdOf(item)]">Ver receta</a>
|
|
37
|
+
* </ng-template>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* ## Rechazo con motivo
|
|
41
|
+
*
|
|
42
|
+
* El flujo de dos pasos (Rechazar → escribir motivo → Confirmar) es del panel,
|
|
43
|
+
* no del consumer, y está activo por defecto. Rechazar de un click deja al
|
|
44
|
+
* solicitante sin saber qué corregir; era el único de los dos paneles que lo
|
|
45
|
+
* tenía bien resuelto y ahora lo heredan los dos.
|
|
25
46
|
*/
|
|
26
47
|
export class RequestReviewPanelComponent {
|
|
27
48
|
constructor() {
|
|
28
|
-
this.requests = inject(RequestService);
|
|
29
49
|
this.i18n = inject(I18nService);
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.loadError = this._loadError.asReadonly();
|
|
45
|
-
this.comments = this._comments.asReadonly();
|
|
46
|
-
this.loadingComments = this._loadingComments.asReadonly();
|
|
47
|
-
this.transitioning = this._transitioning.asReadonly();
|
|
48
|
-
this.heroImgFailed = signal(false);
|
|
49
|
-
this.heroConfig = computed(() => this.config().entityHero);
|
|
50
|
-
this.statusStyle = computed(() => STATUS_STYLE[this._req()?.status ?? ''] ?? STATUS_STYLE['pending']);
|
|
51
|
-
this.heroName = computed(() => {
|
|
52
|
-
const hero = this.heroConfig();
|
|
53
|
-
if (!hero)
|
|
54
|
-
return undefined;
|
|
55
|
-
return this._req()?.metadata?.[hero.nameField];
|
|
56
|
-
});
|
|
57
|
-
this.heroImage = computed(() => {
|
|
58
|
-
const hero = this.heroConfig();
|
|
59
|
-
if (!hero?.imageField)
|
|
60
|
-
return undefined;
|
|
61
|
-
return this._req()?.metadata?.[hero.imageField];
|
|
62
|
-
});
|
|
63
|
-
this.canNavigateHero = computed(() => {
|
|
64
|
-
const hero = this.heroConfig();
|
|
65
|
-
const metadata = this._req()?.metadata;
|
|
66
|
-
if (!hero || !metadata)
|
|
67
|
-
return false;
|
|
68
|
-
return hero.canNavigate(metadata);
|
|
69
|
-
});
|
|
70
|
-
this.submitterInitial = computed(() => {
|
|
71
|
-
const s = this._req()?.submitter;
|
|
72
|
-
if (!s)
|
|
73
|
-
return '?';
|
|
74
|
-
return ((s.name || s.email) ?? '?').charAt(0).toUpperCase();
|
|
75
|
-
});
|
|
76
|
-
this.fieldEntries = computed(() => {
|
|
77
|
-
const fields = this._req()?.fields ?? {};
|
|
78
|
-
return Object.entries(fields)
|
|
79
|
-
.filter(([, v]) => v != null && v !== '')
|
|
80
|
-
.map(([k, v]) => ({ key: k, value: String(v) }));
|
|
81
|
-
});
|
|
82
|
-
this.errorState = computed(() => {
|
|
83
|
-
this.i18n.lang();
|
|
84
|
-
const err = this._loadError();
|
|
85
|
-
const msg = (err instanceof Error ? err.message : String(err ?? '')).toLowerCase();
|
|
86
|
-
const isOffline = msg.includes('network') || msg.includes('offline');
|
|
87
|
-
return {
|
|
88
|
-
variant: 'error',
|
|
89
|
-
title: isOffline ? this.t('offlineTitle') : this.t('errorTitle'),
|
|
90
|
-
description: isOffline ? this.t('offlineHint') : '',
|
|
91
|
-
cta: { label: this.t('retry'), handler: () => void this.load() },
|
|
92
|
-
};
|
|
93
|
-
});
|
|
50
|
+
this.props = input.required();
|
|
51
|
+
this.decision = new EventEmitter();
|
|
52
|
+
/** ID del ítem cuyo formulario de rechazo está abierto. */
|
|
53
|
+
this._rejectingId = signal('');
|
|
54
|
+
this.rejectingId = this._rejectingId.asReadonly();
|
|
55
|
+
this._reason = signal('');
|
|
56
|
+
this.reason = this._reason.asReadonly();
|
|
57
|
+
this.cfg = computed(() => this.props());
|
|
58
|
+
this.skeletonRows = computed(() => Array.from({ length: this.cfg().skeletonRows ?? 3 }, (_, i) => i));
|
|
59
|
+
/** Hay una decisión en vuelo: toda la cola se congela. */
|
|
60
|
+
this.isBusy = computed(() => !!this.cfg().busyItemId);
|
|
61
|
+
if (!this.i18n.hasNamespace(NAMESPACE)) {
|
|
62
|
+
this.i18n.registerContent(NAMESPACE, REQUEST_REVIEW_PANEL_I18N);
|
|
63
|
+
}
|
|
94
64
|
}
|
|
95
|
-
|
|
96
|
-
|
|
65
|
+
t(key) {
|
|
66
|
+
return this.i18n.t(key, NAMESPACE);
|
|
97
67
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
this._req.set(req);
|
|
105
|
-
this.loaded.emit(req);
|
|
106
|
-
this.subscribeComments(req.appId, req.orgId, id);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
this._loadError.set(err);
|
|
110
|
-
this.errors.handle(err, {
|
|
111
|
-
context: 'request-review-panel.load',
|
|
112
|
-
fallbackKey: 'errorTitle',
|
|
113
|
-
i18nNamespace: this.config().i18nNamespace,
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
finally {
|
|
117
|
-
this._loading.set(false);
|
|
118
|
-
}
|
|
68
|
+
/** El ítem en vuelo muestra WORKING; los demás quedan deshabilitados. */
|
|
69
|
+
stateFor(item) {
|
|
70
|
+
const busyId = this.cfg().busyItemId;
|
|
71
|
+
if (busyId === item.id)
|
|
72
|
+
return 'WORKING';
|
|
73
|
+
return busyId ? 'DISABLED' : 'ENABLED';
|
|
119
74
|
}
|
|
120
|
-
|
|
121
|
-
this.
|
|
122
|
-
this.requests
|
|
123
|
-
.watchComments(appId, orgId, requestId)
|
|
124
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
125
|
-
.subscribe({
|
|
126
|
-
next: comments => {
|
|
127
|
-
this._comments.set(comments);
|
|
128
|
-
this._loadingComments.set(false);
|
|
129
|
-
},
|
|
130
|
-
error: () => {
|
|
131
|
-
// comentarios son best-effort; si el listener falla, silenciar y ocultar spinner
|
|
132
|
-
this._loadingComments.set(false);
|
|
133
|
-
},
|
|
134
|
-
});
|
|
75
|
+
approveState(item) {
|
|
76
|
+
return this.stateFor(item);
|
|
135
77
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
catch (err) {
|
|
147
|
-
this.errors.handle(err, {
|
|
148
|
-
context: 'request-review-panel.transition',
|
|
149
|
-
fallbackKey: 'statusError',
|
|
150
|
-
i18nNamespace: this.config().i18nNamespace,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
finally {
|
|
154
|
-
this._transitioning.set(false);
|
|
155
|
-
}
|
|
78
|
+
/**
|
|
79
|
+
* Confirmar el rechazo exige motivo cuando `requireRejectReason` está activo
|
|
80
|
+
* (el default). Es el freno que evita la notificación de rechazo vacía.
|
|
81
|
+
*/
|
|
82
|
+
confirmRejectState(item) {
|
|
83
|
+
const state = this.stateFor(item);
|
|
84
|
+
if (state !== 'ENABLED')
|
|
85
|
+
return state;
|
|
86
|
+
const needsReason = this.cfg().requireRejectReason !== false;
|
|
87
|
+
return needsReason && this._reason().trim().length === 0 ? 'DISABLED' : 'ENABLED';
|
|
156
88
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const metadata = this._req()?.metadata;
|
|
160
|
-
if (hero && metadata)
|
|
161
|
-
hero.navigate(metadata);
|
|
89
|
+
onReasonInput(event) {
|
|
90
|
+
this._reason.set(event.target.value);
|
|
162
91
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
month: 'short',
|
|
170
|
-
year: 'numeric',
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return iso;
|
|
92
|
+
startReject(item) {
|
|
93
|
+
// Sin motivo obligatorio el rechazo es directo: abrir un formulario que no
|
|
94
|
+
// exige nada solo agrega un paso.
|
|
95
|
+
if (this.cfg().requireRejectReason === false) {
|
|
96
|
+
this.decision.emit({ itemId: item.id, approved: false });
|
|
97
|
+
return;
|
|
175
98
|
}
|
|
99
|
+
this._reason.set('');
|
|
100
|
+
this._rejectingId.set(item.id);
|
|
176
101
|
}
|
|
177
|
-
|
|
178
|
-
|
|
102
|
+
cancelReject() {
|
|
103
|
+
this._rejectingId.set('');
|
|
104
|
+
this._reason.set('');
|
|
179
105
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
const lang = this.i18n.lang();
|
|
187
|
-
const mins = Math.floor(diffMs / 60000);
|
|
188
|
-
if (mins < 1)
|
|
189
|
-
return lang === 'es' ? 'hace un momento' : 'just now';
|
|
190
|
-
if (mins < 60)
|
|
191
|
-
return lang === 'es' ? `hace ${mins} min` : `${mins}m ago`;
|
|
192
|
-
const hours = Math.floor(mins / 60);
|
|
193
|
-
if (hours < 24)
|
|
194
|
-
return lang === 'es' ? `hace ${hours} h` : `${hours}h ago`;
|
|
195
|
-
const days = Math.floor(hours / 24);
|
|
196
|
-
if (days < 7)
|
|
197
|
-
return lang === 'es' ? `hace ${days} dia${days > 1 ? 's' : ''}` : `${days}d ago`;
|
|
198
|
-
return this.formatDate(iso);
|
|
106
|
+
confirmReject(item) {
|
|
107
|
+
const reason = this._reason().trim();
|
|
108
|
+
if (this.cfg().requireRejectReason !== false && reason.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
this.decision.emit({ itemId: item.id, approved: false, reason: reason || undefined });
|
|
111
|
+
this.cancelReject();
|
|
199
112
|
}
|
|
200
|
-
|
|
201
|
-
|
|
113
|
+
approve(item) {
|
|
114
|
+
this.decision.emit({ itemId: item.id, approved: true });
|
|
202
115
|
}
|
|
203
116
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestReviewPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
204
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: {
|
|
205
|
-
<div class="
|
|
206
|
-
@if (
|
|
207
|
-
<div class="
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
<val-skeleton [props]="{ width: '100%', height: '80px', borderRadius: '12px' }" />
|
|
211
|
-
<val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '12px' }" />
|
|
212
|
-
</div>
|
|
213
|
-
} @else if (loadError()) {
|
|
214
|
-
<val-empty-state [props]="errorState()" />
|
|
215
|
-
} @else if (req()) {
|
|
216
|
-
<div class="detail">
|
|
217
|
-
@if (heroConfig() && heroName()) {
|
|
218
|
-
<button class="entity-hero" (click)="onHeroClick()" [disabled]="!canNavigateHero()">
|
|
219
|
-
<div class="entity-hero__media">
|
|
220
|
-
@if (heroImage() && !heroImgFailed()) {
|
|
221
|
-
<img
|
|
222
|
-
[src]="heroImage()"
|
|
223
|
-
[alt]="heroName()!"
|
|
224
|
-
loading="lazy"
|
|
225
|
-
(error)="heroImgFailed.set(true)"
|
|
226
|
-
class="entity-hero__img"
|
|
227
|
-
/>
|
|
228
|
-
} @else {
|
|
229
|
-
<span class="entity-hero__placeholder" aria-hidden="true">{{
|
|
230
|
-
heroConfig()!.placeholderIcon || '📄'
|
|
231
|
-
}}</span>
|
|
232
|
-
}
|
|
233
|
-
</div>
|
|
234
|
-
<div class="entity-hero__body">
|
|
235
|
-
<span class="entity-hero__label">{{ t(heroConfig()!.labelKey) }}</span>
|
|
236
|
-
<span class="entity-hero__name">{{ heroName() }}</span>
|
|
237
|
-
</div>
|
|
238
|
-
@if (canNavigateHero()) {
|
|
239
|
-
<span class="entity-hero__chevron" aria-hidden="true">›</span>
|
|
240
|
-
}
|
|
241
|
-
</button>
|
|
117
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: true, transformFunction: null }, itemBody: { classPropertyName: "itemBody", publicName: "itemBody", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { decision: "decision" }, ngImport: i0, template: `
|
|
118
|
+
<div class="rrp">
|
|
119
|
+
@if (cfg().loading) {
|
|
120
|
+
<div class="rrp__skel" aria-hidden="true">
|
|
121
|
+
@for (row of skeletonRows(); track row) {
|
|
122
|
+
<val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '14px' }" />
|
|
242
123
|
}
|
|
124
|
+
</div>
|
|
125
|
+
} @else if (cfg().errorState) {
|
|
126
|
+
<val-empty-state [props]="cfg().errorState!" />
|
|
127
|
+
} @else if (cfg().items.length === 0) {
|
|
128
|
+
@if (cfg().emptyState; as empty) {
|
|
129
|
+
<val-empty-state [props]="empty" />
|
|
130
|
+
}
|
|
131
|
+
} @else {
|
|
132
|
+
@if (cfg().countLabel; as count) {
|
|
133
|
+
<p class="rrp__count">{{ count }}</p>
|
|
134
|
+
}
|
|
243
135
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
</span>
|
|
249
|
-
<span class="submitted-at">{{ t('submittedAt') }}: {{ formatDate(req()!.createdAt) }}</span>
|
|
250
|
-
</div>
|
|
136
|
+
<ul class="rrp__queue">
|
|
137
|
+
@for (item of cfg().items; track item.id) {
|
|
138
|
+
<li class="rrp__item">
|
|
139
|
+
<h3 class="rrp__title">{{ item.title }}</h3>
|
|
251
140
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
[props]="{
|
|
256
|
-
token: 'approve',
|
|
257
|
-
text: t('approve'),
|
|
258
|
-
color: 'primary',
|
|
259
|
-
fill: 'solid',
|
|
260
|
-
shape: 'round',
|
|
261
|
-
size: 'small',
|
|
262
|
-
type: 'button',
|
|
263
|
-
state: transitioning() ? 'WORKING' : 'ENABLED',
|
|
264
|
-
handler: transition.bind(this, 'approved'),
|
|
265
|
-
}"
|
|
266
|
-
/>
|
|
267
|
-
<val-button
|
|
268
|
-
[props]="{
|
|
269
|
-
token: 'reject',
|
|
270
|
-
text: t('reject'),
|
|
271
|
-
color: 'medium',
|
|
272
|
-
fill: 'outline',
|
|
273
|
-
shape: 'round',
|
|
274
|
-
size: 'small',
|
|
275
|
-
type: 'button',
|
|
276
|
-
state: transitioning() ? 'WORKING' : 'ENABLED',
|
|
277
|
-
handler: transition.bind(this, 'rejected'),
|
|
278
|
-
}"
|
|
279
|
-
/>
|
|
280
|
-
</div>
|
|
281
|
-
}
|
|
282
|
-
</div>
|
|
141
|
+
@for (line of item.meta ?? []; track line) {
|
|
142
|
+
<p class="rrp__meta">{{ line }}</p>
|
|
143
|
+
}
|
|
283
144
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
@if (req()!.submitter!.name) {
|
|
291
|
-
<span class="submitter-name">{{ req()!.submitter!.name }}</span>
|
|
292
|
-
}
|
|
293
|
-
@if (req()!.submitter!.email) {
|
|
294
|
-
<span class="submitter-email">{{ req()!.submitter!.email }}</span>
|
|
295
|
-
}
|
|
296
|
-
@if (req()!.submitter!.phone) {
|
|
297
|
-
<span class="submitter-email">{{ req()!.submitter!.phone }}</span>
|
|
298
|
-
}
|
|
145
|
+
@if (itemBody) {
|
|
146
|
+
<div class="rrp__body">
|
|
147
|
+
<ng-container
|
|
148
|
+
[ngTemplateOutlet]="itemBody"
|
|
149
|
+
[ngTemplateOutletContext]="{ $implicit: item, item: item }"
|
|
150
|
+
/>
|
|
299
151
|
</div>
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@if (rejectingId() === item.id) {
|
|
155
|
+
<div class="rrp__reject">
|
|
156
|
+
<label class="rrp__reject-label" [attr.for]="'rrp-note-' + item.id">
|
|
157
|
+
{{ cfg().rejectReasonLabel ?? t('rejectReason') }}
|
|
158
|
+
</label>
|
|
159
|
+
<textarea
|
|
160
|
+
class="rrp__reject-input"
|
|
161
|
+
[id]="'rrp-note-' + item.id"
|
|
162
|
+
rows="3"
|
|
163
|
+
[placeholder]="cfg().rejectReasonPlaceholder ?? t('rejectReasonPlaceholder')"
|
|
164
|
+
[value]="reason()"
|
|
165
|
+
(input)="onReasonInput($event)"
|
|
166
|
+
></textarea>
|
|
167
|
+
<p class="rrp__reject-hint">
|
|
168
|
+
{{ cfg().rejectReasonHint ?? t('rejectReasonHint') }}
|
|
169
|
+
</p>
|
|
303
170
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
171
|
+
<div class="rrp__actions">
|
|
172
|
+
<val-button
|
|
173
|
+
[props]="{
|
|
174
|
+
token: 'rrp-cancel-' + item.id,
|
|
175
|
+
text: cfg().cancelLabel ?? t('cancel'),
|
|
176
|
+
color: 'dark',
|
|
177
|
+
fill: 'clear',
|
|
178
|
+
size: 'small',
|
|
179
|
+
type: 'button',
|
|
180
|
+
state: isBusy() ? 'DISABLED' : 'ENABLED',
|
|
181
|
+
}"
|
|
182
|
+
(onClick)="cancelReject()"
|
|
183
|
+
/>
|
|
184
|
+
<val-button
|
|
185
|
+
[props]="{
|
|
186
|
+
token: 'rrp-confirm-reject-' + item.id,
|
|
187
|
+
text: cfg().confirmRejectLabel ?? t('confirmReject'),
|
|
188
|
+
color: 'danger',
|
|
189
|
+
fill: 'solid',
|
|
190
|
+
shape: 'round',
|
|
191
|
+
size: 'small',
|
|
192
|
+
type: 'button',
|
|
193
|
+
state: confirmRejectState(item),
|
|
194
|
+
}"
|
|
195
|
+
(onClick)="confirmReject(item)"
|
|
196
|
+
/>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
} @else {
|
|
200
|
+
<div class="rrp__actions">
|
|
201
|
+
<val-button
|
|
202
|
+
[props]="{
|
|
203
|
+
token: 'rrp-reject-' + item.id,
|
|
204
|
+
text: cfg().rejectLabel ?? t('reject'),
|
|
205
|
+
color: 'dark',
|
|
206
|
+
fill: 'outline',
|
|
207
|
+
shape: 'round',
|
|
208
|
+
size: 'small',
|
|
209
|
+
type: 'button',
|
|
210
|
+
state: isBusy() ? 'DISABLED' : 'ENABLED',
|
|
211
|
+
}"
|
|
212
|
+
(onClick)="startReject(item)"
|
|
213
|
+
/>
|
|
214
|
+
<val-button
|
|
215
|
+
[props]="{
|
|
216
|
+
token: 'rrp-approve-' + item.id,
|
|
217
|
+
text: cfg().approveLabel ?? t('approve'),
|
|
218
|
+
color: 'primary',
|
|
219
|
+
fill: 'solid',
|
|
220
|
+
shape: 'round',
|
|
221
|
+
size: 'small',
|
|
222
|
+
type: 'button',
|
|
223
|
+
state: approveState(item),
|
|
224
|
+
}"
|
|
225
|
+
(onClick)="approve(item)"
|
|
226
|
+
/>
|
|
311
227
|
</div>
|
|
312
228
|
}
|
|
313
|
-
</
|
|
229
|
+
</li>
|
|
314
230
|
}
|
|
315
|
-
|
|
316
|
-
@if (
|
|
317
|
-
!config().canReview() && req()!.status === 'approved' && canNavigateHero() && config().viewEntityCtaLabelKey
|
|
318
|
-
) {
|
|
319
|
-
<val-button
|
|
320
|
-
[props]="{
|
|
321
|
-
token: 'view-entity',
|
|
322
|
-
text: t(config().viewEntityCtaLabelKey!),
|
|
323
|
-
color: 'primary',
|
|
324
|
-
fill: 'solid',
|
|
325
|
-
shape: 'round',
|
|
326
|
-
size: 'default',
|
|
327
|
-
type: 'button',
|
|
328
|
-
state: 'ENABLED',
|
|
329
|
-
handler: onHeroClick.bind(this),
|
|
330
|
-
}"
|
|
331
|
-
/>
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
<div class="section">
|
|
335
|
-
<p class="section__title">{{ t('commentsTitle') }}</p>
|
|
336
|
-
@if (loadingComments()) {
|
|
337
|
-
<div class="section-pad">
|
|
338
|
-
<val-skeleton [props]="{ width: '100%', height: '48px', borderRadius: '8px' }" />
|
|
339
|
-
</div>
|
|
340
|
-
} @else if (comments().length === 0) {
|
|
341
|
-
<p class="no-comments">{{ t('noComments') }}</p>
|
|
342
|
-
} @else {
|
|
343
|
-
<ul class="comments">
|
|
344
|
-
@for (c of comments(); track c.commentId) {
|
|
345
|
-
<li class="comment">
|
|
346
|
-
<div class="comment__avatar" aria-hidden="true">{{ authorInitial(c) }}</div>
|
|
347
|
-
<div class="comment__content">
|
|
348
|
-
<div class="comment__header">
|
|
349
|
-
<span class="comment__author">{{ c.author.name || c.author.email }}</span>
|
|
350
|
-
<span class="comment__date">{{ relativeTime(c.createdAt) }}</span>
|
|
351
|
-
</div>
|
|
352
|
-
<p class="comment__body">{{ c.body }}</p>
|
|
353
|
-
</div>
|
|
354
|
-
</li>
|
|
355
|
-
}
|
|
356
|
-
</ul>
|
|
357
|
-
}
|
|
358
|
-
</div>
|
|
359
|
-
</div>
|
|
231
|
+
</ul>
|
|
360
232
|
}
|
|
361
233
|
</div>
|
|
362
|
-
`, isInline: true, styles: ["
|
|
234
|
+
`, isInline: true, styles: [":host{display:block}.rrp{display:flex;flex-direction:column;gap:12px}.rrp__skel{display:flex;flex-direction:column;gap:10px}.rrp__count{margin:0;font-size:.8125rem;font-weight:700;color:var(--ion-color-medium, #92949c);font-variant-numeric:tabular-nums}.rrp__queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.rrp__item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;border-radius:14px;background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.rrp__title{margin:0;font-size:1rem;font-weight:700;color:var(--ion-text-color, #000)}.rrp__meta{margin:0;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.rrp__body{display:flex;flex-direction:column;gap:8px}.rrp__reject{display:flex;flex-direction:column;gap:6px}.rrp__reject-label{font-size:.8125rem;font-weight:600;color:var(--ion-text-color, #000)}.rrp__reject-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #fff);color:var(--ion-text-color, #000);font-family:inherit;font-size:.875rem;resize:vertical}.rrp__reject-input:focus{outline:none;border-color:var(--ion-color-primary)}.rrp__reject-hint{margin:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.rrp__actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}@media (min-width: 576px){.rrp__actions{flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:wrap}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
|
|
363
235
|
}
|
|
364
236
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestReviewPanelComponent, decorators: [{
|
|
365
237
|
type: Component,
|
|
366
|
-
args: [{ selector: 'val-request-review-panel', standalone: true, imports: [ButtonComponent, EmptyStateComponent, SkeletonComponent], template: `
|
|
367
|
-
<div class="
|
|
368
|
-
@if (
|
|
369
|
-
<div class="
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
<val-skeleton [props]="{ width: '100%', height: '80px', borderRadius: '12px' }" />
|
|
373
|
-
<val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '12px' }" />
|
|
374
|
-
</div>
|
|
375
|
-
} @else if (loadError()) {
|
|
376
|
-
<val-empty-state [props]="errorState()" />
|
|
377
|
-
} @else if (req()) {
|
|
378
|
-
<div class="detail">
|
|
379
|
-
@if (heroConfig() && heroName()) {
|
|
380
|
-
<button class="entity-hero" (click)="onHeroClick()" [disabled]="!canNavigateHero()">
|
|
381
|
-
<div class="entity-hero__media">
|
|
382
|
-
@if (heroImage() && !heroImgFailed()) {
|
|
383
|
-
<img
|
|
384
|
-
[src]="heroImage()"
|
|
385
|
-
[alt]="heroName()!"
|
|
386
|
-
loading="lazy"
|
|
387
|
-
(error)="heroImgFailed.set(true)"
|
|
388
|
-
class="entity-hero__img"
|
|
389
|
-
/>
|
|
390
|
-
} @else {
|
|
391
|
-
<span class="entity-hero__placeholder" aria-hidden="true">{{
|
|
392
|
-
heroConfig()!.placeholderIcon || '📄'
|
|
393
|
-
}}</span>
|
|
394
|
-
}
|
|
395
|
-
</div>
|
|
396
|
-
<div class="entity-hero__body">
|
|
397
|
-
<span class="entity-hero__label">{{ t(heroConfig()!.labelKey) }}</span>
|
|
398
|
-
<span class="entity-hero__name">{{ heroName() }}</span>
|
|
399
|
-
</div>
|
|
400
|
-
@if (canNavigateHero()) {
|
|
401
|
-
<span class="entity-hero__chevron" aria-hidden="true">›</span>
|
|
402
|
-
}
|
|
403
|
-
</button>
|
|
238
|
+
args: [{ selector: 'val-request-review-panel', standalone: true, imports: [CommonModule, ButtonComponent, EmptyStateComponent, SkeletonComponent], template: `
|
|
239
|
+
<div class="rrp">
|
|
240
|
+
@if (cfg().loading) {
|
|
241
|
+
<div class="rrp__skel" aria-hidden="true">
|
|
242
|
+
@for (row of skeletonRows(); track row) {
|
|
243
|
+
<val-skeleton [props]="{ width: '100%', height: '120px', borderRadius: '14px' }" />
|
|
404
244
|
}
|
|
245
|
+
</div>
|
|
246
|
+
} @else if (cfg().errorState) {
|
|
247
|
+
<val-empty-state [props]="cfg().errorState!" />
|
|
248
|
+
} @else if (cfg().items.length === 0) {
|
|
249
|
+
@if (cfg().emptyState; as empty) {
|
|
250
|
+
<val-empty-state [props]="empty" />
|
|
251
|
+
}
|
|
252
|
+
} @else {
|
|
253
|
+
@if (cfg().countLabel; as count) {
|
|
254
|
+
<p class="rrp__count">{{ count }}</p>
|
|
255
|
+
}
|
|
405
256
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
</span>
|
|
411
|
-
<span class="submitted-at">{{ t('submittedAt') }}: {{ formatDate(req()!.createdAt) }}</span>
|
|
412
|
-
</div>
|
|
257
|
+
<ul class="rrp__queue">
|
|
258
|
+
@for (item of cfg().items; track item.id) {
|
|
259
|
+
<li class="rrp__item">
|
|
260
|
+
<h3 class="rrp__title">{{ item.title }}</h3>
|
|
413
261
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
[props]="{
|
|
418
|
-
token: 'approve',
|
|
419
|
-
text: t('approve'),
|
|
420
|
-
color: 'primary',
|
|
421
|
-
fill: 'solid',
|
|
422
|
-
shape: 'round',
|
|
423
|
-
size: 'small',
|
|
424
|
-
type: 'button',
|
|
425
|
-
state: transitioning() ? 'WORKING' : 'ENABLED',
|
|
426
|
-
handler: transition.bind(this, 'approved'),
|
|
427
|
-
}"
|
|
428
|
-
/>
|
|
429
|
-
<val-button
|
|
430
|
-
[props]="{
|
|
431
|
-
token: 'reject',
|
|
432
|
-
text: t('reject'),
|
|
433
|
-
color: 'medium',
|
|
434
|
-
fill: 'outline',
|
|
435
|
-
shape: 'round',
|
|
436
|
-
size: 'small',
|
|
437
|
-
type: 'button',
|
|
438
|
-
state: transitioning() ? 'WORKING' : 'ENABLED',
|
|
439
|
-
handler: transition.bind(this, 'rejected'),
|
|
440
|
-
}"
|
|
441
|
-
/>
|
|
442
|
-
</div>
|
|
443
|
-
}
|
|
444
|
-
</div>
|
|
262
|
+
@for (line of item.meta ?? []; track line) {
|
|
263
|
+
<p class="rrp__meta">{{ line }}</p>
|
|
264
|
+
}
|
|
445
265
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
@if (req()!.submitter!.name) {
|
|
453
|
-
<span class="submitter-name">{{ req()!.submitter!.name }}</span>
|
|
454
|
-
}
|
|
455
|
-
@if (req()!.submitter!.email) {
|
|
456
|
-
<span class="submitter-email">{{ req()!.submitter!.email }}</span>
|
|
457
|
-
}
|
|
458
|
-
@if (req()!.submitter!.phone) {
|
|
459
|
-
<span class="submitter-email">{{ req()!.submitter!.phone }}</span>
|
|
460
|
-
}
|
|
266
|
+
@if (itemBody) {
|
|
267
|
+
<div class="rrp__body">
|
|
268
|
+
<ng-container
|
|
269
|
+
[ngTemplateOutlet]="itemBody"
|
|
270
|
+
[ngTemplateOutletContext]="{ $implicit: item, item: item }"
|
|
271
|
+
/>
|
|
461
272
|
</div>
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@if (rejectingId() === item.id) {
|
|
276
|
+
<div class="rrp__reject">
|
|
277
|
+
<label class="rrp__reject-label" [attr.for]="'rrp-note-' + item.id">
|
|
278
|
+
{{ cfg().rejectReasonLabel ?? t('rejectReason') }}
|
|
279
|
+
</label>
|
|
280
|
+
<textarea
|
|
281
|
+
class="rrp__reject-input"
|
|
282
|
+
[id]="'rrp-note-' + item.id"
|
|
283
|
+
rows="3"
|
|
284
|
+
[placeholder]="cfg().rejectReasonPlaceholder ?? t('rejectReasonPlaceholder')"
|
|
285
|
+
[value]="reason()"
|
|
286
|
+
(input)="onReasonInput($event)"
|
|
287
|
+
></textarea>
|
|
288
|
+
<p class="rrp__reject-hint">
|
|
289
|
+
{{ cfg().rejectReasonHint ?? t('rejectReasonHint') }}
|
|
290
|
+
</p>
|
|
465
291
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
292
|
+
<div class="rrp__actions">
|
|
293
|
+
<val-button
|
|
294
|
+
[props]="{
|
|
295
|
+
token: 'rrp-cancel-' + item.id,
|
|
296
|
+
text: cfg().cancelLabel ?? t('cancel'),
|
|
297
|
+
color: 'dark',
|
|
298
|
+
fill: 'clear',
|
|
299
|
+
size: 'small',
|
|
300
|
+
type: 'button',
|
|
301
|
+
state: isBusy() ? 'DISABLED' : 'ENABLED',
|
|
302
|
+
}"
|
|
303
|
+
(onClick)="cancelReject()"
|
|
304
|
+
/>
|
|
305
|
+
<val-button
|
|
306
|
+
[props]="{
|
|
307
|
+
token: 'rrp-confirm-reject-' + item.id,
|
|
308
|
+
text: cfg().confirmRejectLabel ?? t('confirmReject'),
|
|
309
|
+
color: 'danger',
|
|
310
|
+
fill: 'solid',
|
|
311
|
+
shape: 'round',
|
|
312
|
+
size: 'small',
|
|
313
|
+
type: 'button',
|
|
314
|
+
state: confirmRejectState(item),
|
|
315
|
+
}"
|
|
316
|
+
(onClick)="confirmReject(item)"
|
|
317
|
+
/>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
} @else {
|
|
321
|
+
<div class="rrp__actions">
|
|
322
|
+
<val-button
|
|
323
|
+
[props]="{
|
|
324
|
+
token: 'rrp-reject-' + item.id,
|
|
325
|
+
text: cfg().rejectLabel ?? t('reject'),
|
|
326
|
+
color: 'dark',
|
|
327
|
+
fill: 'outline',
|
|
328
|
+
shape: 'round',
|
|
329
|
+
size: 'small',
|
|
330
|
+
type: 'button',
|
|
331
|
+
state: isBusy() ? 'DISABLED' : 'ENABLED',
|
|
332
|
+
}"
|
|
333
|
+
(onClick)="startReject(item)"
|
|
334
|
+
/>
|
|
335
|
+
<val-button
|
|
336
|
+
[props]="{
|
|
337
|
+
token: 'rrp-approve-' + item.id,
|
|
338
|
+
text: cfg().approveLabel ?? t('approve'),
|
|
339
|
+
color: 'primary',
|
|
340
|
+
fill: 'solid',
|
|
341
|
+
shape: 'round',
|
|
342
|
+
size: 'small',
|
|
343
|
+
type: 'button',
|
|
344
|
+
state: approveState(item),
|
|
345
|
+
}"
|
|
346
|
+
(onClick)="approve(item)"
|
|
347
|
+
/>
|
|
473
348
|
</div>
|
|
474
349
|
}
|
|
475
|
-
</
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
@if (
|
|
479
|
-
!config().canReview() && req()!.status === 'approved' && canNavigateHero() && config().viewEntityCtaLabelKey
|
|
480
|
-
) {
|
|
481
|
-
<val-button
|
|
482
|
-
[props]="{
|
|
483
|
-
token: 'view-entity',
|
|
484
|
-
text: t(config().viewEntityCtaLabelKey!),
|
|
485
|
-
color: 'primary',
|
|
486
|
-
fill: 'solid',
|
|
487
|
-
shape: 'round',
|
|
488
|
-
size: 'default',
|
|
489
|
-
type: 'button',
|
|
490
|
-
state: 'ENABLED',
|
|
491
|
-
handler: onHeroClick.bind(this),
|
|
492
|
-
}"
|
|
493
|
-
/>
|
|
350
|
+
</li>
|
|
494
351
|
}
|
|
495
|
-
|
|
496
|
-
<div class="section">
|
|
497
|
-
<p class="section__title">{{ t('commentsTitle') }}</p>
|
|
498
|
-
@if (loadingComments()) {
|
|
499
|
-
<div class="section-pad">
|
|
500
|
-
<val-skeleton [props]="{ width: '100%', height: '48px', borderRadius: '8px' }" />
|
|
501
|
-
</div>
|
|
502
|
-
} @else if (comments().length === 0) {
|
|
503
|
-
<p class="no-comments">{{ t('noComments') }}</p>
|
|
504
|
-
} @else {
|
|
505
|
-
<ul class="comments">
|
|
506
|
-
@for (c of comments(); track c.commentId) {
|
|
507
|
-
<li class="comment">
|
|
508
|
-
<div class="comment__avatar" aria-hidden="true">{{ authorInitial(c) }}</div>
|
|
509
|
-
<div class="comment__content">
|
|
510
|
-
<div class="comment__header">
|
|
511
|
-
<span class="comment__author">{{ c.author.name || c.author.email }}</span>
|
|
512
|
-
<span class="comment__date">{{ relativeTime(c.createdAt) }}</span>
|
|
513
|
-
</div>
|
|
514
|
-
<p class="comment__body">{{ c.body }}</p>
|
|
515
|
-
</div>
|
|
516
|
-
</li>
|
|
517
|
-
}
|
|
518
|
-
</ul>
|
|
519
|
-
}
|
|
520
|
-
</div>
|
|
521
|
-
</div>
|
|
352
|
+
</ul>
|
|
522
353
|
}
|
|
523
354
|
</div>
|
|
524
|
-
`, styles: ["
|
|
525
|
-
}], ctorParameters: () => []
|
|
526
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1yZXZpZXctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yZXF1ZXN0LXJldmlldy1wYW5lbC9yZXF1ZXN0LXJldmlldy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFNdEUsTUFBTSxZQUFZLEdBQWdDO0lBQ2hELFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtJQUMxQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7SUFDMUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVB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LEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELENBQUMsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7K0dBOUtVLDJCQUEyQjttR0FBM0IsMkJBQTJCLDRYQWphNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEpULG1sSUEvSlMsZUFBZSwwR0FBRSxtQkFBbUIsK0VBQUUsaUJBQWlCOzs0RkFrYXRELDJCQUEyQjtrQkFyYXZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxZQUN4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4SlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIE9uSW5pdCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwUmVxdWVzdCwgUmVxdWVzdENvbW1lbnQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy90eXBlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IFZhbHRlY2hFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvdmFsdGVjaC1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2VtcHR5LXN0YXRlL3R5cGVzJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvc2tlbGV0b24vc2tlbGV0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuaW50ZXJmYWNlIFN0YXR1c1N0eWxlIHtcbiAgYmc6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbn1cbmNvbnN0IFNUQVRVU19TVFlMRTogUmVjb3JkPHN0cmluZywgU3RhdHVzU3R5bGU+ID0ge1xuICBhcHByb3ZlZDogeyBiZzogJyMyMmM1NWUnLCBjb2xvcjogJyNmZmYnIH0sXG4gIHJlamVjdGVkOiB7IGJnOiAnI2VmNDQ0NCcsIGNvbG9yOiAnI2ZmZicgfSxcbiAgaW5fcmV2aWV3OiB7IGJnOiAnI2ZlZjNjNycsIGNvbG9yOiAnIzkyNDAwZScgfSxcbiAgcGVuZGluZzogeyBiZzogJ3ZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCknLCBjb2xvcjogJ3ZhcigtLWlvbi1jb2xvci1kYXJrLCAjMjIyKScgfSxcbiAgY2FuY2VsbGVkOiB7IGJnOiAndmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KScsIGNvbG9yOiAndmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzYzNjQ2OSknIH0sXG4gIGNsb3NlZDogeyBiZzogJ3ZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCknLCBjb2xvcjogJ3ZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM2MzY0NjkpJyB9LFxufTtcblxuLyoqXG4gKiBDb25maWcgZGVsIFwiZW50aXR5IGhlcm9cIiAoYmxvcXVlIG9wY2lvbmFsIGFycmliYSBkZWwgc3RhdHVzOiBlai4gYW5pbWFsIGVuXG4gKiBDaGVzZWQsIHJlY2V0YSBlbiBNZWFscGxhbikuIEFnbsOzc3RpY28gYWwgZG9taW5pbyDigJQgY2FkYSBhcHAgZGVjbGFyYSBkZSBxdcOpXG4gKiBjYW1wb3MgZGUgYG1ldGFkYXRhYCBzYWNhciBub21icmUvaW1hZ2VuIHkgYSBkw7NuZGUgbmF2ZWdhci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0UmV2aWV3RW50aXR5SGVyb0NvbmZpZyB7XG4gIGxhYmVsS2V5OiBzdHJpbmc7XG4gIG5hbWVGaWVsZDogc3RyaW5nO1xuICBpbWFnZUZpZWxkPzogc3RyaW5nO1xuICBwbGFjZWhvbGRlckljb24/OiBzdHJpbmc7XG4gIGNhbk5hdmlnYXRlOiAobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGJvb2xlYW47XG4gIG5hdmlnYXRlOiAobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFJldmlld1BhbmVsQ29uZmlnIHtcbiAgLyoqIE5hbWVzcGFjZSBpMThuIGRvbmRlIHZpdmVuIGxhcyBrZXlzIChzdGF0dXNfKiwgYXBwcm92ZSwgcmVqZWN0LCBzdWJtaXR0ZXIsIGZpZWxkcywgY29tbWVudHNUaXRsZSwgbm9Db21tZW50cywgc3VibWl0dGVkQXQsIHN0YXR1c1VwZGF0ZWQsIHN0YXR1c0Vycm9yLCBlcnJvclRpdGxlLCBvZmZsaW5lVGl0bGUsIG9mZmxpbmVIaW50LCByZXRyeSwgdmlld0FuaW1hbCkuICovXG4gIGkxOG5OYW1lc3BhY2U6IHN0cmluZztcbiAgZW50aXR5SGVybz86IFJlcXVlc3RSZXZpZXdFbnRpdHlIZXJvQ29uZmlnO1xuICAvKiogU2kgZWwgdXN1YXJpbyBhY3R1YWwgcHVlZGUgYXByb2Jhci9yZWNoYXphciAoZWouIHBlcnNvbmEuaXNQdWJsaXNoZXIoKSkuICovXG4gIGNhblJldmlldzogKCkgPT4gYm9vbGVhbjtcbiAgLyoqIENUQSBwb3N0LWFwcm9iYWNpw7NuIHBhcmEgcXVpZW4gTk8gcmV2aXNhIChlai4gXCJ2ZXIgcmVjZXRhXCIvXCJ2ZXIgYW5pbWFsXCIpLiAqL1xuICB2aWV3RW50aXR5Q3RhTGFiZWxLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFuZWwgZGUgcmV2aXNpw7NuIGRlIHVuYSBSZXF1ZXN0IGdlbsOpcmljYSAoQURSLTA2MS8wNjIpOiBzdGF0dXMgKyBhY2Npb25lc1xuICogYXBwcm92ZS9yZWplY3QgKyBmaWVsZHMgZGVsIGZvcm11bGFyaW8gKyBjb21lbnRhcmlvcy4gQ29uZmlnLWRyaXZlbiwgc2luXG4gKiBjb25vY2ltaWVudG8gZGVsIGRvbWluaW8gKGFkb3B0aW9uLCByZWNpcGVfdmVyaWZpY2F0aW9uLCBldGMuKSDigJQgY2FkYVxuICogY29uc3VtZXIgaW55ZWN0YSBzdSBgUmVxdWVzdFJldmlld1BhbmVsQ29uZmlnYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJlcXVlc3QtcmV2aWV3LXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0J1dHRvbkNvbXBvbmVudCwgRW1wdHlTdGF0ZUNvbXBvbmVudCwgU2tlbGV0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYWdlXCI+XG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnODhweCcsIGJvcmRlclJhZGl1czogJzE0cHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnNjRweCcsIGJvcmRlclJhZGl1czogJzEycHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnODBweCcsIGJvcmRlclJhZGl1czogJzEycHgnIH1cIiAvPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTIwcHgnLCBib3JkZXJSYWRpdXM6ICcxMnB4JyB9XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJlcnJvclN0YXRlKClcIiAvPlxuICAgICAgfSBAZWxzZSBpZiAocmVxKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbFwiPlxuICAgICAgICAgIEBpZiAoaGVyb0NvbmZpZygpICYmIGhlcm9OYW1lKCkpIHtcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlbnRpdHktaGVyb1wiIChjbGljayk9XCJvbkhlcm9DbGljaygpXCIgW2Rpc2FibGVkXT1cIiFjYW5OYXZpZ2F0ZUhlcm8oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50aXR5LWhlcm9fX21lZGlhXCI+XG4gICAgICAgICAgICAgICAgQGlmIChoZXJvSW1hZ2UoKSAmJiAhaGVyb0ltZ0ZhaWxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaGVyb0ltYWdlKClcIlxuICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImhlcm9OYW1lKCkhXCJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaGVyb0ltZ0ZhaWxlZC5zZXQodHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVudGl0eS1oZXJvX19pbWdcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW50aXR5LWhlcm9fX3BsYWNlaG9sZGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgaGVyb0NvbmZpZygpIS5wbGFjZWhvbGRlckljb24gfHwgJ/Cfk4QnXG4gICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW50aXR5LWhlcm9fX2JvZHlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVudGl0eS1oZXJvX19sYWJlbFwiPnt7IHQoaGVyb0NvbmZpZygpIS5sYWJlbEtleSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHktaGVyb19fbmFtZVwiPnt7IGhlcm9OYW1lKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGNhbk5hdmlnYXRlSGVybygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbnRpdHktaGVyb19fY2hldnJvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKAujwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1jYXJkXCIgW3N0eWxlLmJvcmRlci1sZWZ0LWNvbG9yXT1cInN0YXR1c1N0eWxlKCkuYmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY2FyZF9fdG9wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlXCIgW3N0eWxlLmJhY2tncm91bmRdPVwic3RhdHVzU3R5bGUoKS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJzdGF0dXNTdHlsZSgpLmNvbG9yXCI+XG4gICAgICAgICAgICAgICAge3sgdCgnc3RhdHVzXycgKyByZXEoKSEuc3RhdHVzKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VibWl0dGVkLWF0XCI+e3sgdCgnc3VibWl0dGVkQXQnKSB9fToge3sgZm9ybWF0RGF0ZShyZXEoKSEuY3JlYXRlZEF0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGNvbmZpZygpLmNhblJldmlldygpICYmIChyZXEoKSEuc3RhdHVzID09PSAncGVuZGluZycgfHwgcmVxKCkhLnN0YXR1cyA9PT0gJ2luX3JldmlldycpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXJvd1wiPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ2FwcHJvdmUnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdhcHByb3ZlJyksXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHRyYW5zaXRpb25pbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogdHJhbnNpdGlvbi5iaW5kKHRoaXMsICdhcHByb3ZlZCcpLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46ICdyZWplY3QnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdyZWplY3QnKSxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHRyYW5zaXRpb25pbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogdHJhbnNpdGlvbi5iaW5kKHRoaXMsICdyZWplY3RlZCcpLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKHJlcSgpIS5zdWJtaXR0ZXIpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbl9fdGl0bGVcIj57eyB0KCdzdWJtaXR0ZXInKSB9fTwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Ym1pdHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VibWl0dGVyLWF2YXRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IHN1Ym1pdHRlckluaXRpYWwoKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJtaXR0ZXItaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VibWl0dGVyLW5hbWVcIj57eyByZXEoKSEuc3VibWl0dGVyIS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5lbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Ym1pdHRlci1lbWFpbFwiPnt7IHJlcSgpIS5zdWJtaXR0ZXIhLmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChyZXEoKSEuc3VibWl0dGVyIS5waG9uZSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Ym1pdHRlci1lbWFpbFwiPnt7IHJlcSgpIS5zdWJtaXR0ZXIhLnBob25lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoZmllbGRFbnRyaWVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cInNlY3Rpb25fX3RpdGxlXCI+e3sgdCgnZmllbGRzJykgfX08L3A+XG4gICAgICAgICAgICAgIEBmb3IgKGVudHJ5IG9mIGZpZWxkRW50cmllcygpOyB0cmFjayBlbnRyeS5rZXkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLXJvd19fbGFiZWxcIj57eyBlbnRyeS5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLXJvd19fdmFsdWVcIj57eyBlbnRyeS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICFjb25maWcoKS5jYW5SZXZpZXcoKSAmJiByZXEoKSEuc3RhdHVzID09PSAnYXBwcm92ZWQnICYmIGNhbk5hdmlnYXRlSGVybygpICYmIGNvbmZpZygpLnZpZXdFbnRpdHlDdGFMYWJlbEtleVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICB0b2tlbjogJ3ZpZXctZW50aXR5JyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0KGNvbmZpZygpLnZpZXdFbnRpdHlDdGFMYWJlbEtleSEpLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBvbkhlcm9DbGljay5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic2VjdGlvbl9fdGl0bGVcIj57eyB0KCdjb21tZW50c1RpdGxlJykgfX08L3A+XG4gICAgICAgICAgICBAaWYgKGxvYWRpbmdDb21tZW50cygpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXBhZFwiPlxuICAgICAgICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnNDhweCcsIGJvcmRlclJhZGl1czogJzhweCcgfVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29tbWVudHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJuby1jb21tZW50c1wiPnt7IHQoJ25vQ29tbWVudHMnKSB9fTwvcD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21tZW50c1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGMgb2YgY29tbWVudHMoKTsgdHJhY2sgYy5jb21tZW50SWQpIHtcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRfX2F2YXRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGF1dGhvckluaXRpYWwoYykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnRfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWVudF9faGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRfX2F1dGhvclwiPnt7IGMuYXV0aG9yLm5hbWUgfHwgYy5hdXRob3IuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbW1lbnRfX2RhdGVcIj57eyByZWxhdGl2ZVRpbWUoYy5jcmVhdGVkQXQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29tbWVudF9fYm9keVwiPnt7IGMuYm9keSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5wYWdlIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxNHB4O1xuICAgICAgfVxuICAgICAgLnNrZWwge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuc2tlbCB2YWwtc2tlbGV0b24ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5kZXRhaWwge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE0cHg7XG4gICAgICB9XG5cbiAgICAgIC5lbnRpdHktaGVybyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTRweDtcbiAgICAgICAgcGFkZGluZzogMTRweCAxNnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1pb24tYmFja2dyb3VuZC1jb2xvciwgI2ZmZikpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxNHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVybzpkaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVyb19fbWVkaWEge1xuICAgICAgICB3aWR0aDogNTZweDtcbiAgICAgICAgaGVpZ2h0OiA1NnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2ltZyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgICAgfVxuICAgICAgLmVudGl0eS1oZXJvX19wbGFjZWhvbGRlciB7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42MjVyZW07XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2JvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDJweDtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuICAgICAgLmVudGl0eS1oZXJvX19sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjNjM2NDY5KTtcbiAgICAgIH1cbiAgICAgIC5lbnRpdHktaGVyb19fbmFtZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgICAuZW50aXR5LWhlcm9fX2NoZXZyb24ge1xuICAgICAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjOTI5NDljKTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICB9XG5cbiAgICAgIC5zdGF0dXMtY2FyZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpO1xuICAgICAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkO1xuICAgICAgICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdGF0dXMtY2FyZF9fdG9wIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG4gICAgICAuc3RhdHVzLWJhZGdlIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwYWRkaW5nOiA0cHggMTJweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlZC1hdCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmstc2hhZGUsICMxZTIwMjMpO1xuICAgICAgfVxuICAgICAgLmFjdGlvbnMtcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG5cbiAgICAgIC5zZWN0aW9uIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNhcmQtYmFja2dyb3VuZCwgdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IsICNmZmYpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAuc2VjdGlvbl9fdGl0bGUge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmstc2hhZGUsICMxZTIwMjMpO1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLXBhZCB7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcbiAgICAgIH1cblxuICAgICAgLnN1Ym1pdHRlci1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdWJtaXR0ZXItYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQwcHg7XG4gICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzMxMzEzMSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlci1pbmZvIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cbiAgICAgIC5zdWJtaXR0ZXItbmFtZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IsICMwMDApO1xuICAgICAgfVxuICAgICAgLnN1Ym1pdHRlci1lbWFpbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM2MzY0NjkpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgLmZpZWxkLXJvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogM3B4O1xuICAgICAgICBwYWRkaW5nOiAxMXB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDYpKTtcbiAgICAgIH1cbiAgICAgIC5maWVsZC1yb3c6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgICB9XG4gICAgICAuZmllbGQtcm93X19sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrLCAjNjM2NDY5KTtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgICB9XG4gICAgICAuZmllbGQtcm93X192YWx1ZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IsICMwMDApO1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xuICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XG4gICAgICB9XG5cbiAgICAgIC5uby1jb21tZW50cyB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRzIHtcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDYpKTtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50Omxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tOiBub25lO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRfX2F2YXRhciB7XG4gICAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICMzMTMxMzEpO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnktY29udHJhc3QsICNmZmYpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19jb250ZW50IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDNweDtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAuY29tbWVudF9fYXV0aG9yIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgIH1cbiAgICAgIC5jb21tZW50X19kYXRlIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICM5Mjk0OWMpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuICAgICAgLmNvbW1lbnRfX2JvZHkge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvciwgIzAwMCk7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0UmV2aWV3UGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlcXVlc3RzID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHJlYWRvbmx5IHJlcXVlc3RJZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQucmVxdWlyZWQ8UmVxdWVzdFJldmlld1BhbmVsQ29uZmlnPigpO1xuXG4gIHJlYWRvbmx5IGxvYWRlZCA9IG91dHB1dDxBcHBSZXF1ZXN0PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcSA9IHNpZ25hbDxBcHBSZXF1ZXN0IHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xvYWRFcnJvciA9IHNpZ25hbDx1bmtub3duIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbW1lbnRzID0gc2lnbmFsPFJlcXVlc3RDb21tZW50W10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbG9hZGluZ0NvbW1lbnRzID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNpdGlvbmluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgcmVxID0gdGhpcy5fcmVxLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHRoaXMuX2xvYWRpbmcuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBsb2FkRXJyb3IgPSB0aGlzLl9sb2FkRXJyb3IuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBjb21tZW50cyA9IHRoaXMuX2NvbW1lbnRzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgbG9hZGluZ0NvbW1lbnRzID0gdGhpcy5fbG9hZGluZ0NvbW1lbnRzLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25pbmcuYXNSZWFkb25seSgpO1xuXG4gIHJlYWRvbmx5IGhlcm9JbWdGYWlsZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IGhlcm9Db25maWcgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZygpLmVudGl0eUhlcm8pO1xuICByZWFkb25seSBzdGF0dXNTdHlsZSA9IGNvbXB1dGVkKCgpID0+IFNUQVRVU19TVFlMRVt0aGlzLl9yZXEoKT8uc3RhdHVzID8/ICcnXSA/PyBTVEFUVVNfU1RZTEVbJ3BlbmRpbmcnXSk7XG4gIHJlYWRvbmx5IGhlcm9OYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhlcm8gPSB0aGlzLmhlcm9Db25maWcoKTtcbiAgICBpZiAoIWhlcm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX3JlcSgpPy5tZXRhZGF0YT8uW2hlcm8ubmFtZUZpZWxkXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0pO1xuICByZWFkb25seSBoZXJvSW1hZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGVybyA9IHRoaXMuaGVyb0NvbmZpZygpO1xuICAgIGlmICghaGVybz8uaW1hZ2VGaWVsZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmVxKCk/Lm1ldGFkYXRhPy5baGVyby5pbWFnZUZpZWxkXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0pO1xuICByZWFkb25seSBjYW5OYXZpZ2F0ZUhlcm8gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGVybyA9IHRoaXMuaGVyb0NvbmZpZygpO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5fcmVxKCk/Lm1ldGFkYXRhO1xuICAgIGlmICghaGVybyB8fCAhbWV0YWRhdGEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGVyby5jYW5OYXZpZ2F0ZShtZXRhZGF0YSk7XG4gIH0pO1xuICByZWFkb25seSBzdWJtaXR0ZXJJbml0aWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHMgPSB0aGlzLl9yZXEoKT8uc3VibWl0dGVyO1xuICAgIGlmICghcykgcmV0dXJuICc/JztcbiAgICByZXR1cm4gKChzLm5hbWUgfHwgcy5lbWFpbCkgPz8gJz8nKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcbiAgfSk7XG4gIHJlYWRvbmx5IGZpZWxkRW50cmllcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXEoKT8uZmllbGRzID8/IHt9O1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhmaWVsZHMpXG4gICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdiAhPSBudWxsICYmIHYgIT09ICcnKVxuICAgICAgLm1hcCgoW2ssIHZdKSA9PiAoeyBrZXk6IGssIHZhbHVlOiBTdHJpbmcodikgfSkpO1xuICB9KTtcblxuICByZWFkb25seSBlcnJvclN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBlcnIgPSB0aGlzLl9sb2FkRXJyb3IoKTtcbiAgICBjb25zdCBtc2cgPSAoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIgPz8gJycpKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGlzT2ZmbGluZSA9IG1zZy5pbmNsdWRlcygnbmV0d29yaycpIHx8IG1zZy5pbmNsdWRlcygnb2ZmbGluZScpO1xuICAgIHJldHVybiB7XG4gICAgICB2YXJpYW50OiAnZXJyb3InLFxuICAgICAgdGl0bGU6IGlzT2ZmbGluZSA/IHRoaXMudCgnb2ZmbGluZVRpdGxlJykgOiB0aGlzLnQoJ2Vycm9yVGl0bGUnKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBpc09mZmxpbmUgPyB0aGlzLnQoJ29mZmxpbmVIaW50JykgOiAnJyxcbiAgICAgIGN0YTogeyBsYWJlbDogdGhpcy50KCdyZXRyeScpLCBoYW5kbGVyOiAoKSA9PiB2b2lkIHRoaXMubG9hZCgpIH0sXG4gICAgfTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlkID0gdGhpcy5yZXF1ZXN0SWQoKTtcbiAgICB0aGlzLl9sb2FkaW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLl9sb2FkRXJyb3Iuc2V0KG51bGwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXEgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFJlcXVlc3QoaWQpKTtcbiAgICAgIHRoaXMuX3JlcS5zZXQocmVxKTtcbiAgICAgIHRoaXMubG9hZGVkLmVtaXQocmVxKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlQ29tbWVudHMocmVxLmFwcElkLCByZXEub3JnSWQsIGlkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2xvYWRFcnJvci5zZXQoZXJyKTtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3JlcXVlc3QtcmV2aWV3LXBhbmVsLmxvYWQnLFxuICAgICAgICBmYWxsYmFja0tleTogJ2Vycm9yVGl0bGUnLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiB0aGlzLmNvbmZpZygpLmkxOG5OYW1lc3BhY2UsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlQ29tbWVudHMoYXBwSWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgcmVxdWVzdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9sb2FkaW5nQ29tbWVudHMuc2V0KHRydWUpO1xuICAgIHRoaXMucmVxdWVzdHNcbiAgICAgIC53YXRjaENvbW1lbnRzKGFwcElkLCBvcmdJZCwgcmVxdWVzdElkKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogY29tbWVudHMgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbW1lbnRzLnNldChjb21tZW50cyk7XG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0NvbW1lbnRzLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gY29tZW50YXJpb3Mgc29uIGJlc3QtZWZmb3J0OyBzaSBlbCBsaXN0ZW5lciBmYWxsYSwgc2lsZW5jaWFyIHkgb2N1bHRhciBzcGlubmVyXG4gICAgICAgICAgdGhpcy5fbG9hZGluZ0NvbW1lbnRzLnNldChmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHRyYW5zaXRpb24oc3RhdHVzOiAnYXBwcm92ZWQnIHwgJ3JlamVjdGVkJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcSA9IHRoaXMuX3JlcSgpO1xuICAgIGlmICghcmVxIHx8IHRoaXMuX3RyYW5zaXRpb25pbmcoKSkgcmV0dXJuO1xuICAgIHRoaXMuX3RyYW5zaXRpb25pbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLnRyYW5zaXRpb24ocmVxLmlkLCB7IHN0YXR1cyB9KSk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWQoKTtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7IG1lc3NhZ2U6IHRoaXMudCgnc3RhdHVzVXBkYXRlZCcpLCBkdXJhdGlvbjogMjUwMCwgY29sb3I6ICdkYXJrJywgcG9zaXRpb246ICd0b3AnIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAncmVxdWVzdC1yZXZpZXctcGFuZWwudHJhbnNpdGlvbicsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnc3RhdHVzRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiB0aGlzLmNvbmZpZygpLmkxOG5OYW1lc3BhY2UsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uSGVyb0NsaWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGhlcm8gPSB0aGlzLmhlcm9Db25maWcoKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuX3JlcSgpPy5tZXRhZGF0YTtcbiAgICBpZiAoaGVybyAmJiBtZXRhZGF0YSkgaGVyby5uYXZpZ2F0ZShtZXRhZGF0YSk7XG4gIH1cblxuICBmb3JtYXREYXRlKGlzbzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWlzbykgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoaXNvKS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5pMThuLmxhbmcoKSA9PT0gJ2VzJyA/ICdlcy1DTCcgOiAnZW4tVVMnLCB7XG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gaXNvO1xuICAgIH1cbiAgfVxuXG4gIGF1dGhvckluaXRpYWwoYzogUmVxdWVzdENvbW1lbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiAoKGMuYXV0aG9yLm5hbWUgfHwgYy5hdXRob3IuZW1haWwpID8/ICc/JykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICByZWxhdGl2ZVRpbWUoaXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaXNvKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGlmZk1zID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKGlzbykuZ2V0VGltZSgpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oZGlmZk1zKSkgcmV0dXJuIGlzbztcbiAgICBjb25zdCBsYW5nID0gdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihkaWZmTXMgLyA2MDAwMCk7XG4gICAgaWYgKG1pbnMgPCAxKSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/ICdoYWNlIHVuIG1vbWVudG8nIDogJ2p1c3Qgbm93JztcbiAgICBpZiAobWlucyA8IDYwKSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/IGBoYWNlICR7bWluc30gbWluYCA6IGAke21pbnN9bSBhZ29gO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihtaW5zIC8gNjApO1xuICAgIGlmIChob3VycyA8IDI0KSByZXR1cm4gbGFuZyA9PT0gJ2VzJyA/IGBoYWNlICR7aG91cnN9IGhgIDogYCR7aG91cnN9aCBhZ29gO1xuICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMjQpO1xuICAgIGlmIChkYXlzIDwgNykgcmV0dXJuIGxhbmcgPT09ICdlcycgPyBgaGFjZSAke2RheXN9IGRpYSR7ZGF5cyA+IDEgPyAncycgOiAnJ31gIDogYCR7ZGF5c31kIGFnb2A7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShpc28pO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5jb25maWcoKS5pMThuTmFtZXNwYWNlKTtcbiAgfVxufVxuIl19
|
|
355
|
+
`, styles: [":host{display:block}.rrp{display:flex;flex-direction:column;gap:12px}.rrp__skel{display:flex;flex-direction:column;gap:10px}.rrp__count{margin:0;font-size:.8125rem;font-weight:700;color:var(--ion-color-medium, #92949c);font-variant-numeric:tabular-nums}.rrp__queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.rrp__item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;border-radius:14px;background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.rrp__title{margin:0;font-size:1rem;font-weight:700;color:var(--ion-text-color, #000)}.rrp__meta{margin:0;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.rrp__body{display:flex;flex-direction:column;gap:8px}.rrp__reject{display:flex;flex-direction:column;gap:6px}.rrp__reject-label{font-size:.8125rem;font-weight:600;color:var(--ion-text-color, #000)}.rrp__reject-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #fff);color:var(--ion-text-color, #000);font-family:inherit;font-size:.875rem;resize:vertical}.rrp__reject-input:focus{outline:none;border-color:var(--ion-color-primary)}.rrp__reject-hint{margin:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.rrp__actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}@media (min-width: 576px){.rrp__actions{flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:wrap}}\n"] }]
|
|
356
|
+
}], ctorParameters: () => [], propDecorators: { itemBody: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}], decision: [{
|
|
359
|
+
type: Output
|
|
360
|
+
}] } });
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1yZXZpZXctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yZXF1ZXN0LXJldmlldy1wYW5lbC9yZXF1ZXN0LXJldmlldy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQUd4RSxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztBQUV2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUE2SEgsTUFBTSxPQUFPLDJCQUEyQjtJQTJCdEM7UUExQlEsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQixVQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBOEIsQ0FBQztRQVFwRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFFL0QsMkRBQTJEO1FBQzFDLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxDQUFD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ZSxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLFlBQ3RFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxSFQ7d0RBWVEsUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9za2VsZXRvbi9za2VsZXRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgUkVRVUVTVF9SRVZJRVdfUEFORUxfSTE4TiB9IGZyb20gJy4vcmVxdWVzdC1yZXZpZXctcGFuZWwuaTE4bic7XG5pbXBvcnQgeyBSZXF1ZXN0UmV2aWV3RGVjaXNpb24sIFJlcXVlc3RSZXZpZXdJdGVtLCBSZXF1ZXN0UmV2aWV3UGFuZWxNZXRhZGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnUmVxdWVzdFJldmlld1BhbmVsJztcblxuLyoqXG4gKiB2YWwtcmVxdWVzdC1yZXZpZXctcGFuZWwg4oCUIGNvbGEgZGUgcmV2aXNpw7NuIGRlbCBmYWN0b3J5IChBRFItMDYyKS5cbiAqXG4gKiBFcyAqKnByZXNlbnRhY2lvbmFsKio6IG5vIGNhcmdhIGRhdG9zLCBubyBjb25vY2UgZWwgYmFja2VuZCBuaSBlbCBkb21pbmlvLiBFbFxuICogY29uc3VtZXIgbGUgcGFzYSBsYSBjb2xhIHlhIG5vcm1hbGl6YWRhIHkgZXNjdWNoYSBgKGRlY2lzaW9uKWAuXG4gKlxuICogIyMgUG9yIHF1w6kgZWwgY3VlcnBvIHZhIHByb3llY3RhZG8geSBubyBjb25maWd1cmFkb1xuICpcbiAqIEVsIEFEUiBvcmlnaW5hbCBwcm9wb27DrWEgZGVzY3JpYmlyIGVsIGN1ZXJwbyBjb24gYXJyYXlzIGRlIG5vbWJyZXMgZGUgY2FtcG9cbiAqIChgZmllbGRzLmRpc3BsYXk6IFsndGF4SWQnLCAndGFnc1JlcXVlc3RlZCddYCkuIEFsIGltcGxlbWVudGFybG8gY29uIGxvcyBkb3NcbiAqIGNvbnN1bWlkb3JlcyByZWFsZXMgZGVsYW50ZSBxdWVkw7MgY2xhcm8gcXVlIGVzbyByZWludmVudGEgdW4gbW90b3IgZGVcbiAqIHRlbXBsYXRpbmcgcGVvciBxdWUgQW5ndWxhcjogQ2hlc2VkIG5lY2VzaXRhIHVuYSBsaXN0YSBkZSBkb2N1bWVudG9zIGNvblxuICogaWNvbm9zIHkgYHRhcmdldD1cIl9ibGFua1wiYCwgT2toZWxpYSB1biBlbmxhY2UgYSBsYSByZWNldGEgeSB1biBpbnB1dCBkZVxuICogY29tZW50YXJpby4gTmluZ3VuYSBsaXN0YSBkZSBzdHJpbmdzIGV4cHJlc2EgZXNvIHNpbiBhZ3JlZ2FybGUgdW4gZmxhZyBhbFxuICogY29tcG9uZW50ZSBwb3IgY2FkYSBjYXNvIG51ZXZvLlxuICpcbiAqIEVudG9uY2VzIGVsIHBhbmVsIGVzIGR1ZcOxbyBkZSBsbyBxdWUgKipkZSB2ZXJkYWQqKiBzZSByZXBpdGUg4oCUIGxhIGPDoXNjYXJhLCBlbFxuICogY2hyb21lIGRlIGxhIGNhcmQsIHkgbGEgbWVjw6FuaWNhIGRlIGRlY2lzacOzbiDigJQgeSBlbCBjdWVycG8gZGUgY2FkYSDDrXRlbSBsb1xuICogZXNjcmliZSBjYWRhIHZlcnRpY2FsIGVuIHVuIGBuZy10ZW1wbGF0ZWAgY29uIHN1IHByb3BpbyBIVE1MLlxuICpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtcmVxdWVzdC1yZXZpZXctcGFuZWwgW3Byb3BzXT1cInBhbmVsUHJvcHMoKVwiIFtpdGVtQm9keV09XCJib2R5XCJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2lzaW9uKT1cIm9uRGVjaXNpb24oJGV2ZW50KVwiIC8+XG4gKlxuICogPG5nLXRlbXBsYXRlICNib2R5IGxldC1pdGVtPlxuICogICA8YSBbcm91dGVyTGlua109XCJbJy9hcHAvcmVjZXRhcycsIHJlY2lwZUlkT2YoaXRlbSldXCI+VmVyIHJlY2V0YTwvYT5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqXG4gKiAjIyBSZWNoYXpvIGNvbiBtb3Rpdm9cbiAqXG4gKiBFbCBmbHVqbyBkZSBkb3MgcGFzb3MgKFJlY2hhemFyIOKGkiBlc2NyaWJpciBtb3Rpdm8g4oaSIENvbmZpcm1hcikgZXMgZGVsIHBhbmVsLFxuICogbm8gZGVsIGNvbnN1bWVyLCB5IGVzdMOhIGFjdGl2byBwb3IgZGVmZWN0by4gUmVjaGF6YXIgZGUgdW4gY2xpY2sgZGVqYSBhbFxuICogc29saWNpdGFudGUgc2luIHNhYmVyIHF1w6kgY29ycmVnaXI7IGVyYSBlbCDDum5pY28gZGUgbG9zIGRvcyBwYW5lbGVzIHF1ZSBsb1xuICogdGVuw61hIGJpZW4gcmVzdWVsdG8geSBhaG9yYSBsbyBoZXJlZGFuIGxvcyBkb3MuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yZXF1ZXN0LXJldmlldy1wYW5lbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgRW1wdHlTdGF0ZUNvbXBvbmVudCwgU2tlbGV0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycnBcIj5cbiAgICAgIEBpZiAoY2ZnKCkubG9hZGluZykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19za2VsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgQGZvciAocm93IG9mIHNrZWxldG9uUm93cygpOyB0cmFjayByb3cpIHtcbiAgICAgICAgICAgIDx2YWwtc2tlbGV0b24gW3Byb3BzXT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTIwcHgnLCBib3JkZXJSYWRpdXM6ICcxNHB4JyB9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAoY2ZnKCkuZXJyb3JTdGF0ZSkge1xuICAgICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJjZmcoKS5lcnJvclN0YXRlIVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChjZmcoKS5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgQGlmIChjZmcoKS5lbXB0eVN0YXRlOyBhcyBlbXB0eSkge1xuICAgICAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cImVtcHR5XCIgLz5cbiAgICAgICAgfVxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBpZiAoY2ZnKCkuY291bnRMYWJlbDsgYXMgY291bnQpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cInJycF9fY291bnRcIj57eyBjb3VudCB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIDx1bCBjbGFzcz1cInJycF9fcXVldWVcIj5cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGNmZygpLml0ZW1zOyB0cmFjayBpdGVtLmlkKSB7XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJycnBfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicnJwX190aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L2gzPlxuXG4gICAgICAgICAgICAgIEBmb3IgKGxpbmUgb2YgaXRlbS5tZXRhID8/IFtdOyB0cmFjayBsaW5lKSB7XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJycnBfX21ldGFcIj57eyBsaW5lIH19PC9wPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgQGlmIChpdGVtQm9keSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycnBfX2JvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbUJvZHlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0sIGl0ZW06IGl0ZW0gfVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgQGlmIChyZWplY3RpbmdJZCgpID09PSBpdGVtLmlkKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJycF9fcmVqZWN0XCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycnBfX3JlamVjdC1sYWJlbFwiIFthdHRyLmZvcl09XCIncnJwLW5vdGUtJyArIGl0ZW0uaWRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY2ZnKCkucmVqZWN0UmVhc29uTGFiZWwgPz8gdCgncmVqZWN0UmVhc29uJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycnBfX3JlamVjdC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCIncnJwLW5vdGUtJyArIGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjZmcoKS5yZWplY3RSZWFzb25QbGFjZWhvbGRlciA/PyB0KCdyZWplY3RSZWFzb25QbGFjZWhvbGRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJlYXNvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uUmVhc29uSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicnJwX19yZWplY3QtaGludFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjZmcoKS5yZWplY3RSZWFzb25IaW50ID8/IHQoJ3JlamVjdFJlYXNvbkhpbnQnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiAncnJwLWNhbmNlbC0nICsgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZygpLmNhbmNlbExhYmVsID8/IHQoJ2NhbmNlbCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogaXNCdXN5KCkgPyAnRElTQUJMRUQnIDogJ0VOQUJMRUQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImNhbmNlbFJlamVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46ICdycnAtY29uZmlybS1yZWplY3QtJyArIGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcoKS5jb25maXJtUmVqZWN0TGFiZWwgPz8gdCgnY29uZmlybVJlamVjdCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGNvbmZpcm1SZWplY3RTdGF0ZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJjb25maXJtUmVqZWN0KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnJwX19hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiAncnJwLXJlamVjdC0nICsgaXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcoKS5yZWplY3RMYWJlbCA/PyB0KCdyZWplY3QnKSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpc0J1c3koKSA/ICdESVNBQkxFRCcgOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJzdGFydFJlamVjdChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ3JycC1hcHByb3ZlLScgKyBpdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZygpLmFwcHJvdmVMYWJlbCA/PyB0KCdhcHByb3ZlJyksXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGFwcHJvdmVTdGF0ZShpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImFwcHJvdmUoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdWw+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtcmV2aWV3LXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RSZXZpZXdQYW5lbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcHJvcHMgPSBpbnB1dC5yZXF1aXJlZDxSZXF1ZXN0UmV2aWV3UGFuZWxNZXRhZGF0YT4oKTtcblxuICAvKipcbiAgICogQ3VlcnBvIGRlIGNhZGEgY2FyZC4gRWwgY29udGV4dG8gdHJhZSBlbCDDrXRlbSBjb21vIGAkaW1wbGljaXRgIHkgdGFtYmnDqW5cbiAgICogY29tbyBgaXRlbWAsIHBhcmEgcXVlIGVsIGNvbnN1bWVyIHB1ZWRhIHVzYXIgYGxldC1pdGVtYCBvIGBsZXQteD1cIml0ZW1cImAuXG4gICAqL1xuICBASW5wdXQoKSBpdGVtQm9keT86IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBSZXF1ZXN0UmV2aWV3SXRlbTsgaXRlbTogUmVxdWVzdFJldmlld0l0ZW0gfT47XG5cbiAgQE91dHB1dCgpIGRlY2lzaW9uID0gbmV3IEV2ZW50RW1pdHRlcjxSZXF1ZXN0UmV2aWV3RGVjaXNpb24+KCk7XG5cbiAgLyoqIElEIGRlbCDDrXRlbSBjdXlvIGZvcm11bGFyaW8gZGUgcmVjaGF6byBlc3TDoSBhYmllcnRvLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWplY3RpbmdJZCA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHJlamVjdGluZ0lkID0gdGhpcy5fcmVqZWN0aW5nSWQuYXNSZWFkb25seSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlYXNvbiA9IHNpZ25hbCgnJyk7XG4gIHJlYWRvbmx5IHJlYXNvbiA9IHRoaXMuX3JlYXNvbi5hc1JlYWRvbmx5KCk7XG5cbiAgcmVhZG9ubHkgY2ZnID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcm9wcygpKTtcblxuICByZWFkb25seSBza2VsZXRvblJvd3MgPSBjb21wdXRlZCgoKSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLmNmZygpLnNrZWxldG9uUm93cyA/PyAzIH0sIChfLCBpKSA9PiBpKSk7XG5cbiAgLyoqIEhheSB1bmEgZGVjaXNpw7NuIGVuIHZ1ZWxvOiB0b2RhIGxhIGNvbGEgc2UgY29uZ2VsYS4gKi9cbiAgcmVhZG9ubHkgaXNCdXN5ID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLmNmZygpLmJ1c3lJdGVtSWQpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShOQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KE5BTUVTUEFDRSwgUkVRVUVTVF9SRVZJRVdfUEFORUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICAvKiogRWwgw610ZW0gZW4gdnVlbG8gbXVlc3RyYSBXT1JLSU5HOyBsb3MgZGVtw6FzIHF1ZWRhbiBkZXNoYWJpbGl0YWRvcy4gKi9cbiAgcHJpdmF0ZSBzdGF0ZUZvcihpdGVtOiBSZXF1ZXN0UmV2aWV3SXRlbSk6IENvbXBvbmVudFN0YXRlIHtcbiAgICBjb25zdCBidXN5SWQgPSB0aGlzLmNmZygpLmJ1c3lJdGVtSWQ7XG4gICAgaWYgKGJ1c3lJZCA9PT0gaXRlbS5pZCkgcmV0dXJuICdXT1JLSU5HJztcbiAgICByZXR1cm4gYnVzeUlkID8gJ0RJU0FCTEVEJyA6ICdFTkFCTEVEJztcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHByb3ZlU3RhdGUoaXRlbTogUmVxdWVzdFJldmlld0l0ZW0pOiBDb21wb25lbnRTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVGb3IoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybWFyIGVsIHJlY2hhem8gZXhpZ2UgbW90aXZvIGN1YW5kbyBgcmVxdWlyZVJlamVjdFJlYXNvbmAgZXN0w6EgYWN0aXZvXG4gICAqIChlbCBkZWZhdWx0KS4gRXMgZWwgZnJlbm8gcXVlIGV2aXRhIGxhIG5vdGlmaWNhY2nDs24gZGUgcmVjaGF6byB2YWPDrWEuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uZmlybVJlamVjdFN0YXRlKGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogQ29tcG9uZW50U3RhdGUge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZUZvcihpdGVtKTtcbiAgICBpZiAoc3RhdGUgIT09ICdFTkFCTEVEJykgcmV0dXJuIHN0YXRlO1xuICAgIGNvbnN0IG5lZWRzUmVhc29uID0gdGhpcy5jZmcoKS5yZXF1aXJlUmVqZWN0UmVhc29uICE9PSBmYWxzZTtcbiAgICByZXR1cm4gbmVlZHNSZWFzb24gJiYgdGhpcy5fcmVhc29uKCkudHJpbSgpLmxlbmd0aCA9PT0gMCA/ICdESVNBQkxFRCcgOiAnRU5BQkxFRCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25SZWFzb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWFzb24uc2V0KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0UmVqZWN0KGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogdm9pZCB7XG4gICAgLy8gU2luIG1vdGl2byBvYmxpZ2F0b3JpbyBlbCByZWNoYXpvIGVzIGRpcmVjdG86IGFicmlyIHVuIGZvcm11bGFyaW8gcXVlIG5vXG4gICAgLy8gZXhpZ2UgbmFkYSBzb2xvIGFncmVnYSB1biBwYXNvLlxuICAgIGlmICh0aGlzLmNmZygpLnJlcXVpcmVSZWplY3RSZWFzb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRlY2lzaW9uLmVtaXQoeyBpdGVtSWQ6IGl0ZW0uaWQsIGFwcHJvdmVkOiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVhc29uLnNldCgnJyk7XG4gICAgdGhpcy5fcmVqZWN0aW5nSWQuc2V0KGl0ZW0uaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbmNlbFJlamVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWplY3RpbmdJZC5zZXQoJycpO1xuICAgIHRoaXMuX3JlYXNvbi5zZXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpcm1SZWplY3QoaXRlbTogUmVxdWVzdFJldmlld0l0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLl9yZWFzb24oKS50cmltKCk7XG4gICAgaWYgKHRoaXMuY2ZnKCkucmVxdWlyZVJlamVjdFJlYXNvbiAhPT0gZmFsc2UgJiYgcmVhc29uLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuZGVjaXNpb24uZW1pdCh7IGl0ZW1JZDogaXRlbS5pZCwgYXBwcm92ZWQ6IGZhbHNlLCByZWFzb246IHJlYXNvbiB8fCB1bmRlZmluZWQgfSk7XG4gICAgdGhpcy5jYW5jZWxSZWplY3QoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHByb3ZlKGl0ZW06IFJlcXVlc3RSZXZpZXdJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5kZWNpc2lvbi5lbWl0KHsgaXRlbUlkOiBpdGVtLmlkLCBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
|