@eqproject/eqp-dynamic-module 2.11.6 → 2.11.8
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/USERGUIDE.md +437 -437
- package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +2 -2
- package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs +115 -27
- package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +28 -6
- package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +25 -5
- package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +12 -3
- package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +26 -4
- package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +26 -4
- package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +26 -4
- package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +1 -1
- package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +3 -3
- package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +1 -1
- package/esm2020/lib/components/private/graphs/graph/graph.component.mjs +3 -3
- package/esm2020/lib/utils/css-property-catalog.mjs +45 -2
- package/esm2020/lib/utils/field-style-catalog.mjs +45 -19
- package/esm2020/lib/utils/floating-label-styles.mjs +155 -0
- package/esm2020/lib/utils/refresh-outline-notch.mjs +38 -0
- package/fesm2015/eqproject-eqp-dynamic-module.mjs +782 -327
- package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/fesm2020/eqproject-eqp-dynamic-module.mjs +762 -313
- package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -1
- package/lib/components/private/field-graphics-editor/field-graphics-editor.component.d.ts +19 -1
- package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +6 -2
- package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +6 -2
- package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +6 -2
- package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +6 -2
- package/lib/utils/css-property-catalog.d.ts +25 -0
- package/lib/utils/field-style-catalog.d.ts +5 -0
- package/lib/utils/floating-label-styles.d.ts +73 -0
- package/lib/utils/refresh-outline-notch.d.ts +15 -0
- package/package.json +1 -1
package/esm2020/lib/components/private/field-graphics-editor/field-graphics-editor.component.mjs
CHANGED
|
@@ -3,9 +3,11 @@ import { FieldTypeEnum } from '../../../models/baseField.model';
|
|
|
3
3
|
import { AvailableFileExtensions, AvailableImageExtensions } from '../../../models/fields/attachmentField.model';
|
|
4
4
|
import { BoolPresentantioEnum } from '../../../models/fields/booleanField.model';
|
|
5
5
|
import { DateTimeTypeEnum } from '../../../models/fields/dateField.model';
|
|
6
|
+
import { UtilityHelperService } from '../../../services/utilityHelper.services';
|
|
7
|
+
import { decodeFloatingMap, encodeFloatingMap, readStyleCss, writeStyleCss } from '../../../utils/floating-label-styles';
|
|
6
8
|
import { buildCssColor, cssColorToAlphaPercent, cssColorToHex } from '../../../utils/css-color';
|
|
7
9
|
import { getCssDeclaration, parseCssDeclarations, setCssDeclaration } from '../../../utils/css-declarations';
|
|
8
|
-
import { buildCustomCssPropertyDef,
|
|
10
|
+
import { buildCustomCssPropertyDef, getCssPropertiesForProfile, getCssPropertyDef, } from '../../../utils/css-property-catalog';
|
|
9
11
|
import { cloneFieldStyleMap, ensureFieldStyleMap, getCommonStates, getFieldStyleElements, getFieldStyleTypeDef, getFieldDisplayName, getEffectiveStyleMap, legacyTargetKey, mergeLegacyStylesIntoMap, GLOBAL_STYLE_ELEMENTS, resolveGlobalElementKeys, } from '../../../utils/field-style-catalog';
|
|
10
12
|
import * as i0 from "@angular/core";
|
|
11
13
|
import * as i1 from "@angular/forms";
|
|
@@ -130,7 +132,7 @@ export class FieldGraphicsEditorComponent {
|
|
|
130
132
|
}
|
|
131
133
|
// La base comprende il CSS legacy assorbito, altrimenti l'editor mostrerebbe
|
|
132
134
|
// "non impostato" su proprietà che a video si vedono eccome (applicate inline)
|
|
133
|
-
group.styleMap = getEffectiveStyleMap(sample);
|
|
135
|
+
group.styleMap = decodeFloatingMap(getEffectiveStyleMap(sample));
|
|
134
136
|
this.applyGlobalOverridesToMap(sample, group.styleMap);
|
|
135
137
|
Object.keys(group.overrides).forEach((entry) => {
|
|
136
138
|
const { key, prop } = this.splitEntry(entry);
|
|
@@ -144,13 +146,13 @@ export class FieldGraphicsEditorComponent {
|
|
|
144
146
|
if (!source) {
|
|
145
147
|
return;
|
|
146
148
|
}
|
|
147
|
-
const clone = this.buildPreviewField(source, group.styleMap);
|
|
149
|
+
const clone = this.buildPreviewField(source, group.styleMap, group.openElement);
|
|
148
150
|
group.elements = getFieldStyleElements(clone);
|
|
149
151
|
if (!group.elements.some((e) => e.key === group.openElement)) {
|
|
150
152
|
group.openElement = group.elements[0]?.key ?? '';
|
|
151
153
|
}
|
|
152
154
|
group.previewField = clone;
|
|
153
|
-
group.previewRecord = { [clone.Name]: this.getPreviewInitialValue(clone) };
|
|
155
|
+
group.previewRecord = { [clone.Name]: this.getPreviewInitialValue(clone, group.openElement) };
|
|
154
156
|
this.styleVersion++;
|
|
155
157
|
}
|
|
156
158
|
get activeGroup() {
|
|
@@ -165,7 +167,11 @@ export class FieldGraphicsEditorComponent {
|
|
|
165
167
|
this.styleVersion++;
|
|
166
168
|
}
|
|
167
169
|
toggleElement(group, elementKey) {
|
|
170
|
+
const floatingBefore = this.previewLabelMode(group.openElement);
|
|
168
171
|
group.openElement = group.openElement === elementKey ? '' : elementKey;
|
|
172
|
+
if (this.previewLabelMode(group.openElement) !== floatingBefore) {
|
|
173
|
+
this.buildPreview(group);
|
|
174
|
+
}
|
|
169
175
|
}
|
|
170
176
|
/** Cambiando campione si rileggono i suoi stili reali, mantenendo le modifiche in sospeso */
|
|
171
177
|
changeSample(group, index) {
|
|
@@ -201,7 +207,11 @@ export class FieldGraphicsEditorComponent {
|
|
|
201
207
|
this.styleVersion++;
|
|
202
208
|
}
|
|
203
209
|
toggleGlobalElement(elementKey) {
|
|
210
|
+
const floatingBefore = this.previewLabelMode(this.globalOpenElement);
|
|
204
211
|
this.globalOpenElement = this.globalOpenElement === elementKey ? '' : elementKey;
|
|
212
|
+
if (this.previewLabelMode(this.globalOpenElement) !== floatingBefore) {
|
|
213
|
+
this.rebuildGlobalPreview();
|
|
214
|
+
}
|
|
205
215
|
}
|
|
206
216
|
changeGlobalSample(index) {
|
|
207
217
|
this.globalSampleIndex = Number(index);
|
|
@@ -224,11 +234,11 @@ export class FieldGraphicsEditorComponent {
|
|
|
224
234
|
this.globalPreviewField = null;
|
|
225
235
|
return;
|
|
226
236
|
}
|
|
227
|
-
const map = getEffectiveStyleMap(sample);
|
|
237
|
+
const map = decodeFloatingMap(getEffectiveStyleMap(sample));
|
|
228
238
|
this.applyGlobalOverridesToMap(sample, map);
|
|
229
|
-
const clone = this.buildPreviewField(sample, map);
|
|
239
|
+
const clone = this.buildPreviewField(sample, map, this.globalOpenElement);
|
|
230
240
|
this.globalPreviewField = clone;
|
|
231
|
-
this.globalPreviewRecord = { [clone.Name]: this.getPreviewInitialValue(clone) };
|
|
241
|
+
this.globalPreviewRecord = { [clone.Name]: this.getPreviewInitialValue(clone, this.globalOpenElement) };
|
|
232
242
|
this.styleVersion++;
|
|
233
243
|
}
|
|
234
244
|
/** Riversa le modifiche globali in sospeso su una mappa stili, risolte per quel campo */
|
|
@@ -272,7 +282,7 @@ export class FieldGraphicsEditorComponent {
|
|
|
272
282
|
if (keys.length === 0) {
|
|
273
283
|
return '';
|
|
274
284
|
}
|
|
275
|
-
const map = getEffectiveStyleMap(sample);
|
|
285
|
+
const map = decodeFloatingMap(getEffectiveStyleMap(sample));
|
|
276
286
|
return getCssDeclaration(map[keys[0] + this.globalSelectedState] ?? '', prop);
|
|
277
287
|
}
|
|
278
288
|
setGlobalPropertyValue(elementKey, prop, value) {
|
|
@@ -288,13 +298,12 @@ export class FieldGraphicsEditorComponent {
|
|
|
288
298
|
}
|
|
289
299
|
/** Proprietà mostrate nella scheda globale per un elemento logico */
|
|
290
300
|
globalPropertiesFor(elementKey) {
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
: CSS_CORE_PROPERTIES.slice();
|
|
301
|
+
const profile = this.globalElements.find((e) => e.key === elementKey)?.profile;
|
|
302
|
+
const result = getCssPropertiesForProfile(profile, this.globalShowAllProperties);
|
|
294
303
|
const sample = this.globalSampleField;
|
|
295
304
|
const valorized = [];
|
|
296
305
|
if (sample) {
|
|
297
|
-
const map = getEffectiveStyleMap(sample);
|
|
306
|
+
const map = decodeFloatingMap(getEffectiveStyleMap(sample));
|
|
298
307
|
resolveGlobalElementKeys(sample, elementKey).forEach((realKey) => {
|
|
299
308
|
parseCssDeclarations(map[realKey + this.globalSelectedState] ?? '')
|
|
300
309
|
.forEach((d) => { if (!valorized.includes(d.prop)) {
|
|
@@ -328,9 +337,8 @@ export class FieldGraphicsEditorComponent {
|
|
|
328
337
|
*/
|
|
329
338
|
propertiesFor(group, elementKey) {
|
|
330
339
|
const css = group.styleMap[this.styleKey(group, elementKey)] ?? '';
|
|
331
|
-
const
|
|
332
|
-
|
|
333
|
-
: CSS_CORE_PROPERTIES.slice();
|
|
340
|
+
const profile = group.elements.find((e) => e.key === elementKey)?.profile;
|
|
341
|
+
const result = getCssPropertiesForProfile(profile, group.showAllProperties);
|
|
334
342
|
this.pushValorized(result, parseCssDeclarations(css).map((d) => d.prop));
|
|
335
343
|
return result;
|
|
336
344
|
}
|
|
@@ -378,7 +386,7 @@ export class FieldGraphicsEditorComponent {
|
|
|
378
386
|
sizeNumber(value, definition) {
|
|
379
387
|
const parsed = parseFloat(value);
|
|
380
388
|
if (isNaN(parsed)) {
|
|
381
|
-
return definition.min ?? 0;
|
|
389
|
+
return definition.defaultValue ?? definition.min ?? 0;
|
|
382
390
|
}
|
|
383
391
|
return parsed;
|
|
384
392
|
}
|
|
@@ -406,7 +414,8 @@ export class FieldGraphicsEditorComponent {
|
|
|
406
414
|
}
|
|
407
415
|
writes.forEach((value, entry) => {
|
|
408
416
|
const { key, prop } = this.splitEntry(entry);
|
|
409
|
-
|
|
417
|
+
// Passa da readStyleCss/writeStyleCss: le chiavi "…Sollevata" sono virtuali
|
|
418
|
+
writeStyleCss(map, key, setCssDeclaration(readStyleCss(map, key), prop, value));
|
|
410
419
|
});
|
|
411
420
|
});
|
|
412
421
|
this.applyEvent.emit();
|
|
@@ -464,7 +473,12 @@ export class FieldGraphicsEditorComponent {
|
|
|
464
473
|
return;
|
|
465
474
|
}
|
|
466
475
|
const target = legacyTargetKey(field, name);
|
|
467
|
-
if (!target
|
|
476
|
+
if (!target) {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
// "Descrizione" copre anche le sue varianti (nel contenitore / sul bordo)
|
|
480
|
+
const targetElement = target.slice(0, -'Normale'.length);
|
|
481
|
+
if (![...keys].some((k) => k.startsWith(targetElement))) {
|
|
468
482
|
return;
|
|
469
483
|
}
|
|
470
484
|
const map = ensureFieldStyleMap(field);
|
|
@@ -534,6 +548,11 @@ export class FieldGraphicsEditorComponent {
|
|
|
534
548
|
this.activeGroup.showAllProperties = !this.activeGroup.showAllProperties;
|
|
535
549
|
}
|
|
536
550
|
}
|
|
551
|
+
/** False per gli elementi con un elenco di proprietà chiuso (niente "Altre proprietà...") */
|
|
552
|
+
rowHasMoreProperties(elementKey) {
|
|
553
|
+
const profile = this.currentElements.find((e) => e.key === elementKey)?.profile;
|
|
554
|
+
return !profile?.only;
|
|
555
|
+
}
|
|
537
556
|
rowProperties(elementKey) {
|
|
538
557
|
if (this.activeTab === 'globale') {
|
|
539
558
|
return this.globalPropertiesFor(elementKey);
|
|
@@ -546,12 +565,37 @@ export class FieldGraphicsEditorComponent {
|
|
|
546
565
|
}
|
|
547
566
|
return this.activeGroup ? this.setPropertiesCount(this.activeGroup, elementKey) : 0;
|
|
548
567
|
}
|
|
549
|
-
|
|
568
|
+
/** Valore impostato direttamente sull'elemento, senza eredità */
|
|
569
|
+
rowGetOwn(elementKey, prop) {
|
|
550
570
|
if (this.activeTab === 'globale') {
|
|
551
571
|
return this.getGlobalPropertyValue(elementKey, prop);
|
|
552
572
|
}
|
|
553
573
|
return this.activeGroup ? this.getPropertyValue(this.activeGroup, elementKey, prop) : '';
|
|
554
574
|
}
|
|
575
|
+
/**
|
|
576
|
+
* Valore mostrato a video. "Etichetta sul bordo" parte dalla grafica di "Etichetta nel
|
|
577
|
+
* contenitore" e sovrascrive solo ciò che vi è impostato: dove non ha un valore proprio
|
|
578
|
+
* mostra quello ereditato, così lo specchietto riflette ciò che si vede in anteprima.
|
|
579
|
+
*/
|
|
580
|
+
rowGet(elementKey, prop) {
|
|
581
|
+
const own = this.rowGetOwn(elementKey, prop);
|
|
582
|
+
if (own) {
|
|
583
|
+
return own;
|
|
584
|
+
}
|
|
585
|
+
const base = this.inheritanceSourceKey(elementKey);
|
|
586
|
+
return base ? this.rowGetOwn(base, prop) : '';
|
|
587
|
+
}
|
|
588
|
+
/** Elemento da cui "…Sollevata" eredita (la chiave base), null per gli altri */
|
|
589
|
+
inheritanceSourceKey(elementKey) {
|
|
590
|
+
if (!(elementKey ?? '').endsWith('Sollevata')) {
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
593
|
+
const base = elementKey.slice(0, -'Sollevata'.length);
|
|
594
|
+
return base === 'Etichetta' ? 'EtichettaRiposo' : base;
|
|
595
|
+
}
|
|
596
|
+
rowIsInherited(elementKey, prop) {
|
|
597
|
+
return !this.rowGetOwn(elementKey, prop) && !!this.rowGet(elementKey, prop);
|
|
598
|
+
}
|
|
555
599
|
rowSet(elementKey, prop, value) {
|
|
556
600
|
if (this.activeTab === 'globale') {
|
|
557
601
|
this.setGlobalPropertyValue(elementKey, prop, value);
|
|
@@ -562,7 +606,7 @@ export class FieldGraphicsEditorComponent {
|
|
|
562
606
|
}
|
|
563
607
|
}
|
|
564
608
|
rowIsSet(elementKey, prop) {
|
|
565
|
-
return !!this.
|
|
609
|
+
return !!this.rowGetOwn(elementKey, prop);
|
|
566
610
|
}
|
|
567
611
|
rowReset(elementKey, prop) {
|
|
568
612
|
this.rowSet(elementKey, prop, '');
|
|
@@ -628,11 +672,12 @@ export class FieldGraphicsEditorComponent {
|
|
|
628
672
|
//#endregion Utilità
|
|
629
673
|
//#region Anteprima
|
|
630
674
|
/** Crea il campo fittizio dell'anteprima agganciandogli la mappa stili passata */
|
|
631
|
-
buildPreviewField(source, styleMap) {
|
|
675
|
+
buildPreviewField(source, styleMap, openElement) {
|
|
632
676
|
const clone = this.safeClone(source);
|
|
633
677
|
const def = getFieldStyleTypeDef(clone.FieldType);
|
|
678
|
+
// I template leggono il formato salvato: le chiavi virtuali vanno ricodificate
|
|
634
679
|
if (def) {
|
|
635
|
-
clone[def.styleProp] = styleMap;
|
|
680
|
+
clone[def.styleProp] = encodeFloatingMap(styleMap);
|
|
636
681
|
}
|
|
637
682
|
// Il legacy e' gia' dentro styleMap: lasciarlo qui lo riapplicherebbe inline,
|
|
638
683
|
// coprendo le regole iniettate e mostrando un'anteprima falsa
|
|
@@ -640,12 +685,55 @@ export class FieldGraphicsEditorComponent {
|
|
|
640
685
|
clone.FieldstyleCSS = null;
|
|
641
686
|
const controlName = clone.Label || 'preview_field';
|
|
642
687
|
clone.Name = controlName;
|
|
688
|
+
// A riposo la label sta nel contenitore solo se il campo è vuoto: via valore
|
|
689
|
+
// predefinito e formula, altrimenti i template riempirebbero l'anteprima
|
|
690
|
+
if (this.previewLabelMode(openElement) === 'riposo') {
|
|
691
|
+
if (clone.DataGetter) {
|
|
692
|
+
clone.DataGetter = { ...clone.DataGetter, DataGetterValue: null };
|
|
693
|
+
}
|
|
694
|
+
clone.Formula = null;
|
|
695
|
+
}
|
|
643
696
|
this.prepareTypeSpecificPreview(clone);
|
|
644
|
-
const initialValue = this.getPreviewInitialValue(clone);
|
|
697
|
+
const initialValue = this.getPreviewInitialValue(clone, openElement);
|
|
645
698
|
clone.FormFormGroup = this.formBuilder.group({ [controlName]: [initialValue] });
|
|
646
699
|
return clone;
|
|
647
700
|
}
|
|
648
|
-
|
|
701
|
+
/**
|
|
702
|
+
* Stato della label che l'anteprima deve mostrare per l'elemento aperto: la label Material
|
|
703
|
+
* si solleva sul bordo solo se il campo ha un valore, quindi l'anteprima lo simula.
|
|
704
|
+
*/
|
|
705
|
+
previewLabelMode(elementKey) {
|
|
706
|
+
if ((elementKey ?? '').endsWith('Sollevata')) {
|
|
707
|
+
return 'sollevata';
|
|
708
|
+
}
|
|
709
|
+
if (['Descrizione', 'Label', 'EtichettaRiposo'].includes(elementKey)) {
|
|
710
|
+
return 'riposo';
|
|
711
|
+
}
|
|
712
|
+
return null;
|
|
713
|
+
}
|
|
714
|
+
getPreviewInitialValue(field, openElement = '') {
|
|
715
|
+
if (this.previewLabelMode(openElement) === 'sollevata') {
|
|
716
|
+
switch (Number(field.FieldType)) {
|
|
717
|
+
case FieldTypeEnum['Campo di testo']:
|
|
718
|
+
case FieldTypeEnum['Area di testo']:
|
|
719
|
+
return 'Testo di esempio';
|
|
720
|
+
case FieldTypeEnum['Campo numerico']:
|
|
721
|
+
return 123;
|
|
722
|
+
case FieldTypeEnum['Data e/o ora']:
|
|
723
|
+
return new Date();
|
|
724
|
+
case FieldTypeEnum['Elenco generico']: {
|
|
725
|
+
const lv = field;
|
|
726
|
+
const pairs = lv.ValuePairs ?? {};
|
|
727
|
+
const firstKey = Object.keys(pairs)[0];
|
|
728
|
+
if (firstKey == null) {
|
|
729
|
+
break;
|
|
730
|
+
}
|
|
731
|
+
const raw = pairs[firstKey];
|
|
732
|
+
const value = UtilityHelperService.isNumeric(raw) ? Number(raw) : raw;
|
|
733
|
+
return lv.IsMultiChoiche ? [value] : value;
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
649
737
|
switch (Number(field.FieldType)) {
|
|
650
738
|
case FieldTypeEnum['Allegato']:
|
|
651
739
|
return [];
|
|
@@ -717,10 +805,10 @@ export class FieldGraphicsEditorComponent {
|
|
|
717
805
|
}
|
|
718
806
|
}
|
|
719
807
|
FieldGraphicsEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldGraphicsEditorComponent, deps: [{ token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
720
|
-
FieldGraphicsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FieldGraphicsEditorComponent, selector: "field-graphics-editor", inputs: { fields: "fields", endPointConfiguration: "endPointConfiguration", formulaObject: "formulaObject" }, outputs: { applyEvent: "applyEvent", cancelEvent: "cancelEvent" }, ngImport: i0, template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "component", type: i6.TextFieldTemplateComponent, selector: "text-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i7.BooleanFieldTemplateComponent, selector: "boolean-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i8.DateFieldTemplateComponent, selector: "date-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i9.TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i10.NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i11.ListValueFieldTemplateComponent, selector: "list-value-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i12.AttachmentFieldTemplateComponent, selector: "attachment-field-template", inputs: ["onlyImages", "field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "onAttachmentsChange"] }, { kind: "component", type: i13.ImageFieldTemplateComponent, selector: "image-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageDraw"] }, { kind: "component", type: i14.ImageFieldSelectorTemplateComponent, selector: "image-field-selector-template", inputs: ["record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i15.LabelFieldTemplateComponent, selector: "label-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i16.ImageWithMarkersFieldTemplateComponent, selector: "image-with-markers-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageMark"] }, { kind: "component", type: i17.ActionButtonFieldTemplateComponent, selector: "action-button-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["fireTrigger", "recordChange"] }] });
|
|
808
|
+
FieldGraphicsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FieldGraphicsEditorComponent, selector: "field-graphics-editor", inputs: { fields: "fields", endPointConfiguration: "endPointConfiguration", formulaObject: "formulaObject" }, outputs: { applyEvent: "applyEvent", cancelEvent: "cancelEvent" }, ngImport: i0, template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\"\r\n [class.is-inherited]=\"rowIsInherited(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n <span class=\"fge-prop-inherited\" *ngIf=\"rowIsInherited(element.key, definition.prop)\"\r\n matTooltip=\"Valore ereditato da 'Etichetta nel contenitore': modificalo qui per sovrascriverlo solo sul bordo\">\r\n ereditato\r\n </span>\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" *ngIf=\"rowHasMoreProperties(element.key)\"\r\n (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-inherited{margin-left:4px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;color:#00000080}.fge-prop-row.is-inherited .fge-value-input,.fge-prop-row.is-inherited .fge-select{color:#00000080;font-style:italic}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.TmwIconComponent, selector: "tmw-icon", inputs: ["name", "size", "ariaLabel", "variant", "strokeWidth"] }, { kind: "component", type: i6.TextFieldTemplateComponent, selector: "text-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i7.BooleanFieldTemplateComponent, selector: "boolean-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i8.DateFieldTemplateComponent, selector: "date-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i9.TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i10.NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i11.ListValueFieldTemplateComponent, selector: "list-value-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i12.AttachmentFieldTemplateComponent, selector: "attachment-field-template", inputs: ["onlyImages", "field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "onAttachmentsChange"] }, { kind: "component", type: i13.ImageFieldTemplateComponent, selector: "image-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageDraw"] }, { kind: "component", type: i14.ImageFieldSelectorTemplateComponent, selector: "image-field-selector-template", inputs: ["record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i15.LabelFieldTemplateComponent, selector: "label-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange"] }, { kind: "component", type: i16.ImageWithMarkersFieldTemplateComponent, selector: "image-with-markers-field-template", inputs: ["endPointConfiguration", "record", "formulaObject", "field", "inConfig", "styleVersion", "forceState"], outputs: ["recordChange", "imageMark"] }, { kind: "component", type: i17.ActionButtonFieldTemplateComponent, selector: "action-button-field-template", inputs: ["field", "record", "formulaObject", "inConfig", "styleVersion", "forceState"], outputs: ["fireTrigger", "recordChange"] }] });
|
|
721
809
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FieldGraphicsEditorComponent, decorators: [{
|
|
722
810
|
type: Component,
|
|
723
|
-
args: [{ selector: 'field-graphics-editor', template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"] }]
|
|
811
|
+
args: [{ selector: 'field-graphics-editor', template: "<div class=\"fge-root\">\r\n\r\n <!-- Intestazione -->\r\n <div class=\"fge-header\">\r\n <tmw-icon class=\"mat-icon fge-header-icon\" name=\"palette\"></tmw-icon>\r\n <div class=\"fge-header-texts\">\r\n <div class=\"fge-header-title\">Grafica dei campi selezionati</div>\r\n <div class=\"fge-header-subtitle\">\r\n {{ styleableFields.length }} campi modificabili\r\n <span *ngIf=\"changesCount > 0\"> · {{ changesCount }} modifiche in sospeso</span>\r\n </div>\r\n </div>\r\n <button mat-icon-button type=\"button\" class=\"fge-header-close\" (click)=\"cancel()\" matTooltip=\"Chiudi\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Nessuna tipologia gestibile -->\r\n <div class=\"fge-empty\" *ngIf=\"styleableFields.length === 0\">\r\n Nessuno dei campi selezionati ha una grafica configurabile.\r\n </div>\r\n\r\n <ng-container *ngIf=\"styleableFields.length > 0\">\r\n\r\n <!-- Schede: grafica valida per tutti / divisa per tipologia -->\r\n <div class=\"fge-tabs\">\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'globale'\"\r\n (click)=\"selectTab('globale')\">\r\n Grafica globale\r\n </button>\r\n <button type=\"button\" class=\"fge-tab\" [class.active]=\"activeTab === 'personalizzata'\"\r\n (click)=\"selectTab('personalizzata')\">\r\n Grafica personalizzata\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-body\">\r\n\r\n <!--#region COLONNA SINISTRA -->\r\n <div class=\"fge-left\">\r\n\r\n <!-- Intestazione scheda globale -->\r\n <ng-container *ngIf=\"activeTab === 'globale'\">\r\n <div class=\"fge-scope-note\">\r\n Le modifiche si applicano a <strong>tutti i {{ styleableFields.length }} campi\r\n selezionati</strong>, di qualsiasi tipologia. Gli elementi qui sotto sono quelli comuni:\r\n ogni tipologia li applica al proprio elemento corrispondente.\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Intestazione scheda per tipologia -->\r\n <ng-container *ngIf=\"activeTab === 'personalizzata'\">\r\n <div class=\"fge-type-tabs\" *ngIf=\"groups.length > 1\">\r\n <button type=\"button\" class=\"fge-type-tab\" *ngFor=\"let group of groups; let i = index\"\r\n [class.active]=\"i === activeGroupIndex\" (click)=\"selectGroup(i)\">\r\n {{ group.def.label }}\r\n <span class=\"fge-type-tab-badge\">{{ group.fields.length }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"fge-group-fields\" *ngIf=\"activeGroup as group\" [matTooltip]=\"groupFieldNames(group)\">\r\n <strong>{{ group.def.label }}</strong> · {{ groupFieldNames(group) }}\r\n </div>\r\n\r\n <div class=\"fge-warning\" *ngIf=\"activeGroup?.hasDifferences\">\r\n <tmw-icon class=\"mat-icon\" name=\"alert-triangle\"></tmw-icon>\r\n <span>\r\n I campi selezionati partono da grafiche diverse. Stai vedendo i valori reali di\r\n <strong>{{ sampleFieldLabel }}</strong> \u2014 cambia campo dall'anteprima per vedere i suoi.\r\n Verranno modificate solo le propriet\u00E0 che tocchi.\r\n </span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Stato su cui si sta lavorando -->\r\n <div class=\"fge-states\">\r\n <span class=\"fge-states-label\">Stato</span>\r\n <button type=\"button\" class=\"fge-state-chip\" *ngFor=\"let state of currentStates; trackBy: trackByKey\"\r\n [class.active]=\"currentSelectedState === state.key\" (click)=\"setCurrentState(state.key)\">\r\n {{ state.label }}\r\n </button>\r\n </div>\r\n\r\n <!-- Elementi grafici e relative propriet\u00E0 -->\r\n <div class=\"fge-elements\">\r\n <div class=\"fge-element\" *ngFor=\"let element of currentElements; trackBy: trackByKey\">\r\n\r\n <button type=\"button\" class=\"fge-element-header\" (click)=\"toggleCurrentElement(element.key)\">\r\n <tmw-icon class=\"mat-icon fge-element-caret\"\r\n [name]=\"currentOpenElement === element.key ? 'chevron-down' : 'chevron-right'\"></tmw-icon>\r\n <span class=\"fge-element-title\">{{ element.label }}</span>\r\n <span class=\"fge-element-missing\"\r\n *ngIf=\"activeTab === 'globale' && isGlobalElementMissingOnSample(element.key)\"\r\n matTooltip=\"Il campo mostrato in anteprima non ha questo elemento: la modifica vale comunque per gli altri campi\">\r\n non presente qui\r\n </span>\r\n <span class=\"fge-element-count\" *ngIf=\"rowCount(element.key) > 0\">\r\n {{ rowCount(element.key) }}\r\n </span>\r\n </button>\r\n\r\n <div class=\"fge-props\" *ngIf=\"currentOpenElement === element.key\">\r\n\r\n <div class=\"fge-prop-row\" *ngFor=\"let definition of rowProperties(element.key); trackBy: trackByProp\"\r\n [class.is-set]=\"rowIsSet(element.key, definition.prop)\"\r\n [class.is-inherited]=\"rowIsInherited(element.key, definition.prop)\">\r\n\r\n <div class=\"fge-prop-label\" [matTooltip]=\"definition.prop\">\r\n {{ definition.label }}\r\n <span class=\"fge-prop-inherited\" *ngIf=\"rowIsInherited(element.key, definition.prop)\"\r\n matTooltip=\"Valore ereditato da 'Etichetta nel contenitore': modificalo qui per sovrascriverlo solo sul bordo\">\r\n ereditato\r\n </span>\r\n </div>\r\n\r\n <div class=\"fge-prop-control\">\r\n\r\n <!-- Colore: pastiglia + opacit\u00E0 + valore testuale -->\r\n <ng-container *ngIf=\"definition.type === 'color'\">\r\n <input type=\"color\" class=\"fge-color-swatch\"\r\n [value]=\"colorHex(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorHex(element.key, definition.prop, $any($event.target).value)\"\r\n [title]=\"definition.prop\" />\r\n <input type=\"range\" class=\"fge-slider\" min=\"0\" max=\"100\" step=\"1\"\r\n [value]=\"colorAlpha(rowGet(element.key, definition.prop))\"\r\n (input)=\"rowSetColorAlpha(element.key, definition.prop, $any($event.target).value)\"\r\n matTooltip=\"Opacit\u00E0\" />\r\n <input type=\"text\" class=\"fge-value-input\" placeholder=\"non impostato\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Misura: slider + valore -->\r\n <ng-container *ngIf=\"definition.type === 'size'\">\r\n <input type=\"range\" class=\"fge-slider fge-slider-wide\" [min]=\"definition.min\"\r\n [max]=\"definition.max\" [step]=\"definition.step\"\r\n [value]=\"sizeNumber(rowGet(element.key, definition.prop), definition)\"\r\n (input)=\"rowSetSize(element.key, definition, $any($event.target).value)\" />\r\n <input type=\"text\" class=\"fge-value-input\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <!-- Elenco di valori -->\r\n <ng-container *ngIf=\"definition.type === 'select'\">\r\n <select class=\"fge-select\" [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\">\r\n <option value=\"\">non impostato</option>\r\n <option *ngFor=\"let opt of definition.options\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <!-- Testo libero -->\r\n <ng-container *ngIf=\"definition.type === 'text'\">\r\n <input type=\"text\" class=\"fge-value-input fge-value-input-wide\"\r\n [placeholder]=\"definition.placeholder || 'non impostato'\"\r\n [ngModel]=\"rowGet(element.key, definition.prop)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"rowSet(element.key, definition.prop, $event)\" />\r\n </ng-container>\r\n\r\n <button type=\"button\" class=\"fge-reset\"\r\n [disabled]=\"!rowIsSet(element.key, definition.prop)\"\r\n (click)=\"rowReset(element.key, definition.prop)\"\r\n matTooltip=\"Azzera questa propriet\u00E0\">\r\n <tmw-icon class=\"mat-icon\" name=\"x\"></tmw-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <button type=\"button\" class=\"fge-toggle-all\" *ngIf=\"rowHasMoreProperties(element.key)\"\r\n (click)=\"toggleCurrentShowAll()\">\r\n {{ currentShowAllProperties ? 'Mostra solo le propriet\u00E0 principali' : 'Altre propriet\u00E0...' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA SINISTRA -->\r\n\r\n <!--#region COLONNA DESTRA: anteprima live -->\r\n <div class=\"fge-right\">\r\n\r\n <div class=\"fge-preview-header\">\r\n <span class=\"fge-preview-title\">Anteprima</span>\r\n <select class=\"fge-sample-select\" *ngIf=\"currentSampleFields.length > 1\"\r\n [ngModel]=\"currentSampleIndex\" [ngModelOptions]=\"{ standalone: true }\"\r\n (ngModelChange)=\"changeCurrentSample($event)\">\r\n <option *ngFor=\"let f of currentSampleFields; let i = index\" [ngValue]=\"i\">\r\n {{ displayName(f) }}\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"fge-preview-state\">\r\n Stato mostrato: <strong>{{ currentSelectedState }}</strong> ·\r\n il campo scelto serve solo da esempio\r\n </div>\r\n\r\n <div class=\"fge-preview-canvas\" *ngIf=\"currentPreviewField\">\r\n <text-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </text-field-template>\r\n\r\n <textarea-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Area di testo']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </textarea-field-template>\r\n\r\n <numeric-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Campo numerico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </numeric-field-template>\r\n\r\n <boolean-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Booleano']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </boolean-field-template>\r\n\r\n <date-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Data e/o ora']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </date-field-template>\r\n\r\n <attachment-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Allegato']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </attachment-field-template>\r\n\r\n <label-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Etichetta']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </label-field-template>\r\n\r\n <list-value-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco generico']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </list-value-field-template>\r\n\r\n <image-field-selector-template *ngIf=\"currentPreviewType === FieldTypeEnum['Elenco immagini']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [styleVersion]=\"styleVersion\" [forceState]=\"currentSelectedState\">\r\n </image-field-selector-template>\r\n\r\n <action-button-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Bottone']\"\r\n [field]=\"currentPreviewField\" [record]=\"{}\" [inConfig]=\"true\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </action-button-field-template>\r\n\r\n <image-field-template *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-field-template>\r\n\r\n <image-with-markers-field-template\r\n *ngIf=\"currentPreviewType === FieldTypeEnum['Immagine con markers']\"\r\n [field]=\"currentPreviewField\" [record]=\"currentPreviewRecord\" [inConfig]=\"true\"\r\n [endPointConfiguration]=\"endPointConfiguration\" [styleVersion]=\"styleVersion\"\r\n [forceState]=\"currentSelectedState\">\r\n </image-with-markers-field-template>\r\n </div>\r\n </div>\r\n <!--#endregion COLONNA DESTRA -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Campi esclusi -->\r\n <div class=\"fge-unsupported\" *ngIf=\"unsupportedFields.length > 0\">\r\n Esclusi perch\u00E9 senza grafica configurabile: {{ unsupportedFields.length }} campi\r\n ({{ displayName(unsupportedFields[0]) }}<span\r\n *ngIf=\"unsupportedFields.length > 1\">, ...</span>)\r\n </div>\r\n\r\n <!-- Pulsanti -->\r\n <div class=\"fge-footer\">\r\n <button mat-raised-button type=\"button\" (click)=\"cancel()\">Annulla</button>\r\n <button mat-raised-button color=\"primary\" type=\"button\" [disabled]=\"!hasChanges\" (click)=\"apply()\">\r\n Applica ai campi selezionati\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%}.fge-root{display:flex;flex-direction:column;height:100%;background:#fff}.fge-header{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#17795e;color:#fff}.fge-header-icon{font-size:20px;width:20px;height:20px}.fge-header-texts{flex:1;min-width:0}.fge-header-title{font-size:15px;font-weight:600;line-height:1.2}.fge-header-subtitle{font-size:12px;opacity:.85}.fge-header-close{color:#fff}.fge-empty{padding:32px 16px;text-align:center;color:#0009}.fge-body{flex:1;display:flex;min-height:0}.fge-left{flex:1 1 55%;min-width:0;overflow-y:auto;padding:12px 16px 16px;border-right:1px solid rgba(0,0,0,.12)}.fge-type-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}.fge-type-tab{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border:1px solid rgba(0,0,0,.2);border-radius:16px;background:#fff;font-size:12px;cursor:pointer}.fge-type-tab.active{border-color:#17795e;background:#17795e;color:#fff}.fge-type-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:rgba(0,0,0,.12);font-size:11px}.fge-type-tab.active .fge-type-tab-badge{background:rgba(255,255,255,.28)}.fge-group-fields{font-size:12px;color:#000000a6;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-warning{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#fff6e0;border:1px solid #f0d18a;font-size:12px;line-height:1.35}.fge-states{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:6px;border-bottom:1px solid rgba(0,0,0,.08)}.fge-states-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:#00000080;margin-right:4px}.fge-state-chip{padding:4px 10px;border:1px solid rgba(0,0,0,.18);border-radius:14px;background:#fff;font-size:12px;cursor:pointer}.fge-state-chip.active{border-color:#1976d2;background:#e8f1fb;color:#10508f;font-weight:600}.fge-element{border-bottom:1px solid rgba(0,0,0,.07)}.fge-element-header{display:flex;align-items:center;gap:6px;width:100%;padding:9px 2px;border:none;background:none;text-align:left;cursor:pointer}.fge-element-caret{font-size:16px;width:16px;height:16px;color:#00000073}.fge-element-title{flex:1;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000009e}.fge-element-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#17795e;color:#fff;font-size:11px}.fge-props{padding:0 0 10px 22px}.fge-prop-row{display:flex;align-items:center;gap:10px;padding:3px 0}.fge-prop-label{flex:0 0 34%;max-width:34%;font-size:12.5px;color:#000000bf;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fge-prop-inherited{margin-left:4px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;color:#00000080}.fge-prop-row.is-inherited .fge-value-input,.fge-prop-row.is-inherited .fge-select{color:#00000080;font-style:italic}.fge-prop-row.is-set .fge-prop-label{font-weight:600;color:#000000de}.fge-prop-control{flex:1;display:flex;align-items:center;gap:8px;min-width:0}.fge-color-swatch{flex:0 0 auto;width:30px;height:26px;padding:0;border:1px solid rgba(0,0,0,.25);border-radius:4px;background:none;cursor:pointer}.fge-slider{flex:0 0 70px;max-width:70px;accent-color:#17795e;cursor:pointer}.fge-slider-wide{flex:0 0 100px;max-width:100px}.fge-value-input,.fge-select{flex:1;min-width:0;height:26px;padding:0 8px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;background:#fbfbfb}.fge-value-input:focus,.fge-select:focus{outline:none;border-color:#1976d2;background:#fff}.fge-select{font-family:inherit;font-size:12px;cursor:pointer}.fge-reset{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;border:none;border-radius:4px;background:none;color:#00000073;cursor:pointer}.fge-reset:hover:not(:disabled){background:rgba(0,0,0,.07);color:#c62828}.fge-reset:disabled{opacity:.25;cursor:default}.fge-reset .mat-icon{font-size:14px;width:14px;height:14px}.fge-toggle-all{margin-top:6px;padding:0;border:none;background:none;color:#1976d2;font-size:12px;cursor:pointer}.fge-toggle-all:hover{text-decoration:underline}.fge-right{flex:1 1 45%;min-width:0;display:flex;flex-direction:column;padding:12px 16px 16px;background:#f7f8f9;overflow-y:auto}.fge-preview-header{display:flex;align-items:center;gap:10px;margin-bottom:4px}.fge-preview-title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#0000008c}.fge-sample-select{flex:1;min-width:0;height:26px;padding:0 6px;border:1px solid rgba(0,0,0,.2);border-radius:4px;font-size:12px;background:#fff}.fge-preview-state{font-size:12px;color:#0000008c;margin-bottom:10px}.fge-preview-canvas{flex:1;padding:20px 16px;border:1px dashed rgba(0,0,0,.18);border-radius:8px;background:#fff;overflow:auto}.fge-unsupported{padding:6px 16px;font-size:12px;color:#0000008c;border-top:1px solid rgba(0,0,0,.08)}.fge-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px;border-top:1px solid rgba(0,0,0,.12);background:#fafafa}@media (max-width: 900px){.fge-body{flex-direction:column}.fge-left{border-right:none;border-bottom:1px solid rgba(0,0,0,.12)}.fge-prop-label{flex-basis:42%;max-width:42%}}.fge-tabs{display:flex;gap:4px;padding:8px 16px 0;border-bottom:1px solid rgba(0,0,0,.12);background:#fff}.fge-tab{padding:8px 16px;border:none;border-bottom:3px solid transparent;background:none;font-size:13px;font-weight:600;color:#0000008c;cursor:pointer}.fge-tab:hover{color:#000c}.fge-tab.active{color:#17795e;border-bottom-color:#17795e}.fge-scope-note{padding:8px 10px;margin-bottom:10px;border-radius:6px;background:#eef8f4;border:1px solid #bfe0d6;font-size:12px;line-height:1.4}.fge-element-missing{margin-right:6px;padding:1px 6px;border-radius:8px;background:rgba(0,0,0,.07);font-size:10px;font-weight:500;text-transform:none;letter-spacing:0;color:#00000080}\n"] }]
|
|
724
812
|
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; }, propDecorators: { fields: [{
|
|
725
813
|
type: Input
|
|
726
814
|
}], endPointConfiguration: [{
|
|
@@ -732,4 +820,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
732
820
|
}], cancelEvent: [{
|
|
733
821
|
type: Output
|
|
734
822
|
}] } });
|
|
735
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFhLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsSSxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0YsT0FBTyxFQUFhLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFLckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RyxPQUFPLEVBQ0gseUJBQXlCLEVBRXpCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ3BCLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNILGtCQUFrQixFQUNsQixtQkFBbUIsRUFH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LENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztpQkFBRTtnQkFDdkYsTUFBTTthQUNUO1lBQ0Q7Z0JBQ0ksTUFBTTtTQUNiO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBSSxHQUFNO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pELElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRTtnQkFBRSxPQUFPLFNBQVMsQ0FBQzthQUFFO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFBRSxPQUFPLFNBQVMsQ0FBQztpQkFBRTtnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzswSEF4dUJRLDRCQUE0Qjs4R0FBNUIsNEJBQTRCLDhPQy9EekMsaThqQkEwUkE7NEZEM05hLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDSSx1QkFBdUI7eUdBT3hCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQmFzZUZpZWxkLCBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWVsZCwgQXZhaWxhYmxlRmlsZUV4dGVuc2lvbnMsIEF2YWlsYWJsZUltYWdlRXh0ZW5zaW9ucyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYXR0YWNobWVudEZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgQm9vbGVhbkZpZWxkLCBCb29sUHJlc2VudGFudGlvRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvYm9vbGVhbkZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0ZUZpZWxkLCBEYXRlVGltZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9kYXRlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbWFnZVNlbGVjdG9yRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlU2VsZWN0b3JGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IExhYmVsRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2xhYmVsRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBFbmRQb2ludENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW5kUG9pbnRDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgYnVpbGRDc3NDb2xvciwgY3NzQ29sb3JUb0FscGhhUGVyY2VudCwgY3NzQ29sb3JUb0hleCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Nzcy1jb2xvcic7XHJcbmltcG9ydCB7IGdldENzc0RlY2xhcmF0aW9uLCBwYXJzZUNzc0RlY2xhcmF0aW9ucywgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHtcclxuICAgIGJ1aWxkQ3VzdG9tQ3NzUHJvcGVydHlEZWYsXHJcbiAgICBDc3NQcm9wZXJ0eURlZixcclxuICAgIENTU19BTExfUFJPUEVSVElFUyxcclxuICAgIENTU19DT1JFX1BST1BFUlRJRVMsXHJcbiAgICBnZXRDc3NQcm9wZXJ0eURlZixcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtcHJvcGVydHktY2F0YWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgICBjbG9uZUZpZWxkU3R5bGVNYXAsXHJcbiAgICBlbnN1cmVGaWVsZFN0eWxlTWFwLFxyXG4gICAgRmllbGRTdHlsZUVudHJ5RGVmLFxyXG4gICAgRmllbGRTdHlsZVR5cGVEZWYsXHJcbiAgICBnZXRDb21tb25TdGF0ZXMsXHJcbiAgICBnZXRGaWVsZFN0eWxlRWxlbWVudHMsXHJcbiAgICBnZXRGaWVsZFN0eWxlVHlwZURlZixcclxuICAgIGdldEZpZWxkRGlzcGxheU5hbWUsXHJcbiAgICBnZXRFZmZlY3RpdmVTdHlsZU1hcCxcclxuICAgIGxlZ2FjeVRhcmdldEtleSxcclxuICAgIG1lcmdlTGVnYWN5U3R5bGVzSW50b01hcCxcclxuICAgIEdMT0JBTF9TVFlMRV9FTEVNRU5UUyxcclxuICAgIEdsb2JhbFN0eWxlRWxlbWVudERlZixcclxuICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyxcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9maWVsZC1zdHlsZS1jYXRhbG9nJztcclxuXHJcbi8qKiBVbiBncnVwcG8gcmFjY29nbGllIHR1dHRpIGkgY2FtcGkgc2VsZXppb25hdGkgY2hlIGNvbmRpdmlkb25vIGxhIHN0ZXNzYSB0aXBvbG9naWEgKi9cclxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFN0eWxlR3JvdXAge1xyXG4gICAgZGVmOiBGaWVsZFN0eWxlVHlwZURlZjtcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPjtcclxuICAgIGVsZW1lbnRzOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXBwYSBtb3N0cmF0YSBhIHZpZGVvOiBwYXJ0ZSBzZW1wcmUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIHNjZWx0byBjb21lIGNhbXBpb25lLFxyXG4gICAgICogY29uIHNvcHJhIGxlIG1vZGlmaWNoZSBhbmNvcmEgbm9uIGFwcGxpY2F0ZS4gVmEgcmljb3N0cnVpdGEgcXVhbmRvIGNhbWJpYSBpbCBjYW1waW9uZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgICAvKiogTW9kaWZpY2hlIGluIHNvc3Blc28sIGluZGljaXp6YXRlIHBlciBcIkVsZW1lbnRvU3RhdG98cHJvcHJpZXTDoFwiICovXHJcbiAgICBvdmVycmlkZXM6IHsgW2VudHJ5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICAgIC8qKiBUcnVlIHNlIGkgY2FtcGkgZGVsIGdydXBwbyBwYXJ0b25vIGRhIGdyYWZpY2hlIGRpdmVyc2UgZnJhIGxvcm8gKi9cclxuICAgIGhhc0RpZmZlcmVuY2VzOiBib29sZWFuO1xyXG4gICAgc2FtcGxlSW5kZXg6IG51bWJlcjtcclxuICAgIHNlbGVjdGVkU3RhdGU6IHN0cmluZztcclxuICAgIG9wZW5FbGVtZW50OiBzdHJpbmc7XHJcbiAgICBzaG93QWxsUHJvcGVydGllczogYm9vbGVhbjtcclxuICAgIHByZXZpZXdGaWVsZDogYW55O1xyXG4gICAgcHJldmlld1JlY29yZDogYW55O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZmllbGQtZ3JhcGhpY3MtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWVsZC1ncmFwaGljcy1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWVsZEdyYXBoaWNzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSBkZWwgY29uZmlndXJhdG9yZSAqL1xyXG4gICAgQElucHV0KCkgZmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICAgIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG5cclxuICAgIC8qKiBFbWVzc28gZG9wbyBhdmVyIHNjcml0dG8gbGUgbW9kaWZpY2hlIHN1aSBjYW1waSAqL1xyXG4gICAgQE91dHB1dCgpIGFwcGx5RXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBjYW5jZWxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG4gICAgZGlzcGxheU5hbWUgPSBnZXRGaWVsZERpc3BsYXlOYW1lO1xyXG5cclxuICAgIC8qKiBTY2hlZGEgYXR0aXZhOiBncmFmaWNhIHZhbGlkYSBwZXIgdHV0dGkgaSBjYW1waSwgb3BwdXJlIGRpdmlzYSBwZXIgdGlwb2xvZ2lhICovXHJcbiAgICBhY3RpdmVUYWI6ICdnbG9iYWxlJyB8ICdwZXJzb25hbGl6emF0YScgPSAnZ2xvYmFsZSc7XHJcblxyXG4gICAgZ3JvdXBzOiBBcnJheTxGaWVsZFN0eWxlR3JvdXA+ID0gW107XHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgY29uIHVuYSBncmFmaWNhIGNvbmZpZ3VyYWJpbGUgKGVzY2x1c2kgTG9va3VwIGUgRm9ybSBkaSBkZXR0YWdsaW8pICovXHJcbiAgICBzdHlsZWFibGVGaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4gPSBbXTtcclxuICAgIHVuc3VwcG9ydGVkRmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBhY3RpdmVHcm91cEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vI3JlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIGdsb2JhbEVsZW1lbnRzOiBBcnJheTxHbG9iYWxTdHlsZUVsZW1lbnREZWY+ID0gW107XHJcbiAgICBnbG9iYWxTdGF0ZXM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXTtcclxuICAgIGdsb2JhbFNlbGVjdGVkU3RhdGU6IHN0cmluZyA9ICdOb3JtYWxlJztcclxuICAgIGdsb2JhbE9wZW5FbGVtZW50OiBzdHJpbmcgPSAnJztcclxuICAgIGdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBnbG9iYWxTYW1wbGVJbmRleDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBNb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvLCBpbmRpY2l6emF0ZSBwZXIgXCJFbGVtZW50b0xvZ2ljb3xTdGF0b3xwcm9wcmlldMOgXCIgKi9cclxuICAgIGdsb2JhbE92ZXJyaWRlczogeyBbZW50cnk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBnbG9iYWxQcmV2aWV3RmllbGQ6IGFueSA9IG51bGw7XHJcbiAgICBnbG9iYWxQcmV2aWV3UmVjb3JkOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIC8qKiBJbmNyZW1lbnRhdG8gYWQgb2duaSBtb2RpZmljYSBwZXIgZm9yemFyZSBpbCByaWNhbGNvbG8gZGVnbGkgc3RpbGkgbmVsbGUgYW50ZXByaW1lICovXHJcbiAgICBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbml6aW9uaSBjcmVhdGUgYWwgdm9sbyBwZXIgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIGEgbWFubyBlIGZ1b3JpIGNhdGFsb2dvLlxyXG4gICAgICogVmFubm8gbWVtb3JpenphdGU6IHByb3BlcnRpZXNGb3IoKSB2aWVuZSByaWNoaWFtYXRhIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgICogZSByaWNyZWFyZSBnbGkgb2dnZXR0aSBmYXJlYmJlIHJpY29zdHJ1aXJlIGxlIHJpZ2hlLCBmYWNlbmRvIHBlcmRlcmUgaWwgZnVvY28gbWVudHJlIHNpIHNjcml2ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0eURlZnM6IHsgW3Byb3A6IHN0cmluZ106IENzc1Byb3BlcnR5RGVmIH0gPSB7fTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYnVpbGRHcm91cHMoKTtcclxuICAgICAgICB0aGlzLmJ1aWxkR2xvYmFsVGFiKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIENvc3RydXppb25lXHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3R5bGVhYmxlRmllbGRzID0gW107XHJcbiAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgICAodGhpcy5maWVsZHMgPz8gW10pLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgICAgICAgICBpZiAoIWRlZikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMucHVzaChmaWVsZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5maW5kKChnKSA9PiBOdW1iZXIoZy5kZWYuZmllbGRUeXBlKSA9PT0gTnVtYmVyKGRlZi5maWVsZFR5cGUpKTtcclxuICAgICAgICAgICAgaWYgKCFncm91cCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZCksXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVNYXA6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzRGlmZmVyZW5jZXM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RhdGU6IGRlZi5zdGF0ZXNbMF0/LmtleSA/PyAnTm9ybWFsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlbkVsZW1lbnQ6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZClbMF0/LmtleSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzaG93QWxsUHJvcGVydGllczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld0ZpZWxkOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdSZWNvcmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gSlNPTi5zdHJpbmdpZnkoY2xvbmVGaWVsZFN0eWxlTWFwKGdyb3VwLmZpZWxkc1swXSkpO1xyXG4gICAgICAgICAgICBncm91cC5oYXNEaWZmZXJlbmNlcyA9IGdyb3VwLmZpZWxkcy5zb21lKChmKSA9PiBKU09OLnN0cmluZ2lmeShjbG9uZUZpZWxkU3R5bGVNYXAoZikpICE9PSByZWZlcmVuY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRHcm91cChncm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlR3JvdXBJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdsb2JhbFRhYigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMuc3R5bGVhYmxlRmllbGRzLm1hcCgoZikgPT4gZi5GaWVsZFR5cGUpO1xyXG5cclxuICAgICAgICB0aGlzLmdsb2JhbEVsZW1lbnRzID0gR0xPQkFMX1NUWUxFX0VMRU1FTlRTLmZpbHRlcigoZykgPT5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMuc29tZSgoZikgPT4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGYsIGcua2V5KS5sZW5ndGggPiAwKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTdGF0ZXMgPSBnZXRDb21tb25TdGF0ZXModHlwZXMpO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZSA9IHRoaXMuZ2xvYmFsU3RhdGVzWzBdPy5rZXkgPz8gJ05vcm1hbGUnO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPSB0aGlzLmdsb2JhbEVsZW1lbnRzWzBdPy5rZXkgPz8gJyc7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMucmVidWlsZEdsb2JhbFByZXZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQ29zdHJ1emlvbmVcclxuXHJcbiAgICAvLyNyZWdpb24gU2NoZWRhIFwiR3JhZmljYSBwZXJzb25hbGl6emF0YVwiXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaWNvc3RydWlzY2UgbGEgbWFwcGEgbW9zdHJhdGEgcGVyIHVuIGdydXBwbzogcGFydGUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIGNhbXBpb25lXHJcbiAgICAgKiDigJQgY29zw6wgdW5hIGdyYWZpY2EgaW1wb3N0YXRhIGZ1b3JpIGRhIHF1ZXN0byBlZGl0b3IgdmllbmUgc2VtcHJlIHJpcG9ydGF0YSDigJQsIHBvaSBhcHBsaWNhXHJcbiAgICAgKiBsZSBtb2RpZmljaGUgZ2xvYmFsaSBlIGluZmluZSBxdWVsbGUgc3BlY2lmaWNoZSBkZWxsYSB0aXBvbG9naWEuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVidWlsZEdyb3VwKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSBncm91cC5maWVsZHNbZ3JvdXAuc2FtcGxlSW5kZXhdID8/IGdyb3VwLmZpZWxkc1swXTtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy8gTGEgYmFzZSBjb21wcmVuZGUgaWwgQ1NTIGxlZ2FjeSBhc3NvcmJpdG8sIGFsdHJpbWVudGkgbCdlZGl0b3IgbW9zdHJlcmViYmVcclxuICAgICAgICAvLyBcIm5vbiBpbXBvc3RhdG9cIiBzdSBwcm9wcmlldMOgIGNoZSBhIHZpZGVvIHNpIHZlZG9ubyBlY2NvbWUgKGFwcGxpY2F0ZSBpbmxpbmUpXHJcbiAgICAgICAgZ3JvdXAuc3R5bGVNYXAgPSBnZXRFZmZlY3RpdmVTdHlsZU1hcChzYW1wbGUpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlHbG9iYWxPdmVycmlkZXNUb01hcChzYW1wbGUsIGdyb3VwLnN0eWxlTWFwKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAub3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgdGhpcy53cml0ZUludG9NYXAoZ3JvdXAuc3R5bGVNYXAsIGtleSwgcHJvcCwgZ3JvdXAub3ZlcnJpZGVzW2VudHJ5XSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVpbGRQcmV2aWV3KGdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUmljcmVhIGlsIGNhbXBvIGZpdHRpemlvIHVzYXRvIGRhbGwnYW50ZXByaW1hLCBhZ2dhbmNpYW5kb2dsaSBsYSBtYXBwYSBtb3N0cmF0YSAqL1xyXG4gICAgcHJpdmF0ZSBidWlsZFByZXZpZXcoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdyb3VwLmZpZWxkc1tncm91cC5zYW1wbGVJbmRleF0gPz8gZ3JvdXAuZmllbGRzWzBdO1xyXG4gICAgICAgIGlmICghc291cmNlKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuYnVpbGRQcmV2aWV3RmllbGQoc291cmNlLCBncm91cC5zdHlsZU1hcCk7XHJcblxyXG4gICAgICAgIGdyb3VwLmVsZW1lbnRzID0gZ2V0RmllbGRTdHlsZUVsZW1lbnRzKGNsb25lKTtcclxuICAgICAgICBpZiAoIWdyb3VwLmVsZW1lbnRzLnNvbWUoKGUpID0+IGUua2V5ID09PSBncm91cC5vcGVuRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgZ3JvdXAub3BlbkVsZW1lbnQgPSBncm91cC5lbGVtZW50c1swXT8ua2V5ID8/ICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ3JvdXAucHJldmlld0ZpZWxkID0gY2xvbmU7XHJcbiAgICAgICAgZ3JvdXAucHJldmlld1JlY29yZCA9IHsgW2Nsb25lLk5hbWVdOiB0aGlzLmdldFByZXZpZXdJbml0aWFsVmFsdWUoY2xvbmUpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYWN0aXZlR3JvdXAoKTogRmllbGRTdHlsZUdyb3VwIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RoaXMuYWN0aXZlR3JvdXBJbmRleF0gPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RHcm91cChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVHcm91cEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RTdGF0ZShncm91cDogRmllbGRTdHlsZUdyb3VwLCBzdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ3JvdXAuc2VsZWN0ZWRTdGF0ZSA9IHN0YXRlS2V5O1xyXG4gICAgICAgIHRoaXMuc3R5bGVWZXJzaW9uKys7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRWxlbWVudChncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBncm91cC5vcGVuRWxlbWVudCA9IGdyb3VwLm9wZW5FbGVtZW50ID09PSBlbGVtZW50S2V5ID8gJycgOiBlbGVtZW50S2V5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDYW1iaWFuZG8gY2FtcGlvbmUgc2kgcmlsZWdnb25vIGkgc3VvaSBzdGlsaSByZWFsaSwgbWFudGVuZW5kbyBsZSBtb2RpZmljaGUgaW4gc29zcGVzbyAqL1xyXG4gICAgY2hhbmdlU2FtcGxlKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBncm91cC5zYW1wbGVJbmRleCA9IE51bWJlcihpbmRleCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkR3JvdXAoZ3JvdXApO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwRmllbGROYW1lcyhncm91cDogRmllbGRTdHlsZUdyb3VwKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gZ3JvdXAuZmllbGRzLm1hcCgoZikgPT4gZ2V0RmllbGREaXNwbGF5TmFtZShmKSkuam9pbignLCAnKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2FtcGxlRmllbGRMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLmFjdGl2ZUdyb3VwO1xyXG4gICAgICAgIGlmICghZykgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICBjb25zdCBmID0gZy5maWVsZHNbZy5zYW1wbGVJbmRleF0gPz8gZy5maWVsZHNbMF07XHJcbiAgICAgICAgcmV0dXJuIGYgPyBnZXRGaWVsZERpc3BsYXlOYW1lKGYpIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgcGVyc29uYWxpenphdGFcIlxyXG5cclxuICAgIC8vI3JlZ2lvbiBTY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIHNlbGVjdFRhYih0YWI6ICdnbG9iYWxlJyB8ICdwZXJzb25hbGl6emF0YScpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcclxuICAgICAgICAvLyBQYXNzYW5kbyBhbGxhIHNjaGVkYSBwZXIgdGlwb2xvZ2lhIGkgdmFsb3JpIGRldm9ubyBnacOgIGluY2x1ZGVyZSBsZSBtb2RpZmljaGUgZ2xvYmFsaVxyXG4gICAgICAgIGlmICh0YWIgPT09ICdwZXJzb25hbGl6emF0YScpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZykgPT4gdGhpcy5yZWJ1aWxkR3JvdXAoZykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVidWlsZEdsb2JhbFByZXZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RHbG9iYWxTdGF0ZShzdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlID0gc3RhdGVLZXk7XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVHbG9iYWxFbGVtZW50KGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPSB0aGlzLmdsb2JhbE9wZW5FbGVtZW50ID09PSBlbGVtZW50S2V5ID8gJycgOiBlbGVtZW50S2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUdsb2JhbFNhbXBsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA9IE51bWJlcihpbmRleCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkR2xvYmFsUHJldmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnbG9iYWxTYW1wbGVGaWVsZCgpOiBCYXNlRmllbGQgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZWFibGVGaWVsZHNbdGhpcy5nbG9iYWxTYW1wbGVJbmRleF0gPz8gdGhpcy5zdHlsZWFibGVGaWVsZHNbMF0gPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVHJ1ZSBzZSBsJ2VsZW1lbnRvIGxvZ2ljbyBub24gZXNpc3RlIHN1bCBjYW1wbyBhdHR1YWxtZW50ZSBpbiBhbnRlcHJpbWEgKi9cclxuICAgIGlzR2xvYmFsRWxlbWVudE1pc3NpbmdPblNhbXBsZShlbGVtZW50S2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmdsb2JhbFNhbXBsZUZpZWxkO1xyXG4gICAgICAgIGlmICghc2FtcGxlKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlR2xvYmFsRWxlbWVudEtleXMoc2FtcGxlLCBlbGVtZW50S2V5KS5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWJ1aWxkR2xvYmFsUHJldmlldygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSB0aGlzLmdsb2JhbFNhbXBsZUZpZWxkO1xyXG4gICAgICAgIGlmICghc2FtcGxlKSB7IHRoaXMuZ2xvYmFsUHJldmlld0ZpZWxkID0gbnVsbDsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1hcCA9IGdldEVmZmVjdGl2ZVN0eWxlTWFwKHNhbXBsZSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKHNhbXBsZSwgbWFwKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmJ1aWxkUHJldmlld0ZpZWxkKHNhbXBsZSwgbWFwKTtcclxuICAgICAgICB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA9IGNsb25lO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsUHJldmlld1JlY29yZCA9IHsgW2Nsb25lLk5hbWVdOiB0aGlzLmdldFByZXZpZXdJbml0aWFsVmFsdWUoY2xvbmUpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICAvKiogUml2ZXJzYSBsZSBtb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvIHN1IHVuYSBtYXBwYSBzdGlsaSwgcmlzb2x0ZSBwZXIgcXVlbCBjYW1wbyAqL1xyXG4gICAgcHJpdmF0ZSBhcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKGZpZWxkOiBCYXNlRmllbGQsIG1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHR5cGVEZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgICAgICBpZiAoIXR5cGVEZWYpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGVudHJ5LnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGZpZWxkLCBnbG9iYWxLZXkpLmZvckVhY2goKHJlYWxLZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKG1hcCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTdHlsZUtleXNGb3JTYW1wbGUoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gW107IH1cclxuICAgICAgICByZXR1cm4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkubWFwKChrKSA9PiBrICsgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsb3JlIG1vc3RyYXRvIHBlciB1bmEgcHJvcHJpZXTDoCBnbG9iYWxlOiBxdWVsbG8gcmVhbGUgZGVsIGNhbXBpb25lIHBpw7kgbGUgbW9kaWZpY2hlICovXHJcbiAgICBnZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IGAke2VsZW1lbnRLZXl9fCR7dGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlfXwke3Byb3AudG9Mb3dlckNhc2UoKX1gO1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5nbG9iYWxPdmVycmlkZXMsIGVudHJ5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxPdmVycmlkZXNbZW50cnldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5cyA9IHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhzYW1wbGUsIGVsZW1lbnRLZXkpO1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3QgbWFwID0gZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKTtcclxuICAgICAgICByZXR1cm4gZ2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleXNbMF0gKyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVdID8/ICcnLCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZW50cnkgPSBgJHtlbGVtZW50S2V5fXwke3RoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZX18JHtwcm9wLnRvTG93ZXJDYXNlKCl9YDtcclxuICAgICAgICB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0gPSAodmFsdWUgPz8gJycpLnRyaW0oKTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRHbG9iYWxQcmV2aWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRHbG9iYWxQcm9wZXJ0eShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNHbG9iYWxQcm9wZXJ0eVNldChlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUHJvcHJpZXTDoCBtb3N0cmF0ZSBuZWxsYSBzY2hlZGEgZ2xvYmFsZSBwZXIgdW4gZWxlbWVudG8gbG9naWNvICovXHJcbiAgICBnbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXk6IHN0cmluZyk6IEFycmF5PENzc1Byb3BlcnR5RGVmPiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDc3NQcm9wZXJ0eURlZj4gPSB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgID8gQ1NTX0FMTF9QUk9QRVJUSUVTLnNsaWNlKClcclxuICAgICAgICAgICAgOiBDU1NfQ09SRV9QUk9QRVJUSUVTLnNsaWNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZ2xvYmFsU2FtcGxlRmllbGQ7XHJcbiAgICAgICAgY29uc3QgdmFsb3JpemVkOiBBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgICAgIGlmIChzYW1wbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKTtcclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkuZm9yRWFjaCgocmVhbEtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VDc3NEZWNsYXJhdGlvbnMobWFwW3JlYWxLZXkgKyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVdID8/ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChkKSA9PiB7IGlmICghdmFsb3JpemVkLmluY2x1ZGVzKGQucHJvcCkpIHsgdmFsb3JpemVkLnB1c2goZC5wcm9wKTsgfSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzICYmIHBhcnRzWzBdID09PSBlbGVtZW50S2V5ICYmIHBhcnRzWzFdID09PSB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVcclxuICAgICAgICAgICAgICAgICYmIHRoaXMuZ2xvYmFsT3ZlcnJpZGVzW2VudHJ5XSAmJiAhdmFsb3JpemVkLmluY2x1ZGVzKHBhcnRzWzJdKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JpemVkLnB1c2gocGFydHNbMl0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHVzaFZhbG9yaXplZChyZXN1bHQsIHZhbG9yaXplZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTZXRQcm9wZXJ0aWVzQ291bnQoZWxlbWVudEtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHRoaXMuaXNHbG9iYWxQcm9wZXJ0eVNldChlbGVtZW50S2V5LCBwLnByb3ApKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgZ2xvYmFsZVwiXHJcblxyXG4gICAgLy8jcmVnaW9uIExldHR1cmEvc2NyaXR0dXJhIHByb3ByaWV0w6AgcGVyIHRpcG9sb2dpYVxyXG5cclxuICAgIC8qKiBDaGlhdmUgZGVsbGEgbWFwcGEgc3RpbGk6IFwiRWxlbWVudG9cIiArIFwiU3RhdG9cIiAoZXMuIElucHV0Rm9jdXNlZCkgKi9cclxuICAgIHN0eWxlS2V5KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRLZXkgKyBncm91cC5zZWxlY3RlZFN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcHJpZXTDoCBtb3N0cmF0ZSBwZXIgdW4gZWxlbWVudG86IHF1ZWxsZSBkaSBiYXNlLCBwacO5IHF1ZWxsZSBnacOgIHZhbG9yaXp6YXRlXHJcbiAgICAgKiAoYW5jaGUgc2Ugc2NyaXR0ZSBhIG1hbm8gZSBmdW9yaSBjYXRhbG9nbyksIHBpw7kgdHV0dGUgbGUgYWx0cmUgc2UgcmljaGllc3RvLlxyXG4gICAgICovXHJcbiAgICBwcm9wZXJ0aWVzRm9yKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IEFycmF5PENzc1Byb3BlcnR5RGVmPiB7XHJcbiAgICAgICAgY29uc3QgY3NzID0gZ3JvdXAuc3R5bGVNYXBbdGhpcy5zdHlsZUtleShncm91cCwgZWxlbWVudEtleSldID8/ICcnO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q3NzUHJvcGVydHlEZWY+ID0gZ3JvdXAuc2hvd0FsbFByb3BlcnRpZXNcclxuICAgICAgICAgICAgPyBDU1NfQUxMX1BST1BFUlRJRVMuc2xpY2UoKVxyXG4gICAgICAgICAgICA6IENTU19DT1JFX1BST1BFUlRJRVMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wdXNoVmFsb3JpemVkKHJlc3VsdCwgcGFyc2VDc3NEZWNsYXJhdGlvbnMoY3NzKS5tYXAoKGQpID0+IGQucHJvcCkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwdXNoVmFsb3JpemVkKHJlc3VsdDogQXJyYXk8Q3NzUHJvcGVydHlEZWY+LCB2YWxvcml6ZWQ6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICB2YWxvcml6ZWQuZm9yRWFjaCgocHJvcCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnNvbWUoKHApID0+IHAucHJvcCA9PT0gcHJvcCkpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXRhbG9ndWVkID0gZ2V0Q3NzUHJvcGVydHlEZWYocHJvcCk7XHJcbiAgICAgICAgICAgIGlmIChjYXRhbG9ndWVkKSB7IHJlc3VsdC5wdXNoKGNhdGFsb2d1ZWQpOyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jdXN0b21Qcm9wZXJ0eURlZnNbcHJvcF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tUHJvcGVydHlEZWZzW3Byb3BdID0gYnVpbGRDdXN0b21Dc3NQcm9wZXJ0eURlZihwcm9wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmN1c3RvbVByb3BlcnR5RGVmc1twcm9wXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvcGVydGllc0NvdW50KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlQ3NzRGVjbGFyYXRpb25zKGdyb3VwLnN0eWxlTWFwW3RoaXMuc3R5bGVLZXkoZ3JvdXAsIGVsZW1lbnRLZXkpXSA/PyAnJykubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByb3BlcnR5VmFsdWUoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBnZXRDc3NEZWNsYXJhdGlvbihncm91cC5zdHlsZU1hcFt0aGlzLnN0eWxlS2V5KGdyb3VwLCBlbGVtZW50S2V5KV0gPz8gJycsIHByb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFByb3BlcnR5VmFsdWUoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0eWxlS2V5KGdyb3VwLCBlbGVtZW50S2V5KTtcclxuICAgICAgICBjb25zdCBjbGVhbiA9ICh2YWx1ZSA/PyAnJykudHJpbSgpO1xyXG5cclxuICAgICAgICB0aGlzLndyaXRlSW50b01hcChncm91cC5zdHlsZU1hcCwga2V5LCBwcm9wLCBjbGVhbik7XHJcbiAgICAgICAgZ3JvdXAub3ZlcnJpZGVzW2Ake2tleX18JHtwcm9wLnRvTG93ZXJDYXNlKCl9YF0gPSBjbGVhbjtcclxuICAgICAgICB0aGlzLnN0eWxlVmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UHJvcGVydHkoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoZ3JvdXAsIGVsZW1lbnRLZXksIHByb3AsICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Byb3BlcnR5U2V0KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGdyb3VwLCBlbGVtZW50S2V5LCBwcm9wKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gTGV0dHVyYS9zY3JpdHR1cmEgcHJvcHJpZXTDoCBwZXIgdGlwb2xvZ2lhXHJcblxyXG4gICAgLy8jcmVnaW9uIENvbnRyb2xsaSBjb2xvcmUgZSBtaXN1cmFcclxuXHJcbiAgICBjb2xvckhleCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGNzc0NvbG9yVG9IZXgodmFsdWUpOyB9XHJcbiAgICBjb2xvckFscGhhKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgeyByZXR1cm4gY3NzQ29sb3JUb0FscGhhUGVyY2VudCh2YWx1ZSk7IH1cclxuICAgIGJ1aWxkQ29sb3IoaGV4OiBzdHJpbmcsIGFscGhhOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gYnVpbGRDc3NDb2xvcihoZXgsIE51bWJlcihhbHBoYSkpOyB9XHJcblxyXG4gICAgLyoqIFBhcnRlIG51bWVyaWNhIGRpIHVuYSBtaXN1cmEgKFwiMTRweFwiIC0+IDE0KTsgaWwgbWluaW1vIGRlbCBjYXRhbG9nbyBzZSBub24gaW1wb3N0YXRhICovXHJcbiAgICBzaXplTnVtYmVyKHZhbHVlOiBzdHJpbmcsIGRlZmluaXRpb246IENzc1Byb3BlcnR5RGVmKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlKTtcclxuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgeyByZXR1cm4gZGVmaW5pdGlvbi5taW4gPz8gMDsgfVxyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRTaXplKGRlZmluaXRpb246IENzc1Byb3BlcnR5RGVmLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKHZhbHVlKTtcclxuICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09IG51bGwgfHwgaXNOYU4obnVtZXJpYykpIHsgcmV0dXJuICcnOyB9XHJcbiAgICAgICAgcmV0dXJuIGAke251bWVyaWN9JHtkZWZpbml0aW9uLnVuaXQgPz8gJyd9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQ29udHJvbGxpIGNvbG9yZSBlIG1pc3VyYVxyXG5cclxuICAgIC8vI3JlZ2lvbiBBcHBsaWNhemlvbmVcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpdmVyc2Egc3VpIGNhbXBpIHNlbGV6aW9uYXRpIHNvbHRhbnRvIGxlIHByb3ByaWV0w6AgZWZmZXR0aXZhbWVudGUgdG9jY2F0ZTogcHJpbWEgcXVlbGxlXHJcbiAgICAgKiBnbG9iYWxpLCBwb2kgcXVlbGxlIGRlbGxhIHNpbmdvbGEgdGlwb2xvZ2lhLCBjaGUgcXVpbmRpIGhhbm5vIGxhIHByZWNlZGVuemEuIFR1dHRlIGxlIGFsdHJlXHJcbiAgICAgKiByZWdvbGUgZ2nDoCBwcmVzZW50aSBzdWkgc2luZ29saSBjYW1waSByZXN0YW5vIGludGF0dGUuXHJcbiAgICAgKi9cclxuICAgIGFwcGx5KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSB0aGlzLmNvbGxlY3RXcml0ZVRhcmdldHMoKTtcclxuICAgICAgICB0aGlzLmFic29yYkxlZ2FjeVdoZXJlTmVlZGVkKHRhcmdldHMpO1xyXG5cclxuICAgICAgICB0YXJnZXRzLmZvckVhY2goKHdyaXRlcywgZmllbGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWFwID0gZW5zdXJlRmllbGRTdHlsZU1hcChmaWVsZCk7XHJcbiAgICAgICAgICAgIGlmICghbWFwKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICB3cml0ZXMuZm9yRWFjaCgodmFsdWUsIGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKG1hcCwga2V5LCBwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwYW5kZSBsZSBtb2RpZmljaGUgaW4gc29zcGVzbyBpbiBzY3JpdHR1cmUgY29uY3JldGUgcGVyIGNhbXBvOiBwcmltYSBxdWVsbGUgZ2xvYmFsaSxcclxuICAgICAqIHBvaSBxdWVsbGUgZGVsbGEgc2luZ29sYSB0aXBvbG9naWEsIGNoZSBxdWluZGkgaGFubm8gbGEgcHJlY2VkZW56YS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb2xsZWN0V3JpdGVUYXJnZXRzKCk6IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXRzID0gbmV3IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IChmaWVsZDogQmFzZUZpZWxkLCBrZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0cy5oYXMoZmllbGQpKSB7IHRhcmdldHMuc2V0KGZpZWxkLCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpKTsgfVxyXG4gICAgICAgICAgICB0YXJnZXRzLmdldChmaWVsZCkuc2V0KGAke2tleX18JHtwcm9wfWAsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnN0eWxlYWJsZUZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlRGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoZmllbGQ/LkZpZWxkVHlwZSk7XHJcbiAgICAgICAgICAgIGlmICghdHlwZURlZikgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhmaWVsZCwgZ2xvYmFsS2V5KS5mb3JFYWNoKChyZWFsS2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZShmaWVsZCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhncm91cC5vdmVycmlkZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gbm90ZShmaWVsZCwga2V5LCBwcm9wLCBncm91cC5vdmVycmlkZXNbZW50cnldKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElsIENTUyBsZWdhY3kgdmllbmUgYXBwbGljYXRvIGRhaSB0ZW1wbGF0ZSBjb21lIHN0aWxlIGlubGluZSBlIGJhdHRlcmViYmUgbGUgcmVnb2xlXHJcbiAgICAgKiBpbmlldHRhdGU6IGRvdmUgbCdlZGl0b3Igc3RhIHBlciBzY3JpdmVyZSwgbG8gc2kgYXNzb3JiZSBuZWxsYSBtYXBwYSBwZXIgZWxlbWVudG8gZVxyXG4gICAgICogc2kgYXp6ZXJhIGxhIHByb3ByaWV0w6AgbGVnYWN5LiBSZXN0YW5vIGludGF0dGUgbGUgcHJvcHJpZXTDoCBsZWdhY3kgc3UgZWxlbWVudGkgbm9uIHRvY2NhdGkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWJzb3JiTGVnYWN5V2hlcmVOZWVkZWQodGFyZ2V0czogTWFwPEJhc2VGaWVsZCwgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcclxuICAgICAgICB0YXJnZXRzLmZvckVhY2goKHdyaXRlcywgZmllbGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLndyaXRlcy5rZXlzKCldLm1hcCgoZSkgPT4gdGhpcy5zcGxpdEVudHJ5KGUpLmtleSkpO1xyXG5cclxuICAgICAgICAgICAgKFsnTGFiZWxzdHlsZUNTUycsICdGaWVsZHN0eWxlQ1NTJ10gYXMgQXJyYXk8J0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnPikuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3NzID0gKGZpZWxkIGFzIGFueSlbbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNzcyB8fCAhU3RyaW5nKGNzcykudHJpbSgpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGxlZ2FjeVRhcmdldEtleShmaWVsZCwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCB8fCAha2V5cy5oYXModGFyZ2V0KSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBlbnN1cmVGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWFwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtZXJnZUxlZ2FjeVN0eWxlc0ludG9NYXAoZmllbGQsIG1hcCwgbmFtZSkuY29uc3VtZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIChmaWVsZCBhcyBhbnkpW25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoYXNDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICB8fCB0aGlzLmdyb3Vwcy5zb21lKChnKSA9PiBPYmplY3Qua2V5cyhnLm92ZXJyaWRlcykubGVuZ3RoID4gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNoYW5nZXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoXHJcbiAgICAgICAgICAgICsgdGhpcy5ncm91cHMucmVkdWNlKChuLCBnKSA9PiBuICsgT2JqZWN0LmtleXMoZy5vdmVycmlkZXMpLmxlbmd0aCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIEFwcGxpY2F6aW9uZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTdHJhdG8gY29tdW5lIGFsbGUgZHVlIHNjaGVkZVxyXG4gICAgLy8gSWwgdGVtcGxhdGUgZGVsbGUgcmlnaGUtcHJvcHJpZXTDoCDDqCB1bmljbzogcXVlc3RlIHByb3ByaWV0w6AgaW5zdHJhZGFubyBsZXR0dXJhIGVcclxuICAgIC8vIHNjcml0dHVyYSBzdWxsYSBzY2hlZGEgYXR0aXZhLCBldml0YW5kbyBkaSBkdXBsaWNhcmUgaWwgbWFya3VwIGRlaSBjb250cm9sbGkuXHJcblxyXG4gICAgZ2V0IGN1cnJlbnRFbGVtZW50cygpOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuZ2xvYmFsRWxlbWVudHMgOiAodGhpcy5hY3RpdmVHcm91cD8uZWxlbWVudHMgPz8gW10pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50U3RhdGVzKCk6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxTdGF0ZXMgOiAodGhpcy5hY3RpdmVHcm91cD8uZGVmLnN0YXRlcyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTZWxlY3RlZFN0YXRlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGUgOiAodGhpcy5hY3RpdmVHcm91cD8uc2VsZWN0ZWRTdGF0ZSA/PyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q3VycmVudFN0YXRlKHN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLnNlbGVjdEdsb2JhbFN0YXRlKHN0YXRlS2V5KTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5zZWxlY3RTdGF0ZSh0aGlzLmFjdGl2ZUdyb3VwLCBzdGF0ZUtleSk7IH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudE9wZW5FbGVtZW50KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbE9wZW5FbGVtZW50IDogKHRoaXMuYWN0aXZlR3JvdXA/Lm9wZW5FbGVtZW50ID8/ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVDdXJyZW50RWxlbWVudChlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLnRvZ2dsZUdsb2JhbEVsZW1lbnQoZWxlbWVudEtleSk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMudG9nZ2xlRWxlbWVudCh0aGlzLmFjdGl2ZUdyb3VwLCBlbGVtZW50S2V5KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50U2hvd0FsbFByb3BlcnRpZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzIDogKHRoaXMuYWN0aXZlR3JvdXA/LnNob3dBbGxQcm9wZXJ0aWVzID8/IGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVDdXJyZW50U2hvd0FsbCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzID0gIXRoaXMuZ2xvYmFsU2hvd0FsbFByb3BlcnRpZXM7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMuYWN0aXZlR3JvdXAuc2hvd0FsbFByb3BlcnRpZXMgPSAhdGhpcy5hY3RpdmVHcm91cC5zaG93QWxsUHJvcGVydGllczsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJvd1Byb3BlcnRpZXMoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8Q3NzUHJvcGVydHlEZWY+IHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXAgPyB0aGlzLnByb3BlcnRpZXNGb3IodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByb3dDb3VudChlbGVtZW50S2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHJldHVybiB0aGlzLmdsb2JhbFNldFByb3BlcnRpZXNDb3VudChlbGVtZW50S2V5KTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwID8gdGhpcy5zZXRQcm9wZXJ0aWVzQ291bnQodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJvd0dldChlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScpIHsgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5LCBwcm9wKTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwID8gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXksIHByb3ApIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScpIHsgdGhpcy5zZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJvd0lzU2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93UmVzZXQoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBwcm9wLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbG9yZTogbGEgcGFzdGlnbGlhIGUgbG8gc2xpZGVyIGxhdm9yYW5vIGluc2llbWUgc3VsbG8gc3Rlc3NvIHZhbG9yZSAqL1xyXG4gICAgcm93U2V0Q29sb3JIZXgoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIGhleDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxwaGEgPSB0aGlzLmNvbG9yQWxwaGEodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIGFscGhhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0Q29sb3JBbHBoYShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZywgYWxwaGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMuY29sb3JIZXgodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIE51bWJlcihhbHBoYSkpKTtcclxuICAgIH1cclxuXHJcbiAgICByb3dTZXRTaXplKGVsZW1lbnRLZXk6IHN0cmluZywgZGVmaW5pdGlvbjogQ3NzUHJvcGVydHlEZWYsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBkZWZpbml0aW9uLnByb3AsIHRoaXMuYnVpbGRTaXplKGRlZmluaXRpb24sIHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFN0cmF0byBjb211bmUgYWxsZSBkdWUgc2NoZWRlXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYSBjb211bmVcclxuXHJcbiAgICBnZXQgY3VycmVudFNhbXBsZUZpZWxkcygpOiBBcnJheTxCYXNlRmllbGQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuc3R5bGVhYmxlRmllbGRzIDogKHRoaXMuYWN0aXZlR3JvdXA/LmZpZWxkcyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTYW1wbGVJbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5zYW1wbGVJbmRleCA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDdXJyZW50U2FtcGxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLmNoYW5nZUdsb2JhbFNhbXBsZShpbmRleCk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMuY2hhbmdlU2FtcGxlKHRoaXMuYWN0aXZlR3JvdXAsIGluZGV4KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50UHJldmlld0ZpZWxkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5wcmV2aWV3RmllbGQgPz8gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRQcmV2aWV3UmVjb3JkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdSZWNvcmQgOiAodGhpcy5hY3RpdmVHcm91cD8ucHJldmlld1JlY29yZCA/PyBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGlwb2xvZ2lhIGRlbCBjYW1wbyBtb3N0cmF0byBpbiBhbnRlcHJpbWEsIHBlciBzY2VnbGllcmUgaWwgdGVtcGxhdGUgZ2l1c3RvICovXHJcbiAgICBnZXQgY3VycmVudFByZXZpZXdUeXBlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmN1cnJlbnRQcmV2aWV3RmllbGQ/LkZpZWxkVHlwZSA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQW50ZXByaW1hIGNvbXVuZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBVdGlsaXTDoFxyXG5cclxuICAgIC8qKiBTY3JpdmUgKG8gcmltdW92ZSwgc2UgaWwgdmFsb3JlIMOoIHZ1b3RvKSB1bmEgcHJvcHJpZXTDoCBkZW50cm8gdW5hIG1hcHBhIHN0aWxpICovXHJcbiAgICBwcml2YXRlIHdyaXRlSW50b01hcChtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkID0gc2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleV0gPz8gJycsIHByb3AsIHZhbHVlKTtcclxuICAgICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgICAgICBtYXBba2V5XSA9IHVwZGF0ZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmltb3NzYSBkZWwgdHV0dG86IGlsIEpTT04gc2FsdmF0byByZXN0YSBjb21wYXR0b1xyXG4gICAgICAgICAgICBkZWxldGUgbWFwW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3BsaXRFbnRyeShlbnRyeTogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgcHJvcDogc3RyaW5nIH0ge1xyXG4gICAgICAgIGNvbnN0IGkgPSBlbnRyeS5sYXN0SW5kZXhPZignfCcpO1xyXG4gICAgICAgIHJldHVybiB7IGtleTogZW50cnkuc2xpY2UoMCwgaSksIHByb3A6IGVudHJ5LnNsaWNlKGkgKyAxKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQnlQcm9wKF9pbmRleDogbnVtYmVyLCBkZWZpbml0aW9uOiBDc3NQcm9wZXJ0eURlZik6IHN0cmluZyB7IHJldHVybiBkZWZpbml0aW9uLnByb3A7IH1cclxuICAgIHRyYWNrQnlLZXkoX2luZGV4OiBudW1iZXIsIGVudHJ5OiB7IGtleTogc3RyaW5nIH0pOiBzdHJpbmcgeyByZXR1cm4gZW50cnkua2V5OyB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFV0aWxpdMOgXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYVxyXG5cclxuICAgIC8qKiBDcmVhIGlsIGNhbXBvIGZpdHRpemlvIGRlbGwnYW50ZXByaW1hIGFnZ2FuY2lhbmRvZ2xpIGxhIG1hcHBhIHN0aWxpIHBhc3NhdGEgKi9cclxuICAgIHByaXZhdGUgYnVpbGRQcmV2aWV3RmllbGQoc291cmNlOiBCYXNlRmllbGQsIHN0eWxlTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogYW55IHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuc2FmZUNsb25lKHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgZGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoY2xvbmUuRmllbGRUeXBlKTtcclxuICAgICAgICBpZiAoZGVmKSB7IChjbG9uZSBhcyBhbnkpW2RlZi5zdHlsZVByb3BdID0gc3R5bGVNYXA7IH1cclxuXHJcbiAgICAgICAgLy8gSWwgbGVnYWN5IGUnIGdpYScgZGVudHJvIHN0eWxlTWFwOiBsYXNjaWFybG8gcXVpIGxvIHJpYXBwbGljaGVyZWJiZSBpbmxpbmUsXHJcbiAgICAgICAgLy8gY29wcmVuZG8gbGUgcmVnb2xlIGluaWV0dGF0ZSBlIG1vc3RyYW5kbyB1bidhbnRlcHJpbWEgZmFsc2FcclxuICAgICAgICBjbG9uZS5MYWJlbHN0eWxlQ1NTID0gbnVsbDtcclxuICAgICAgICBjbG9uZS5GaWVsZHN0eWxlQ1NTID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udHJvbE5hbWUgPSBjbG9uZS5MYWJlbCB8fCAncHJldmlld19maWVsZCc7XHJcbiAgICAgICAgY2xvbmUuTmFtZSA9IGNvbnRyb2xOYW1lO1xyXG5cclxuICAgICAgICB0aGlzLnByZXBhcmVUeXBlU3BlY2lmaWNQcmV2aWV3KGNsb25lKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdGhpcy5nZXRQcmV2aWV3SW5pdGlhbFZhbHVlKGNsb25lKTtcclxuICAgICAgICBjbG9uZS5Gb3JtRm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7IFtjb250cm9sTmFtZV06IFtpbml0aWFsVmFsdWVdIH0pO1xyXG4gICAgICAgIHJldHVybiBjbG9uZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFByZXZpZXdJbml0aWFsVmFsdWUoZmllbGQ6IEJhc2VGaWVsZCk6IGFueSB7XHJcbiAgICAgICAgc3dpdGNoIChOdW1iZXIoZmllbGQuRmllbGRUeXBlKSkge1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0FsbGVnYXRvJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydCb29sZWFubyddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaWVsZCBhcyBMYWJlbEZpZWxkKS5FdGljaGV0dGEgfHwgZmllbGQuRGVzY3JpcHRpb24gfHwgJ1Rlc3RvIGV0aWNoZXR0YSBkaSBlc2VtcGlvJztcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydFbGVuY28gZ2VuZXJpY28nXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLklzTXVsdGlDaG9pY2hlID8gW10gOiBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBpbW1hZ2luaSddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaWVsZCBhcyBJbWFnZVNlbGVjdG9yRmllbGQpLklzTXVsdGlDaG9pY2hlID8gW10gOiBudWxsO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29tcGxldGEgaWwgY2FtcG8gZGkgYW50ZXByaW1hIGNvbiBpIHZhbG9yaSBtaW5pbWkgcmljaGllc3RpIGRhaSBzaW5nb2xpIHRlbXBsYXRlICovXHJcbiAgICBwcml2YXRlIHByZXBhcmVUeXBlU3BlY2lmaWNQcmV2aWV3KGZpZWxkOiBCYXNlRmllbGQpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKE51bWJlcihmaWVsZC5GaWVsZFR5cGUpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnQWxsZWdhdG8nXToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWYgPSBmaWVsZCBhcyBBdHRhY2htZW50RmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWFmLkFsbG93ZWRNaW1lVHlwZXMgfHwgYWYuQWxsb3dlZE1pbWVUeXBlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhZi5BbGxvd2VkTWltZVR5cGVzID0gQXZhaWxhYmxlRmlsZUV4dGVuc2lvbnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChBdmFpbGFibGVJbWFnZUV4dGVuc2lvbnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGV4dCkgPT4gZXh0LmtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0RhdGEgZS9vIG9yYSddOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZiA9IGZpZWxkIGFzIERhdGVGaWVsZDtcclxuICAgICAgICAgICAgICAgIGlmIChkZi5Jc09ubHlEYXRlID09IG51bGwpIHsgZGYuSXNPbmx5RGF0ZSA9IERhdGVUaW1lVHlwZUVudW1bJ1NvbG8gZGF0YSddOyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZiA9IGZpZWxkIGFzIExhYmVsRmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxmLkV0aWNoZXR0YSkgeyBsZi5FdGljaGV0dGEgPSBmaWVsZC5EZXNjcmlwdGlvbiB8fCAnVGVzdG8gZXRpY2hldHRhIGRpIGVzZW1waW8nOyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0Jvb2xlYW5vJ106IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJmID0gZmllbGQgYXMgQm9vbGVhbkZpZWxkO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJmLlByZXNldGF0aW9uVHlwZSA9PSBudWxsKSB7IGJmLlByZXNldGF0aW9uVHlwZSA9IEJvb2xQcmVzZW50YW50aW9FbnVtLkNoZWNrYm94OyB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2FmZUNsb25lPFQ+KG9iajogVCk6IFQge1xyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldCgpO1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaiwgKGtleSwgdmFsdWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ0Zvcm1Gb3JtR3JvdXAnKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxyXG4gICAgICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIEFudGVwcmltYVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmZ2Utcm9vdFwiPlxyXG5cclxuICAgIDwhLS0gSW50ZXN0YXppb25lIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXJcIj5cclxuICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvbiBmZ2UtaGVhZGVyLWljb25cIiBuYW1lPVwicGFsZXR0ZVwiPjwvdG13LWljb24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXItdGV4dHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1oZWFkZXItdGl0bGVcIj5HcmFmaWNhIGRlaSBjYW1waSBzZWxlemlvbmF0aTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWhlYWRlci1zdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgc3R5bGVhYmxlRmllbGRzLmxlbmd0aCB9fSBjYW1waSBtb2RpZmljYWJpbGlcclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2hhbmdlc0NvdW50ID4gMFwiPiAmbWlkZG90OyB7eyBjaGFuZ2VzQ291bnQgfX0gbW9kaWZpY2hlIGluIHNvc3Blc288L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1oZWFkZXItY2xvc2VcIiAoY2xpY2spPVwiY2FuY2VsKClcIiBtYXRUb29sdGlwPVwiQ2hpdWRpXCI+XHJcbiAgICAgICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgbmFtZT1cInhcIj48L3Rtdy1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBOZXNzdW5hIHRpcG9sb2dpYSBnZXN0aWJpbGUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmdlLWVtcHR5XCIgKm5nSWY9XCJzdHlsZWFibGVGaWVsZHMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgTmVzc3VubyBkZWkgY2FtcGkgc2VsZXppb25hdGkgaGEgdW5hIGdyYWZpY2EgY29uZmlndXJhYmlsZS5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHlsZWFibGVGaWVsZHMubGVuZ3RoID4gMFwiPlxyXG5cclxuICAgICAgICA8IS0tIFNjaGVkZTogZ3JhZmljYSB2YWxpZGEgcGVyIHR1dHRpIC8gZGl2aXNhIHBlciB0aXBvbG9naWEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZnZS10YWJzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYignZ2xvYmFsZScpXCI+XHJcbiAgICAgICAgICAgICAgICBHcmFmaWNhIGdsb2JhbGVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAncGVyc29uYWxpenphdGEnXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIoJ3BlcnNvbmFsaXp6YXRhJylcIj5cclxuICAgICAgICAgICAgICAgIEdyYWZpY2EgcGVyc29uYWxpenphdGFcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtYm9keVwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLSNyZWdpb24gQ09MT05OQSBTSU5JU1RSQSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1sZWZ0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnRlc3RhemlvbmUgc2NoZWRhIGdsb2JhbGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXNjb3BlLW5vdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTGUgbW9kaWZpY2hlIHNpIGFwcGxpY2FubyBhIDxzdHJvbmc+dHV0dGkgaSB7eyBzdHlsZWFibGVGaWVsZHMubGVuZ3RoIH19IGNhbXBpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlemlvbmF0aTwvc3Ryb25nPiwgZGkgcXVhbHNpYXNpIHRpcG9sb2dpYS4gR2xpIGVsZW1lbnRpIHF1aSBzb3R0byBzb25vIHF1ZWxsaSBjb211bmk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9nbmkgdGlwb2xvZ2lhIGxpIGFwcGxpY2EgYWwgcHJvcHJpbyBlbGVtZW50byBjb3JyaXNwb25kZW50ZS5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gSW50ZXN0YXppb25lIHNjaGVkYSBwZXIgdGlwb2xvZ2lhIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BlcnNvbmFsaXp6YXRhJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtdHlwZS10YWJzXCIgKm5nSWY9XCJncm91cHMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS10eXBlLXRhYlwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBncm91cHM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBhY3RpdmVHcm91cEluZGV4XCIgKGNsaWNrKT1cInNlbGVjdEdyb3VwKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5kZWYubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLXR5cGUtdGFiLWJhZGdlXCI+e3sgZ3JvdXAuZmllbGRzLmxlbmd0aCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtZ3JvdXAtZmllbGRzXCIgKm5nSWY9XCJhY3RpdmVHcm91cCBhcyBncm91cFwiIFttYXRUb29sdGlwXT1cImdyb3VwRmllbGROYW1lcyhncm91cClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBncm91cC5kZWYubGFiZWwgfX08L3N0cm9uZz4gJm1pZGRvdDsge3sgZ3JvdXBGaWVsZE5hbWVzKGdyb3VwKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXdhcm5pbmdcIiAqbmdJZj1cImFjdGl2ZUdyb3VwPy5oYXNEaWZmZXJlbmNlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvblwiIG5hbWU9XCJhbGVydC10cmlhbmdsZVwiPjwvdG13LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBjYW1waSBzZWxlemlvbmF0aSBwYXJ0b25vIGRhIGdyYWZpY2hlIGRpdmVyc2UuIFN0YWkgdmVkZW5kbyBpIHZhbG9yaSByZWFsaSBkaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyBzYW1wbGVGaWVsZExhYmVsIH19PC9zdHJvbmc+IOKAlCBjYW1iaWEgY2FtcG8gZGFsbCdhbnRlcHJpbWEgcGVyIHZlZGVyZSBpIHN1b2kuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJyYW5ubyBtb2RpZmljYXRlIHNvbG8gbGUgcHJvcHJpZXTDoCBjaGUgdG9jY2hpLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFN0YXRvIHN1IGN1aSBzaSBzdGEgbGF2b3JhbmRvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1zdGF0ZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1zdGF0ZXMtbGFiZWxcIj5TdGF0bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1zdGF0ZS1jaGlwXCIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIGN1cnJlbnRTdGF0ZXM7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlID09PSBzdGF0ZS5rZXlcIiAoY2xpY2spPVwic2V0Q3VycmVudFN0YXRlKHN0YXRlLmtleSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RhdGUubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gRWxlbWVudGkgZ3JhZmljaSBlIHJlbGF0aXZlIHByb3ByaWV0w6AgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWVsZW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1lbGVtZW50XCIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgY3VycmVudEVsZW1lbnRzOyB0cmFja0J5OiB0cmFja0J5S2V5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1lbGVtZW50LWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVDdXJyZW50RWxlbWVudChlbGVtZW50LmtleSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uIGZnZS1lbGVtZW50LWNhcmV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJjdXJyZW50T3BlbkVsZW1lbnQgPT09IGVsZW1lbnQua2V5ID8gJ2NoZXZyb24tZG93bicgOiAnY2hldnJvbi1yaWdodCdcIj48L3Rtdy1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZ2UtZWxlbWVudC10aXRsZVwiPnt7IGVsZW1lbnQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1lbGVtZW50LW1pc3NpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgJiYgaXNHbG9iYWxFbGVtZW50TWlzc2luZ09uU2FtcGxlKGVsZW1lbnQua2V5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIklsIGNhbXBvIG1vc3RyYXRvIGluIGFudGVwcmltYSBub24gaGEgcXVlc3RvIGVsZW1lbnRvOiBsYSBtb2RpZmljYSB2YWxlIGNvbXVucXVlIHBlciBnbGkgYWx0cmkgY2FtcGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24gcHJlc2VudGUgcXVpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1lbGVtZW50LWNvdW50XCIgKm5nSWY9XCJyb3dDb3VudChlbGVtZW50LmtleSkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm93Q291bnQoZWxlbWVudC5rZXkpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wc1wiICpuZ0lmPVwiY3VycmVudE9wZW5FbGVtZW50ID09PSBlbGVtZW50LmtleVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJvcC1yb3dcIiAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiByb3dQcm9wZXJ0aWVzKGVsZW1lbnQua2V5KTsgdHJhY2tCeTogdHJhY2tCeVByb3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZXRdPVwicm93SXNTZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wLWxhYmVsXCIgW21hdFRvb2x0aXBdPVwiZGVmaW5pdGlvbi5wcm9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRlZmluaXRpb24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wLWNvbnRyb2xcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29sb3JlOiBwYXN0aWdsaWEgKyBvcGFjaXTDoCArIHZhbG9yZSB0ZXN0dWFsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRlZmluaXRpb24udHlwZSA9PT0gJ2NvbG9yJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiZmdlLWNvbG9yLXN3YXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbG9ySGV4KHJvd0dldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJyb3dTZXRDb2xvckhleChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImRlZmluaXRpb24ucHJvcFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJmZ2Utc2xpZGVyXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sb3JBbHBoYShyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicm93U2V0Q29sb3JBbHBoYShlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk9wYWNpdMOgXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZmdlLXZhbHVlLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJub24gaW1wb3N0YXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicm93U2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3AsICRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWlzdXJhOiBzbGlkZXIgKyB2YWxvcmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICdzaXplJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZmdlLXNsaWRlciBmZ2Utc2xpZGVyLXdpZGVcIiBbbWluXT1cImRlZmluaXRpb24ubWluXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImRlZmluaXRpb24ubWF4XCIgW3N0ZXBdPVwiZGVmaW5pdGlvbi5zdGVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2l6ZU51bWJlcihyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCksIGRlZmluaXRpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicm93U2V0U2l6ZShlbGVtZW50LmtleSwgZGVmaW5pdGlvbiwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmZ2UtdmFsdWUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIm5vbiBpbXBvc3RhdG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0dldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJyb3dTZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCwgJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbGVuY28gZGkgdmFsb3JpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVmaW5pdGlvbi50eXBlID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZnZS1zZWxlY3RcIiBbbmdNb2RlbF09XCJyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicm93U2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3AsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+bm9uIGltcG9zdGF0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBkZWZpbml0aW9uLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXN0byBsaWJlcm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICd0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmZ2UtdmFsdWUtaW5wdXQgZmdlLXZhbHVlLWlucHV0LXdpZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkZWZpbml0aW9uLnBsYWNlaG9sZGVyIHx8ICdub24gaW1wb3N0YXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInJvd1NldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1yZXNldFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJvd0lzU2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dSZXNldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQXp6ZXJhIHF1ZXN0YSBwcm9wcmlldMOgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvblwiIG5hbWU9XCJ4XCI+PC90bXctaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS10b2dnbGUtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZUN1cnJlbnRTaG93QWxsKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50U2hvd0FsbFByb3BlcnRpZXMgPyAnTW9zdHJhIHNvbG8gbGUgcHJvcHJpZXTDoCBwcmluY2lwYWxpJyA6ICdBbHRyZSBwcm9wcmlldMOgLi4uJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tI2VuZHJlZ2lvbiBDT0xPTk5BIFNJTklTVFJBIC0tPlxyXG5cclxuICAgICAgICAgICAgPCEtLSNyZWdpb24gQ09MT05OQSBERVNUUkE6IGFudGVwcmltYSBsaXZlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXJpZ2h0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcmV2aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLXByZXZpZXctdGl0bGVcIj5BbnRlcHJpbWE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZnZS1zYW1wbGUtc2VsZWN0XCIgKm5nSWY9XCJjdXJyZW50U2FtcGxlRmllbGRzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjdXJyZW50U2FtcGxlSW5kZXhcIiBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VDdXJyZW50U2FtcGxlKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZiBvZiBjdXJyZW50U2FtcGxlRmllbGRzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGlzcGxheU5hbWUoZikgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXByZXZpZXctc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICBTdGF0byBtb3N0cmF0bzogPHN0cm9uZz57eyBjdXJyZW50U2VsZWN0ZWRTdGF0ZSB9fTwvc3Ryb25nPiAmbWlkZG90O1xyXG4gICAgICAgICAgICAgICAgICAgIGlsIGNhbXBvIHNjZWx0byBzZXJ2ZSBzb2xvIGRhIGVzZW1waW9cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJldmlldy1jYW52YXNcIiAqbmdJZj1cImN1cnJlbnRQcmV2aWV3RmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dC1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQ2FtcG8gZGkgdGVzdG8nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGV4dC1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydBcmVhIGRpIHRlc3RvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bnVtZXJpYy1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQ2FtcG8gbnVtZXJpY28nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbnVtZXJpYy1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGJvb2xlYW4tZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0Jvb2xlYW5vJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Jvb2xlYW4tZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkYXRlLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydEYXRhIGUvbyBvcmEnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJjdXJyZW50UHJldmlld1JlY29yZFwiIFtpbkNvbmZpZ109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIiBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGF0ZS1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGF0dGFjaG1lbnQtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0FsbGVnYXRvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2F0dGFjaG1lbnQtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbC1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRXRpY2hldHRhJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bGlzdC12YWx1ZS1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRWxlbmNvIGdlbmVyaWNvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpc3QtdmFsdWUtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWFnZS1maWVsZC1zZWxlY3Rvci10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRWxlbmNvIGltbWFnaW5pJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ltYWdlLWZpZWxkLXNlbGVjdG9yLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8YWN0aW9uLWJ1dHRvbi1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQm90dG9uZSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cInt9XCIgW2luQ29uZmlnXT1cInRydWVcIiBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hY3Rpb24tYnV0dG9uLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmRQb2ludENvbmZpZ3VyYXRpb25dPVwiZW5kUG9pbnRDb25maWd1cmF0aW9uXCIgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaW1hZ2UtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWFnZS13aXRoLW1hcmtlcnMtZmllbGQtdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lIGNvbiBtYXJrZXJzJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmRQb2ludENvbmZpZ3VyYXRpb25dPVwiZW5kUG9pbnRDb25maWd1cmF0aW9uXCIgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvaW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tI2VuZHJlZ2lvbiBDT0xPTk5BIERFU1RSQSAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQ2FtcGkgZXNjbHVzaSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmZ2UtdW5zdXBwb3J0ZWRcIiAqbmdJZj1cInVuc3VwcG9ydGVkRmllbGRzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICBFc2NsdXNpIHBlcmNow6kgc2VuemEgZ3JhZmljYSBjb25maWd1cmFiaWxlOiB7eyB1bnN1cHBvcnRlZEZpZWxkcy5sZW5ndGggfX0gY2FtcGlcclxuICAgICAgICAoe3sgZGlzcGxheU5hbWUodW5zdXBwb3J0ZWRGaWVsZHNbMF0pIH19PHNwYW5cclxuICAgICAgICAgICAgKm5nSWY9XCJ1bnN1cHBvcnRlZEZpZWxkcy5sZW5ndGggPiAxXCI+LCAuLi48L3NwYW4+KVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBQdWxzYW50aSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmZ2UtZm9vdGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+QW5udWxsYTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCIhaGFzQ2hhbmdlc1wiIChjbGljayk9XCJhcHBseSgpXCI+XHJcbiAgICAgICAgICAgIEFwcGxpY2EgYWkgY2FtcGkgc2VsZXppb25hdGlcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
|
|
823
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9maWVsZC1ncmFwaGljcy1lZGl0b3IvZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFhLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsSSxPQUFPLEVBQWdCLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0YsT0FBTyxFQUFhLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFLckYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6SCxPQUFPLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FB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QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqRCxJQUFJLEdBQUcsS0FBSyxlQUFlLEVBQUU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7YUFBRTtZQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQUUsT0FBTyxTQUFTLENBQUM7aUJBQUU7Z0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkI7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7MEhBbnpCUSw0QkFBNEI7OEdBQTVCLDRCQUE0Qiw4T0NqRXpDLHdrbEJBaVNBOzRGRGhPYSw0QkFBNEI7a0JBTHhDLFNBQVM7K0JBQ0ksdUJBQXVCO3lHQU94QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJhc2VGaWVsZCwgRmllbGRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9iYXNlRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50RmllbGQsIEF2YWlsYWJsZUZpbGVFeHRlbnNpb25zLCBBdmFpbGFibGVJbWFnZUV4dGVuc2lvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2F0dGFjaG1lbnRGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IEJvb2xlYW5GaWVsZCwgQm9vbFByZXNlbnRhbnRpb0VudW0gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2Jvb2xlYW5GaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVGaWVsZCwgRGF0ZVRpbWVUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWVsZHMvZGF0ZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgSW1hZ2VTZWxlY3RvckZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9pbWFnZVNlbGVjdG9yRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBMYWJlbEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9sYWJlbEZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgTGlzdFZhbHVlRmllbGQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRW5kUG9pbnRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IGRlY29kZUZsb2F0aW5nTWFwLCBlbmNvZGVGbG9hdGluZ01hcCwgcmVhZFN0eWxlQ3NzLCB3cml0ZVN0eWxlQ3NzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZmxvYXRpbmctbGFiZWwtc3R5bGVzJztcclxuaW1wb3J0IHsgYnVpbGRDc3NDb2xvciwgY3NzQ29sb3JUb0FscGhhUGVyY2VudCwgY3NzQ29sb3JUb0hleCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Nzcy1jb2xvcic7XHJcbmltcG9ydCB7IGdldENzc0RlY2xhcmF0aW9uLCBwYXJzZUNzc0RlY2xhcmF0aW9ucywgc2V0Q3NzRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHtcclxuICAgIGJ1aWxkQ3VzdG9tQ3NzUHJvcGVydHlEZWYsXHJcbiAgICBDc3NFbGVtZW50UHJvZmlsZSxcclxuICAgIENzc1Byb3BlcnR5RGVmLFxyXG4gICAgZ2V0Q3NzUHJvcGVydGllc0ZvclByb2ZpbGUsXHJcbiAgICBnZXRDc3NQcm9wZXJ0eURlZixcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9jc3MtcHJvcGVydHktY2F0YWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgICBjbG9uZUZpZWxkU3R5bGVNYXAsXHJcbiAgICBlbnN1cmVGaWVsZFN0eWxlTWFwLFxyXG4gICAgRmllbGRTdHlsZUVudHJ5RGVmLFxyXG4gICAgRmllbGRTdHlsZVR5cGVEZWYsXHJcbiAgICBnZXRDb21tb25TdGF0ZXMsXHJcbiAgICBnZXRGaWVsZFN0eWxlRWxlbWVudHMsXHJcbiAgICBnZXRGaWVsZFN0eWxlVHlwZURlZixcclxuICAgIGdldEZpZWxkRGlzcGxheU5hbWUsXHJcbiAgICBnZXRFZmZlY3RpdmVTdHlsZU1hcCxcclxuICAgIGxlZ2FjeVRhcmdldEtleSxcclxuICAgIG1lcmdlTGVnYWN5U3R5bGVzSW50b01hcCxcclxuICAgIEdMT0JBTF9TVFlMRV9FTEVNRU5UUyxcclxuICAgIEdsb2JhbFN0eWxlRWxlbWVudERlZixcclxuICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyxcclxufSBmcm9tICcuLi8uLi8uLi91dGlscy9maWVsZC1zdHlsZS1jYXRhbG9nJztcclxuXHJcbi8qKiBVbiBncnVwcG8gcmFjY29nbGllIHR1dHRpIGkgY2FtcGkgc2VsZXppb25hdGkgY2hlIGNvbmRpdmlkb25vIGxhIHN0ZXNzYSB0aXBvbG9naWEgKi9cclxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFN0eWxlR3JvdXAge1xyXG4gICAgZGVmOiBGaWVsZFN0eWxlVHlwZURlZjtcclxuICAgIGZpZWxkczogQXJyYXk8QmFzZUZpZWxkPjtcclxuICAgIGVsZW1lbnRzOiBBcnJheTxGaWVsZFN0eWxlRW50cnlEZWY+O1xyXG4gICAgLyoqXHJcbiAgICAgKiBNYXBwYSBtb3N0cmF0YSBhIHZpZGVvOiBwYXJ0ZSBzZW1wcmUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIHNjZWx0byBjb21lIGNhbXBpb25lLFxyXG4gICAgICogY29uIHNvcHJhIGxlIG1vZGlmaWNoZSBhbmNvcmEgbm9uIGFwcGxpY2F0ZS4gVmEgcmljb3N0cnVpdGEgcXVhbmRvIGNhbWJpYSBpbCBjYW1waW9uZS5cclxuICAgICAqL1xyXG4gICAgc3R5bGVNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgICAvKiogTW9kaWZpY2hlIGluIHNvc3Blc28sIGluZGljaXp6YXRlIHBlciBcIkVsZW1lbnRvU3RhdG98cHJvcHJpZXTDoFwiICovXHJcbiAgICBvdmVycmlkZXM6IHsgW2VudHJ5OiBzdHJpbmddOiBzdHJpbmcgfTtcclxuICAgIC8qKiBUcnVlIHNlIGkgY2FtcGkgZGVsIGdydXBwbyBwYXJ0b25vIGRhIGdyYWZpY2hlIGRpdmVyc2UgZnJhIGxvcm8gKi9cclxuICAgIGhhc0RpZmZlcmVuY2VzOiBib29sZWFuO1xyXG4gICAgc2FtcGxlSW5kZXg6IG51bWJlcjtcclxuICAgIHNlbGVjdGVkU3RhdGU6IHN0cmluZztcclxuICAgIG9wZW5FbGVtZW50OiBzdHJpbmc7XHJcbiAgICBzaG93QWxsUHJvcGVydGllczogYm9vbGVhbjtcclxuICAgIHByZXZpZXdGaWVsZDogYW55O1xyXG4gICAgcHJldmlld1JlY29yZDogYW55O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZmllbGQtZ3JhcGhpY3MtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWVsZC1ncmFwaGljcy1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZmllbGQtZ3JhcGhpY3MtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWVsZEdyYXBoaWNzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSBkZWwgY29uZmlndXJhdG9yZSAqL1xyXG4gICAgQElucHV0KCkgZmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuICAgIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG5cclxuICAgIC8qKiBFbWVzc28gZG9wbyBhdmVyIHNjcml0dG8gbGUgbW9kaWZpY2hlIHN1aSBjYW1waSAqL1xyXG4gICAgQE91dHB1dCgpIGFwcGx5RXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIEBPdXRwdXQoKSBjYW5jZWxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIEZpZWxkVHlwZUVudW0gPSBGaWVsZFR5cGVFbnVtO1xyXG4gICAgZGlzcGxheU5hbWUgPSBnZXRGaWVsZERpc3BsYXlOYW1lO1xyXG5cclxuICAgIC8qKiBTY2hlZGEgYXR0aXZhOiBncmFmaWNhIHZhbGlkYSBwZXIgdHV0dGkgaSBjYW1waSwgb3BwdXJlIGRpdmlzYSBwZXIgdGlwb2xvZ2lhICovXHJcbiAgICBhY3RpdmVUYWI6ICdnbG9iYWxlJyB8ICdwZXJzb25hbGl6emF0YScgPSAnZ2xvYmFsZSc7XHJcblxyXG4gICAgZ3JvdXBzOiBBcnJheTxGaWVsZFN0eWxlR3JvdXA+ID0gW107XHJcbiAgICAvKiogQ2FtcGkgc2VsZXppb25hdGkgY29uIHVuYSBncmFmaWNhIGNvbmZpZ3VyYWJpbGUgKGVzY2x1c2kgTG9va3VwIGUgRm9ybSBkaSBkZXR0YWdsaW8pICovXHJcbiAgICBzdHlsZWFibGVGaWVsZHM6IEFycmF5PEJhc2VGaWVsZD4gPSBbXTtcclxuICAgIHVuc3VwcG9ydGVkRmllbGRzOiBBcnJheTxCYXNlRmllbGQ+ID0gW107XHJcbiAgICBhY3RpdmVHcm91cEluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vI3JlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIGdsb2JhbEVsZW1lbnRzOiBBcnJheTxHbG9iYWxTdHlsZUVsZW1lbnREZWY+ID0gW107XHJcbiAgICBnbG9iYWxTdGF0ZXM6IEFycmF5PEZpZWxkU3R5bGVFbnRyeURlZj4gPSBbXTtcclxuICAgIGdsb2JhbFNlbGVjdGVkU3RhdGU6IHN0cmluZyA9ICdOb3JtYWxlJztcclxuICAgIGdsb2JhbE9wZW5FbGVtZW50OiBzdHJpbmcgPSAnJztcclxuICAgIGdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBnbG9iYWxTYW1wbGVJbmRleDogbnVtYmVyID0gMDtcclxuICAgIC8qKiBNb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvLCBpbmRpY2l6emF0ZSBwZXIgXCJFbGVtZW50b0xvZ2ljb3xTdGF0b3xwcm9wcmlldMOgXCIgKi9cclxuICAgIGdsb2JhbE92ZXJyaWRlczogeyBbZW50cnk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBnbG9iYWxQcmV2aWV3RmllbGQ6IGFueSA9IG51bGw7XHJcbiAgICBnbG9iYWxQcmV2aWV3UmVjb3JkOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBTdGF0byBkZWxsYSBzY2hlZGEgXCJHcmFmaWNhIGdsb2JhbGVcIlxyXG5cclxuICAgIC8qKiBJbmNyZW1lbnRhdG8gYWQgb2duaSBtb2RpZmljYSBwZXIgZm9yemFyZSBpbCByaWNhbGNvbG8gZGVnbGkgc3RpbGkgbmVsbGUgYW50ZXByaW1lICovXHJcbiAgICBzdHlsZVZlcnNpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbml6aW9uaSBjcmVhdGUgYWwgdm9sbyBwZXIgbGUgcHJvcHJpZXTDoCBzY3JpdHRlIGEgbWFubyBlIGZ1b3JpIGNhdGFsb2dvLlxyXG4gICAgICogVmFubm8gbWVtb3JpenphdGU6IHByb3BlcnRpZXNGb3IoKSB2aWVuZSByaWNoaWFtYXRhIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvblxyXG4gICAgICogZSByaWNyZWFyZSBnbGkgb2dnZXR0aSBmYXJlYmJlIHJpY29zdHJ1aXJlIGxlIHJpZ2hlLCBmYWNlbmRvIHBlcmRlcmUgaWwgZnVvY28gbWVudHJlIHNpIHNjcml2ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjdXN0b21Qcm9wZXJ0eURlZnM6IHsgW3Byb3A6IHN0cmluZ106IENzc1Byb3BlcnR5RGVmIH0gPSB7fTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYnVpbGRHcm91cHMoKTtcclxuICAgICAgICB0aGlzLmJ1aWxkR2xvYmFsVGFiKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIENvc3RydXppb25lXHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdyb3VwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyb3VwcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc3R5bGVhYmxlRmllbGRzID0gW107XHJcbiAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgICAodGhpcy5maWVsZHMgPz8gW10pLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IGdldEZpZWxkU3R5bGVUeXBlRGVmKGZpZWxkPy5GaWVsZFR5cGUpO1xyXG4gICAgICAgICAgICBpZiAoIWRlZikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bnN1cHBvcnRlZEZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMucHVzaChmaWVsZCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5maW5kKChnKSA9PiBOdW1iZXIoZy5kZWYuZmllbGRUeXBlKSA9PT0gTnVtYmVyKGRlZi5maWVsZFR5cGUpKTtcclxuICAgICAgICAgICAgaWYgKCFncm91cCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZCksXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVNYXA6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlczoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzRGlmZmVyZW5jZXM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU3RhdGU6IGRlZi5zdGF0ZXNbMF0/LmtleSA/PyAnTm9ybWFsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlbkVsZW1lbnQ6IGdldEZpZWxkU3R5bGVFbGVtZW50cyhmaWVsZClbMF0/LmtleSA/PyAnJyxcclxuICAgICAgICAgICAgICAgICAgICBzaG93QWxsUHJvcGVydGllczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld0ZpZWxkOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdSZWNvcmQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHMucHVzaChncm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5wdXNoKGZpZWxkKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gSlNPTi5zdHJpbmdpZnkoY2xvbmVGaWVsZFN0eWxlTWFwKGdyb3VwLmZpZWxkc1swXSkpO1xyXG4gICAgICAgICAgICBncm91cC5oYXNEaWZmZXJlbmNlcyA9IGdyb3VwLmZpZWxkcy5zb21lKChmKSA9PiBKU09OLnN0cmluZ2lmeShjbG9uZUZpZWxkU3R5bGVNYXAoZikpICE9PSByZWZlcmVuY2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRHcm91cChncm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlR3JvdXBJbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdsb2JhbFRhYigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0eXBlcyA9IHRoaXMuc3R5bGVhYmxlRmllbGRzLm1hcCgoZikgPT4gZi5GaWVsZFR5cGUpO1xyXG5cclxuICAgICAgICB0aGlzLmdsb2JhbEVsZW1lbnRzID0gR0xPQkFMX1NUWUxFX0VMRU1FTlRTLmZpbHRlcigoZykgPT5cclxuICAgICAgICAgICAgdGhpcy5zdHlsZWFibGVGaWVsZHMuc29tZSgoZikgPT4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGYsIGcua2V5KS5sZW5ndGggPiAwKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTdGF0ZXMgPSBnZXRDb21tb25TdGF0ZXModHlwZXMpO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZSA9IHRoaXMuZ2xvYmFsU3RhdGVzWzBdPy5rZXkgPz8gJ05vcm1hbGUnO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPSB0aGlzLmdsb2JhbEVsZW1lbnRzWzBdPy5rZXkgPz8gJyc7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMucmVidWlsZEdsb2JhbFByZXZpZXcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQ29zdHJ1emlvbmVcclxuXHJcbiAgICAvLyNyZWdpb24gU2NoZWRhIFwiR3JhZmljYSBwZXJzb25hbGl6emF0YVwiXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSaWNvc3RydWlzY2UgbGEgbWFwcGEgbW9zdHJhdGEgcGVyIHVuIGdydXBwbzogcGFydGUgZGFnbGkgc3RpbGkgcmVhbGkgZGVsIGNhbXBvIGNhbXBpb25lXHJcbiAgICAgKiDigJQgY29zw6wgdW5hIGdyYWZpY2EgaW1wb3N0YXRhIGZ1b3JpIGRhIHF1ZXN0byBlZGl0b3IgdmllbmUgc2VtcHJlIHJpcG9ydGF0YSDigJQsIHBvaSBhcHBsaWNhXHJcbiAgICAgKiBsZSBtb2RpZmljaGUgZ2xvYmFsaSBlIGluZmluZSBxdWVsbGUgc3BlY2lmaWNoZSBkZWxsYSB0aXBvbG9naWEuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVidWlsZEdyb3VwKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzYW1wbGUgPSBncm91cC5maWVsZHNbZ3JvdXAuc2FtcGxlSW5kZXhdID8/IGdyb3VwLmZpZWxkc1swXTtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy8gTGEgYmFzZSBjb21wcmVuZGUgaWwgQ1NTIGxlZ2FjeSBhc3NvcmJpdG8sIGFsdHJpbWVudGkgbCdlZGl0b3IgbW9zdHJlcmViYmVcclxuICAgICAgICAvLyBcIm5vbiBpbXBvc3RhdG9cIiBzdSBwcm9wcmlldMOgIGNoZSBhIHZpZGVvIHNpIHZlZG9ubyBlY2NvbWUgKGFwcGxpY2F0ZSBpbmxpbmUpXHJcbiAgICAgICAgZ3JvdXAuc3R5bGVNYXAgPSBkZWNvZGVGbG9hdGluZ01hcChnZXRFZmZlY3RpdmVTdHlsZU1hcChzYW1wbGUpKTtcclxuICAgICAgICB0aGlzLmFwcGx5R2xvYmFsT3ZlcnJpZGVzVG9NYXAoc2FtcGxlLCBncm91cC5zdHlsZU1hcCk7XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwLm92ZXJyaWRlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBrZXksIHByb3AgfSA9IHRoaXMuc3BsaXRFbnRyeShlbnRyeSk7XHJcbiAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKGdyb3VwLnN0eWxlTWFwLCBrZXksIHByb3AsIGdyb3VwLm92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJ1aWxkUHJldmlldyhncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpY3JlYSBpbCBjYW1wbyBmaXR0aXppbyB1c2F0byBkYWxsJ2FudGVwcmltYSwgYWdnYW5jaWFuZG9nbGkgbGEgbWFwcGEgbW9zdHJhdGEgKi9cclxuICAgIHByaXZhdGUgYnVpbGRQcmV2aWV3KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzb3VyY2UgPSBncm91cC5maWVsZHNbZ3JvdXAuc2FtcGxlSW5kZXhdID8/IGdyb3VwLmZpZWxkc1swXTtcclxuICAgICAgICBpZiAoIXNvdXJjZSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmJ1aWxkUHJldmlld0ZpZWxkKHNvdXJjZSwgZ3JvdXAuc3R5bGVNYXAsIGdyb3VwLm9wZW5FbGVtZW50KTtcclxuXHJcbiAgICAgICAgZ3JvdXAuZWxlbWVudHMgPSBnZXRGaWVsZFN0eWxlRWxlbWVudHMoY2xvbmUpO1xyXG4gICAgICAgIGlmICghZ3JvdXAuZWxlbWVudHMuc29tZSgoZSkgPT4gZS5rZXkgPT09IGdyb3VwLm9wZW5FbGVtZW50KSkge1xyXG4gICAgICAgICAgICBncm91cC5vcGVuRWxlbWVudCA9IGdyb3VwLmVsZW1lbnRzWzBdPy5rZXkgPz8gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBncm91cC5wcmV2aWV3RmllbGQgPSBjbG9uZTtcclxuICAgICAgICBncm91cC5wcmV2aWV3UmVjb3JkID0geyBbY2xvbmUuTmFtZV06IHRoaXMuZ2V0UHJldmlld0luaXRpYWxWYWx1ZShjbG9uZSwgZ3JvdXAub3BlbkVsZW1lbnQpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYWN0aXZlR3JvdXAoKTogRmllbGRTdHlsZUdyb3VwIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RoaXMuYWN0aXZlR3JvdXBJbmRleF0gPz8gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RHcm91cChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVHcm91cEluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RTdGF0ZShncm91cDogRmllbGRTdHlsZUdyb3VwLCBzdGF0ZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgZ3JvdXAuc2VsZWN0ZWRTdGF0ZSA9IHN0YXRlS2V5O1xyXG4gICAgICAgIHRoaXMuc3R5bGVWZXJzaW9uKys7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlRWxlbWVudChncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmbG9hdGluZ0JlZm9yZSA9IHRoaXMucHJldmlld0xhYmVsTW9kZShncm91cC5vcGVuRWxlbWVudCk7XHJcbiAgICAgICAgZ3JvdXAub3BlbkVsZW1lbnQgPSBncm91cC5vcGVuRWxlbWVudCA9PT0gZWxlbWVudEtleSA/ICcnIDogZWxlbWVudEtleTtcclxuICAgICAgICBpZiAodGhpcy5wcmV2aWV3TGFiZWxNb2RlKGdyb3VwLm9wZW5FbGVtZW50KSAhPT0gZmxvYXRpbmdCZWZvcmUpIHsgdGhpcy5idWlsZFByZXZpZXcoZ3JvdXApOyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENhbWJpYW5kbyBjYW1waW9uZSBzaSByaWxlZ2dvbm8gaSBzdW9pIHN0aWxpIHJlYWxpLCBtYW50ZW5lbmRvIGxlIG1vZGlmaWNoZSBpbiBzb3NwZXNvICovXHJcbiAgICBjaGFuZ2VTYW1wbGUoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGdyb3VwLnNhbXBsZUluZGV4ID0gTnVtYmVyKGluZGV4KTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRHcm91cChncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ3JvdXBGaWVsZE5hbWVzKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBncm91cC5maWVsZHMubWFwKChmKSA9PiBnZXRGaWVsZERpc3BsYXlOYW1lKGYpKS5qb2luKCcsICcpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzYW1wbGVGaWVsZExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZyA9IHRoaXMuYWN0aXZlR3JvdXA7XHJcbiAgICAgICAgaWYgKCFnKSB7IHJldHVybiAnJzsgfVxyXG4gICAgICAgIGNvbnN0IGYgPSBnLmZpZWxkc1tnLnNhbXBsZUluZGV4XSA/PyBnLmZpZWxkc1swXTtcclxuICAgICAgICByZXR1cm4gZiA/IGdldEZpZWxkRGlzcGxheU5hbWUoZikgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gU2NoZWRhIFwiR3JhZmljYSBwZXJzb25hbGl6emF0YVwiXHJcblxyXG4gICAgLy8jcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgZ2xvYmFsZVwiXHJcblxyXG4gICAgc2VsZWN0VGFiKHRhYjogJ2dsb2JhbGUnIHwgJ3BlcnNvbmFsaXp6YXRhJyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xyXG4gICAgICAgIC8vIFBhc3NhbmRvIGFsbGEgc2NoZWRhIHBlciB0aXBvbG9naWEgaSB2YWxvcmkgZGV2b25vIGdpw6AgaW5jbHVkZXJlIGxlIG1vZGlmaWNoZSBnbG9iYWxpXHJcbiAgICAgICAgaWYgKHRhYiA9PT0gJ3BlcnNvbmFsaXp6YXRhJykge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChnKSA9PiB0aGlzLnJlYnVpbGRHcm91cChnKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkR2xvYmFsUHJldmlldygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0eWxlVmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdEdsb2JhbFN0YXRlKHN0YXRlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGUgPSBzdGF0ZUtleTtcclxuICAgICAgICB0aGlzLnN0eWxlVmVyc2lvbisrO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZUdsb2JhbEVsZW1lbnQoZWxlbWVudEtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZmxvYXRpbmdCZWZvcmUgPSB0aGlzLnByZXZpZXdMYWJlbE1vZGUodGhpcy5nbG9iYWxPcGVuRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxPcGVuRWxlbWVudCA9IHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgPT09IGVsZW1lbnRLZXkgPyAnJyA6IGVsZW1lbnRLZXk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJldmlld0xhYmVsTW9kZSh0aGlzLmdsb2JhbE9wZW5FbGVtZW50KSAhPT0gZmxvYXRpbmdCZWZvcmUpIHsgdGhpcy5yZWJ1aWxkR2xvYmFsUHJldmlldygpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlR2xvYmFsU2FtcGxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdsb2JhbFNhbXBsZUluZGV4ID0gTnVtYmVyKGluZGV4KTtcclxuICAgICAgICB0aGlzLnJlYnVpbGRHbG9iYWxQcmV2aWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdsb2JhbFNhbXBsZUZpZWxkKCk6IEJhc2VGaWVsZCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlYWJsZUZpZWxkc1t0aGlzLmdsb2JhbFNhbXBsZUluZGV4XSA/PyB0aGlzLnN0eWxlYWJsZUZpZWxkc1swXSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUcnVlIHNlIGwnZWxlbWVudG8gbG9naWNvIG5vbiBlc2lzdGUgc3VsIGNhbXBvIGF0dHVhbG1lbnRlIGluIGFudGVwcmltYSAqL1xyXG4gICAgaXNHbG9iYWxFbGVtZW50TWlzc2luZ09uU2FtcGxlKGVsZW1lbnRLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZ2xvYmFsU2FtcGxlRmllbGQ7XHJcbiAgICAgICAgaWYgKCFzYW1wbGUpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhzYW1wbGUsIGVsZW1lbnRLZXkpLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYnVpbGRHbG9iYWxQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNhbXBsZSA9IHRoaXMuZ2xvYmFsU2FtcGxlRmllbGQ7XHJcbiAgICAgICAgaWYgKCFzYW1wbGUpIHsgdGhpcy5nbG9iYWxQcmV2aWV3RmllbGQgPSBudWxsOyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgY29uc3QgbWFwID0gZGVjb2RlRmxvYXRpbmdNYXAoZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKSk7XHJcbiAgICAgICAgdGhpcy5hcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKHNhbXBsZSwgbWFwKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmJ1aWxkUHJldmlld0ZpZWxkKHNhbXBsZSwgbWFwLCB0aGlzLmdsb2JhbE9wZW5FbGVtZW50KTtcclxuICAgICAgICB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA9IGNsb25lO1xyXG4gICAgICAgIHRoaXMuZ2xvYmFsUHJldmlld1JlY29yZCA9IHsgW2Nsb25lLk5hbWVdOiB0aGlzLmdldFByZXZpZXdJbml0aWFsVmFsdWUoY2xvbmUsIHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQpIH07XHJcbiAgICAgICAgdGhpcy5zdHlsZVZlcnNpb24rKztcclxuICAgIH1cclxuXHJcbiAgICAvKiogUml2ZXJzYSBsZSBtb2RpZmljaGUgZ2xvYmFsaSBpbiBzb3NwZXNvIHN1IHVuYSBtYXBwYSBzdGlsaSwgcmlzb2x0ZSBwZXIgcXVlbCBjYW1wbyAqL1xyXG4gICAgcHJpdmF0ZSBhcHBseUdsb2JhbE92ZXJyaWRlc1RvTWFwKGZpZWxkOiBCYXNlRmllbGQsIG1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHR5cGVEZWYgPSBnZXRGaWVsZFN0eWxlVHlwZURlZihmaWVsZD8uRmllbGRUeXBlKTtcclxuICAgICAgICBpZiAoIXR5cGVEZWYpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGVudHJ5LnNwbGl0KCd8Jyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKGZpZWxkLCBnbG9iYWxLZXkpLmZvckVhY2goKHJlYWxLZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKG1hcCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTdHlsZUtleXNGb3JTYW1wbGUoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gW107IH1cclxuICAgICAgICByZXR1cm4gcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkubWFwKChrKSA9PiBrICsgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVmFsb3JlIG1vc3RyYXRvIHBlciB1bmEgcHJvcHJpZXTDoCBnbG9iYWxlOiBxdWVsbG8gcmVhbGUgZGVsIGNhbXBpb25lIHBpw7kgbGUgbW9kaWZpY2hlICovXHJcbiAgICBnZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBlbnRyeSA9IGAke2VsZW1lbnRLZXl9fCR7dGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlfXwke3Byb3AudG9Mb3dlckNhc2UoKX1gO1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5nbG9iYWxPdmVycmlkZXMsIGVudHJ5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxPdmVycmlkZXNbZW50cnldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBpZiAoIXNhbXBsZSkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5cyA9IHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhzYW1wbGUsIGVsZW1lbnRLZXkpO1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cclxuXHJcbiAgICAgICAgY29uc3QgbWFwID0gZGVjb2RlRmxvYXRpbmdNYXAoZ2V0RWZmZWN0aXZlU3R5bGVNYXAoc2FtcGxlKSk7XHJcbiAgICAgICAgcmV0dXJuIGdldENzc0RlY2xhcmF0aW9uKG1hcFtrZXlzWzBdICsgdGhpcy5nbG9iYWxTZWxlY3RlZFN0YXRlXSA/PyAnJywgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0R2xvYmFsUHJvcGVydHlWYWx1ZShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gYCR7ZWxlbWVudEtleX18JHt0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGV9fCR7cHJvcC50b0xvd2VyQ2FzZSgpfWA7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxPdmVycmlkZXNbZW50cnldID0gKHZhbHVlID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgdGhpcy5yZWJ1aWxkR2xvYmFsUHJldmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0R2xvYmFsUHJvcGVydHkoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEdsb2JhbFByb3BlcnR5VmFsdWUoZWxlbWVudEtleSwgcHJvcCwgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzR2xvYmFsUHJvcGVydHlTZXQoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldEdsb2JhbFByb3BlcnR5VmFsdWUoZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFByb3ByaWV0w6AgbW9zdHJhdGUgbmVsbGEgc2NoZWRhIGdsb2JhbGUgcGVyIHVuIGVsZW1lbnRvIGxvZ2ljbyAqL1xyXG4gICAgZ2xvYmFsUHJvcGVydGllc0ZvcihlbGVtZW50S2V5OiBzdHJpbmcpOiBBcnJheTxDc3NQcm9wZXJ0eURlZj4ge1xyXG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmdsb2JhbEVsZW1lbnRzLmZpbmQoKGUpID0+IGUua2V5ID09PSBlbGVtZW50S2V5KT8ucHJvZmlsZTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRDc3NQcm9wZXJ0aWVzRm9yUHJvZmlsZShwcm9maWxlLCB0aGlzLmdsb2JhbFNob3dBbGxQcm9wZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gdGhpcy5nbG9iYWxTYW1wbGVGaWVsZDtcclxuICAgICAgICBjb25zdCB2YWxvcml6ZWQ6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHNhbXBsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXAgPSBkZWNvZGVGbG9hdGluZ01hcChnZXRFZmZlY3RpdmVTdHlsZU1hcChzYW1wbGUpKTtcclxuICAgICAgICAgICAgcmVzb2x2ZUdsb2JhbEVsZW1lbnRLZXlzKHNhbXBsZSwgZWxlbWVudEtleSkuZm9yRWFjaCgocmVhbEtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcGFyc2VDc3NEZWNsYXJhdGlvbnMobWFwW3JlYWxLZXkgKyB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVdID8/ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKChkKSA9PiB7IGlmICghdmFsb3JpemVkLmluY2x1ZGVzKGQucHJvcCkpIHsgdmFsb3JpemVkLnB1c2goZC5wcm9wKTsgfSB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykuZm9yRWFjaCgoZW50cnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzICYmIHBhcnRzWzBdID09PSBlbGVtZW50S2V5ICYmIHBhcnRzWzFdID09PSB0aGlzLmdsb2JhbFNlbGVjdGVkU3RhdGVcclxuICAgICAgICAgICAgICAgICYmIHRoaXMuZ2xvYmFsT3ZlcnJpZGVzW2VudHJ5XSAmJiAhdmFsb3JpemVkLmluY2x1ZGVzKHBhcnRzWzJdKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JpemVkLnB1c2gocGFydHNbMl0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucHVzaFZhbG9yaXplZChyZXN1bHQsIHZhbG9yaXplZCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnbG9iYWxTZXRQcm9wZXJ0aWVzQ291bnQoZWxlbWVudEtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHApID0+IHRoaXMuaXNHbG9iYWxQcm9wZXJ0eVNldChlbGVtZW50S2V5LCBwLnByb3ApKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFNjaGVkYSBcIkdyYWZpY2EgZ2xvYmFsZVwiXHJcblxyXG4gICAgLy8jcmVnaW9uIExldHR1cmEvc2NyaXR0dXJhIHByb3ByaWV0w6AgcGVyIHRpcG9sb2dpYVxyXG5cclxuICAgIC8qKiBDaGlhdmUgZGVsbGEgbWFwcGEgc3RpbGk6IFwiRWxlbWVudG9cIiArIFwiU3RhdG9cIiAoZXMuIElucHV0Rm9jdXNlZCkgKi9cclxuICAgIHN0eWxlS2V5KGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRLZXkgKyBncm91cC5zZWxlY3RlZFN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcHJpZXTDoCBtb3N0cmF0ZSBwZXIgdW4gZWxlbWVudG86IHF1ZWxsZSBkaSBiYXNlLCBwacO5IHF1ZWxsZSBnacOgIHZhbG9yaXp6YXRlXHJcbiAgICAgKiAoYW5jaGUgc2Ugc2NyaXR0ZSBhIG1hbm8gZSBmdW9yaSBjYXRhbG9nbyksIHBpw7kgdHV0dGUgbGUgYWx0cmUgc2UgcmljaGllc3RvLlxyXG4gICAgICovXHJcbiAgICBwcm9wZXJ0aWVzRm9yKGdyb3VwOiBGaWVsZFN0eWxlR3JvdXAsIGVsZW1lbnRLZXk6IHN0cmluZyk6IEFycmF5PENzc1Byb3BlcnR5RGVmPiB7XHJcbiAgICAgICAgY29uc3QgY3NzID0gZ3JvdXAuc3R5bGVNYXBbdGhpcy5zdHlsZUtleShncm91cCwgZWxlbWVudEtleSldID8/ICcnO1xyXG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBncm91cC5lbGVtZW50cy5maW5kKChlKSA9PiBlLmtleSA9PT0gZWxlbWVudEtleSk/LnByb2ZpbGU7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0Q3NzUHJvcGVydGllc0ZvclByb2ZpbGUocHJvZmlsZSwgZ3JvdXAuc2hvd0FsbFByb3BlcnRpZXMpO1xyXG5cclxuICAgICAgICB0aGlzLnB1c2hWYWxvcml6ZWQocmVzdWx0LCBwYXJzZUNzc0RlY2xhcmF0aW9ucyhjc3MpLm1hcCgoZCkgPT4gZC5wcm9wKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1c2hWYWxvcml6ZWQocmVzdWx0OiBBcnJheTxDc3NQcm9wZXJ0eURlZj4sIHZhbG9yaXplZDogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHZhbG9yaXplZC5mb3JFYWNoKChwcm9wKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc29tZSgocCkgPT4gcC5wcm9wID09PSBwcm9wKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNhdGFsb2d1ZWQgPSBnZXRDc3NQcm9wZXJ0eURlZihwcm9wKTtcclxuICAgICAgICAgICAgaWYgKGNhdGFsb2d1ZWQpIHsgcmVzdWx0LnB1c2goY2F0YWxvZ3VlZCk7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVByb3BlcnR5RGVmc1twcm9wXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXN0b21Qcm9wZXJ0eURlZnNbcHJvcF0gPSBidWlsZEN1c3RvbUNzc1Byb3BlcnR5RGVmKHByb3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3VzdG9tUHJvcGVydHlEZWZzW3Byb3BdKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQcm9wZXJ0aWVzQ291bnQoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VDc3NEZWNsYXJhdGlvbnMoZ3JvdXAuc3R5bGVNYXBbdGhpcy5zdHlsZUtleShncm91cCwgZWxlbWVudEtleSldID8/ICcnKS5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvcGVydHlWYWx1ZShncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGdldENzc0RlY2xhcmF0aW9uKGdyb3VwLnN0eWxlTWFwW3RoaXMuc3R5bGVLZXkoZ3JvdXAsIGVsZW1lbnRLZXkpXSA/PyAnJywgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvcGVydHlWYWx1ZShncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuc3R5bGVLZXkoZ3JvdXAsIGVsZW1lbnRLZXkpO1xyXG4gICAgICAgIGNvbnN0IGNsZWFuID0gKHZhbHVlID8/ICcnKS50cmltKCk7XHJcblxyXG4gICAgICAgIHRoaXMud3JpdGVJbnRvTWFwKGdyb3VwLnN0eWxlTWFwLCBrZXksIHByb3AsIGNsZWFuKTtcclxuICAgICAgICBncm91cC5vdmVycmlkZXNbYCR7a2V5fXwke3Byb3AudG9Mb3dlckNhc2UoKX1gXSA9IGNsZWFuO1xyXG4gICAgICAgIHRoaXMuc3R5bGVWZXJzaW9uKys7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRQcm9wZXJ0eShncm91cDogRmllbGRTdHlsZUdyb3VwLCBlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShncm91cCwgZWxlbWVudEtleSwgcHJvcCwgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzUHJvcGVydHlTZXQoZ3JvdXA6IEZpZWxkU3R5bGVHcm91cCwgZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLmdldFByb3BlcnR5VmFsdWUoZ3JvdXAsIGVsZW1lbnRLZXksIHByb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBMZXR0dXJhL3Njcml0dHVyYSBwcm9wcmlldMOgIHBlciB0aXBvbG9naWFcclxuXHJcbiAgICAvLyNyZWdpb24gQ29udHJvbGxpIGNvbG9yZSBlIG1pc3VyYVxyXG5cclxuICAgIGNvbG9ySGV4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gY3NzQ29sb3JUb0hleCh2YWx1ZSk7IH1cclxuICAgIGNvbG9yQWxwaGEodmFsdWU6IHN0cmluZyk6IG51bWJlciB7IHJldHVybiBjc3NDb2xvclRvQWxwaGFQZXJjZW50KHZhbHVlKTsgfVxyXG4gICAgYnVpbGRDb2xvcihoZXg6IHN0cmluZywgYWxwaGE6IG51bWJlcik6IHN0cmluZyB7IHJldHVybiBidWlsZENzc0NvbG9yKGhleCwgTnVtYmVyKGFscGhhKSk7IH1cclxuXHJcbiAgICAvKiogUGFydGUgbnVtZXJpY2EgZGkgdW5hIG1pc3VyYSAoXCIxNHB4XCIgLT4gMTQpOyBpbCBtaW5pbW8gZGVsIGNhdGFsb2dvIHNlIG5vbiBpbXBvc3RhdGEgKi9cclxuICAgIHNpemVOdW1iZXIodmFsdWU6IHN0cmluZywgZGVmaW5pdGlvbjogQ3NzUHJvcGVydHlEZWYpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgIGlmIChpc05hTihwYXJzZWQpKSB7IHJldHVybiBkZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/PyBkZWZpbml0aW9uLm1pbiA/PyAwOyB9XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFNpemUoZGVmaW5pdGlvbjogQ3NzUHJvcGVydHlEZWYsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT0gbnVsbCB8fCBpc05hTihudW1lcmljKSkgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICByZXR1cm4gYCR7bnVtZXJpY30ke2RlZmluaXRpb24udW5pdCA/PyAnJ31gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBDb250cm9sbGkgY29sb3JlIGUgbWlzdXJhXHJcblxyXG4gICAgLy8jcmVnaW9uIEFwcGxpY2F6aW9uZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUml2ZXJzYSBzdWkgY2FtcGkgc2VsZXppb25hdGkgc29sdGFudG8gbGUgcHJvcHJpZXTDoCBlZmZldHRpdmFtZW50ZSB0b2NjYXRlOiBwcmltYSBxdWVsbGVcclxuICAgICAqIGdsb2JhbGksIHBvaSBxdWVsbGUgZGVsbGEgc2luZ29sYSB0aXBvbG9naWEsIGNoZSBxdWluZGkgaGFubm8gbGEgcHJlY2VkZW56YS4gVHV0dGUgbGUgYWx0cmVcclxuICAgICAqIHJlZ29sZSBnacOgIHByZXNlbnRpIHN1aSBzaW5nb2xpIGNhbXBpIHJlc3Rhbm8gaW50YXR0ZS5cclxuICAgICAqL1xyXG4gICAgYXBwbHkoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IHRoaXMuY29sbGVjdFdyaXRlVGFyZ2V0cygpO1xyXG4gICAgICAgIHRoaXMuYWJzb3JiTGVnYWN5V2hlcmVOZWVkZWQodGFyZ2V0cyk7XHJcblxyXG4gICAgICAgIHRhcmdldHMuZm9yRWFjaCgod3JpdGVzLCBmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXAgPSBlbnN1cmVGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKCFtYXApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICAgIHdyaXRlcy5mb3JFYWNoKCh2YWx1ZSwgZW50cnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsga2V5LCBwcm9wIH0gPSB0aGlzLnNwbGl0RW50cnkoZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgLy8gUGFzc2EgZGEgcmVhZFN0eWxlQ3NzL3dyaXRlU3R5bGVDc3M6IGxlIGNoaWF2aSBcIuKAplNvbGxldmF0YVwiIHNvbm8gdmlydHVhbGlcclxuICAgICAgICAgICAgICAgIHdyaXRlU3R5bGVDc3MobWFwLCBrZXksIHNldENzc0RlY2xhcmF0aW9uKHJlYWRTdHlsZUNzcyhtYXAsIGtleSksIHByb3AsIHZhbHVlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNwYW5kZSBsZSBtb2RpZmljaGUgaW4gc29zcGVzbyBpbiBzY3JpdHR1cmUgY29uY3JldGUgcGVyIGNhbXBvOiBwcmltYSBxdWVsbGUgZ2xvYmFsaSxcclxuICAgICAqIHBvaSBxdWVsbGUgZGVsbGEgc2luZ29sYSB0aXBvbG9naWEsIGNoZSBxdWluZGkgaGFubm8gbGEgcHJlY2VkZW56YS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb2xsZWN0V3JpdGVUYXJnZXRzKCk6IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXRzID0gbmV3IE1hcDxCYXNlRmllbGQsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XHJcbiAgICAgICAgY29uc3Qgbm90ZSA9IChmaWVsZDogQmFzZUZpZWxkLCBrZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0cy5oYXMoZmllbGQpKSB7IHRhcmdldHMuc2V0KGZpZWxkLCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpKTsgfVxyXG4gICAgICAgICAgICB0YXJnZXRzLmdldChmaWVsZCkuc2V0KGAke2tleX18JHtwcm9wfWAsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnN0eWxlYWJsZUZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlRGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoZmllbGQ/LkZpZWxkVHlwZSk7XHJcbiAgICAgICAgICAgIGlmICghdHlwZURlZikgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2xvYmFsT3ZlcnJpZGVzKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBlbnRyeS5zcGxpdCgnfCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IFtnbG9iYWxLZXksIHN0YXRlLCBwcm9wXSA9IHBhcnRzO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlRGVmLnN0YXRlcy5zb21lKChzKSA9PiBzLmtleSA9PT0gc3RhdGUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmVHbG9iYWxFbGVtZW50S2V5cyhmaWVsZCwgZ2xvYmFsS2V5KS5mb3JFYWNoKChyZWFsS2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm90ZShmaWVsZCwgcmVhbEtleSArIHN0YXRlLCBwcm9wLCB0aGlzLmdsb2JhbE92ZXJyaWRlc1tlbnRyeV0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhncm91cC5vdmVycmlkZXMpLmZvckVhY2goKGVudHJ5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcCB9ID0gdGhpcy5zcGxpdEVudHJ5KGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gbm90ZShmaWVsZCwga2V5LCBwcm9wLCBncm91cC5vdmVycmlkZXNbZW50cnldKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElsIENTUyBsZWdhY3kgdmllbmUgYXBwbGljYXRvIGRhaSB0ZW1wbGF0ZSBjb21lIHN0aWxlIGlubGluZSBlIGJhdHRlcmViYmUgbGUgcmVnb2xlXHJcbiAgICAgKiBpbmlldHRhdGU6IGRvdmUgbCdlZGl0b3Igc3RhIHBlciBzY3JpdmVyZSwgbG8gc2kgYXNzb3JiZSBuZWxsYSBtYXBwYSBwZXIgZWxlbWVudG8gZVxyXG4gICAgICogc2kgYXp6ZXJhIGxhIHByb3ByaWV0w6AgbGVnYWN5LiBSZXN0YW5vIGludGF0dGUgbGUgcHJvcHJpZXTDoCBsZWdhY3kgc3UgZWxlbWVudGkgbm9uIHRvY2NhdGkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWJzb3JiTGVnYWN5V2hlcmVOZWVkZWQodGFyZ2V0czogTWFwPEJhc2VGaWVsZCwgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcclxuICAgICAgICB0YXJnZXRzLmZvckVhY2goKHdyaXRlcywgZmllbGQpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLndyaXRlcy5rZXlzKCldLm1hcCgoZSkgPT4gdGhpcy5zcGxpdEVudHJ5KGUpLmtleSkpO1xyXG5cclxuICAgICAgICAgICAgKFsnTGFiZWxzdHlsZUNTUycsICdGaWVsZHN0eWxlQ1NTJ10gYXMgQXJyYXk8J0xhYmVsc3R5bGVDU1MnIHwgJ0ZpZWxkc3R5bGVDU1MnPikuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3NzID0gKGZpZWxkIGFzIGFueSlbbmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNzcyB8fCAhU3RyaW5nKGNzcykudHJpbSgpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGxlZ2FjeVRhcmdldEtleShmaWVsZCwgbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgeyByZXR1cm47IH1cclxuICAgICAgICAgICAgICAgIC8vIFwiRGVzY3JpemlvbmVcIiBjb3ByZSBhbmNoZSBsZSBzdWUgdmFyaWFudGkgKG5lbCBjb250ZW5pdG9yZSAvIHN1bCBib3JkbylcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0YXJnZXQuc2xpY2UoMCwgLSdOb3JtYWxlJy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFbLi4ua2V5c10uc29tZSgoaykgPT4gay5zdGFydHNXaXRoKHRhcmdldEVsZW1lbnQpKSkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBlbnN1cmVGaWVsZFN0eWxlTWFwKGZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWFwKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChtZXJnZUxlZ2FjeVN0eWxlc0ludG9NYXAoZmllbGQsIG1hcCwgbmFtZSkuY29uc3VtZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIChmaWVsZCBhcyBhbnkpW25hbWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoYXNDaGFuZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICB8fCB0aGlzLmdyb3Vwcy5zb21lKChnKSA9PiBPYmplY3Qua2V5cyhnLm92ZXJyaWRlcykubGVuZ3RoID4gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNoYW5nZXNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbE92ZXJyaWRlcykubGVuZ3RoXHJcbiAgICAgICAgICAgICsgdGhpcy5ncm91cHMucmVkdWNlKChuLCBnKSA9PiBuICsgT2JqZWN0LmtleXMoZy5vdmVycmlkZXMpLmxlbmd0aCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIEFwcGxpY2F6aW9uZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTdHJhdG8gY29tdW5lIGFsbGUgZHVlIHNjaGVkZVxyXG4gICAgLy8gSWwgdGVtcGxhdGUgZGVsbGUgcmlnaGUtcHJvcHJpZXTDoCDDqCB1bmljbzogcXVlc3RlIHByb3ByaWV0w6AgaW5zdHJhZGFubyBsZXR0dXJhIGVcclxuICAgIC8vIHNjcml0dHVyYSBzdWxsYSBzY2hlZGEgYXR0aXZhLCBldml0YW5kbyBkaSBkdXBsaWNhcmUgaWwgbWFya3VwIGRlaSBjb250cm9sbGkuXHJcblxyXG4gICAgZ2V0IGN1cnJlbnRFbGVtZW50cygpOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBwcm9maWxlPzogQ3NzRWxlbWVudFByb2ZpbGUgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxFbGVtZW50cyA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5lbGVtZW50cyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTdGF0ZXMoKTogQXJyYXk8RmllbGRTdHlsZUVudHJ5RGVmPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFN0YXRlcyA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5kZWYuc3RhdGVzID8/IFtdKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudFNlbGVjdGVkU3RhdGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuZ2xvYmFsU2VsZWN0ZWRTdGF0ZSA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5zZWxlY3RlZFN0YXRlID8/ICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRDdXJyZW50U3RhdGUoc3RhdGVLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHRoaXMuc2VsZWN0R2xvYmFsU3RhdGUoc3RhdGVLZXkpOyByZXR1cm47IH1cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVHcm91cCkgeyB0aGlzLnNlbGVjdFN0YXRlKHRoaXMuYWN0aXZlR3JvdXAsIHN0YXRlS2V5KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50T3BlbkVsZW1lbnQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuZ2xvYmFsT3BlbkVsZW1lbnQgOiAodGhpcy5hY3RpdmVHcm91cD8ub3BlbkVsZW1lbnQgPz8gJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZUN1cnJlbnRFbGVtZW50KGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHRoaXMudG9nZ2xlR2xvYmFsRWxlbWVudChlbGVtZW50S2V5KTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy50b2dnbGVFbGVtZW50KHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXkpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTaG93QWxsUHJvcGVydGllcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuZ2xvYmFsU2hvd0FsbFByb3BlcnRpZXMgOiAodGhpcy5hY3RpdmVHcm91cD8uc2hvd0FsbFByb3BlcnRpZXMgPz8gZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZUN1cnJlbnRTaG93QWxsKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHRoaXMuZ2xvYmFsU2hvd0FsbFByb3BlcnRpZXMgPSAhdGhpcy5nbG9iYWxTaG93QWxsUHJvcGVydGllczsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5hY3RpdmVHcm91cC5zaG93QWxsUHJvcGVydGllcyA9ICF0aGlzLmFjdGl2ZUdyb3VwLnNob3dBbGxQcm9wZXJ0aWVzOyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZhbHNlIHBlciBnbGkgZWxlbWVudGkgY29uIHVuIGVsZW5jbyBkaSBwcm9wcmlldMOgIGNoaXVzbyAobmllbnRlIFwiQWx0cmUgcHJvcHJpZXTDoC4uLlwiKSAqL1xyXG4gICAgcm93SGFzTW9yZVByb3BlcnRpZXMoZWxlbWVudEtleTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgcHJvZmlsZTogQ3NzRWxlbWVudFByb2ZpbGUgfCB1bmRlZmluZWQgPSB0aGlzLmN1cnJlbnRFbGVtZW50cy5maW5kKChlKSA9PiBlLmtleSA9PT0gZWxlbWVudEtleSk/LnByb2ZpbGU7XHJcbiAgICAgICAgcmV0dXJuICFwcm9maWxlPy5vbmx5O1xyXG4gICAgfVxyXG5cclxuICAgIHJvd1Byb3BlcnRpZXMoZWxlbWVudEtleTogc3RyaW5nKTogQXJyYXk8Q3NzUHJvcGVydHlEZWY+IHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyByZXR1cm4gdGhpcy5nbG9iYWxQcm9wZXJ0aWVzRm9yKGVsZW1lbnRLZXkpOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlR3JvdXAgPyB0aGlzLnByb3BlcnRpZXNGb3IodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByb3dDb3VudChlbGVtZW50S2V5OiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHJldHVybiB0aGlzLmdsb2JhbFNldFByb3BlcnRpZXNDb3VudChlbGVtZW50S2V5KTsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUdyb3VwID8gdGhpcy5zZXRQcm9wZXJ0aWVzQ291bnQodGhpcy5hY3RpdmVHcm91cCwgZWxlbWVudEtleSkgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBWYWxvcmUgaW1wb3N0YXRvIGRpcmV0dGFtZW50ZSBzdWxsJ2VsZW1lbnRvLCBzZW56YSBlcmVkaXTDoCAqL1xyXG4gICAgcHJpdmF0ZSByb3dHZXRPd24oZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnKSB7IHJldHVybiB0aGlzLmdldEdsb2JhbFByb3BlcnR5VmFsdWUoZWxlbWVudEtleSwgcHJvcCk7IH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVHcm91cCA/IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmFjdGl2ZUdyb3VwLCBlbGVtZW50S2V5LCBwcm9wKSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlIG1vc3RyYXRvIGEgdmlkZW8uIFwiRXRpY2hldHRhIHN1bCBib3Jkb1wiIHBhcnRlIGRhbGxhIGdyYWZpY2EgZGkgXCJFdGljaGV0dGEgbmVsXHJcbiAgICAgKiBjb250ZW5pdG9yZVwiIGUgc292cmFzY3JpdmUgc29sbyBjacOyIGNoZSB2aSDDqCBpbXBvc3RhdG86IGRvdmUgbm9uIGhhIHVuIHZhbG9yZSBwcm9wcmlvXHJcbiAgICAgKiBtb3N0cmEgcXVlbGxvIGVyZWRpdGF0bywgY29zw6wgbG8gc3BlY2NoaWV0dG8gcmlmbGV0dGUgY2nDsiBjaGUgc2kgdmVkZSBpbiBhbnRlcHJpbWEuXHJcbiAgICAgKi9cclxuICAgIHJvd0dldChlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgb3duID0gdGhpcy5yb3dHZXRPd24oZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICAgICAgaWYgKG93bikgeyByZXR1cm4gb3duOyB9XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuaW5oZXJpdGFuY2VTb3VyY2VLZXkoZWxlbWVudEtleSk7XHJcbiAgICAgICAgcmV0dXJuIGJhc2UgPyB0aGlzLnJvd0dldE93bihiYXNlLCBwcm9wKSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFbGVtZW50byBkYSBjdWkgXCLigKZTb2xsZXZhdGFcIiBlcmVkaXRhIChsYSBjaGlhdmUgYmFzZSksIG51bGwgcGVyIGdsaSBhbHRyaSAqL1xyXG4gICAgcHJpdmF0ZSBpbmhlcml0YW5jZVNvdXJjZUtleShlbGVtZW50S2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50S2V5ID8/ICcnKS5lbmRzV2l0aCgnU29sbGV2YXRhJykpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgICAgICBjb25zdCBiYXNlID0gZWxlbWVudEtleS5zbGljZSgwLCAtJ1NvbGxldmF0YScubGVuZ3RoKTtcclxuICAgICAgICByZXR1cm4gYmFzZSA9PT0gJ0V0aWNoZXR0YScgPyAnRXRpY2hldHRhUmlwb3NvJyA6IGJhc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcm93SXNJbmhlcml0ZWQoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMucm93R2V0T3duKGVsZW1lbnRLZXksIHByb3ApICYmICEhdGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScpIHsgdGhpcy5zZXRHbG9iYWxQcm9wZXJ0eVZhbHVlKGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlR3JvdXApIHsgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYWN0aXZlR3JvdXAsIGVsZW1lbnRLZXksIHByb3AsIHZhbHVlKTsgfVxyXG4gICAgfVxyXG5cclxuICAgIHJvd0lzU2V0KGVsZW1lbnRLZXk6IHN0cmluZywgcHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5yb3dHZXRPd24oZWxlbWVudEtleSwgcHJvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93UmVzZXQoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBwcm9wLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbG9yZTogbGEgcGFzdGlnbGlhIGUgbG8gc2xpZGVyIGxhdm9yYW5vIGluc2llbWUgc3VsbG8gc3Rlc3NvIHZhbG9yZSAqL1xyXG4gICAgcm93U2V0Q29sb3JIZXgoZWxlbWVudEtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIGhleDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxwaGEgPSB0aGlzLmNvbG9yQWxwaGEodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIGFscGhhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcm93U2V0Q29sb3JBbHBoYShlbGVtZW50S2V5OiBzdHJpbmcsIHByb3A6IHN0cmluZywgYWxwaGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMuY29sb3JIZXgodGhpcy5yb3dHZXQoZWxlbWVudEtleSwgcHJvcCkpO1xyXG4gICAgICAgIHRoaXMucm93U2V0KGVsZW1lbnRLZXksIHByb3AsIHRoaXMuYnVpbGRDb2xvcihoZXgsIE51bWJlcihhbHBoYSkpKTtcclxuICAgIH1cclxuXHJcbiAgICByb3dTZXRTaXplKGVsZW1lbnRLZXk6IHN0cmluZywgZGVmaW5pdGlvbjogQ3NzUHJvcGVydHlEZWYsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJvd1NldChlbGVtZW50S2V5LCBkZWZpbml0aW9uLnByb3AsIHRoaXMuYnVpbGRTaXplKGRlZmluaXRpb24sIHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFN0cmF0byBjb211bmUgYWxsZSBkdWUgc2NoZWRlXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYSBjb211bmVcclxuXHJcbiAgICBnZXQgY3VycmVudFNhbXBsZUZpZWxkcygpOiBBcnJheTxCYXNlRmllbGQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJyA/IHRoaXMuc3R5bGVhYmxlRmllbGRzIDogKHRoaXMuYWN0aXZlR3JvdXA/LmZpZWxkcyA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRTYW1wbGVJbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2dsb2JhbGUnID8gdGhpcy5nbG9iYWxTYW1wbGVJbmRleCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5zYW1wbGVJbmRleCA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDdXJyZW50U2FtcGxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICdnbG9iYWxlJykgeyB0aGlzLmNoYW5nZUdsb2JhbFNhbXBsZShpbmRleCk7IHJldHVybjsgfVxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUdyb3VwKSB7IHRoaXMuY2hhbmdlU2FtcGxlKHRoaXMuYWN0aXZlR3JvdXAsIGluZGV4KTsgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjdXJyZW50UHJldmlld0ZpZWxkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdGaWVsZCA6ICh0aGlzLmFjdGl2ZUdyb3VwPy5wcmV2aWV3RmllbGQgPz8gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRQcmV2aWV3UmVjb3JkKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnZ2xvYmFsZScgPyB0aGlzLmdsb2JhbFByZXZpZXdSZWNvcmQgOiAodGhpcy5hY3RpdmVHcm91cD8ucHJldmlld1JlY29yZCA/PyBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVGlwb2xvZ2lhIGRlbCBjYW1wbyBtb3N0cmF0byBpbiBhbnRlcHJpbWEsIHBlciBzY2VnbGllcmUgaWwgdGVtcGxhdGUgZ2l1c3RvICovXHJcbiAgICBnZXQgY3VycmVudFByZXZpZXdUeXBlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmN1cnJlbnRQcmV2aWV3RmllbGQ/LkZpZWxkVHlwZSA/PyAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQW50ZXByaW1hIGNvbXVuZVxyXG5cclxuICAgIC8vI3JlZ2lvbiBVdGlsaXTDoFxyXG5cclxuICAgIC8qKiBTY3JpdmUgKG8gcmltdW92ZSwgc2UgaWwgdmFsb3JlIMOoIHZ1b3RvKSB1bmEgcHJvcHJpZXTDoCBkZW50cm8gdW5hIG1hcHBhIHN0aWxpICovXHJcbiAgICBwcml2YXRlIHdyaXRlSW50b01hcChtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sIGtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkID0gc2V0Q3NzRGVjbGFyYXRpb24obWFwW2tleV0gPz8gJycsIHByb3AsIHZhbHVlKTtcclxuICAgICAgICBpZiAodXBkYXRlZCkge1xyXG4gICAgICAgICAgICBtYXBba2V5XSA9IHVwZGF0ZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmltb3NzYSBkZWwgdHV0dG86IGlsIEpTT04gc2FsdmF0byByZXN0YSBjb21wYXR0b1xyXG4gICAgICAgICAgICBkZWxldGUgbWFwW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3BsaXRFbnRyeShlbnRyeTogc3RyaW5nKTogeyBrZXk6IHN0cmluZzsgcHJvcDogc3RyaW5nIH0ge1xyXG4gICAgICAgIGNvbnN0IGkgPSBlbnRyeS5sYXN0SW5kZXhPZignfCcpO1xyXG4gICAgICAgIHJldHVybiB7IGtleTogZW50cnkuc2xpY2UoMCwgaSksIHByb3A6IGVudHJ5LnNsaWNlKGkgKyAxKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQnlQcm9wKF9pbmRleDogbnVtYmVyLCBkZWZpbml0aW9uOiBDc3NQcm9wZXJ0eURlZik6IHN0cmluZyB7IHJldHVybiBkZWZpbml0aW9uLnByb3A7IH1cclxuICAgIHRyYWNrQnlLZXkoX2luZGV4OiBudW1iZXIsIGVudHJ5OiB7IGtleTogc3RyaW5nIH0pOiBzdHJpbmcgeyByZXR1cm4gZW50cnkua2V5OyB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uIFV0aWxpdMOgXHJcblxyXG4gICAgLy8jcmVnaW9uIEFudGVwcmltYVxyXG5cclxuICAgIC8qKiBDcmVhIGlsIGNhbXBvIGZpdHRpemlvIGRlbGwnYW50ZXByaW1hIGFnZ2FuY2lhbmRvZ2xpIGxhIG1hcHBhIHN0aWxpIHBhc3NhdGEgKi9cclxuICAgIHByaXZhdGUgYnVpbGRQcmV2aWV3RmllbGQoc291cmNlOiBCYXNlRmllbGQsIHN0eWxlTWFwOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBvcGVuRWxlbWVudDogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBjb25zdCBjbG9uZSA9IHRoaXMuc2FmZUNsb25lKHNvdXJjZSk7XHJcbiAgICAgICAgY29uc3QgZGVmID0gZ2V0RmllbGRTdHlsZVR5cGVEZWYoY2xvbmUuRmllbGRUeXBlKTtcclxuICAgICAgICAvLyBJIHRlbXBsYXRlIGxlZ2dvbm8gaWwgZm9ybWF0byBzYWx2YXRvOiBsZSBjaGlhdmkgdmlydHVhbGkgdmFubm8gcmljb2RpZmljYXRlXHJcbiAgICAgICAgaWYgKGRlZikgeyAoY2xvbmUgYXMgYW55KVtkZWYuc3R5bGVQcm9wXSA9IGVuY29kZUZsb2F0aW5nTWFwKHN0eWxlTWFwKTsgfVxyXG5cclxuICAgICAgICAvLyBJbCBsZWdhY3kgZScgZ2lhJyBkZW50cm8gc3R5bGVNYXA6IGxhc2NpYXJsbyBxdWkgbG8gcmlhcHBsaWNoZXJlYmJlIGlubGluZSxcclxuICAgICAgICAvLyBjb3ByZW5kbyBsZSByZWdvbGUgaW5pZXR0YXRlIGUgbW9zdHJhbmRvIHVuJ2FudGVwcmltYSBmYWxzYVxyXG4gICAgICAgIGNsb25lLkxhYmVsc3R5bGVDU1MgPSBudWxsO1xyXG4gICAgICAgIGNsb25lLkZpZWxkc3R5bGVDU1MgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBjb250cm9sTmFtZSA9IGNsb25lLkxhYmVsIHx8ICdwcmV2aWV3X2ZpZWxkJztcclxuICAgICAgICBjbG9uZS5OYW1lID0gY29udHJvbE5hbWU7XHJcblxyXG4gICAgICAgIC8vIEEgcmlwb3NvIGxhIGxhYmVsIHN0YSBuZWwgY29udGVuaXRvcmUgc29sbyBzZSBpbCBjYW1wbyDDqCB2dW90bzogdmlhIHZhbG9yZVxyXG4gICAgICAgIC8vIHByZWRlZmluaXRvIGUgZm9ybXVsYSwgYWx0cmltZW50aSBpIHRlbXBsYXRlIHJpZW1waXJlYmJlcm8gbCdhbnRlcHJpbWFcclxuICAgICAgICBpZiAodGhpcy5wcmV2aWV3TGFiZWxNb2RlKG9wZW5FbGVtZW50KSA9PT0gJ3JpcG9zbycpIHtcclxuICAgICAgICAgICAgaWYgKGNsb25lLkRhdGFHZXR0ZXIpIHsgY2xvbmUuRGF0YUdldHRlciA9IHsgLi4uY2xvbmUuRGF0YUdldHRlciwgRGF0YUdldHRlclZhbHVlOiBudWxsIH07IH1cclxuICAgICAgICAgICAgY2xvbmUuRm9ybXVsYSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXBhcmVUeXBlU3BlY2lmaWNQcmV2aWV3KGNsb25lKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdGhpcy5nZXRQcmV2aWV3SW5pdGlhbFZhbHVlKGNsb25lLCBvcGVuRWxlbWVudCk7XHJcbiAgICAgICAgY2xvbmUuRm9ybUZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoeyBbY29udHJvbE5hbWVdOiBbaW5pdGlhbFZhbHVlXSB9KTtcclxuICAgICAgICByZXR1cm4gY2xvbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0byBkZWxsYSBsYWJlbCBjaGUgbCdhbnRlcHJpbWEgZGV2ZSBtb3N0cmFyZSBwZXIgbCdlbGVtZW50byBhcGVydG86IGxhIGxhYmVsIE1hdGVyaWFsXHJcbiAgICAgKiBzaSBzb2xsZXZhIHN1bCBib3JkbyBzb2xvIHNlIGlsIGNhbXBvIGhhIHVuIHZhbG9yZSwgcXVpbmRpIGwnYW50ZXByaW1hIGxvIHNpbXVsYS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcmV2aWV3TGFiZWxNb2RlKGVsZW1lbnRLZXk6IHN0cmluZyk6ICdyaXBvc28nIHwgJ3NvbGxldmF0YScgfCBudWxsIHtcclxuICAgICAgICBpZiAoKGVsZW1lbnRLZXkgPz8gJycpLmVuZHNXaXRoKCdTb2xsZXZhdGEnKSkgeyByZXR1cm4gJ3NvbGxldmF0YSc7IH1cclxuICAgICAgICBpZiAoWydEZXNjcml6aW9uZScsICdMYWJlbCcsICdFdGljaGV0dGFSaXBvc28nXS5pbmNsdWRlcyhlbGVtZW50S2V5KSkgeyByZXR1cm4gJ3JpcG9zbyc7IH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFByZXZpZXdJbml0aWFsVmFsdWUoZmllbGQ6IEJhc2VGaWVsZCwgb3BlbkVsZW1lbnQ6IHN0cmluZyA9ICcnKTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5wcmV2aWV3TGFiZWxNb2RlKG9wZW5FbGVtZW50KSA9PT0gJ3NvbGxldmF0YScpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChOdW1iZXIoZmllbGQuRmllbGRUeXBlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydDYW1wbyBkaSB0ZXN0byddOlxyXG4gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydBcmVhIGRpIHRlc3RvJ106XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUZXN0byBkaSBlc2VtcGlvJztcclxuICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnQ2FtcG8gbnVtZXJpY28nXTpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTIzO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydEYXRhIGUvbyBvcmEnXTpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRWxlbmNvIGdlbmVyaWNvJ106IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsdiA9IGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXJzID0gbHYuVmFsdWVQYWlycyA/PyB7fTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKHBhaXJzKVswXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RLZXkgPT0gbnVsbCkgeyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHBhaXJzW2ZpcnN0S2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLmlzTnVtZXJpYyhyYXcpID8gTnVtYmVyKHJhdykgOiByYXc7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx2LklzTXVsdGlDaG9pY2hlID8gW3ZhbHVlXSA6IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKE51bWJlcihmaWVsZC5GaWVsZFR5cGUpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnQWxsZWdhdG8nXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydEYXRhIGUvbyBvcmEnXTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0Jvb2xlYW5vJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRXRpY2hldHRhJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpZWxkIGFzIExhYmVsRmllbGQpLkV0aWNoZXR0YSB8fCBmaWVsZC5EZXNjcmlwdGlvbiB8fCAnVGVzdG8gZXRpY2hldHRhIGRpIGVzZW1waW8nO1xyXG4gICAgICAgICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBnZW5lcmljbyddOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuSXNNdWx0aUNob2ljaGUgPyBbXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRWxlbmNvIGltbWFnaW5pJ106XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGZpZWxkIGFzIEltYWdlU2VsZWN0b3JGaWVsZCkuSXNNdWx0aUNob2ljaGUgPyBbXSA6IG51bGw7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDb21wbGV0YSBpbCBjYW1wbyBkaSBhbnRlcHJpbWEgY29uIGkgdmFsb3JpIG1pbmltaSByaWNoaWVzdGkgZGFpIHNpbmdvbGkgdGVtcGxhdGUgKi9cclxuICAgIHByaXZhdGUgcHJlcGFyZVR5cGVTcGVjaWZpY1ByZXZpZXcoZmllbGQ6IEJhc2VGaWVsZCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAoTnVtYmVyKGZpZWxkLkZpZWxkVHlwZSkpIHtcclxuICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydBbGxlZ2F0byddOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhZiA9IGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZDtcclxuICAgICAgICAgICAgICAgIGlmICghYWYuQWxsb3dlZE1pbWVUeXBlcyB8fCBhZi5BbGxvd2VkTWltZVR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFmLkFsbG93ZWRNaW1lVHlwZXMgPSBBdmFpbGFibGVGaWxlRXh0ZW5zaW9uc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KEF2YWlsYWJsZUltYWdlRXh0ZW5zaW9ucylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZXh0KSA9PiBleHQua2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ106IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRmID0gZmllbGQgYXMgRGF0ZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRmLklzT25seURhdGUgPT0gbnVsbCkgeyBkZi5Jc09ubHlEYXRlID0gRGF0ZVRpbWVUeXBlRW51bVsnU29sbyBkYXRhJ107IH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRXRpY2hldHRhJ106IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxmID0gZmllbGQgYXMgTGFiZWxGaWVsZDtcclxuICAgICAgICAgICAgICAgIGlmICghbGYuRXRpY2hldHRhKSB7IGxmLkV0aWNoZXR0YSA9IGZpZWxkLkRlc2NyaXB0aW9uIHx8ICdUZXN0byBldGljaGV0dGEgZGkgZXNlbXBpbyc7IH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnQm9vbGVhbm8nXToge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmYgPSBmaWVsZCBhcyBCb29sZWFuRmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmYuUHJlc2V0YXRpb25UeXBlID09IG51bGwpIHsgYmYuUHJlc2V0YXRpb25UeXBlID0gQm9vbFByZXNlbnRhbnRpb0VudW0uQ2hlY2tib3g7IH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYWZlQ2xvbmU8VD4ob2JqOiBUKTogVCB7XHJcbiAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBXZWFrU2V0KCk7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqLCAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnRm9ybUZvcm1Hcm91cCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XHJcbiAgICAgICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb24gQW50ZXByaW1hXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZnZS1yb290XCI+XHJcblxyXG4gICAgPCEtLSBJbnRlc3RhemlvbmUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmdlLWhlYWRlclwiPlxyXG4gICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uIGZnZS1oZWFkZXItaWNvblwiIG5hbWU9XCJwYWxldHRlXCI+PC90bXctaWNvbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWhlYWRlci10ZXh0c1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWhlYWRlci10aXRsZVwiPkdyYWZpY2EgZGVpIGNhbXBpIHNlbGV6aW9uYXRpPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtaGVhZGVyLXN1YnRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBzdHlsZWFibGVGaWVsZHMubGVuZ3RoIH19IGNhbXBpIG1vZGlmaWNhYmlsaVxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaGFuZ2VzQ291bnQgPiAwXCI+ICZtaWRkb3Q7IHt7IGNoYW5nZXNDb3VudCB9fSBtb2RpZmljaGUgaW4gc29zcGVzbzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLWhlYWRlci1jbG9zZVwiIChjbGljayk9XCJjYW5jZWwoKVwiIG1hdFRvb2x0aXA9XCJDaGl1ZGlcIj5cclxuICAgICAgICAgICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb25cIiBuYW1lPVwieFwiPjwvdG13LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE5lc3N1bmEgdGlwb2xvZ2lhIGdlc3RpYmlsZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJmZ2UtZW1wdHlcIiAqbmdJZj1cInN0eWxlYWJsZUZpZWxkcy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICBOZXNzdW5vIGRlaSBjYW1waSBzZWxlemlvbmF0aSBoYSB1bmEgZ3JhZmljYSBjb25maWd1cmFiaWxlLlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0eWxlYWJsZUZpZWxkcy5sZW5ndGggPiAwXCI+XHJcblxyXG4gICAgICAgIDwhLS0gU2NoZWRlOiBncmFmaWNhIHZhbGlkYSBwZXIgdHV0dGkgLyBkaXZpc2EgcGVyIHRpcG9sb2dpYSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXRhYnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZ2UtdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICdnbG9iYWxlJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGFiKCdnbG9iYWxlJylcIj5cclxuICAgICAgICAgICAgICAgIEdyYWZpY2EgZ2xvYmFsZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZ2UtdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICdwZXJzb25hbGl6emF0YSdcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRhYigncGVyc29uYWxpenphdGEnKVwiPlxyXG4gICAgICAgICAgICAgICAgR3JhZmljYSBwZXJzb25hbGl6emF0YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1ib2R5XCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tI3JlZ2lvbiBDT0xPTk5BIFNJTklTVFJBIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWxlZnRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEludGVzdGF6aW9uZSBzY2hlZGEgZ2xvYmFsZSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdnbG9iYWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2Utc2NvcGUtbm90ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMZSBtb2RpZmljaGUgc2kgYXBwbGljYW5vIGEgPHN0cm9uZz50dXR0aSBpIHt7IHN0eWxlYWJsZUZpZWxkcy5sZW5ndGggfX0gY2FtcGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGV6aW9uYXRpPC9zdHJvbmc+LCBkaSBxdWFsc2lhc2kgdGlwb2xvZ2lhLiBHbGkgZWxlbWVudGkgcXVpIHNvdHRvIHNvbm8gcXVlbGxpIGNvbXVuaTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2duaSB0aXBvbG9naWEgbGkgYXBwbGljYSBhbCBwcm9wcmlvIGVsZW1lbnRvIGNvcnJpc3BvbmRlbnRlLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnRlc3RhemlvbmUgc2NoZWRhIHBlciB0aXBvbG9naWEgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGVyc29uYWxpenphdGEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS10eXBlLXRhYnNcIiAqbmdJZj1cImdyb3Vwcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXR5cGUtdGFiXCIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImkgPT09IGFjdGl2ZUdyb3VwSW5kZXhcIiAoY2xpY2spPVwic2VsZWN0R3JvdXAoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmRlZi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZ2UtdHlwZS10YWItYmFkZ2VcIj57eyBncm91cC5maWVsZHMubGVuZ3RoIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1ncm91cC1maWVsZHNcIiAqbmdJZj1cImFjdGl2ZUdyb3VwIGFzIGdyb3VwXCIgW21hdFRvb2x0aXBdPVwiZ3JvdXBGaWVsZE5hbWVzKGdyb3VwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGdyb3VwLmRlZi5sYWJlbCB9fTwvc3Ryb25nPiAmbWlkZG90OyB7eyBncm91cEZpZWxkTmFtZXMoZ3JvdXApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2Utd2FybmluZ1wiICpuZ0lmPVwiYWN0aXZlR3JvdXA/Lmhhc0RpZmZlcmVuY2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0bXctaWNvbiBjbGFzcz1cIm1hdC1pY29uXCIgbmFtZT1cImFsZXJ0LXRyaWFuZ2xlXCI+PC90bXctaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGNhbXBpIHNlbGV6aW9uYXRpIHBhcnRvbm8gZGEgZ3JhZmljaGUgZGl2ZXJzZS4gU3RhaSB2ZWRlbmRvIGkgdmFsb3JpIHJlYWxpIGRpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHNhbXBsZUZpZWxkTGFiZWwgfX08L3N0cm9uZz4g4oCUIGNhbWJpYSBjYW1wbyBkYWxsJ2FudGVwcmltYSBwZXIgdmVkZXJlIGkgc3VvaS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnJhbm5vIG1vZGlmaWNhdGUgc29sbyBsZSBwcm9wcmlldMOgIGNoZSB0b2NjaGkuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3RhdG8gc3UgY3VpIHNpIHN0YSBsYXZvcmFuZG8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXN0YXRlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLXN0YXRlcy1sYWJlbFwiPlN0YXRvPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLXN0YXRlLWNoaXBcIiAqbmdGb3I9XCJsZXQgc3RhdGUgb2YgY3VycmVudFN0YXRlczsgdHJhY2tCeTogdHJhY2tCeUtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGUgPT09IHN0YXRlLmtleVwiIChjbGljayk9XCJzZXRDdXJyZW50U3RhdGUoc3RhdGUua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzdGF0ZS5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBFbGVtZW50aSBncmFmaWNpIGUgcmVsYXRpdmUgcHJvcHJpZXTDoCAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtZWxlbWVudHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLWVsZW1lbnRcIiAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBjdXJyZW50RWxlbWVudHM7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmdlLWVsZW1lbnQtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUN1cnJlbnRFbGVtZW50KGVsZW1lbnQua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRtdy1pY29uIGNsYXNzPVwibWF0LWljb24gZmdlLWVsZW1lbnQtY2FyZXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImN1cnJlbnRPcGVuRWxlbWVudCA9PT0gZWxlbWVudC5rZXkgPyAnY2hldnJvbi1kb3duJyA6ICdjaGV2cm9uLXJpZ2h0J1wiPjwvdG13LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1lbGVtZW50LXRpdGxlXCI+e3sgZWxlbWVudC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLWVsZW1lbnQtbWlzc2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdnbG9iYWxlJyAmJiBpc0dsb2JhbEVsZW1lbnRNaXNzaW5nT25TYW1wbGUoZWxlbWVudC5rZXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSWwgY2FtcG8gbW9zdHJhdG8gaW4gYW50ZXByaW1hIG5vbiBoYSBxdWVzdG8gZWxlbWVudG86IGxhIG1vZGlmaWNhIHZhbGUgY29tdW5xdWUgcGVyIGdsaSBhbHRyaSBjYW1waVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbiBwcmVzZW50ZSBxdWlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmdlLWVsZW1lbnQtY291bnRcIiAqbmdJZj1cInJvd0NvdW50KGVsZW1lbnQua2V5KSA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3dDb3VudChlbGVtZW50LmtleSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXByb3BzXCIgKm5nSWY9XCJjdXJyZW50T3BlbkVsZW1lbnQgPT09IGVsZW1lbnQua2V5XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcm9wLXJvd1wiICpuZ0Zvcj1cImxldCBkZWZpbml0aW9uIG9mIHJvd1Byb3BlcnRpZXMoZWxlbWVudC5rZXkpOyB0cmFja0J5OiB0cmFja0J5UHJvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNldF09XCJyb3dJc1NldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWluaGVyaXRlZF09XCJyb3dJc0luaGVyaXRlZChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXByb3AtbGFiZWxcIiBbbWF0VG9vbHRpcF09XCJkZWZpbml0aW9uLnByb3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGVmaW5pdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1wcm9wLWluaGVyaXRlZFwiICpuZ0lmPVwicm93SXNJbmhlcml0ZWQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlZhbG9yZSBlcmVkaXRhdG8gZGEgJ0V0aWNoZXR0YSBuZWwgY29udGVuaXRvcmUnOiBtb2RpZmljYWxvIHF1aSBwZXIgc292cmFzY3JpdmVybG8gc29sbyBzdWwgYm9yZG9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyZWRpdGF0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJvcC1jb250cm9sXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbG9yZTogcGFzdGlnbGlhICsgb3BhY2l0w6AgKyB2YWxvcmUgdGVzdHVhbGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICdjb2xvcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImZnZS1jb2xvci1zd2F0Y2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb2xvckhleChyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwicm93U2V0Q29sb3JIZXgoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJkZWZpbml0aW9uLnByb3BcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGNsYXNzPVwiZmdlLXNsaWRlclwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdGVwPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbG9yQWxwaGEocm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInJvd1NldENvbG9yQWxwaGEoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJPcGFjaXTDoFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZnZS12YWx1ZS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwibm9uIGltcG9zdGF0b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInJvd1NldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1pc3VyYTogc2xpZGVyICsgdmFsb3JlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVmaW5pdGlvbi50eXBlID09PSAnc2l6ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBjbGFzcz1cImZnZS1zbGlkZXIgZmdlLXNsaWRlci13aWRlXCIgW21pbl09XCJkZWZpbml0aW9uLm1pblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJkZWZpbml0aW9uLm1heFwiIFtzdGVwXT1cImRlZmluaXRpb24uc3RlcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNpemVOdW1iZXIocm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApLCBkZWZpbml0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInJvd1NldFNpemUoZWxlbWVudC5rZXksIGRlZmluaXRpb24sICRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZmdlLXZhbHVlLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGVmaW5pdGlvbi5wbGFjZWhvbGRlciB8fCAnbm9uIGltcG9zdGF0bydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0dldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJyb3dTZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcCwgJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbGVuY28gZGkgdmFsb3JpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVmaW5pdGlvbi50eXBlID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZnZS1zZWxlY3RcIiBbbmdNb2RlbF09XCJyb3dHZXQoZWxlbWVudC5rZXksIGRlZmluaXRpb24ucHJvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwicm93U2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3AsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+bm9uIGltcG9zdGF0bzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBkZWZpbml0aW9uLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZXN0byBsaWJlcm8gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZpbml0aW9uLnR5cGUgPT09ICd0ZXh0J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmZ2UtdmFsdWUtaW5wdXQgZmdlLXZhbHVlLWlucHV0LXdpZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkZWZpbml0aW9uLnBsYWNlaG9sZGVyIHx8ICdub24gaW1wb3N0YXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93R2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInJvd1NldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wLCAkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS1yZXNldFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJvd0lzU2V0KGVsZW1lbnQua2V5LCBkZWZpbml0aW9uLnByb3ApXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dSZXNldChlbGVtZW50LmtleSwgZGVmaW5pdGlvbi5wcm9wKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQXp6ZXJhIHF1ZXN0YSBwcm9wcmlldMOgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dG13LWljb24gY2xhc3M9XCJtYXQtaWNvblwiIG5hbWU9XCJ4XCI+PC90bXctaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZnZS10b2dnbGUtYWxsXCIgKm5nSWY9XCJyb3dIYXNNb3JlUHJvcGVydGllcyhlbGVtZW50LmtleSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDdXJyZW50U2hvd0FsbCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudFNob3dBbGxQcm9wZXJ0aWVzID8gJ01vc3RyYSBzb2xvIGxlIHByb3ByaWV0w6AgcHJpbmNpcGFsaScgOiAnQWx0cmUgcHJvcHJpZXTDoC4uLicgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSNlbmRyZWdpb24gQ09MT05OQSBTSU5JU1RSQSAtLT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0jcmVnaW9uIENPTE9OTkEgREVTVFJBOiBhbnRlcHJpbWEgbGl2ZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1yaWdodFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZ2UtcHJldmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZnZS1wcmV2aWV3LXRpdGxlXCI+QW50ZXByaW1hPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmZ2Utc2FtcGxlLXNlbGVjdFwiICpuZ0lmPVwiY3VycmVudFNhbXBsZUZpZWxkcy5sZW5ndGggPiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY3VycmVudFNhbXBsZUluZGV4XCIgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlQ3VycmVudFNhbXBsZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGYgb2YgY3VycmVudFNhbXBsZUZpZWxkczsgbGV0IGkgPSBpbmRleFwiIFtuZ1ZhbHVlXT1cImlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRpc3BsYXlOYW1lKGYpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZnZS1wcmV2aWV3LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU3RhdG8gbW9zdHJhdG86IDxzdHJvbmc+e3sgY3VycmVudFNlbGVjdGVkU3RhdGUgfX08L3N0cm9uZz4gJm1pZGRvdDtcclxuICAgICAgICAgICAgICAgICAgICBpbCBjYW1wbyBzY2VsdG8gc2VydmUgc29sbyBkYSBlc2VtcGlvXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmdlLXByZXZpZXctY2FudmFzXCIgKm5nSWY9XCJjdXJyZW50UHJldmlld0ZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHQtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0NhbXBvIGRpIHRlc3RvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RleHQtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnQXJlYSBkaSB0ZXN0byddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG51bWVyaWMtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0NhbXBvIG51bWVyaWNvJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L251bWVyaWMtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxib29sZWFuLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydCb29sZWFubyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9ib29sZWFuLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGF0ZS1maWVsZC10ZW1wbGF0ZSAqbmdJZj1cImN1cnJlbnRQcmV2aWV3VHlwZSA9PT0gRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY3VycmVudFByZXZpZXdGaWVsZFwiIFtyZWNvcmRdPVwiY3VycmVudFByZXZpZXdSZWNvcmRcIiBbaW5Db25maWddPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCIgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2RhdGUtZmllbGQtdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxhdHRhY2htZW50LWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydBbGxlZ2F0byddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hdHRhY2htZW50LWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0V0aWNoZXR0YSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbC1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGxpc3QtdmFsdWUtZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBnZW5lcmljbyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saXN0LXZhbHVlLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UtZmllbGQtc2VsZWN0b3ItdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBpbW1hZ2luaSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVWZXJzaW9uXT1cInN0eWxlVmVyc2lvblwiIFtmb3JjZVN0YXRlXT1cImN1cnJlbnRTZWxlY3RlZFN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9pbWFnZS1maWVsZC1zZWxlY3Rvci10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGFjdGlvbi1idXR0b24tZmllbGQtdGVtcGxhdGUgKm5nSWY9XCJjdXJyZW50UHJldmlld1R5cGUgPT09IEZpZWxkVHlwZUVudW1bJ0JvdHRvbmUnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjdXJyZW50UHJldmlld0ZpZWxkXCIgW3JlY29yZF09XCJ7fVwiIFtpbkNvbmZpZ109XCJ0cnVlXCIgW3N0eWxlVmVyc2lvbl09XCJzdHlsZVZlcnNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VTdGF0ZV09XCJjdXJyZW50U2VsZWN0ZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uLWJ1dHRvbi1maWVsZC10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGltYWdlLWZpZWxkLXRlbXBsYXRlICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW5kUG9pbnRDb25maWd1cmF0aW9uXT1cImVuZFBvaW50Q29uZmlndXJhdGlvblwiIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ltYWdlLWZpZWxkLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2Utd2l0aC1tYXJrZXJzLWZpZWxkLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFByZXZpZXdUeXBlID09PSBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSBjb24gbWFya2VycyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImN1cnJlbnRQcmV2aWV3RmllbGRcIiBbcmVjb3JkXT1cImN1cnJlbnRQcmV2aWV3UmVjb3JkXCIgW2luQ29uZmlnXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW5kUG9pbnRDb25maWd1cmF0aW9uXT1cImVuZFBvaW50Q29uZmlndXJhdGlvblwiIFtzdHlsZVZlcnNpb25dPVwic3R5bGVWZXJzaW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlU3RhdGVdPVwiY3VycmVudFNlbGVjdGVkU3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2ltYWdlLXdpdGgtbWFya2Vycy1maWVsZC10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSNlbmRyZWdpb24gQ09MT05OQSBERVNUUkEgLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIENhbXBpIGVzY2x1c2kgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmdlLXVuc3VwcG9ydGVkXCIgKm5nSWY9XCJ1bnN1cHBvcnRlZEZpZWxkcy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgRXNjbHVzaSBwZXJjaMOpIHNlbnphIGdyYWZpY2EgY29uZmlndXJhYmlsZToge3sgdW5zdXBwb3J0ZWRGaWVsZHMubGVuZ3RoIH19IGNhbXBpXHJcbiAgICAgICAgKHt7IGRpc3BsYXlOYW1lKHVuc3VwcG9ydGVkRmllbGRzWzBdKSB9fTxzcGFuXHJcbiAgICAgICAgICAgICpuZ0lmPVwidW5zdXBwb3J0ZWRGaWVsZHMubGVuZ3RoID4gMVwiPiwgLi4uPC9zcGFuPilcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUHVsc2FudGkgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmdlLWZvb3RlclwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjYW5jZWwoKVwiPkFubnVsbGE8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiIWhhc0NoYW5nZXNcIiAoY2xpY2spPVwiYXBwbHkoKVwiPlxyXG4gICAgICAgICAgICBBcHBsaWNhIGFpIGNhbXBpIHNlbGV6aW9uYXRpXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|