@gnggln/ng-ui-system 1.0.0-alpha.20 → 1.0.0-alpha.21

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.
Files changed (41) hide show
  1. package/crud-table/lib/components/form-builder/form-builder.component.d.ts +6 -2
  2. package/crud-table/lib/components/form-builder/types/field.types.d.ts +5 -0
  3. package/crud-table/lib/components/form-builder/types/validation.types.d.ts +5 -0
  4. package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +42 -9
  5. package/esm2022/crud-table/lib/components/form-builder/types/field.types.mjs +1 -1
  6. package/esm2022/crud-table/lib/components/form-builder/types/validation.types.mjs +6 -2
  7. package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +42 -9
  8. package/esm2022/form-builder/lib/components/form-builder/types/field.types.mjs +1 -1
  9. package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +3 -2
  10. package/esm2022/form-builder/lib/components/form-builder/types/validation.types.mjs +6 -2
  11. package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +42 -9
  12. package/esm2022/form-builder-editor/lib/components/form-builder/types/field.types.mjs +1 -1
  13. package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +3 -2
  14. package/esm2022/form-builder-editor/lib/components/form-builder/types/validation.types.mjs +6 -2
  15. package/esm2022/lib/components/form-builder/form-builder.component.mjs +42 -9
  16. package/esm2022/lib/components/form-builder/types/field.types.mjs +1 -1
  17. package/esm2022/lib/components/form-builder/types/index.mjs +3 -2
  18. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -2
  19. package/esm2022/lib/version/ng-ui-system-version.mjs +2 -2
  20. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +50 -8
  21. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -1
  22. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +50 -8
  23. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -1
  24. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +53 -9
  25. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -1
  26. package/fesm2022/gnggln-ng-ui-system.mjs +54 -10
  27. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  28. package/form-builder/lib/components/form-builder/form-builder.component.d.ts +6 -2
  29. package/form-builder/lib/components/form-builder/types/field.types.d.ts +5 -0
  30. package/form-builder/lib/components/form-builder/types/index.d.ts +1 -1
  31. package/form-builder/lib/components/form-builder/types/validation.types.d.ts +5 -0
  32. package/form-builder-editor/lib/components/form-builder/form-builder.component.d.ts +6 -2
  33. package/form-builder-editor/lib/components/form-builder/types/field.types.d.ts +5 -0
  34. package/form-builder-editor/lib/components/form-builder/types/index.d.ts +1 -1
  35. package/form-builder-editor/lib/components/form-builder/types/validation.types.d.ts +5 -0
  36. package/lib/components/form-builder/form-builder.component.d.ts +6 -2
  37. package/lib/components/form-builder/types/field.types.d.ts +5 -0
  38. package/lib/components/form-builder/types/index.d.ts +1 -1
  39. package/lib/components/form-builder/types/validation.types.d.ts +5 -0
  40. package/lib/version/ng-ui-system-version.d.ts +1 -1
  41. package/package.json +7 -7
@@ -21,6 +21,7 @@ import { UiButtonAreaComponent } from '../../components/button/button-area.compo
21
21
  import { UiBlackboxService } from '../blackbox/blackbox.service';
22
22
  import { UiLoggerService } from '../../core/logging/logger.service';
23
23
  import { Router } from '@angular/router';
24
+ import { UI_FORM_NESTED_FIELD_ERRORS_KEY, } from './types/validation.types';
24
25
  import { UiFormConditionService } from './services/form-condition.service';
25
26
  import { UiFormValidationService } from './services/form-validation.service';
26
27
  import { UiFormFieldErrorService } from './services/form-field-error.service';
@@ -763,7 +764,7 @@ export class UiFormBuilderComponent {
763
764
  /**
764
765
  * Contesto passato a `ngTemplateOutlet` per il campo custom (CVA sul `control`).
765
766
  */
766
- getCustomFieldOutletContext(field, fg) {
767
+ getCustomFieldOutletContext(field, fg, nestedErrorKeyPrefix) {
767
768
  const control = fg.get(field.key);
768
769
  return {
769
770
  $implicit: field,
@@ -771,6 +772,7 @@ export class UiFormBuilderComponent {
771
772
  formGroup: fg,
772
773
  control,
773
774
  config: field.customConfig?.config ?? {},
775
+ nestedErrorKeyPrefix,
774
776
  emitCustomEvent: (event, data) => {
775
777
  this.customEvent.emit({ field: field.key, event, data });
776
778
  },
@@ -779,11 +781,34 @@ export class UiFormBuilderComponent {
779
781
  /**
780
782
  * Template e contesto in un solo oggetto (evita doppie valutazioni nel template).
781
783
  */
782
- getCustomFieldOutlet(field, fg) {
784
+ getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix) {
783
785
  const template = this.getCustomTemplateRef(field);
784
786
  if (!template)
785
787
  return null;
786
- return { template, context: this.getCustomFieldOutletContext(field, fg) };
788
+ return { template, context: this.getCustomFieldOutletContext(field, fg, nestedErrorKeyPrefix) };
789
+ }
790
+ /** Prefisso chiavi errore per campi custom annidati (flat o repeatable). */
791
+ buildNestedErrorKeyPrefix(fieldKey, instanceKeyPrefix) {
792
+ const base = instanceKeyPrefix ? `${instanceKeyPrefix}${fieldKey}` : fieldKey;
793
+ return `${base}__`;
794
+ }
795
+ /** Merge errori nested da CVA custom nel dettaglio error-summary. */
796
+ appendCustomNestedFieldErrors(details, field, control, labelPrefix, nestedErrorKeyPrefix) {
797
+ if (field.type !== 'custom')
798
+ return;
799
+ const nested = control.errors?.[UI_FORM_NESTED_FIELD_ERRORS_KEY];
800
+ if (!Array.isArray(nested) || nested.length === 0)
801
+ return;
802
+ for (const item of nested) {
803
+ if (!item?.errors?.length)
804
+ continue;
805
+ const relativeKey = item.fieldKey ?? '';
806
+ details.push({
807
+ fieldKey: relativeKey ? `${nestedErrorKeyPrefix}${relativeKey}` : nestedErrorKeyPrefix.slice(0, -2),
808
+ fieldLabel: `${labelPrefix} > ${item.fieldLabel}`,
809
+ errors: item.errors,
810
+ });
811
+ }
787
812
  }
788
813
  isFormGroupValidExcluding(group, excludedKeys) {
789
814
  for (const key of Object.keys(group.controls)) {
@@ -864,6 +889,11 @@ export class UiFormBuilderComponent {
864
889
  const control = this.formGroup.get(field.key);
865
890
  if (!control?.errors)
866
891
  continue;
892
+ const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key);
893
+ this.appendCustomNestedFieldErrors(details, field, control, field.label, nestedPrefix);
894
+ if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {
895
+ continue;
896
+ }
867
897
  const errors = this.getFieldErrors(field.key);
868
898
  if (errors.length) {
869
899
  details.push({ fieldKey: field.key, fieldLabel: field.label, errors });
@@ -878,6 +908,7 @@ export class UiFormBuilderComponent {
878
908
  for (let i = 0; i < arr.length; i++) {
879
909
  const instanceFg = arr.at(i);
880
910
  const instanceLabel = titleTemplate.replace('{index}', String(i + 1));
911
+ const instanceKeyPrefix = `${section.id}[${i}].`;
881
912
  for (const field of section.fields) {
882
913
  if (field.type === 'flag' || field.type === 'divider')
883
914
  continue;
@@ -886,6 +917,11 @@ export class UiFormBuilderComponent {
886
917
  const control = instanceFg.get(field.key);
887
918
  if (!control?.errors)
888
919
  continue;
920
+ const nestedPrefix = this.buildNestedErrorKeyPrefix(field.key, instanceKeyPrefix);
921
+ this.appendCustomNestedFieldErrors(details, field, control, `${instanceLabel} > ${field.label}`, nestedPrefix);
922
+ if (field.type === 'custom' && control.errors[UI_FORM_NESTED_FIELD_ERRORS_KEY]) {
923
+ continue;
924
+ }
889
925
  const errors = this.getFieldErrors(field.key, instanceFg);
890
926
  if (errors.length) {
891
927
  details.push({
@@ -1024,16 +1060,13 @@ export class UiFormBuilderComponent {
1024
1060
  }
1025
1061
  /** Scrolla al campo e lo evidenzia. */
1026
1062
  scrollToField(fieldKey) {
1027
- // Forza lo stato dirty e touched per mostrare immediatamente gli errori
1028
1063
  const control = this.formGroup.get(fieldKey);
1029
1064
  if (control) {
1030
1065
  control.markAsTouched();
1031
1066
  control.markAsDirty();
1032
1067
  control.updateValueAndValidity();
1033
1068
  }
1034
- // Delay per lasciare che Angular Material aggiorni il DOM
1035
1069
  setTimeout(() => {
1036
- // Cerca l'elemento tramite diversi selettori in ordine di priorita
1037
1070
  const selectors = [`[data-field-key="${fieldKey}"]`, `[formControlName="${fieldKey}"]`];
1038
1071
  let targetElement = null;
1039
1072
  for (const sel of selectors) {
@@ -1247,7 +1280,7 @@ export class UiFormBuilderComponent {
1247
1280
  { provide: DateAdapter, useClass: UiItalianDateAdapter },
1248
1281
  // Formati data italiani (DD/MM/YYYY)
1249
1282
  { provide: MAT_DATE_FORMATS, useValue: UI_IT_DATE_FORMATS },
1250
- ], usesOnChanges: true, ngImport: i0, template: "<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- \u2500\u2500\u2500 Sezione REPEATABLE \u2500\u2500\u2500 -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione COLLASSABILE \u2500\u2500\u2500 -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione STANDARD \u2500\u2500\u2500 -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form \u00E8 compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per \u00AB{{ resolveCustomTemplateKey(field) }}\u00BB</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>", styles: [".ui-form-builder{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-builder__header{margin-bottom:var(--ui-spacing-2)}.ui-form-builder__title{font-size:var(--ui-font-size-xl);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__sections{display:flex;flex-direction:column;gap:var(--ui-spacing-6)}.ui-form-builder__section--repeatable{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.ui-form-builder__repeatable-action{appearance:none;border:none;background:transparent;cursor:pointer;padding:var(--ui-spacing-1);border-radius:var(--ui-radius-sm);color:var(--ui-color-text-muted);display:inline-flex;align-items:center;justify-content:center;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-form-builder__repeatable-action:focus{outline:none}.ui-form-builder__repeatable-action:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-builder__repeatable-action:hover{color:var(--ui-color-text);background:var(--ui-color-surface-hover)}.ui-form-builder__repeatable-action--danger:hover{color:var(--ui-color-error, #dc2626);background:color-mix(in srgb,var(--ui-color-error, #dc2626) 8%,transparent)}.ui-form-builder__repeatable-add{display:flex;justify-content:flex-start;padding-top:var(--ui-spacing-2)}.ui-form-builder__section-header{margin-bottom:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-2);border-bottom:1px solid var(--ui-color-border)}.ui-form-builder__section-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__section-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--ui-spacing-4) var(--ui-spacing-4);align-items:start}.ui-form-builder__field-wrapper{grid-column:span 12;min-width:0}@media (min-width: 768px){.ui-form-builder__field-wrapper{grid-column:span 6}}@media (min-width: 576px){.ui-form-builder__field-wrapper.ui-col-sm-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-sm-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-sm-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-sm-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-sm-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-sm-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-sm-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-sm-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-sm-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-sm-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-sm-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-sm-12{grid-column:span 12}}@media (min-width: 768px){.ui-form-builder__field-wrapper.ui-col-md-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-md-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-md-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-md-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-md-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-md-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-md-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-md-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-md-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-md-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-md-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-md-12{grid-column:span 12}}@media (min-width: 1024px){.ui-form-builder__field-wrapper.ui-col-lg-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-lg-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-lg-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-lg-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-lg-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-lg-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-lg-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-lg-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-lg-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-lg-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-lg-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-lg-12{grid-column:span 12}}@media (min-width: 1280px){.ui-form-builder__field-wrapper.ui-col-xl-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-xl-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-xl-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-xl-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-xl-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-xl-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-xl-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-xl-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-xl-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-xl-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-xl-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-xl-12{grid-column:span 12}}.ui-form-builder__full-width{width:100%}.ui-fb-field-ctx,.ui-fb-text-ctx{display:contents}.ui-form-builder__textarea-wrapper{position:relative}.ui-form-builder mat-hint.ui-form-builder__char-count{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--warn{color:var(--ui-color-warn, #d97706)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--error{color:var(--ui-color-error, #dc2626);font-weight:var(--ui-font-weight-semibold)}.ui-form-builder__field-label{display:block;font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-4)}.ui-form-builder__required{color:var(--ui-color-error, #dc2626);margin-left:2px}.ui-form-builder__field-error{margin-top:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);color:var(--ui-color-error, #dc2626);display:flex;flex-direction:column;gap:2px}.ui-form-builder__radio-wrapper mat-radio-group{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-3)}.ui-form-builder__chips-preview{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1);margin-top:var(--ui-spacing-1)}.ui-form-builder__chip{display:inline-flex;align-items:center;gap:4px;padding:2px var(--ui-spacing-2);border-radius:var(--ui-radius-full);background:var(--ui-color-primary-subtle, rgba(37, 99, 235, .08));color:var(--ui-color-primary);font-size:var(--ui-font-size-xs)}.ui-form-builder__chip-remove{appearance:none;border:none;background:transparent;cursor:pointer;padding:0;display:flex;color:inherit;opacity:.7}.ui-form-builder__chip-remove:hover{opacity:1}.ui-form-builder__option-icon{margin-right:var(--ui-spacing-2);vertical-align:middle}.ui-form-builder__option-info{margin-left:auto;color:var(--ui-color-text-muted)}.ui-form-builder__inline-tooltip{margin-left:var(--ui-spacing-1);color:var(--ui-color-text-muted);cursor:help}.ui-form-builder__divider{grid-column:1/-1!important;display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) 0}.ui-form-builder__divider-label{font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text-secondary);white-space:nowrap}.ui-form-builder__divider-line{flex:1;border:none;border-top:1px solid var(--ui-color-border);margin:0}.ui-form-builder__custom-placeholder{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}.ui-form-builder__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-spacing-4);padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}@media (max-width: 767.98px){.ui-form-builder__footer{flex-direction:column;align-items:stretch}}.ui-form-field--highlight{animation:ui-field-highlight-pulse 1s ease-in-out 2;border-radius:var(--ui-radius-md)}@keyframes ui-field-highlight-pulse{0%{box-shadow:0 0 #dc262666;padding:10px}50%{box-shadow:0 0 0 6px #dc262626;padding:10px}to{box-shadow:0 0 #dc262600;padding:10px}}.ui-form-builder mat-error{font-size:var(--ui-font-size-xs, 12px);display:flex;flex-direction:column;transform:translateY(-5px)}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__leading,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__notch,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__trailing{border-color:var(--ui-color-error, #dc2626)!important}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mat-mdc-floating-label{color:var(--ui-color-error, #dc2626)}.ui-form-builder__free-multi-field mat-chip-grid{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1)}.ui-form-builder__free-multi-field input[matInput]{flex:1;min-width:80px}.ui-form-builder mat-datepicker-toggle{display:inline-flex;align-items:center}.mdc-notched-outline__notch{border-left:none!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: UiAccordionComponent, selector: "ui-accordion", inputs: ["items", "itemTemplate", "headerTemplate", "actionsTemplate", "mode", "ariaLabel"], outputs: ["itemToggled"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i11.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonAreaComponent, selector: "ui-button-area", inputs: ["buttons", "align", "ariaLabel", "gap", "stackOnMobile", "disableWhileLoading", "loadingIds"] }, { kind: "component", type: UiFormErrorSummaryComponent, selector: "ui-form-error-summary", inputs: ["errors", "totalErrorCount", "validMessage"], outputs: ["fieldClick"] }, { kind: "component", type: UiFileInputComponent, selector: "ui-file-input", inputs: ["config"], outputs: ["fileRemoved", "validationError"] }, { kind: "component", type: UiSpecificaTerritorialeComponent, selector: "ui-specifica-territoriale", inputs: ["config", "disabled"] }, { kind: "component", type: UiTableTerritorialeComponent, selector: "ui-table-territoriale", inputs: ["config", "disabled"] }, { kind: "component", type: UiLocationGeocodedComponent, selector: "ui-location-geocoded", inputs: ["config", "placeholder", "inputAriaLabel", "inputId", "disabled", "readonly"] }, { kind: "component", type: UiFormTextFieldComponent, selector: "ui-form-text-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "maxLength", "inputType", "validationRules", "options"], outputs: ["optionsFilter", "blurred"] }, { kind: "component", type: UiFormTextareaFieldComponent, selector: "ui-form-textarea-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "rows", "maxLength", "validationRules"], outputs: ["blurred"] }, { kind: "component", type: UiFormNumberFieldComponent, selector: "ui-form-number-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "validationRules", "currencyMode", "currencySymbol", "decimalPlaces"], outputs: ["blurred"] }, { kind: "component", type: UiFormSelectFieldComponent, selector: "ui-form-select-field", inputs: ["field", "formGroup", "readonly", "errors", "options", "control", "label", "placeholder", "searchable", "hideEmptyOption", "validationRules"], outputs: ["optionsFilter", "blurred"] }, { kind: "component", type: UiFormRadioFieldComponent, selector: "ui-form-radio-field", inputs: ["field", "formGroup", "readonly", "errors", "options", "required", "showErrors", "errorDisplayOptions", "control", "label", "validationRules", "color"], outputs: ["blurred"] }], encapsulation: i0.ViewEncapsulation.None }); }
1283
+ ], usesOnChanges: true, ngImport: i0, template: "<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- \u2500\u2500\u2500 Sezione REPEATABLE \u2500\u2500\u2500 -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index), nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key, section.id + '[' + item.index + '].') }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione COLLASSABILE \u2500\u2500\u2500 -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione STANDARD \u2500\u2500\u2500 -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form \u00E8 compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\" let-nestedErrorKeyPrefix=\"nestedErrorKeyPrefix\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per \u00AB{{ resolveCustomTemplateKey(field) }}\u00BB</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>", styles: [".ui-form-builder{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-builder__header{margin-bottom:var(--ui-spacing-2)}.ui-form-builder__title{font-size:var(--ui-font-size-xl);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__sections{display:flex;flex-direction:column;gap:var(--ui-spacing-6)}.ui-form-builder__section--repeatable{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.ui-form-builder__repeatable-action{appearance:none;border:none;background:transparent;cursor:pointer;padding:var(--ui-spacing-1);border-radius:var(--ui-radius-sm);color:var(--ui-color-text-muted);display:inline-flex;align-items:center;justify-content:center;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-form-builder__repeatable-action:focus{outline:none}.ui-form-builder__repeatable-action:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-builder__repeatable-action:hover{color:var(--ui-color-text);background:var(--ui-color-surface-hover)}.ui-form-builder__repeatable-action--danger:hover{color:var(--ui-color-error, #dc2626);background:color-mix(in srgb,var(--ui-color-error, #dc2626) 8%,transparent)}.ui-form-builder__repeatable-add{display:flex;justify-content:flex-start;padding-top:var(--ui-spacing-2)}.ui-form-builder__section-header{margin-bottom:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-2);border-bottom:1px solid var(--ui-color-border)}.ui-form-builder__section-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__section-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--ui-spacing-4) var(--ui-spacing-4);align-items:start}.ui-form-builder__field-wrapper{grid-column:span 12;min-width:0}@media (min-width: 768px){.ui-form-builder__field-wrapper{grid-column:span 6}}@media (min-width: 576px){.ui-form-builder__field-wrapper.ui-col-sm-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-sm-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-sm-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-sm-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-sm-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-sm-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-sm-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-sm-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-sm-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-sm-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-sm-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-sm-12{grid-column:span 12}}@media (min-width: 768px){.ui-form-builder__field-wrapper.ui-col-md-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-md-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-md-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-md-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-md-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-md-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-md-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-md-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-md-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-md-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-md-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-md-12{grid-column:span 12}}@media (min-width: 1024px){.ui-form-builder__field-wrapper.ui-col-lg-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-lg-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-lg-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-lg-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-lg-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-lg-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-lg-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-lg-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-lg-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-lg-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-lg-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-lg-12{grid-column:span 12}}@media (min-width: 1280px){.ui-form-builder__field-wrapper.ui-col-xl-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-xl-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-xl-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-xl-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-xl-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-xl-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-xl-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-xl-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-xl-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-xl-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-xl-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-xl-12{grid-column:span 12}}.ui-form-builder__full-width{width:100%}.ui-fb-field-ctx,.ui-fb-text-ctx{display:contents}.ui-form-builder__textarea-wrapper{position:relative}.ui-form-builder mat-hint.ui-form-builder__char-count{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--warn{color:var(--ui-color-warn, #d97706)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--error{color:var(--ui-color-error, #dc2626);font-weight:var(--ui-font-weight-semibold)}.ui-form-builder__field-label{display:block;font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-4)}.ui-form-builder__required{color:var(--ui-color-error, #dc2626);margin-left:2px}.ui-form-builder__field-error{margin-top:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);color:var(--ui-color-error, #dc2626);display:flex;flex-direction:column;gap:2px}.ui-form-builder__radio-wrapper mat-radio-group{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-3)}.ui-form-builder__chips-preview{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1);margin-top:var(--ui-spacing-1)}.ui-form-builder__chip{display:inline-flex;align-items:center;gap:4px;padding:2px var(--ui-spacing-2);border-radius:var(--ui-radius-full);background:var(--ui-color-primary-subtle, rgba(37, 99, 235, .08));color:var(--ui-color-primary);font-size:var(--ui-font-size-xs)}.ui-form-builder__chip-remove{appearance:none;border:none;background:transparent;cursor:pointer;padding:0;display:flex;color:inherit;opacity:.7}.ui-form-builder__chip-remove:hover{opacity:1}.ui-form-builder__option-icon{margin-right:var(--ui-spacing-2);vertical-align:middle}.ui-form-builder__option-info{margin-left:auto;color:var(--ui-color-text-muted)}.ui-form-builder__inline-tooltip{margin-left:var(--ui-spacing-1);color:var(--ui-color-text-muted);cursor:help}.ui-form-builder__divider{grid-column:1/-1!important;display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) 0}.ui-form-builder__divider-label{font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text-secondary);white-space:nowrap}.ui-form-builder__divider-line{flex:1;border:none;border-top:1px solid var(--ui-color-border);margin:0}.ui-form-builder__custom-placeholder{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}.ui-form-builder__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-spacing-4);padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}@media (max-width: 767.98px){.ui-form-builder__footer{flex-direction:column;align-items:stretch}}.ui-form-field--highlight{animation:ui-field-highlight-pulse 1s ease-in-out 2;border-radius:var(--ui-radius-md)}@keyframes ui-field-highlight-pulse{0%{box-shadow:0 0 #dc262666;padding:10px}50%{box-shadow:0 0 0 6px #dc262626;padding:10px}to{box-shadow:0 0 #dc262600;padding:10px}}.ui-form-builder mat-error{font-size:var(--ui-font-size-xs, 12px);display:flex;flex-direction:column;transform:translateY(-5px)}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__leading,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__notch,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__trailing{border-color:var(--ui-color-error, #dc2626)!important}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mat-mdc-floating-label{color:var(--ui-color-error, #dc2626)}.ui-form-builder__free-multi-field mat-chip-grid{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1)}.ui-form-builder__free-multi-field input[matInput]{flex:1;min-width:80px}.ui-form-builder mat-datepicker-toggle{display:inline-flex;align-items:center}.mdc-notched-outline__notch{border-left:none!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i4.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: UiAccordionComponent, selector: "ui-accordion", inputs: ["items", "itemTemplate", "headerTemplate", "actionsTemplate", "mode", "ariaLabel"], outputs: ["itemToggled"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i11.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonAreaComponent, selector: "ui-button-area", inputs: ["buttons", "align", "ariaLabel", "gap", "stackOnMobile", "disableWhileLoading", "loadingIds"] }, { kind: "component", type: UiFormErrorSummaryComponent, selector: "ui-form-error-summary", inputs: ["errors", "totalErrorCount", "validMessage"], outputs: ["fieldClick"] }, { kind: "component", type: UiFileInputComponent, selector: "ui-file-input", inputs: ["config"], outputs: ["fileRemoved", "validationError"] }, { kind: "component", type: UiSpecificaTerritorialeComponent, selector: "ui-specifica-territoriale", inputs: ["config", "disabled"] }, { kind: "component", type: UiTableTerritorialeComponent, selector: "ui-table-territoriale", inputs: ["config", "disabled"] }, { kind: "component", type: UiLocationGeocodedComponent, selector: "ui-location-geocoded", inputs: ["config", "placeholder", "inputAriaLabel", "inputId", "disabled", "readonly"] }, { kind: "component", type: UiFormTextFieldComponent, selector: "ui-form-text-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "maxLength", "inputType", "validationRules", "options"], outputs: ["optionsFilter", "blurred"] }, { kind: "component", type: UiFormTextareaFieldComponent, selector: "ui-form-textarea-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "rows", "maxLength", "validationRules"], outputs: ["blurred"] }, { kind: "component", type: UiFormNumberFieldComponent, selector: "ui-form-number-field", inputs: ["field", "formGroup", "readonly", "errors", "control", "label", "placeholder", "validationRules", "currencyMode", "currencySymbol", "decimalPlaces"], outputs: ["blurred"] }, { kind: "component", type: UiFormSelectFieldComponent, selector: "ui-form-select-field", inputs: ["field", "formGroup", "readonly", "errors", "options", "control", "label", "placeholder", "searchable", "hideEmptyOption", "validationRules"], outputs: ["optionsFilter", "blurred"] }, { kind: "component", type: UiFormRadioFieldComponent, selector: "ui-form-radio-field", inputs: ["field", "formGroup", "readonly", "errors", "options", "required", "showErrors", "errorDisplayOptions", "control", "label", "validationRules", "color"], outputs: ["blurred"] }], encapsulation: i0.ViewEncapsulation.None }); }
1251
1284
  }
1252
1285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormBuilderComponent, decorators: [{
1253
1286
  type: Component,
@@ -1287,7 +1320,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1287
1320
  { provide: DateAdapter, useClass: UiItalianDateAdapter },
1288
1321
  // Formati data italiani (DD/MM/YYYY)
1289
1322
  { provide: MAT_DATE_FORMATS, useValue: UI_IT_DATE_FORMATS },
1290
- ], encapsulation: ViewEncapsulation.None, host: { class: 'ui-form-builder-host' }, template: "<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- \u2500\u2500\u2500 Sezione REPEATABLE \u2500\u2500\u2500 -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione COLLASSABILE \u2500\u2500\u2500 -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione STANDARD \u2500\u2500\u2500 -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form \u00E8 compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per \u00AB{{ resolveCustomTemplateKey(field) }}\u00BB</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>", styles: [".ui-form-builder{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-builder__header{margin-bottom:var(--ui-spacing-2)}.ui-form-builder__title{font-size:var(--ui-font-size-xl);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__sections{display:flex;flex-direction:column;gap:var(--ui-spacing-6)}.ui-form-builder__section--repeatable{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.ui-form-builder__repeatable-action{appearance:none;border:none;background:transparent;cursor:pointer;padding:var(--ui-spacing-1);border-radius:var(--ui-radius-sm);color:var(--ui-color-text-muted);display:inline-flex;align-items:center;justify-content:center;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-form-builder__repeatable-action:focus{outline:none}.ui-form-builder__repeatable-action:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-builder__repeatable-action:hover{color:var(--ui-color-text);background:var(--ui-color-surface-hover)}.ui-form-builder__repeatable-action--danger:hover{color:var(--ui-color-error, #dc2626);background:color-mix(in srgb,var(--ui-color-error, #dc2626) 8%,transparent)}.ui-form-builder__repeatable-add{display:flex;justify-content:flex-start;padding-top:var(--ui-spacing-2)}.ui-form-builder__section-header{margin-bottom:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-2);border-bottom:1px solid var(--ui-color-border)}.ui-form-builder__section-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__section-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--ui-spacing-4) var(--ui-spacing-4);align-items:start}.ui-form-builder__field-wrapper{grid-column:span 12;min-width:0}@media (min-width: 768px){.ui-form-builder__field-wrapper{grid-column:span 6}}@media (min-width: 576px){.ui-form-builder__field-wrapper.ui-col-sm-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-sm-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-sm-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-sm-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-sm-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-sm-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-sm-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-sm-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-sm-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-sm-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-sm-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-sm-12{grid-column:span 12}}@media (min-width: 768px){.ui-form-builder__field-wrapper.ui-col-md-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-md-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-md-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-md-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-md-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-md-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-md-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-md-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-md-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-md-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-md-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-md-12{grid-column:span 12}}@media (min-width: 1024px){.ui-form-builder__field-wrapper.ui-col-lg-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-lg-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-lg-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-lg-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-lg-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-lg-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-lg-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-lg-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-lg-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-lg-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-lg-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-lg-12{grid-column:span 12}}@media (min-width: 1280px){.ui-form-builder__field-wrapper.ui-col-xl-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-xl-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-xl-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-xl-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-xl-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-xl-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-xl-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-xl-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-xl-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-xl-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-xl-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-xl-12{grid-column:span 12}}.ui-form-builder__full-width{width:100%}.ui-fb-field-ctx,.ui-fb-text-ctx{display:contents}.ui-form-builder__textarea-wrapper{position:relative}.ui-form-builder mat-hint.ui-form-builder__char-count{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--warn{color:var(--ui-color-warn, #d97706)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--error{color:var(--ui-color-error, #dc2626);font-weight:var(--ui-font-weight-semibold)}.ui-form-builder__field-label{display:block;font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-4)}.ui-form-builder__required{color:var(--ui-color-error, #dc2626);margin-left:2px}.ui-form-builder__field-error{margin-top:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);color:var(--ui-color-error, #dc2626);display:flex;flex-direction:column;gap:2px}.ui-form-builder__radio-wrapper mat-radio-group{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-3)}.ui-form-builder__chips-preview{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1);margin-top:var(--ui-spacing-1)}.ui-form-builder__chip{display:inline-flex;align-items:center;gap:4px;padding:2px var(--ui-spacing-2);border-radius:var(--ui-radius-full);background:var(--ui-color-primary-subtle, rgba(37, 99, 235, .08));color:var(--ui-color-primary);font-size:var(--ui-font-size-xs)}.ui-form-builder__chip-remove{appearance:none;border:none;background:transparent;cursor:pointer;padding:0;display:flex;color:inherit;opacity:.7}.ui-form-builder__chip-remove:hover{opacity:1}.ui-form-builder__option-icon{margin-right:var(--ui-spacing-2);vertical-align:middle}.ui-form-builder__option-info{margin-left:auto;color:var(--ui-color-text-muted)}.ui-form-builder__inline-tooltip{margin-left:var(--ui-spacing-1);color:var(--ui-color-text-muted);cursor:help}.ui-form-builder__divider{grid-column:1/-1!important;display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) 0}.ui-form-builder__divider-label{font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text-secondary);white-space:nowrap}.ui-form-builder__divider-line{flex:1;border:none;border-top:1px solid var(--ui-color-border);margin:0}.ui-form-builder__custom-placeholder{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}.ui-form-builder__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-spacing-4);padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}@media (max-width: 767.98px){.ui-form-builder__footer{flex-direction:column;align-items:stretch}}.ui-form-field--highlight{animation:ui-field-highlight-pulse 1s ease-in-out 2;border-radius:var(--ui-radius-md)}@keyframes ui-field-highlight-pulse{0%{box-shadow:0 0 #dc262666;padding:10px}50%{box-shadow:0 0 0 6px #dc262626;padding:10px}to{box-shadow:0 0 #dc262600;padding:10px}}.ui-form-builder mat-error{font-size:var(--ui-font-size-xs, 12px);display:flex;flex-direction:column;transform:translateY(-5px)}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__leading,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__notch,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__trailing{border-color:var(--ui-color-error, #dc2626)!important}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mat-mdc-floating-label{color:var(--ui-color-error, #dc2626)}.ui-form-builder__free-multi-field mat-chip-grid{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1)}.ui-form-builder__free-multi-field input[matInput]{flex:1;min-width:80px}.ui-form-builder mat-datepicker-toggle{display:inline-flex;align-items:center}.mdc-notched-outline__notch{border-left:none!important}\n"] }]
1323
+ ], encapsulation: ViewEncapsulation.None, host: { class: 'ui-form-builder-host' }, template: "<!--\r\n ============================================================\r\n UI FORM BUILDER - TEMPLATE PRINCIPALE\r\n ============================================================\r\n ARCHITETTURA:\r\n Ogni <ng-template> che contiene direttive [formControlName]\r\n DEVE wrappare il proprio contenuto in un <div [formGroup]>.\r\n Questo perche Angular risolve l'injector di formControlName\r\n dal CONTESTO DI DICHIARAZIONE del template, non dal punto\r\n di inserimento (ngTemplateOutlet).\r\n\r\n Il FormGroup viene passato tramite context per supportare\r\n sia campi piatti (root FormGroup) che campi in istanze\r\n repeatable (instance FormGroup).\r\n\r\n Senza questo wrapper, formControlName non trova il\r\n FormGroupDirective e lancia NG01050.\r\n ============================================================\r\n-->\r\n\r\n@if (schema && formGroup) {\r\n<div class=\"ui-form-builder\" [formGroup]=\"formGroup\" [class]=\"schema.config?.cssClasses?.join(' ')\">\r\n\r\n <!-- ==================== HEADER ==================== -->\r\n @if (schema.title || schema.description) {\r\n <div class=\"ui-form-builder__header\">\r\n @if (schema.title) {\r\n <h2 class=\"ui-form-builder__title\">{{ schema.title }}</h2>\r\n }\r\n @if (schema.description) {\r\n <p class=\"ui-form-builder__description\">{{ schema.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- ==================== SEZIONI ==================== -->\r\n <div class=\"ui-form-builder__sections\">\r\n @for (section of schema.sections; track section.id) {\r\n @if (isSectionVisible(section.id)) {\r\n\r\n <!-- \u2500\u2500\u2500 Sezione REPEATABLE \u2500\u2500\u2500 -->\r\n @if (section.repeatable) {\r\n <div class=\"ui-form-builder__section ui-form-builder__section--repeatable\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <ui-accordion [items]=\"getRepeatableAccordionItems(section.id)\" [itemTemplate]=\"repeatableBodyTpl\"\r\n [actionsTemplate]=\"repeatableActionsTpl\" mode=\"multi\" class=\"ui-form-builder__repeatable-accordion\">\r\n <!-- Contenuto di ogni istanza -->\r\n <ng-template #repeatableBodyTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key, getInstanceFormGroup(section.id, item.index)!) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container\r\n *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: getInstanceFormGroup(section.id, item.index), nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key, section.id + '[' + item.index + '].') }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Azioni per ogni istanza (duplica / elimina) -->\r\n <ng-template #repeatableActionsTpl let-item>\r\n @if (canAddInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action\"\r\n (click)=\"duplicateRepeatableInstance(section.id, item.index)\" aria-label=\"Duplica\">\r\n <lucide-icon name=\"copy\" [size]=\"15\" />\r\n </button>\r\n }\r\n @if (canRemoveInstance(section.id)) {\r\n <button type=\"button\" class=\"ui-form-builder__repeatable-action ui-form-builder__repeatable-action--danger\"\r\n (click)=\"removeRepeatableInstance(section.id, item.index)\" aria-label=\"Elimina\">\r\n <lucide-icon name=\"trash-2\" [size]=\"15\" />\r\n </button>\r\n }\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n @if (canAddInstance(section.id)) {\r\n <div class=\"ui-form-builder__repeatable-add\">\r\n <ui-button-area [buttons]=\"getRepeatableAddButtons(section)\" align=\"end\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione COLLASSABILE \u2500\u2500\u2500 -->\r\n } @else if (section.collapsible) {\r\n <ui-accordion [items]=\"getSectionAccordionItems(section.id)\" [itemTemplate]=\"collapsibleTpl\" mode=\"multi\"\r\n class=\"ui-form-builder__section ui-form-builder__section--collapsible\" [class]=\"section.cssClasses?.join(' ')\">\r\n <ng-template #collapsibleTpl let-item>\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n </ui-accordion>\r\n\r\n <!-- \u2500\u2500\u2500 Sezione STANDARD \u2500\u2500\u2500 -->\r\n } @else {\r\n <div class=\"ui-form-builder__section\" [class]=\"section.cssClasses?.join(' ')\">\r\n @if (section.title || section.description) {\r\n <div class=\"ui-form-builder__section-header\">\r\n @if (section.title) {\r\n <h3 class=\"ui-form-builder__section-title\">{{ section.title }}</h3>\r\n }\r\n @if (section.description) {\r\n <p class=\"ui-form-builder__section-description\">{{ section.description }}</p>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"ui-form-builder__section-content\"\r\n [class.ui-form-builder__grid]=\"schema.config?.layout === 'grid' || !schema.config?.layout\">\r\n @for (field of section.fields; track field.key) {\r\n @if (isFieldVisible(field.key) && field.type !== 'flag') {\r\n <div class=\"ui-form-builder__field-wrapper\" [class]=\"getFieldWrapperClasses(field)\"\r\n [style.order]=\"field.layout?.order || null\" [attr.data-field-key]=\"field.key\">\r\n <ng-container *ngTemplateOutlet=\"fieldTpl; context: { $implicit: field, formGroup: formGroup, nestedErrorKeyPrefix: buildNestedErrorKeyPrefix(field.key) }\" />\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n }\r\n </div>\r\n\r\n <!-- ==================== FOOTER ==================== -->\r\n <div class=\"ui-form-builder__footer\">\r\n @if (!schema.config?.hideErrorSummary) {\r\n <ui-form-error-summary [errors]=\"formErrors\" [totalErrorCount]=\"getFormErrorsCount()\"\r\n [validMessage]=\"schema.config?.errorSummaryValidMessage ?? 'Il form \u00E8 compilato correttamente'\"\r\n (fieldClick)=\"scrollToField($event)\" />\r\n }\r\n @if (!schema.config?.hideFooter) {\r\n <ui-button-area [buttons]=\"formButtons\" align=\"end\" [loadingIds]=\"loadingFor\" />\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n<!-- ============================================================ -->\r\n<!-- FIELD TEMPLATE -->\r\n<!-- ============================================================ -->\r\n<!--\r\n CRITICO: Questo template e dichiarato FUORI dal <div [formGroup]>.\r\n Angular risolve l'injector dal contesto di DICHIARAZIONE.\r\n Il FormGroup viene passato via context (fg) per supportare\r\n sia il root FormGroup che i FormGroup delle istanze repeatable.\r\n-->\r\n<ng-template #fieldTpl let-field let-fg=\"formGroup\" let-nestedErrorKeyPrefix=\"nestedErrorKeyPrefix\">\r\n @if (fg) {\r\n <div [formGroup]=\"fg\" class=\"ui-fb-field-ctx\">\r\n @switch (field.type) {\r\n\r\n <!-- TEXT / EMAIL / PASSWORD -->\r\n @case ('text') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n @case ('email') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n @case ('password') {\r\n <ui-form-text-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- NUMBER -->\r\n @case ('number') {\r\n <ui-form-number-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- TEXTAREA -->\r\n @case ('textarea') {\r\n <ui-form-textarea-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- SELECT -->\r\n @case ('select') {\r\n <ui-form-select-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n (optionsFilter)=\"filterOptions(field, $event)\"\r\n />\r\n }\r\n\r\n <!-- MULTISELECT -->\r\n @case ('multiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-select [formControlName]=\"field.key\" multiple [placeholder]=\"field.placeholder || ''\">\r\n @if (field.allowSelectAll) {\r\n <mat-option (click)=\"selectAll(field)\" (keydown.enter)=\"selectAll(field)\" (keydown.space)=\"selectAll(field)\">\r\n <em>Seleziona tutto</em>\r\n </mat-option>\r\n }\r\n @for (opt of getFieldOptions(field); track opt.value) {\r\n <mat-option [value]=\"opt.value\" [disabled]=\"opt.disabled\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n @if (fg.get(field.key)?.value?.length) {\r\n <div class=\"ui-form-builder__chips-preview\">\r\n @for (val of fg.get(field.key)!.value; track val) {\r\n <span class=\"ui-form-builder__chip\">\r\n {{ getOptionLabel(field, val) }}\r\n <button type=\"button\" (click)=\"removeMultiselectChip(field, val)\" class=\"ui-form-builder__chip-remove\"\r\n aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"12\" />\r\n </button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- FREEMULTISELECT -->\r\n @case ('freemultiselect') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width ui-form-builder__free-multi-field\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <mat-chip-grid #chipGrid [formControlName]=\"field.key\">\r\n @for (chip of fg.get(field.key)?.value || []; track chip) {\r\n <mat-chip-row [removable]=\"!isChipProtected(field, chip)\" (removed)=\"removeFreeChip(field, chip)\">\r\n {{ chip }}\r\n @if (!isChipProtected(field, chip)) {\r\n <button matChipRemove aria-label=\"Rimuovi\">\r\n <lucide-icon name=\"x\" [size]=\"14\" />\r\n </button>\r\n }\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input matInput [matChipInputFor]=\"chipGrid\" [placeholder]=\"field.placeholder || 'Aggiungi...'\"\r\n [readonly]=\"field.readonly || readonly\" (matChipInputTokenEnd)=\"addFreeChip(field, $event)\"\r\n (blur)=\"addFreeChipOnBlur(field, $event)\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- CHECKBOX -->\r\n @case ('checkbox') {\r\n @if (field.appearance?.style === 'switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n </mat-slide-toggle>\r\n } @else {\r\n <mat-checkbox [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-checkbox>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n }\r\n\r\n <!-- SWITCH -->\r\n @case ('switch') {\r\n <mat-slide-toggle [formControlName]=\"field.key\" [color]=\"field.appearance?.color || 'primary'\">\r\n {{ field.label }}\r\n @if (field.iconTooltip) {\r\n <lucide-icon [name]=\"field.iconTooltip.icon || 'info'\" [size]=\"14\" [matTooltip]=\"field.iconTooltip.text\"\r\n class=\"ui-form-builder__inline-tooltip\" />\r\n }\r\n </mat-slide-toggle>\r\n }\r\n\r\n <!-- RADIO -->\r\n @case ('radio') {\r\n <ui-form-radio-field\r\n [field]=\"field\"\r\n [formGroup]=\"fg\"\r\n [readonly]=\"readonly\"\r\n [errors]=\"getFieldErrors(field.key, fg)\"\r\n [options]=\"getFieldOptions(field)\"\r\n [required]=\"isFieldRequired(field.key, fg)\"\r\n [showErrors]=\"shouldShowFieldErrors(field.key, fg)\"\r\n />\r\n }\r\n\r\n <!-- DATE -->\r\n @case ('date') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"field.key\"\r\n [placeholder]=\"field.placeholder || 'GG/MM/AAAA'\" [readonly]=\"field.readonly || readonly\" />\r\n <mat-datepicker-toggle matSuffix [for]=\"datepicker\" />\r\n <mat-datepicker #datepicker [startView]=\"field.customConfig?.config?.['monthView'] ? 'year' : 'month'\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- DATETIME -->\r\n @case ('datetime') {\r\n <mat-form-field appearance=\"outline\" class=\"ui-form-builder__full-width\">\r\n <mat-label>{{ field.label }}</mat-label>\r\n <input matInput type=\"datetime-local\" [formControlName]=\"field.key\" [placeholder]=\"field.placeholder || ''\"\r\n [readonly]=\"field.readonly || readonly\" />\r\n <mat-error>\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <div>{{ err }}</div>\r\n }\r\n </mat-error>\r\n </mat-form-field>\r\n }\r\n\r\n <!-- FILE -->\r\n @case ('file') {\r\n <div class=\"ui-form-builder__file-wrapper\">\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n <ui-file-input [formControlName]=\"field.key\" [config]=\"field.fileConfig\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- DIVIDER -->\r\n @case ('divider') {\r\n <div class=\"ui-form-builder__divider\">\r\n @if (field.label) {\r\n <span class=\"ui-form-builder__divider-label\">{{ field.label }}</span>\r\n }\r\n <hr class=\"ui-form-builder__divider-line\" />\r\n </div>\r\n }\r\n\r\n <!-- LOCATION (selezione territorio) -->\r\n @case ('location') {\r\n <div class=\"ui-form-builder__location-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-specifica-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-TABLE (tabella CRUD di location) -->\r\n @case ('location-table') {\r\n <div class=\"ui-form-builder__location-table-wrapper\">\r\n <ui-table-territoriale [formControlName]=\"field.key\" [config]=\"field.customConfig?.config || {}\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- LOCATION-GEOCODED (ricerca indirizzo Nominatim) -->\r\n @case ('location-geocoded') {\r\n <div class=\"ui-form-builder__location-geocoded-wrapper\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\" [attr.for]=\"'ui-loc-' + field.key\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n <ui-location-geocoded [formControlName]=\"field.key\" [config]=\"field.locationGeocodedConfig || {}\"\r\n [placeholder]=\"field.placeholder || 'Cerca indirizzo...'\"\r\n [inputAriaLabel]=\"field.label || field.placeholder || 'Indirizzo'\"\r\n [inputId]=\"'ui-loc-' + field.key\"\r\n [readonly]=\"field.readonly || readonly\"\r\n [disabled]=\"readonly || field.disabled || disabled\" />\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- CUSTOM -->\r\n @case ('custom') {\r\n <div class=\"ui-form-builder__custom-wrapper\" [attr.data-component]=\"field.customConfig?.component\"\r\n [attr.data-template-key]=\"resolveCustomTemplateKey(field)\">\r\n @if (field.label) {\r\n <label class=\"ui-form-builder__field-label\">\r\n {{ field.label }}\r\n @if (isFieldRequired(field.key, fg)) { <span class=\"ui-form-builder__required\">*</span> }\r\n </label>\r\n }\r\n @if (getCustomFieldOutlet(field, fg, nestedErrorKeyPrefix); as customOutlet) {\r\n <ng-container *ngTemplateOutlet=\"customOutlet.template; context: customOutlet.context\" />\r\n } @else {\r\n <div class=\"ui-form-builder__custom-placeholder\" role=\"status\">\r\n <span>Nessun template registrato per \u00AB{{ resolveCustomTemplateKey(field) }}\u00BB</span>\r\n </div>\r\n }\r\n @if (shouldShowFieldErrors(field.key, fg)) {\r\n <div class=\"ui-form-builder__field-error\">\r\n @for (err of getFieldErrors(field.key, fg); track $index) {\r\n <span>{{ err }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n</ng-template>", styles: [".ui-form-builder{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-builder__header{margin-bottom:var(--ui-spacing-2)}.ui-form-builder__title{font-size:var(--ui-font-size-xl);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__sections{display:flex;flex-direction:column;gap:var(--ui-spacing-6)}.ui-form-builder__section--repeatable{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.ui-form-builder__repeatable-action{appearance:none;border:none;background:transparent;cursor:pointer;padding:var(--ui-spacing-1);border-radius:var(--ui-radius-sm);color:var(--ui-color-text-muted);display:inline-flex;align-items:center;justify-content:center;transition:color var(--ui-transition-fast),background-color var(--ui-transition-fast)}.ui-form-builder__repeatable-action:focus{outline:none}.ui-form-builder__repeatable-action:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-builder__repeatable-action:hover{color:var(--ui-color-text);background:var(--ui-color-surface-hover)}.ui-form-builder__repeatable-action--danger:hover{color:var(--ui-color-error, #dc2626);background:color-mix(in srgb,var(--ui-color-error, #dc2626) 8%,transparent)}.ui-form-builder__repeatable-add{display:flex;justify-content:flex-start;padding-top:var(--ui-spacing-2)}.ui-form-builder__section-header{margin-bottom:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-2);border-bottom:1px solid var(--ui-color-border)}.ui-form-builder__section-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-builder__section-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0}.ui-form-builder__grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--ui-spacing-4) var(--ui-spacing-4);align-items:start}.ui-form-builder__field-wrapper{grid-column:span 12;min-width:0}@media (min-width: 768px){.ui-form-builder__field-wrapper{grid-column:span 6}}@media (min-width: 576px){.ui-form-builder__field-wrapper.ui-col-sm-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-sm-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-sm-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-sm-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-sm-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-sm-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-sm-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-sm-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-sm-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-sm-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-sm-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-sm-12{grid-column:span 12}}@media (min-width: 768px){.ui-form-builder__field-wrapper.ui-col-md-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-md-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-md-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-md-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-md-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-md-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-md-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-md-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-md-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-md-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-md-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-md-12{grid-column:span 12}}@media (min-width: 1024px){.ui-form-builder__field-wrapper.ui-col-lg-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-lg-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-lg-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-lg-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-lg-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-lg-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-lg-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-lg-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-lg-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-lg-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-lg-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-lg-12{grid-column:span 12}}@media (min-width: 1280px){.ui-form-builder__field-wrapper.ui-col-xl-1{grid-column:span 1}.ui-form-builder__field-wrapper.ui-col-xl-2{grid-column:span 2}.ui-form-builder__field-wrapper.ui-col-xl-3{grid-column:span 3}.ui-form-builder__field-wrapper.ui-col-xl-4{grid-column:span 4}.ui-form-builder__field-wrapper.ui-col-xl-5{grid-column:span 5}.ui-form-builder__field-wrapper.ui-col-xl-6{grid-column:span 6}.ui-form-builder__field-wrapper.ui-col-xl-7{grid-column:span 7}.ui-form-builder__field-wrapper.ui-col-xl-8{grid-column:span 8}.ui-form-builder__field-wrapper.ui-col-xl-9{grid-column:span 9}.ui-form-builder__field-wrapper.ui-col-xl-10{grid-column:span 10}.ui-form-builder__field-wrapper.ui-col-xl-11{grid-column:span 11}.ui-form-builder__field-wrapper.ui-col-xl-12{grid-column:span 12}}.ui-form-builder__full-width{width:100%}.ui-fb-field-ctx,.ui-fb-text-ctx{display:contents}.ui-form-builder__textarea-wrapper{position:relative}.ui-form-builder mat-hint.ui-form-builder__char-count{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--warn{color:var(--ui-color-warn, #d97706)}.ui-form-builder mat-hint.ui-form-builder__char-count.ui-form-builder__char-count--error{color:var(--ui-color-error, #dc2626);font-weight:var(--ui-font-weight-semibold)}.ui-form-builder__field-label{display:block;font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-4)}.ui-form-builder__required{color:var(--ui-color-error, #dc2626);margin-left:2px}.ui-form-builder__field-error{margin-top:var(--ui-spacing-1);font-size:var(--ui-font-size-xs);color:var(--ui-color-error, #dc2626);display:flex;flex-direction:column;gap:2px}.ui-form-builder__radio-wrapper mat-radio-group{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-3)}.ui-form-builder__chips-preview{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1);margin-top:var(--ui-spacing-1)}.ui-form-builder__chip{display:inline-flex;align-items:center;gap:4px;padding:2px var(--ui-spacing-2);border-radius:var(--ui-radius-full);background:var(--ui-color-primary-subtle, rgba(37, 99, 235, .08));color:var(--ui-color-primary);font-size:var(--ui-font-size-xs)}.ui-form-builder__chip-remove{appearance:none;border:none;background:transparent;cursor:pointer;padding:0;display:flex;color:inherit;opacity:.7}.ui-form-builder__chip-remove:hover{opacity:1}.ui-form-builder__option-icon{margin-right:var(--ui-spacing-2);vertical-align:middle}.ui-form-builder__option-info{margin-left:auto;color:var(--ui-color-text-muted)}.ui-form-builder__inline-tooltip{margin-left:var(--ui-spacing-1);color:var(--ui-color-text-muted);cursor:help}.ui-form-builder__divider{grid-column:1/-1!important;display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) 0}.ui-form-builder__divider-label{font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-medium);color:var(--ui-color-text-secondary);white-space:nowrap}.ui-form-builder__divider-line{flex:1;border:none;border-top:1px solid var(--ui-color-border);margin:0}.ui-form-builder__custom-placeholder{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-4);border:1px dashed var(--ui-color-border);border-radius:var(--ui-radius-md);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}.ui-form-builder__footer{display:flex;align-items:center;justify-content:space-between;gap:var(--ui-spacing-4);padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}@media (max-width: 767.98px){.ui-form-builder__footer{flex-direction:column;align-items:stretch}}.ui-form-field--highlight{animation:ui-field-highlight-pulse 1s ease-in-out 2;border-radius:var(--ui-radius-md)}@keyframes ui-field-highlight-pulse{0%{box-shadow:0 0 #dc262666;padding:10px}50%{box-shadow:0 0 0 6px #dc262626;padding:10px}to{box-shadow:0 0 #dc262600;padding:10px}}.ui-form-builder mat-error{font-size:var(--ui-font-size-xs, 12px);display:flex;flex-direction:column;transform:translateY(-5px)}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__leading,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__notch,.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mdc-notched-outline__trailing{border-color:var(--ui-color-error, #dc2626)!important}.ui-form-builder .mat-mdc-form-field.mat-form-field-invalid .mat-mdc-floating-label{color:var(--ui-color-error, #dc2626)}.ui-form-builder__free-multi-field mat-chip-grid{display:flex;flex-wrap:wrap;gap:var(--ui-spacing-1)}.ui-form-builder__free-multi-field input[matInput]{flex:1;min-width:80px}.ui-form-builder mat-datepicker-toggle{display:inline-flex;align-items:center}.mdc-notched-outline__notch{border-left:none!important}\n"] }]
1291
1324
  }], propDecorators: { schema: [{
1292
1325
  type: Input
1293
1326
  }], initialData: [{
@@ -1315,4 +1348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1315
1348
  }], customEvent: [{
1316
1349
  type: Output
1317
1350
  }] } });
1318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFNWixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixVQUFVLEdBRVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULG1CQUFtQixHQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixl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USxFQUFFLGtCQUFrQixFQUFFO3FCQUM1RCxpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFOzhCQThCOUIsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFNRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBTUcsMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgaW5qZWN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1BcnJheSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XHJcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHtcclxuICBNYXROYXRpdmVEYXRlTW9kdWxlLFxyXG4gIERhdGVBZGFwdGVyLFxyXG4gIE1BVF9EQVRFX0ZPUk1BVFMsXHJcbiAgTUFUX0RBVEVfTE9DQUxFLFxyXG4gIEVycm9yU3RhdGVNYXRjaGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgVWlBY2NvcmRpb25Db21wb25lbnQsIFVpQWNjb3JkaW9uRGVzY3JpcHRvciB9IGZyb20gJy4uL2FjY29yZGlvbi9pbmRleCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkNvbXBvbmVudCwgVWlCdXR0b25EZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9idXR0b24vaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkFyZWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24tYXJlYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U2VydmljZSB9IGZyb20gJy4uL2JsYWNrYm94L2JsYWNrYm94LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2xvZ2dpbmcvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgVWlGb3JtU2NoZW1hLCBVaUZvcm1TZWN0aW9uLCBVaUZvcm1EYXRhLCBVaUZvcm1DdXN0b21FdmVudCwgVWlGb3JtQnVpbGRlckNvbmZpZywgVWlSZXBlYXRhYmxlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9zY2hlbWEudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIFVpRm9ybUZpZWxkRGVzY3JpcHRvcixcclxuICBVaUZpZWxkT3B0aW9uLFxyXG4gIFVpRmllbGRUeXBlLFxyXG4gIFVpQ3VzdG9tRmllbGRUZW1wbGF0ZUNvbnRleHQsXHJcbn0gZnJvbSAnLi90eXBlcy9maWVsZC50eXBlcyc7XHJcbmltcG9ydCB7IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSwgVWlGb3JtRXJyb3JEZXRhaWwsIFVpVmFsaWRhdGlvblJ1bGUgfSBmcm9tICcuL3R5cGVzL3ZhbGlkYXRpb24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUZpZWxkQ29uZGl0aW9uIH0gZnJvbSAnLi90eXBlcy9jb25kaXRpb24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUZvcm1Db25kaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtLWNvbmRpdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlGb3JtRmllbGRFcnJvclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tZmllbGQtZXJyb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZXJyb3Itc3VtbWFyeS9mb3JtLWVycm9yLXN1bW1hcnkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlGaWxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2ZpbGUtaW5wdXQvZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaVNwZWNpZmljYVRlcnJpdG9yaWFsZUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvc3BlY2lmaWNhLXRlcnJpdG9yaWFsZS9zcGVjaWZpY2EtdGVycml0b3JpYWxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVpVGFibGVUZXJyaXRvcmlhbGVDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3RhYmxlLXRlcnJpdG9yaWFsZS90YWJsZS10ZXJyaXRvcmlhbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlMb2NhdGlvbkdlb2NvZGVkQ29tcG9uZW50IH0gZnJvbSAnLi9zdWItY29tcG9uZW50cy9sb2NhdGlvbi1nZW9jb2RlZC9sb2NhdGlvbi1nZW9jb2RlZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUZvcm1UZXh0RmllbGRDb21wb25lbnQsIFVpRm9ybVRleHRhcmVhRmllbGRDb21wb25lbnQsIFVpRm9ybU51bWJlckZpZWxkQ29tcG9uZW50LCBVaUZvcm1TZWxlY3RGaWVsZENvbXBvbmVudCwgVWlGb3JtUmFkaW9GaWVsZENvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZm9ybS1maWVsZHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUZvcm1FcnJvclN0YXRlTWF0Y2hlciB9IGZyb20gJy4vc2VydmljZXMvZm9ybS1lcnJvci1zdGF0ZS5tYXRjaGVyJztcclxuaW1wb3J0IHsgVWlJdGFsaWFuRGF0ZUFkYXB0ZXIsIFVJX0lUX0RBVEVfRk9STUFUUyB9IGZyb20gJy4vYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyJztcclxuXHJcbi8qKlxyXG4gKiBGb3JtIGJ1aWxkZXIgZGF0YS1kcml2ZW4gZSBzY2hlbWEtYmFzZWQuXHJcbiAqXHJcbiAqIEdlbmVyYSB1biBmb3JtIGNvbXBsZXRvIGEgcGFydGlyZSBkYSB1bm8gc2NoZW1hIGRpY2hpYXJhdGl2byAoYFVpRm9ybVNjaGVtYWApLlxyXG4gKiBTdXBwb3J0YSBpIHRpcGkgZGkgY2FtcG8gZGVsIGZvcm0gYnVpbGRlciwgdmFsaWRhemlvbmUgY29uZGl6aW9uYWxlLCBjcm9zcy1maWVsZCB2YWxpZGF0aW9uLFxyXG4gKiBkYXRlIGNvbiBvZmZzZXQsIG9wemlvbmkgZGlwZW5kZW50aS9kaW5hbWljaGUsIHNlemlvbmkgY29sbGFwc2liaWxpLFxyXG4gKiBlcnJvciBzdW1tYXJ5IGNvbiBzY3JvbGwtdG8tZmllbGQgZSBidXR0b24gb3ZlcnJpZGUuXHJcbiAqXHJcbiAqIEBzZWxlY3RvciB1aS1mb3JtLWJ1aWxkZXJcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktZm9ybS1idWlsZGVyXHJcbiAqICAgW3NjaGVtYV09XCJmb3JtU2NoZW1hXCJcclxuICogICBbaW5pdGlhbERhdGFdPVwidXNlckRhdGFcIlxyXG4gKiAgIChmb3JtU3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIlxyXG4gKiAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0tYnVpbGRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdFJhZGlvTW9kdWxlLFxyXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcclxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsXHJcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXHJcbiAgICBNYXRDaGlwc01vZHVsZSxcclxuICAgIFVpQWNjb3JkaW9uQ29tcG9uZW50LFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXHJcbiAgICBVaUJ1dHRvbkNvbXBvbmVudCxcclxuICAgIFVpQnV0dG9uQXJlYUNvbXBvbmVudCxcclxuICAgIFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCxcclxuICAgIFVpRmlsZUlucHV0Q29tcG9uZW50LFxyXG4gICAgVWlTcGVjaWZpY2FUZXJyaXRvcmlhbGVDb21wb25lbnQsXHJcbiAgICBVaVRhYmxlVGVycml0b3JpYWxlQ29tcG9uZW50LFxyXG4gICAgVWlMb2NhdGlvbkdlb2NvZGVkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtVGV4dEZpZWxkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtVGV4dGFyZWFGaWVsZENvbXBvbmVudCxcclxuICAgIFVpRm9ybU51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtU2VsZWN0RmllbGRDb21wb25lbnQsXHJcbiAgICBVaUZvcm1SYWRpb0ZpZWxkQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IEVycm9yU3RhdGVNYXRjaGVyLCB1c2VDbGFzczogVWlGb3JtRXJyb3JTdGF0ZU1hdGNoZXIgfSxcclxuICAgIC8vIExvY2FsZSBpdGFsaWFubyBwZXIgaWwgZGF0ZXBpY2tlciBNYXRlcmlhbFxyXG4gICAgeyBwcm92aWRlOiBNQVRfREFURV9MT0NBTEUsIHVzZVZhbHVlOiAnaXQtSVQnIH0sXHJcbiAgICAvLyBBZGFwdGVyIHBlcnNvbmFsaXp6YXRvIHBlciBwYXJzaW5nIEREL01NL1lZWVlcclxuICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBVaUl0YWxpYW5EYXRlQWRhcHRlciB9LFxyXG4gICAgLy8gRm9ybWF0aSBkYXRhIGl0YWxpYW5pIChERC9NTS9ZWVlZKVxyXG4gICAgeyBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogVUlfSVRfREFURV9GT1JNQVRTIH0sXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGhvc3Q6IHsgY2xhc3M6ICd1aS1mb3JtLWJ1aWxkZXItaG9zdCcgfSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybUJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmRpdGlvblNlcnZpY2UgPSBpbmplY3QoVWlGb3JtQ29uZGl0aW9uU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uU2VydmljZSA9IGluamVjdChVaUZvcm1WYWxpZGF0aW9uU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWVsZEVycm9yU2VydmljZSA9IGluamVjdChVaUZvcm1GaWVsZEVycm9yU2VydmljZSk7XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgT3B0aW9uYWwgQmxhY2tCb3ggc2VydmljZSDigJQgYXV0by10cmFja3MgZm9ybSBldmVudHMgd2hlbiBhdmFpbGFibGUuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBibGFja2JveCA9IGluamVjdChVaUJsYWNrYm94U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICAvKiogQGludGVybmFsIFJvdXRlciBpbmplY3QgZm9yIEJsYWNrQm94IHJvdXRlIGNvbnRleHQuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBiYlJvdXRlciA9IGluamVjdChSb3V0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcbiAgLyoqIEBpbnRlcm5hbCBPcHRpb25hbCBMb2dnZXIgc2VydmljZSDigJQgbG9ncyBmb3JtIGFjdGlvbnMgd2hlbiBhdmFpbGFibGUuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoVWlMb2dnZXJTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlU3ViPzogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaW50ZXJuYWwgTGlzdGVuZXIgY2xlYW51cCBmb3IgQmxhY2tCb3ggZm9jdXMvYmx1ciB0cmFja2luZy4gKi9cclxuICBwcml2YXRlIGJiRm9jdXNIYW5kbGVyOiAoKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiYkJsdXJIYW5kbGVyOiAoKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBJRCBzY2hlbWEgY29ycmVudGUgLS0gdXNhdG8gcGVyIGV2aXRhcmUgcmVidWlsZCBzdXBlcmZsdWkuICovXHJcbiAgcHJpdmF0ZSBjdXJyZW50U2NoZW1hSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDilIDilIDilIAgSW5wdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBTY2hlbWEgZGVsIGZvcm0uICovXHJcbiAgQElucHV0KCkgc2NoZW1hITogVWlGb3JtU2NoZW1hO1xyXG5cclxuICAvKiogRGF0aSBpbml6aWFsaSBwZXIgbGEgcHJldmFsb3JpenphemlvbmUuICovXHJcbiAgQElucHV0KCkgaW5pdGlhbERhdGE6IFVpRm9ybURhdGEgPSB7fTtcclxuXHJcbiAgLyoqIE1vZGFsaXRhIHNvbGEgbGV0dHVyYSBnbG9iYWxlLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdGF0byBkaXNhYmlsaXRhdG8gZ2xvYmFsZS4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogT3ZlcnJpZGUgZGVpIHB1bHNhbnRpIGRpIGRlZmF1bHQuICovXHJcbiAgQElucHV0KCkgYnV0dG9uc092ZXJyaWRlPzogVWlCdXR0b25EZXNjcmlwdG9yW107XHJcblxyXG4gIC8qKiBDaGlhdmUgZGVsIHB1bHNhbnRlIGluIHN0YXRvIGRpIGNhcmljYW1lbnRvLiAqL1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBNYXBwYSBjaGlhdmUgbG9naWNhIOKGkiB0ZW1wbGF0ZSBwZXIgY2FtcGkgYHR5cGU6ICdjdXN0b20nYC5cclxuICAgKiBMYSBjaGlhdmUgc2kgcmlzb2x2ZSBjb24gYGN1c3RvbUNvbmZpZy50ZW1wbGF0ZUtleWAsIHBvaSBgY3VzdG9tQ29uZmlnLmNvbXBvbmVudGAsIHBvaSBgZmllbGQua2V5YC5cclxuICAgKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8dW5rbm93bj4+ID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzYXRvIHF1YW5kbyBub24gZXNpc3RlIHVuYSB2b2NlIGluIGBjdXN0b21GaWVsZFRlbXBsYXRlc2AgcGVyIGxhIGNoaWF2ZSByaXNvbHRhXHJcbiAgICogKGVzLiB1biB1bmljbyBgbmctdGVtcGxhdGVgIGNvbiBgQHN3aXRjaGAgc3VsIGNhbXBvKS5cclxuICAgKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2s/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1WYWxpZGF0aW9uU3RhdGU+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1SZXNldCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybUN1c3RvbUV2ZW50PigpO1xyXG5cclxuICAvLyDilIDilIDilIAgU3RhdG8gaW50ZXJubyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xyXG5cclxuICAvKiogTWFwcGEgY2FtcG8gLT4gb3B6aW9uaSBmaWx0cmF0ZSAocGVyIGF1dG9jb21wbGV0ZSBlIGRlcGVuZGVudCkuICovXHJcbiAgZmlsdGVyZWRPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVaUZpZWxkT3B0aW9uW10+ID0ge307XHJcblxyXG4gIC8qKiBDYW1waSBwcmV2YWxvcml6emF0aSAobW9zdHJhbm8gZXJyb3JpIHN1Yml0bykuICovXHJcbiAgcHJldmFsb3JpemVkRmllbGRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBNYXBwYSBjYW1wbyAtPiByZWdvbGUgZGkgdmFsaWRhemlvbmUgKHBlciBsb29rdXAgcmFwaWRvKS4gKi9cclxuICBwcml2YXRlIHZhbGlkYXRpb25SdWxlc01hcDogUmVjb3JkPHN0cmluZywgVWlWYWxpZGF0aW9uUnVsZVtdPiA9IHt9O1xyXG5cclxuICAvKiogTWFwcGEgZGlwZW5kZW56ZTogY2FtcG9UYXJnZXQgLT4gY2FtcGkgZGlwZW5kZW50aS4gKi9cclxuICBwcml2YXRlIGZpZWxkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xyXG5cclxuICAvKiogQGludGVybmFsIEFjY29yZGlvbiBkZXNjcmlwdG9ycyBwZXIgbGUgc2V6aW9uaSBjb2xsYXBzaWJpbGkuICovXHJcbiAgc2VjdGlvbkFjY29yZGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBVaUFjY29yZGlvbkRlc2NyaXB0b3JbXT4oKTtcclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBBY2NvcmRpb24gZGVzY3JpcHRvcnMgcGVyIGxlIGlzdGFuemUgcmVwZWF0YWJsZSAoc2VjdGlvbklkIC0+IGRlc2NyaXB0b3JzKS4gKi9cclxuICByZXBlYXRhYmxlQWNjb3JkaW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIFVpQWNjb3JkaW9uRGVzY3JpcHRvcltdPigpO1xyXG5cclxuICAvKiogRmxhZyBwZXIgZXZpdGFyZSBlbWlzc2lvbmkgZHVyYW50ZSBsJ2luaXppYWxpenphemlvbmUuICovXHJcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemluZyA9IHRydWU7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBHZXR0ZXIgY2FsY29sYXRpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVHV0dGkgaSBjYW1waSBkaSB0dXR0ZSBsZSBzZXppb25pIChpbmNsdXNlIHJlcGVhdGFibGUpLiAqL1xyXG4gIGdldCBhbGxGaWVsZHMoKTogVWlGb3JtRmllbGREZXNjcmlwdG9yW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hPy5zZWN0aW9ucz8uZmxhdE1hcCgocykgPT4gcy5maWVsZHMpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbXBpIGRlbGxlIHNvbGUgc2V6aW9uaSBub24tcmVwZWF0YWJsZSAocGlhdHRpIG5lbCByb290IEZvcm1Hcm91cCkuICovXHJcbiAgZ2V0IGFsbEZsYXRGaWVsZHMoKTogVWlGb3JtRmllbGREZXNjcmlwdG9yW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hPy5zZWN0aW9ucz8uZmlsdGVyKChzKSA9PiAhcy5yZXBlYXRhYmxlKS5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcykgfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogU2V6aW9uaSBjb24gY29uZmlndXJhemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBnZXQgcmVwZWF0YWJsZVNlY3Rpb25zKCk6IFVpRm9ybVNlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY2hlbWE/LnNlY3Rpb25zPy5maWx0ZXIoKHMpID0+ICEhcy5yZXBlYXRhYmxlKSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtRXJyb3JzKCk6IFVpRm9ybUVycm9yRGV0YWlsW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybUJ1dHRvbnMoKTogVWlCdXR0b25EZXNjcmlwdG9yW10ge1xyXG4gICAgaWYgKHRoaXMuYnV0dG9uc092ZXJyaWRlKSByZXR1cm4gdGhpcy5idXR0b25zT3ZlcnJpZGU7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hPy5jb25maWc/LnNob3dCdXR0b25zICYmIHRoaXMuc2NoZW1hPy5jb25maWc/LnNob3dCdXR0b25zICE9PSB1bmRlZmluZWQpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuc2NoZW1hPy5jb25maWc/LmJ1dHRvbkxhYmVscz8ucmVzZXQgfHwgJ1Jlc2V0JywgdmFyaWFudDogJ291dGxpbmUnLCBhY3Rpb246ICgpID0+IHRoaXMub25SZXNldCgpIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogdGhpcy5zY2hlbWE/LmNvbmZpZz8uYnV0dG9uTGFiZWxzPy5zdWJtaXQgfHwgJ0ludmlhJyxcclxuICAgICAgICB2YXJpYW50OiAncHJpbWFyeScsXHJcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm9uU3VibWl0KCksXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvL1xyXG4gIC8vIE9SRElORSBMSUZFQ1lDTEUgQU5HVUxBUjpcclxuICAvLyAxLiBjb25zdHJ1Y3RvclxyXG4gIC8vIDIuIG5nT25DaGFuZ2VzIChwcmltYSBjaGlhbWF0YSBjb24gdmFsb3JpIGluaXppYWxpKVxyXG4gIC8vIDMuIG5nT25Jbml0XHJcbiAgLy8gNC4gbmdBZnRlclZpZXdJbml0XHJcbiAgLy8gNS4gbmdPbkNoYW5nZXMgKGNoaWFtYXRlIHN1Y2Nlc3NpdmUgcGVyIGNhbWJpbyBpbnB1dClcclxuICAvL1xyXG4gIC8vIFBFUiBJTCBXSVpBUkQ6XHJcbiAgLy8gSWwgd2l6YXJkIGNyZWEgdW4gbnVvdm8gc2NoZW1hIChjb24gaWQgZGl2ZXJzbykgYWQgb2duaSBjYW1iaW8gc3RlcC5cclxuICAvLyBMbyBzY2hlbWEgdmllbmUgY2FjaGF0byBuZWwgd2l6YXJkIHBlciBldml0YXJlIHJlYnVpbGQgaW5maW5pdGkuXHJcbiAgLy8gbmdPbkNoYW5nZXMgcmlsZXZhIGlsIGNhbWJpbyBkaSBzY2hlbWEuaWQgZSByaWNvc3RydWlzY2UgaWwgZm9ybS5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nRm9ybUFjdGlvbignaW5pdCcsIHsgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bicsIGhhc0Zvcm1Hcm91cDogISF0aGlzLmZvcm1Hcm91cCB9KTtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ2luaXQnLCB7IHNjaGVtYUlkOiAndW5rbm93bicsIGVycm9yOiAnc2NoZW1hIG5vbiBwcmVzZW50ZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdEZvcm1Gcm9tU2NoZW1hKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWxldmEgY2FtYmlhbWVudGkgc3VnbGkgQElucHV0LlxyXG4gICAqIFJpY29zdHJ1aXNjZSBpbCBmb3JtIHF1YW5kbyBjYW1iaWEgbG8gc2NoZW1hIChpZCBkaXZlcnNvKS5cclxuICAgKiBDcnVjaWFsZSBwZXIgaWwgd2l6YXJkIGNoZSBjYW1iaWEgc2NoZW1hIGFkIG9nbmkgc3RlcC5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc2NoZW1hJ10gJiYgIWNoYW5nZXNbJ3NjaGVtYSddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIGNvbnN0IG5ld1NjaGVtYSA9IGNoYW5nZXNbJ3NjaGVtYSddLmN1cnJlbnRWYWx1ZSBhcyBVaUZvcm1TY2hlbWE7XHJcbiAgICAgIGlmIChuZXdTY2hlbWEgJiYgbmV3U2NoZW1hLmlkICE9PSB0aGlzLmN1cnJlbnRTY2hlbWFJZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyPy5kZWJ1ZygnZm9ybScsICdzY2hlbWFSZWJ1aWxkJywge1xyXG4gICAgICAgICAgc2NoZW1hSWQ6IG5ld1NjaGVtYT8uaWQsXHJcbiAgICAgICAgICBwcmV2aW91c1NjaGVtYUlkOiB0aGlzLmN1cnJlbnRTY2hlbWFJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5pbml0Rm9ybUZyb21TY2hlbWEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZ2lvcm5hIGxvIHN0YXRvIGRpc2FibGVkL3JlYWRvbmx5IGdsb2JhbG1lbnRlXHJcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snZGlzYWJsZWQnXS5maXJzdENoYW5nZSAmJiB0aGlzLmZvcm1Hcm91cCkge1xyXG4gICAgICB0aGlzLmFsbEZsYXRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgICAgaWYgKCFjb250cm9sKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSB7XHJcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgY29udHJvbC5kaXNhYmxlZCAmJiAhZmllbGQuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQWdnaW9ybmEgZGlzYWJsZWQgYW5jaGUgbmVsbGUgaXN0YW56ZSByZXBlYXRhYmxlXHJcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnJlcGVhdGFibGVTZWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VGZyA9IGFyci5hdChpKSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBpbnN0YW5jZUZnLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAmJiBjb250cm9sLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc2FibGVkICYmIGNvbnRyb2wuZGlzYWJsZWQgJiYgIWZpZWxkLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ2dlcj8uZGVidWcoJ2Zvcm0nLCAnYWZ0ZXJWaWV3SW5pdCcsIHtcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgaGFzRm9ybUdyb3VwOiAhIXRoaXMuZm9ybUdyb3VwLFxyXG4gICAgICBmaWVsZENvdW50OiB0aGlzLmZvcm1Hcm91cCA/IE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5sZW5ndGggOiAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dGb3JtQWN0aW9uKCdkZXN0cm95JywgeyBzY2hlbWFJZDogdGhpcy5jdXJyZW50U2NoZW1hSWQgPz8gJ3Vua25vd24nIH0pO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViPy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIC8vIEJsYWNrQm94OiBjbGVhbnVwIERPTSBsaXN0ZW5lcnNcclxuICAgIGlmICh0aGlzLmJiRm9jdXNIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5iYkZvY3VzSGFuZGxlciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5iYkJsdXJIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIHRoaXMuYmJCbHVySGFuZGxlciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml6aWFsaXp6YSBpbCBmb3JtIGRhbGxvIHNjaGVtYSBjb3JyZW50ZS5cclxuICAgKiBFc3RyYXR0byBwZXIgcG90ZXIgZXNzZXJlIHJpY2hpYW1hdG8gc2lhIGRhIG5nT25Jbml0IGNoZSBkYSBuZ09uQ2hhbmdlcy5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRGb3JtRnJvbVNjaGVtYSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ2luaXQnLCB7IHNjaGVtYUlkOiAndW5rbm93bicsIGVycm9yOiAnc2NoZW1hIG51bGxvJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG90YWxGaWVsZHMgPSB0aGlzLnNjaGVtYS5zZWN0aW9ucz8ucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIHMuZmllbGRzLmxlbmd0aCwgMCkgPz8gMDtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dGb3JtQWN0aW9uKCdpbml0Jywge1xyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIHNlY3Rpb25Db3VudDogdGhpcy5zY2hlbWEuc2VjdGlvbnM/Lmxlbmd0aCxcclxuICAgICAgZmllbGRDb3VudDogdG90YWxGaWVsZHMsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY3VycmVudFNjaGVtYUlkID0gdGhpcy5zY2hlbWEuaWQ7XHJcbiAgICB0aGlzLmJ1aWxkU2VjdGlvbkFjY29yZGlvbk1hcCgpO1xyXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIC8vIERvcG8gaWwgRm9ybUFycmF5IHJlYWxlLCBhbGxpbmVhIGkgZGVzY3JpcHRvciBhY2NvcmRpb24gKG1heCB0cmEgbWluIGUgcmlnaGUgaW5pdGlhbERhdGEpLlxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmxvZ2dlcj8uZGVidWcoJ2Zvcm0nLCAnZm9ybUJ1aWx0Jywge1xyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIGNvbnRyb2xLZXlzOiBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scyksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1bGlzY2UgbG8gc3RhdG8gZGVsIGZvcm0gcHJpbWEgZGkgdW4gcmVidWlsZC5cclxuICAgKi9cclxuICBwcml2YXRlIGRlc3Ryb3lGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXI/LmRlYnVnKCdmb3JtJywgJ2Rlc3Ryb3lGb3JtJywgeyBzY2hlbWFJZDogdGhpcy5jdXJyZW50U2NoZW1hSWQgfSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZVN1YiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0ge307XHJcbiAgICB0aGlzLnByZXZhbG9yaXplZEZpZWxkcy5jbGVhcigpO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uUnVsZXNNYXAgPSB7fTtcclxuICAgIHRoaXMuZmllbGREZXBlbmRlbmNpZXMuY2xlYXIoKTtcclxuICAgIHRoaXMuc2VjdGlvbkFjY29yZGlvbk1hcC5jbGVhcigpO1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemluZyA9IHRydWU7XHJcbiAgICB0aGlzLmN1cnJlbnRTY2hlbWFJZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQ29zdHJ1emlvbmUgZm9ybSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBidWlsZEZvcm0oKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sczogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RDb250cm9sPiA9IHt9O1xyXG5cclxuICAgIC8vIENhbXBpIHBpYXR0aSAoc2V6aW9uaSBub24tcmVwZWF0YWJsZSlcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMuaW5pdGlhbERhdGE/LltmaWVsZC5rZXldID8/IGZpZWxkLmRlZmF1bHRWYWx1ZSA/PyBudWxsO1xyXG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gZmllbGQuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZDtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogaW5pdGlhbFZhbHVlLCBkaXNhYmxlZDogaXNEaXNhYmxlZCB9KTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9uPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlc01hcFtmaWVsZC5rZXldID0gZmllbGQudmFsaWRhdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPSBudWxsICYmIGluaXRpYWxWYWx1ZSAhPT0gJycgJiYgaW5pdGlhbFZhbHVlICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMucHJldmFsb3JpemVkRmllbGRzLmFkZChmaWVsZC5rZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZmllbGQub3B0aW9ucyAmJiAhdGhpcy5pc09ic2VydmFibGUoZmllbGQub3B0aW9ucykpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLihmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXSldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250cm9sc1tmaWVsZC5rZXldID0gY29udHJvbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtQXJyYXkgcGVyIHNlemlvbmkgcmVwZWF0YWJsZVxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxBcnJheSA9IHRoaXMuaW5pdGlhbERhdGE/LltzZWN0aW9uLmlkXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gfCB1bmRlZmluZWQ7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5nZXRSZXBlYXRhYmxlSW5pdGlhbEluc3RhbmNlQ291bnQoc2VjdGlvbik7XHJcblxyXG4gICAgICBjb25zdCBncm91cHM6IEZvcm1Hcm91cFtdID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKHRoaXMuYnVpbGRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLCBpbml0aWFsQXJyYXk/LltpXSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRyb2xzW3NlY3Rpb24uaWRdID0gbmV3IEZvcm1BcnJheShncm91cHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb250cm9scyk7XHJcblxyXG4gICAgLy8gQXBwbGljYSB2YWxpZGF0b3JpIGluaXppYWxpXHJcbiAgICB0aGlzLmFwcGx5QWxsVmFsaWRhdG9ycygpO1xyXG5cclxuICAgIC8vIFJlZ2lzdHJhIGRpcGVuZGVuemVcclxuICAgIHRoaXMuYnVpbGREZXBlbmRlbmN5TWFwKCk7XHJcblxyXG4gICAgLy8gU290dG9zY3JpdmkgYWkgY2FtYmlhbWVudGkgZGkgdmFsb3JlXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDUwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmV2YWx1YXRlQWxsQ29uZGl0aW9ucygpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURlcGVuZGVudE9wdGlvbnMoKTtcclxuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuZ2V0Rm9ybVZhbHVlKCkpO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHRoaXMuZ2V0VmFsaWRhdGlvblN0YXRlKCkpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBWYWx1dGF6aW9uZSBjb25kaXppb25pIGluaXppYWxlXHJcbiAgICB0aGlzLmV2YWx1YXRlQWxsQ29uZGl0aW9ucygpO1xyXG5cclxuICAgIC8vIEJsYWNrQm94OiBzZXR1cCBmb3JtIGV2ZW50IHRyYWNraW5nXHJcbiAgICB0aGlzLnNldHVwQmxhY2tib3hUcmFja2luZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvc3RydWlzY2UgdW4gRm9ybUdyb3VwIHBlciB1bmEgc2luZ29sYSBpc3RhbnphIGRpIHNlemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBwcml2YXRlIGJ1aWxkSW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbjogVWlGb3JtU2VjdGlvbiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgY29udHJvbHM6IFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcclxuICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZGF0YT8uW2ZpZWxkLmtleV0gPz8gZmllbGQuZGVmYXVsdFZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBmaWVsZC5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkO1xyXG4gICAgICBjb250cm9sc1tmaWVsZC5rZXldID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGluaXRpYWxWYWx1ZSwgZGlzYWJsZWQ6IGlzRGlzYWJsZWQgfSk7XHJcblxyXG4gICAgICBpZiAoZmllbGQub3B0aW9ucyAmJiAhdGhpcy5pc09ic2VydmFibGUoZmllbGQub3B0aW9ucykpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLihmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXSldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmcgPSBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzKTtcclxuXHJcbiAgICAvLyBBcHBsaWNhIHZhbGlkYXRvcmkgYWxsJ2lzdGFuemFcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb24/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gZmcuZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsaWRhdG9ycyhmZy5nZXQoZmllbGQua2V5KSEsIGZpZWxkLnZhbGlkYXRpb24sIGZvcm1EYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmZztcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBCbGFja0JveCBmb3JtIHRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHVwIEJsYWNrQm94IGZvcm0gZXZlbnQgdHJhY2tpbmcuXHJcbiAgICogLSBGb2N1cy9ibHVyOiBET00gZXZlbnQgZGVsZWdhdGlvbiBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICogLSBWYWx1ZSBjaGFuZ2VzOiBwZXItZmllbGQgc3Vic2NyaXB0aW9ucyB3aXRoIGRlYm91bmNlXHJcbiAgICogLSBWYWxpZGF0aW9uIGVycm9yczogcGVyLWZpZWxkIHN0YXR1c0NoYW5nZXMgc3Vic2NyaXB0aW9uc1xyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBCbGFja2JveFRyYWNraW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmJsYWNrYm94KSByZXR1cm47XHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJsYWNrYm94LmdldENvbmZpZygpLmZvcm1UcmFja2luZztcclxuICAgIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IHRoaXMuYmJSb3V0ZXI/LnVybCA/PyAnJztcclxuICAgIGNvbnN0IGZvcm1JZCA9IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bic7XHJcblxyXG4gICAgLy8gRm9jdXMgdHJhY2tpbmcgdmlhIGV2ZW50IGRlbGVnYXRpb25cclxuICAgIGlmIChjb25maWcudHJhY2tGb2N1cykge1xyXG4gICAgICB0aGlzLmJiRm9jdXNIYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZEtleSA9IHRoaXMucmVzb2x2ZUZpZWxkS2V5RnJvbUV2ZW50KGUpO1xyXG4gICAgICAgIGlmICghZmllbGRLZXkpIHJldHVybjtcclxuICAgICAgICB0aGlzLmJsYWNrYm94IS50cmFja0Zvcm1FdmVudCh7XHJcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgICAgICByb3V0ZTogdGhpcy5iYlJvdXRlcj8udXJsID8/IGN1cnJlbnRSb3V0ZSxcclxuICAgICAgICAgIGZvcm1JZCxcclxuICAgICAgICAgIGZpZWxkS2V5LFxyXG4gICAgICAgICAgZXZlbnRUeXBlOiAnZm9jdXMnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuYmJGb2N1c0hhbmRsZXIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEJsdXIgdHJhY2tpbmcgdmlhIGV2ZW50IGRlbGVnYXRpb25cclxuICAgIGlmIChjb25maWcudHJhY2tCbHVyKSB7XHJcbiAgICAgIHRoaXMuYmJCbHVySGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmllbGRLZXkgPSB0aGlzLnJlc29sdmVGaWVsZEtleUZyb21FdmVudChlKTtcclxuICAgICAgICBpZiAoIWZpZWxkS2V5KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5ibGFja2JveCEudHJhY2tGb3JtRXZlbnQoe1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IHRoaXMuYmJSb3V0ZXI/LnVybCA/PyBjdXJyZW50Um91dGUsXHJcbiAgICAgICAgICBmb3JtSWQsXHJcbiAgICAgICAgICBmaWVsZEtleSxcclxuICAgICAgICAgIGV2ZW50VHlwZTogJ2JsdXInLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCB0aGlzLmJiQmx1ckhhbmRsZXIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlci1maWVsZCB2YWx1ZSBjaGFuZ2UgKyB2YWxpZGF0aW9uIHRyYWNraW5nXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KTtcclxuICAgICAgaWYgKCFjb250cm9sKSBjb250aW51ZTtcclxuXHJcbiAgICAgIC8vIFZhbHVlIGNoYW5nZXNcclxuICAgICAgaWYgKGNvbmZpZy50cmFja1ZhbHVlQ2hhbmdlcykge1xyXG4gICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKGNvbmZpZy5kZWJvdW5jZU1zKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ibGFja2JveCEudHJhY2tGb3JtRXZlbnQoe1xyXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICByb3V0ZTogdGhpcy5iYlJvdXRlcj8udXJsID8/IGN1cnJlbnRSb3V0ZSxcclxuICAgICAgICAgICAgICBmb3JtSWQsXHJcbiAgICAgICAgICAgICAgZmllbGRLZXk6IGZpZWxkLmtleSxcclxuICAgICAgICAgICAgICBldmVudFR5cGU6ICd2YWx1ZUNoYW5nZScsXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb25maWcudHJhY2tWYWx1ZXMgPyB2YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHZhbGlkOiBjb250cm9sLnZhbGlkLFxyXG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlczogY29uZmlnLnRyYWNrVmFsdWVzID8gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBWYWxpZGF0aW9uIGVycm9yc1xyXG4gICAgICBpZiAoY29uZmlnLnRyYWNrVmFsaWRhdGlvbikge1xyXG4gICAgICAgIGNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIHJ4RmlsdGVyKChzdGF0dXMpID0+IHN0YXR1cyA9PT0gJ0lOVkFMSUQnKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGNvbnRyb2wuZXJyb3JzXHJcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycylcclxuICAgICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmJsYWNrYm94IS50cmFja0Zvcm1FdmVudCh7XHJcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiB0aGlzLmJiUm91dGVyPy51cmwgPz8gY3VycmVudFJvdXRlLFxyXG4gICAgICAgICAgICAgIGZvcm1JZCxcclxuICAgICAgICAgICAgICBmaWVsZEtleTogZmllbGQua2V5LFxyXG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRpb25FcnJvcicsXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlIHRoZSBmb3JtIGZpZWxkIGtleSBmcm9tIGEgZm9jdXMvYmx1ciBET00gZXZlbnQuXHJcbiAgICogV2Fsa3MgdXAgZnJvbSB0aGUgZXZlbnQgdGFyZ2V0IGxvb2tpbmcgZm9yIGBmb3JtQ29udHJvbE5hbWVgIG9yIGBkYXRhLWZpZWxkLWtleWAuXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNvbHZlRmllbGRLZXlGcm9tRXZlbnQoZTogRm9jdXNFdmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IG1heERlcHRoID0gNTtcclxuICAgIGxldCBkZXB0aCA9IDA7XHJcblxyXG4gICAgd2hpbGUgKHRhcmdldCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XHJcbiAgICAgIC8vIGZvcm1Db250cm9sTmFtZSBhdHRyaWJ1dGVcclxuICAgICAgY29uc3QgZmNuID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZm9ybUNvbnRyb2xOYW1lJyk7XHJcbiAgICAgIGlmIChmY24pIHJldHVybiBmY247XHJcblxyXG4gICAgICAvLyBkYXRhLWZpZWxkLWtleSBhdHRyaWJ1dGVcclxuICAgICAgY29uc3QgZGZrID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1maWVsZC1rZXknKTtcclxuICAgICAgaWYgKGRmaykgcmV0dXJuIGRmaztcclxuXHJcbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICBkZXB0aCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVmFsaWRhemlvbmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYXBwbHlBbGxWYWxpZGF0b3JzKCk6IHZvaWQge1xyXG4gICAgLy8gQ2FtcGkgcGlhdHRpXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmxhdEZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UudXBkYXRlRmllbGRWYWxpZGF0b3JzKHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiwgZm9ybURhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FtcGkgbmVsbGUgaXN0YW56ZSByZXBlYXRhYmxlXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5yZXBlYXRhYmxlU2VjdGlvbnMpIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbi5pZCk7XHJcbiAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUZnID0gYXJyLmF0KGkpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzKSB7XHJcbiAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gaW5zdGFuY2VGZy5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsaWRhdG9ycyhpbnN0YW5jZUZnLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiwgZm9ybURhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENvbmRpemlvbmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVBbGxDb25kaXRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIC8vIENhbXBpIHBpYXR0aVxyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmFsbEZsYXRGaWVsZHMpIHtcclxuICAgICAgdGhpcy5ldmFsdWF0ZUZpZWxkQ29uZGl0aW9ucyhmaWVsZCwgdGhpcy5mb3JtR3JvdXAsIGZvcm1EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW1waSBuZWxsZSBpc3RhbnplIHJlcGVhdGFibGUgKHNjb3BlIGludHJhLWlzdGFuemEpXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5yZXBlYXRhYmxlU2VjdGlvbnMpIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbi5pZCk7XHJcbiAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUZnID0gYXJyLmF0KGkpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSBpbnN0YW5jZUZnLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkcykge1xyXG4gICAgICAgICAgdGhpcy5ldmFsdWF0ZUZpZWxkQ29uZGl0aW9ucyhmaWVsZCwgaW5zdGFuY2VGZywgaW5zdGFuY2VEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBWYWx1dGEgY29uZGl6aW9uaSBkaSB2aXNpYmlsaXRhL2Rpc2FiaWxpdGF6aW9uZSBwZXIgdW4gc2luZ29sbyBjYW1wbyBuZWwgY29udGVzdG8gZGVsIEZvcm1Hcm91cCBkYXRvLiAqL1xyXG4gIHByaXZhdGUgZXZhbHVhdGVGaWVsZENvbmRpdGlvbnMoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgZmc6IEZvcm1Hcm91cCwgZm9ybURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZC5jb25kaXRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuY29uZGl0aW9ucywgZm9ybURhdGEpO1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGNvbnRyb2wuZW5hYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGlmICghZmllbGQuZnJlZXplVmFsdWVPbkRpc2FibGUpIHtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUgPz8gbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodmlzaWJsZSAmJiBjb250cm9sLmRpc2FibGVkICYmICFmaWVsZC5kaXNhYmxlZCAmJiAhdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC5kaXNhYmxlQ29uZGl0aW9ucz8ubGVuZ3RoICYmICFmaWVsZC5jb25kaXRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3Qgc2hvdWxkRGlzYWJsZSA9IHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuZGlzYWJsZUNvbmRpdGlvbnMsIGZvcm1EYXRhKTtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZnLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGlmIChzaG91bGREaXNhYmxlICYmIGNvbnRyb2wuZW5hYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGlmICghZmllbGQuZnJlZXplVmFsdWVPbkRpc2FibGUpIHtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUgPz8gbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3VsZERpc2FibGUgJiYgY29udHJvbC5kaXNhYmxlZCAmJiAhZmllbGQuZGlzYWJsZWQgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8uc29tZSgocikgPT4gci5jb25kaXRpb25zPy5sZW5ndGgpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UudXBkYXRlRmllbGRWYWxpZGF0b3JzKGZnLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiEsIGZvcm1EYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBEaXBlbmRlbnplIG9wemlvbmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYnVpbGREZXBlbmRlbmN5TWFwKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmFsbEZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuZGVwZW5kZW50T3B0aW9ucz8uZGVwZW5kc09uKSB7XHJcbiAgICAgICAgY29uc3QgZGVwS2V5ID0gZmllbGQuZGVwZW5kZW50T3B0aW9ucy5kZXBlbmRzT247XHJcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkRGVwZW5kZW5jaWVzLmhhcyhkZXBLZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkRGVwZW5kZW5jaWVzLnNldChkZXBLZXksIG5ldyBTZXQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmllbGREZXBlbmRlbmNpZXMuZ2V0KGRlcEtleSkhLmFkZChmaWVsZC5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3N0cnVpc2NlIGxhIG1hcHBhIGRlaSBkZXNjcmlwdG9ycyBhY2NvcmRpb24gcGVyIGxlIHNlemlvbmkgY29sbGFwc2liaWxpLlxyXG4gICAqIE9nbmkgc2V6aW9uZSBjb2xsYXBzaWJpbGUgdmllbmUgbWFwcGF0YSBhIHVuIHNpbmdvbG8gVWlBY2NvcmRpb25EZXNjcmlwdG9yLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRTZWN0aW9uQWNjb3JkaW9uTWFwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWN0aW9uQWNjb3JkaW9uTWFwLmNsZWFyKCk7XHJcbiAgICB0aGlzLnJlcGVhdGFibGVBY2NvcmRpb25NYXAuY2xlYXIoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zY2hlbWEuc2VjdGlvbnMpIHtcclxuICAgICAgaWYgKHNlY3Rpb24ucmVwZWF0YWJsZSkge1xyXG4gICAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbi5jb2xsYXBzaWJsZSkge1xyXG4gICAgICAgIHRoaXMuc2VjdGlvbkFjY29yZGlvbk1hcC5zZXQoc2VjdGlvbi5pZCwgW3tcclxuICAgICAgICAgIGlkOiBzZWN0aW9uLmlkLFxyXG4gICAgICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUgfHwgJycsXHJcbiAgICAgICAgICBpY29uOiBzZWN0aW9uLmljb24sXHJcbiAgICAgICAgICBleHBhbmRlZDogIXNlY3Rpb24uY29sbGFwc2VkLFxyXG4gICAgICAgICAgc3VidGl0bGU6IHNlY3Rpb24uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgfV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOdW1lcm8gZGkgaXN0YW56ZSByZXBlYXRhYmxlIGRhIGNyZWFyZSBhbCBidWlsZC9yZXNldDpcclxuICAgKiBhbG1lbm8gYHJlcGVhdGFibGUubWluYCAoc2UgYG1pbiA+IDBgIG8gb21lc3NvIGRlZmF1bHQgMSksIG1haSBtZW5vIGRlbGxlIHJpZ2hlIGluIGBpbml0aWFsRGF0YVtzZWN0aW9uLmlkXWAuXHJcbiAgICogQ29uIGBtaW46IDBgIG5vbiBzaSBhZ2dpdW5nb25vIHJpZ2hlIG9sdHJlIGEgcXVlbGxlIGdpw6AgcHJlc2VudGkgbmVpIGRhdGkgaW5pemlhbGkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRSZXBlYXRhYmxlSW5pdGlhbEluc3RhbmNlQ291bnQoc2VjdGlvbjogVWlGb3JtU2VjdGlvbik6IG51bWJlciB7XHJcbiAgICBjb25zdCBjZmcgPSBzZWN0aW9uLnJlcGVhdGFibGU7XHJcbiAgICBpZiAoIWNmZykgcmV0dXJuIDA7XHJcbiAgICBjb25zdCBpbml0aWFsQXJyYXkgPSB0aGlzLmluaXRpYWxEYXRhPy5bc2VjdGlvbi5pZF0gYXMgUmVjb3JkPHN0cmluZywgYW55PltdIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgaW5pdGlhbExlbiA9IGluaXRpYWxBcnJheT8ubGVuZ3RoID8/IDA7XHJcbiAgICBjb25zdCBtaW5SZXEgPSBjZmcubWluO1xyXG4gICAgaWYgKG1pblJlcSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gaW5pdGlhbExlbjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1pbkluc3RhbmNlcyA9IG1pblJlcSA/PyAxO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KGluaXRpYWxMZW4sIG1pbkluc3RhbmNlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmljb3N0cnVpc2NlIGkgZGVzY3JpcHRvciBhY2NvcmRpb24gcGVyIGxlIGlzdGFuemUgZGkgdW5hIHNlemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBwcml2YXRlIHJlYnVpbGRSZXBlYXRhYmxlQWNjb3JkaW9uKHNlY3Rpb246IFVpRm9ybVNlY3Rpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgY29uc3QgY291bnQgPSBhcnI/Lmxlbmd0aCA/PyB0aGlzLmdldFJlcGVhdGFibGVJbml0aWFsSW5zdGFuY2VDb3VudChzZWN0aW9uKTtcclxuICAgIGNvbnN0IHRpdGxlVGVtcGxhdGUgPSBzZWN0aW9uLnJlcGVhdGFibGUhLmluc3RhbmNlVGl0bGUgfHwgKHNlY3Rpb24udGl0bGUgPyBgJHtzZWN0aW9uLnRpdGxlfSB7aW5kZXh9YCA6ICdFbGVtZW50byB7aW5kZXh9Jyk7XHJcbiAgICBjb25zdCBpdGVtczogVWlBY2NvcmRpb25EZXNjcmlwdG9yW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgaWQ6IGAke3NlY3Rpb24uaWR9LSR7aX1gLFxyXG4gICAgICAgIHRpdGxlOiB0aXRsZVRlbXBsYXRlLnJlcGxhY2UoJ3tpbmRleH0nLCBTdHJpbmcoaSArIDEpKSxcclxuICAgICAgICBpY29uOiBzZWN0aW9uLmljb24sXHJcbiAgICAgICAgZXhwYW5kZWQ6IHRydWUsXHJcbiAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVwZWF0YWJsZUFjY29yZGlvbk1hcC5zZXQoc2VjdGlvbi5pZCwgaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEZXBlbmRlbnRPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGaWVsZHMpIHtcclxuICAgICAgLy8gRHluYW1pYyBvcHRpb25zXHJcbiAgICAgIGlmIChmaWVsZC5keW5hbWljT3B0aW9ucykge1xyXG4gICAgICAgIGlmIChmaWVsZC5keW5hbWljT3B0aW9ucy50eXBlID09PSAneWVhci1yYW5nZScpIHtcclxuICAgICAgICAgIGNvbnN0IG1pbiA9IGZpZWxkLmR5bmFtaWNPcHRpb25zLm1pblllYXIgfHwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gMTA7XHJcbiAgICAgICAgICBjb25zdCBtYXggPSBmaWVsZC5keW5hbWljT3B0aW9ucy5tYXhZZWFyIHx8IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgIGNvbnN0IG9wdHM6IFVpRmllbGRPcHRpb25bXSA9IFtdO1xyXG4gICAgICAgICAgZm9yIChsZXQgeSA9IG1heDsgeSA+PSBtaW47IHktLSkge1xyXG4gICAgICAgICAgICBvcHRzLnB1c2goeyB2YWx1ZTogeSwgbGFiZWw6IFN0cmluZyh5KSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gPSBvcHRzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZHluYW1pY09wdGlvbnMuZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gZmllbGQuZHluYW1pY09wdGlvbnMuZ2VuZXJhdG9yKGZvcm1EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIERlcGVuZGVudCBvcHRpb25zXHJcbiAgICAgIGlmIChmaWVsZC5kZXBlbmRlbnRPcHRpb25zICYmIGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgY29uc3QgZGVwID0gZmllbGQuZGVwZW5kZW50T3B0aW9ucztcclxuICAgICAgICBjb25zdCBkZXBWYWx1ZSA9IGZvcm1EYXRhW2RlcC5kZXBlbmRzT25dO1xyXG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXTtcclxuXHJcbiAgICAgICAgaWYgKGRlcFZhbHVlID09IG51bGwgfHwgZGVwVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLmFsbE9wdGlvbnNdO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRlcC5maWx0ZXJUeXBlID09PSAnY3VzdG9tJyAmJiBkZXAuZmlsdGVyRm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlcC5maWx0ZXJGbihvcHQsIGRlcFZhbHVlLCBmb3JtRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBvcHRWYWwgPSBOdW1iZXIob3B0LnZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IGRlcFZhbCA9IE51bWJlcihkZXBWYWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaXNOYU4ob3B0VmFsKSB8fCBpc05hTihkZXBWYWwpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKGRlcC5maWx0ZXJUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyZWF0ZXJfdGhhbic6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA+IGRlcFZhbDtcclxuICAgICAgICAgICAgY2FzZSAnZ3JlYXRlcl9lcXVhbCc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA+PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xlc3NfdGhhbic6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA8IGRlcFZhbDtcclxuICAgICAgICAgICAgY2FzZSAnbGVzc19lcXVhbCc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA8PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGNhc2UgJ2VxdWFscyc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA9PT0gZGVwVmFsO1xyXG4gICAgICAgICAgICBjYXNlICdub3RfZXF1YWxzJzpcclxuICAgICAgICAgICAgICByZXR1cm4gb3B0VmFsICE9PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBBUEkgcHViYmxpY2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1biBjYW1wbyBlIHZpc2liaWxlIChvcHppb25hbG1lbnRlIG5lbCBjb250ZXN0byBkaSB1biBGb3JtR3JvdXAgc3BlY2lmaWNvKS4gKi9cclxuICBpc0ZpZWxkVmlzaWJsZShmaWVsZEtleTogc3RyaW5nLCBmZz86IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKChmKSA9PiBmLmtleSA9PT0gZmllbGRLZXkpO1xyXG4gICAgaWYgKCFmaWVsZD8uY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHRhcmdldCA9IGZnIHx8IHRoaXMuZm9ybUdyb3VwO1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuY29uZGl0aW9ucywgdGFyZ2V0LmdldFJhd1ZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFZlcmlmaWNhIHNlIHVuIGNhbXBvIGUgb2JibGlnYXRvcmlvIChpbmNsdWRlIHZhbGlkYXppb25lIGNvbmRpemlvbmFsZSkuICovXHJcbiAgaXNGaWVsZFJlcXVpcmVkKGZpZWxkS2V5OiBzdHJpbmcsIGZnPzogRm9ybUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoKGYpID0+IGYua2V5ID09PSBmaWVsZEtleSk7XHJcbiAgICBpZiAoZmllbGQ/LnJlcXVpcmVkKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBydWxlcyA9IGZpZWxkPy52YWxpZGF0aW9uIHx8IFtdO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRhcmdldC5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIHJ1bGVzLnNvbWUoKHIpID0+IHtcclxuICAgICAgaWYgKHIudHlwZSAhPT0gJ3JlcXVpcmVkJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoIXIuY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoci5jb25kaXRpb25zLCBmb3JtRGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1bmEgc2V6aW9uZSBlIHZpc2liaWxlLiAqL1xyXG4gIGlzU2VjdGlvblZpc2libGUoc2VjdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uPy5jb25kaXRpb25zPy5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoc2VjdGlvbi5jb25kaXRpb25zLCB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKiBEZXNjcmlwdG9ycyBhY2NvcmRpb24gcGVyIHVuYSBzZXppb25lIGNvbGxhcHNpYmlsZS4gKi9cclxuICBnZXRTZWN0aW9uQWNjb3JkaW9uSXRlbXMoc2VjdGlvbklkOiBzdHJpbmcpOiBVaUFjY29yZGlvbkRlc2NyaXB0b3JbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9uQWNjb3JkaW9uTWFwLmdldChzZWN0aW9uSWQpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlc2NyaXB0b3JzIGFjY29yZGlvbiBwZXIgbGUgaXN0YW56ZSBkaSB1bmEgc2V6aW9uZSByZXBlYXRhYmxlLiAqL1xyXG4gIGdldFJlcGVhdGFibGVBY2NvcmRpb25JdGVtcyhzZWN0aW9uSWQ6IHN0cmluZyk6IFVpQWNjb3JkaW9uRGVzY3JpcHRvcltdIHtcclxuICAgIHJldHVybiB0aGlzLnJlcGVhdGFibGVBY2NvcmRpb25NYXAuZ2V0KHNlY3Rpb25JZCkgfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogVmVyaWZpY2Egc2UgbW9zdHJhcmUgZXJyb3JpIHBlciB1biBjYW1wby4gKi9cclxuICBzaG91bGRTaG93RmllbGRFcnJvcnMoZmllbGRLZXk6IHN0cmluZywgZmc/OiBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGZnIHx8IHRoaXMuZm9ybUdyb3VwO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRhcmdldC5nZXQoZmllbGRLZXkpO1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRFcnJvclNlcnZpY2Uuc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGNvbnRyb2wsIHtcclxuICAgICAgdHJlYXRBc1ByZXZhbG9yaXplZDogdGhpcy5wcmV2YWxvcml6ZWRGaWVsZHMuaGFzKGZpZWxkS2V5KSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVycm9yaSBkaSB1biBjYW1wbyBjb21lIGFycmF5IGRpIG1lc3NhZ2dpLiAqL1xyXG4gIGdldEZpZWxkRXJyb3JzKGZpZWxkS2V5OiBzdHJpbmcsIGZnPzogRm9ybUdyb3VwKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGFyZ2V0LmdldChmaWVsZEtleSk7XHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoKGYpID0+IGYua2V5ID09PSBmaWVsZEtleSk7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZEVycm9yU2VydmljZS5nZXRGaWVsZEVycm9ycyhjb250cm9sLCBmaWVsZD8udmFsaWRhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKiogVmFsb3JlIGNvbXBsZXRvIGRlbCBmb3JtIChpbmNsdWRlIGNhbXBpIGRpc2FiaWxpdGF0aSkuICovXHJcbiAgZ2V0Rm9ybVZhbHVlKCk6IFVpRm9ybURhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogSWwgZm9ybSBlIHZhbGlkby4gKi9cclxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWxpZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgc2UgdHV0dGkgaSBjb250cm9sbGkgc29ubyB2YWxpZGksIGlnbm9yYW5kbyBsZSBjaGlhdmkgaW5kaWNhdGVcclxuICAgKiAoZmxhdCBlIGRlbnRybyBvZ25pIGlzdGFuemEgcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgaXNGb3JtVmFsaWRFeGNsdWRpbmdGaWVsZEtleXMoZXhjbHVkZWRLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0Zvcm1Hcm91cFZhbGlkRXhjbHVkaW5nKHRoaXMuZm9ybUdyb3VwLCBleGNsdWRlZEtleXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlzb2x2ZSBsYSBjaGlhdmUgcGVyIGBjdXN0b21GaWVsZFRlbXBsYXRlc2AgKGB0ZW1wbGF0ZUtleWAg4oaSIGBjb21wb25lbnRgIOKGkiBgZmllbGQua2V5YCkuXHJcbiAgICovXHJcbiAgcmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2MgPSBmaWVsZC5jdXN0b21Db25maWc7XHJcbiAgICByZXR1cm4gY2M/LnRlbXBsYXRlS2V5ID8/IGNjPy5jb21wb25lbnQgPz8gZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGVtcGxhdGUgQW5ndWxhciByZWdpc3RyYXRvIHBlciBpbCBjYW1wbyBjdXN0b20sIG8gZmFsbGJhY2sgZ2xvYmFsZS5cclxuICAgKi9cclxuICBnZXRDdXN0b21UZW1wbGF0ZVJlZihmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMucmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkKTtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpZWxkVGVtcGxhdGVzW2tleV0gPz8gdGhpcy5jdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2sgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRlc3RvIHBhc3NhdG8gYSBgbmdUZW1wbGF0ZU91dGxldGAgcGVyIGlsIGNhbXBvIGN1c3RvbSAoQ1ZBIHN1bCBgY29udHJvbGApLlxyXG4gICAqL1xyXG4gIGdldEN1c3RvbUZpZWxkT3V0bGV0Q29udGV4dChmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLCBmZzogRm9ybUdyb3VwKTogVWlDdXN0b21GaWVsZFRlbXBsYXRlQ29udGV4dCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGZpZWxkLmtleSkgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkaW1wbGljaXQ6IGZpZWxkLFxyXG4gICAgICBmaWVsZCxcclxuICAgICAgZm9ybUdyb3VwOiBmZyxcclxuICAgICAgY29udHJvbCxcclxuICAgICAgY29uZmlnOiBmaWVsZC5jdXN0b21Db25maWc/LmNvbmZpZyA/PyB7fSxcclxuICAgICAgZW1pdEN1c3RvbUV2ZW50OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHtcclxuICAgICAgICB0aGlzLmN1c3RvbUV2ZW50LmVtaXQoeyBmaWVsZDogZmllbGQua2V5LCBldmVudCwgZGF0YSB9KTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUZW1wbGF0ZSBlIGNvbnRlc3RvIGluIHVuIHNvbG8gb2dnZXR0byAoZXZpdGEgZG9wcGllIHZhbHV0YXppb25pIG5lbCB0ZW1wbGF0ZSkuXHJcbiAgICovXHJcbiAgZ2V0Q3VzdG9tRmllbGRPdXRsZXQoXHJcbiAgICBmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLFxyXG4gICAgZmc6IEZvcm1Hcm91cCxcclxuICApOiB7IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjsgY29udGV4dDogVWlDdXN0b21GaWVsZFRlbXBsYXRlQ29udGV4dCB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZ2V0Q3VzdG9tVGVtcGxhdGVSZWYoZmllbGQpO1xyXG4gICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4geyB0ZW1wbGF0ZSwgY29udGV4dDogdGhpcy5nZXRDdXN0b21GaWVsZE91dGxldENvbnRleHQoZmllbGQsIGZnKSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0Zvcm1Hcm91cFZhbGlkRXhjbHVkaW5nKGdyb3VwOiBGb3JtR3JvdXAsIGV4Y2x1ZGVkS2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZ3JvdXAuY29udHJvbHMpKSB7XHJcbiAgICAgIGNvbnN0IGMgPSBncm91cC5nZXQoa2V5KTtcclxuICAgICAgaWYgKCFjKSBjb250aW51ZTtcclxuICAgICAgaWYgKGMgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHJvdyA9IGMuYXQoaSk7XHJcbiAgICAgICAgICBpZiAocm93IGluc3RhbmNlb2YgRm9ybUdyb3VwICYmICF0aGlzLmlzRm9ybUdyb3VwVmFsaWRFeGNsdWRpbmcocm93LCBleGNsdWRlZEtleXMpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Zvcm1Hcm91cFZhbGlkRXhjbHVkaW5nKGMsIGV4Y2x1ZGVkS2V5cykpIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wpIHtcclxuICAgICAgICBpZiAoZXhjbHVkZWRLZXlzLmhhcyhrZXkpKSBjb250aW51ZTtcclxuICAgICAgICBpZiAoYy5pbnZhbGlkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0YXRvIGRpIHZhbGlkYXppb25lIGNvbXBsZXRvLiAqL1xyXG4gIGdldFZhbGlkYXRpb25TdGF0ZSgpOiBVaUZvcm1WYWxpZGF0aW9uU3RhdGUge1xyXG4gICAgY29uc3QgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcclxuICAgIGNvbnN0IGRpcnR5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgdG91Y2hlZDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmxhdEZpZWxkcykge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgIGlmICghY29udHJvbCkgY29udGludWU7XHJcbiAgICAgIGlmIChjb250cm9sLmRpcnR5KSBkaXJ0eS5wdXNoKGZpZWxkLmtleSk7XHJcbiAgICAgIGlmIChjb250cm9sLnRvdWNoZWQpIHRvdWNoZWQucHVzaChmaWVsZC5rZXkpO1xyXG4gICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHRoaXMuZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5KTtcclxuICAgICAgaWYgKGZpZWxkRXJyb3JzLmxlbmd0aCkgZXJyb3JzW2ZpZWxkLmtleV0gPSBmaWVsZEVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbmNsdWRpIGVycm9yaSBkZWxsZSBpc3RhbnplIHJlcGVhdGFibGVcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnJlcGVhdGFibGVTZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uLmlkKTtcclxuICAgICAgaWYgKCFhcnIpIGNvbnRpbnVlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlRmcgPSBhcnIuYXQoaSkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBpbnN0YW5jZUZnLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICAgICAgaWYgKCFjb250cm9sKSBjb250aW51ZTtcclxuICAgICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7c2VjdGlvbi5pZH1bJHtpfV0uJHtmaWVsZC5rZXl9YDtcclxuICAgICAgICAgIGlmIChjb250cm9sLmRpcnR5KSBkaXJ0eS5wdXNoKHByZWZpeGVkS2V5KTtcclxuICAgICAgICAgIGlmIChjb250cm9sLnRvdWNoZWQpIHRvdWNoZWQucHVzaChwcmVmaXhlZEtleSk7XHJcbiAgICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHRoaXMuZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBpbnN0YW5jZUZnKTtcclxuICAgICAgICAgIGlmIChmaWVsZEVycm9ycy5sZW5ndGgpIGVycm9yc1twcmVmaXhlZEtleV0gPSBmaWVsZEVycm9ycztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB2YWxpZDogdGhpcy5mb3JtR3JvdXAudmFsaWQsIGVycm9ycywgZGlydHksIHRvdWNoZWQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBFcnJvcmkgZGV0dGFnbGlhdGkgcGVyIGwnZXJyb3Igc3VtbWFyeS4gKi9cclxuICBnZXREZXRhaWxlZEZvcm1FcnJvcnMoKTogVWlGb3JtRXJyb3JEZXRhaWxbXSB7XHJcbiAgICBjb25zdCBkZXRhaWxzOiBVaUZvcm1FcnJvckRldGFpbFtdID0gW107XHJcblxyXG4gICAgLy8gQ2FtcGkgcGlhdHRpXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmxhdEZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZsYWcnIHx8IGZpZWxkLnR5cGUgPT09ICdkaXZpZGVyJykgY29udGludWU7XHJcbiAgICAgIGlmICghdGhpcy5pc0ZpZWxkVmlzaWJsZShmaWVsZC5rZXkpKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICBpZiAoIWNvbnRyb2w/LmVycm9ycykgY29udGludWU7XHJcbiAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5KTtcclxuICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcclxuICAgICAgICBkZXRhaWxzLnB1c2goeyBmaWVsZEtleTogZmllbGQua2V5LCBmaWVsZExhYmVsOiBmaWVsZC5sYWJlbCwgZXJyb3JzIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FtcGkgbmVsbGUgaXN0YW56ZSByZXBlYXRhYmxlXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5yZXBlYXRhYmxlU2VjdGlvbnMpIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbi5pZCk7XHJcbiAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgY29uc3QgdGl0bGVUZW1wbGF0ZSA9IHNlY3Rpb24ucmVwZWF0YWJsZSEuaW5zdGFuY2VUaXRsZSB8fCAoc2VjdGlvbi50aXRsZSA/IGAke3NlY3Rpb24udGl0bGV9IHtpbmRleH1gIDogJ0VsZW1lbnRvIHtpbmRleH0nKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUZnID0gYXJyLmF0KGkpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUxhYmVsID0gdGl0bGVUZW1wbGF0ZS5yZXBsYWNlKCd7aW5kZXh9JywgU3RyaW5nKGkgKyAxKSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkcykge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmbGFnJyB8fCBmaWVsZC50eXBlID09PSAnZGl2aWRlcicpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSwgaW5zdGFuY2VGZykpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGluc3RhbmNlRmcuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgICAgICBpZiAoIWNvbnRyb2w/LmVycm9ycykgY29udGludWU7XHJcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgaW5zdGFuY2VGZyk7XHJcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goe1xyXG4gICAgICAgICAgICAgIGZpZWxkS2V5OiBgJHtzZWN0aW9uLmlkfVske2l9XS4ke2ZpZWxkLmtleX1gLFxyXG4gICAgICAgICAgICAgIGZpZWxkTGFiZWw6IGAke2luc3RhbmNlTGFiZWx9ID4gJHtmaWVsZC5sYWJlbH1gLFxyXG4gICAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRldGFpbHM7XHJcbiAgfVxyXG5cclxuICAvKiogQ29udGEgZXJyb3JpIHRvdGFsaS4gKi9cclxuICBnZXRGb3JtRXJyb3JzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldERldGFpbGVkRm9ybUVycm9ycygpLnJlZHVjZSgoc3VtLCBkKSA9PiBzdW0gKyBkLmVycm9ycy5sZW5ndGgsIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnRyb2xsYSBzZSBjaSBzb25vIGVycm9yaS4gKi9cclxuICBoYXNGb3JtRXJyb3JzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUVycm9yc0NvdW50KCkgPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnRyb2xsbyBwZXIgdW4gY2FtcG8uICovXHJcbiAgZ2V0RmllbGRDb250cm9sKGtleTogc3RyaW5nKTogRm9ybUNvbnRyb2wgfCBudWxsIHtcclxuICAgIHJldHVybiAodGhpcy5mb3JtR3JvdXAuZ2V0KGtleSkgYXMgRm9ybUNvbnRyb2wpID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogQWdnaW9ybmEgaWwgdmFsb3JlIGRpIHVuIGNhbXBvIHByb2dyYW1tYXRpY2FtZW50ZS4gKi9cclxuICB1cGRhdGVGaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGtleSk7XHJcbiAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcclxuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEZvcnphIGxhIHZhbGlkYXppb25lIGRpIHR1dHRpIGkgY2FtcGkgKGluY2x1c2UgaXN0YW56ZSByZXBlYXRhYmxlKS4gKi9cclxuICB2YWxpZGF0ZUFsbEZpZWxkcygpOiB2b2lkIHtcclxuICAgIC8vIENhbXBpIHBpYXR0aVxyXG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGtleSk7XHJcbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCBmZyA9IGNvbnRyb2wuYXQoaSkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMoZmcuY29udHJvbHMpLmZvckVhY2goKGZrKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGMgPSBmZy5nZXQoZmspO1xyXG4gICAgICAgICAgICBjPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgIGM/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIGM/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcclxuICAgICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQVBJIFJlcGVhdGFibGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBSZXN0aXR1aXNjZSBpbCBGb3JtQXJyYXkgZGkgdW5hIHNlemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBnZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbklkOiBzdHJpbmcpOiBGb3JtQXJyYXkgfCBudWxsIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cD8uZ2V0KHNlY3Rpb25JZCk7XHJcbiAgICByZXR1cm4gY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSA/IGNvbnRyb2wgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc3RpdHVpc2NlIGlsIEZvcm1Hcm91cCBkaSB1bmEgc3BlY2lmaWNhIGlzdGFuemEgcmVwZWF0YWJsZS4gKi9cclxuICBnZXRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbklkKTtcclxuICAgIHJldHVybiBhcnI/LmF0KGluZGV4KSBhcyBGb3JtR3JvdXAgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSBlIHBvc3NpYmlsZSBhZ2dpdW5nZXJlIG51b3ZlIGlzdGFuemUuICovXHJcbiAgY2FuQWRkSW5zdGFuY2Uoc2VjdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uPy5yZXBlYXRhYmxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiBzZWN0aW9uLnJlcGVhdGFibGUubWF4ID09IG51bGwgfHwgYXJyLmxlbmd0aCA8IHNlY3Rpb24ucmVwZWF0YWJsZS5tYXg7XHJcbiAgfVxyXG5cclxuICAvKiogVmVyaWZpY2Egc2UgZSBwb3NzaWJpbGUgcmltdW92ZXJlIGlzdGFuemUuICovXHJcbiAgY2FuUmVtb3ZlSW5zdGFuY2Uoc2VjdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uPy5yZXBlYXRhYmxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiBhcnIubGVuZ3RoID4gKHNlY3Rpb24ucmVwZWF0YWJsZS5taW4gPz8gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWdnaXVuZ2UgdW5hIG51b3ZhIGlzdGFuemEgdnVvdGEgYSB1bmEgc2V6aW9uZSByZXBlYXRhYmxlLiAqL1xyXG4gIGFkZFJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbkFkZEluc3RhbmNlKHNlY3Rpb25JZCkpIHJldHVybjtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbklkKSE7XHJcbiAgICBhcnIucHVzaCh0aGlzLmJ1aWxkSW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbikpO1xyXG4gICAgdGhpcy5yZWJ1aWxkUmVwZWF0YWJsZUFjY29yZGlvbihzZWN0aW9uKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpbXVvdmUgdW4naXN0YW56YSBkYSB1bmEgc2V6aW9uZSByZXBlYXRhYmxlLiAqL1xyXG4gIHJlbW92ZVJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhblJlbW92ZUluc3RhbmNlKHNlY3Rpb25JZCkpIHJldHVybjtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uPy5yZXBlYXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgaWYgKHNlY3Rpb24ucmVwZWF0YWJsZS5jb25maXJtUmVtb3ZlKSB7XHJcbiAgICAgIGNvbnN0IG1zZyA9IHNlY3Rpb24ucmVwZWF0YWJsZS5jb25maXJtTWVzc2FnZSA/PyAnU2VpIHNpY3VybyBkaSB2b2xlciByaW11b3ZlcmUgcXVlc3RhIHNlemlvbmU/JztcclxuICAgICAgaWYgKCFjb25maXJtKG1zZykpIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQpITtcclxuICAgIGFyci5yZW1vdmVBdChpbmRleCk7XHJcbiAgICB0aGlzLnJlYnVpbGRSZXBlYXRhYmxlQWNjb3JkaW9uKHNlY3Rpb24pO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRHVwbGljYSB1bidpc3RhbnphIGVzaXN0ZW50ZSBjb24gaSBzdW9pIHZhbG9yaS4gKi9cclxuICBkdXBsaWNhdGVSZXBlYXRhYmxlSW5zdGFuY2Uoc2VjdGlvbklkOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jYW5BZGRJbnN0YW5jZShzZWN0aW9uSWQpKSByZXR1cm47XHJcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5zY2hlbWEuc2VjdGlvbnMuZmluZCgocykgPT4gcy5pZCA9PT0gc2VjdGlvbklkKTtcclxuICAgIGlmICghc2VjdGlvbikgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb25JZCkhO1xyXG4gICAgY29uc3Qgc291cmNlRGF0YSA9IChhcnIuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0UmF3VmFsdWUoKTtcclxuICAgIGNvbnN0IG5ld0dyb3VwID0gdGhpcy5idWlsZEluc3RhbmNlRm9ybUdyb3VwKHNlY3Rpb24sIHNvdXJjZURhdGEpO1xyXG4gICAgYXJyLmluc2VydChpbmRleCArIDEsIG5ld0dyb3VwKTtcclxuICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaXRvbG8gZGkgdW4naXN0YW56YSByZXBlYXRhYmxlLiAqL1xyXG4gIGdldEluc3RhbmNlVGl0bGUoc2VjdGlvbjogVWlGb3JtU2VjdGlvbiwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHNlY3Rpb24ucmVwZWF0YWJsZT8uaW5zdGFuY2VUaXRsZSB8fCAoc2VjdGlvbi50aXRsZSA/IGAke3NlY3Rpb24udGl0bGV9IHtpbmRleH1gIDogJ0VsZW1lbnRvIHtpbmRleH0nKTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKCd7aW5kZXh9JywgU3RyaW5nKGluZGV4ICsgMSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNjcm9sbGEgYWwgY2FtcG8gZSBsbyBldmlkZW56aWEuICovXHJcbiAgc2Nyb2xsVG9GaWVsZChmaWVsZEtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBGb3J6YSBsbyBzdGF0byBkaXJ0eSBlIHRvdWNoZWQgcGVyIG1vc3RyYXJlIGltbWVkaWF0YW1lbnRlIGdsaSBlcnJvcmlcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVsYXkgcGVyIGxhc2NpYXJlIGNoZSBBbmd1bGFyIE1hdGVyaWFsIGFnZ2lvcm5pIGlsIERPTVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIC8vIENlcmNhIGwnZWxlbWVudG8gdHJhbWl0ZSBkaXZlcnNpIHNlbGV0dG9yaSBpbiBvcmRpbmUgZGkgcHJpb3JpdGFcclxuICAgICAgY29uc3Qgc2VsZWN0b3JzID0gW2BbZGF0YS1maWVsZC1rZXk9XCIke2ZpZWxkS2V5fVwiXWAsIGBbZm9ybUNvbnRyb2xOYW1lPVwiJHtmaWVsZEtleX1cIl1gXTtcclxuXHJcbiAgICAgIGxldCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBzZWxlY3RvcnMpIHtcclxuICAgICAgICB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKTtcclxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCkgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0YXJnZXRFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgICAvLyBTZSB0cm92YXRvIGlsIGZvcm1Db250cm9sTmFtZSwgcmlzYWxpIGFsIHdyYXBwZXJcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQuaGFzQXR0cmlidXRlKCdmb3JtQ29udHJvbE5hbWUnKSkge1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0YXJnZXRFbGVtZW50LmNsb3Nlc3QoJy51aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLXdyYXBwZXIsIG1hdC1mb3JtLWZpZWxkJyk7XHJcbiAgICAgICAgaWYgKHdyYXBwZXIpIHRhcmdldEVsZW1lbnQgPSB3cmFwcGVyIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YXJnZXRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcblxyXG4gICAgICAvLyBBZ2dpdW5naSBjbGFzc2UgaGlnaGxpZ2h0IGUgcmltdW92aWxhIGRvcG8gbCdhbmltYXppb25lXHJcbiAgICAgIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndWktZm9ybS1maWVsZC0taGlnaGxpZ2h0Jyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGFyZ2V0RWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZSgndWktZm9ybS1maWVsZC0taGlnaGxpZ2h0JyksIDIwMDApO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdWJtaXQgZGVsIGZvcm0uICovXHJcbiAgb25TdWJtaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbGlkYXRlQWxsRmllbGRzKCk7XHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xyXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuZm9ybUdyb3VwLnZhbGlkO1xyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ3N1Ym1pdCcsIHtcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bicsXHJcbiAgICAgIHZhbGlkOiBpc1ZhbGlkLFxyXG4gICAgICBmaWVsZENvdW50OiBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmxlbmd0aCxcclxuICAgIH0pO1xyXG4gICAgaWYgKGlzVmFsaWQpIHtcclxuICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZm9ybVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBkZWwgZm9ybS4gKi9cclxuICBvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXR0YSBjYW1waSBwaWF0dGlcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbml0aWFsRGF0YT8uW2ZpZWxkLmtleV0gPz8gZmllbGQuZGVmYXVsdFZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KTtcclxuICAgICAgY29udHJvbD8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgY29udHJvbD8ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgY29udHJvbD8ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXR0YSBzZXppb25pIHJlcGVhdGFibGVcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnJlcGVhdGFibGVTZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uLmlkKTtcclxuICAgICAgaWYgKCFhcnIpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBpbml0aWFsQXJyYXkgPSB0aGlzLmluaXRpYWxEYXRhPy5bc2VjdGlvbi5pZF0gYXMgUmVjb3JkPHN0cmluZywgYW55PltdIHwgdW5kZWZpbmVkO1xyXG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0UmVwZWF0YWJsZUluaXRpYWxJbnN0YW5jZUNvdW50KHNlY3Rpb24pO1xyXG5cclxuICAgICAgYXJyLmNsZWFyKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIGFyci5wdXNoKHRoaXMuYnVpbGRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLCBpbml0aWFsQXJyYXk/LltpXSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5mb3JtUmVzZXQuZW1pdCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVGVtcGxhdGUgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIE9wemlvbmkgcGVyIHVuIGNhbXBvIChmaWx0cmFuZG8gcGVyIGF1dG9jb21wbGV0ZSBxdWVyeSkuICovXHJcbiAgZ2V0RmllbGRPcHRpb25zKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBVaUZpZWxkT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogRmlsdHJhIG9wemlvbmkgcGVyIGF1dG9jb21wbGV0ZS4gKi9cclxuICBmaWx0ZXJPcHRpb25zKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IsIHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghcXVlcnkpIHtcclxuICAgICAgaWYgKGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbZmllbGQua2V5XSA9IFsuLi4oZmllbGQub3B0aW9ucyBhcyBVaUZpZWxkT3B0aW9uW10pXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkLmFzeW5jT3B0aW9ucykge1xyXG4gICAgICBmaWVsZC5hc3luY09wdGlvbnMocXVlcnkpLnRoZW4oKG9wdHMpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gb3B0cztcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gPSAoZmllbGQub3B0aW9ucyBhcyBVaUZpZWxkT3B0aW9uW10pLmZpbHRlcigobykgPT5cclxuICAgICAgICBvLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRGlzcGxheSBmbiBwZXIgYXV0b2NvbXBsZXRlLiAqL1xyXG4gIGRpc3BsYXlGbihvcHRpb25zOiBVaUZpZWxkT3B0aW9uW10pOiAodmFsdWU6IGFueSkgPT4gc3RyaW5nIHtcclxuICAgIHJldHVybiAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHQgPSBvcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IHZhbHVlKTtcclxuICAgICAgcmV0dXJuIG9wdD8ubGFiZWwgfHwgJyc7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGV6aW9uYSB0dXR0ZSBsZSBvcHppb25pIHBlciBtdWx0aXNlbGVjdC4gKi9cclxuICBzZWxlY3RBbGwoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0RmllbGRPcHRpb25zKGZpZWxkKTtcclxuICAgIGNvbnN0IGFsbFZhbHVlcyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PiAhby5kaXNhYmxlZCkubWFwKChvKSA9PiBvLnZhbHVlKTtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShhbGxWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFnZ2l1bmdlIHVuIGNoaXAgYWwgZnJlZW11bHRpc2VsZWN0IChkYSB0b2tlbjogRW50ZXIgbyB2aXJnb2xhKS4gKi9cclxuICBhZGRGcmVlQ2hpcChmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLCBldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC52YWx1ZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShbLi4uY3VycmVudCwgdmFsdWVdKTtcclxuICAgIH1cclxuICAgIGV2ZW50LmNoaXBJbnB1dD8uY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpdW5nZSB1biBjaGlwIGFsIGZyZWVtdWx0aXNlbGVjdCBzdWxsJ2V2ZW50byBibHVyIGRlbGwnaW5wdXQuICovXHJcbiAgYWRkRnJlZUNoaXBPbkJsdXIoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShbLi4uY3VycmVudCwgdmFsdWVdKTtcclxuICAgIH1cclxuICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgfVxyXG5cclxuICAvKiogUmltdW92ZSB1biBjaGlwIGRhbCBmcmVlbXVsdGlzZWxlY3QuICovXHJcbiAgcmVtb3ZlRnJlZUNoaXAoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgY2hpcFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBjb25zdCBwcm90ZWN0ZWRfID0gZmllbGQubWV0YWRhdGE/LlsnY2FudERlbGV0ZUxpc3QnXSB8fCBbXTtcclxuICAgIGlmIChwcm90ZWN0ZWRfLmluY2x1ZGVzKGNoaXBWYWx1ZSkpIHJldHVybjtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShjdXJyZW50LmZpbHRlcigodjogc3RyaW5nKSA9PiB2ICE9PSBjaGlwVmFsdWUpKTtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1biBjaGlwIGUgcHJvdGV0dG8gZGFsbGEgY2FuY2VsbGF6aW9uZS4gKi9cclxuICBpc0NoaXBQcm90ZWN0ZWQoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgY2hpcFZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoZmllbGQubWV0YWRhdGE/LlsnY2FudERlbGV0ZUxpc3QnXSB8fCBbXSkuaW5jbHVkZXMoY2hpcFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBSaW11b3ZlIGNoaXAgZGEgbXVsdGlzZWxlY3QuICovXHJcbiAgcmVtb3ZlTXVsdGlzZWxlY3RDaGlwKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IsIGNoaXBWYWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk/LnZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKGN1cnJlbnQuZmlsdGVyKCh2OiBhbnkpID0+IHYgIT09IGNoaXBWYWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRyb3ZhIGxhYmVsIGRpIHVuJ29wemlvbmUgZGFsIHZhbG9yZS4gKi9cclxuICBnZXRPcHRpb25MYWJlbChmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldEZpZWxkT3B0aW9ucyhmaWVsZCk7XHJcbiAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvKSA9PiBvLnZhbHVlID09PSB2YWx1ZSk/LmxhYmVsIHx8IFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGlwbyBkaSBpbnB1dCBuYXRpdm8gcGVyIGlsIGNhbXBvLiAqL1xyXG4gIGdldE5hdGl2ZUlucHV0VHlwZShmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICBjYXNlICdwYXNzd29yZCc6XHJcbiAgICAgICAgcmV0dXJuICdwYXNzd29yZCc7XHJcbiAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICByZXR1cm4gJ2VtYWlsJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIGxlIGNsYXNzaSBDU1MgcGVyIGlsIHdyYXBwZXIgZGkgdW4gY2FtcG8sXHJcbiAgICogY29tYmluYW5kbyBldmVudHVhbGkgY3NzQ2xhc3NlcyBkYWxsbyBzY2hlbWEgY29uIGxlIGNsYXNzaVxyXG4gICAqIHJlc3BvbnNpdmUgcGVyIGlsIHNpc3RlbWEgYSBncmlnbGlhIGJhc2UtMTIuXHJcbiAgICpcclxuICAgKiBNb2JpbGUtZmlyc3Q6IHR1dHRpIGkgY2FtcGkgc29ubyBzcGFuLTEyIGRpIGRlZmF1bHQgKDEwMCUpLlxyXG4gICAqIExlIGNsYXNzaSBgdWktY29sLXticmVha3BvaW50fS17bn1gIGF0dGl2YW5vIGxhIGxhcmdoZXp6YVxyXG4gICAqIGNvbmZpZ3VyYXRhIHNvbG8gZGFsIGJyZWFrcG9pbnQgaW5kaWNhdG8gaW4gc3UuXHJcbiAgICpcclxuICAgKiBCcmVha3BvaW50IHN1cHBvcnRhdGk6IHNtICjiiaU1NzZweCksIG1kICjiiaU3NjhweCksIGxnICjiiaUxMDI0cHgpLCB4bCAo4omlMTI4MHB4KS5cclxuICAgKi9cclxuICBnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoZmllbGQuY3NzQ2xhc3Nlcz8ubGVuZ3RoKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaCguLi5maWVsZC5jc3NDbGFzc2VzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsYXlvdXQuY29sdW1ucyDihpIgY2xhc3NlIHBlciBpbCBicmVha3BvaW50IG1kIChkZWZhdWx0IGRlc2t0b3ApXHJcbiAgICBpZiAoZmllbGQubGF5b3V0Py5jb2x1bW5zKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaChgdWktY29sLW1kLSR7ZmllbGQubGF5b3V0LmNvbHVtbnN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbGF5b3V0LmJyZWFrcG9pbnRzIOKGkiBjbGFzc2kgcGVyIGJyZWFrcG9pbnQgc3BlY2lmaWNpXHJcbiAgICBpZiAoZmllbGQubGF5b3V0Py5icmVha3BvaW50cykge1xyXG4gICAgICBmb3IgKGNvbnN0IFticCwgY29sc10gb2YgT2JqZWN0LmVudHJpZXMoZmllbGQubGF5b3V0LmJyZWFrcG9pbnRzKSkge1xyXG4gICAgICAgIGNsYXNzZXMucHVzaChgdWktY29sLSR7YnB9LSR7Y29sc31gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGFyYWN0ZXIgY291bnQgcGVyIHRleHRhcmVhL3RleHQgY29uIG1heExlbmd0aC4gKi9cclxuICBnZXRDaGFyQ291bnQoZmllbGRLZXk6IHN0cmluZywgZmc/OiBGb3JtR3JvdXApOiB7IGN1cnJlbnQ6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKChmKSA9PiBmLmtleSA9PT0gZmllbGRLZXkpO1xyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5maWVsZEVycm9yU2VydmljZS5yZXNvbHZlTWF4TGVuZ3RoKGZpZWxkPy52YWxpZGF0aW9uKTtcclxuICAgIGlmIChtYXhMZW5ndGggPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZEVycm9yU2VydmljZS5nZXRDaGFyQ291bnQodGFyZ2V0LmdldChmaWVsZEtleSksIG1heExlbmd0aCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVXRpbGl0YSBwcml2YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIGlzT2JzZXJ2YWJsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVwZWF0YWJsZUFkZEJ1dHRvbnMoc2VjdGlvbjogVWlGb3JtU2VjdGlvbik6IFVpQnV0dG9uRGVzY3JpcHRvcltdIHtcclxuICAgIHJldHVybiBbe1xyXG4gICAgICBsYWJlbDogc2VjdGlvbi5yZXBlYXRhYmxlPy5hZGRMYWJlbCB8fCAnKyBBZ2dpdW5naScsXHJcbiAgICAgIGljb246IHNlY3Rpb24ucmVwZWF0YWJsZT8uYWRkSWNvbiB8fCAncGx1cycsXHJcbiAgICAgIHZhcmlhbnQ6ICdvdXRsaW5lJyxcclxuICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmFkZFJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uLmlkKVxyXG4gICAgfV07XHJcbiAgfVxyXG59XHJcbiIsIjwhLS1cclxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICBVSSBGT1JNIEJVSUxERVIgLSBURU1QTEFURSBQUklOQ0lQQUxFXHJcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgQVJDSElURVRUVVJBOlxyXG4gIE9nbmkgPG5nLXRlbXBsYXRlPiBjaGUgY29udGllbmUgZGlyZXR0aXZlIFtmb3JtQ29udHJvbE5hbWVdXHJcbiAgREVWRSB3cmFwcGFyZSBpbCBwcm9wcmlvIGNvbnRlbnV0byBpbiB1biA8ZGl2IFtmb3JtR3JvdXBdPi5cclxuICBRdWVzdG8gcGVyY2hlIEFuZ3VsYXIgcmlzb2x2ZSBsJ2luamVjdG9yIGRpIGZvcm1Db250cm9sTmFtZVxyXG4gIGRhbCBDT05URVNUTyBESSBESUNISUFSQVpJT05FIGRlbCB0ZW1wbGF0ZSwgbm9uIGRhbCBwdW50b1xyXG4gIGRpIGluc2VyaW1lbnRvIChuZ1RlbXBsYXRlT3V0bGV0KS5cclxuXHJcbiAgSWwgRm9ybUdyb3VwIHZpZW5lIHBhc3NhdG8gdHJhbWl0ZSBjb250ZXh0IHBlciBzdXBwb3J0YXJlXHJcbiAgc2lhIGNhbXBpIHBpYXR0aSAocm9vdCBGb3JtR3JvdXApIGNoZSBjYW1waSBpbiBpc3RhbnplXHJcbiAgcmVwZWF0YWJsZSAoaW5zdGFuY2UgRm9ybUdyb3VwKS5cclxuXHJcbiAgU2VuemEgcXVlc3RvIHdyYXBwZXIsIGZvcm1Db250cm9sTmFtZSBub24gdHJvdmEgaWxcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUgZSBsYW5jaWEgTkcwMTA1MC5cclxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLS0+XHJcblxyXG5AaWYgKHNjaGVtYSAmJiBmb3JtR3JvdXApIHtcclxuPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlclwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgW2NsYXNzXT1cInNjaGVtYS5jb25maWc/LmNzc0NsYXNzZXM/LmpvaW4oJyAnKVwiPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09IEhFQURFUiA9PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICBAaWYgKHNjaGVtYS50aXRsZSB8fCBzY2hlbWEuZGVzY3JpcHRpb24pIHtcclxuICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19oZWFkZXJcIj5cclxuICAgIEBpZiAoc2NoZW1hLnRpdGxlKSB7XHJcbiAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3RpdGxlXCI+e3sgc2NoZW1hLnRpdGxlIH19PC9oMj5cclxuICAgIH1cclxuICAgIEBpZiAoc2NoZW1hLmRlc2NyaXB0aW9uKSB7XHJcbiAgICA8cCBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZGVzY3JpcHRpb25cIj57eyBzY2hlbWEuZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09IFNFWklPTkkgPT09PT09PT09PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbnNcIj5cclxuICAgIEBmb3IgKHNlY3Rpb24gb2Ygc2NoZW1hLnNlY3Rpb25zOyB0cmFjayBzZWN0aW9uLmlkKSB7XHJcbiAgICBAaWYgKGlzU2VjdGlvblZpc2libGUoc2VjdGlvbi5pZCkpIHtcclxuXHJcbiAgICA8IS0tIOKUgOKUgOKUgCBTZXppb25lIFJFUEVBVEFCTEUg4pSA4pSA4pSAIC0tPlxyXG4gICAgQGlmIChzZWN0aW9uLnJlcGVhdGFibGUpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24gdWktZm9ybS1idWlsZGVyX19zZWN0aW9uLS1yZXBlYXRhYmxlXCIgW2NsYXNzXT1cInNlY3Rpb24uY3NzQ2xhc3Nlcz8uam9pbignICcpXCI+XHJcbiAgICAgIEBpZiAoc2VjdGlvbi50aXRsZSB8fCBzZWN0aW9uLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24taGVhZGVyXCI+XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnRpdGxlKSB7XHJcbiAgICAgICAgPGgzIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLXRpdGxlXCI+e3sgc2VjdGlvbi50aXRsZSB9fTwvaDM+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoc2VjdGlvbi5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWRlc2NyaXB0aW9uXCI+e3sgc2VjdGlvbi5kZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8dWktYWNjb3JkaW9uIFtpdGVtc109XCJnZXRSZXBlYXRhYmxlQWNjb3JkaW9uSXRlbXMoc2VjdGlvbi5pZClcIiBbaXRlbVRlbXBsYXRlXT1cInJlcGVhdGFibGVCb2R5VHBsXCJcclxuICAgICAgICBbYWN0aW9uc1RlbXBsYXRlXT1cInJlcGVhdGFibGVBY3Rpb25zVHBsXCIgbW9kZT1cIm11bHRpXCIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcGVhdGFibGUtYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgPCEtLSBDb250ZW51dG8gZGkgb2duaSBpc3RhbnphIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVwZWF0YWJsZUJvZHlUcGwgbGV0LWl0ZW0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MudWktZm9ybS1idWlsZGVyX19ncmlkXT1cInNjaGVtYS5jb25maWc/LmxheW91dCA9PT0gJ2dyaWQnIHx8ICFzY2hlbWEuY29uZmlnPy5sYXlvdXRcIj5cclxuICAgICAgICAgICAgQGZvciAoZmllbGQgb2Ygc2VjdGlvbi5maWVsZHM7IHRyYWNrIGZpZWxkLmtleSkge1xyXG4gICAgICAgICAgICBAaWYgKGlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSwgZ2V0SW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbi5pZCwgaXRlbS5pbmRleCkhKSAmJiBmaWVsZC50eXBlICE9PSAnZmxhZycpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtd3JhcHBlclwiIFtjbGFzc109XCJnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLm9yZGVyXT1cImZpZWxkLmxheW91dD8ub3JkZXIgfHwgbnVsbFwiIFthdHRyLmRhdGEtZmllbGQta2V5XT1cImZpZWxkLmtleVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgZm9ybUdyb3VwOiBnZXRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLmlkLCBpdGVtLmluZGV4KSB9XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPCEtLSBBemlvbmkgcGVyIG9nbmkgaXN0YW56YSAoZHVwbGljYSAvIGVsaW1pbmEpIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVwZWF0YWJsZUFjdGlvbnNUcGwgbGV0LWl0ZW0+XHJcbiAgICAgICAgICBAaWYgKGNhbkFkZEluc3RhbmNlKHNlY3Rpb24uaWQpKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fcmVwZWF0YWJsZS1hY3Rpb25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlUmVwZWF0YWJsZUluc3RhbmNlKHNlY3Rpb24uaWQsIGl0ZW0uaW5kZXgpXCIgYXJpYS1sYWJlbD1cIkR1cGxpY2FcIj5cclxuICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJjb3B5XCIgW3NpemVdPVwiMTVcIiAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKGNhblJlbW92ZUluc3RhbmNlKHNlY3Rpb24uaWQpKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fcmVwZWF0YWJsZS1hY3Rpb24gdWktZm9ybS1idWlsZGVyX19yZXBlYXRhYmxlLWFjdGlvbi0tZGFuZ2VyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uLmlkLCBpdGVtLmluZGV4KVwiIGFyaWEtbGFiZWw9XCJFbGltaW5hXCI+XHJcbiAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwidHJhc2gtMlwiIFtzaXplXT1cIjE1XCIgLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvdWktYWNjb3JkaW9uPlxyXG5cclxuICAgICAgQGlmIChjYW5BZGRJbnN0YW5jZShzZWN0aW9uLmlkKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXBlYXRhYmxlLWFkZFwiPlxyXG4gICAgICAgIDx1aS1idXR0b24tYXJlYSBbYnV0dG9uc109XCJnZXRSZXBlYXRhYmxlQWRkQnV0dG9ucyhzZWN0aW9uKVwiIGFsaWduPVwiZW5kXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0g4pSA4pSA4pSAIFNlemlvbmUgQ09MTEFTU0FCSUxFIOKUgOKUgOKUgCAtLT5cclxuICAgIH0gQGVsc2UgaWYgKHNlY3Rpb24uY29sbGFwc2libGUpIHtcclxuICAgIDx1aS1hY2NvcmRpb24gW2l0ZW1zXT1cImdldFNlY3Rpb25BY2NvcmRpb25JdGVtcyhzZWN0aW9uLmlkKVwiIFtpdGVtVGVtcGxhdGVdPVwiY29sbGFwc2libGVUcGxcIiBtb2RlPVwibXVsdGlcIlxyXG4gICAgICBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbiB1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24tLWNvbGxhcHNpYmxlXCIgW2NsYXNzXT1cInNlY3Rpb24uY3NzQ2xhc3Nlcz8uam9pbignICcpXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjY29sbGFwc2libGVUcGwgbGV0LWl0ZW0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbi1jb250ZW50XCJcclxuICAgICAgICAgIFtjbGFzcy51aS1mb3JtLWJ1aWxkZXJfX2dyaWRdPVwic2NoZW1hLmNvbmZpZz8ubGF5b3V0ID09PSAnZ3JpZCcgfHwgIXNjaGVtYS5jb25maWc/LmxheW91dFwiPlxyXG4gICAgICAgICAgQGZvciAoZmllbGQgb2Ygc2VjdGlvbi5maWVsZHM7IHRyYWNrIGZpZWxkLmtleSkge1xyXG4gICAgICAgICAgQGlmIChpc0ZpZWxkVmlzaWJsZShmaWVsZC5rZXkpICYmIGZpZWxkLnR5cGUgIT09ICdmbGFnJykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtd3JhcHBlclwiIFtjbGFzc109XCJnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkKVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5vcmRlcl09XCJmaWVsZC5sYXlvdXQ/Lm9yZGVyIHx8IG51bGxcIiBbYXR0ci5kYXRhLWZpZWxkLWtleV09XCJmaWVsZC5rZXlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZmllbGQsIGZvcm1Hcm91cDogZm9ybUdyb3VwIH1cIiAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3VpLWFjY29yZGlvbj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgOKUgCBTZXppb25lIFNUQU5EQVJEIOKUgOKUgOKUgCAtLT5cclxuICAgIH0gQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvblwiIFtjbGFzc109XCJzZWN0aW9uLmNzc0NsYXNzZXM/LmpvaW4oJyAnKVwiPlxyXG4gICAgICBAaWYgKHNlY3Rpb24udGl0bGUgfHwgc2VjdGlvbi5kZXNjcmlwdGlvbikge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWhlYWRlclwiPlxyXG4gICAgICAgIEBpZiAoc2VjdGlvbi50aXRsZSkge1xyXG4gICAgICAgIDxoMyBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbi10aXRsZVwiPnt7IHNlY3Rpb24udGl0bGUgfX08L2gzPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKHNlY3Rpb24uZGVzY3JpcHRpb24pIHtcclxuICAgICAgICA8cCBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbi1kZXNjcmlwdGlvblwiPnt7IHNlY3Rpb24uZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbi1jb250ZW50XCJcclxuICAgICAgICBbY2xhc3MudWktZm9ybS1idWlsZGVyX19ncmlkXT1cInNjaGVtYS5jb25maWc/LmxheW91dCA9PT0gJ2dyaWQnIHx8ICFzY2hlbWEuY29uZmlnPy5sYXlvdXRcIj5cclxuICAgICAgICBAZm9yIChmaWVsZCBvZiBzZWN0aW9uLmZpZWxkczsgdHJhY2sgZmllbGQua2V5KSB7XHJcbiAgICAgICAgQGlmIChpc0ZpZWxkVmlzaWJsZShmaWVsZC5rZXkpICYmIGZpZWxkLnR5cGUgIT09ICdmbGFnJykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLXdyYXBwZXJcIiBbY2xhc3NdPVwiZ2V0RmllbGRXcmFwcGVyQ2xhc3NlcyhmaWVsZClcIlxyXG4gICAgICAgICAgW3N0eWxlLm9yZGVyXT1cImZpZWxkLmxheW91dD8ub3JkZXIgfHwgbnVsbFwiIFthdHRyLmRhdGEtZmllbGQta2V5XT1cImZpZWxkLmtleVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpZWxkVHBsOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZmllbGQsIGZvcm1Hcm91cDogZm9ybUdyb3VwIH1cIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gRk9PVEVSID09PT09PT09PT09PT09PT09PT09IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2Zvb3RlclwiPlxyXG4gICAgQGlmICghc2NoZW1hLmNvbmZpZz8uaGlkZUVycm9yU3VtbWFyeSkge1xyXG4gICAgPHVpLWZvcm0tZXJyb3Itc3VtbWFyeSBbZXJyb3JzXT1cImZvcm1FcnJvcnNcIiBbdG90YWxFcnJvckNvdW50XT1cImdldEZvcm1FcnJvcnNDb3VudCgpXCJcclxuICAgICAgW3ZhbGlkTWVzc2FnZV09XCJzY2hlbWEuY29uZmlnPy5lcnJvclN1bW1hcnlWYWxpZE1lc3NhZ2UgPz8gJ0lsIGZvcm0gw6ggY29tcGlsYXRvIGNvcnJldHRhbWVudGUnXCJcclxuICAgICAgKGZpZWxkQ2xpY2spPVwic2Nyb2xsVG9GaWVsZCgkZXZlbnQpXCIgLz5cclxuICAgIH1cclxuICAgIEBpZiAoIXNjaGVtYS5jb25maWc/LmhpZGVGb290ZXIpIHtcclxuICAgIDx1aS1idXR0b24tYXJlYSBbYnV0dG9uc109XCJmb3JtQnV0dG9uc1wiIGFsaWduPVwiZW5kXCIgW2xvYWRpbmdJZHNdPVwibG9hZGluZ0ZvclwiIC8+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG59XHJcblxyXG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuPCEtLSBGSUVMRCBURU1QTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxyXG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuPCEtLVxyXG4gIENSSVRJQ086IFF1ZXN0byB0ZW1wbGF0ZSBlIGRpY2hpYXJhdG8gRlVPUkkgZGFsIDxkaXYgW2Zvcm1Hcm91cF0+LlxyXG4gIEFuZ3VsYXIgcmlzb2x2ZSBsJ2luamVjdG9yIGRhbCBjb250ZXN0byBkaSBESUNISUFSQVpJT05FLlxyXG4gIElsIEZvcm1Hcm91cCB2aWVuZSBwYXNzYXRvIHZpYSBjb250ZXh0IChmZykgcGVyIHN1cHBvcnRhcmVcclxuICBzaWEgaWwgcm9vdCBGb3JtR3JvdXAgY2hlIGkgRm9ybUdyb3VwIGRlbGxlIGlzdGFuemUgcmVwZWF0YWJsZS5cclxuLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZmllbGRUcGwgbGV0LWZpZWxkIGxldC1mZz1cImZvcm1Hcm91cFwiPlxyXG4gIEBpZiAoZmcpIHtcclxuICA8ZGl2IFtmb3JtR3JvdXBdPVwiZmdcIiBjbGFzcz1cInVpLWZiLWZpZWxkLWN0eFwiPlxyXG4gICAgQHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG5cclxuICAgIDwhLS0gVEVYVCAvIEVNQUlMIC8gUEFTU1dPUkQgLS0+XHJcbiAgICBAY2FzZSAoJ3RleHQnKSB7XHJcbiAgICAgIDx1aS1mb3JtLXRleHQtZmllbGRcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZmdcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgW2Vycm9yc109XCJnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgICAgW29wdGlvbnNdPVwiZ2V0RmllbGRPcHRpb25zKGZpZWxkKVwiXHJcbiAgICAgICAgKG9wdGlvbnNGaWx0ZXIpPVwiZmlsdGVyT3B0aW9ucyhmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcbiAgICBAY2FzZSAoJ2VtYWlsJykge1xyXG4gICAgICA8dWktZm9ybS10ZXh0LWZpZWxkXHJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICBbZm9ybUdyb3VwXT1cImZnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIFtlcnJvcnNdPVwiZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAvPlxyXG4gICAgfVxyXG4gICAgQGNhc2UgKCdwYXNzd29yZCcpIHtcclxuICAgICAgPHVpLWZvcm0tdGV4dC1maWVsZFxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmZ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICBbZXJyb3JzXT1cImdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIE5VTUJFUiAtLT5cclxuICAgIEBjYXNlICgnbnVtYmVyJykge1xyXG4gICAgICA8dWktZm9ybS1udW1iZXItZmllbGRcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZmdcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgW2Vycm9yc109XCJnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBURVhUQVJFQSAtLT5cclxuICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XHJcbiAgICAgIDx1aS1mb3JtLXRleHRhcmVhLWZpZWxkXHJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICBbZm9ybUdyb3VwXT1cImZnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIFtlcnJvcnNdPVwiZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAvPlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gU0VMRUNUIC0tPlxyXG4gICAgQGNhc2UgKCdzZWxlY3QnKSB7XHJcbiAgICAgIDx1aS1mb3JtLXNlbGVjdC1maWVsZFxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmZ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICBbZXJyb3JzXT1cImdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpXCJcclxuICAgICAgICBbb3B0aW9uc109XCJnZXRGaWVsZE9wdGlvbnMoZmllbGQpXCJcclxuICAgICAgICAob3B0aW9uc0ZpbHRlcik9XCJmaWx0ZXJPcHRpb25zKGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIE1VTFRJU0VMRUNUIC0tPlxyXG4gICAgQGNhc2UgKCdtdWx0aXNlbGVjdCcpIHtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19mdWxsLXdpZHRoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgZmllbGQubGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBtdWx0aXBsZSBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJydcIj5cclxuICAgICAgICBAaWYgKGZpZWxkLmFsbG93U2VsZWN0QWxsKSB7XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKGNsaWNrKT1cInNlbGVjdEFsbChmaWVsZClcIiAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RBbGwoZmllbGQpXCIgKGtleWRvd24uc3BhY2UpPVwic2VsZWN0QWxsKGZpZWxkKVwiPlxyXG4gICAgICAgICAgPGVtPlNlbGV6aW9uYSB0dXR0bzwvZW0+XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZm9yIChvcHQgb2YgZ2V0RmllbGRPcHRpb25zKGZpZWxkKTsgdHJhY2sgb3B0LnZhbHVlKSB7XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdC52YWx1ZVwiIFtkaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIj5cclxuICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPG1hdC1lcnJvcj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXY+e3sgZXJyIH19PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICBAaWYgKGZnLmdldChmaWVsZC5rZXkpPy52YWx1ZT8ubGVuZ3RoKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19jaGlwcy1wcmV2aWV3XCI+XHJcbiAgICAgIEBmb3IgKHZhbCBvZiBmZy5nZXQoZmllbGQua2V5KSEudmFsdWU7IHRyYWNrIHZhbCkge1xyXG4gICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fY2hpcFwiPlxyXG4gICAgICAgIHt7IGdldE9wdGlvbkxhYmVsKGZpZWxkLCB2YWwpIH19XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZU11bHRpc2VsZWN0Q2hpcChmaWVsZCwgdmFsKVwiIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19jaGlwLXJlbW92ZVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUmltdW92aVwiPlxyXG4gICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJ4XCIgW3NpemVdPVwiMTJcIiAvPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gRlJFRU1VTFRJU0VMRUNUIC0tPlxyXG4gICAgQGNhc2UgKCdmcmVlbXVsdGlzZWxlY3QnKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZnVsbC13aWR0aCB1aS1mb3JtLWJ1aWxkZXJfX2ZyZWUtbXVsdGktZmllbGRcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eyBmaWVsZC5sYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcEdyaWQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIj5cclxuICAgICAgICBAZm9yIChjaGlwIG9mIGZnLmdldChmaWVsZC5rZXkpPy52YWx1ZSB8fCBbXTsgdHJhY2sgY2hpcCkge1xyXG4gICAgICAgIDxtYXQtY2hpcC1yb3cgW3JlbW92YWJsZV09XCIhaXNDaGlwUHJvdGVjdGVkKGZpZWxkLCBjaGlwKVwiIChyZW1vdmVkKT1cInJlbW92ZUZyZWVDaGlwKGZpZWxkLCBjaGlwKVwiPlxyXG4gICAgICAgICAge3sgY2hpcCB9fVxyXG4gICAgICAgICAgQGlmICghaXNDaGlwUHJvdGVjdGVkKGZpZWxkLCBjaGlwKSkge1xyXG4gICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlIGFyaWEtbGFiZWw9XCJSaW11b3ZpXCI+XHJcbiAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwieFwiIFtzaXplXT1cIjE0XCIgLz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvbWF0LWNoaXAtcm93PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtY2hpcC1ncmlkPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnQWdnaXVuZ2kuLi4nXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHkgfHwgcmVhZG9ubHlcIiAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkRnJlZUNoaXAoZmllbGQsICRldmVudClcIlxyXG4gICAgICAgIChibHVyKT1cImFkZEZyZWVDaGlwT25CbHVyKGZpZWxkLCAkZXZlbnQpXCIgLz5cclxuICAgICAgPG1hdC1lcnJvcj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXY+e3sgZXJyIH19PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBDSEVDS0JPWCAtLT5cclxuICAgIEBjYXNlICgnY2hlY2tib3gnKSB7XHJcbiAgICBAaWYgKGZpZWxkLmFwcGVhcmFuY2U/LnN0eWxlID09PSAnc3dpdGNoJykge1xyXG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29sb3JdPVwiZmllbGQuYXBwZWFyYW5jZT8uY29sb3IgfHwgJ3ByaW1hcnknXCI+XHJcbiAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29sb3JdPVwiZmllbGQuYXBwZWFyYW5jZT8uY29sb3IgfHwgJ3ByaW1hcnknXCI+XHJcbiAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgIEBpZiAoZmllbGQuaWNvblRvb2x0aXApIHtcclxuICAgICAgPGx1Y2lkZS1pY29uIFtuYW1lXT1cImZpZWxkLmljb25Ub29sdGlwLmljb24gfHwgJ2luZm8nXCIgW3NpemVdPVwiMTRcIiBbbWF0VG9vbHRpcF09XCJmaWVsZC5pY29uVG9vbHRpcC50ZXh0XCJcclxuICAgICAgICBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9faW5saW5lLXRvb2x0aXBcIiAvPlxyXG4gICAgICB9XHJcbiAgICA8L21hdC1jaGVja2JveD5cclxuICAgIH1cclxuICAgIEBpZiAoc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1lcnJvclwiPlxyXG4gICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICA8c3Bhbj57eyBlcnIgfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gU1dJVENIIC0tPlxyXG4gICAgQGNhc2UgKCdzd2l0Y2gnKSB7XHJcbiAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiIFtjb2xvcl09XCJmaWVsZC5hcHBlYXJhbmNlPy5jb2xvciB8fCAncHJpbWFyeSdcIj5cclxuICAgICAge3sgZmllbGQubGFiZWwgfX1cclxuICAgICAgQGlmIChmaWVsZC5pY29uVG9vbHRpcCkge1xyXG4gICAgICA8bHVjaWRlLWljb24gW25hbWVdPVwiZmllbGQuaWNvblRvb2x0aXAuaWNvbiB8fCAnaW5mbydcIiBbc2l6ZV09XCIxNFwiIFttYXRUb29sdGlwXT1cImZpZWxkLmljb25Ub29sdGlwLnRleHRcIlxyXG4gICAgICAgIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19pbmxpbmUtdG9vbHRpcFwiIC8+XHJcbiAgICAgIH1cclxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIFJBRElPIC0tPlxyXG4gICAgQGNhc2UgKCdyYWRpbycpIHtcclxuICAgICAgPHVpLWZvcm0tcmFkaW8tZmllbGRcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZmdcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgW2Vycm9yc109XCJnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgICAgW29wdGlvbnNdPVwiZ2V0RmllbGRPcHRpb25zKGZpZWxkKVwiXHJcbiAgICAgICAgW3JlcXVpcmVkXT1cImlzRmllbGRSZXF1aXJlZChmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgICAgW3Nob3dFcnJvcnNdPVwic2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIERBVEUgLS0+XHJcbiAgICBAY2FzZSAoJ2RhdGUnKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZnVsbC13aWR0aFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7IGZpZWxkLmxhYmVsIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlcGlja2VyXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIlxyXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnR0cvTU0vQUFBQSdcIiBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHkgfHwgcmVhZG9ubHlcIiAvPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGVwaWNrZXJcIiAvPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVwaWNrZXIgW3N0YXJ0Vmlld109XCJmaWVsZC5jdXN0b21Db25maWc/LmNvbmZpZz8uWydtb250aFZpZXcnXSA/ICd5ZWFyJyA6ICdtb250aCdcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdj57eyBlcnIgfX08L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIERBVEVUSU1FIC0tPlxyXG4gICAgQGNhc2UgKCdkYXRldGltZScpIHtcclxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19mdWxsLXdpZHRoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgZmllbGQubGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHkgfHwgcmVhZG9ubHlcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdj57eyBlcnIgfX08L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIEZJTEUgLS0+XHJcbiAgICBAY2FzZSAoJ2ZpbGUnKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWxlLXdyYXBwZXJcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1sYWJlbFwiPlxyXG4gICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgICAgQGlmIChpc0ZpZWxkUmVxdWlyZWQoZmllbGQua2V5LCBmZykpIHsgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcXVpcmVkXCI+Kjwvc3Bhbj4gfVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8dWktZmlsZS1pbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiIFtjb25maWddPVwiZmllbGQuZmlsZUNvbmZpZ1wiIC8+XHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWVycm9yXCI+XHJcbiAgICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8c3Bhbj57eyBlcnIgfX08L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBESVZJREVSIC0tPlxyXG4gICAgQGNhc2UgKCdkaXZpZGVyJykge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZGl2aWRlclwiPlxyXG4gICAgICBAaWYgKGZpZWxkLmxhYmVsKSB7XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19kaXZpZGVyLWxhYmVsXCI+e3sgZmllbGQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgICAgPGhyIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19kaXZpZGVyLWxpbmVcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBMT0NBVElPTiAoc2VsZXppb25lIHRlcnJpdG9yaW8pIC0tPlxyXG4gICAgQGNhc2UgKCdsb2NhdGlvbicpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2xvY2F0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgQGlmIChmaWVsZC5sYWJlbCkge1xyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWxhYmVsXCI+XHJcbiAgICAgICAge3sgZmllbGQubGFiZWwgfX1cclxuICAgICAgICBAaWYgKGlzRmllbGRSZXF1aXJlZChmaWVsZC5rZXksIGZnKSkgeyA8c3BhbiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fcmVxdWlyZWRcIj4qPC9zcGFuPiB9XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIH1cclxuICAgICAgPHVpLXNwZWNpZmljYS10ZXJyaXRvcmlhbGUgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29uZmlnXT1cImZpZWxkLmN1c3RvbUNvbmZpZz8uY29uZmlnIHx8IHt9XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgZmllbGQuZGlzYWJsZWQgfHwgZGlzYWJsZWRcIiAvPlxyXG4gICAgICBAaWYgKHNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1lcnJvclwiPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHNwYW4+e3sgZXJyIH19PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gTE9DQVRJT04tVEFCTEUgKHRhYmVsbGEgQ1JVRCBkaSBsb2NhdGlvbikgLS0+XHJcbiAgICBAY2FzZSAoJ2xvY2F0aW9uLXRhYmxlJykge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fbG9jYXRpb24tdGFibGUtd3JhcHBlclwiPlxyXG4gICAgICA8dWktdGFibGUtdGVycml0b3JpYWxlIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgW2NvbmZpZ109XCJmaWVsZC5jdXN0b21Db25maWc/LmNvbmZpZyB8fCB7fVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IGZpZWxkLmRpc2FibGVkIHx8IGRpc2FibGVkXCIgLz5cclxuICAgICAgQGlmIChzaG91bGRTaG93RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZykpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtZXJyb3JcIj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxzcGFuPnt7IGVyciB9fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIExPQ0FUSU9OLUdFT0NPREVEIChyaWNlcmNhIGluZGlyaXp6byBOb21pbmF0aW0pIC0tPlxyXG4gICAgQGNhc2UgKCdsb2NhdGlvbi1nZW9jb2RlZCcpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2xvY2F0aW9uLWdlb2NvZGVkLXdyYXBwZXJcIj5cclxuICAgICAgQGlmIChmaWVsZC5sYWJlbCkge1xyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWxhYmVsXCIgW2F0dHIuZm9yXT1cIid1aS1sb2MtJyArIGZpZWxkLmtleVwiPlxyXG4gICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgICAgQGlmIChpc0ZpZWxkUmVxdWlyZWQoZmllbGQua2V5LCBmZykpIHsgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcXVpcmVkXCI+Kjwvc3Bhbj4gfVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICB9XHJcbiAgICAgIDx1aS1sb2NhdGlvbi1nZW9jb2RlZCBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiIFtjb25maWddPVwiZmllbGQubG9jYXRpb25HZW9jb2RlZENvbmZpZyB8fCB7fVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICdDZXJjYSBpbmRpcml6em8uLi4nXCJcclxuICAgICAgICBbaW5wdXRBcmlhTGFiZWxdPVwiZmllbGQubGFiZWwgfHwgZmllbGQucGxhY2Vob2xkZXIgfHwgJ0luZGlyaXp6bydcIlxyXG4gICAgICAgIFtpbnB1dElkXT1cIid1aS1sb2MtJyArIGZpZWxkLmtleVwiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5IHx8IHJlYWRvbmx5XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgZmllbGQuZGlzYWJsZWQgfHwgZGlzYWJsZWRcIiAvPlxyXG4gICAgICBAaWYgKHNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1lcnJvclwiPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHNwYW4+e3sgZXJyIH19PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gQ1VTVE9NIC0tPlxyXG4gICAgQGNhc2UgKCdjdXN0b20nKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19jdXN0b20td3JhcHBlclwiIFthdHRyLmRhdGEtY29tcG9uZW50XT1cImZpZWxkLmN1c3RvbUNvbmZpZz8uY29tcG9uZW50XCJcclxuICAgICAgW2F0dHIuZGF0YS10ZW1wbGF0ZS1rZXldPVwicmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkKVwiPlxyXG4gICAgICBAaWYgKGZpZWxkLmxhYmVsKSB7XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtbGFiZWxcIj5cclxuICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxyXG4gICAgICAgIEBpZiAoaXNGaWVsZFJlcXVpcmVkKGZpZWxkLmtleSwgZmcpKSB7IDxzcGFuIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXF1aXJlZFwiPio8L3NwYW4+IH1cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKGdldEN1c3RvbUZpZWxkT3V0bGV0KGZpZWxkLCBmZyk7IGFzIGN1c3RvbU91dGxldCkge1xyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tT3V0bGV0LnRlbXBsYXRlOyBjb250ZXh0OiBjdXN0b21PdXRsZXQuY29udGV4dFwiIC8+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19jdXN0b20tcGxhY2Vob2xkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgPHNwYW4+TmVzc3VuIHRlbXBsYXRlIHJlZ2lzdHJhdG8gcGVyIMKre3sgcmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkKSB9fcK7PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgICBAaWYgKHNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1lcnJvclwiPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHNwYW4+e3sgZXJyIH19PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
1351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFNWixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixVQUFVLEdBRVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULG1CQUFtQixHQUdwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixl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QkFBb0I7c0JBQTVCLEtBQUs7Z0JBTUcsMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUlJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgaW5qZWN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUdyb3VwLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1BcnJheSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XHJcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHtcclxuICBNYXROYXRpdmVEYXRlTW9kdWxlLFxyXG4gIERhdGVBZGFwdGVyLFxyXG4gIE1BVF9EQVRFX0ZPUk1BVFMsXHJcbiAgTUFUX0RBVEVfTE9DQUxFLFxyXG4gIEVycm9yU3RhdGVNYXRjaGVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgVWlBY2NvcmRpb25Db21wb25lbnQsIFVpQWNjb3JkaW9uRGVzY3JpcHRvciB9IGZyb20gJy4uL2FjY29yZGlvbi9pbmRleCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkNvbXBvbmVudCwgVWlCdXR0b25EZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9idXR0b24vaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkFyZWFDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9idXR0b24tYXJlYS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U2VydmljZSB9IGZyb20gJy4uL2JsYWNrYm94L2JsYWNrYm94LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2xvZ2dpbmcvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHsgVWlGb3JtU2NoZW1hLCBVaUZvcm1TZWN0aW9uLCBVaUZvcm1EYXRhLCBVaUZvcm1DdXN0b21FdmVudCwgVWlGb3JtQnVpbGRlckNvbmZpZywgVWlSZXBlYXRhYmxlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9zY2hlbWEudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIFVpRm9ybUZpZWxkRGVzY3JpcHRvcixcclxuICBVaUZpZWxkT3B0aW9uLFxyXG4gIFVpRmllbGRUeXBlLFxyXG4gIFVpQ3VzdG9tRmllbGRUZW1wbGF0ZUNvbnRleHQsXHJcbn0gZnJvbSAnLi90eXBlcy9maWVsZC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtVmFsaWRhdGlvblN0YXRlLFxyXG4gIFVpRm9ybUVycm9yRGV0YWlsLFxyXG4gIFVpVmFsaWRhdGlvblJ1bGUsXHJcbiAgVUlfRk9STV9ORVNURURfRklFTERfRVJST1JTX0tFWSxcclxufSBmcm9tICcuL3R5cGVzL3ZhbGlkYXRpb24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUZpZWxkQ29uZGl0aW9uIH0gZnJvbSAnLi90eXBlcy9jb25kaXRpb24udHlwZXMnO1xyXG5pbXBvcnQgeyBVaUZvcm1Db25kaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3JtLWNvbmRpdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tdmFsaWRhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlGb3JtRmllbGRFcnJvclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm0tZmllbGQtZXJyb3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZXJyb3Itc3VtbWFyeS9mb3JtLWVycm9yLXN1bW1hcnkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlGaWxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2ZpbGUtaW5wdXQvZmlsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaVNwZWNpZmljYVRlcnJpdG9yaWFsZUNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvc3BlY2lmaWNhLXRlcnJpdG9yaWFsZS9zcGVjaWZpY2EtdGVycml0b3JpYWxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVpVGFibGVUZXJyaXRvcmlhbGVDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3RhYmxlLXRlcnJpdG9yaWFsZS90YWJsZS10ZXJyaXRvcmlhbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVWlMb2NhdGlvbkdlb2NvZGVkQ29tcG9uZW50IH0gZnJvbSAnLi9zdWItY29tcG9uZW50cy9sb2NhdGlvbi1nZW9jb2RlZC9sb2NhdGlvbi1nZW9jb2RlZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUZvcm1UZXh0RmllbGRDb21wb25lbnQsIFVpRm9ybVRleHRhcmVhRmllbGRDb21wb25lbnQsIFVpRm9ybU51bWJlckZpZWxkQ29tcG9uZW50LCBVaUZvcm1TZWxlY3RGaWVsZENvbXBvbmVudCwgVWlGb3JtUmFkaW9GaWVsZENvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZm9ybS1maWVsZHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUZvcm1FcnJvclN0YXRlTWF0Y2hlciB9IGZyb20gJy4vc2VydmljZXMvZm9ybS1lcnJvci1zdGF0ZS5tYXRjaGVyJztcclxuaW1wb3J0IHsgVWlJdGFsaWFuRGF0ZUFkYXB0ZXIsIFVJX0lUX0RBVEVfRk9STUFUUyB9IGZyb20gJy4vYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyJztcclxuXHJcbi8qKlxyXG4gKiBGb3JtIGJ1aWxkZXIgZGF0YS1kcml2ZW4gZSBzY2hlbWEtYmFzZWQuXHJcbiAqXHJcbiAqIEdlbmVyYSB1biBmb3JtIGNvbXBsZXRvIGEgcGFydGlyZSBkYSB1bm8gc2NoZW1hIGRpY2hpYXJhdGl2byAoYFVpRm9ybVNjaGVtYWApLlxyXG4gKiBTdXBwb3J0YSBpIHRpcGkgZGkgY2FtcG8gZGVsIGZvcm0gYnVpbGRlciwgdmFsaWRhemlvbmUgY29uZGl6aW9uYWxlLCBjcm9zcy1maWVsZCB2YWxpZGF0aW9uLFxyXG4gKiBkYXRlIGNvbiBvZmZzZXQsIG9wemlvbmkgZGlwZW5kZW50aS9kaW5hbWljaGUsIHNlemlvbmkgY29sbGFwc2liaWxpLFxyXG4gKiBlcnJvciBzdW1tYXJ5IGNvbiBzY3JvbGwtdG8tZmllbGQgZSBidXR0b24gb3ZlcnJpZGUuXHJcbiAqXHJcbiAqIEBzZWxlY3RvciB1aS1mb3JtLWJ1aWxkZXJcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktZm9ybS1idWlsZGVyXHJcbiAqICAgW3NjaGVtYV09XCJmb3JtU2NoZW1hXCJcclxuICogICBbaW5pdGlhbERhdGFdPVwidXNlckRhdGFcIlxyXG4gKiAgIChmb3JtU3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIlxyXG4gKiAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0tYnVpbGRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdFJhZGlvTW9kdWxlLFxyXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcclxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsXHJcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXHJcbiAgICBNYXRDaGlwc01vZHVsZSxcclxuICAgIFVpQWNjb3JkaW9uQ29tcG9uZW50LFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXHJcbiAgICBVaUJ1dHRvbkNvbXBvbmVudCxcclxuICAgIFVpQnV0dG9uQXJlYUNvbXBvbmVudCxcclxuICAgIFVpRm9ybUVycm9yU3VtbWFyeUNvbXBvbmVudCxcclxuICAgIFVpRmlsZUlucHV0Q29tcG9uZW50LFxyXG4gICAgVWlTcGVjaWZpY2FUZXJyaXRvcmlhbGVDb21wb25lbnQsXHJcbiAgICBVaVRhYmxlVGVycml0b3JpYWxlQ29tcG9uZW50LFxyXG4gICAgVWlMb2NhdGlvbkdlb2NvZGVkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtVGV4dEZpZWxkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtVGV4dGFyZWFGaWVsZENvbXBvbmVudCxcclxuICAgIFVpRm9ybU51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtU2VsZWN0RmllbGRDb21wb25lbnQsXHJcbiAgICBVaUZvcm1SYWRpb0ZpZWxkQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IEVycm9yU3RhdGVNYXRjaGVyLCB1c2VDbGFzczogVWlGb3JtRXJyb3JTdGF0ZU1hdGNoZXIgfSxcclxuICAgIC8vIExvY2FsZSBpdGFsaWFubyBwZXIgaWwgZGF0ZXBpY2tlciBNYXRlcmlhbFxyXG4gICAgeyBwcm92aWRlOiBNQVRfREFURV9MT0NBTEUsIHVzZVZhbHVlOiAnaXQtSVQnIH0sXHJcbiAgICAvLyBBZGFwdGVyIHBlcnNvbmFsaXp6YXRvIHBlciBwYXJzaW5nIEREL01NL1lZWVlcclxuICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBVaUl0YWxpYW5EYXRlQWRhcHRlciB9LFxyXG4gICAgLy8gRm9ybWF0aSBkYXRhIGl0YWxpYW5pIChERC9NTS9ZWVlZKVxyXG4gICAgeyBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogVUlfSVRfREFURV9GT1JNQVRTIH0sXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGhvc3Q6IHsgY2xhc3M6ICd1aS1mb3JtLWJ1aWxkZXItaG9zdCcgfSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZm9ybS1idWlsZGVyLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybUJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmRpdGlvblNlcnZpY2UgPSBpbmplY3QoVWlGb3JtQ29uZGl0aW9uU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uU2VydmljZSA9IGluamVjdChVaUZvcm1WYWxpZGF0aW9uU2VydmljZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBmaWVsZEVycm9yU2VydmljZSA9IGluamVjdChVaUZvcm1GaWVsZEVycm9yU2VydmljZSk7XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgT3B0aW9uYWwgQmxhY2tCb3ggc2VydmljZSDigJQgYXV0by10cmFja3MgZm9ybSBldmVudHMgd2hlbiBhdmFpbGFibGUuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBibGFja2JveCA9IGluamVjdChVaUJsYWNrYm94U2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICAvKiogQGludGVybmFsIFJvdXRlciBpbmplY3QgZm9yIEJsYWNrQm94IHJvdXRlIGNvbnRleHQuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBiYlJvdXRlciA9IGluamVjdChSb3V0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcbiAgLyoqIEBpbnRlcm5hbCBPcHRpb25hbCBMb2dnZXIgc2VydmljZSDigJQgbG9ncyBmb3JtIGFjdGlvbnMgd2hlbiBhdmFpbGFibGUuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoVWlMb2dnZXJTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHZhbHVlQ2hhbmdlU3ViPzogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKiBAaW50ZXJuYWwgTGlzdGVuZXIgY2xlYW51cCBmb3IgQmxhY2tCb3ggZm9jdXMvYmx1ciB0cmFja2luZy4gKi9cclxuICBwcml2YXRlIGJiRm9jdXNIYW5kbGVyOiAoKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBiYkJsdXJIYW5kbGVyOiAoKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBJRCBzY2hlbWEgY29ycmVudGUgLS0gdXNhdG8gcGVyIGV2aXRhcmUgcmVidWlsZCBzdXBlcmZsdWkuICovXHJcbiAgcHJpdmF0ZSBjdXJyZW50U2NoZW1hSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDilIDilIDilIAgSW5wdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBTY2hlbWEgZGVsIGZvcm0uICovXHJcbiAgQElucHV0KCkgc2NoZW1hITogVWlGb3JtU2NoZW1hO1xyXG5cclxuICAvKiogRGF0aSBpbml6aWFsaSBwZXIgbGEgcHJldmFsb3JpenphemlvbmUuICovXHJcbiAgQElucHV0KCkgaW5pdGlhbERhdGE6IFVpRm9ybURhdGEgPSB7fTtcclxuXHJcbiAgLyoqIE1vZGFsaXRhIHNvbGEgbGV0dHVyYSBnbG9iYWxlLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdGF0byBkaXNhYmlsaXRhdG8gZ2xvYmFsZS4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogT3ZlcnJpZGUgZGVpIHB1bHNhbnRpIGRpIGRlZmF1bHQuICovXHJcbiAgQElucHV0KCkgYnV0dG9uc092ZXJyaWRlPzogVWlCdXR0b25EZXNjcmlwdG9yW107XHJcblxyXG4gIC8qKiBDaGlhdmUgZGVsIHB1bHNhbnRlIGluIHN0YXRvIGRpIGNhcmljYW1lbnRvLiAqL1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBNYXBwYSBjaGlhdmUgbG9naWNhIOKGkiB0ZW1wbGF0ZSBwZXIgY2FtcGkgYHR5cGU6ICdjdXN0b20nYC5cclxuICAgKiBMYSBjaGlhdmUgc2kgcmlzb2x2ZSBjb24gYGN1c3RvbUNvbmZpZy50ZW1wbGF0ZUtleWAsIHBvaSBgY3VzdG9tQ29uZmlnLmNvbXBvbmVudGAsIHBvaSBgZmllbGQua2V5YC5cclxuICAgKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8dW5rbm93bj4+ID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzYXRvIHF1YW5kbyBub24gZXNpc3RlIHVuYSB2b2NlIGluIGBjdXN0b21GaWVsZFRlbXBsYXRlc2AgcGVyIGxhIGNoaWF2ZSByaXNvbHRhXHJcbiAgICogKGVzLiB1biB1bmljbyBgbmctdGVtcGxhdGVgIGNvbiBgQHN3aXRjaGAgc3VsIGNhbXBvKS5cclxuICAgKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2s/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1WYWxpZGF0aW9uU3RhdGU+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1SZXNldCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybUN1c3RvbUV2ZW50PigpO1xyXG5cclxuICAvLyDilIDilIDilIAgU3RhdG8gaW50ZXJubyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xyXG5cclxuICAvKiogTWFwcGEgY2FtcG8gLT4gb3B6aW9uaSBmaWx0cmF0ZSAocGVyIGF1dG9jb21wbGV0ZSBlIGRlcGVuZGVudCkuICovXHJcbiAgZmlsdGVyZWRPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVaUZpZWxkT3B0aW9uW10+ID0ge307XHJcblxyXG4gIC8qKiBDYW1waSBwcmV2YWxvcml6emF0aSAobW9zdHJhbm8gZXJyb3JpIHN1Yml0bykuICovXHJcbiAgcHJldmFsb3JpemVkRmllbGRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBNYXBwYSBjYW1wbyAtPiByZWdvbGUgZGkgdmFsaWRhemlvbmUgKHBlciBsb29rdXAgcmFwaWRvKS4gKi9cclxuICBwcml2YXRlIHZhbGlkYXRpb25SdWxlc01hcDogUmVjb3JkPHN0cmluZywgVWlWYWxpZGF0aW9uUnVsZVtdPiA9IHt9O1xyXG5cclxuICAvKiogTWFwcGEgZGlwZW5kZW56ZTogY2FtcG9UYXJnZXQgLT4gY2FtcGkgZGlwZW5kZW50aS4gKi9cclxuICBwcml2YXRlIGZpZWxkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xyXG5cclxuICAvKiogQGludGVybmFsIEFjY29yZGlvbiBkZXNjcmlwdG9ycyBwZXIgbGUgc2V6aW9uaSBjb2xsYXBzaWJpbGkuICovXHJcbiAgc2VjdGlvbkFjY29yZGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBVaUFjY29yZGlvbkRlc2NyaXB0b3JbXT4oKTtcclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBBY2NvcmRpb24gZGVzY3JpcHRvcnMgcGVyIGxlIGlzdGFuemUgcmVwZWF0YWJsZSAoc2VjdGlvbklkIC0+IGRlc2NyaXB0b3JzKS4gKi9cclxuICByZXBlYXRhYmxlQWNjb3JkaW9uTWFwID0gbmV3IE1hcDxzdHJpbmcsIFVpQWNjb3JkaW9uRGVzY3JpcHRvcltdPigpO1xyXG5cclxuICAvKiogRmxhZyBwZXIgZXZpdGFyZSBlbWlzc2lvbmkgZHVyYW50ZSBsJ2luaXppYWxpenphemlvbmUuICovXHJcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemluZyA9IHRydWU7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBHZXR0ZXIgY2FsY29sYXRpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVHV0dGkgaSBjYW1waSBkaSB0dXR0ZSBsZSBzZXppb25pIChpbmNsdXNlIHJlcGVhdGFibGUpLiAqL1xyXG4gIGdldCBhbGxGaWVsZHMoKTogVWlGb3JtRmllbGREZXNjcmlwdG9yW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hPy5zZWN0aW9ucz8uZmxhdE1hcCgocykgPT4gcy5maWVsZHMpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbXBpIGRlbGxlIHNvbGUgc2V6aW9uaSBub24tcmVwZWF0YWJsZSAocGlhdHRpIG5lbCByb290IEZvcm1Hcm91cCkuICovXHJcbiAgZ2V0IGFsbEZsYXRGaWVsZHMoKTogVWlGb3JtRmllbGREZXNjcmlwdG9yW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hPy5zZWN0aW9ucz8uZmlsdGVyKChzKSA9PiAhcy5yZXBlYXRhYmxlKS5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcykgfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogU2V6aW9uaSBjb24gY29uZmlndXJhemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBnZXQgcmVwZWF0YWJsZVNlY3Rpb25zKCk6IFVpRm9ybVNlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY2hlbWE/LnNlY3Rpb25zPy5maWx0ZXIoKHMpID0+ICEhcy5yZXBlYXRhYmxlKSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldCBmb3JtRXJyb3JzKCk6IFVpRm9ybUVycm9yRGV0YWlsW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9ybUJ1dHRvbnMoKTogVWlCdXR0b25EZXNjcmlwdG9yW10ge1xyXG4gICAgaWYgKHRoaXMuYnV0dG9uc092ZXJyaWRlKSByZXR1cm4gdGhpcy5idXR0b25zT3ZlcnJpZGU7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hPy5jb25maWc/LnNob3dCdXR0b25zICYmIHRoaXMuc2NoZW1hPy5jb25maWc/LnNob3dCdXR0b25zICE9PSB1bmRlZmluZWQpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6IHRoaXMuc2NoZW1hPy5jb25maWc/LmJ1dHRvbkxhYmVscz8ucmVzZXQgfHwgJ1Jlc2V0JywgdmFyaWFudDogJ291dGxpbmUnLCBhY3Rpb246ICgpID0+IHRoaXMub25SZXNldCgpIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogdGhpcy5zY2hlbWE/LmNvbmZpZz8uYnV0dG9uTGFiZWxzPy5zdWJtaXQgfHwgJ0ludmlhJyxcclxuICAgICAgICB2YXJpYW50OiAncHJpbWFyeScsXHJcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLm9uU3VibWl0KCksXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvL1xyXG4gIC8vIE9SRElORSBMSUZFQ1lDTEUgQU5HVUxBUjpcclxuICAvLyAxLiBjb25zdHJ1Y3RvclxyXG4gIC8vIDIuIG5nT25DaGFuZ2VzIChwcmltYSBjaGlhbWF0YSBjb24gdmFsb3JpIGluaXppYWxpKVxyXG4gIC8vIDMuIG5nT25Jbml0XHJcbiAgLy8gNC4gbmdBZnRlclZpZXdJbml0XHJcbiAgLy8gNS4gbmdPbkNoYW5nZXMgKGNoaWFtYXRlIHN1Y2Nlc3NpdmUgcGVyIGNhbWJpbyBpbnB1dClcclxuICAvL1xyXG4gIC8vIFBFUiBJTCBXSVpBUkQ6XHJcbiAgLy8gSWwgd2l6YXJkIGNyZWEgdW4gbnVvdm8gc2NoZW1hIChjb24gaWQgZGl2ZXJzbykgYWQgb2duaSBjYW1iaW8gc3RlcC5cclxuICAvLyBMbyBzY2hlbWEgdmllbmUgY2FjaGF0byBuZWwgd2l6YXJkIHBlciBldml0YXJlIHJlYnVpbGQgaW5maW5pdGkuXHJcbiAgLy8gbmdPbkNoYW5nZXMgcmlsZXZhIGlsIGNhbWJpbyBkaSBzY2hlbWEuaWQgZSByaWNvc3RydWlzY2UgaWwgZm9ybS5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nRm9ybUFjdGlvbignaW5pdCcsIHsgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bicsIGhhc0Zvcm1Hcm91cDogISF0aGlzLmZvcm1Hcm91cCB9KTtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ2luaXQnLCB7IHNjaGVtYUlkOiAndW5rbm93bicsIGVycm9yOiAnc2NoZW1hIG5vbiBwcmVzZW50ZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdEZvcm1Gcm9tU2NoZW1hKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWxldmEgY2FtYmlhbWVudGkgc3VnbGkgQElucHV0LlxyXG4gICAqIFJpY29zdHJ1aXNjZSBpbCBmb3JtIHF1YW5kbyBjYW1iaWEgbG8gc2NoZW1hIChpZCBkaXZlcnNvKS5cclxuICAgKiBDcnVjaWFsZSBwZXIgaWwgd2l6YXJkIGNoZSBjYW1iaWEgc2NoZW1hIGFkIG9nbmkgc3RlcC5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc2NoZW1hJ10gJiYgIWNoYW5nZXNbJ3NjaGVtYSddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIGNvbnN0IG5ld1NjaGVtYSA9IGNoYW5nZXNbJ3NjaGVtYSddLmN1cnJlbnRWYWx1ZSBhcyBVaUZvcm1TY2hlbWE7XHJcbiAgICAgIGlmIChuZXdTY2hlbWEgJiYgbmV3U2NoZW1hLmlkICE9PSB0aGlzLmN1cnJlbnRTY2hlbWFJZCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyPy5kZWJ1ZygnZm9ybScsICdzY2hlbWFSZWJ1aWxkJywge1xyXG4gICAgICAgICAgc2NoZW1hSWQ6IG5ld1NjaGVtYT8uaWQsXHJcbiAgICAgICAgICBwcmV2aW91c1NjaGVtYUlkOiB0aGlzLmN1cnJlbnRTY2hlbWFJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5pbml0Rm9ybUZyb21TY2hlbWEoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFnZ2lvcm5hIGxvIHN0YXRvIGRpc2FibGVkL3JlYWRvbmx5IGdsb2JhbG1lbnRlXHJcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snZGlzYWJsZWQnXS5maXJzdENoYW5nZSAmJiB0aGlzLmZvcm1Hcm91cCkge1xyXG4gICAgICB0aGlzLmFsbEZsYXRGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgICAgaWYgKCFjb250cm9sKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSB7XHJcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgY29udHJvbC5kaXNhYmxlZCAmJiAhZmllbGQuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gQWdnaW9ybmEgZGlzYWJsZWQgYW5jaGUgbmVsbGUgaXN0YW56ZSByZXBlYXRhYmxlXHJcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnJlcGVhdGFibGVTZWN0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VGZyA9IGFyci5hdChpKSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBpbnN0YW5jZUZnLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAmJiBjb250cm9sLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc2FibGVkICYmIGNvbnRyb2wuZGlzYWJsZWQgJiYgIWZpZWxkLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvZ2dlcj8uZGVidWcoJ2Zvcm0nLCAnYWZ0ZXJWaWV3SW5pdCcsIHtcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgICAgaGFzRm9ybUdyb3VwOiAhIXRoaXMuZm9ybUdyb3VwLFxyXG4gICAgICBmaWVsZENvdW50OiB0aGlzLmZvcm1Hcm91cCA/IE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5sZW5ndGggOiAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dGb3JtQWN0aW9uKCdkZXN0cm95JywgeyBzY2hlbWFJZDogdGhpcy5jdXJyZW50U2NoZW1hSWQgPz8gJ3Vua25vd24nIH0pO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViPy51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIC8vIEJsYWNrQm94OiBjbGVhbnVwIERPTSBsaXN0ZW5lcnNcclxuICAgIGlmICh0aGlzLmJiRm9jdXNIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5iYkZvY3VzSGFuZGxlciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5iYkJsdXJIYW5kbGVyKSB7XHJcbiAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIHRoaXMuYmJCbHVySGFuZGxlciwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml6aWFsaXp6YSBpbCBmb3JtIGRhbGxvIHNjaGVtYSBjb3JyZW50ZS5cclxuICAgKiBFc3RyYXR0byBwZXIgcG90ZXIgZXNzZXJlIHJpY2hpYW1hdG8gc2lhIGRhIG5nT25Jbml0IGNoZSBkYSBuZ09uQ2hhbmdlcy5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRGb3JtRnJvbVNjaGVtYSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zY2hlbWEpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ2luaXQnLCB7IHNjaGVtYUlkOiAndW5rbm93bicsIGVycm9yOiAnc2NoZW1hIG51bGxvJyB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG90YWxGaWVsZHMgPSB0aGlzLnNjaGVtYS5zZWN0aW9ucz8ucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIHMuZmllbGRzLmxlbmd0aCwgMCkgPz8gMDtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dGb3JtQWN0aW9uKCdpbml0Jywge1xyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIHNlY3Rpb25Db3VudDogdGhpcy5zY2hlbWEuc2VjdGlvbnM/Lmxlbmd0aCxcclxuICAgICAgZmllbGRDb3VudDogdG90YWxGaWVsZHMsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY3VycmVudFNjaGVtYUlkID0gdGhpcy5zY2hlbWEuaWQ7XHJcbiAgICB0aGlzLmJ1aWxkU2VjdGlvbkFjY29yZGlvbk1hcCgpO1xyXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIC8vIERvcG8gaWwgRm9ybUFycmF5IHJlYWxlLCBhbGxpbmVhIGkgZGVzY3JpcHRvciBhY2NvcmRpb24gKG1heCB0cmEgbWluIGUgcmlnaGUgaW5pdGlhbERhdGEpLlxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmxvZ2dlcj8uZGVidWcoJ2Zvcm0nLCAnZm9ybUJ1aWx0Jywge1xyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIGNvbnRyb2xLZXlzOiBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scyksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1bGlzY2UgbG8gc3RhdG8gZGVsIGZvcm0gcHJpbWEgZGkgdW4gcmVidWlsZC5cclxuICAgKi9cclxuICBwcml2YXRlIGRlc3Ryb3lGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dnZXI/LmRlYnVnKCdmb3JtJywgJ2Rlc3Ryb3lGb3JtJywgeyBzY2hlbWFJZDogdGhpcy5jdXJyZW50U2NoZW1hSWQgfSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZVN1YiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0ge307XHJcbiAgICB0aGlzLnByZXZhbG9yaXplZEZpZWxkcy5jbGVhcigpO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uUnVsZXNNYXAgPSB7fTtcclxuICAgIHRoaXMuZmllbGREZXBlbmRlbmNpZXMuY2xlYXIoKTtcclxuICAgIHRoaXMuc2VjdGlvbkFjY29yZGlvbk1hcC5jbGVhcigpO1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemluZyA9IHRydWU7XHJcbiAgICB0aGlzLmN1cnJlbnRTY2hlbWFJZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgQ29zdHJ1emlvbmUgZm9ybSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBidWlsZEZvcm0oKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sczogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RDb250cm9sPiA9IHt9O1xyXG5cclxuICAgIC8vIENhbXBpIHBpYXR0aSAoc2V6aW9uaSBub24tcmVwZWF0YWJsZSlcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMuaW5pdGlhbERhdGE/LltmaWVsZC5rZXldID8/IGZpZWxkLmRlZmF1bHRWYWx1ZSA/PyBudWxsO1xyXG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gZmllbGQuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZDtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogaW5pdGlhbFZhbHVlLCBkaXNhYmxlZDogaXNEaXNhYmxlZCB9KTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC52YWxpZGF0aW9uPy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlc01hcFtmaWVsZC5rZXldID0gZmllbGQudmFsaWRhdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPSBudWxsICYmIGluaXRpYWxWYWx1ZSAhPT0gJycgJiYgaW5pdGlhbFZhbHVlICE9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMucHJldmFsb3JpemVkRmllbGRzLmFkZChmaWVsZC5rZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZmllbGQub3B0aW9ucyAmJiAhdGhpcy5pc09ic2VydmFibGUoZmllbGQub3B0aW9ucykpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLihmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXSldO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb250cm9sc1tmaWVsZC5rZXldID0gY29udHJvbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtQXJyYXkgcGVyIHNlemlvbmkgcmVwZWF0YWJsZVxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IGluaXRpYWxBcnJheSA9IHRoaXMuaW5pdGlhbERhdGE/LltzZWN0aW9uLmlkXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+W10gfCB1bmRlZmluZWQ7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5nZXRSZXBlYXRhYmxlSW5pdGlhbEluc3RhbmNlQ291bnQoc2VjdGlvbik7XHJcblxyXG4gICAgICBjb25zdCBncm91cHM6IEZvcm1Hcm91cFtdID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKHRoaXMuYnVpbGRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLCBpbml0aWFsQXJyYXk/LltpXSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnRyb2xzW3NlY3Rpb24uaWRdID0gbmV3IEZvcm1BcnJheShncm91cHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb250cm9scyk7XHJcblxyXG4gICAgLy8gQXBwbGljYSB2YWxpZGF0b3JpIGluaXppYWxpXHJcbiAgICB0aGlzLmFwcGx5QWxsVmFsaWRhdG9ycygpO1xyXG5cclxuICAgIC8vIFJlZ2lzdHJhIGRpcGVuZGVuemVcclxuICAgIHRoaXMuYnVpbGREZXBlbmRlbmN5TWFwKCk7XHJcblxyXG4gICAgLy8gU290dG9zY3JpdmkgYWkgY2FtYmlhbWVudGkgZGkgdmFsb3JlXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3ViID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDUwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmV2YWx1YXRlQWxsQ29uZGl0aW9ucygpO1xyXG4gICAgICB0aGlzLnVwZGF0ZURlcGVuZGVudE9wdGlvbnMoKTtcclxuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuZ2V0Rm9ybVZhbHVlKCkpO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHRoaXMuZ2V0VmFsaWRhdGlvblN0YXRlKCkpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBWYWx1dGF6aW9uZSBjb25kaXppb25pIGluaXppYWxlXHJcbiAgICB0aGlzLmV2YWx1YXRlQWxsQ29uZGl0aW9ucygpO1xyXG5cclxuICAgIC8vIEJsYWNrQm94OiBzZXR1cCBmb3JtIGV2ZW50IHRyYWNraW5nXHJcbiAgICB0aGlzLnNldHVwQmxhY2tib3hUcmFja2luZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvc3RydWlzY2UgdW4gRm9ybUdyb3VwIHBlciB1bmEgc2luZ29sYSBpc3RhbnphIGRpIHNlemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBwcml2YXRlIGJ1aWxkSW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbjogVWlGb3JtU2VjdGlvbiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgY29udHJvbHM6IFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcclxuICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZGF0YT8uW2ZpZWxkLmtleV0gPz8gZmllbGQuZGVmYXVsdFZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSBmaWVsZC5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkO1xyXG4gICAgICBjb250cm9sc1tmaWVsZC5rZXldID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IGluaXRpYWxWYWx1ZSwgZGlzYWJsZWQ6IGlzRGlzYWJsZWQgfSk7XHJcblxyXG4gICAgICBpZiAoZmllbGQub3B0aW9ucyAmJiAhdGhpcy5pc09ic2VydmFibGUoZmllbGQub3B0aW9ucykpIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLihmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXSldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmcgPSBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzKTtcclxuXHJcbiAgICAvLyBBcHBsaWNhIHZhbGlkYXRvcmkgYWxsJ2lzdGFuemFcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VjdGlvbi5maWVsZHMpIHtcclxuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb24/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gZmcuZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsaWRhdG9ycyhmZy5nZXQoZmllbGQua2V5KSEsIGZpZWxkLnZhbGlkYXRpb24sIGZvcm1EYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmZztcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBCbGFja0JveCBmb3JtIHRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHVwIEJsYWNrQm94IGZvcm0gZXZlbnQgdHJhY2tpbmcuXHJcbiAgICogLSBGb2N1cy9ibHVyOiBET00gZXZlbnQgZGVsZWdhdGlvbiBvbiB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICogLSBWYWx1ZSBjaGFuZ2VzOiBwZXItZmllbGQgc3Vic2NyaXB0aW9ucyB3aXRoIGRlYm91bmNlXHJcbiAgICogLSBWYWxpZGF0aW9uIGVycm9yczogcGVyLWZpZWxkIHN0YXR1c0NoYW5nZXMgc3Vic2NyaXB0aW9uc1xyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBCbGFja2JveFRyYWNraW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmJsYWNrYm94KSByZXR1cm47XHJcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJsYWNrYm94LmdldENvbmZpZygpLmZvcm1UcmFja2luZztcclxuICAgIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IHRoaXMuYmJSb3V0ZXI/LnVybCA/PyAnJztcclxuICAgIGNvbnN0IGZvcm1JZCA9IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bic7XHJcblxyXG4gICAgLy8gRm9jdXMgdHJhY2tpbmcgdmlhIGV2ZW50IGRlbGVnYXRpb25cclxuICAgIGlmIChjb25maWcudHJhY2tGb2N1cykge1xyXG4gICAgICB0aGlzLmJiRm9jdXNIYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCBmaWVsZEtleSA9IHRoaXMucmVzb2x2ZUZpZWxkS2V5RnJvbUV2ZW50KGUpO1xyXG4gICAgICAgIGlmICghZmllbGRLZXkpIHJldHVybjtcclxuICAgICAgICB0aGlzLmJsYWNrYm94IS50cmFja0Zvcm1FdmVudCh7XHJcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgICAgICByb3V0ZTogdGhpcy5iYlJvdXRlcj8udXJsID8/IGN1cnJlbnRSb3V0ZSxcclxuICAgICAgICAgIGZvcm1JZCxcclxuICAgICAgICAgIGZpZWxkS2V5LFxyXG4gICAgICAgICAgZXZlbnRUeXBlOiAnZm9jdXMnLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuYmJGb2N1c0hhbmRsZXIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEJsdXIgdHJhY2tpbmcgdmlhIGV2ZW50IGRlbGVnYXRpb25cclxuICAgIGlmIChjb25maWcudHJhY2tCbHVyKSB7XHJcbiAgICAgIHRoaXMuYmJCbHVySGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmllbGRLZXkgPSB0aGlzLnJlc29sdmVGaWVsZEtleUZyb21FdmVudChlKTtcclxuICAgICAgICBpZiAoIWZpZWxkS2V5KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5ibGFja2JveCEudHJhY2tGb3JtRXZlbnQoe1xyXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgcm91dGU6IHRoaXMuYmJSb3V0ZXI/LnVybCA/PyBjdXJyZW50Um91dGUsXHJcbiAgICAgICAgICBmb3JtSWQsXHJcbiAgICAgICAgICBmaWVsZEtleSxcclxuICAgICAgICAgIGV2ZW50VHlwZTogJ2JsdXInLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCB0aGlzLmJiQmx1ckhhbmRsZXIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlci1maWVsZCB2YWx1ZSBjaGFuZ2UgKyB2YWxpZGF0aW9uIHRyYWNraW5nXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KTtcclxuICAgICAgaWYgKCFjb250cm9sKSBjb250aW51ZTtcclxuXHJcbiAgICAgIC8vIFZhbHVlIGNoYW5nZXNcclxuICAgICAgaWYgKGNvbmZpZy50cmFja1ZhbHVlQ2hhbmdlcykge1xyXG4gICAgICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKGNvbmZpZy5kZWJvdW5jZU1zKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ibGFja2JveCEudHJhY2tGb3JtRXZlbnQoe1xyXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICByb3V0ZTogdGhpcy5iYlJvdXRlcj8udXJsID8/IGN1cnJlbnRSb3V0ZSxcclxuICAgICAgICAgICAgICBmb3JtSWQsXHJcbiAgICAgICAgICAgICAgZmllbGRLZXk6IGZpZWxkLmtleSxcclxuICAgICAgICAgICAgICBldmVudFR5cGU6ICd2YWx1ZUNoYW5nZScsXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb25maWcudHJhY2tWYWx1ZXMgPyB2YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHZhbGlkOiBjb250cm9sLnZhbGlkLFxyXG4gICAgICAgICAgICAgICAgZm9ybVZhbHVlczogY29uZmlnLnRyYWNrVmFsdWVzID8gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBWYWxpZGF0aW9uIGVycm9yc1xyXG4gICAgICBpZiAoY29uZmlnLnRyYWNrVmFsaWRhdGlvbikge1xyXG4gICAgICAgIGNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgIHJ4RmlsdGVyKChzdGF0dXMpID0+IHN0YXR1cyA9PT0gJ0lOVkFMSUQnKSxcclxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGNvbnRyb2wuZXJyb3JzXHJcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycylcclxuICAgICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmJsYWNrYm94IS50cmFja0Zvcm1FdmVudCh7XHJcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgIHJvdXRlOiB0aGlzLmJiUm91dGVyPy51cmwgPz8gY3VycmVudFJvdXRlLFxyXG4gICAgICAgICAgICAgIGZvcm1JZCxcclxuICAgICAgICAgICAgICBmaWVsZEtleTogZmllbGQua2V5LFxyXG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3ZhbGlkYXRpb25FcnJvcicsXHJcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcclxuICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlIHRoZSBmb3JtIGZpZWxkIGtleSBmcm9tIGEgZm9jdXMvYmx1ciBET00gZXZlbnQuXHJcbiAgICogV2Fsa3MgdXAgZnJvbSB0aGUgZXZlbnQgdGFyZ2V0IGxvb2tpbmcgZm9yIGBmb3JtQ29udHJvbE5hbWVgIG9yIGBkYXRhLWZpZWxkLWtleWAuXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXNvbHZlRmllbGRLZXlGcm9tRXZlbnQoZTogRm9jdXNFdmVudCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IG1heERlcHRoID0gNTtcclxuICAgIGxldCBkZXB0aCA9IDA7XHJcblxyXG4gICAgd2hpbGUgKHRhcmdldCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XHJcbiAgICAgIC8vIGZvcm1Db250cm9sTmFtZSBhdHRyaWJ1dGVcclxuICAgICAgY29uc3QgZmNuID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZm9ybUNvbnRyb2xOYW1lJyk7XHJcbiAgICAgIGlmIChmY24pIHJldHVybiBmY247XHJcblxyXG4gICAgICAvLyBkYXRhLWZpZWxkLWtleSBhdHRyaWJ1dGVcclxuICAgICAgY29uc3QgZGZrID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1maWVsZC1rZXknKTtcclxuICAgICAgaWYgKGRmaykgcmV0dXJuIGRmaztcclxuXHJcbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICBkZXB0aCsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVmFsaWRhemlvbmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYXBwbHlBbGxWYWxpZGF0b3JzKCk6IHZvaWQge1xyXG4gICAgLy8gQ2FtcGkgcGlhdHRpXHJcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuYWxsRmxhdEZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UudXBkYXRlRmllbGRWYWxpZGF0b3JzKHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiwgZm9ybURhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FtcGkgbmVsbGUgaXN0YW56ZSByZXBlYXRhYmxlXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5yZXBlYXRhYmxlU2VjdGlvbnMpIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbi5pZCk7XHJcbiAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUZnID0gYXJyLmF0KGkpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzKSB7XHJcbiAgICAgICAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gaW5zdGFuY2VGZy5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnVwZGF0ZUZpZWxkVmFsaWRhdG9ycyhpbnN0YW5jZUZnLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiwgZm9ybURhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENvbmRpemlvbmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVBbGxDb25kaXRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIC8vIENhbXBpIHBpYXR0aVxyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmFsbEZsYXRGaWVsZHMpIHtcclxuICAgICAgdGhpcy5ldmFsdWF0ZUZpZWxkQ29uZGl0aW9ucyhmaWVsZCwgdGhpcy5mb3JtR3JvdXAsIGZvcm1EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYW1waSBuZWxsZSBpc3RhbnplIHJlcGVhdGFibGUgKHNjb3BlIGludHJhLWlzdGFuemEpXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5yZXBlYXRhYmxlU2VjdGlvbnMpIHtcclxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbi5pZCk7XHJcbiAgICAgIGlmICghYXJyKSBjb250aW51ZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZUZnID0gYXJyLmF0KGkpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZURhdGEgPSBpbnN0YW5jZUZnLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkcykge1xyXG4gICAgICAgICAgdGhpcy5ldmFsdWF0ZUZpZWxkQ29uZGl0aW9ucyhmaWVsZCwgaW5zdGFuY2VGZywgaW5zdGFuY2VEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBWYWx1dGEgY29uZGl6aW9uaSBkaSB2aXNpYmlsaXRhL2Rpc2FiaWxpdGF6aW9uZSBwZXIgdW4gc2luZ29sbyBjYW1wbyBuZWwgY29udGVzdG8gZGVsIEZvcm1Hcm91cCBkYXRvLiAqL1xyXG4gIHByaXZhdGUgZXZhbHVhdGVGaWVsZENvbmRpdGlvbnMoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgZmc6IEZvcm1Hcm91cCwgZm9ybURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZC5jb25kaXRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuY29uZGl0aW9ucywgZm9ybURhdGEpO1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGNvbnRyb2wuZW5hYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGlmICghZmllbGQuZnJlZXplVmFsdWVPbkRpc2FibGUpIHtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUgPz8gbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodmlzaWJsZSAmJiBjb250cm9sLmRpc2FibGVkICYmICFmaWVsZC5kaXNhYmxlZCAmJiAhdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC5kaXNhYmxlQ29uZGl0aW9ucz8ubGVuZ3RoICYmICFmaWVsZC5jb25kaXRpb25zPy5sZW5ndGgpIHtcclxuICAgICAgY29uc3Qgc2hvdWxkRGlzYWJsZSA9IHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuZGlzYWJsZUNvbmRpdGlvbnMsIGZvcm1EYXRhKTtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZnLmdldChmaWVsZC5rZXkpO1xyXG4gICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgIGlmIChzaG91bGREaXNhYmxlICYmIGNvbnRyb2wuZW5hYmxlZCkge1xyXG4gICAgICAgICAgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIGlmICghZmllbGQuZnJlZXplVmFsdWVPbkRpc2FibGUpIHtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmaWVsZC5kZWZhdWx0VmFsdWUgPz8gbnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3VsZERpc2FibGUgJiYgY29udHJvbC5kaXNhYmxlZCAmJiAhZmllbGQuZGlzYWJsZWQgJiYgIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGQudmFsaWRhdGlvbj8uc29tZSgocikgPT4gci5jb25kaXRpb25zPy5sZW5ndGgpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UudXBkYXRlRmllbGRWYWxpZGF0b3JzKGZnLmdldChmaWVsZC5rZXkpISwgZmllbGQudmFsaWRhdGlvbiEsIGZvcm1EYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBEaXBlbmRlbnplIG9wemlvbmkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgYnVpbGREZXBlbmRlbmN5TWFwKCk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmFsbEZpZWxkcykge1xyXG4gICAgICBpZiAoZmllbGQuZGVwZW5kZW50T3B0aW9ucz8uZGVwZW5kc09uKSB7XHJcbiAgICAgICAgY29uc3QgZGVwS2V5ID0gZmllbGQuZGVwZW5kZW50T3B0aW9ucy5kZXBlbmRzT247XHJcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkRGVwZW5kZW5jaWVzLmhhcyhkZXBLZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZpZWxkRGVwZW5kZW5jaWVzLnNldChkZXBLZXksIG5ldyBTZXQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmllbGREZXBlbmRlbmNpZXMuZ2V0KGRlcEtleSkhLmFkZChmaWVsZC5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb3N0cnVpc2NlIGxhIG1hcHBhIGRlaSBkZXNjcmlwdG9ycyBhY2NvcmRpb24gcGVyIGxlIHNlemlvbmkgY29sbGFwc2liaWxpLlxyXG4gICAqIE9nbmkgc2V6aW9uZSBjb2xsYXBzaWJpbGUgdmllbmUgbWFwcGF0YSBhIHVuIHNpbmdvbG8gVWlBY2NvcmRpb25EZXNjcmlwdG9yLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRTZWN0aW9uQWNjb3JkaW9uTWFwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWN0aW9uQWNjb3JkaW9uTWFwLmNsZWFyKCk7XHJcbiAgICB0aGlzLnJlcGVhdGFibGVBY2NvcmRpb25NYXAuY2xlYXIoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zY2hlbWEuc2VjdGlvbnMpIHtcclxuICAgICAgaWYgKHNlY3Rpb24ucmVwZWF0YWJsZSkge1xyXG4gICAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbi5jb2xsYXBzaWJsZSkge1xyXG4gICAgICAgIHRoaXMuc2VjdGlvbkFjY29yZGlvbk1hcC5zZXQoc2VjdGlvbi5pZCwgW3tcclxuICAgICAgICAgIGlkOiBzZWN0aW9uLmlkLFxyXG4gICAgICAgICAgdGl0bGU6IHNlY3Rpb24udGl0bGUgfHwgJycsXHJcbiAgICAgICAgICBpY29uOiBzZWN0aW9uLmljb24sXHJcbiAgICAgICAgICBleHBhbmRlZDogIXNlY3Rpb24uY29sbGFwc2VkLFxyXG4gICAgICAgICAgc3VidGl0bGU6IHNlY3Rpb24uZGVzY3JpcHRpb24sXHJcbiAgICAgICAgfV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBOdW1lcm8gZGkgaXN0YW56ZSByZXBlYXRhYmxlIGRhIGNyZWFyZSBhbCBidWlsZC9yZXNldDpcclxuICAgKiBhbG1lbm8gYHJlcGVhdGFibGUubWluYCAoc2UgYG1pbiA+IDBgIG8gb21lc3NvIGRlZmF1bHQgMSksIG1haSBtZW5vIGRlbGxlIHJpZ2hlIGluIGBpbml0aWFsRGF0YVtzZWN0aW9uLmlkXWAuXHJcbiAgICogQ29uIGBtaW46IDBgIG5vbiBzaSBhZ2dpdW5nb25vIHJpZ2hlIG9sdHJlIGEgcXVlbGxlIGdpw6AgcHJlc2VudGkgbmVpIGRhdGkgaW5pemlhbGkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRSZXBlYXRhYmxlSW5pdGlhbEluc3RhbmNlQ291bnQoc2VjdGlvbjogVWlGb3JtU2VjdGlvbik6IG51bWJlciB7XHJcbiAgICBjb25zdCBjZmcgPSBzZWN0aW9uLnJlcGVhdGFibGU7XHJcbiAgICBpZiAoIWNmZykgcmV0dXJuIDA7XHJcbiAgICBjb25zdCBpbml0aWFsQXJyYXkgPSB0aGlzLmluaXRpYWxEYXRhPy5bc2VjdGlvbi5pZF0gYXMgUmVjb3JkPHN0cmluZywgYW55PltdIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgaW5pdGlhbExlbiA9IGluaXRpYWxBcnJheT8ubGVuZ3RoID8/IDA7XHJcbiAgICBjb25zdCBtaW5SZXEgPSBjZmcubWluO1xyXG4gICAgaWYgKG1pblJlcSA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gaW5pdGlhbExlbjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1pbkluc3RhbmNlcyA9IG1pblJlcSA/PyAxO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KGluaXRpYWxMZW4sIG1pbkluc3RhbmNlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmljb3N0cnVpc2NlIGkgZGVzY3JpcHRvciBhY2NvcmRpb24gcGVyIGxlIGlzdGFuemUgZGkgdW5hIHNlemlvbmUgcmVwZWF0YWJsZS4gKi9cclxuICBwcml2YXRlIHJlYnVpbGRSZXBlYXRhYmxlQWNjb3JkaW9uKHNlY3Rpb246IFVpRm9ybVNlY3Rpb24pOiB2b2lkIHtcclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgY29uc3QgY291bnQgPSBhcnI/Lmxlbmd0aCA/PyB0aGlzLmdldFJlcGVhdGFibGVJbml0aWFsSW5zdGFuY2VDb3VudChzZWN0aW9uKTtcclxuICAgIGNvbnN0IHRpdGxlVGVtcGxhdGUgPSBzZWN0aW9uLnJlcGVhdGFibGUhLmluc3RhbmNlVGl0bGUgfHwgKHNlY3Rpb24udGl0bGUgPyBgJHtzZWN0aW9uLnRpdGxlfSB7aW5kZXh9YCA6ICdFbGVtZW50byB7aW5kZXh9Jyk7XHJcbiAgICBjb25zdCBpdGVtczogVWlBY2NvcmRpb25EZXNjcmlwdG9yW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgaXRlbXMucHVzaCh7XHJcbiAgICAgICAgaWQ6IGAke3NlY3Rpb24uaWR9LSR7aX1gLFxyXG4gICAgICAgIHRpdGxlOiB0aXRsZVRlbXBsYXRlLnJlcGxhY2UoJ3tpbmRleH0nLCBTdHJpbmcoaSArIDEpKSxcclxuICAgICAgICBpY29uOiBzZWN0aW9uLmljb24sXHJcbiAgICAgICAgZXhwYW5kZWQ6IHRydWUsXHJcbiAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVwZWF0YWJsZUFjY29yZGlvbk1hcC5zZXQoc2VjdGlvbi5pZCwgaXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVEZXBlbmRlbnRPcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGaWVsZHMpIHtcclxuICAgICAgLy8gRHluYW1pYyBvcHRpb25zXHJcbiAgICAgIGlmIChmaWVsZC5keW5hbWljT3B0aW9ucykge1xyXG4gICAgICAgIGlmIChmaWVsZC5keW5hbWljT3B0aW9ucy50eXBlID09PSAneWVhci1yYW5nZScpIHtcclxuICAgICAgICAgIGNvbnN0IG1pbiA9IGZpZWxkLmR5bmFtaWNPcHRpb25zLm1pblllYXIgfHwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpIC0gMTA7XHJcbiAgICAgICAgICBjb25zdCBtYXggPSBmaWVsZC5keW5hbWljT3B0aW9ucy5tYXhZZWFyIHx8IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgIGNvbnN0IG9wdHM6IFVpRmllbGRPcHRpb25bXSA9IFtdO1xyXG4gICAgICAgICAgZm9yIChsZXQgeSA9IG1heDsgeSA+PSBtaW47IHktLSkge1xyXG4gICAgICAgICAgICBvcHRzLnB1c2goeyB2YWx1ZTogeSwgbGFiZWw6IFN0cmluZyh5KSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gPSBvcHRzO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZHluYW1pY09wdGlvbnMuZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gZmllbGQuZHluYW1pY09wdGlvbnMuZ2VuZXJhdG9yKGZvcm1EYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIERlcGVuZGVudCBvcHRpb25zXHJcbiAgICAgIGlmIChmaWVsZC5kZXBlbmRlbnRPcHRpb25zICYmIGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgY29uc3QgZGVwID0gZmllbGQuZGVwZW5kZW50T3B0aW9ucztcclxuICAgICAgICBjb25zdCBkZXBWYWx1ZSA9IGZvcm1EYXRhW2RlcC5kZXBlbmRzT25dO1xyXG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSBmaWVsZC5vcHRpb25zIGFzIFVpRmllbGRPcHRpb25bXTtcclxuXHJcbiAgICAgICAgaWYgKGRlcFZhbHVlID09IG51bGwgfHwgZGVwVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gWy4uLmFsbE9wdGlvbnNdO1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRlcC5maWx0ZXJUeXBlID09PSAnY3VzdG9tJyAmJiBkZXAuZmlsdGVyRm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlcC5maWx0ZXJGbihvcHQsIGRlcFZhbHVlLCBmb3JtRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBvcHRWYWwgPSBOdW1iZXIob3B0LnZhbHVlKTtcclxuICAgICAgICAgIGNvbnN0IGRlcFZhbCA9IE51bWJlcihkZXBWYWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaXNOYU4ob3B0VmFsKSB8fCBpc05hTihkZXBWYWwpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKGRlcC5maWx0ZXJUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyZWF0ZXJfdGhhbic6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA+IGRlcFZhbDtcclxuICAgICAgICAgICAgY2FzZSAnZ3JlYXRlcl9lcXVhbCc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA+PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xlc3NfdGhhbic6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA8IGRlcFZhbDtcclxuICAgICAgICAgICAgY2FzZSAnbGVzc19lcXVhbCc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA8PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGNhc2UgJ2VxdWFscyc6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9wdFZhbCA9PT0gZGVwVmFsO1xyXG4gICAgICAgICAgICBjYXNlICdub3RfZXF1YWxzJzpcclxuICAgICAgICAgICAgICByZXR1cm4gb3B0VmFsICE9PSBkZXBWYWw7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBBUEkgcHViYmxpY2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1biBjYW1wbyBlIHZpc2liaWxlIChvcHppb25hbG1lbnRlIG5lbCBjb250ZXN0byBkaSB1biBGb3JtR3JvdXAgc3BlY2lmaWNvKS4gKi9cclxuICBpc0ZpZWxkVmlzaWJsZShmaWVsZEtleTogc3RyaW5nLCBmZz86IEZvcm1Hcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKChmKSA9PiBmLmtleSA9PT0gZmllbGRLZXkpO1xyXG4gICAgaWYgKCFmaWVsZD8uY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHRhcmdldCA9IGZnIHx8IHRoaXMuZm9ybUdyb3VwO1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoZmllbGQuY29uZGl0aW9ucywgdGFyZ2V0LmdldFJhd1ZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFZlcmlmaWNhIHNlIHVuIGNhbXBvIGUgb2JibGlnYXRvcmlvIChpbmNsdWRlIHZhbGlkYXppb25lIGNvbmRpemlvbmFsZSkuICovXHJcbiAgaXNGaWVsZFJlcXVpcmVkKGZpZWxkS2V5OiBzdHJpbmcsIGZnPzogRm9ybUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoKGYpID0+IGYua2V5ID09PSBmaWVsZEtleSk7XHJcbiAgICBpZiAoZmllbGQ/LnJlcXVpcmVkKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBydWxlcyA9IGZpZWxkPy52YWxpZGF0aW9uIHx8IFtdO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRhcmdldC5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgcmV0dXJuIHJ1bGVzLnNvbWUoKHIpID0+IHtcclxuICAgICAgaWYgKHIudHlwZSAhPT0gJ3JlcXVpcmVkJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBpZiAoIXIuY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoci5jb25kaXRpb25zLCBmb3JtRGF0YSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1bmEgc2V6aW9uZSBlIHZpc2liaWxlLiAqL1xyXG4gIGlzU2VjdGlvblZpc2libGUoc2VjdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uPy5jb25kaXRpb25zPy5sZW5ndGgpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZGl0aW9uU2VydmljZS5ldmFsdWF0ZUNvbmRpdGlvbnMoc2VjdGlvbi5jb25kaXRpb25zLCB0aGlzLmZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKiBEZXNjcmlwdG9ycyBhY2NvcmRpb24gcGVyIHVuYSBzZXppb25lIGNvbGxhcHNpYmlsZS4gKi9cclxuICBnZXRTZWN0aW9uQWNjb3JkaW9uSXRlbXMoc2VjdGlvbklkOiBzdHJpbmcpOiBVaUFjY29yZGlvbkRlc2NyaXB0b3JbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9uQWNjb3JkaW9uTWFwLmdldChzZWN0aW9uSWQpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlc2NyaXB0b3JzIGFjY29yZGlvbiBwZXIgbGUgaXN0YW56ZSBkaSB1bmEgc2V6aW9uZSByZXBlYXRhYmxlLiAqL1xyXG4gIGdldFJlcGVhdGFibGVBY2NvcmRpb25JdGVtcyhzZWN0aW9uSWQ6IHN0cmluZyk6IFVpQWNjb3JkaW9uRGVzY3JpcHRvcltdIHtcclxuICAgIHJldHVybiB0aGlzLnJlcGVhdGFibGVBY2NvcmRpb25NYXAuZ2V0KHNlY3Rpb25JZCkgfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogVmVyaWZpY2Egc2UgbW9zdHJhcmUgZXJyb3JpIHBlciB1biBjYW1wby4gKi9cclxuICBzaG91bGRTaG93RmllbGRFcnJvcnMoZmllbGRLZXk6IHN0cmluZywgZmc/OiBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGZnIHx8IHRoaXMuZm9ybUdyb3VwO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRhcmdldC5nZXQoZmllbGRLZXkpO1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRFcnJvclNlcnZpY2Uuc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGNvbnRyb2wsIHtcclxuICAgICAgdHJlYXRBc1ByZXZhbG9yaXplZDogdGhpcy5wcmV2YWxvcml6ZWRGaWVsZHMuaGFzKGZpZWxkS2V5KSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVycm9yaSBkaSB1biBjYW1wbyBjb21lIGFycmF5IGRpIG1lc3NhZ2dpLiAqL1xyXG4gIGdldEZpZWxkRXJyb3JzKGZpZWxkS2V5OiBzdHJpbmcsIGZnPzogRm9ybUdyb3VwKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGFyZ2V0LmdldChmaWVsZEtleSk7XHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuYWxsRmllbGRzLmZpbmQoKGYpID0+IGYua2V5ID09PSBmaWVsZEtleSk7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZEVycm9yU2VydmljZS5nZXRGaWVsZEVycm9ycyhjb250cm9sLCBmaWVsZD8udmFsaWRhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKiogVmFsb3JlIGNvbXBsZXRvIGRlbCBmb3JtIChpbmNsdWRlIGNhbXBpIGRpc2FiaWxpdGF0aSkuICovXHJcbiAgZ2V0Rm9ybVZhbHVlKCk6IFVpRm9ybURhdGEge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogSWwgZm9ybSBlIHZhbGlkby4gKi9cclxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWxpZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgc2UgdHV0dGkgaSBjb250cm9sbGkgc29ubyB2YWxpZGksIGlnbm9yYW5kbyBsZSBjaGlhdmkgaW5kaWNhdGVcclxuICAgKiAoZmxhdCBlIGRlbnRybyBvZ25pIGlzdGFuemEgcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgaXNGb3JtVmFsaWRFeGNsdWRpbmdGaWVsZEtleXMoZXhjbHVkZWRLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0Zvcm1Hcm91cFZhbGlkRXhjbHVkaW5nKHRoaXMuZm9ybUdyb3VwLCBleGNsdWRlZEtleXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlzb2x2ZSBsYSBjaGlhdmUgcGVyIGBjdXN0b21GaWVsZFRlbXBsYXRlc2AgKGB0ZW1wbGF0ZUtleWAg4oaSIGBjb21wb25lbnRgIOKGkiBgZmllbGQua2V5YCkuXHJcbiAgICovXHJcbiAgcmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2MgPSBmaWVsZC5jdXN0b21Db25maWc7XHJcbiAgICByZXR1cm4gY2M/LnRlbXBsYXRlS2V5ID8/IGNjPy5jb21wb25lbnQgPz8gZmllbGQua2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGVtcGxhdGUgQW5ndWxhciByZWdpc3RyYXRvIHBlciBpbCBjYW1wbyBjdXN0b20sIG8gZmFsbGJhY2sgZ2xvYmFsZS5cclxuICAgKi9cclxuICBnZXRDdXN0b21UZW1wbGF0ZVJlZihmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMucmVzb2x2ZUN1c3RvbVRlbXBsYXRlS2V5KGZpZWxkKTtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbUZpZWxkVGVtcGxhdGVzW2tleV0gPz8gdGhpcy5jdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2sgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRlc3RvIHBhc3NhdG8gYSBgbmdUZW1wbGF0ZU91dGxldGAgcGVyIGlsIGNhbXBvIGN1c3RvbSAoQ1ZBIHN1bCBgY29udHJvbGApLlxyXG4gICAqL1xyXG4gIGdldEN1c3RvbUZpZWxkT3V0bGV0Q29udGV4dChcclxuICAgIGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IsXHJcbiAgICBmZzogRm9ybUdyb3VwLFxyXG4gICAgbmVzdGVkRXJyb3JLZXlQcmVmaXg/OiBzdHJpbmcsXHJcbiAgKTogVWlDdXN0b21GaWVsZFRlbXBsYXRlQ29udGV4dCB7XHJcbiAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGZpZWxkLmtleSkgYXMgRm9ybUNvbnRyb2w7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAkaW1wbGljaXQ6IGZpZWxkLFxyXG4gICAgICBmaWVsZCxcclxuICAgICAgZm9ybUdyb3VwOiBmZyxcclxuICAgICAgY29udHJvbCxcclxuICAgICAgY29uZmlnOiBmaWVsZC5jdXN0b21Db25maWc/LmNvbmZpZyA/PyB7fSxcclxuICAgICAgbmVzdGVkRXJyb3JLZXlQcmVmaXgsXHJcbiAgICAgIGVtaXRDdXN0b21FdmVudDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21FdmVudC5lbWl0KHsgZmllbGQ6IGZpZWxkLmtleSwgZXZlbnQsIGRhdGEgfSk7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGVtcGxhdGUgZSBjb250ZXN0byBpbiB1biBzb2xvIG9nZ2V0dG8gKGV2aXRhIGRvcHBpZSB2YWx1dGF6aW9uaSBuZWwgdGVtcGxhdGUpLlxyXG4gICAqL1xyXG4gIGdldEN1c3RvbUZpZWxkT3V0bGV0KFxyXG4gICAgZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvcixcclxuICAgIGZnOiBGb3JtR3JvdXAsXHJcbiAgICBuZXN0ZWRFcnJvcktleVByZWZpeD86IHN0cmluZyxcclxuICApOiB7IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjsgY29udGV4dDogVWlDdXN0b21GaWVsZFRlbXBsYXRlQ29udGV4dCB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZ2V0Q3VzdG9tVGVtcGxhdGVSZWYoZmllbGQpO1xyXG4gICAgaWYgKCF0ZW1wbGF0ZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4geyB0ZW1wbGF0ZSwgY29udGV4dDogdGhpcy5nZXRDdXN0b21GaWVsZE91dGxldENvbnRleHQoZmllbGQsIGZnLCBuZXN0ZWRFcnJvcktleVByZWZpeCkgfTtcclxuICB9XHJcblxyXG4gIC8qKiBQcmVmaXNzbyBjaGlhdmkgZXJyb3JlIHBlciBjYW1waSBjdXN0b20gYW5uaWRhdGkgKGZsYXQgbyByZXBlYXRhYmxlKS4gKi9cclxuICBidWlsZE5lc3RlZEVycm9yS2V5UHJlZml4KGZpZWxkS2V5OiBzdHJpbmcsIGluc3RhbmNlS2V5UHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2UgPSBpbnN0YW5jZUtleVByZWZpeCA/IGAke2luc3RhbmNlS2V5UHJlZml4fSR7ZmllbGRLZXl9YCA6IGZpZWxkS2V5O1xyXG4gICAgcmV0dXJuIGAke2Jhc2V9X19gO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIGVycm9yaSBuZXN0ZWQgZGEgQ1ZBIGN1c3RvbSBuZWwgZGV0dGFnbGlvIGVycm9yLXN1bW1hcnkuICovXHJcbiAgcHJpdmF0ZSBhcHBlbmRDdXN0b21OZXN0ZWRGaWVsZEVycm9ycyhcclxuICAgIGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10sXHJcbiAgICBmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLFxyXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxyXG4gICAgbGFiZWxQcmVmaXg6IHN0cmluZyxcclxuICAgIG5lc3RlZEVycm9yS2V5UHJlZml4OiBzdHJpbmcsXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2N1c3RvbScpIHJldHVybjtcclxuICAgIGNvbnN0IG5lc3RlZCA9IGNvbnRyb2wuZXJyb3JzPy5bVUlfRk9STV9ORVNURURfRklFTERfRVJST1JTX0tFWV07XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmVzdGVkKSB8fCBuZXN0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIG5lc3RlZCBhcyBVaUZvcm1FcnJvckRldGFpbFtdKSB7XHJcbiAgICAgIGlmICghaXRlbT8uZXJyb3JzPy5sZW5ndGgpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCByZWxhdGl2ZUtleSA9IGl0ZW0uZmllbGRLZXkgPz8gJyc7XHJcbiAgICAgIGRldGFpbHMucHVzaCh7XHJcbiAgICAgICAgZmllbGRLZXk6IHJlbGF0aXZlS2V5ID8gYCR7bmVzdGVkRXJyb3JLZXlQcmVmaXh9JHtyZWxhdGl2ZUtleX1gIDogbmVzdGVkRXJyb3JLZXlQcmVmaXguc2xpY2UoMCwgLTIpLFxyXG4gICAgICAgIGZpZWxkTGFiZWw6IGAke2xhYmVsUHJlZml4fSA+ICR7aXRlbS5maWVsZExhYmVsfWAsXHJcbiAgICAgICAgZXJyb3JzOiBpdGVtLmVycm9ycyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRm9ybUdyb3VwVmFsaWRFeGNsdWRpbmcoZ3JvdXA6IEZvcm1Hcm91cCwgZXhjbHVkZWRLZXlzOiBSZWFkb25seVNldDxzdHJpbmc+KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhncm91cC5jb250cm9scykpIHtcclxuICAgICAgY29uc3QgYyA9IGdyb3VwLmdldChrZXkpO1xyXG4gICAgICBpZiAoIWMpIGNvbnRpbnVlO1xyXG4gICAgICBpZiAoYyBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0gYy5hdChpKTtcclxuICAgICAgICAgIGlmIChyb3cgaW5zdGFuY2VvZiBGb3JtR3JvdXAgJiYgIXRoaXMuaXNGb3JtR3JvdXBWYWxpZEV4Y2x1ZGluZyhyb3csIGV4Y2x1ZGVkS2V5cykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRm9ybUdyb3VwVmFsaWRFeGNsdWRpbmcoYywgZXhjbHVkZWRLZXlzKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xyXG4gICAgICAgIGlmIChleGNsdWRlZEtleXMuaGFzKGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmIChjLmludmFsaWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogU3RhdG8gZGkgdmFsaWRhemlvbmUgY29tcGxldG8uICovXHJcbiAgZ2V0VmFsaWRhdGlvblN0YXRlKCk6IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSB7XHJcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG4gICAgY29uc3QgZGlydHk6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCB0b3VjaGVkOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KTtcclxuICAgICAgaWYgKCFjb250cm9sKSBjb250aW51ZTtcclxuICAgICAgaWYgKGNvbnRyb2wuZGlydHkpIGRpcnR5LnB1c2goZmllbGQua2V5KTtcclxuICAgICAgaWYgKGNvbnRyb2wudG91Y2hlZCkgdG91Y2hlZC5wdXNoKGZpZWxkLmtleSk7XHJcbiAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0gdGhpcy5nZXRGaWVsZEVycm9ycyhmaWVsZC5rZXkpO1xyXG4gICAgICBpZiAoZmllbGRFcnJvcnMubGVuZ3RoKSBlcnJvcnNbZmllbGQua2V5XSA9IGZpZWxkRXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluY2x1ZGkgZXJyb3JpIGRlbGxlIGlzdGFuemUgcmVwZWF0YWJsZVxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgICBpZiAoIWFycikgY29udGludWU7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VGZyA9IGFyci5hdChpKSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWN0aW9uLmZpZWxkcykge1xyXG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGluc3RhbmNlRmcuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgY29uc3QgcHJlZml4ZWRLZXkgPSBgJHtzZWN0aW9uLmlkfVske2l9XS4ke2ZpZWxkLmtleX1gO1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wuZGlydHkpIGRpcnR5LnB1c2gocHJlZml4ZWRLZXkpO1xyXG4gICAgICAgICAgaWYgKGNvbnRyb2wudG91Y2hlZCkgdG91Y2hlZC5wdXNoKHByZWZpeGVkS2V5KTtcclxuICAgICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0gdGhpcy5nZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGluc3RhbmNlRmcpO1xyXG4gICAgICAgICAgaWYgKGZpZWxkRXJyb3JzLmxlbmd0aCkgZXJyb3JzW3ByZWZpeGVkS2V5XSA9IGZpZWxkRXJyb3JzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHZhbGlkOiB0aGlzLmZvcm1Hcm91cC52YWxpZCwgZXJyb3JzLCBkaXJ0eSwgdG91Y2hlZCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIEVycm9yaSBkZXR0YWdsaWF0aSBwZXIgbCdlcnJvciBzdW1tYXJ5LiAqL1xyXG4gIGdldERldGFpbGVkRm9ybUVycm9ycygpOiBVaUZvcm1FcnJvckRldGFpbFtdIHtcclxuICAgIGNvbnN0IGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10gPSBbXTtcclxuXHJcbiAgICAvLyBDYW1waSBwaWF0dGlcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmxhZycgfHwgZmllbGQudHlwZSA9PT0gJ2RpdmlkZXInKSBjb250aW51ZTtcclxuICAgICAgaWYgKCF0aGlzLmlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSkpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk7XHJcbiAgICAgIGlmICghY29udHJvbD8uZXJyb3JzKSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IG5lc3RlZFByZWZpeCA9IHRoaXMuYnVpbGROZXN0ZWRFcnJvcktleVByZWZpeChmaWVsZC5rZXkpO1xyXG4gICAgICB0aGlzLmFwcGVuZEN1c3RvbU5lc3RlZEZpZWxkRXJyb3JzKGRldGFpbHMsIGZpZWxkLCBjb250cm9sLCBmaWVsZC5sYWJlbCwgbmVzdGVkUHJlZml4KTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnY3VzdG9tJyAmJiBjb250cm9sLmVycm9yc1tVSV9GT1JNX05FU1RFRF9GSUVMRF9FUlJPUlNfS0VZXSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSk7XHJcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgZGV0YWlscy5wdXNoKHsgZmllbGRLZXk6IGZpZWxkLmtleSwgZmllbGRMYWJlbDogZmllbGQubGFiZWwsIGVycm9ycyB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbXBpIG5lbGxlIGlzdGFuemUgcmVwZWF0YWJsZVxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMucmVwZWF0YWJsZVNlY3Rpb25zKSB7XHJcbiAgICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb24uaWQpO1xyXG4gICAgICBpZiAoIWFycikgY29udGludWU7XHJcbiAgICAgIGNvbnN0IHRpdGxlVGVtcGxhdGUgPSBzZWN0aW9uLnJlcGVhdGFibGUhLmluc3RhbmNlVGl0bGUgfHwgKHNlY3Rpb24udGl0bGUgPyBgJHtzZWN0aW9uLnRpdGxlfSB7aW5kZXh9YCA6ICdFbGVtZW50byB7aW5kZXh9Jyk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VGZyA9IGFyci5hdChpKSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2VMYWJlbCA9IHRpdGxlVGVtcGxhdGUucmVwbGFjZSgne2luZGV4fScsIFN0cmluZyhpICsgMSkpO1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlS2V5UHJlZml4ID0gYCR7c2VjdGlvbi5pZH1bJHtpfV0uYDtcclxuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzKSB7XHJcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2ZsYWcnIHx8IGZpZWxkLnR5cGUgPT09ICdkaXZpZGVyJykgY29udGludWU7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXNGaWVsZFZpc2libGUoZmllbGQua2V5LCBpbnN0YW5jZUZnKSkgY29udGludWU7XHJcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gaW5zdGFuY2VGZy5nZXQoZmllbGQua2V5KTtcclxuICAgICAgICAgIGlmICghY29udHJvbD8uZXJyb3JzKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCBuZXN0ZWRQcmVmaXggPSB0aGlzLmJ1aWxkTmVzdGVkRXJyb3JLZXlQcmVmaXgoZmllbGQua2V5LCBpbnN0YW5jZUtleVByZWZpeCk7XHJcbiAgICAgICAgICB0aGlzLmFwcGVuZEN1c3RvbU5lc3RlZEZpZWxkRXJyb3JzKFxyXG4gICAgICAgICAgICBkZXRhaWxzLFxyXG4gICAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgICAgY29udHJvbCxcclxuICAgICAgICAgICAgYCR7aW5zdGFuY2VMYWJlbH0gPiAke2ZpZWxkLmxhYmVsfWAsXHJcbiAgICAgICAgICAgIG5lc3RlZFByZWZpeCxcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdjdXN0b20nICYmIGNvbnRyb2wuZXJyb3JzW1VJX0ZPUk1fTkVTVEVEX0ZJRUxEX0VSUk9SU19LRVldKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBpbnN0YW5jZUZnKTtcclxuICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgZmllbGRLZXk6IGAke3NlY3Rpb24uaWR9WyR7aX1dLiR7ZmllbGQua2V5fWAsXHJcbiAgICAgICAgICAgICAgZmllbGRMYWJlbDogYCR7aW5zdGFuY2VMYWJlbH0gPiAke2ZpZWxkLmxhYmVsfWAsXHJcbiAgICAgICAgICAgICAgZXJyb3JzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGV0YWlscztcclxuICB9XHJcblxyXG4gIC8qKiBDb250YSBlcnJvcmkgdG90YWxpLiAqL1xyXG4gIGdldEZvcm1FcnJvcnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkucmVkdWNlKChzdW0sIGQpID0+IHN1bSArIGQuZXJyb3JzLmxlbmd0aCwgMCk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29udHJvbGxhIHNlIGNpIHNvbm8gZXJyb3JpLiAqL1xyXG4gIGhhc0Zvcm1FcnJvcnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtRXJyb3JzQ291bnQoKSA+IDA7XHJcbiAgfVxyXG5cclxuICAvKiogQ29udHJvbGxvIHBlciB1biBjYW1wby4gKi9cclxuICBnZXRGaWVsZENvbnRyb2woa2V5OiBzdHJpbmcpOiBGb3JtQ29udHJvbCB8IG51bGwge1xyXG4gICAgcmV0dXJuICh0aGlzLmZvcm1Hcm91cC5nZXQoa2V5KSBhcyBGb3JtQ29udHJvbCkgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpb3JuYSBpbCB2YWxvcmUgZGkgdW4gY2FtcG8gcHJvZ3JhbW1hdGljYW1lbnRlLiAqL1xyXG4gIHVwZGF0ZUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoa2V5KTtcclxuICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRm9yemEgbGEgdmFsaWRhemlvbmUgZGkgdHV0dGkgaSBjYW1waSAoaW5jbHVzZSBpc3RhbnplIHJlcGVhdGFibGUpLiAqL1xyXG4gIHZhbGlkYXRlQWxsRmllbGRzKCk6IHZvaWQge1xyXG4gICAgLy8gQ2FtcGkgcGlhdHRpXHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoa2V5KTtcclxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2wubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IGZnID0gY29udHJvbC5hdChpKSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhmZy5jb250cm9scykuZm9yRWFjaCgoZmspID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYyA9IGZnLmdldChmayk7XHJcbiAgICAgICAgICAgIGM/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgYz8ubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgICAgYz8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICBjb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIGNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBBUEkgUmVwZWF0YWJsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFJlc3RpdHVpc2NlIGlsIEZvcm1BcnJheSBkaSB1bmEgc2V6aW9uZSByZXBlYXRhYmxlLiAqL1xyXG4gIGdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQ6IHN0cmluZyk6IEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5nZXQoc2VjdGlvbklkKTtcclxuICAgIHJldHVybiBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5ID8gY29udHJvbCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzdGl0dWlzY2UgaWwgRm9ybUdyb3VwIGRpIHVuYSBzcGVjaWZpY2EgaXN0YW56YSByZXBlYXRhYmxlLiAqL1xyXG4gIGdldEluc3RhbmNlRm9ybUdyb3VwKHNlY3Rpb25JZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwIHwgbnVsbCB7XHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQpO1xyXG4gICAgcmV0dXJuIGFycj8uYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFZlcmlmaWNhIHNlIGUgcG9zc2liaWxlIGFnZ2l1bmdlcmUgbnVvdmUgaXN0YW56ZS4gKi9cclxuICBjYW5BZGRJbnN0YW5jZShzZWN0aW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIXNlY3Rpb24/LnJlcGVhdGFibGUpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIWFycikgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHNlY3Rpb24ucmVwZWF0YWJsZS5tYXggPT0gbnVsbCB8fCBhcnIubGVuZ3RoIDwgc2VjdGlvbi5yZXBlYXRhYmxlLm1heDtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSBlIHBvc3NpYmlsZSByaW11b3ZlcmUgaXN0YW56ZS4gKi9cclxuICBjYW5SZW1vdmVJbnN0YW5jZShzZWN0aW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIXNlY3Rpb24/LnJlcGVhdGFibGUpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIWFycikgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIGFyci5sZW5ndGggPiAoc2VjdGlvbi5yZXBlYXRhYmxlLm1pbiA/PyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpdW5nZSB1bmEgbnVvdmEgaXN0YW56YSB2dW90YSBhIHVuYSBzZXppb25lIHJlcGVhdGFibGUuICovXHJcbiAgYWRkUmVwZWF0YWJsZUluc3RhbmNlKHNlY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuQWRkSW5zdGFuY2Uoc2VjdGlvbklkKSkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIXNlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uSWQpITtcclxuICAgIGFyci5wdXNoKHRoaXMuYnVpbGRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uKSk7XHJcbiAgICB0aGlzLnJlYnVpbGRSZXBlYXRhYmxlQWNjb3JkaW9uKHNlY3Rpb24pO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmltdW92ZSB1bidpc3RhbnphIGRhIHVuYSBzZXppb25lIHJlcGVhdGFibGUuICovXHJcbiAgcmVtb3ZlUmVwZWF0YWJsZUluc3RhbmNlKHNlY3Rpb25JZDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlSW5zdGFuY2Uoc2VjdGlvbklkKSkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCk7XHJcbiAgICBpZiAoIXNlY3Rpb24/LnJlcGVhdGFibGUpIHJldHVybjtcclxuXHJcbiAgICBpZiAoc2VjdGlvbi5yZXBlYXRhYmxlLmNvbmZpcm1SZW1vdmUpIHtcclxuICAgICAgY29uc3QgbXNnID0gc2VjdGlvbi5yZXBlYXRhYmxlLmNvbmZpcm1NZXNzYWdlID8/ICdTZWkgc2ljdXJvIGRpIHZvbGVyIHJpbXVvdmVyZSBxdWVzdGEgc2V6aW9uZT8nO1xyXG4gICAgICBpZiAoIWNvbmZpcm0obXNnKSkgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFyciA9IHRoaXMuZ2V0UmVwZWF0YWJsZUFycmF5KHNlY3Rpb25JZCkhO1xyXG4gICAgYXJyLnJlbW92ZUF0KGluZGV4KTtcclxuICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKiBEdXBsaWNhIHVuJ2lzdGFuemEgZXNpc3RlbnRlIGNvbiBpIHN1b2kgdmFsb3JpLiAqL1xyXG4gIGR1cGxpY2F0ZVJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbkFkZEluc3RhbmNlKHNlY3Rpb25JZCkpIHJldHVybjtcclxuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnNjaGVtYS5zZWN0aW9ucy5maW5kKChzKSA9PiBzLmlkID09PSBzZWN0aW9uSWQpO1xyXG4gICAgaWYgKCFzZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYXJyID0gdGhpcy5nZXRSZXBlYXRhYmxlQXJyYXkoc2VjdGlvbklkKSE7XHJcbiAgICBjb25zdCBzb3VyY2VEYXRhID0gKGFyci5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgY29uc3QgbmV3R3JvdXAgPSB0aGlzLmJ1aWxkSW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbiwgc291cmNlRGF0YSk7XHJcbiAgICBhcnIuaW5zZXJ0KGluZGV4ICsgMSwgbmV3R3JvdXApO1xyXG4gICAgdGhpcy5yZWJ1aWxkUmVwZWF0YWJsZUFjY29yZGlvbihzZWN0aW9uKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRpdG9sbyBkaSB1bidpc3RhbnphIHJlcGVhdGFibGUuICovXHJcbiAgZ2V0SW5zdGFuY2VUaXRsZShzZWN0aW9uOiBVaUZvcm1TZWN0aW9uLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlID0gc2VjdGlvbi5yZXBlYXRhYmxlPy5pbnN0YW5jZVRpdGxlIHx8IChzZWN0aW9uLnRpdGxlID8gYCR7c2VjdGlvbi50aXRsZX0ge2luZGV4fWAgOiAnRWxlbWVudG8ge2luZGV4fScpO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoJ3tpbmRleH0nLCBTdHJpbmcoaW5kZXggKyAxKSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2Nyb2xsYSBhbCBjYW1wbyBlIGxvIGV2aWRlbnppYS4gKi9cclxuICBzY3JvbGxUb0ZpZWxkKGZpZWxkS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdG9ycyA9IFtgW2RhdGEtZmllbGQta2V5PVwiJHtmaWVsZEtleX1cIl1gLCBgW2Zvcm1Db250cm9sTmFtZT1cIiR7ZmllbGRLZXl9XCJdYF07XHJcbiAgICAgIGxldCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBzZWxlY3RvcnMpIHtcclxuICAgICAgICB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKTtcclxuICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCkgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0YXJnZXRFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgICAvLyBTZSB0cm92YXRvIGlsIGZvcm1Db250cm9sTmFtZSwgcmlzYWxpIGFsIHdyYXBwZXJcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQuaGFzQXR0cmlidXRlKCdmb3JtQ29udHJvbE5hbWUnKSkge1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0YXJnZXRFbGVtZW50LmNsb3Nlc3QoJy51aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLXdyYXBwZXIsIG1hdC1mb3JtLWZpZWxkJyk7XHJcbiAgICAgICAgaWYgKHdyYXBwZXIpIHRhcmdldEVsZW1lbnQgPSB3cmFwcGVyIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YXJnZXRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcblxyXG4gICAgICAvLyBBZ2dpdW5naSBjbGFzc2UgaGlnaGxpZ2h0IGUgcmltdW92aWxhIGRvcG8gbCdhbmltYXppb25lXHJcbiAgICAgIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndWktZm9ybS1maWVsZC0taGlnaGxpZ2h0Jyk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGFyZ2V0RWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZSgndWktZm9ybS1maWVsZC0taGlnaGxpZ2h0JyksIDIwMDApO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdWJtaXQgZGVsIGZvcm0uICovXHJcbiAgb25TdWJtaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbGlkYXRlQWxsRmllbGRzKCk7XHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xyXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMuZm9ybUdyb3VwLnZhbGlkO1xyXG4gICAgdGhpcy5sb2dnZXI/LmxvZ0Zvcm1BY3Rpb24oJ3N1Ym1pdCcsIHtcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCA/PyAndW5rbm93bicsXHJcbiAgICAgIHZhbGlkOiBpc1ZhbGlkLFxyXG4gICAgICBmaWVsZENvdW50OiBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLmxlbmd0aCxcclxuICAgIH0pO1xyXG4gICAgaWYgKGlzVmFsaWQpIHtcclxuICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoZm9ybVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBkZWwgZm9ybS4gKi9cclxuICBvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgLy8gUmVzZXR0YSBjYW1waSBwaWF0dGlcclxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5hbGxGbGF0RmllbGRzKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pbml0aWFsRGF0YT8uW2ZpZWxkLmtleV0gPz8gZmllbGQuZGVmYXVsdFZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KTtcclxuICAgICAgY29udHJvbD8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgY29udHJvbD8ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgY29udHJvbD8ubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXR0YSBzZXppb25pIHJlcGVhdGFibGVcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnJlcGVhdGFibGVTZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFJlcGVhdGFibGVBcnJheShzZWN0aW9uLmlkKTtcclxuICAgICAgaWYgKCFhcnIpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBpbml0aWFsQXJyYXkgPSB0aGlzLmluaXRpYWxEYXRhPy5bc2VjdGlvbi5pZF0gYXMgUmVjb3JkPHN0cmluZywgYW55PltdIHwgdW5kZWZpbmVkO1xyXG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuZ2V0UmVwZWF0YWJsZUluaXRpYWxJbnN0YW5jZUNvdW50KHNlY3Rpb24pO1xyXG5cclxuICAgICAgYXJyLmNsZWFyKCk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgIGFyci5wdXNoKHRoaXMuYnVpbGRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLCBpbml0aWFsQXJyYXk/LltpXSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVidWlsZFJlcGVhdGFibGVBY2NvcmRpb24oc2VjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtR3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5mb3JtUmVzZXQuZW1pdCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVGVtcGxhdGUgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIE9wemlvbmkgcGVyIHVuIGNhbXBvIChmaWx0cmFuZG8gcGVyIGF1dG9jb21wbGV0ZSBxdWVyeSkuICovXHJcbiAgZ2V0RmllbGRPcHRpb25zKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBVaUZpZWxkT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICAvKiogRmlsdHJhIG9wemlvbmkgcGVyIGF1dG9jb21wbGV0ZS4gKi9cclxuICBmaWx0ZXJPcHRpb25zKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IsIHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghcXVlcnkpIHtcclxuICAgICAgaWYgKGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbZmllbGQua2V5XSA9IFsuLi4oZmllbGQub3B0aW9ucyBhcyBVaUZpZWxkT3B0aW9uW10pXTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgaWYgKGZpZWxkLmFzeW5jT3B0aW9ucykge1xyXG4gICAgICBmaWVsZC5hc3luY09wdGlvbnMocXVlcnkpLnRoZW4oKG9wdHMpID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9uc1tmaWVsZC5rZXldID0gb3B0cztcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKGZpZWxkLm9wdGlvbnMgJiYgIXRoaXMuaXNPYnNlcnZhYmxlKGZpZWxkLm9wdGlvbnMpKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zW2ZpZWxkLmtleV0gPSAoZmllbGQub3B0aW9ucyBhcyBVaUZpZWxkT3B0aW9uW10pLmZpbHRlcigobykgPT5cclxuICAgICAgICBvLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogRGlzcGxheSBmbiBwZXIgYXV0b2NvbXBsZXRlLiAqL1xyXG4gIGRpc3BsYXlGbihvcHRpb25zOiBVaUZpZWxkT3B0aW9uW10pOiAodmFsdWU6IGFueSkgPT4gc3RyaW5nIHtcclxuICAgIHJldHVybiAodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvcHQgPSBvcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IHZhbHVlKTtcclxuICAgICAgcmV0dXJuIG9wdD8ubGFiZWwgfHwgJyc7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGV6aW9uYSB0dXR0ZSBsZSBvcHppb25pIHBlciBtdWx0aXNlbGVjdC4gKi9cclxuICBzZWxlY3RBbGwoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0RmllbGRPcHRpb25zKGZpZWxkKTtcclxuICAgIGNvbnN0IGFsbFZhbHVlcyA9IG9wdGlvbnMuZmlsdGVyKChvKSA9PiAhby5kaXNhYmxlZCkubWFwKChvKSA9PiBvLnZhbHVlKTtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShhbGxWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFnZ2l1bmdlIHVuIGNoaXAgYWwgZnJlZW11bHRpc2VsZWN0IChkYSB0b2tlbjogRW50ZXIgbyB2aXJnb2xhKS4gKi9cclxuICBhZGRGcmVlQ2hpcChmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLCBldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC52YWx1ZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShbLi4uY3VycmVudCwgdmFsdWVdKTtcclxuICAgIH1cclxuICAgIGV2ZW50LmNoaXBJbnB1dD8uY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZ2dpdW5nZSB1biBjaGlwIGFsIGZyZWVtdWx0aXNlbGVjdCBzdWxsJ2V2ZW50byBibHVyIGRlbGwnaW5wdXQuICovXHJcbiAgYWRkRnJlZUNoaXBPbkJsdXIoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChpbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShbLi4uY3VycmVudCwgdmFsdWVdKTtcclxuICAgIH1cclxuICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgfVxyXG5cclxuICAvKiogUmltdW92ZSB1biBjaGlwIGRhbCBmcmVlbXVsdGlzZWxlY3QuICovXHJcbiAgcmVtb3ZlRnJlZUNoaXAoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgY2hpcFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107XHJcbiAgICBjb25zdCBwcm90ZWN0ZWRfID0gZmllbGQubWV0YWRhdGE/LlsnY2FudERlbGV0ZUxpc3QnXSB8fCBbXTtcclxuICAgIGlmIChwcm90ZWN0ZWRfLmluY2x1ZGVzKGNoaXBWYWx1ZSkpIHJldHVybjtcclxuICAgIHRoaXMuZm9ybUdyb3VwLmdldChmaWVsZC5rZXkpPy5zZXRWYWx1ZShjdXJyZW50LmZpbHRlcigodjogc3RyaW5nKSA9PiB2ICE9PSBjaGlwVmFsdWUpKTtcclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSB1biBjaGlwIGUgcHJvdGV0dG8gZGFsbGEgY2FuY2VsbGF6aW9uZS4gKi9cclxuICBpc0NoaXBQcm90ZWN0ZWQoZmllbGQ6IFVpRm9ybUZpZWxkRGVzY3JpcHRvciwgY2hpcFZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoZmllbGQubWV0YWRhdGE/LlsnY2FudERlbGV0ZUxpc3QnXSB8fCBbXSkuaW5jbHVkZXMoY2hpcFZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBSaW11b3ZlIGNoaXAgZGEgbXVsdGlzZWxlY3QuICovXHJcbiAgcmVtb3ZlTXVsdGlzZWxlY3RDaGlwKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IsIGNoaXBWYWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk/LnZhbHVlIHx8IFtdO1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuZ2V0KGZpZWxkLmtleSk/LnNldFZhbHVlKGN1cnJlbnQuZmlsdGVyKCh2OiBhbnkpID0+IHYgIT09IGNoaXBWYWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRyb3ZhIGxhYmVsIGRpIHVuJ29wemlvbmUgZGFsIHZhbG9yZS4gKi9cclxuICBnZXRPcHRpb25MYWJlbChmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldEZpZWxkT3B0aW9ucyhmaWVsZCk7XHJcbiAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvKSA9PiBvLnZhbHVlID09PSB2YWx1ZSk/LmxhYmVsIHx8IFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGlwbyBkaSBpbnB1dCBuYXRpdm8gcGVyIGlsIGNhbXBvLiAqL1xyXG4gIGdldE5hdGl2ZUlucHV0VHlwZShmaWVsZDogVWlGb3JtRmllbGREZXNjcmlwdG9yKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xyXG4gICAgICBjYXNlICdwYXNzd29yZCc6XHJcbiAgICAgICAgcmV0dXJuICdwYXNzd29yZCc7XHJcbiAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICByZXR1cm4gJ2VtYWlsJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIGxlIGNsYXNzaSBDU1MgcGVyIGlsIHdyYXBwZXIgZGkgdW4gY2FtcG8sXHJcbiAgICogY29tYmluYW5kbyBldmVudHVhbGkgY3NzQ2xhc3NlcyBkYWxsbyBzY2hlbWEgY29uIGxlIGNsYXNzaVxyXG4gICAqIHJlc3BvbnNpdmUgcGVyIGlsIHNpc3RlbWEgYSBncmlnbGlhIGJhc2UtMTIuXHJcbiAgICpcclxuICAgKiBNb2JpbGUtZmlyc3Q6IHR1dHRpIGkgY2FtcGkgc29ubyBzcGFuLTEyIGRpIGRlZmF1bHQgKDEwMCUpLlxyXG4gICAqIExlIGNsYXNzaSBgdWktY29sLXticmVha3BvaW50fS17bn1gIGF0dGl2YW5vIGxhIGxhcmdoZXp6YVxyXG4gICAqIGNvbmZpZ3VyYXRhIHNvbG8gZGFsIGJyZWFrcG9pbnQgaW5kaWNhdG8gaW4gc3UuXHJcbiAgICpcclxuICAgKiBCcmVha3BvaW50IHN1cHBvcnRhdGk6IHNtICjiiaU1NzZweCksIG1kICjiiaU3NjhweCksIGxnICjiiaUxMDI0cHgpLCB4bCAo4omlMTI4MHB4KS5cclxuICAgKi9cclxuICBnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkOiBVaUZvcm1GaWVsZERlc2NyaXB0b3IpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBpZiAoZmllbGQuY3NzQ2xhc3Nlcz8ubGVuZ3RoKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaCguLi5maWVsZC5jc3NDbGFzc2VzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsYXlvdXQuY29sdW1ucyDihpIgY2xhc3NlIHBlciBpbCBicmVha3BvaW50IG1kIChkZWZhdWx0IGRlc2t0b3ApXHJcbiAgICBpZiAoZmllbGQubGF5b3V0Py5jb2x1bW5zKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaChgdWktY29sLW1kLSR7ZmllbGQubGF5b3V0LmNvbHVtbnN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbGF5b3V0LmJyZWFrcG9pbnRzIOKGkiBjbGFzc2kgcGVyIGJyZWFrcG9pbnQgc3BlY2lmaWNpXHJcbiAgICBpZiAoZmllbGQubGF5b3V0Py5icmVha3BvaW50cykge1xyXG4gICAgICBmb3IgKGNvbnN0IFticCwgY29sc10gb2YgT2JqZWN0LmVudHJpZXMoZmllbGQubGF5b3V0LmJyZWFrcG9pbnRzKSkge1xyXG4gICAgICAgIGNsYXNzZXMucHVzaChgdWktY29sLSR7YnB9LSR7Y29sc31gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGFyYWN0ZXIgY291bnQgcGVyIHRleHRhcmVhL3RleHQgY29uIG1heExlbmd0aC4gKi9cclxuICBnZXRDaGFyQ291bnQoZmllbGRLZXk6IHN0cmluZywgZmc/OiBGb3JtR3JvdXApOiB7IGN1cnJlbnQ6IG51bWJlcjsgbWF4OiBudW1iZXIgfSB8IG51bGwge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmFsbEZpZWxkcy5maW5kKChmKSA9PiBmLmtleSA9PT0gZmllbGRLZXkpO1xyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gdGhpcy5maWVsZEVycm9yU2VydmljZS5yZXNvbHZlTWF4TGVuZ3RoKGZpZWxkPy52YWxpZGF0aW9uKTtcclxuICAgIGlmIChtYXhMZW5ndGggPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZmcgfHwgdGhpcy5mb3JtR3JvdXA7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZEVycm9yU2VydmljZS5nZXRDaGFyQ291bnQodGFyZ2V0LmdldChmaWVsZEtleSksIG1heExlbmd0aCk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgVXRpbGl0YSBwcml2YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIGlzT2JzZXJ2YWJsZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVwZWF0YWJsZUFkZEJ1dHRvbnMoc2VjdGlvbjogVWlGb3JtU2VjdGlvbik6IFVpQnV0dG9uRGVzY3JpcHRvcltdIHtcclxuICAgIHJldHVybiBbe1xyXG4gICAgICBsYWJlbDogc2VjdGlvbi5yZXBlYXRhYmxlPy5hZGRMYWJlbCB8fCAnKyBBZ2dpdW5naScsXHJcbiAgICAgIGljb246IHNlY3Rpb24ucmVwZWF0YWJsZT8uYWRkSWNvbiB8fCAncGx1cycsXHJcbiAgICAgIHZhcmlhbnQ6ICdvdXRsaW5lJyxcclxuICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmFkZFJlcGVhdGFibGVJbnN0YW5jZShzZWN0aW9uLmlkKVxyXG4gICAgfV07XHJcbiAgfVxyXG59XHJcbiIsIjwhLS1cclxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICBVSSBGT1JNIEJVSUxERVIgLSBURU1QTEFURSBQUklOQ0lQQUxFXHJcbiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgQVJDSElURVRUVVJBOlxyXG4gIE9nbmkgPG5nLXRlbXBsYXRlPiBjaGUgY29udGllbmUgZGlyZXR0aXZlIFtmb3JtQ29udHJvbE5hbWVdXHJcbiAgREVWRSB3cmFwcGFyZSBpbCBwcm9wcmlvIGNvbnRlbnV0byBpbiB1biA8ZGl2IFtmb3JtR3JvdXBdPi5cclxuICBRdWVzdG8gcGVyY2hlIEFuZ3VsYXIgcmlzb2x2ZSBsJ2luamVjdG9yIGRpIGZvcm1Db250cm9sTmFtZVxyXG4gIGRhbCBDT05URVNUTyBESSBESUNISUFSQVpJT05FIGRlbCB0ZW1wbGF0ZSwgbm9uIGRhbCBwdW50b1xyXG4gIGRpIGluc2VyaW1lbnRvIChuZ1RlbXBsYXRlT3V0bGV0KS5cclxuXHJcbiAgSWwgRm9ybUdyb3VwIHZpZW5lIHBhc3NhdG8gdHJhbWl0ZSBjb250ZXh0IHBlciBzdXBwb3J0YXJlXHJcbiAgc2lhIGNhbXBpIHBpYXR0aSAocm9vdCBGb3JtR3JvdXApIGNoZSBjYW1waSBpbiBpc3RhbnplXHJcbiAgcmVwZWF0YWJsZSAoaW5zdGFuY2UgRm9ybUdyb3VwKS5cclxuXHJcbiAgU2VuemEgcXVlc3RvIHdyYXBwZXIsIGZvcm1Db250cm9sTmFtZSBub24gdHJvdmEgaWxcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUgZSBsYW5jaWEgTkcwMTA1MC5cclxuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuLS0+XHJcblxyXG5AaWYgKHNjaGVtYSAmJiBmb3JtR3JvdXApIHtcclxuPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlclwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgW2NsYXNzXT1cInNjaGVtYS5jb25maWc/LmNzc0NsYXNzZXM/LmpvaW4oJyAnKVwiPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09IEhFQURFUiA9PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICBAaWYgKHNjaGVtYS50aXRsZSB8fCBzY2hlbWEuZGVzY3JpcHRpb24pIHtcclxuICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19oZWFkZXJcIj5cclxuICAgIEBpZiAoc2NoZW1hLnRpdGxlKSB7XHJcbiAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3RpdGxlXCI+e3sgc2NoZW1hLnRpdGxlIH19PC9oMj5cclxuICAgIH1cclxuICAgIEBpZiAoc2NoZW1hLmRlc2NyaXB0aW9uKSB7XHJcbiAgICA8cCBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZGVzY3JpcHRpb25cIj57eyBzY2hlbWEuZGVzY3JpcHRpb24gfX08L3A+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG5cclxuICA8IS0tID09PT09PT09PT09PT09PT09PT09IFNFWklPTkkgPT09PT09PT09PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbnNcIj5cclxuICAgIEBmb3IgKHNlY3Rpb24gb2Ygc2NoZW1hLnNlY3Rpb25zOyB0cmFjayBzZWN0aW9uLmlkKSB7XHJcbiAgICBAaWYgKGlzU2VjdGlvblZpc2libGUoc2VjdGlvbi5pZCkpIHtcclxuXHJcbiAgICA8IS0tIOKUgOKUgOKUgCBTZXppb25lIFJFUEVBVEFCTEUg4pSA4pSA4pSAIC0tPlxyXG4gICAgQGlmIChzZWN0aW9uLnJlcGVhdGFibGUpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24gdWktZm9ybS1idWlsZGVyX19zZWN0aW9uLS1yZXBlYXRhYmxlXCIgW2NsYXNzXT1cInNlY3Rpb24uY3NzQ2xhc3Nlcz8uam9pbignICcpXCI+XHJcbiAgICAgIEBpZiAoc2VjdGlvbi50aXRsZSB8fCBzZWN0aW9uLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24taGVhZGVyXCI+XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnRpdGxlKSB7XHJcbiAgICAgICAgPGgzIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLXRpdGxlXCI+e3sgc2VjdGlvbi50aXRsZSB9fTwvaDM+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoc2VjdGlvbi5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWRlc2NyaXB0aW9uXCI+e3sgc2VjdGlvbi5kZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8dWktYWNjb3JkaW9uIFtpdGVtc109XCJnZXRSZXBlYXRhYmxlQWNjb3JkaW9uSXRlbXMoc2VjdGlvbi5pZClcIiBbaXRlbVRlbXBsYXRlXT1cInJlcGVhdGFibGVCb2R5VHBsXCJcclxuICAgICAgICBbYWN0aW9uc1RlbXBsYXRlXT1cInJlcGVhdGFibGVBY3Rpb25zVHBsXCIgbW9kZT1cIm11bHRpXCIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcGVhdGFibGUtYWNjb3JkaW9uXCI+XHJcbiAgICAgICAgPCEtLSBDb250ZW51dG8gZGkgb2duaSBpc3RhbnphIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVwZWF0YWJsZUJvZHlUcGwgbGV0LWl0ZW0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MudWktZm9ybS1idWlsZGVyX19ncmlkXT1cInNjaGVtYS5jb25maWc/LmxheW91dCA9PT0gJ2dyaWQnIHx8ICFzY2hlbWEuY29uZmlnPy5sYXlvdXRcIj5cclxuICAgICAgICAgICAgQGZvciAoZmllbGQgb2Ygc2VjdGlvbi5maWVsZHM7IHRyYWNrIGZpZWxkLmtleSkge1xyXG4gICAgICAgICAgICBAaWYgKGlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSwgZ2V0SW5zdGFuY2VGb3JtR3JvdXAoc2VjdGlvbi5pZCwgaXRlbS5pbmRleCkhKSAmJiBmaWVsZC50eXBlICE9PSAnZmxhZycpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtd3JhcHBlclwiIFtjbGFzc109XCJnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLm9yZGVyXT1cImZpZWxkLmxheW91dD8ub3JkZXIgfHwgbnVsbFwiIFthdHRyLmRhdGEtZmllbGQta2V5XT1cImZpZWxkLmtleVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgZm9ybUdyb3VwOiBnZXRJbnN0YW5jZUZvcm1Hcm91cChzZWN0aW9uLmlkLCBpdGVtLmluZGV4KSwgbmVzdGVkRXJyb3JLZXlQcmVmaXg6IGJ1aWxkTmVzdGVkRXJyb3JLZXlQcmVmaXgoZmllbGQua2V5LCBzZWN0aW9uLmlkICsgJ1snICsgaXRlbS5pbmRleCArICddLicpIH1cIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8IS0tIEF6aW9uaSBwZXIgb2duaSBpc3RhbnphIChkdXBsaWNhIC8gZWxpbWluYSkgLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNyZXBlYXRhYmxlQWN0aW9uc1RwbCBsZXQtaXRlbT5cclxuICAgICAgICAgIEBpZiAoY2FuQWRkSW5zdGFuY2Uoc2VjdGlvbi5pZCkpIHtcclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXBlYXRhYmxlLWFjdGlvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVSZXBlYXRhYmxlSW5zdGFuY2Uoc2VjdGlvbi5pZCwgaXRlbS5pbmRleClcIiBhcmlhLWxhYmVsPVwiRHVwbGljYVwiPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNvcHlcIiBbc2l6ZV09XCIxNVwiIC8+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIEBpZiAoY2FuUmVtb3ZlSW5zdGFuY2Uoc2VjdGlvbi5pZCkpIHtcclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXBlYXRhYmxlLWFjdGlvbiB1aS1mb3JtLWJ1aWxkZXJfX3JlcGVhdGFibGUtYWN0aW9uLS1kYW5nZXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUmVwZWF0YWJsZUluc3RhbmNlKHNlY3Rpb24uaWQsIGl0ZW0uaW5kZXgpXCIgYXJpYS1sYWJlbD1cIkVsaW1pbmFcIj5cclxuICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJ0cmFzaC0yXCIgW3NpemVdPVwiMTVcIiAvPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC91aS1hY2NvcmRpb24+XHJcblxyXG4gICAgICBAaWYgKGNhbkFkZEluc3RhbmNlKHNlY3Rpb24uaWQpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcGVhdGFibGUtYWRkXCI+XHJcbiAgICAgICAgPHVpLWJ1dHRvbi1hcmVhIFtidXR0b25zXT1cImdldFJlcGVhdGFibGVBZGRCdXR0b25zKHNlY3Rpb24pXCIgYWxpZ249XCJlbmRcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSDilIDilIDilIAgU2V6aW9uZSBDT0xMQVNTQUJJTEUg4pSA4pSA4pSAIC0tPlxyXG4gICAgfSBAZWxzZSBpZiAoc2VjdGlvbi5jb2xsYXBzaWJsZSkge1xyXG4gICAgPHVpLWFjY29yZGlvbiBbaXRlbXNdPVwiZ2V0U2VjdGlvbkFjY29yZGlvbkl0ZW1zKHNlY3Rpb24uaWQpXCIgW2l0ZW1UZW1wbGF0ZV09XCJjb2xsYXBzaWJsZVRwbFwiIG1vZGU9XCJtdWx0aVwiXHJcbiAgICAgIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uIHVpLWZvcm0tYnVpbGRlcl9fc2VjdGlvbi0tY29sbGFwc2libGVcIiBbY2xhc3NdPVwic2VjdGlvbi5jc3NDbGFzc2VzPy5qb2luKCcgJylcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNjb2xsYXBzaWJsZVRwbCBsZXQtaXRlbT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgW2NsYXNzLnVpLWZvcm0tYnVpbGRlcl9fZ3JpZF09XCJzY2hlbWEuY29uZmlnPy5sYXlvdXQgPT09ICdncmlkJyB8fCAhc2NoZW1hLmNvbmZpZz8ubGF5b3V0XCI+XHJcbiAgICAgICAgICBAZm9yIChmaWVsZCBvZiBzZWN0aW9uLmZpZWxkczsgdHJhY2sgZmllbGQua2V5KSB7XHJcbiAgICAgICAgICBAaWYgKGlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSkgJiYgZmllbGQudHlwZSAhPT0gJ2ZsYWcnKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC13cmFwcGVyXCIgW2NsYXNzXT1cImdldEZpZWxkV3JhcHBlckNsYXNzZXMoZmllbGQpXCJcclxuICAgICAgICAgICAgW3N0eWxlLm9yZGVyXT1cImZpZWxkLmxheW91dD8ub3JkZXIgfHwgbnVsbFwiIFthdHRyLmRhdGEtZmllbGQta2V5XT1cImZpZWxkLmtleVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIG5lc3RlZEVycm9yS2V5UHJlZml4OiBidWlsZE5lc3RlZEVycm9yS2V5UHJlZml4KGZpZWxkLmtleSkgfVwiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdWktYWNjb3JkaW9uPlxyXG5cclxuICAgIDwhLS0g4pSA4pSA4pSAIFNlemlvbmUgU1RBTkRBUkQg4pSA4pSA4pSAIC0tPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uXCIgW2NsYXNzXT1cInNlY3Rpb24uY3NzQ2xhc3Nlcz8uam9pbignICcpXCI+XHJcbiAgICAgIEBpZiAoc2VjdGlvbi50aXRsZSB8fCBzZWN0aW9uLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3NlY3Rpb24taGVhZGVyXCI+XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnRpdGxlKSB7XHJcbiAgICAgICAgPGgzIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLXRpdGxlXCI+e3sgc2VjdGlvbi50aXRsZSB9fTwvaDM+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoc2VjdGlvbi5kZXNjcmlwdGlvbikge1xyXG4gICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWRlc2NyaXB0aW9uXCI+e3sgc2VjdGlvbi5kZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19zZWN0aW9uLWNvbnRlbnRcIlxyXG4gICAgICAgIFtjbGFzcy51aS1mb3JtLWJ1aWxkZXJfX2dyaWRdPVwic2NoZW1hLmNvbmZpZz8ubGF5b3V0ID09PSAnZ3JpZCcgfHwgIXNjaGVtYS5jb25maWc/LmxheW91dFwiPlxyXG4gICAgICAgIEBmb3IgKGZpZWxkIG9mIHNlY3Rpb24uZmllbGRzOyB0cmFjayBmaWVsZC5rZXkpIHtcclxuICAgICAgICBAaWYgKGlzRmllbGRWaXNpYmxlKGZpZWxkLmtleSkgJiYgZmllbGQudHlwZSAhPT0gJ2ZsYWcnKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtd3JhcHBlclwiIFtjbGFzc109XCJnZXRGaWVsZFdyYXBwZXJDbGFzc2VzKGZpZWxkKVwiXHJcbiAgICAgICAgICBbc3R5bGUub3JkZXJdPVwiZmllbGQubGF5b3V0Py5vcmRlciB8fCBudWxsXCIgW2F0dHIuZGF0YS1maWVsZC1rZXldPVwiZmllbGQua2V5XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmllbGRUcGw7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBmaWVsZCwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIG5lc3RlZEVycm9yS2V5UHJlZml4OiBidWlsZE5lc3RlZEVycm9yS2V5UHJlZml4KGZpZWxkLmtleSkgfVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIH1cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBGT09URVIgPT09PT09PT09PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZm9vdGVyXCI+XHJcbiAgICBAaWYgKCFzY2hlbWEuY29uZmlnPy5oaWRlRXJyb3JTdW1tYXJ5KSB7XHJcbiAgICA8dWktZm9ybS1lcnJvci1zdW1tYXJ5IFtlcnJvcnNdPVwiZm9ybUVycm9yc1wiIFt0b3RhbEVycm9yQ291bnRdPVwiZ2V0Rm9ybUVycm9yc0NvdW50KClcIlxyXG4gICAgICBbdmFsaWRNZXNzYWdlXT1cInNjaGVtYS5jb25maWc/LmVycm9yU3VtbWFyeVZhbGlkTWVzc2FnZSA/PyAnSWwgZm9ybSDDqCBjb21waWxhdG8gY29ycmV0dGFtZW50ZSdcIlxyXG4gICAgICAoZmllbGRDbGljayk9XCJzY3JvbGxUb0ZpZWxkKCRldmVudClcIiAvPlxyXG4gICAgfVxyXG4gICAgQGlmICghc2NoZW1hLmNvbmZpZz8uaGlkZUZvb3Rlcikge1xyXG4gICAgPHVpLWJ1dHRvbi1hcmVhIFtidXR0b25zXT1cImZvcm1CdXR0b25zXCIgYWxpZ249XCJlbmRcIiBbbG9hZGluZ0lkc109XCJsb2FkaW5nRm9yXCIgLz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbn1cclxuXHJcbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxyXG48IS0tIEZJRUxEIFRFTVBMQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+XHJcbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxyXG48IS0tXHJcbiAgQ1JJVElDTzogUXVlc3RvIHRlbXBsYXRlIGUgZGljaGlhcmF0byBGVU9SSSBkYWwgPGRpdiBbZm9ybUdyb3VwXT4uXHJcbiAgQW5ndWxhciByaXNvbHZlIGwnaW5qZWN0b3IgZGFsIGNvbnRlc3RvIGRpIERJQ0hJQVJBWklPTkUuXHJcbiAgSWwgRm9ybUdyb3VwIHZpZW5lIHBhc3NhdG8gdmlhIGNvbnRleHQgKGZnKSBwZXIgc3VwcG9ydGFyZVxyXG4gIHNpYSBpbCByb290IEZvcm1Hcm91cCBjaGUgaSBGb3JtR3JvdXAgZGVsbGUgaXN0YW56ZSByZXBlYXRhYmxlLlxyXG4tLT5cclxuPG5nLXRlbXBsYXRlICNmaWVsZFRwbCBsZXQtZmllbGQgbGV0LWZnPVwiZm9ybUdyb3VwXCIgbGV0LW5lc3RlZEVycm9yS2V5UHJlZml4PVwibmVzdGVkRXJyb3JLZXlQcmVmaXhcIj5cclxuICBAaWYgKGZnKSB7XHJcbiAgPGRpdiBbZm9ybUdyb3VwXT1cImZnXCIgY2xhc3M9XCJ1aS1mYi1maWVsZC1jdHhcIj5cclxuICAgIEBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcclxuXHJcbiAgICA8IS0tIFRFWFQgLyBFTUFJTCAvIFBBU1NXT1JEIC0tPlxyXG4gICAgQGNhc2UgKCd0ZXh0Jykge1xyXG4gICAgICA8dWktZm9ybS10ZXh0LWZpZWxkXHJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICBbZm9ybUdyb3VwXT1cImZnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIFtlcnJvcnNdPVwiZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cImdldEZpZWxkT3B0aW9ucyhmaWVsZClcIlxyXG4gICAgICAgIChvcHRpb25zRmlsdGVyKT1cImZpbHRlck9wdGlvbnMoZmllbGQsICRldmVudClcIlxyXG4gICAgICAvPlxyXG4gICAgfVxyXG4gICAgQGNhc2UgKCdlbWFpbCcpIHtcclxuICAgICAgPHVpLWZvcm0tdGV4dC1maWVsZFxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmZ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICBbZXJyb3JzXT1cImdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuICAgIEBjYXNlICgncGFzc3dvcmQnKSB7XHJcbiAgICAgIDx1aS1mb3JtLXRleHQtZmllbGRcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZmdcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgW2Vycm9yc109XCJnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBOVU1CRVIgLS0+XHJcbiAgICBAY2FzZSAoJ251bWJlcicpIHtcclxuICAgICAgPHVpLWZvcm0tbnVtYmVyLWZpZWxkXHJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICBbZm9ybUdyb3VwXT1cImZnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIFtlcnJvcnNdPVwiZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAvPlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gVEVYVEFSRUEgLS0+XHJcbiAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xyXG4gICAgICA8dWktZm9ybS10ZXh0YXJlYS1maWVsZFxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmZ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICBbZXJyb3JzXT1cImdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpXCJcclxuICAgICAgLz5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIFNFTEVDVCAtLT5cclxuICAgIEBjYXNlICgnc2VsZWN0Jykge1xyXG4gICAgICA8dWktZm9ybS1zZWxlY3QtZmllbGRcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZmdcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgW2Vycm9yc109XCJnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgICAgW29wdGlvbnNdPVwiZ2V0RmllbGRPcHRpb25zKGZpZWxkKVwiXHJcbiAgICAgICAgKG9wdGlvbnNGaWx0ZXIpPVwiZmlsdGVyT3B0aW9ucyhmaWVsZCwgJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBNVUxUSVNFTEVDVCAtLT5cclxuICAgIEBjYXNlICgnbXVsdGlzZWxlY3QnKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZnVsbC13aWR0aFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7IGZpZWxkLmxhYmVsIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgbXVsdGlwbGUgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCI+XHJcbiAgICAgICAgQGlmIChmaWVsZC5hbGxvd1NlbGVjdEFsbCkge1xyXG4gICAgICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJzZWxlY3RBbGwoZmllbGQpXCIgKGtleWRvd24uZW50ZXIpPVwic2VsZWN0QWxsKGZpZWxkKVwiIChrZXlkb3duLnNwYWNlKT1cInNlbGVjdEFsbChmaWVsZClcIj5cclxuICAgICAgICAgIDxlbT5TZWxlemlvbmEgdHV0dG88L2VtPlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGZvciAob3B0IG9mIGdldEZpZWxkT3B0aW9ucyhmaWVsZCk7IHRyYWNrIG9wdC52YWx1ZSkge1xyXG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJvcHQudmFsdWVcIiBbZGlzYWJsZWRdPVwib3B0LmRpc2FibGVkXCI+XHJcbiAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDxtYXQtZXJyb3I+XHJcbiAgICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8ZGl2Pnt7IGVyciB9fTwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgQGlmIChmZy5nZXQoZmllbGQua2V5KT8udmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fY2hpcHMtcHJldmlld1wiPlxyXG4gICAgICBAZm9yICh2YWwgb2YgZmcuZ2V0KGZpZWxkLmtleSkhLnZhbHVlOyB0cmFjayB2YWwpIHtcclxuICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2NoaXBcIj5cclxuICAgICAgICB7eyBnZXRPcHRpb25MYWJlbChmaWVsZCwgdmFsKSB9fVxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZW1vdmVNdWx0aXNlbGVjdENoaXAoZmllbGQsIHZhbClcIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fY2hpcC1yZW1vdmVcIlxyXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIlJpbXVvdmlcIj5cclxuICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwieFwiIFtzaXplXT1cIjEyXCIgLz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIEZSRUVNVUxUSVNFTEVDVCAtLT5cclxuICAgIEBjYXNlICgnZnJlZW11bHRpc2VsZWN0Jykge1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2Z1bGwtd2lkdGggdWktZm9ybS1idWlsZGVyX19mcmVlLW11bHRpLWZpZWxkXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3sgZmllbGQubGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBHcmlkIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCI+XHJcbiAgICAgICAgQGZvciAoY2hpcCBvZiBmZy5nZXQoZmllbGQua2V5KT8udmFsdWUgfHwgW107IHRyYWNrIGNoaXApIHtcclxuICAgICAgICA8bWF0LWNoaXAtcm93IFtyZW1vdmFibGVdPVwiIWlzQ2hpcFByb3RlY3RlZChmaWVsZCwgY2hpcClcIiAocmVtb3ZlZCk9XCJyZW1vdmVGcmVlQ2hpcChmaWVsZCwgY2hpcClcIj5cclxuICAgICAgICAgIHt7IGNoaXAgfX1cclxuICAgICAgICAgIEBpZiAoIWlzQ2hpcFByb3RlY3RlZChmaWVsZCwgY2hpcCkpIHtcclxuICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSBhcmlhLWxhYmVsPVwiUmltdW92aVwiPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cInhcIiBbc2l6ZV09XCIxNFwiIC8+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1jaGlwLXJvdz5cclxuICAgICAgICB9XHJcbiAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJ0FnZ2l1bmdpLi4uJ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5IHx8IHJlYWRvbmx5XCIgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZEZyZWVDaGlwKGZpZWxkLCAkZXZlbnQpXCJcclxuICAgICAgICAoYmx1cik9XCJhZGRGcmVlQ2hpcE9uQmx1cihmaWVsZCwgJGV2ZW50KVwiIC8+XHJcbiAgICAgIDxtYXQtZXJyb3I+XHJcbiAgICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8ZGl2Pnt7IGVyciB9fTwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gQ0hFQ0tCT1ggLS0+XHJcbiAgICBAY2FzZSAoJ2NoZWNrYm94Jykge1xyXG4gICAgQGlmIChmaWVsZC5hcHBlYXJhbmNlPy5zdHlsZSA9PT0gJ3N3aXRjaCcpIHtcclxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgW2NvbG9yXT1cImZpZWxkLmFwcGVhcmFuY2U/LmNvbG9yIHx8ICdwcmltYXJ5J1wiPlxyXG4gICAgICB7eyBmaWVsZC5sYWJlbCB9fVxyXG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgW2NvbG9yXT1cImZpZWxkLmFwcGVhcmFuY2U/LmNvbG9yIHx8ICdwcmltYXJ5J1wiPlxyXG4gICAgICB7eyBmaWVsZC5sYWJlbCB9fVxyXG4gICAgICBAaWYgKGZpZWxkLmljb25Ub29sdGlwKSB7XHJcbiAgICAgIDxsdWNpZGUtaWNvbiBbbmFtZV09XCJmaWVsZC5pY29uVG9vbHRpcC5pY29uIHx8ICdpbmZvJ1wiIFtzaXplXT1cIjE0XCIgW21hdFRvb2x0aXBdPVwiZmllbGQuaWNvblRvb2x0aXAudGV4dFwiXHJcbiAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2lubGluZS10b29sdGlwXCIgLz5cclxuICAgICAgfVxyXG4gICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICB9XHJcbiAgICBAaWYgKHNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKSkge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtZXJyb3JcIj5cclxuICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgPHNwYW4+e3sgZXJyIH19PC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIFNXSVRDSCAtLT5cclxuICAgIEBjYXNlICgnc3dpdGNoJykge1xyXG4gICAgPG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29sb3JdPVwiZmllbGQuYXBwZWFyYW5jZT8uY29sb3IgfHwgJ3ByaW1hcnknXCI+XHJcbiAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgIEBpZiAoZmllbGQuaWNvblRvb2x0aXApIHtcclxuICAgICAgPGx1Y2lkZS1pY29uIFtuYW1lXT1cImZpZWxkLmljb25Ub29sdGlwLmljb24gfHwgJ2luZm8nXCIgW3NpemVdPVwiMTRcIiBbbWF0VG9vbHRpcF09XCJmaWVsZC5pY29uVG9vbHRpcC50ZXh0XCJcclxuICAgICAgICBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9faW5saW5lLXRvb2x0aXBcIiAvPlxyXG4gICAgICB9XHJcbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBSQURJTyAtLT5cclxuICAgIEBjYXNlICgncmFkaW8nKSB7XHJcbiAgICAgIDx1aS1mb3JtLXJhZGlvLWZpZWxkXHJcbiAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICBbZm9ybUdyb3VwXT1cImZnXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICAgIFtlcnJvcnNdPVwiZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cImdldEZpZWxkT3B0aW9ucyhmaWVsZClcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJpc0ZpZWxkUmVxdWlyZWQoZmllbGQua2V5LCBmZylcIlxyXG4gICAgICAgIFtzaG93RXJyb3JzXT1cInNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKVwiXHJcbiAgICAgIC8+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBEQVRFIC0tPlxyXG4gICAgQGNhc2UgKCdkYXRlJykge1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2Z1bGwtd2lkdGhcIj5cclxuICAgICAgPG1hdC1sYWJlbD57eyBmaWVsZC5sYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwiZGF0ZXBpY2tlclwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgfHwgJ0dHL01NL0FBQUEnXCIgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5IHx8IHJlYWRvbmx5XCIgLz5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRlcGlja2VyXCIgLz5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRlcGlja2VyIFtzdGFydFZpZXddPVwiZmllbGQuY3VzdG9tQ29uZmlnPy5jb25maWc/LlsnbW9udGhWaWV3J10gPyAneWVhcicgOiAnbW9udGgnXCIgLz5cclxuICAgICAgPG1hdC1lcnJvcj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXY+e3sgZXJyIH19PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBEQVRFVElNRSAtLT5cclxuICAgIEBjYXNlICgnZGF0ZXRpbWUnKSB7XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZnVsbC13aWR0aFwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7IGZpZWxkLmxhYmVsIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5IHx8IHJlYWRvbmx5XCIgLz5cclxuICAgICAgPG1hdC1lcnJvcj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxkaXY+e3sgZXJyIH19PC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBGSUxFIC0tPlxyXG4gICAgQGNhc2UgKCdmaWxlJykge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmlsZS13cmFwcGVyXCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtbGFiZWxcIj5cclxuICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxyXG4gICAgICAgIEBpZiAoaXNGaWVsZFJlcXVpcmVkKGZpZWxkLmtleSwgZmcpKSB7IDxzcGFuIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXF1aXJlZFwiPio8L3NwYW4+IH1cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPHVpLWZpbGUtaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29uZmlnXT1cImZpZWxkLmZpbGVDb25maWdcIiAvPlxyXG4gICAgICBAaWYgKHNob3VsZFNob3dGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKSkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1lcnJvclwiPlxyXG4gICAgICAgIEBmb3IgKGVyciBvZiBnZXRGaWVsZEVycm9ycyhmaWVsZC5rZXksIGZnKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPHNwYW4+e3sgZXJyIH19PC9zcGFuPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gRElWSURFUiAtLT5cclxuICAgIEBjYXNlICgnZGl2aWRlcicpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2RpdmlkZXJcIj5cclxuICAgICAgQGlmIChmaWVsZC5sYWJlbCkge1xyXG4gICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZGl2aWRlci1sYWJlbFwiPnt7IGZpZWxkLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICAgIDxociBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZGl2aWRlci1saW5lXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gTE9DQVRJT04gKHNlbGV6aW9uZSB0ZXJyaXRvcmlvKSAtLT5cclxuICAgIEBjYXNlICgnbG9jYXRpb24nKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19sb2NhdGlvbi13cmFwcGVyXCI+XHJcbiAgICAgIEBpZiAoZmllbGQubGFiZWwpIHtcclxuICAgICAgPGxhYmVsIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1sYWJlbFwiPlxyXG4gICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XHJcbiAgICAgICAgQGlmIChpc0ZpZWxkUmVxdWlyZWQoZmllbGQua2V5LCBmZykpIHsgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX3JlcXVpcmVkXCI+Kjwvc3Bhbj4gfVxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICB9XHJcbiAgICAgIDx1aS1zcGVjaWZpY2EtdGVycml0b3JpYWxlIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQua2V5XCIgW2NvbmZpZ109XCJmaWVsZC5jdXN0b21Db25maWc/LmNvbmZpZyB8fCB7fVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IGZpZWxkLmRpc2FibGVkIHx8IGRpc2FibGVkXCIgLz5cclxuICAgICAgQGlmIChzaG91bGRTaG93RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZykpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtZXJyb3JcIj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxzcGFuPnt7IGVyciB9fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIExPQ0FUSU9OLVRBQkxFICh0YWJlbGxhIENSVUQgZGkgbG9jYXRpb24pIC0tPlxyXG4gICAgQGNhc2UgKCdsb2NhdGlvbi10YWJsZScpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2xvY2F0aW9uLXRhYmxlLXdyYXBwZXJcIj5cclxuICAgICAgPHVpLXRhYmxlLXRlcnJpdG9yaWFsZSBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmtleVwiIFtjb25maWddPVwiZmllbGQuY3VzdG9tQ29uZmlnPy5jb25maWcgfHwge31cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCBmaWVsZC5kaXNhYmxlZCB8fCBkaXNhYmxlZFwiIC8+XHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWVycm9yXCI+XHJcbiAgICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8c3Bhbj57eyBlcnIgfX08L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBMT0NBVElPTi1HRU9DT0RFRCAocmljZXJjYSBpbmRpcml6em8gTm9taW5hdGltKSAtLT5cclxuICAgIEBjYXNlICgnbG9jYXRpb24tZ2VvY29kZWQnKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19sb2NhdGlvbi1nZW9jb2RlZC13cmFwcGVyXCI+XHJcbiAgICAgIEBpZiAoZmllbGQubGFiZWwpIHtcclxuICAgICAgPGxhYmVsIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19maWVsZC1sYWJlbFwiIFthdHRyLmZvcl09XCIndWktbG9jLScgKyBmaWVsZC5rZXlcIj5cclxuICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxyXG4gICAgICAgIEBpZiAoaXNGaWVsZFJlcXVpcmVkKGZpZWxkLmtleSwgZmcpKSB7IDxzcGFuIGNsYXNzPVwidWktZm9ybS1idWlsZGVyX19yZXF1aXJlZFwiPio8L3NwYW4+IH1cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgfVxyXG4gICAgICA8dWktbG9jYXRpb24tZ2VvY29kZWQgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5rZXlcIiBbY29uZmlnXT1cImZpZWxkLmxvY2F0aW9uR2VvY29kZWRDb25maWcgfHwge31cIlxyXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciB8fCAnQ2VyY2EgaW5kaXJpenpvLi4uJ1wiXHJcbiAgICAgICAgW2lucHV0QXJpYUxhYmVsXT1cImZpZWxkLmxhYmVsIHx8IGZpZWxkLnBsYWNlaG9sZGVyIHx8ICdJbmRpcml6em8nXCJcclxuICAgICAgICBbaW5wdXRJZF09XCIndWktbG9jLScgKyBmaWVsZC5rZXlcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seSB8fCByZWFkb25seVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IGZpZWxkLmRpc2FibGVkIHx8IGRpc2FibGVkXCIgLz5cclxuICAgICAgQGlmIChzaG91bGRTaG93RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZykpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fZmllbGQtZXJyb3JcIj5cclxuICAgICAgICBAZm9yIChlcnIgb2YgZ2V0RmllbGRFcnJvcnMoZmllbGQua2V5LCBmZyk7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIDxzcGFuPnt7IGVyciB9fTwvc3Bhbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8IS0tIENVU1RPTSAtLT5cclxuICAgIEBjYXNlICgnY3VzdG9tJykge1xyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fY3VzdG9tLXdyYXBwZXJcIiBbYXR0ci5kYXRhLWNvbXBvbmVudF09XCJmaWVsZC5jdXN0b21Db25maWc/LmNvbXBvbmVudFwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVtcGxhdGUta2V5XT1cInJlc29sdmVDdXN0b21UZW1wbGF0ZUtleShmaWVsZClcIj5cclxuICAgICAgQGlmIChmaWVsZC5sYWJlbCkge1xyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWxhYmVsXCI+XHJcbiAgICAgICAge3sgZmllbGQubGFiZWwgfX1cclxuICAgICAgICBAaWYgKGlzRmllbGRSZXF1aXJlZChmaWVsZC5rZXksIGZnKSkgeyA8c3BhbiBjbGFzcz1cInVpLWZvcm0tYnVpbGRlcl9fcmVxdWlyZWRcIj4qPC9zcGFuPiB9XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChnZXRDdXN0b21GaWVsZE91dGxldChmaWVsZCwgZmcsIG5lc3RlZEVycm9yS2V5UHJlZml4KTsgYXMgY3VzdG9tT3V0bGV0KSB7XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21PdXRsZXQudGVtcGxhdGU7IGNvbnRleHQ6IGN1c3RvbU91dGxldC5jb250ZXh0XCIgLz5cclxuICAgICAgfSBAZWxzZSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2N1c3RvbS1wbGFjZWhvbGRlclwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICA8c3Bhbj5OZXNzdW4gdGVtcGxhdGUgcmVnaXN0cmF0byBwZXIgwqt7eyByZXNvbHZlQ3VzdG9tVGVtcGxhdGVLZXkoZmllbGQpIH19wrs8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvdWxkU2hvd0ZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWJ1aWxkZXJfX2ZpZWxkLWVycm9yXCI+XHJcbiAgICAgICAgQGZvciAoZXJyIG9mIGdldEZpZWxkRXJyb3JzKGZpZWxkLmtleSwgZmcpOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8c3Bhbj57eyBlcnIgfX08L3NwYW4+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L25nLXRlbXBsYXRlPiJdfQ==