@esfaenza/es-table 15.2.24 → 15.2.26

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.
@@ -10,6 +10,7 @@ import { EsTableModelChange } from '../../domain/externals/EsTableModelChange';
10
10
  import { EsTdDirective } from '../../directives/es_td.directive';
11
11
  import { EsThDirective } from '../../directives/es_th.directive';
12
12
  import { EsTdEditorDirective } from '../../directives/es_td_editor.directive';
13
+ import { ThTdProvider } from '../../directives/es_th_td_provider.directive';
13
14
  import { EsTableLoc } from './es_table.component.loc';
14
15
  // Tokens
15
16
  import { EST_DEFAULTS } from '../../tokens';
@@ -23,7 +24,7 @@ import { ReportModeHandler } from "../../core/handlers/ReportModeHandler";
23
24
  import { RowGroupingHandler } from "../../core/handlers/RowGroupingHandler";
24
25
  import { SelectionHandler } from "../../core/handlers/SelectionHandler";
25
26
  // Rxjs
26
- import { Subject } from 'rxjs';
27
+ import { Subject, forkJoin } from 'rxjs';
27
28
  import * as i0 from "@angular/core";
28
29
  import * as i1 from "@angular/forms";
29
30
  import * as i2 from "@esfaenza/preferences";
@@ -438,12 +439,18 @@ export class EsTableComponent {
438
439
  this.DefaultAlignment = this.utilities_H.InputOrDefault(this.DefaultAlignment, this.deafults?.DefaultAlignment, 'Left');
439
440
  }
440
441
  /** @ignore */
441
- ngAfterViewInit() {
442
+ async ngAfterViewInit() {
442
443
  // Se utilizzo la new spicy mode deduco tutti i parametri di lavoro possibili al caricamento della tabella
443
444
  // Vengono sovrascritte solo le proprietà non impostate dall'utente
444
- let tdsD = this.EsTdsDirective.length == 0 ? this.EsTableTemplate?.Template?.EsTdsDirective?.length > 0 ? this.EsTableTemplate?.Template?.EsTdsDirective : this.EsTdsDirective : this.EsTdsDirective;
445
- let thsD = this.EsThsDirective.length == 0 ? this.EsTableTemplate?.Template?.EsThsDirective?.length > 0 ? this.EsTableTemplate?.Template?.EsThsDirective : this.EsThsDirective : this.EsThsDirective;
446
- let usesThsAndTdsDirectives = tdsD && tdsD.length > 0 && thsD && thsD.length > 0;
445
+ this.EsTds = this.EsTdsDirective.toArray();
446
+ this.EsThs = this.EsThsDirective.toArray();
447
+ let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...this.ThTdProvider];
448
+ if (thsTdsProviders?.length > 0) {
449
+ await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();
450
+ this.EsTds = [...this.EsTds, ...thsTdsProviders.map(t => t.EsTdsDirective.toArray()).flat()];
451
+ this.EsThs = [...this.EsThs, ...thsTdsProviders.map(t => t.EsThsDirective.toArray()).flat()];
452
+ }
453
+ let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;
447
454
  let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;
448
455
  if (usesThsAndTdsDirectives || hasNoContentProjection) {
449
456
  if (this.UseCustomCells == null)
@@ -718,12 +725,11 @@ export class EsTableComponent {
718
725
  this.internalPostBoundSource();
719
726
  }
720
727
  /** Per poter distinguere le chiamate a questo metodo: Dopo il setTimeout se uso gli EsTd/EsTh vecchi, senza il setTimeout se uso le nuove direttive */
721
- internalPostBoundSource() {
728
+ async internalPostBoundSource() {
722
729
  let View = this.View;
723
- let tdsD = this.EsTdsDirective.length == 0 ? this.EsTableTemplate?.Template?.EsTdsDirective?.length > 0 ? this.EsTableTemplate?.Template?.EsTdsDirective : this.EsTdsDirective : this.EsTdsDirective;
724
- let thsD = this.EsThsDirective.length == 0 ? this.EsTableTemplate?.Template?.EsThsDirective?.length > 0 ? this.EsTableTemplate?.Template?.EsThsDirective : this.EsThsDirective : this.EsThsDirective;
725
- let ths = thsD && thsD.length > 0 ? thsD.toArray() : [];
726
- let tds = tdsD && tdsD.length > 0 ? tdsD.toArray() : [];
730
+ let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...this.ThTdProvider];
731
+ if (thsTdsProviders?.length > 0)
732
+ await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();
727
733
  // Se non ho colonne dinamiche ma sono in modalità dinamica (lo capisco perché c'è una view piena di genericitem) metto il default delle colonne
728
734
  this.dynamicMode_H.eventuallyReviewDynamicColumns();
729
735
  // Gestisce la richiesta per gruppi o per singoli oggetti
@@ -741,47 +747,47 @@ export class EsTableComponent {
741
747
  if (this.DynamicRowColumnsDefinition?.length > 0) {
742
748
  this.logger.log("Generating ths and tds from Dynamic definition");
743
749
  let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();
744
- ths = ret.ths;
745
- tds = ret.tds;
750
+ this.EsThs = ret.ths;
751
+ this.EsTds = ret.tds;
746
752
  }
747
753
  // Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view
748
754
  if (!this.arrayMode && view.report_columns) {
749
755
  this.logger.log("Generating ths and tds from report results");
750
756
  let ret = this.reportMode_H.generateThsAndTdsFromView(view);
751
- ths = ret.ths;
752
- tds = ret.tds;
757
+ this.EsThs = ret.ths;
758
+ this.EsTds = ret.tds;
753
759
  }
754
760
  // Espando i th e i td multipli duplicandoli
755
- let ret = this.columnMetadata_H.expandMultiThsAndTds(ths, tds, itemsAndGroups);
756
- ths = ret.expThs;
757
- tds = ret.expTds;
761
+ let ret = this.columnMetadata_H.expandMultiThsAndTds(this.EsThs, this.EsTds, itemsAndGroups);
762
+ this.EsThs = ret.expThs;
763
+ this.EsTds = ret.expTds;
758
764
  // Genero la cache dei th da usare da qui in poi, dopo avergli lasciato fare le sue cose in caso ci siano dei multi o dei report
759
- for (let i = 0; i < ths.length; i++) {
760
- let th = ths[i];
765
+ for (let i = 0; i < this.EsThs.length; i++) {
766
+ let th = this.EsThs[i];
761
767
  this.thsCache[th.th] = th;
762
768
  }
763
769
  this.thsCacheSet = true;
764
770
  // Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
765
- let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(ths);
771
+ let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);
772
+ // Valuta lo stato iniziale di selezione a range
773
+ this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition);
766
774
  if (this.arrayMode) // In modalità array non ho un backend...
767
775
  this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client
768
776
  this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc
769
777
  this.columnMetadata_H.alignColumnsIfLoadedView(view); // Se sto caricando una View da hotpotato (quindi con savedstate = true) riallineo la visibilità delle colonne e il loro ordine.
770
- this.columnMetadata_H.moveFixedColumnsAtTheBeginning(hI.leafs, tds); // Sposto tutte le cose fixed all'inizio in modo che la creazione di th e td sia più snella (Utilizza le ColumnsList, quindi dev'essere richiamata PIRMA di reviewColumnsList)
778
+ this.columnMetadata_H.moveFixedColumnsAtTheBeginning(hI.leafs, this.EsTds); // Sposto tutte le cose fixed all'inizio in modo che la creazione di th e td sia più snella (Utilizza le ColumnsList, quindi dev'essere richiamata PIRMA di reviewColumnsList)
771
779
  this.columnMetadata_H.alignHeadersOrdering(hI.leafs, view); // Allineo gli ordinamenti agli header
772
- this.columnMetadata_H.refreshColumnsVisibility(hI.leafs, tds, view); // Lavoro sui TH ed eventualmente modifico la visibilità anche dei TD.
780
+ this.columnMetadata_H.refreshColumnsVisibility(hI.leafs, this.EsTds, view); // Lavoro sui TH ed eventualmente modifico la visibilità anche dei TD.
773
781
  this.columnMetadata_H.evaluatePinnedColumnsWidth(); // Se sono presenti colonne pinnate valuta la dimensione del contenitore
774
782
  this.columnMetadata_H.generateDefaultOrder(hI.leafs, view); // Genero le direttive di ordinamento, che siano default o derivanti dalla AppSearch
775
783
  this.columnMetadata_H.evaluateHeaderGroups(hI); // Valuto i raggruppamenti degli header se presenti
776
784
  // ************************************* Generazione binding per righe e colonne *************************************
777
785
  this.evaluateRowThs(hI.leafs); // Raccolgo i TH
778
- this.evaluateRowTds(hI.leafs, tds); // Raccolgo i TD in contesti separati, un contesto per ogni item o gruppo
786
+ this.evaluateRowTds(hI.leafs, this.EsTds); // Raccolgo i TD in contesti separati, un contesto per ogni item o gruppo
779
787
  // ************************************* Ultimi aggiustmaenti dei binding *************************************
780
788
  this.columnMetadata_H.applyOrdering(view, true); // Applico l'ordinamento sulle colonne (non ASC DESC, ma "prima questa o quella colonna")
781
789
  this.MoveTemporaryVariablesToRealOnes(); // Collego TH e TD aggiustati fino ad ora alle variabili di Binding HTML
782
790
  this.selection_H.evaluateSelection(itemsAndGroups, si); // Riallineo le info di selezione degli elementi della View
783
- // Valuta lo stato iniziale di selezione a range
784
- this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition);
785
791
  if (this.ResearchNeeded) {
786
792
  this.changed();
787
793
  this.emitSearchRequest(false);
@@ -1652,10 +1658,10 @@ export class EsTableComponent {
1652
1658
  }
1653
1659
  }
1654
1660
  EsTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsTableComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.PreferencesService, optional: true }, { token: EST_DEFAULTS, optional: true }, { token: i3.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i4.UtilitiesHandler }, { token: i5.UtilityService }, { token: i5.ExportService }, { token: i5.DateService }, { token: i5.MessageService }, { token: i6.CopyPasteDetector }, { token: i5.ClipboardService }, { token: i7.Logger }], target: i0.ɵɵFactoryTarget.Component });
1655
- EsTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: EsTableComponent, selector: "es-table", inputs: { EsTableTemplate: "EsTableTemplate", CornerMenuOptions: "CornerMenuOptions", ColumnsResizable: "ColumnsResizable", ColumnsPinnable: "ColumnsPinnable", AutoUpdate: "AutoUpdate", Height: "Height", EmptySpaceBackgroundColor: "EmptySpaceBackgroundColor", EsTableHandledSearch: "EsTableHandledSearch", MaxHeight: "MaxHeight", ContainerClass: "ContainerClass", XLSXExport: "XLSXExport", CSVExport: "CSVExport", AllSearch: "AllSearch", HighCellDensity: "HighCellDensity", Selection: "Selection", ShowLoadingOnBootstrap: "ShowLoadingOnBootstrap", Removal: "Removal", RemovalCondition: "RemovalCondition", Export: "Export", ShiftClick: "ShiftClick", CountLabel: "CountLabel", HidePaging: "HidePaging", HidePagingCount: "HidePagingCount", HidePagingButtons: "HidePagingButtons", ContextMenu: "ContextMenu", ExportFileName: "ExportFileName", TableClass: "TableClass", ExportFunction: "ExportFunction", ExportOnlyVisibleColumns: "ExportOnlyVisibleColumns", HasHeaderGroup: "HasHeaderGroup", HasSecondaryHeaderGroup: "HasSecondaryHeaderGroup", HeaderHidden: "HeaderHidden", BodyHidden: "BodyHidden", SelectionDisabled: "SelectionDisabled", SingleSelection: "SingleSelection", RowClassAssigner: "RowClassAssigner", OrderByColumn: "OrderByColumn", MultipleOrderingDirectives: "MultipleOrderingDirectives", HiddenColumns: "HiddenColumns", ColumnsOrdering: "ColumnsOrdering", SearchView: "SearchView", SelectAll: "SelectAll", UseArrayModePaging: "UseArrayModePaging", DynamicRowColumnsDefinition: "DynamicRowColumnsDefinition", DynamicOperations: "DynamicOperations", Hierarchy: "Hierarchy", ParentKey: "ParentKey", OwnKey: "OwnKey", StartsExpanded: "StartsExpanded", SavePreferences: "SavePreferences", DefaultAlignment: "DefaultAlignment", PagingStyle: "PagingStyle", RowGroupingPagingStyle: "RowGroupingPagingStyle", ItemSourceProperty: "ItemSourceProperty", UseSelectionCache: "UseSelectionCache", ShowItemGroupsColumns: "ShowItemGroupsColumns", Editable: "Editable", RangeSelection: "RangeSelection", SearchThrottle: "SearchThrottle", ArraymodeItemsPerPage: "ArraymodeItemsPerPage" }, outputs: { onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: true };;\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: false };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n \r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selectionStatus[item._ordinal + 1]?.[index]?.tborder\"\r\n [class.est-no-border-top]=\"selectionStatus[item._ordinal - 1]?.[index]?.bborder\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index - 1]?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index + 1]?.lborder\"\r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i10.ModalDirective, selector: "[bsModal]", inputs: ["config", "closeInterceptor"], outputs: ["onShow", "onShown", "onHide", "onHidden"], exportAs: ["bs-modal"] }, { kind: "directive", type: i11.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i11.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i11.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i12.ContextMenuAttachDirective, selector: "[contextMenu]", inputs: ["contextMenuSubject", "contextMenu"] }, { kind: "component", type: i12.ContextMenuComponent, selector: "context-menu", inputs: ["menuClass", "autoFocus", "useBootstrap4", "disabled"], outputs: ["close", "open"] }, { kind: "directive", type: i12.ContextMenuItemDirective, selector: "[contextMenuItem]", inputs: ["subMenu", "divider", "enabled", "passive", "visible"], outputs: ["execute"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i14.FormAdaptiveComponent, selector: "form-adaptive", inputs: ["Type", "TypeMissingMessage", "Pattern", "AdjustNumber", "AllowDownload", "Precision", "Alignment", "SearchFunction", "MinChars", "CaseSensitive", "Options"] }, { kind: "component", type: i15.TablePagerComponent, selector: "app-paging", inputs: ["CurrentPageSize", "View", "WarnOnAll", "AllSearch", "DefaultAll", "GroupMode", "GroupCount", "CountLabel", "ShowCount", "ShowPaging", "PagerCount", "Hidden"], outputs: ["pagingSelected"] }, { kind: "component", type: i16.EsTh, selector: "[es-th]", inputs: ["es-th", "Order", "Orderable", "Display", "Resizable", "Pinned", "SearchInProgress", "OrderBy", "Wrap", "Fixed", "Template", "Visible"], outputs: ["onOrderChange", "onUnpinning"] }, { kind: "component", type: i17.EsTd, selector: "[es-td]", inputs: ["es-td", "Context"], outputs: ["onCellGeneration"] }, { kind: "pipe", type: i8.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.LocalizePipe, name: "localize" }, { kind: "pipe", type: i18.EstFormatPipe, name: "est_format" }, { kind: "pipe", type: i19.EstLookupPipe, name: "est_lookup" }, { kind: "pipe", type: i20.EstRouterLinkPipe, name: "est_routerlink" }, { kind: "pipe", type: i21.EstRendererPipe, name: "est_renderer" }, { kind: "pipe", type: i22.EstEditorPipe, name: "est_editor" }, { kind: "pipe", type: i23.EstPropInsensitivePipe, name: "est_propinsensitive" }], viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1661
+ EsTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: EsTableComponent, selector: "es-table", inputs: { EsThTdProvider: "EsThTdProvider", CornerMenuOptions: "CornerMenuOptions", ColumnsResizable: "ColumnsResizable", ColumnsPinnable: "ColumnsPinnable", AutoUpdate: "AutoUpdate", Height: "Height", EmptySpaceBackgroundColor: "EmptySpaceBackgroundColor", EsTableHandledSearch: "EsTableHandledSearch", MaxHeight: "MaxHeight", ContainerClass: "ContainerClass", XLSXExport: "XLSXExport", CSVExport: "CSVExport", AllSearch: "AllSearch", HighCellDensity: "HighCellDensity", Selection: "Selection", ShowLoadingOnBootstrap: "ShowLoadingOnBootstrap", Removal: "Removal", RemovalCondition: "RemovalCondition", Export: "Export", ShiftClick: "ShiftClick", CountLabel: "CountLabel", HidePaging: "HidePaging", HidePagingCount: "HidePagingCount", HidePagingButtons: "HidePagingButtons", ContextMenu: "ContextMenu", ExportFileName: "ExportFileName", TableClass: "TableClass", ExportFunction: "ExportFunction", ExportOnlyVisibleColumns: "ExportOnlyVisibleColumns", HasHeaderGroup: "HasHeaderGroup", HasSecondaryHeaderGroup: "HasSecondaryHeaderGroup", HeaderHidden: "HeaderHidden", BodyHidden: "BodyHidden", SelectionDisabled: "SelectionDisabled", SingleSelection: "SingleSelection", RowClassAssigner: "RowClassAssigner", OrderByColumn: "OrderByColumn", MultipleOrderingDirectives: "MultipleOrderingDirectives", HiddenColumns: "HiddenColumns", ColumnsOrdering: "ColumnsOrdering", SearchView: "SearchView", SelectAll: "SelectAll", UseArrayModePaging: "UseArrayModePaging", DynamicRowColumnsDefinition: "DynamicRowColumnsDefinition", DynamicOperations: "DynamicOperations", Hierarchy: "Hierarchy", ParentKey: "ParentKey", OwnKey: "OwnKey", StartsExpanded: "StartsExpanded", SavePreferences: "SavePreferences", DefaultAlignment: "DefaultAlignment", PagingStyle: "PagingStyle", RowGroupingPagingStyle: "RowGroupingPagingStyle", ItemSourceProperty: "ItemSourceProperty", UseSelectionCache: "UseSelectionCache", ShowItemGroupsColumns: "ShowItemGroupsColumns", Editable: "Editable", RangeSelection: "RangeSelection", SearchThrottle: "SearchThrottle", ArraymodeItemsPerPage: "ArraymodeItemsPerPage" }, outputs: { onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }, { propertyName: "ThTdProvider", predicate: ThTdProvider }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i10.ModalDirective, selector: "[bsModal]", inputs: ["config", "closeInterceptor"], outputs: ["onShow", "onShown", "onHide", "onHidden"], exportAs: ["bs-modal"] }, { kind: "directive", type: i11.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i11.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i11.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i12.ContextMenuAttachDirective, selector: "[contextMenu]", inputs: ["contextMenuSubject", "contextMenu"] }, { kind: "component", type: i12.ContextMenuComponent, selector: "context-menu", inputs: ["menuClass", "autoFocus", "useBootstrap4", "disabled"], outputs: ["close", "open"] }, { kind: "directive", type: i12.ContextMenuItemDirective, selector: "[contextMenuItem]", inputs: ["subMenu", "divider", "enabled", "passive", "visible"], outputs: ["execute"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i14.FormAdaptiveComponent, selector: "form-adaptive", inputs: ["Type", "TypeMissingMessage", "Pattern", "AdjustNumber", "AllowDownload", "Precision", "Alignment", "SearchFunction", "MinChars", "CaseSensitive", "Options"] }, { kind: "component", type: i15.TablePagerComponent, selector: "app-paging", inputs: ["CurrentPageSize", "View", "WarnOnAll", "AllSearch", "DefaultAll", "GroupMode", "GroupCount", "CountLabel", "ShowCount", "ShowPaging", "PagerCount", "Hidden"], outputs: ["pagingSelected"] }, { kind: "component", type: i16.EsTh, selector: "[es-th]", inputs: ["es-th", "Order", "Orderable", "Display", "Resizable", "Pinned", "SearchInProgress", "OrderBy", "Wrap", "Fixed", "Template", "Visible"], outputs: ["onOrderChange", "onUnpinning"] }, { kind: "component", type: i17.EsTd, selector: "[es-td]", inputs: ["es-td", "Context"], outputs: ["onCellGeneration"] }, { kind: "pipe", type: i8.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.LocalizePipe, name: "localize" }, { kind: "pipe", type: i18.EstFormatPipe, name: "est_format" }, { kind: "pipe", type: i19.EstLookupPipe, name: "est_lookup" }, { kind: "pipe", type: i20.EstRouterLinkPipe, name: "est_routerlink" }, { kind: "pipe", type: i21.EstRendererPipe, name: "est_renderer" }, { kind: "pipe", type: i22.EstEditorPipe, name: "est_editor" }, { kind: "pipe", type: i23.EstPropInsensitivePipe, name: "est_propinsensitive" }], viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1656
1662
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsTableComponent, decorators: [{
1657
1663
  type: Component,
1658
- args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: true };;\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { $implicit: item, index: index, cell: cell, pinned: false };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra le propriet\u00E0 di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n \r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n\r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selectionStatus[item._ordinal + 1]?.[index]?.tborder\"\r\n [class.est-no-border-top]=\"selectionStatus[item._ordinal - 1]?.[index]?.bborder\"\r\n\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index - 1]?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index + 1]?.lborder\"\r\n\r\n [class.est-selected-cell]=\"selectionStatus[item._ordinal][index]?.selected\"\r\n [class.est-cell-lborder]=\"selectionStatus[item._ordinal][index]?.lborder\"\r\n [class.est-cell-rborder]=\"selectionStatus[item._ordinal][index]?.rborder\"\r\n [class.est-cell-tborder]=\"selectionStatus[item._ordinal][index]?.tborder\"\r\n [class.est-cell-bborder]=\"selectionStatus[item._ordinal][index]?.bborder\"\r\n\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selectionStatus[item._ordinal][index]?.lborder && !selectionStatus[item._ordinal][index]?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selectionStatus[item._ordinal][index]?.rborder && !selectionStatus[item._ordinal][index]?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selectionStatus[item._ordinal][index]?.tborder && !selectionStatus[item._ordinal][index]?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selectionStatus[item._ordinal][index]?.bborder && !selectionStatus[item._ordinal][index]?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"] }]
1664
+ args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [class.est-white-selected]=\"item._selected && !item.locked\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-paging [CountLabel]=\"CountLabel\" [AllSearch]=\"AllSearch\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n </div>\r\n\r\n <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n <div class=\"est-rg-ipp\"><app-paging [AllSearch]=\"AllSearch\" [CountLabel]=\"CountLabel\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></app-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Options]=\"ctx.definition.EditorOptions\" [FocusSubject]=\"FocusSubject\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"] }]
1659
1665
  }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
1660
1666
  type: Self
1661
1667
  }, {
@@ -1676,7 +1682,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1676
1682
  }], EsThsDirective: [{
1677
1683
  type: ContentChildren,
1678
1684
  args: [EsThDirective]
1679
- }], EsTableTemplate: [{
1685
+ }], ThTdProvider: [{
1686
+ type: ContentChildren,
1687
+ args: [ThTdProvider]
1688
+ }], EsThTdProvider: [{
1680
1689
  type: Input
1681
1690
  }], bodyRef: [{
1682
1691
  type: ContentChild,
@@ -1838,4 +1847,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1838
1847
  }] } });
1839
1848
  export class EsTdReference {
1840
1849
  }
1841
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUNILFNBQVMsRUFBRSxlQUFlLEVBQWdDLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNOUQsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWpGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQU0vRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0RCxTQUFT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QVM7c0JBQWpCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFXRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFFRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR2tELGdCQUFnQjtzQkFBeEUsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRUMsY0FBYztzQkFBOUQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVUvQixxQkFBcUI7c0JBQTdCLEtBQUs7O0FBa2hEVixNQUFNLE9BQU8sYUFBYTtDQUl6QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIENoYW5nZURldGVjdG9yUmVmLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsXHJcbiAgICBFdmVudEVtaXR0ZXIsIE91dHB1dCwgQ29udGVudENoaWxkLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIE9wdGlvbmFsLCBTZWxmLCBUZW1wbGF0ZVJlZiwgSW5qZWN0LCBUeXBlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSwgRXhwb3J0U2VydmljZSwgTWVzc2FnZVNlcnZpY2UsIERhdGVTZXJ2aWNlLCBDbGlwYm9hcmRTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2V4dGVuc2lvbnMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2xvY2FsaXphdGlvbnMnO1xyXG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICdAZXNmYWVuemEvcHJlZmVyZW5jZXMnO1xyXG5cclxuLy8gUGx1Z2luc1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJ0Blc2ZhZW56YS9uZ3gtY29udGV4dG1lbnUnO1xyXG5cclxuLy8gTW9kZWxsaSAvIFRpcGlcclxuaW1wb3J0IHsgQXBwU2VhcmNoIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcFNlYXJjaFwiO1xyXG5pbXBvcnQgeyBBcHBPcmRlcmluZyB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBPcmRlcmluZ1wiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlQ29sdW1uc0RlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgQ29ybmVyTWVudU9wdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0Nvcm5lck1lbnVPcHRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvblwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvRXNUYWJsZUNvbHVtblwiO1xyXG5pbXBvcnQgeyBHcm91cFBhZ2VyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBQYWdlclwiO1xyXG5pbXBvcnQgeyBHcm91cFJvdXRlRnJhZ21lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Hcm91cFJvdXRlRnJhZ21lbnRcIjtcclxuaW1wb3J0IHsgVGhFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGhFbGVtZW50XCI7XHJcbmltcG9ydCB7IFBhZ2VySW5mb3MgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9QYWdlckluZm9zXCI7XHJcbmltcG9ydCB7IFRoR3JvdXAgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UaEdyb3VwXCI7XHJcbmltcG9ydCB7IFRkRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RkRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBJdGVtc1NlbGVjdGlvbiB9IGZyb20gJy4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0l0ZW1zU2VsZWN0aW9uJztcclxuaW1wb3J0IHsgR3JvdXBPckFnZ3JlZ2F0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0dyb3VwT3JBZ2dyZWdhdGlvblwiO1xyXG5pbXBvcnQgeyBHcm91cEZpbHRlciB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cEZpbHRlclwiO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cFwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlTW9kZWxDaGFuZ2UgfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0VzVGFibGVNb2RlbENoYW5nZSc7XHJcbmltcG9ydCB7IEl0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0l0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2UnO1xyXG5pbXBvcnQgeyBFc1RhYmxlRGVmYXVsdGFibGUgfSBmcm9tICcuLi8uLi9kb21haW4vY29uZmlndXJhdGlvbi9Fc1RhYmxlRGVmYXVsdGFibGUnO1xyXG5cclxuLy8gQ29tcG9uZW50aSBlIExvY2FsaXp6YXppb25lXHJcbmltcG9ydCB7IEVzVGQgfSBmcm9tICcuLi9lcy10ZC9lc190ZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFc1RkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190ZC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFc1RoRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190aC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBFc1RkRWRpdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lc190ZF9lZGl0b3IuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSUVzVGFibGVUZW1wbGF0ZVdyYXBwZXIgfSBmcm9tICcuLi9lcy10YWJsZS10ZW1wbGF0ZS9lc190YWJsZV90ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFc1RhYmxlTG9jIH0gZnJvbSAnLi9lc190YWJsZS5jb21wb25lbnQubG9jJztcclxuXHJcbi8vIFRva2Vuc1xyXG5pbXBvcnQgeyBFU1RfREVGQVVMVFMgfSBmcm9tICcuLi8uLi90b2tlbnMnO1xyXG5cclxuLy8gSGFuZGxlcnNcclxuaW1wb3J0IHsgRXhwb3J0SGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0V4cG9ydEhhbmRsZXJcIjtcclxuaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGFIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvQ29sdW1uTWV0YWRhdGFIYW5kbGVyXCI7XHJcbmltcG9ydCB7IER5bmFtaWNNb2RlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0R5bmFtaWNNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBIaWVyYXJjaHlNb2RlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0hpZXJhcmNoeU1vZGVIYW5kbGVyXCI7XHJcbmltcG9ydCB7IEl0ZW1zSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0l0ZW1zSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSZXBvcnRNb2RlSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1JlcG9ydE1vZGVIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFJvd0dyb3VwaW5nSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1Jvd0dyb3VwaW5nSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvU2VsZWN0aW9uSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBVdGlsaXRpZXNIYW5kbGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUvaGFuZGxlcnMvVXRpbGl0aWVzSGFuZGxlclwiO1xyXG5cclxuLy8gU2VydmljZVxyXG5pbXBvcnQgeyBDb3B5UGFzdGVEZXRlY3RvciB9IGZyb20gJy4uLy4uL2NvcmUvQ29weVBhc3RlRGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi8uLi9jb3JlL0xvZ2dlcic7XHJcblxyXG4vLyBSeGpzXHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuLyoqIENvbXBvbmVudGUgY2hlIHBlcm1ldHRlIGRpIHJhcHByZXNlbnRhcmUgdW5hIGdyaWdsaWEgZGkgdmFsb3JpICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdlcy10YWJsZScsXHJcbiAgICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogRXNUYWJsZUxvYyB9XSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHN0eWxlVXJsczogWycuL2VzX3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXNfdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFc1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgLy8gQ29tcG9uZW50aSBwZXIgbGEgZ2VzdGlvbmUgZGVsbGUgdmFyaWUgZnVuemlvbmFsaXTDoCBkZWxsJ2VzLXRhYmxlXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgZXhwb3J0X0g6IEV4cG9ydEhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgY29sdW1uTWV0YWRhdGFfSDogQ29sdW1uTWV0YWRhdGFIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGR5bmFtaWNNb2RlX0g6IER5bmFtaWNNb2RlSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBoaWVyYXJjaHlNb2RlX0g6IEhpZXJhcmNoeU1vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGl0ZW1zX0g6IEl0ZW1zSGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyByZXBvcnRNb2RlX0g6IFJlcG9ydE1vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHJvd0dyb3VwaW5nX0g6IFJvd0dyb3VwaW5nSGFuZGxlclxyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHNlbGVjdGlvbl9IOiBTZWxlY3Rpb25IYW5kbGVyO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZXJzIHBlciBnbGkgZXZlbnRpIGRpIGNvcGlhIGUgaW5jb2xsYVxyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHJpdmF0ZSBjb3B5U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwcml2YXRlIHBhc3RlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcHJlZlNlcnZpY2U6IFByZWZlcmVuY2VzU2VydmljZSxcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVTVF9ERUZBVUxUUykgcHJpdmF0ZSBkZWFmdWx0czogRXNUYWJsZURlZmF1bHRhYmxlLFxyXG4gICAgICAgIHB1YmxpYyBsYzogTG9jYWxpemF0aW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIHV0aWxpdGllc19IOiBVdGlsaXRpZXNIYW5kbGVyLFxyXG4gICAgICAgIHB1YmxpYyB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGV4cEV4dHM6IEV4cG9ydFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGRhdGVFeHRzOiBEYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1zZ0V4dHM6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY29weVBhc3RlRGV0ZWN0b3I6IENvcHlQYXN0ZURldGVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgY2xpcGJvYXJkU2VydmljZTogQ2xpcGJvYXJkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyKSB7XHJcblxyXG4gICAgICAgIC8vIENvcGlhIGUgaW5jb2xsYSBzaSBlZmZldHR1YW5vIHNvbG8gc2UgbGEgdGFiZWxsYSBhdHR1YWxlIMOoIHVuaXZvY2FtZW50ZSBzZWxlemlvbmF0YVxyXG4gICAgICAgIHRoaXMuY29weVN1YnNjcmlwdGlvbiA9IHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuT25Db3B5LnN1YnNjcmliZSgoKSA9PiB7IGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKSB0aGlzLmhhbmRsZUNvcHkoKTsgfSk7XHJcbiAgICAgICAgdGhpcy5wYXN0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuT25QYXN0ZS5zdWJzY3JpYmUoKCkgPT4geyBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcykgdGhpcy5oYW5kbGVQYXN0ZSgpOyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5leHBvcnRfSCA9IG5ldyBFeHBvcnRIYW5kbGVyKHRoaXMsIHRoaXMuZXhwRXh0cywgdGhpcy5tc2dFeHRzLCB0aGlzLnV0aUV4dHMsIHRoaXMuZGF0ZUV4dHMpO1xyXG4gICAgICAgIHRoaXMucm93R3JvdXBpbmdfSCA9IG5ldyBSb3dHcm91cGluZ0hhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCwgdGhpcy5kYXRlRXh0cyk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9IID0gbmV3IENvbHVtbk1ldGFkYXRhSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19ILCB0aGlzLnV0aUV4dHMsIHRoaXMucHJlZlNlcnZpY2UsIHRoaXMucm93R3JvdXBpbmdfSCk7XHJcbiAgICAgICAgdGhpcy5keW5hbWljTW9kZV9IID0gbmV3IER5bmFtaWNNb2RlSGFuZGxlcih0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZXJhcmNoeU1vZGVfSCA9IG5ldyBIaWVyYXJjaHlNb2RlSGFuZGxlcih0aGlzKTtcclxuICAgICAgICB0aGlzLml0ZW1zX0ggPSBuZXcgSXRlbXNIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gpO1xyXG4gICAgICAgIHRoaXMucmVwb3J0TW9kZV9IID0gbmV3IFJlcG9ydE1vZGVIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX0ggPSBuZXcgU2VsZWN0aW9uSGFuZGxlcih0aGlzLCB0aGlzLnJvd0dyb3VwaW5nX0gpO1xyXG5cclxuICAgICAgICBpZiAobmdDb250cm9sKVxyXG4gICAgICAgICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1YmplY3QgdXRpbGl6emF0byBpbnRlcm5hbWVudGUgbGF0byBFc1RhYmxlIHBlciBjYXVzYXJlIGlsIEZvY3VzIGxhdG8gY29tcG9uZW50ZSBkaSBJbnB1dCAqL1xyXG4gICAgcHVibGljIEZvY3VzU3ViamVjdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuICAgIC8qKiBUaW1lciBjaGUgdmVycsOgIGltcG9zdGF0byBhICoqZG91YmxlQ2xpY2tCdWZmZXJNcyoqIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGljayBzaW5nb2xvIG8gdW4gZG91YmxlY2xpY2sgKi9cclxuICAgIHByaXZhdGUgY2VsbERiQ2xpY2tUaW1lcjogYW55O1xyXG4gICAgLyoqIFNlIHZlbmdvbm8gZWZmZXR0dWF0aSAyIGNsaWNrIGEgZGlzdGFuemEgaW5mZXJpb3JlIGEgcXVlc3RpIE1pbGxpc2Vjb25kaSB2aWVuZSBjb25zaWRlcmF0byB1biBkb3BwaW8gY2xpY2sgKi9cclxuICAgIHByaXZhdGUgZG91YmxlQ2xpY2tCdWZmZXJNczogbnVtYmVyID0gMjAwO1xyXG4gICAgLyoqIFZpZXcgZmluYWxlIHN1IGN1aSBiaW5kYXJzaSBsYXRvIEZyb250ZW5kLCBpbCB0aXBvIHB1w7IgZXNzZXJlIElBcHBTZWFyY2g8YW55PiAocGVyIGxhICoqdmlld01vZGUqKiksIGFueVtdIChwZXIgbCcqKmFycmF5TW9kZSoqKSAqL1xyXG4gICAgcHVibGljIFZpZXc6IGFueSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkYSBjdWkgbCdlcy10YWJsZSBtb3N0cmEgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSBpbiBiYXNzbyBhIGRlc3RyYSAqL1xyXG4gICAgcHVibGljIGFycmF5UHVsc2FudGk6IHsgdmFsOiBudW1iZXIsIGNzc0NsYXNzOiBzdHJpbmcgfVtdO1xyXG4gICAgLyoqIEluZGljYSBzZSBsJ2VzLXRhYmxlIGRldmUgbW9zdHJhcmUgaWwgY2hlY2sgZ2xvYmFsZSBuZWxsJ2hlYWRlciBwZXIgZmFyZSBpbCBcInNlbGV6aW9uYSB0dXR0b1wiICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2sgPSBmYWxzZTtcclxuICAgIC8qKiBUaWVuZSBkYSBjb250byBsJ3VsdGltbyBlbGVtZW50byBzZWxlemlvbmF0byBpbiBtb2RvIGRhIHBvdGVyIGVmZmV0dHVhcmUgaWwgU0hJRlQrQ0xJQ0sgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBpbnRlcm5vIHBlciBpbCBudW1lcm8gZGkgZWxlbWVudGkgc2VsZXppb25hdGkgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSAwO1xyXG4gICAgLyoqIEluZGljYSBzZSDDqCBwb3NzaWJpbGUgZWZmZXR0dWFyZSB1bmEgc2VsZXppb25lIG1hc3NpdmEgKi9cclxuICAgIHB1YmxpYyBjYW5TZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gSUFwcFNlYXJjaDxhbnk+ICovXHJcbiAgICBwdWJsaWMgdmlld01vZGUgPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgaWwgY29tcG9uZW50ZSBzdGEgZ2VzdGVuZG8gdW4gYW55W10gKi9cclxuICAgIHB1YmxpYyBhcnJheU1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRlbml0b3JlIGRlZ2xpIGVsZW1lbnRpIGRhIGxpc3RhcmUgbGF0byBpbnRlcmZhY2NpYSBkb3BvIHR1dHRlIGxlIGVsYWJvcmF6aW9uaSBkZWwgY2FzbyxcclxuICAgICAqIGdlbmVyYWxtZW50ZSBub24gc29ubyBhbHRybyBjaGUgdHV0dGkgZ2xpIG9nZ2V0dGkgZGEgcHJlc2VudGFyZSBjb24gaW4gcGnDuSBsJ2hhc2ggY2FsY29sYXRvIHBlciBpZGVudGlmaWNhcmUgMSBvZ2dldHRvIGNvbiBsYSBwcm9wcmlhIHJpZ2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIFN0ZXNzYSBjb3NhIGRlbGxhICoqYm91bmRTb3VyY2UqKiwgdXRpbGl6emF0YSBjb21lIGFwcG9nZ2lvIHRlbXBvcmFuZW8gaW50ZXJubyAqL1xyXG4gICAgcHVibGljIFRNUEJvdW5kU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFwiRmV0dGFcIiBkaSBvZ2dldHRpIHV0aWxpenphdGEgbmVsbCdlbmRsZXNzIHNjcm9sbCwgb2duaSBlbGVtZW50byBkaSBxdWVzdG8gYXJyYXkgw6ggdW4gYmxvY2NoZXR0byBkaSAxMDAgZWxlbWVudGkgKi9cclxuICAgIHB1YmxpYyBib3VuZFN1YlNvdXJjZXM6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlc3RhIGZ1bmdlIGRhIGluZGljYXRvcmUgcGVyIGdsaSBzbGljZSBpbnNlcml0aSwgbGEgbHVuZ2hlenphIGRvdnJlYmJlIGVzc2VyZSBjb3JyaXNwb25kZW50ZSBhICoqYm91bmRTdWJTb3VyY2VzKiogKi9cclxuICAgIHB1YmxpYyBhZGRlZFNsaWNlczogbnVtYmVyW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgY2hlIGlkZW50aWZpY2EgaWwgdmFsb3JlIGRlbCBcInNlbGV6aW9uYSBUdXR0b1wiIG5lbGxhIHBhZ2luYXppb25lICovXHJcbiAgICBwdWJsaWMgZGVmYXVsdEFsbFBhZ2VPdmVycmlkZSA9IDk5OTk5OTtcclxuICAgIC8qKiBTZXJ2ZSBwZXIgdGVuZXJlIGluIG1lbW9yaWEgaWwgY29udGVnZ2lvIHByZWNlZGVudGUgZSByZWN1cGVyYXJsbyBpbiBjYXNvIGRpdmVudGkgLTIgKHZlcmlmaWNhcmUgY29uIEFsZSBwZXJjaMOpIGxhIGxvZ2ljYSBkZWwgLTIpICovXHJcbiAgICBwdWJsaWMgcHJldmlvdXNDb3VudDogbnVtYmVyO1xyXG4gICAgLyoqIEluZGljYSBzZSB1dGlsaXp6YXJlIGlsIHNpc3RlbWEgZGkgYXV0b3VwZGF0ZSwgY2lvw6ggdW4gdHJpZ2dlciB0aW1lLWl6emF0byBpbiBhbHRvIGEgZGVzdHJhIGRlbGxhIHRhYmVsbGEgY2hlIHJpcGV0ZSBsZSByaWNlcmNoZSBvZ25pIFggKipzZWNvbmRzKiogKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlID0gZmFsc2U7XHJcbiAgICAvKiogTnVtZXJvIGRpIHNlY29uZGkgZGEgZmFyZSB0cmFzY29ycmVyZSBmcmEgdW5hIHJpY2VyY2EgZSBsJ2FsdHJhICovXHJcbiAgICBwdWJsaWMgc2Vjb25kcyA9ICcxMCc7XHJcbiAgICAvKiogUmlmZXJpbWVudG8gYWxsJ0ludGVydmFsIGNoZSB2aWVuZSBnZW5lcmF0byBzZSAqKmF1dG9VcGRhdGUqKiDDqCBpbXBvc3RhdGEgYSB0cnVlIGluIG1vZG8gZGEgcG90ZXJsbyByaXB1bGlyZSAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVRpbWVyOiBhbnk7XHJcbiAgICAvKiogSW1wb3N0YXRhIGEgdHJ1ZSBvZ25pIHZvbHRhIGNoZSB2aWVuZSBhdnZpYXRhIHVuYSByaWNlcmNhLCBlIGEgZmFsc2Ugb2duaSB2b2x0YSBjaGUgdW4gbnVvdm8gdmFsb3JlIHZpZW5lIHJpY2V2dXRvICovXHJcbiAgICBwdWJsaWMgcmVzZWFyY2hJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VERzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dURHM6IHsgW2NvbnRleHQ6IHN0cmluZ106IFRkRWxlbWVudFtdIH0gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gZGl6aW9uYXJpbyBkaSByaWdoZSBkZWxsYSB0YWJlbGxhLCBjb24gY2hpYXZlIGwnaGFzaCBlIHZhbG9yZSBsYSBsaXN0YSBkaSBjZWxsZSAqL1xyXG4gICAgcHVibGljIFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlICoqUm93VERzKiogw6ggdW4gb2dnZXR0byB2dW90byBvIG1lbm8gKi9cclxuICAgIHB1YmxpYyBFbXB0eVJvd1RkczogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VEhzKiogKi9cclxuICAgIHB1YmxpYyBUTVBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gdGggZGVsbGEgdGFiZWxsYSwgZ2VuZXJhdG8gaW4gYmFzZSBhbGxlIGNvbmZpZ3VyYXppb25pIGUgYWdsaSBvZ2dldHRpIHJpY2V2dXRpICovXHJcbiAgICBwdWJsaWMgUm93VEhzOiBUaEVsZW1lbnRbXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyBkaSBhcHBvZ2dpbyB0ZW1wb3JhbmVvIHBlciBpICoqUm93VGhHcm91cHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBzaW5nb2xvIGhlYWRlciBncm91cCBkZWxsYSB0YWJlbGxhLiBRdWVzdGEgbGlzdGEgw6ggZ2nDoCBvcmRpbmF0YSBlIHByb250YSBwZXIgZXNzZXJlIHV0aWxpenphdGEgaW4gbmdGb3IgKi9cclxuICAgIHB1YmxpYyBSb3dUaEdyb3VwczogVGhHcm91cFtdW10gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGVpIGNvbnRlc3RpLiBVbiBjb250ZXN0byBub24gw6ggYWx0cm8gY2hlIHVuIGhhc2ggcGFydGljb2xhcmUgY2FsY29sYXRvIHN1IHVuIG9nZ2V0dG8gY2hlIGlkZW50aWZpY2EgdW5pdm9jYW1lbnRlIHRhbGUgb2dnZXR0by5cclxuICAgICAqXHJcbiAgICAgKiBPZ251bm8gZGkgcXVlc3RpIGNvbnRlc3RpIHJhcHByZXNlbnRlcsOgIGEgc3VhIHZvbHRhLCB1bml2b2NhbWVudGUsIHVuYSByaWdhIGFsbCdpbnRlcm5vIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJvd0NvbnRleHRzOiBhbnlbXSA9IFtdO1xyXG4gICAgLyoqIERpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWxsZSBjb2xvbm5lIChub24gb3JkaW5hbWVudG8gZGVpIGRhdGkgbWEgZGVsbGUgY29sb25uZSBpbiBzZSkgKi9cclxuICAgIHB1YmxpYyBPcmRlckRpcmVjdGl2ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQ29kaWNlIGRlbGwndWx0aW1vIG9nZ2V0dG8gc29sZXppb25hdG8gKi9cclxuICAgIHB1YmxpYyBsYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVjaWRlIHNlIHV0aWxpenphcmUgbyBtZW5vIGxlIEN1c3RvbUNlbGxzLiBJbXBvc3RhbmRvbG8gYSAqKnRydWUqKiBsJ2VzLXRhYmxlIGRpdmVudGEgaW4gZ3JhZG8gZGkgZ2VzdGlyZSBuYXRpdmFtZW50ZTpcclxuICAgICAqXHJcbiAgICAgKiAxKSBPcmRpbmFtZW50byBlIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmVcclxuICAgICAqXHJcbiAgICAgKiAyKSBPcmRpbmFtZW50byBkZWkgZGF0aVxyXG4gICAgICpcclxuICAgICAqIDMpIE1vZGFsaXTDoCBHZXJhcmNoaWNhXHJcbiAgICAgKlxyXG4gICAgICogZWNjLi4uXHJcbiAgICAgKiB2aWVuZSBkZWRvdHRvIGRhbCBzaXN0ZW1hIGluIGF1dG9tYXRpY29cclxuICAgICAqL1xyXG4gICAgcHVibGljIFVzZUN1c3RvbUNlbGxzOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBvbHRyZSBhbGxlIGNvbG9ubmUgZGluYW1pY2hlIHNwZWNpZmljaGUgZGkgdW4gdGlwbyBkaSBvZ2dldHRvIGNpIHNvbm8gYW5jaGUgY29sb25uZSBkaW5hbWljaGUgYWdnaXVudGUgZGFsbCd1dGVudGVcclxuICAgICAqXHJcbiAgICAgKiBFcy4gdW5hIGNvbG9ubmEgaW4gY3VpIG1vc3RyYXJlIHNlbXByZSB1biBpY29uY2luYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlckRlZmluZWREeW5hbWljQ29sczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgcXVlc3RvIMOoIGlsIHByaW1vIEJpbmQgZGVsbGEgdGFiZWxsYSwgdmllbmUgc2V0dGF0byBhIGZhbHNlIG5vbiBhcHBlbmEgaWwgcHJpbW8gYmluZCB2aWVuZSB0ZXJtaW5hdG8gY29uIHN1Y2Nlc3NvICovXHJcbiAgICBwdWJsaWMgRmlyc3RCaW5kOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBMaXN0YSBkaSBjb2xvbm5lIGNoZSBzaSBwb3Nzb25vIHZpc3VhbGl6emFyZS9vcmRpbmFyZSBmcmEgZGkgbG9ybyAqL1xyXG4gICAgcHVibGljIENvbHVtbnNMaXN0OiBFc1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyB1c2F0YSBkYWxsYSBkaWFsb2cgZGkgc2VsZXppb25lL25hc2NvbmRpbWVudG8sIHBlciBldml0YXJlIGRpIGRhbm5lZ2dpYXJlICoqQ29sdW1uc0xpc3QqKiBpbiBjYXNvIGRpIG1vZGlmaWNoZSBwb2kgYW5udWxsYXRlICovXHJcbiAgICBwdWJsaWMgVE1QQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhbG9yZSBkZWwgY2hlY2sgZ2xvYmFsZSBkaSB2aXNpYmlsaXTDoCB2YWxpZG8gcGVyIHR1dHRlIGxlIGNvbG9ubmUgaW4gKipDb2x1bW5zTGlzdCoqICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2sgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgZGlyZXR0aXZlIHBlciBnbGkgZWRpdG9yIGN1c3RvbSBkZWxsZSBjZWxsZSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RkRWRpdG9yRGlyZWN0aXZlKSBFc1RkRWRpdG9yRGlyZWN0aXZlczogUXVlcnlMaXN0PEVzVGRFZGl0b3JEaXJlY3RpdmU+O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIHR1dHRlIGxlIG51b3ZlIGRpcmV0dGl2ZSAgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGREaXJlY3RpdmUpIEVzVGRzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUZERpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGkgZ2xpIGVzLXRkIGFzc2VnbmF0aSBhIGRpcmV0dGl2YSAoUGVyIGxhIG1vZGFsaXTDoCBkaW5hbWljYSBkZWxsJ2VzLXRhYmxlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihFc1RoRGlyZWN0aXZlKSBFc1Roc0RpcmVjdGl2ZTogUXVlcnlMaXN0PEVzVGhEaXJlY3RpdmU+O1xyXG4gICAgLyoqIElucHV0IGNvbGxlZ2F0byBhIHVuIHRlbXBsYXRlIGNoZSBjb250aWVuZSBsZSBkaXJldHRpdmUgcGVyIHJlbmRlcml6emFyZSBxdWVzdGEgdGFiZWxsYS4gc2UgY2kgc29ubyAqKkVzVGRzRGlyZWN0aXZlKiogZSAqKkVzVGhzRGlyZWN0aXZlKiogcXVlc3RpIGhhbm5vIGxhIHByaW9yaXTDoCAqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZVRlbXBsYXRlOiBJRXNUYWJsZVRlbXBsYXRlV3JhcHBlcjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgZGVsIGJvZHkgKHB1bnRvIGRlbGxhIHRhYmVsbGEgZG92ZSB2ZW5nb25vIG1vc3RyYXRlIGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnYm9keScsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgYm9keVJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWxsJ2hlYWRlciAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgaW50ZXN0YXppb25pIGRlbGxlIHJpZ2hlKSAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBoZWFkZXJSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRlZ2xpIGhlYWRlciAqL1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyR3JvdXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlckdyb3VwUmVmOiBhbnk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIHN1bCByYWdncnVwcGFtZW50byBkaSBzZWNvbmRvIGxpdmVsbG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdzZWNvbmRhcnlIZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgc2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSBpbCBjYW1wbyBkaSBJbnB1dCBhdHR1YWxlLiBEb3BvIHVuIGRvcHBpbyBjbGljayBsbyBiZWNjbyBlIGxvIGZvY3Vzc28gYXBwZW5hIHRlcm1pbmEgbGEgY2hhbmdlIGRldGVjdGlvbiAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGlucHV0RmllbGQ6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogT3B6aW9uaSBleHRyYSBjaGUgZGV2b25vIGFwcGFyaXJlIG5lbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhLCByaWNoaWFtYXRvIGRhaSAzIHBhbGxpbmkgdmVydGljYWxpICovXHJcbiAgICBASW5wdXQoKSBDb3JuZXJNZW51T3B0aW9uczogQ29ybmVyTWVudU9wdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCByZXNpemUgZGVsbGUgY29sb25uZSAqL1xyXG4gICAgQElucHV0KCkgQ29sdW1uc1Jlc2l6YWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgcG9zc2liaWxlIGVmZmV0dHVhcmUgaWwgcGlubmluZyBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUGlubmFibGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIGRpc3BvbmliaWxlIGlsIHNpc3RlbWEgZGkgYWdnaW9ybmFtZW50byBhdXRvbWF0aWNvICovXHJcbiAgICBASW5wdXQoKSBBdXRvVXBkYXRlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgbCdhbHRlenphIGNhYmxhdGEgY2hlIGRldmUgYXNzdW1lcmUgbGEgdGFiZWxsYS4gRXM6IFwiMTAwcHhcIiB8IFwiMTAwJVwiIC4uLiAgKi9cclxuICAgIEBJbnB1dCgpIEhlaWdodDogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgY29sb3JlIGRpIHNmb25kbyBkZWxsbyBzcGF6aW8gdnVvdG8gKG5vbiByaWNvcGVydG8gZGEgZGF0aSkuIFBhcnRpY29sYXJtZW50ZSB1dGlsZSBkYSBpbXBvc3RhcmUgaW4gY2FzbyBkaSAqKkhlaWdodCoqIGRpdmVyc28gZGEgbnVsbCAgKi9cclxuICAgIEBJbnB1dCgpIEVtcHR5U3BhY2VCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgbCdlc3RhYmxlIGEgZ2VzdGlyZSBsYSByaWNlcmNhLCBhbmNoZSBsYSBwcmltYS4gICoqL1xyXG4gICAgQElucHV0KCkgRXNUYWJsZUhhbmRsZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKiogUGVybWV0dGUgZGkgaW1wb3N0YXJlIGwnYWx0ZXp6YSBtYXNzaW1hIGRlbGxhIHRhYmVsbGEuIFNlIG51bGwgbGEgZGltZW5zaW9uZSBzaSBhZGF0dGEgYWwgbnVtZXJvIGRpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIGluIHZpc3VhbGl6emF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgTWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xyXG4gICAgLyoqIENsYXNzaSBkYSBhcHBsaWNhcmUgYWwgY29udGVuaXRvcmUgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGFpbmVyQ2xhc3MgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIFhMU1ggKi9cclxuICAgIEBJbnB1dCgpIFhMU1hFeHBvcnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIG8gbWVubyBsJ2V4cG9ydCBpbiBmb3JtYXRvIENTViAqL1xyXG4gICAgQElucHV0KCkgQ1NWRXhwb3J0ID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSB2aXN1YWxpenphcmUgbyBtZW5vIGwnb3B6aW9uZSBkaSBwYWdpbmF6aW9uZSBcIlR1dHRpXCIgKi9cclxuICAgIEBJbnB1dCgpIEFsbFNlYXJjaCA9IG51bGw7XHJcbiAgICAvKiogRGltaW51aXNjZSBnbGkgc3BhemkgZnJhIHVuYSBjZWxsYSBlIGwnYWx0cmEsIGUgaW50ZXJuYW1lbnRlIGlsIHBhZGRpbmcgZGVsIGZvbnQgaW4gbW9kbyBkYSBwcmVzZW50YXJlIG1vbHRpIHBpw7kgZGF0aSBpbiB1bid1bmljYSBwYWdpbmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZ2hDZWxsRGVuc2l0eTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQWJpbGl0YSBvIG1lbm8gbGEgcG9zc2liaWxpdMOgIGRpIHNlbGV6aW9uYXJlIG9nZ2V0dGkgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdGlvbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTW9zdHJhIG8gbWVubyB1biBtZXNzYWdnaW8gZGkgTG9hZGluZyBhbCBwcmltbyBjYXJpY2FtZW50byBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBTaG93TG9hZGluZ09uQm9vdHN0cmFwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBTZSBpbXBvc3RhdG8gYSAqKnRydWUqKiBhZ2dpdW5nZSB1bmEgY29sb25uYSBjb24gcHVsc2FudGUgZGkgZWxpbWluYXppb25lIHBlciBlZmZldHR1YXJlIGwnZWxpbWluYSBkZWxsJ29nZ2V0dG8gcmVsYXRpdm8gKi9cclxuICAgIEBJbnB1dCgpIFJlbW92YWw6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29uZGl6aW9uZSBjaGUgbmFzY29uZGUgbCdpY29uYSBkaSBlbGltaW5hemlvbmUgaW5zZXJpdGEgaW1wb3N0YW5kbyAqKlJlbW92YWwqKiBhIHRydWUgcXVhbG9yYSBsYSBjb25kaXppb25lIG5vbiB2ZW5pc3NlIHJpc3BldHRhdGFcclxuICAgICAqXHJcbiAgICAgKiBDb21lIGNvbmRpemlvbmUgc2kgY29uc2lkZXJhIHVuIHNlbXBsaWNlIGNhbXBvIHN1IGN1aSBlZmZldHR1YXJlIHVuIGNvbnRyb2xsbyBib29sZWFubywgY29tZSBhZCBlc2VtcGlvIFwiY2FucmVtb3ZlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbENvbmRpdGlvbiA9ICcnO1xyXG4gICAgLyoqIEluZGljYSBzZSBhYmlsaXRhcmUgbGEgcG9zc2liaWxpdMOgIGRpIGVzcG9ydGFyZSBsYSB2aXN0YSBkYXRpIGF0dHVhbGUgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBlcm1ldHRlcmUgbGEgc2VsZXppb25lIG11bHRpcGxhIFdpbmRvd3MtbGlrZSBjbGljY2FuZG8gdW4gb2dnZXR0byBlIGZhY2VuZG8gcG9pIFNoaWZ0ICsgY2xpY2sgc3UgdW4gb2dnZXR0byBzdWNjZXNzaXZvICovXHJcbiAgICBASW5wdXQoKSBTaGlmdENsaWNrOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgaWwgdGVzdG8gY2hlIHZhIGEgc29zdGl0dWlyZSBcIk9nZ2V0dGkgVmlzdWFsaXp6YXRpXCIgaW4gY2FzbyBzaSBzdGlhIGZhY2VuZG8gcXVhbGNvc2EgZGkgY3VzdG9tICovXHJcbiAgICBASW5wdXQoKSBDb3VudExhYmVsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaWwgY29tcG9uZW50ZSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb250ZWdnaW8gZGVnbGkgZWxlbWVudGkgdHJvdmF0aSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0NvdW50OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGkgcHVsc2FudGkgZGkgcGFnaW5hemlvbmUgKi9cclxuICAgIEBJbnB1dCgpIEhpZGVQYWdpbmdCdXR0b25zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBSaWZlcmltZW50byBhbCBDb250ZXh0TWVudSAobmd4LWNvbnRleHRtZW51KSBhc3NvY2lhdG8gYWwgY2xpY2sgZGVzdHJvIGRpIHVubyBvIHBpw7kgZWxlbWVudGkgc2VsZXppb25hdGkgbmVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgQ29udGV4dE1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50ID0gbnVsbDtcclxuICAgIC8qKiBOb21lIGRlbGwnZXNwb3J0YXppb25lIGdlbmVyYXRhIGRhIHF1ZXN0YSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGaWxlTmFtZSA9ICdFeHBvcnQuY3N2JztcclxuICAgIC8qKiBDbGFzc2UgKEhUTUwpIGRpIGRlZmF1bHQgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgVGFibGVDbGFzcyA9IG51bGw7XHJcbiAgICAvKiogRnVuemlvbmUgZGEgdXRpbGl6emFyZSBpbiBlc3BvcnRhemlvbmUuIEhhIGNvbWUgcGFyYW1ldHJvIHVuYSBjYWxsYmFjayBjb24gaSBkYXRpIGNvbXBsZXRpIGRhIGVzcG9ydGFyZSAoZGF0byBjaGUgZGkgZGVmYXVsdCBsYSByaWNlcmNhIMOoIHBhZ2luYXRhKSAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0RnVuY3Rpb246IChjYWxsYmFjayA6IChkYXRhOiBhbnlbXSwgdHlwZTogVHlwZTxhbnk+KSA9PiB2b2lkLCBmb3JtYXQ6IFwiQ1NWXCIgfCBcIlhMU1hcIikgPT4gdm9pZDtcclxuICAgIC8qKiBJbmRpY2EgZGkgZXNwb3J0YXJlIHNvbG8gbGUgY29sb25uZSBhdHR1YWxtZW50ZSB2aXNpYmlsaSBkZWxsYSB2aWV3ICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRPbmx5VmlzaWJsZUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBJbmRpY2EgbGEgcHJlc2VuemEgZGkgcmFnZ3J1cHBhbWVudGkgYSBsaXZlbGxvIGRpIGhlYWRlciAqL1xyXG4gICAgQElucHV0KCkgSGFzSGVhZGVyR3JvdXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEluZGljYSBsYSBwcmVzZW56YSBkaSByYWdncnVwcGFtZW50aSBhIGxpdmVsbG8gZGVsIHJhZ2dydXBwYW1lbnRvIHByZWNlZGVudGVtZW50ZSBlc2lzdGVudGUsIGNoaWFyYW1lbnRlIMOoIGluc2Vuc2F0YSBzZW56YSAqKkhhc0hlYWRlckdyb3VwKiogKi9cclxuICAgIEBJbnB1dCgpIEhhc1NlY29uZGFyeUhlYWRlckdyb3VwOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBnbGkgSGVhZGVyIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEhlYWRlckhpZGRlbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgaWwgQm9keSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBCb2R5SGlkZGVuOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBsYSBzZWxlemlvbmUgw6ggdGVtcG9yYW5lYW1lbnRlIGRpc2FiaWxpdGF0YS4gUmlzcGV0dG8gYWxsJ0lucHV0ICoqU2VsZWN0aW9uKiogY2hlIHZpc2l2YW1lbnRlIGdlc3Rpc2NlIHNlIGNpIHNvbm8gbyBubyBnbGkgaW5wdXQgZGkgc2VsZXppb25lLFxyXG4gICAgICogcXVlc3RvIElucHV0IGdlc3Rpc2NlIHNlIHF1ZXN0aSBpbnB1dCBzb25vIGFiaWxpdGF0aSBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uRGlzYWJsZWQ6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGZvcnphcmUgaWwgc2lzdGVtYSBkaSBzZWxlemlvbmUgYSBnZXN0aXJlIHVuIGVsZW1lbnRvIHBlciB2b2x0YS5cclxuICAgICAqIFNlbGV6aW9uYXJlIHVuJ2FsdHJhIHJpZ2EgY29uIHVuYSBnacOgIHNlbGV6aW9uYXRhIGFwcGxpY2hlcsOgIGxhIHNlbGV6aW9uZSBhbGxhIG51b3ZhIHJpZ2EsIHJpbXVvdmVuZG9sYSBkYWxsJ2F0dHVhbGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2luZ2xlU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBDYWxsYmFjayBjaGUgZGF0byB1biBvZ2dldHRvIHJlc2l0dWlzY2UgbCdldmVudHVhbGUgY2xhc3NlIGRhIGFwcGxpY2FyZSBhbGxhIHJpZ2EgY29sbGVnYXRhIGFsbCdvZ2dldHRvICovXHJcbiAgICBASW5wdXQoKSBSb3dDbGFzc0Fzc2lnbmVyOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIG9yZGluYXJlIGkgZGF0aSBpbiBtYW5pZXJhIGRpc2NlbmRlbnRlIG8gYXNjZW5kZW50ZSAqL1xyXG4gICAgQElucHV0KCkgT3JkZXJCeUNvbHVtbjogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgYXZlcmUgcGnDuSBkaXJldHRpdmUgZGkgb3JkaW5hbWVudG8gZGVpIGRhdGkgKi9cclxuICAgIEBJbnB1dCgpIE11bHRpcGxlT3JkZXJpbmdEaXJlY3RpdmVzID0gdHJ1ZTtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBuYXNjb25kZXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIHNlbGV6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBIaWRkZW5Db2x1bW5zOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSByaW9yZGluYXJlIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIGltcG9zdGF6aW9uaSBlZmZldHR1YXRlIGRhbCBNZW7DuSBjb250ZXN0dWFsZSBpbiBhbHRvIGEgZGVzdHJhICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zT3JkZXJpbmc6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEV2ZW50dWFsZSBzdXBwb3J0byBhbGxlIHJpY2VyY2hlIGFwcGxpY2F0ZSBhbGxhIG1vZGFsaXTDoCBBcnJheSAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoVmlldyA9IG51bGwgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAvKiogQWJpbGl0YSBvIGRpc2FiaWxpdGEgaWwgc2lzdGVtYSBjaGUgcGVybWV0dGUgZGkgc2VsZXppb25hcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIG5lbGxhIHZpc3RhICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3RBbGw6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNpbXVsYSBsYSBwYWdpbmF6aW9uZSBhbmNoZSBwZXIgbGUgdGFiZWxsZSBjaGUgZnVuemlvbmFubyBpbiBtb2RhbGl0w6AgQXJyYXkgKi9cclxuICAgIEBJbnB1dCgpIFVzZUFycmF5TW9kZVBhZ2luZyA9IHRydWU7XHJcbiAgICAvKiogRGVmaW5pemlvbmUgZGkgY29sb25uZSBkaW5hbWNoZSBwZXIgbGEgbW9kYWxpdMOgLCBhcHB1bnRvLCBkaW5hbWljYSAqL1xyXG4gICAgQElucHV0KCkgRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uOiBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb25bXSA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIG9wZXJhemlvbmkgZGluYW1pY2hlIGdlbmVyaWNoZSBjaGUgcG9zc29ubyBlc3NlcmUgZWZmZXR0dWF0ZSBwZXIgcmlnYS4gQXBwYWlvbm8gY29tZSBjb2xvbm5lIGV4dHJhIHN1bCBsYXRvIHNpbmlzdHJvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIER5bmFtaWNPcGVyYXRpb25zOiBFc1RhYmxlT3BlcmF0aW9uRGVmaW5pdGlvbltdID0gW107XHJcbiAgICAvKiogSW5kaWNhIHNlIHZpc3VhbGl6emFyZSBpIGRhdGkgaW4gbWFuaWVyYSBnZXJhcmNoaWNhICovXHJcbiAgICBASW5wdXQoKSBIaWVyYXJjaHk6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWwgcGFkcmUuIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIFBhcmVudEtleSA9ICcnO1xyXG4gICAgLyoqIE5vbWUgZGVsbGEgcHJvcHJpZXTDoCBjaGUgY29udGllbmUgbCdJRCBkZWxsJ29nZ2V0dG8gYXR0dWFsZS4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgT3duS2V5ID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIHBhcnRpcmUgY29uIHVuIGFsYmVybyBlc3BhbnNvLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBTdGFydHNFeHBhbmRlZCA9IHRydWU7XHJcbiAgICAvKiogSW5kaWNhIHNlIGVmZmV0dHVhcmUgaWwgc2FsdmF0YWdnaW8gZGVsbGUgcHJlZmVyZW56ZSBkaSByaWNlcmNhICovXHJcbiAgICBASW5wdXQoKSBTYXZlUHJlZmVyZW5jZXM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEFsbGluZWFtZW50byBkaSBkZWZhdWx0IHBlciBjZWxsZSBlIGhlYWRlcnMgKi9cclxuICAgIEBJbnB1dCgpIERlZmF1bHRBbGlnbm1lbnQ6ICdMZWZ0JyB8ICdSaWdodCcgfCAnQ2VudGVyJyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIGRvdmUgdmlzdWFsaXp6YXJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSwgc2Ugc29wcmEsIHNvdHRvIG8gaW4gZW50cmFtYmkgKi9cclxuICAgIEBJbnB1dCgpIFBhZ2luZ1N0eWxlOiAnYm90aCcgfCAndG9wJyB8ICdib3R0b20nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgZG92ZSB2aXN1YWxpenphcmUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lLCBzZSBzb3ByYSwgc290dG8gbyBpbiBlbnRyYW1iaSAqL1xyXG4gICAgQElucHV0KCkgUm93R3JvdXBpbmdQYWdpbmdTdHlsZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9IG51bGw7XHJcbiAgICAvKiogUXVhbG9yYSBwZXIgcXVhbHNpYXNpIG1vdGl2byBub24gdmVuaXNzZSB1c2F0byAqKml0ZW1zKiogZGVsbCdBcHBTZWFyY2ggcXVlc3RvIElucHV0IGluZGljYSBxdWFsIMOoIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBkYSB1dGlsaXp6YXJlICovXHJcbiAgICBASW5wdXQoKSBJdGVtU291cmNlUHJvcGVydHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgbGEgY2FjaGUgZGkgc2VsZXppb25lIGNoZSBwZXJtZXR0ZSBkaSBtYW50ZW5lcmUgZ2xpIHN0YXRpIGRpIHNlbGV6aW9uZSBkZWkgdmFyaSBvZ2dldHRpIG5hdmlnYW5kbyBkYSB1bmEgcGFnaW5hIGFsbCdhbHRyYSAqL1xyXG4gICAgQElucHV0KCkgVXNlU2VsZWN0aW9uQ2FjaGUgPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIGRlY2lkZXJlIHNlLCBpbiBtb2RhbGl0w6AgcmFnZ3J1cHBhbWVudG8sIG1vc3RyYXJlIG8gbWVubyBpbCB2YWxvcmUgZGVsbGUgY29sb25uZSBkaSBncnVwcG8gbmVnbGkgb2dnZXR0aSBmaW5hbGkuIERpIGRlZmF1bHQgc29ubyBuYXNjb3N0aSAqL1xyXG4gICAgQElucHV0KCkgU2hvd0l0ZW1Hcm91cHNDb2x1bW5zID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgY2hlIHR1dHRpIGkgY2FtcGkgY2hlIGRlZmluaXNjb25vIGxlIG1vZGFsaXTDoCBkaSBtb2RpZmljYSBjYW1wbyBwb3Nzb25vIGVzc2VyZSBtb2RpZmljYXRpIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmkgKi9cclxuICAgIEBJbnB1dCgpIEVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHNlbGV6aW9uaSBhIHJhbmdlIHBlciBwb2kgZmFyY2kgZXZlbnR1YWxtZW50ZSBjb3BpYSBpbmNvbGxhICovXHJcbiAgICBASW5wdXQoKSBSYW5nZVNlbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBpbCBudW1lcm8gZGkgbWlsbGlzZWNvbmRpIHBlciBjdWkgZGVib3VuY2FyZSBpbCB3cml0ZVZhbHVlIHBlciBsYSBtb2RhbGl0w6AgKipFc1RhYmxlSGFuZGxlZFNlYXJjaCoqICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hUaHJvdHRsZTogbnVtYmVyID0gNTA7XHJcbiAgICAvKiogRXZlbnRvIGNoZSB2aWVuZSByaWNoaWFtYXRvIGFsIGNhbWJpbyBkaSBvcmlkbmFtZW50byBkaSB1bmEgY29sb25uYSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3JkZXJDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QXBwT3JkZXJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcHBPcmRlcmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byBjaGUgdmllbmUgcmljaGlhbWF0byBxdWFuZG8gbCdlcy10YWJsZSByaXRpZW5lIHNpYSBuZWNlc3NhcmlvIHJpLWVmZmV0dHVhcmUgbGEgcmljZXJjYS5cclxuICAgICAqIElsIGJvb2xlYW5vIGRlbGwnZXZlbnRvIGluZGljYSBzZSB2aWVuZSBzdWdnZXJpdG8gZGkgcmVzZXR0YXJlIGxhIHBhZ2luYSBvIG1lbm8uXHJcbiAgICAgKiBcclxuICAgICAqIFNvbG8gaW4gY2FzbyB2ZW5nYSB1dGlsaXp6YXRhIGxhIG1vZGFsaXTDoCBhIHJhZ2dydXBwYW1lbnRpIGRpIHJpZ2hlIHB1w7Igc3VjY2VkZXJlIGNoZSBsJ2VzLXRhYmxlIHBhc3NpIHVuIGludGVybyBBcHBTZWFyY2ggY29tZSBwYXJhbWV0cm8gZGkgcmljZXJjYSxcclxuICAgICAqIGluIHF1ZWwgY2FzbyBsJ2FwcGxpY2F6aW9uZSByaWNldmVudGUgZG92csOgIG9ub3JhcmUgbGEgcmljaGllc3RhIHNwZWRlbmRvIGFsIGJhY2thbmQgbCdvZ2dldHRvIGRpIHJpY2VyY2EgQVMtSVNcclxuICAgICAqIFxyXG4gICAgICogaWwgdGlwbyBkZWxsJ0VtaXR0ZXIgaW52ZWNlIGRpIGVzc2VyZSBbYm9vbGVhbiB8IEFwcFNlYXJjaDxhbnk+XSDDqCBzdGF0byBpbXBvc3RhdG8gYSBcImFueVwiIHBlciBldml0YXJlIHByb2JsZW1pIGRpIHJldHJvY29tcGF0aWJpbGl0w6BcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIG9uU2VhcmNoUmVxdWVzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gY2hlIHBhcnRlIGFkIG9nbmkgbW9kaWZpY2EgZGkgXCJjaGVja2FnZ2lvXCIgaW4gZm9ybWEgZGkgY29tb2RvIGFycmF5LiBFc3BvbmUgbCdvZ2dldHRvIGNvbiBsbyBzdGF0byBkaSBjaGVjayBhdHR1YWxlICovXHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SXRlbXNTZWxlY3Rpb248YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEl0ZW1zU2VsZWN0aW9uPGFueT4+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2VsaW1pbmF6aW9uZSBkaSB1biBvZ2dldHRvICovXHJcbiAgICBAT3V0cHV0KCkgb25SZW1vdmFsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIGFsbCdhbm51bGxhbWVudG8gZGkgdW4nZWxpbWluYXppb25lICovXHJcbiAgICBAT3V0cHV0KCkgb25BYm9ydFJlbW92YWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsYSBtb2RpZmljYSBkZWkgbW9kZWxsaSBiaW5kYXRpICovXHJcbiAgICBAT3V0cHV0KCkgb25Nb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPEVzVGFibGVNb2RlbENoYW5nZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXNUYWJsZU1vZGVsQ2hhbmdlW10+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2FwZXJ0dXJhIGRlbCBtZW7DuSBjb250ZXN0dWFsZSAqL1xyXG4gICAgQE91dHB1dCgpIG9uT3BlbkNvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkNvcm5lck1lbnVPcHRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkNvcm5lckFjdGlvbjogRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgZXN0YWJsZTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGVzdGFibGU6IGFueSB9PigpO1xyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHF1YW5kbyBzaSBjbGljY2Egc3UgdW4gb3B6aW9uZSBkZWZpbml0YSBuZWxsZSAqKkR5bmFtaWNPcGVyYXRpb25zKiogKi9cclxuICAgIEBPdXRwdXQoKSBvbkR5bmFtaWNPcGVyYXRpb246IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGl0ZW06IGFueSB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBpdGVtOiBhbnkgfT4oKTtcclxuXHJcbiAgICAvKiogRWxlbWVudG8gSFRNTCBkYSBjbGljY2FyZSBwZXIgbCdlc3BvcnRhemlvbmUgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERvd25sb2FkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGV4cG9ydERvd25sb2FkZXI6IEVsZW1lbnRSZWY7XHJcbiAgICAvKiogUGxhY2Vob2xkZXIgZGkgbWVuw7kgY29udGVzdHVhbGUgcGVyIHF1YW5kbyBub24gY2kgc29ubyBvcHppb25pIG5lbCBwbGFjZWhvbGRlciBcIlZlcm9cIiAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyB0YWJsZUVtcHR5TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQ7XHJcblxyXG4gICAgLyoqIFN1YnNjcmlwdGlvbiBzdWxsJ2FwZXJ0dXJhIGRlbCBjb250ZXh0IG1lbnUgZGEgcmlwdWxpcmUgYWwgZGVzdHJveSBkZWxsYSBjbGFzc2UgKi9cclxuICAgIHByaXZhdGUgY3R4TWVudVN1YnNjcmlwdGlvbjogYW55O1xyXG5cclxuICAgIC8qKiBQYWdpbmEgaW4gdmlzdWFsaXp6YXppb25lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlID0gMTtcclxuICAgIC8qKiBOdW1lcm8gZGkgcGFnaW5lIChkdXJhbnRlIGxhIHBhZ2luYXppb25lIGluIG1vZGFsaXTDoCBBcnJheSkgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVQYWdlcyA9IDE7XHJcbiAgICAvKiogT2dnZXR0aSBwZXIgb2duaSBwYWdpbmEgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgQElucHV0KCkgQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gbnVsbDtcclxuICAgIC8qKiBPZ2dldHRvIGRpIHNlbGV6aW9uZSBwZXIgbGEgbW9kYWxpdMOgIEFycmF5LCBjaGUgZGV2ZSBjb21wb3J0YXJzaSBjb21lIGxhIGNvbnRyb3BhcnRlIGluIG1vZGFsaXTDoCBWaWV3ICovXHJcbiAgICBwdWJsaWMgYXJyYXltb2RlU2VsZWN0aW9uOiBJdGVtc1NlbGVjdGlvbjxhbnk+O1xyXG4gICAgLyoqIENvbG9ubmUgZGEgdmlzdWFsaXp6YXJlIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5Q29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmUgZGVsbGUgY29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5PcmRlcmluZzogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBPcmRpbmFtZW50aSBBU0MtREVTQyBzdWxsZSBjb2xvbm5lIGluIG1vZGFsaXTDoCBhcnJheSAqL1xyXG4gICAgcHVibGljIGFycmF5T3JkZXJzOiBBcHBPcmRlcmluZ1tdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJpbGUgY2hlIHNlcnZlIGEgZ2VzdGlyZSBpbCBtb21lbnRvIGluIGN1aSBsJ2VzLXRhYmxlIGFnZ2lvcm5hIGxhIHBhZ2luYXppb25lIChwdWxzYW50aSBlY2MpLlxyXG4gICAgICogRXNzZW5kbyBvcGVyYXppb25pIGNvbXVucXVlIGNvc3Rvc2UgbGUgZWZmZXR0dW8gc29sbyBzdSBiaW5kaW5nIGVzdGVybmksIG5vbiBzdSByZXdyaXRlIGdlbmVyYXRpIGludGVybmFtZW50ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWNoZSBjaGUgY29udGVycsOgIHR1dHRlIGxlIHJpY2VyY2hlIGVmZmV0dHVhdGUgc3UgZ3J1cHBpIGRpdmVyc2kgZGFsIHByaW1vIGUgc3UgZWxlbWVudGkgY29udGVudXRpIG5laSBncnVwcGkuXHJcbiAgICAgKiBJbiBjYXNvIGRpIGNhbWJpIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgZGl2ZXJzZSBkYWxsYSBwcmltYSB0dXR0ZSBsZSBjaGlhbWF0ZSBmYXR0ZSBkYWwgc2Vjb25kbyBsaXZlbGxvIGluIHBvaSBkZXZvbm8gZXNzZXJlIHJpZXNlZ3VpdGUgc2Vjb25kbyBsYSBzZWd1ZW50ZSBsb2dpY2E6XHJcbiAgICAgKiBcclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3VsIHByaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8sIG5vbiBtaSBvY2N1cG8gZGkgcmlwdWxpcmUgZ2xpIGVsZW1lbnRpIGJpbmRhdGkgaW4gYWxjdW4gbW9kb1xyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWxsYSBjb2xvbm5hIHJlbGF0aXZhIGFsbCdOLWVzaW1vIGdydXBwbyoqOiByZWxvYWQgY29tcGxldG8gZGVsIGNvbnRlbnV0byBkZWkgZ3J1cHBpIHByZWNlZGVudGksIHJpcHVsZW5kbyBwcmVjZWRlbnRlbWVudGUgXHJcbiAgICAgKiB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2dyb3VwbGV2ZWwqKiA9IE5cclxuICAgICAqIFxyXG4gICAgICogKipDYW1iaW8gb3JkaW5hbWVudG8gc3UgdW5hIGNvbG9ubmEgbm9uIHJhZ2dydXBwYXRhKio6IHJlbG9hZCBjb21wbGV0byBwZXIgdHV0dGkgaSBncnVwcGkgZmluYWxpIGFwZXJ0aSwgZGV2byBwcmVjZWRlbnRlbWVudGUgcmlwdWxpcmUgdHV0dGkgZ2xpIGVsZW1lbnRpIGNvbiAqKl9pdGVtKiogPSB0cnVlXHJcbiAgICAgKiBcclxuICAgICAqIEFsdHJpIGV2ZW50aSBub24gZG92cmViYmVybyByYXBwcmVzZW50YXJlIHByb2JsZW1pOlxyXG4gICAgICogLSBTZWxlemlvbmU6IG5vbiBjYW1iaWEgbnVsbGFcclxuICAgICAqIC0gUGFnaW5hemlvbmU6IGNhbWJpYSBhIGxpdmVsbG8gcm9vdCBxdWluZGkgdmllbmUgcmljYXJpY2F0byB0dXR0byBjb211bnF1ZSwgc3Rlc3NvIHZhbGUgcGVyIGxlIHBhZ2luYXppb25pIGludGVybmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZTogeyBwYXRoOiBzdHJpbmcsIHJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSwgdmlldzogQXBwU2VhcmNoPGFueT4sIGdyb3VwX2NvbHVtbjogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAgIC8qKiBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgY2FwaXJlIHNlIGMnw6ggYmlzb2dubyBkaSByaS1lZmZldHR1YXJlIHVuYSByaWNlcmNhIG8gbWVubyAqL1xyXG4gICAgcHJpdmF0ZSBSZXNlYXJjaE5lZWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIENvbG9ubmUgdmlzaWJpbGkgZGVsbGEgdmlzdGEgYXR0dWFsZS4gVmFsb3JpenphdG8gZGkgZGVmYXVsdCBhbCBudW1lcm8gbWFzc2ltbyBkaSBjb2xvbm5lIHN1cHBvcnRhdGUgZGFsbGEgdGFiZWxsYSBwZXIgbGUgY2FzaXN0aWNoZSBpbiBhc3NlbnphIGRpIGN1c3RvbSBjZWxscyAqL1xyXG4gICAgcHVibGljIENvbHVtbnM6IHsgVmlzaWJpbGU6IG51bWJlciwgVmlzaWJsZVVucGlubmVkOiBudW1iZXIsIEdsb2JhbDogbnVtYmVyIH0gPSB7IFZpc2liaWxlOiAxMDAsIFZpc2libGVVbnBpbm5lZDogMTAwLCBHbG9iYWw6IDEwMCB9O1xyXG4gICAgLyoqIEluIGNhc28gZGkgUm93IEdyb3VwaW5nIHF1aSB2aWVuZSBzYWx2YXRhIGxhIHZpc3RhIHByaW5jaXBhbGUgZGVpIGdydXBwaSBiYXNlICovXHJcbiAgICBwdWJsaWMgTWFpbkdyb3VwVmlldzogQXBwU2VhcmNoPGFueT4gPSBudWxsO1xyXG4gICAgLyoqIENvbnRlZ2dpbyBiYXNlIGRlZ2xpIG9nZ2V0dGkuIEluIG1vZGFsaXTDoCBub3JtYWxlIHZpZW5lIHJlc2V0dGF0byBhZCBvZ25pIG51b3ZhIFZpZXcgaW5zZXJpdGEsIGluIG1vZGFsaXTDoCBSb3dHcm91cGluZyB2aWVuZSByZXNldHRhdG8gc29sbyBhZCB1bmEgbnVvdmEgVmlldyBkaSBsaXZlbGxvIFwiMFwiICovXHJcbiAgICBwdWJsaWMgQmFzZUl0ZW1zQ291bnQgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBjaSBzb25vIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSBlIHZpc2liaWxpLiBTZXJ2ZSBwZXIgcG90ZXIgc2V0dGFyZSB0dXR0ZSBsZSBjb2xvbm5lIHByaW1hIGNoZSBhcnJpdmlubyBkYXRpIGEgcGlubmVkKi9cclxuICAgIHB1YmxpYyBIYXNQaW5uZWRDb2x1bW5zOiBib29sZWFuXHJcbiAgICAvKiogTGFyZ2hlenphIGNhbGNvbGF0YSBkZWwgY29udGFpbmVyIGRlbGxlIGNvbG9ubmUgcGlubmF0ZSAqL1xyXG4gICAgcHVibGljIFBpbm5lZENvbnRhaW5lcldpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5vbm9zdGFudGUgc2lhbW8gaW4gbW9kYWxpdMOgIGFycmF5IHNvbm8gc3RhdGkgaW5kaXZpZHVhdGkgZGVpIGdydXBwaS4gSW4gdGFsIGNhc28gZXMtdGFibGUgc2kgY29tcG9ydGEgZGEgcHNldWRvIGJhY2tlbmQgZWQgZWZmZXR0dWEgbGUgYWdncmVnYXppb25pIGUgcmFnZ3J1cHBhbWVudGkgY29tcGxldGFtZW50ZSBsYXRvIGNsaWVudCAqL1xyXG4gICAgcHVibGljIEFycmF5R3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2EgY2hlIGwnZXMtdGFibGUgw6ggYmFzYXRhIHN1bGxlIGRpcmV0dGl2ZSAobnVvdmEgbW9kYWxpdMOgKSAqL1xyXG4gICAgcHVibGljIERpcmVjdGl2ZXNCYXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBsbyBzdGF0byBkaSBzZWxlemlvbmUgcGVyIHNpbmdvbGEgY2VsbGEgKi9cclxuICAgIHB1YmxpYyBzZWxlY3Rpb25TdGF0dXM6IHsgW2luZGV4OiBudW1iZXJdOiB7IFtpbmRleDogbnVtYmVyXTogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IH0gPSB7fTtcclxuICAgIC8qKiBDaGlhbWF0YSByZWFsZSBhbCB3cml0ZVZhbHVlIGRvcG8gaWwgcGFzc2FnZ2lvIGRpICoqU2VhcmNoVGhyb3R0bGUqKiBtaWxsaXNlY29uZGkuIFNvbG8gbW9kYWxpdMOgIEVzVGFibGVIYW5kbGVkU2VhcmNoICovXHJcbiAgICBwcml2YXRlIGNhbGxUaW1lb3V0IDogYW55ID0gbnVsbDtcclxuICAgIC8qKiBDYWNoZSBkZWkgdGggcGl1dHRvc3RvIGNoZSByaWNhbGNvbGFyc2VsaSBkaSBjb250aW51byAqL1xyXG4gICAgcHJpdmF0ZSB0aHNDYWNoZTogIHsgW2luZGV4OiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlIH0gPSB7fTtcclxuICAgIC8qKiBJbmRpY2EgcXVhbmRvIGxhIGNhY2hlIGRlaSB0aCDDqCBzdGF0YSBmaWxsYXRhIGFsbWVubyBsYSBwcmltYSB2b2x0YSAqL1xyXG4gICAgcHJpdmF0ZSB0aHNDYWNoZVNldDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIFxyXG4gICAgICogRmxhZyBjaGUsIHNlICoqdHJ1ZSoqLCBwZXIgdW4gZ2lybyBkaSBiaW5kaW5nIG1hbnRpZW5lIGxhIHZpc2liaWxpdMOgIGltcG9zdGF0YSBsb2NhbG1lbnRlLCBwaXV0dG9zdG8gY2hlIGFsbGluZWFyZSBhbGxhIFZpZXcgYmluZGF0YS4gXHJcbiAgICAgKiBVc2F0YSBwZXIgbW9kaWZpY2FyZSBpbiBtYW5pZXJhIHByb2dyYW1tYXRpY2EgbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBkYWwgbWV0b2RvICoqc2V0SGVhZGVyVmlzaWJpbGl0eSoqLCBcclxuICAgICAqIFxyXG4gICAgICogRGlzY2xhaW1lcjogKipOT04gTU9ESUZJQ0FSRSoqXHJcbiAgICAgKiovXHJcbiAgICBwdWJsaWMgdXNlTG9jYWxWaXNpYmlsaXR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogT3B6aW9uaSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgcHVibGljIFBhZ2VyT3B0aW9uczogUGFnZXJJbmZvcyA9IG5ldyBQYWdlckluZm9zKClcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIGNsaWNrIGRlc3RybyBzdSB1bmEgcmlnYSBjb24gc2VsZXppb25lIGF0dGl2YTogVGlybyBmdW9yaSBpbCBjb250ZXh0IG1lbnUgZSBzZWxlemlvbmUgbCdlbGVtZW50byBjb3JyZW50ZVxyXG4gICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbiA9ICh0aGlzLkNvbnRleHRNZW51IHx8IHRoaXMudGFibGVFbXB0eU1lbnUpLm9wZW4uc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBHcnVwcGkgdmEgYmVuZSwgb2dnZXR0aSBwdXJlLCBtYSBzZXBhcmF0b3JpIGZyYSBncnVwcGkgcHJvcHJpbyBuby4uLlxyXG4gICAgICAgICAgICBpZiAodC5pdGVtLl9zZXApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaG91bGRFbWl0ID0gIXQuaXRlbS5fc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgICAgICB0Lml0ZW0uX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1TZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbl9ILmhhbmRsZUl0ZW1zU2VsZWN0aW9uKFt0Lml0ZW1dKTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvdWxkRW1pdClcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEFzc2VnbmF6aW9uZSBwZXIgdHV0dGkgZ2xpIElucHV0IGRpIGRlZmF1bHRcclxuICAgICAgICB0aGlzLkNvbHVtbnNSZXNpemFibGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29sdW1uc1Jlc2l6YWJsZSwgdGhpcy5kZWFmdWx0cz8uQ29sdW1uc1Jlc2l6YWJsZSk7XHJcbiAgICAgICAgdGhpcy5BdXRvVXBkYXRlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkF1dG9VcGRhdGUsIHRoaXMuZGVhZnVsdHM/LkF1dG9VcGRhdGUpO1xyXG4gICAgICAgIHRoaXMuQWxsU2VhcmNoID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkFsbFNlYXJjaCwgdGhpcy5kZWFmdWx0cz8uQWxsU2VhcmNoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkV4cG9ydCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5FeHBvcnQsIHRoaXMuZGVhZnVsdHM/LkV4cG9ydCk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmcsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmcsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmdDb3VudCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nQ291bnQsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmdDb3VudCk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nQnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nQnV0dG9ucywgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZ0J1dHRvbnMpO1xyXG4gICAgICAgIHRoaXMuQ29udGFpbmVyQ2xhc3MgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29udGFpbmVyQ2xhc3MsIHRoaXMuZGVhZnVsdHM/LkNvbnRhaW5lckNsYXNzLCAnJyk7XHJcbiAgICAgICAgdGhpcy5UYWJsZUNsYXNzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlRhYmxlQ2xhc3MsIHRoaXMuZGVhZnVsdHM/LlRhYmxlQ2xhc3MsICd0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLXNtJyk7XHJcbiAgICAgICAgdGhpcy5TZWxlY3Rpb24gPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2VsZWN0aW9uLCB0aGlzLmRlYWZ1bHRzPy5TZWxlY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuU2F2ZVByZWZlcmVuY2VzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNhdmVQcmVmZXJlbmNlcywgdGhpcy5kZWFmdWx0cz8uU2F2ZVByZWZlcmVuY2VzKTtcclxuICAgICAgICB0aGlzLlBhZ2luZ1N0eWxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlBhZ2luZ1N0eWxlLCB0aGlzLmRlYWZ1bHRzPy5QYWdpbmdTdHlsZSwgJ2JvdHRvbScpO1xyXG4gICAgICAgIHRoaXMuUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlLCB0aGlzLmRlYWZ1bHRzPy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlLCAnbGVmdCcpO1xyXG4gICAgICAgIHRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUsIHRoaXMuZGVhZnVsdHM/LlVzZVNlbGVjdGlvbkNhY2hlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMsIHRoaXMuZGVhZnVsdHM/LlNob3dJdGVtR3JvdXBzQ29sdW1ucywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSwgdGhpcy5kZWFmdWx0cz8uQXJyYXltb2RlSXRlbXNQZXJQYWdlLCAxNSk7XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zUGlubmFibGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29sdW1uc1Bpbm5hYmxlLCB0aGlzLmRlYWZ1bHRzPy5Db2x1bW5zUGlubmFibGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuRGVmYXVsdEFsaWdubWVudCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5EZWZhdWx0QWxpZ25tZW50LCB0aGlzLmRlYWZ1bHRzPy5EZWZhdWx0QWxpZ25tZW50LCAnTGVmdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIC8vIFNlIHV0aWxpenpvIGxhIG5ldyBzcGljeSBtb2RlIGRlZHVjbyB0dXR0aSBpIHBhcmFtZXRyaSBkaSBsYXZvcm8gcG9zc2liaWxpIGFsIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBWZW5nb25vIHNvdnJhc2NyaXR0ZSBzb2xvIGxlIHByb3ByaWV0w6Agbm9uIGltcG9zdGF0ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuICAgICAgICBsZXQgdXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgPSB0ZHNEICYmIHRkc0QubGVuZ3RoID4gMCAmJiB0aHNEICYmIHRoc0QubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgaGFzTm9Db250ZW50UHJvamVjdGlvbiA9ICF0aGlzLmJvZHlSZWYgJiYgIXRoaXMuaGVhZGVyUmVmICYmICF0aGlzLmhlYWRlckdyb3VwUmVmICYmICF0aGlzLnNlY29uZGFyeUhlYWRlckdyb3VwUmVmO1xyXG5cclxuICAgICAgICBpZiAodXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgfHwgaGFzTm9Db250ZW50UHJvamVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Vc2VDdXN0b21DZWxscyA9PSBudWxsKSB0aGlzLlVzZUN1c3RvbUNlbGxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuSGlkZGVuQ29sdW1ucyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuSGlkZGVuQ29sdW1ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNPcmRlcmluZyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuQ29sdW1uc09yZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuT3JkZXJCeUNvbHVtbiA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuT3JkZXJCeUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlbGVjdEFsbCA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNoaWZ0Q2xpY2sgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TaGlmdENsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5EaXJlY3RpdmVzQmFzZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QZXIgcG90ZXIgY2FtYmlhcmUgaWwgbGF5b3V0IGluIGJhc2UgYWwgbGl2ZWxsbyBnZXJhcmNoaWNvIGlsIGNvbXBvbmVudGUgZGV2YSBhdmVyZSBpbCBwaWVubyBjb250cm9sbG8gZGkgb2duaSBjZWxsYSxcclxuICAgICAgICAvL2NoZSBjb24gc29sbyBsYSBwcm9pZXppb25lIChzZW56YSBjZWxsZSBjdXNvdG0pIG5vbiDDqCBkaXNwb25pYmlsZVxyXG4gICAgICAgIGlmICh0aGlzLkhpZXJhcmNoeSAmJiAhdGhpcy5Vc2VDdXN0b21DZWxscylcclxuICAgICAgICAgICAgdGhyb3cgXCJFcy10YWJsZSBlcnJvcjogUGVyIHBvdGVyIHV0aWxpenphcmUgbCdlcy10YWJsZSBjb24gW0hpZXJhcmNoeV09XFxcInRydWVcXFwiIMOoIHJpY2hpZXN0byBhbmNoZSBbVXNlQ3VzdG9tQ2VsbHNdPVxcXCJ0cnVlXFxcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29weVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhc3RlU3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcylcclxuICAgICAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGxldCBuZXdTZWFyY2hWaWV3ID0gY2hhbmdlc1snU2VhcmNoVmlldyddO1xyXG4gICAgICAgIGlmIChuZXdTZWFyY2hWaWV3ICYmIHRoaXMuU2VhcmNoVmlldylcclxuICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50LCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY2hhbmdlZChjbGVhckl0ZW1zOiBib29sZWFuID0gZmFsc2UpIHsgXHJcbiAgICAgICAgaWYoY2xlYXJJdGVtcyAmJiB0aGlzLnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAoPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldykuaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5WaWV3KTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKG9iajogYW55LCB0aHJvdHRsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZpZXcgPSBvYmogPyBvYmogOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCAmJiB0aHJvdHRsZSkge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNhbGxUaW1lb3V0KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FsbFRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLndyaXRlVmFsdWUob2JqLCBmYWxzZSk7IH0sIHRoaXMuU2VhcmNoVGhyb3R0bGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gTWkgw6ggYXJyaXZhdGEgbCdBcHBTZWFyY2ggcXVpbmRpIGRpIHNpY3VybyBub24gaG8gdW5hIHJpY2VyY2EgaW4gcHJvZ3Jlc3NcclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuVmlldyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIC8vIFN1IHZpZXcgbnVsbGEgZXZpdG8gZGkgZmFyZSBwcmVzc29jaMOpIHF1YWxzaWFzaSBjb3NhLiBTZSBhcnJpdmEgdW4gbnVsbCBkZXZvIGFuY2hlIGFzc2ljdXJhcm1pIGRpIG5vbiBtb3N0cmFyZSBudWxsYVxyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBwZXIgc2JhZ2xpbyBsJ29nZ2V0dG8gY2hlIG1pIGFycml2YSBub24gw6ggdGlwaXp6YXRvIChpbnN0YW5jZW9mIEFwcFNlYXJjaCByZXN0aXR1aXNjZSBmYWxzZSBhbmNoZSBzZSDDqCBkZWwgdGlwbyBnaXVzdG8pXHJcbiAgICAgICAgLy8gbG8gY29ycmVnZ28tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdHlwZW9mICh0aGlzLlZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5TZWFyY2hWaWV3ICYmIHR5cGVvZiAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlNlYXJjaFZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpIHtcclxuICAgICAgICAgICAgLy8gU2UgY2FtYmlhIGwnb2dnZXR0byBpbnRlcm8gc2lnbmlmaWNhIGNoZSBobyByaW1hbmRhdG8gbGEgcmljZXJjYVxyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ3ZpZXcnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZyA9ICh0aGlzLlZpZXcucmVxdWVzdGVkZ3JvdXBzPy5sZW5ndGggfHwgMCkgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgcmljZXJjYSBpbnRlcm5hIG1hbnRlbmdvIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwcmVjZWRlbnRlIChxdWluZGkgc3UgY2FtYmlvIHBhZ2luYSwgY2FtYmlvIGlwcCwgZWNjLi4uKVxyXG4gICAgICAgICAgICAvLyBzZSBpbnZlY2UgbCd1dGVudGUgaGEgZmF0dG8gdW5hIHJpY2VyY2EgbHVpIChxdWluZGkgY2FtYmlhbmRvIGZpbHRyaSksIHNlY2NvIGxlIGluZm8gZGkgc2VsZXppb25lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5WaWV3LnNlbGVjdGlvbiB8fCAoIXRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgJiYgZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcpIHx8ICF0aGlzLlVzZVNlbGVjdGlvbkNhY2hlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIFByZWZlcmVuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgYXZlcmUgdW4gJ25hbWUnIHBlciBxdWVzdGEgdGFiZWxsYVwiKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnByZWZTZXJ2aWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGNoZSBpbCBwYWNjaGV0dG8gQGVzZmFlbnphL3ByZWZlcmVuY2VzIHNpYSBpbnN0YWxsYXRvXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZzID0gYXdhaXQgdGhpcy5wcmVmU2VydmljZS5nZXRJdGVtPHsgY29sdW1uczogc3RyaW5nW10sIGNvbHVtbl9vcmRlcmluZzogc3RyaW5nW10sIG9yZGVyczogQXBwT3JkZXJpbmdbXSB9Pig8c3RyaW5nPnRoaXMubmdDb250cm9sLm5hbWUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2kgbGEgZ2VudGUgc2kgbWV0dGEgYSBzcGFtbWFyZSByZWZyZXNoIGNvbiBuZ2lmIHN0cmFuaSBzdWxsJ2VzdGFibGUgY3JlYW5kb2xhIGUgZGlzdHJ1Z2dlbmRvbGEgTiB2b2x0ZSBhbCBzZWNvbmRvIG5lbCB0ZW1wbyBjaGUgY2kgbWV0dGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRpcmFyZSBzdSBsZSBwcmVmZXJlbmNlIGRhIHF1aSBzb3ByYSBsYSBWaWV3IHBvdHJlYmJlIGVzc2VyZSBjYW1iaWF0YVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRQcmVmcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBvc2l0b3J5OiBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zLm1hcCh0ID0+IHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5WaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgZGV2byBjb250cm9sbGFyZSBjaGUgdHV0dGUgbGUgY29sb25uZSBzYWx2YXRlIGZhY2NpYW5vIHBhcnRlIGRlbGxhIHZpc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0byBmYWNlbmRvIHJpZmVyaW1lbnRvIGEgdW5hIHZlcnNpb25lIHZlY2NoaWEgZGVsbCdlcy10YWJsZSwgcXVpbmRpIG5vbiBmYWNjaW8gb3BlcmF6aW9uaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIG1pIGJhc28gc3UgZGlyZXR0aXZlIG1hIG5lbGxlIHByZWZlcmVuY2Ugw6ggcHJlc2VudGUgYW5jaGUgc29sbyB1bmEgY29sb25uYSBub24gcHJlc2VudGUgbmVsbGUgZGlyZXR0aXZlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2dW9sIGRpcmUgY2hlIGwnZXMtdGFibGUgw6ggY2FtYmlhdGEgcXVpbmRpIG5vbiBpbXBvc3RvIHByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcG9zaXRvcnkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aHNDYWNoZVNldCAmJiAhdGhpcy50aHNDYWNoZVtyZXBvc2l0b3J5W2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1ucyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbl9vcmRlcmluZyA9IHByZWZzPy5jb2x1bW5fb3JkZXJpbmcgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBwcmVmIHNvbm8gbnVsbGUgbm9uIHNvdnJhc2NyaXZvIGdsaSBvcmRpbmkgZGF0byBjaGUgcG90cmViYmUgc2VydmlyZSBtZXR0ZXJlIGRlZ2xpIG9yZGluYW1lbnRpIGRpIGRlZmF1bHQgbGF0byB0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3Lm9yZGVycyA9IHByZWZzPy5vcmRlcnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIExhIHBhZ2luYXppb25lIGRldm8gZmFybGEgc29sYW1lbnRlIHF1YW5kbyByaWNoaWVkbyBvIHVuIGdydXBwbyBwcmluY2lwYWxlIChzZSBzb25vIGluIHJvdyBncm91cGluZykgbyBzZSBub24gcmljaGllZG8gZ3J1cHBpIChpbiB0dXR0aSBsZ2kgYWx0cmkgY2FzaSlcclxuICAgICAgICAgICAgaWYgKGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuVmlldy5wYWdlLCB0aGlzLlZpZXcucGFnZXMgfHwgMSwgdGhpcy5WaWV3Lml0ZW1zLmxlbmd0aCwgdGhpcy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5WaWV3ICYmICh0aGlzLlZpZXcubGVuZ3RoICE9IG51bGwgJiYgdGhpcy5WaWV3Lmxlbmd0aCAhPSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnYXJyYXknKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSB8fCAhdGhpcy5hcnJheW1vZGVTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgYWdnaW9ybm8gbGUgcHJlZmVyZW56ZSBzb2xvIHNlIGMnw6ggYWxtZW5vIHVuYSBjb2xvbm5hLCBhbHRyaW1lbnRpIHZ1b2wgZGlyZSBjaGUgc2kgcGFydGUgZGEgdnVvdGlcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb24gdHV0dGUgbGUgY29sb25uZSBkaXNwb25pYmlsaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucyAmJiAoc291cmNlPy5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZvY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbnRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgcGVyIGlsIGJvZHkgY2hlIGRvdnJlYmJlIGV2aXRhcmUgaWwgOTAlIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuICAgIHB1YmxpYyBib2R5VHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIGlkICovXHJcbiAgICBwdWJsaWMgaWRUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLmlkO1xyXG5cclxuICAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIFByb3BlcnR5TmFtZSAqL1xyXG4gICAgcHVibGljIFByb3BlcnR5TmFtZVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uUHJvcGVydHlOYW1lO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyBJRFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uSUQ7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBJRCAqL1xyXG4gICAgcHVibGljIHZhbFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0udmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgKHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0ZHNEID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5sZW5ndGggPT0gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUZHNEaXJlY3RpdmU/Lmxlbmd0aCA+IDAgPyB0aGlzLkVzVGFibGVUZW1wbGF0ZT8uVGVtcGxhdGU/LkVzVGRzRGlyZWN0aXZlIDogdGhpcy5Fc1Rkc0RpcmVjdGl2ZSA6IHRoaXMuRXNUZHNEaXJlY3RpdmU7XHJcbiAgICAgICAgbGV0IHRoc0QgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLmxlbmd0aCA9PSAwID8gdGhpcy5Fc1RhYmxlVGVtcGxhdGU/LlRlbXBsYXRlPy5Fc1Roc0RpcmVjdGl2ZT8ubGVuZ3RoID4gMCA/IHRoaXMuRXNUYWJsZVRlbXBsYXRlPy5UZW1wbGF0ZT8uRXNUaHNEaXJlY3RpdmUgOiB0aGlzLkVzVGhzRGlyZWN0aXZlIDogdGhpcy5Fc1Roc0RpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgbGV0IHRocyA9IHRoc0QgJiYgdGhzRC5sZW5ndGggPiAwID8gdGhzRC50b0FycmF5KCkgOiBbXTtcclxuICAgICAgICBsZXQgdGRzID0gdGRzRCAmJiB0ZHNELmxlbmd0aCA+IDAgPyB0ZHNELnRvQXJyYXkoKSA6IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gY29sb25uZSBkaW5hbWljaGUgbWEgc29ubyBpbiBtb2RhbGl0w6AgZGluYW1pY2EgKGxvIGNhcGlzY28gcGVyY2jDqSBjJ8OoIHVuYSB2aWV3IHBpZW5hIGRpIGdlbmVyaWNpdGVtKSBtZXR0byBpbCBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0guZXZlbnR1YWxseVJldmlld0R5bmFtaWNDb2x1bW5zKCk7XHJcblxyXG4gICAgICAgIC8vIEdlc3Rpc2NlIGxhIHJpY2hpZXN0YSBwZXIgZ3J1cHBpIG8gcGVyIHNpbmdvbGkgb2dnZXR0aVxyXG4gICAgICAgIHRoaXMuYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMoVmlldyk7XHJcblxyXG4gICAgICAgIC8vIFF1ZXN0byBkZXYnZXNzZXJlIHBlciBmb3J6YSBsYW5jaWF0byBkb3BvICoqYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHMqKiBkYXRvIGNoZSDDqCBsw6wgY2hlIGFsY3VuZSBjb3NlIHZlbmdvbm8gdmFsb3JpenphdGVcclxuICAgICAgICB0aGlzLnNldHVwUGFnaW5nSW5mb3JtYXRpb25zKCk7XHJcblxyXG4gICAgICAgIC8vIE1vbHRlIGNvc2Ugc29ubyBvdnZpYW1lbnRlIGRpc3BvbmliaWxpIHNvbG8gaW4gbW9kYWxpdMOgIFZpZXdcclxuICAgICAgICBpZiAoKHRoaXMudmlld01vZGUgfHwgdGhpcy5hcnJheU1vZGUpICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgbGV0IHZpZXcgPSB0aGlzLnZpZXdNb2RlID8gVmlldyBhcyBBcHBTZWFyY2g8YW55PiA6IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBpdGVtc0FuZEdyb3VwcyA9IHRoaXMudmlld01vZGUgPyBbLi4uKHZpZXcuaXRlbXMgfHwgW10pLCAuLi4odmlldy5ncm91cHMgfHwgW10pXSA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyB2aWV3LnNlbGVjdGlvbiA6IHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAvLyBOLkI6IFJpc3BldHRhcmUgbCdvcmRpbmUgZGkgcXVlc3RlIDMgbWFjcm9jYXRlZ29yaWUgw6ggVklUQUxFXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBTaXN0ZW1hemlvbmkgZGkgVEgsIFRELCBlIHZpc2liaWxpdMOgIHZhcmllICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gZGVmaW5pemlvbmkgZGluYW1pY2hlLCBwcmltYSBkaSBxdWFsc2lhc2kgYWx0cmEgY29zYSBkZXZvIHRyYXNmb3JtYXJsZSBpbiB0aC90ZCBpbiBtb2RvIGNoZSBwb2kgaWwgY29kaWNlIHF1aSBzb3R0byBmYWNjaWEgbGUgc3VlIG1hZ2llXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiR2VuZXJhdGluZyB0aHMgYW5kIHRkcyBmcm9tIER5bmFtaWMgZGVmaW5pdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmR5bmFtaWNNb2RlX0guZW1pdFRoc0FuZFRkc0Jhc2VkT25EeW5hbWljRGVmaW5pdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhzID0gcmV0LnRocztcclxuICAgICAgICAgICAgICAgIHRkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdlc3Rpb25lIGRlbGxlIHZpZXcgaW4gbW9kYWxpdMOgIHJlcG9ydCwgaSB0aCBlIGkgdGQgdmVuZ29ubyByaWdlbmVyYXRpIGRhbGxlIGNvbmZpZ3VyYXppb25pIGRlbGxhIHZpZXdcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFycmF5TW9kZSAmJiB2aWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJHZW5lcmF0aW5nIHRocyBhbmQgdGRzIGZyb20gcmVwb3J0IHJlc3VsdHNcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5yZXBvcnRNb2RlX0guZ2VuZXJhdGVUaHNBbmRUZHNGcm9tVmlldyh2aWV3KTtcclxuICAgICAgICAgICAgICAgIHRocyA9IHJldC50aHM7XHJcbiAgICAgICAgICAgICAgICB0ZHMgPSByZXQudGRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBFc3BhbmRvIGkgdGggZSBpIHRkIG11bHRpcGxpIGR1cGxpY2FuZG9saVxyXG4gICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV4cGFuZE11bHRpVGhzQW5kVGRzKHRocywgdGRzLCBpdGVtc0FuZEdyb3Vwcyk7XHJcbiAgICAgICAgICAgIHRocyA9IHJldC5leHBUaHM7XHJcbiAgICAgICAgICAgIHRkcyA9IHJldC5leHBUZHM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZW5lcm8gbGEgY2FjaGUgZGVpIHRoIGRhIHVzYXJlIGRhIHF1aSBpbiBwb2ksIGRvcG8gYXZlcmdsaSBsYXNjaWF0byBmYXJlIGxlIHN1ZSBjb3NlIGluIGNhc28gY2kgc2lhbm8gZGVpIG11bHRpIG8gZGVpIHJlcG9ydFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnRoc0NhY2hlU2V0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFByZXBhc3NhZ2dpbyBwZXIgdGlyYXJlIGZ1b3JpIHR1dHRlIGxlIGluZm8gdXRpbGkgc3VnbGkgaGVhZGVycyBpbiBtb2RvIGRhIG5vbiByaWNhY29sYXJzZWxpIHNlbXByZSBkb3BvXHJcbiAgICAgICAgICAgIGxldCBoSSA9IHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZUhlYWRlcnNHcm91cGluZ0luZm9zKHRocyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYXJyYXkgbm9uIGhvIHVuIGJhY2tlbmQuLi5cclxuICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5hcnJheU1vZGVSZXZpZXdHcm91cGluZ3MoaEkubGVhZnMpOyAgLy8gLi4uIGkgcmFnZ3J1cHBhbWVudGkgbGkgZGV2byBmYXJlIGxhdG8gY2xpZW50XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmV2aWV3Q29sdW1uc0xpc3QoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAvLyBBZ2dpb3JuYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlIG5lbGxhIGRpYWxvZyBwZXIgb3JkaW5hbWVudG8gZWNjXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldyk7ICAgICAgICAgICAgICAgICAgIC8vIFNlIHN0byBjYXJpY2FuZG8gdW5hIFZpZXcgZGEgaG90cG90YXRvIChxdWluZGkgY29uIHNhdmVkc3RhdGUgPSB0cnVlKSByaWFsbGluZW8gbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBlIGlsIGxvcm8gb3JkaW5lLlxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gubW92ZUZpeGVkQ29sdW1uc0F0VGhlQmVnaW5uaW5nKGhJLmxlYWZzLCB0ZHMpOyAgICAvLyBTcG9zdG8gdHV0dGUgbGUgY29zZSBmaXhlZCBhbGwnaW5pemlvIGluIG1vZG8gY2hlIGxhIGNyZWF6aW9uZSBkaSB0aCBlIHRkIHNpYSBwacO5IHNuZWxsYSAoVXRpbGl6emEgbGUgQ29sdW1uc0xpc3QsIHF1aW5kaSBkZXYnZXNzZXJlIHJpY2hpYW1hdGEgUElSTUEgZGkgcmV2aWV3Q29sdW1uc0xpc3QpXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkhlYWRlcnNPcmRlcmluZyhoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgIC8vIEFsbGluZW8gZ2xpIG9yZGluYW1lbnRpIGFnbGkgaGVhZGVyXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkoaEkubGVhZnMsIHRkcywgdmlldyk7ICAgIC8vIExhdm9ybyBzdWkgVEggZWQgZXZlbnR1YWxtZW50ZSBtb2RpZmljbyBsYSB2aXNpYmlsaXTDoCBhbmNoZSBkZWkgVEQuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpOyAgICAgICAgICAgICAgICAgICAgIC8vIFNlIHNvbm8gcHJlc2VudGkgY29sb25uZSBwaW5uYXRlIHZhbHV0YSBsYSBkaW1lbnNpb25lIGRlbCBjb250ZW5pdG9yZVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZ2VuZXJhdGVEZWZhdWx0T3JkZXIoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAvLyBHZW5lcm8gbGUgZGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvLCBjaGUgc2lhbm8gZGVmYXVsdCBvIGRlcml2YW50aSBkYWxsYSBBcHBTZWFyY2hcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyR3JvdXBzKGhJKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdXRvIGkgcmFnZ3J1cHBhbWVudGkgZGVnbGkgaGVhZGVyIHNlIHByZXNlbnRpXHJcblxyXG4gICAgICAgICAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICBHZW5lcmF6aW9uZSBiaW5kaW5nIHBlciByaWdoZSBlIGNvbG9ubmUgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGhzKGhJLmxlYWZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYWNjb2xnbyBpIFRIXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUZHMoaEkubGVhZnMsIHRkcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbiwgZW1pdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGFsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuU2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW1wb3NzaWJpbGUgaW1wb3N0YXJlIGxhIHNlbGV6aW9uZSBjb24gbCdhbGwgc2VsZWN0aW9uIHF1YW5kbyBsJ0lucHV0IFNlbGVjdEFsbCDDqCBmYWxzZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHNpID0gKHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55Pik/LnNlbGVjdGlvbiB8fCB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgLy9zZSBkZXNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgYWQgYWxsIG8gc2Ugc2VsZXppb25vIGNvbiBhdHR1YWxlIHNlbGV6aW9uZSBtYW51YWxlIGRldm8gcmljaGlhbWFyZSBsYSAqKnNlbGVjdEFsbE9yUmVzZXRTZWxlY3Rpb24qKlxyXG4gICAgICAgICAgICBpZiAoKHNpLmFsbCAmJiAhc2VsZWN0KSB8fCAoIXNpLmFsbCAmJiBzZWxlY3QpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIGlmIChlbWl0KVxyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIHVuIGhhcmQgcmVzZXQgZGVsbGEgc2VsZXppb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldFNlbGVjdGlvbihlbWl0OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICYmIHRoaXMuVmlldykge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZWN0aW9uID0gbmV3IEl0ZW1zU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgaWYgKGVtaXQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuVmlldy5zZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgIGlmIChlbWl0KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLmFycmF5bW9kZVNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dURHMgPSB7fTtcclxuICAgICAgICAvLyBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgcGVybWV0dGVybWkgZGkgaW5zZXJpcmUgdHV0dGUgbGUgY29sb25uZSBcIkZpeGVkXCIgZGF2YW50aVxyXG4gICAgICAgIGxldCBjb250ZXh0Rml4ZWRzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN0eCA9IGl0ZW0uX2hhc2g7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGQudGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aGlzLnRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZDogY29sdW1uc0NhY2hlW3RkLnRkXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSGVhZGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0ZC50ZENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbkNsYXNzOiB0ZC50ZEljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkZpZWxkOiB0ZC50ZENvbmRpdGlvbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWU6IHRkLnRkQ29uZGl0aW9uVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGQudGRUaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQ6IHRkLnRkQ29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aENhc3RlZC50aEdyb3VwICYmICF0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA/IG51bGwgOiB0ZC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpOiB0ZC5fbXVsdGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlJbmRleDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVsxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0ZC50ZEFsaWdubWVudCB8fCB0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHRkLnRkRm9ybWF0IHx8IHRoLnRoRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlOiB0aC50aFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZTogdGgudGhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlUGF0aDogKDxhbnk+dGhDYXN0ZWQpLnRoUm91dGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVQYXJhbWV0ZXJQcm9wZXJ0aWVzOiAoPGFueT50aENhc3RlZCkudGhSb3V0ZVBhcmFtZXRlclByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGRFbGVtZW50PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNDYWNoZVt0ZC50ZF0ucGlubmVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoQ2FzdGVkLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEhlYWRlcjogdGhDYXN0ZWQudGhHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246ICEhdGhDYXN0ZWQudGhBZ2dyZWdhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc2libGU6IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENhc3RlZC50aEdyb3VwQ2xhc3MgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aGlzLnJvd0dyb3VwaW5nX0guZ2V0R3JvdXBDZWxsRGlzcGxheSg8R3JvdXA+aXRlbSwga2V5LCA8RXNUaERpcmVjdGl2ZT50aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVE1QUm93VERzW2N0eF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XS5wdXNoKGl0ZW1Ub0FkZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJvd0NvbnRleHRzLnB1c2goY3R4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XSA9IFtpdGVtVG9BZGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Rml4ZWRzW2N0eF0gPSBpc0ZpeGVkID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gb2dnZXR0aSDDqCBpbnV0aWxlIGNoZSBjb250cm9sbG8gZ2xpIGVycm9yaSwgZGF0byBjaGUgZ2xpIGVzLXRkIG5vbiBlc2lzdGVyYW5ubyBkaSBjZXJ0byBlIGRpIGNvbnNlZ3VlbnphIGdsaSBlcy10aCBub24gc2FyYW5ubyByZWZlcmVuemlhdGlcclxuICAgICAgICBpZiAodGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgZXJyczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGlmICghdGguX3JlZmVyZW5jZWQpXHJcbiAgICAgICAgICAgICAgICBlcnJzLnB1c2godGgudGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZXJySWRzID0gZXJycy5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aHJvdyBcIkwnSUQgZGkgdW5vIG8gcGnDuSBFc1RoIG5vbiBoYW5ubyBhbGN1biBFc1RkIGFzc29jaWF0bzogXCIgKyBlcnJJZHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFydGVuZG8gZGFnbGkgKipFc1RocyoqIGJpbmRhdGkgZ2VuZXJhLCBhbGwnaW50ZXJubyBkZWwgZGl6aW9uYXJpbyAqKlRNUFJvd1RIcyoqIHR1dHRpIGkgY29udGVzdGkgZGVpIHZhcmkgb2dnZXR0aS5cclxuICAgICAqXHJcbiAgICAgKiBWZW5nb25vIGVzY2x1c2kgaSBUSCBcIkludGVybmlcIiBpbiBxdWFudG8gdmVuZ29ubyBnZW5lcmF0aSBkYWdsaSBvcmlnaW5hbGkgcXVpbmRpIGluY2x1ZGVybGkgdm9ycmViYmUgZGlyZSByaWVmZmV0dHVhcmUgbGUgb3BlcmF6aW9uaSBkdWUgdm9sdGVcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMSBzY2FuIEVzVGhzICsgMSBzY2FuIENvbHVtbnNMaXN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVJvd1Rocyh0aHM6IEVzVGhEaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNMaXN0Q2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RhYmxlQ29sdW1uIH0gPSB7fTtcclxuICAgICAgICBsZXQgY2FzdGVkVmlldyA9IDxBcHBTZWFyY2g8YW55Pj50aGlzLlZpZXc7XHJcbiAgICAgICAgbGV0IGdyb3VwaW5nc1VuZGVmaW5lZCA9IHRoaXMudmlld01vZGUgJiYgKGNhc3RlZFZpZXcgJiYgIWNhc3RlZFZpZXcuZ3JvdXBpbmdzIHx8IGNhc3RlZFZpZXcuZ3JvdXBpbmdzLmxlbmd0aCA9PSAwKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkNvbHVtbnNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdG0gPSB0aGlzLkNvbHVtbnNMaXN0W2ldO1xyXG4gICAgICAgICAgICBjb2x1bW5zTGlzdENhY2hlW2l0bS5pZF0gPSBpdG1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuVE1QUm93VEhzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBsZXQgdG9BZGQ6IFRoRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aC50aElmIHx8IHRoLnRoR3JvdXApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGhDbGFzcyA9ICh0aC50aENsYXNzIHx8IFwiXCIpICsgKHRoLnRoU2hyaW5rID8gXCIgYXBwLWNvbC1taW5cIiA6IFwiXCIpICsgKHRoLnRoR3JvdXAgPyBcIiBlc3QtY29sLW1pblwiIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNMaXN0Q2FjaGVbdGgudGhdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICBGaXhlZDogdGgudGhGaXhlZCxcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGgudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBJRDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogdGgudGhWaXNpYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyOiB0aC50aE9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyYWJsZTogdGgudGhPcmRlcmFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGU6IHRoLlRlbXBsYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIEFsaWdubWVudDogKHRoLnRoQWxpZ25tZW50IHx8IHRoaXMuRGVmYXVsdEFsaWdubWVudCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBub24gw6ggbmVzc3VuIGNvbnRlbnV0byBuw6kgbmVzc3VuIHRlbXBsYXRlIG1vc3RybyBzZW1wbGljZW1lbnRlIGwnSUQgZGVsbCdoZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aC50aFN0YXRpY0NvbnRlbnQgIT0gbnVsbCA/IHRoLnRoU3RhdGljQ29udGVudCA6IHRoLlRlbXBsYXRlID8gJycgOiB0aC50aCxcclxuICAgICAgICAgICAgICAgICAgICBXcmFwOiB0aC50aFdyYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGgpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGgpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aTogdGguX211bHRpLFxyXG4gICAgICAgICAgICAgICAgICAgIE11bHRpQ29udGVudDogdGguX211bHRpX2NvbnRlbnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1RIcy5wdXNoKHRvQWRkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZSBobyB1biBtb2RlbGxvIGNoZSBkZXZlIGZ1bnppb25hcmUgYSByb3dncm91cGluZyBtYSBub24gw6ggYW5jb3JhIHN0YXRhIGVmZmV0dHVhdGEgbmVzc3VuYSByaWNlcmNhIHN1aSBncnVwcGkgcHJpbmNpcGFsaSAoZ3JvdXBpbmdzVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgLy8gbGkgZ2VuZXJvIGUgbWFuZG8gbGEgcHJpbWEgcmljZXJjYSBjaGUgZGV2J2Vzc2VyZSBzcGVkaXRhIGFsIGJhY2tlbmQgcGVyIGlsIHByaW1vIGNhcmljYW1lbnRvIGRlaSBncnVwcGlcclxuICAgICAgICAgICAgICAgIGlmIChncm91cGluZ3NVbmRlZmluZWQgJiYgKHRoLnRoQWdncmVnYXRpb24gfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBBZ2dyZWdhdGlvbnM6IEdyb3VwT3JBZ2dyZWdhdGlvbltdID0gdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQWdncmVnYXRpb25zKHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc3RlZFZpZXcuZ3JvdXBpbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWRWaWV3Lmdyb3VwaW5ncyA9IGdyb3VwQWdncmVnYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MucHVzaCguLi5ncm91cEFnZ3JlZ2F0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kaWV0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYWdlciBFbGVtZW50byBkaSBzZXBhcmF6aW9uZSBzdSBjdWkgw6ggZWZmZXR0dWF0YSBsYSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRUb1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZUdyb3VwKHBhZ2VyLnZpZXcucGFnZSArIHBhZ2UsIHBhZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGFsbGEgcGFnaW5hIHNwZWNpZmljYXRhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gcGFnZXIudmlldztcclxuICAgICAgICBpZiAocGFnZSA9PT0gMCB8fCAocGFnZSA+IGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgJiYgYXBwU2VhcmNoRWxlbWVudC5wYWdlcyA+IDApKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGFwcFNlYXJjaEVsZW1lbnQucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgcGFnZXIuYnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlLCBhcHBTZWFyY2hFbGVtZW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSBzb2xvIHBlciBsZSByaWdoZSBhIGdydXBwby4gXHJcbiAgICAgKiBPIHJpbXVvdmUgZ2xpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIHByZXNlbnRpIG8gY2FyaWNhIGlsIGNvbnRlbnV0byBkZWwgZ3J1cHBvXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGdyb3VwIEdydXBwbyBiaW5kYXRvIHN1IGN1aSBzaSDDqCBlZmZldHR1YXRvIGlsIGNsaWNrXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGwnb3BlcmFpem9uZSDDqCBhbmRhdGEgYSBidW9uIGZpbmUsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVHcm91cENsaWNrKGdyb3VwOiBHcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYXN0ZWQgPSB0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAgICAgbGV0IGFueUcgPSAoPGFueT5ncm91cCk7XHJcbiAgICAgICAgYW55Ry5fZXhwYW5kZWQgPSAhYW55Ry5fZXhwYW5kZWQ7XHJcblxyXG4gICAgICAgIC8vIFNvbm8gaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvIHZpcnR1YWxlIGRhIGFycmF5OiBFc3BhbmRlcmUgc2lnbmlmaWNhIHJlbmRlcmUgdmlzaWJpbGkgdHV0dGkgZ2xpIG9nZ2V0dGkgcmVsYXRpdmkgYSBxdWVzdG8gZ3J1cHBvLCB2aWNldmVyc2EgaWwgY29udHJhcnJlXHJcbiAgICAgICAgaWYgKHRoaXMuQXJyYXlHcm91cGluZykge1xyXG4gICAgICAgICAgICBsZXQgYWxsUmVsYXRpdmVzID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PlxyXG4gICAgICAgICAgICAgICAgKHQuX2dyb3VwICYmICgoYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ICYmIHQuX3BhcmVudC5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpIHx8XHJcbiAgICAgICAgICAgICAgICAodC5faXRlbSAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3RoaXNLZXkgPT0gYW55Ry5fdGhpc0tleSkgfHwgKCFhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5LnN0YXJ0c1dpdGgoYW55Ry5fdGhpc0tleSkpKSkpXHJcbiAgICAgICAgICAgIGFsbFJlbGF0aXZlcy5mb3JFYWNoKHQgPT4geyB0Ll92aXNpYmxlID0gYW55Ry5fZXhwYW5kZWQ7IGlmICh0Ll9ncm91cCkgdC5fZXhwYW5kZWQgPSBmYWxzZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFueUcuX2V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIC8vIFJlc2V0dG8gaXBwXHJcbiAgICAgICAgICAgIGNhc3RlZC5pdGVtc3BlcnBhZ2VvdmVycmlkZSA9IDE1O1xyXG4gICAgICAgICAgICBpZiAoIWNhc3RlZC5yZXF1ZXN0ZWRncm91cHMpXHJcbiAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW25ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKV07XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxldmVsID0gYW55Ry5fZ3JvdXBsZXZlbDtcclxuICAgICAgICAgICAgICAgIC8vIHNlIGlsIGdydXBwbyBjbGljY2F0byBub24gaGEgdW4gbGl2ZWxsbyDDqCBpbCBwcmltbyBncnVwcG8sIHF1aW5kaSBvcmRpbmFtZW50byB1bmljb1xyXG4gICAgICAgICAgICAgICAgLy8gYWx0cmltZW50aSBkZXZvIHJpbXVvdmVyZSB0dXR0aSBpIGZpbHRyaSBzdSBsaXZlbGxpIHN1cGVyaW9yaSBhbCBsZXZlbCBjbGljY2F0byBlIGFnZ2l1bmdlcmUgaWwgbGV2ZWwgY2xpY2NhdG9cclxuICAgICAgICAgICAgICAgIGlmICghbGV2ZWwpXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGFueUcuX3BhcmVudFJvdXRlLmZvckVhY2goKHN0ZXA6IEdyb3VwUm91dGVGcmFnbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzLnB1c2gobmV3IEdyb3VwRmlsdGVyKHN0ZXAuY29sdW1uLCBzdGVwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHBhdGggPSAoYW55Ry5fcGFyZW50IHx8ICcnKSArIGdyb3VwLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gY2hpdXNvIHVuIGdydXBwbyBub24gbWkgc2VydmUgcmllZmZldHR1YXJlIHJpY2VyY2UsIG1pIGJhc3RhIGVsaW1pbmFyZSBkYWdsaSBvZ2dldHRpIGJpbmRhdGkgdHV0dGkgZ2xpIGVsZW1lbnRpIHNvdHRvc3RhbnRpIGEgcXVlbCBncnVwcG9cclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX3BhcmVudCB8fCAhdC5fcGFyZW50LnN0YXJ0c1dpdGgocGF0aCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gZGV2byBwZXLDsiBhbmNoZSByaW11b3ZlcmUgZXZlbnR1YWxpIGNhY2hlIHJlbGF0aXZlXHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlID0gdGhpcy5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gdC5wYXRoICE9IHBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlzY2UgbGEgc2VsZXppb25lIGdsb2JhbGUgZGVnbGkgb2dnZXR0aSwgc2lhIHBlciBwYWdpbmEgY2hlIGEgbGl2ZWxsbyBkaSAqKlNlbGVjdEFsbCoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWwgVmFsb3JlIGZvcnphdG8gZGkgY2hlY2sgZGEgYXNzZWduYXJlIGFnbGkgb2dnZXR0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2tDaGFuZ2VkKGZvcmNlZFZhbDogYm9vbGVhbiA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuXHJcbiAgICAgICAgLy8gUHJlbmRvIHR1dHRpIGdsaSBlbGVtZW50aSBwcmVzZW50aSBpbiBxdWVzdGEgdmlzdGEuIFNlIGhvIGdydXBwaSBwcmVuZG8gc29sbyBpIGdydXBwaSBhIGxpdmVsbG8gMCwgYWx0cmltZW50aSBwcmVuZG8gdHV0dGkgZ2xpIG9nZ2V0dGkgcGVyIHNlbGV6aW9uYXJsaVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmluZCh0ID0+IHQuX2dyb3VwKSA/IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gdC5fZ3JvdXAgJiYgIXQuX3BhcmVudCkgOiB0aGlzLmJvdW5kU291cmNlO1xyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgZm9yY2VkVmFsLCB0aGlzLmdsb2JhbENoZWNrKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogR2VzdGlzY2UgaSBjbGljayBzdWxsYSB0YWJlbGxhLCBnZXN0ZW5kbyBldmVudHVhbG1lbnRlIGFuY2hlIGdsaSBTaGlmdCArIENsaWNrIHBlciBzZWxlemlvbmFyZSB1biByYW5nZSBkaSBvZ2dldHRpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50IEV2ZW50byBuYXRpdm8gSFRNTCBkZWwgY2xpY2tcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2xpY2soZXZlbnQ6IGFueSwgaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkaXRlbXM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIHRoaXMuU2hpZnRDbGljayAmJiAhdGhpcy5TaW5nbGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy51dGlFeHRzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX2dyb3VwICYmICF0Ll9zZXApO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaCh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmICFzdGFydFNlbGVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmIHN0YXJ0U2VsZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtLl9zZWxlY3RlZCA9ICFpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oc2VsZWN0ZWRpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kZWl0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyA/IHRoaXMuTWFpbkdyb3VwVmlldyA6IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZSgoKHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3KT8ucGFnZSB8fCAwKSArIHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogKHRoaXMuYXJyYXlNb2RlID8gdGhpcy5TZWFyY2hWaWV3IDogdGhpcy5WaWV3KTtcclxuICAgICAgICBpZiAoIXZpZXcucGFnZSB8fCAhdmlldy5wYWdlcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgY291bnQgPSAodmlldy5pdGVtcy5sZW5ndGggfHwgdmlldy5ncm91cHM/Lmxlbmd0aCB8fCAwKTtcclxuICAgICAgICBsZXQgaXBwID0gdmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSB8fCAxNTtcclxuICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzLCBjb3VudCwgaXBwKTtcclxuXHJcbiAgICAgICAgbGV0IGhhc0dyb3VwaW5ncyA9ICEhdGhpcy5NYWluR3JvdXBWaWV3O1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGhhc0dyb3VwaW5ncyA/IHZpZXcgOiB0aGlzLlNlYXJjaFZpZXcgPyB0aGlzLlNlYXJjaFZpZXcgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKlxyXG4gICAgICogcGVyIGNvbXVuaWNhcmUgYWwgY29tcG9uZW50ZSBjaGUgdXRpbGl6emEgcXVlc3RhIHRhYmVsbGEgY2hlIGkgZGF0aSBzb25vIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbXNQZXJQYWdlQ2hhbmdlZChuZXdJcHApIHtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLk1haW5Hcm91cFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gUXVlc3RvIHNlY29uZG8gbWUgc2kgcHXDsiBwb3J0YXJlIGEgbGl2ZWxsbyB1biBwbycgcGnDuSBhbHRvXHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoVmlldy5wYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLlNlYXJjaFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKiBjb24gbGEgdmlzdGEgZGVsIHNlcGFyYXRvcmUgKi9cclxuICAgIHB1YmxpYyBvbkdyb3VwSXRlbXNQZXJQYWdlQ2hhbmdlZChwYWdlcjogR3JvdXBQYWdlciwgbmV3SXBwOiBudW1iZXIpIHtcclxuICAgICAgICBwYWdlci52aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgcGFnZXIudmlldyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGxhIG1vZGlmaWNhIGRlbCB0ZW1wbyBzcGVjaWZpY2F0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIS9eWzEtOV1cXGQqJC8udGVzdCh0aGlzLnNlY29uZHMpKVxyXG4gICAgICAgICAgICB0aGlzLnNlY29uZHMgPSAnMTAnO1xyXG5cclxuICAgICAgICBsZXQgc2Vjb25kc0luTXMgPSBwYXJzZUludCh0aGlzLnNlY29uZHMsIG51bGwpICogMTAwMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7IH0sIHNlY29uZHNJbk1zKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hpYW1hdG8gZGFsIGNsaWNrIHN1IHVuYSBkZWxsZSBjb2xvbm5lIGdlbmVyYXRlIGRhbGwnSW5wdXQgKipEeW5hbWljT3BlcmF0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gTCdvZ2dldHRvIHN1IGN1aSB2YSBlZmZldHR1YXRhIGwnb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9waWQgQ29kaWNlIGlkZW50aWZpY2F0aXZvIGRlbGwnb3BlcmF6aW9uZSBkYSBlZmZldHR1YXJzaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHluYW1pY09wZXJhdGlvbihpdGVtOiBhbnksIG9waWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25EeW5hbWljT3BlcmF0aW9uLmVtaXQoeyBpZDogb3BpZCwgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbGEgY2VsbGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBpbCBURCBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVzVGQoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRXNUZCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUuZmluZCgoaXRlbSkgPT4gbmFtZSA/IGl0ZW0udGQgPT09IG5hbWUgOiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFc1RkKVxyXG4gICAgICAgICAgICBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVzVGQgPyBFc1RkLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnZWRpdG9yIEVzVGQgZGEgdXRpbGl6emFyZSBwZXIgbGEgY29sb25uYSBzcGVjaWZpY2F0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgcGVyIGN1aSBjZXJjYXJlIGwnZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb21lIGRpcmV0dG8gcGVyIGNlcmNhcmUgbCdFZGl0b3IgY29uIGwnSUQuIFF1ZXN0YSB2YXJpYWJpbGUgaGEgcHJpb3JpdMOgIHJpc3BldHRvIGEgKipjb2x1bW4qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZWY8YW55Pn0gVGVtcGxhdGUgZGEgdXNhcmUgcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRFZGl0b3IoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRWRpdG9yID0gdGhpcy5Fc1RkRWRpdG9yRGlyZWN0aXZlcy5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS5lZGl0b3IgPT09IG5hbWUgOiBpdGVtLmVkaXRvckZvclByb3BlcnR5ID09PSBjb2x1bW4pO1xyXG4gICAgICAgIC8vIE5hbWUgbm9uIHRyb3ZhdG8sIGZhbGxiYWNrIGFsIG5vbWUgZGVsbGEgY29sb25uYVxyXG4gICAgICAgIGlmIChuYW1lICYmIGNvbHVtbiAmJiAhRWRpdG9yKVxyXG4gICAgICAgICAgICBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVkaXRvciA/IEVkaXRvci5UZW1wbGF0ZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqYWRkVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5QWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZSh0aGlzLmFycmF5bW9kZVBhZ2UgKyBwYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXF1aXZhbGVudGUgZGVsIG1ldG9kbyAqKmdvVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheUdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IHBhZ2UgPiB0aGlzLmFycmF5bW9kZVBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hcnJheW1vZGVQYWdlID0gcGFnZTtcclxuXHJcbiAgICAgICAgLy8gUmlmb3J6byBpbCB3cml0ZXZhbHVlIGluIG1vZG8gY2hlIGlsIGNvZGljZSBwYXNzaSBkYWxsYSBnZXN0aW9uZSBjb21lIHNlIGZvc3NlIGZhdHRhIHJpcGFydGlyZSB1bmEgcmljZXJjYVxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aW9uZSBkZWkgY2xpY2sgc3VsbGUgb3B6aW9uaSBkZWwgbWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSBnZW5lcmF0byBkYWxsJ0lucHV0ICoqQ29ybmVyTWVudU9wdGlvbnMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JuZXJpZCBDb2RpY2UgZGVsbCdvcGVyYXppb25lIHNlbGV6aW9uYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3JuZXJBY3Rpb25DbGlja2VkKGNvcm5lcmlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uQ29ybmVyQWN0aW9uLmVtaXQoeyBpZDogY29ybmVyaWQsIGVzdGFibGU6IHRoaXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YXppb25lIG1vZGFsaXTDoCBkZWxsJ0VzVGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICd2aWV3JyB8ICdyZXBvcnQnfSBtb2RlIE1vZGFsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHByaXZhdGUgc2V0TW9kZShtb2RlOiAnYXJyYXknIHwgJ3ZpZXcnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGUgPT0gJ3ZpZXcnO1xyXG4gICAgICAgIHRoaXMuYXJyYXlNb2RlID0gbW9kZSA9PSAnYXJyYXknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBlZmZldHR1YXJlIGNoaWFtYXRlIGludGVybmUgZGkgYWxsaW5lYW1lbnRvIGFsbGEgZnVuemlvbmUgKip3cml0ZVZhbHVlKiosIFxyXG4gICAgICogaW1wb3N0YW5kbyBwcmltYSAqKmludGVybmFsV3JpdGVDYWxsKiogaW4gbW9kbyBkYSBub24gZWZmZXR0dWFyZSBvcGVyYXppb25pIGludXRpbGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsV3JpdGVWYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyBldmVudHVhbG1lbnRlIHJpY2hpYW1hYmlsZSBhbmNoZSBkYWwgY29tcG9uZW50ZSBlc3Rlcm5vIGNoZSBwZXJtZXR0ZSBkaSBmb3J6YXJlIHVuIHJlZnJlc2ggZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgcHVibGljIGZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgVmlldyB2aWVuZSBtYW50ZW51dG8gaW4gYXV0b21hdGljbyBpbCBudW1lcm8gZGkgcGFnaW5hLCBtYSBwZXIgbGEgbW9kYWxpdMOgIGFycmF5IGRldm8gcHJlbmRlcmUgbGUgaW5mbyBkaSBwYWdpbmF6aW9uZSBwcmltYSBlIHJpYXBwbGljYXJsZSBkb3BvXHJcbiAgICAgICAgbGV0IGFycmF5UGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBhcnJheUlwcDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBhcnJheVBhZ2UgPSB0aGlzLmFycmF5bW9kZVBhZ2U7XHJcbiAgICAgICAgICAgIGFycmF5SXBwID0gdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighcmVsYXVuY2hTZWFyY2ggJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IGFycmF5SXBwO1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5R29Ub1BhZ2UoYXJyYXlQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YSBsYSB2aXNpYmlsaXTDoCBkaSB1biBoZWFkZXIgZSBkaSBldmVudHVhbGkgaGVhZGVyIGNvbGxlZ2F0aSBzZSBxdWVzdG8gaGVhZGVyIMOoIHVuIGdydXBwbywgZG9wb2RpY2jDqSBhZ2dpb3JuYSBsJ2VzLXRhYmxlIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBPckhlYWRlciBIZWFkZXIgZGkgY3VpIHNldHRhcmUgbGEgdmlzaWJpbGl0w6BcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJpbGl0eSBWaXNpYmlsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyBzZXRIZWFkZXJWaXNpYmlsaXR5KGdyb3VwT3JIZWFkZXI6IHN0cmluZywgdmlzaWJpbGl0eTogYm9vbGVhbiwgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUsIHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBncm91cE9ySGVhZCA9IHRoaXMudGhzQ2FjaGVbZ3JvdXBPckhlYWRlcl07XHJcbiAgICAgICAgaWYgKCFncm91cE9ySGVhZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBncm91cE9ySGVhZC50aFZpc2libGUgPSB2aXNpYmlsaXR5O1xyXG5cclxuICAgICAgICBsZXQgdGhzQXJyID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzQXJyW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ID09IGdyb3VwT3JIZWFkZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclZpc2liaWxpdHkodGgudGgsIHZpc2liaWxpdHksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlTG9jYWxWaXNpYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2gocmVsYXVuY2hTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkYkNsaWNrRWRpdE9yU2luZ2xlQ2xpY2tSb3dTZWxlY3Rpb24oJGV2ZW50OiBNb3VzZUV2ZW50LCByb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG5cclxuICAgICAgICAvLyBQcmltYSBjb3NhIGRhIGZhcmUgw6ggY29udHJvbGxhcmUgc2UgY2kgc29ubyBkZWkgcmFuZ2UgbGFzY2lhdGkgZGEgb3BlcmF6aW9uaSBwcmVjZWRlbnRpIChzZSBhcHBsaWNhYmlsZSkgZSByaXB1bGlybGlcclxuICAgICAgICBpZiAodGhpcy5yYW5nZVNlbGVjdGVkICYmICEkZXZlbnQuY3RybEtleSAmJiB0aGlzLlNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJjbGVhcmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJoYW5kbGluZyBkb3VibGVjbGljayBvbiBlZGl0YWJsZSBjZWxsOiBcIiArIChyb3dJdGVtLlByb3BlcnR5TmFtZSA/ICdlZGl0IG1vZGUgZm9yIHByb3BlcnR5ICcgKyByb3dJdGVtLlByb3BlcnR5TmFtZSA6ICdubyBwcm9wZXJ0eSBzZXQsIGZhbGxiYWNrIHRvIHNpbXBsZSBjbGljaycpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dJdGVtLlByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwVXNlckVkaXQocm93SXRlbSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJpbW8gY2xpY2s6IG5vbiBmYSBuaWVudGUgZSBzZSBpbCB0ZW1wbyBwZXIgaWwgc2Vjb25kbyBjbGljayBzY2FkZSByZXNldHRhIHR1dHRvXHJcbiAgICAgICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUmFuZ2VTZWxlY3Rpb24gfHwgIXRoaXMubW91c2VJc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJ0aW1lJ3MgdXAgZm9yIHNlY29uZCBjbGljaywgaGFuZGxpbmcgc2luZ2xlIGNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFBlciBldml0YXJlIGRpIHJhbGxlbnRhcmUgYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJDb3BpYVwiIGJ1dHRhbmRvIGkgdmFsb3JpIHNlbGV6aW9uYXRpIG5lbGxhIGNsaXBib2FyZCBpbiBiYXNlIGFsIGxvcm8gdGlwbyAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb3B5KCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25UZXh0ID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5VGV4dFRvQ2xpcGJvYXJkKHNlbGVjdGlvblRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlSW5mbyh0aGlzLmxjLmxvYyhcIlZhbHVlcyBjb3BpZWQgaW4gdGhlIGNsaXBib2FyZFwiKSwgXCJ0b2FzdHJcIiwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJJbmNvbGxhXCIgcHJlbmRlbmRvIGkgZGF0aSBkZWxsYSBjbGlwYm9hcmQgZSBhcHBsaWNhbmRvbGkgYWwgcmFuZ2UgZGkgc2VsZXppb25lIGF0dHVhbGUgaW4gYmFzZSBhbCB0aXBvIGRlbGxlIGNlbGxlIHNvdHRvICovXHJcbiAgICBoYW5kbGVQYXN0ZSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuZ2V0Q2xpcGJvYXJkKFwibWF0cml4XCIsICh2YWx1ZXM6IHN0cmluZ1tdW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEZpeCBjbGlwYm9hcmQgc2VydmljZSBjaGUgcGFyZSB1biBwbycgc3Ryb256YSwgcmltdW92byBsJ3VsdGltbyBhcnJheSBzZSBtaSBhY2NvcmdvIGNoZSDDqCB1biBzaW5nb2xvIGFycmF5IGNvbiB1biBzb2xvIGVsZW1lbnRvIHZ1b3RvXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdWzBdID09ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbMF0ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBzZSBsYSBtb2RpZmljYSDDqCBhYmlsaXRhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJEYXRhIGZvciB0aGlzIHRhYmxlIGNhbm5vdCBiZSBlZGl0ZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbG8gY2hlIHF1ZWxsbyBjaGUgc3RvIGNvcGlhbmRvIHNpYSBkZWxsYSBzdGVzc2EgZGltZW5zaW9uZSBkZWxsYSBzZWxlemlvbmUgc3VsbCdlcy10YWJsZSwgdHJhbm5lIG5lbCBjYXNvIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGRhIGNvcGlhcmVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHNlbC5sZW5ndGggIT0gdmFsdWVzLmxlbmd0aCB8fCBzZWxbMF0ubGVuZ3RoICE9IHZhbHVlc1swXS5sZW5ndGgpICYmICh2YWx1ZXMubGVuZ3RoICE9IDEgfHwgdmFsdWVzWzBdLmxlbmd0aCAhPSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIlNpemUgb2YgY29waWVkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpemUgb2YgdGhlIHNlbGVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIGRpbWVuc2lvbmkgY29pbmNpZG9ubyBjb3BpbyBkYSB1bmEgcGFydGUgYWxsJ2FsdHJhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXM6IEVzVGFibGVNb2RlbENoYW5nZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gc2luZ29sbyB2YWxvcmUgbG8gYXBwbGljbyBhIHR1dHRhIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5sZW5ndGggPT0gMSA/IHZhbHVlc1swXVswXSA6IHZhbHVlc1tyXVtjXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZCA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ID0gY2VsbC52YWxfc2V0dGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXVkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihuaXUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGNlbGwuaXRlbSwgY2VsbC5oZWFkZXIsIGNlbGwucHJvcGVydHksIG9sZCwgbml1KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KGNoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpcHVsaXNjZSBpbCB0aW1lciB1dGlsaXp6YXRvIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBkb3BwaW8gY2xpY2sgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIGNsZWFyQ2VsbENsaWNrVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2VsbERiQ2xpY2tUaW1lcilcclxuICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlciBjbGljayBzaW5nb2xvIHN1IHVuYSByaWdhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSAkZXZlbnQgRXZlbnRvIG5hdGl2byBqYXZhc2NyaXB0XHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBJdGVtIGNoZSByYXBwcmVzZW50YSBpbCBjb250ZXN0byBzdSBjdWkgw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGlja1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3Rpb24gSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCBhdHRpdmFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZXJuYWxDYWxsIEluZGljYSBzZSBsYSBjaGlhbWF0YSBhIHF1ZXN0YSBmdW56aW9uZSDDqCBpbnRlcm5hOiBwZXJtZXR0ZSBkaSBza2lwcGFyZSBpIGNoZWNrIHN1bGxlIEN1c3RvbUNlbGxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVSb3dDbGljaygkZXZlbnQ6IGFueSwgaXRlbTogYW55LCBzZWxlY3Rpb246IGJvb2xlYW4sIGludGVybmFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gY3RybCBwcmVtdXRvIGVzY28gY29uIHRydWUgaW4gbW9kbyBkYSBmYXJlIGJ1YmJsaW5nIGRlbGwnZXZlbnRvIGUgbGFzY2lhcmxvIGdlc3RpcmUgYWwgYnJvd3NlciAobGluayBlY2MuLi4pXHJcbiAgICAgICAgLy8gU3Rlc3NhIGNvc2Egc2UgaG8gY3VzdG9tIGNlbGwgZGF0byBjaGUgbGEgZ2VzdGlvbmUgZGVpIGNsaWNrIHZpZW5lIGFmZmlkYXRhIGFpIHNpbmdvbGkgVERcclxuICAgICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgJiYgIWludGVybmFsQ2FsbCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFpdGVtLmxvY2tlZCAmJiAhaXRlbS5fc2VwICYmICFpdGVtLl9ncm91cClcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdyb3VwQ2xpY2soaXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlbCBjbGljayBkZXN0cm8gc3VsbCdlcy10YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SaWdodENsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5vbk9wZW5Db250ZXh0TWVudS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYSBtb2RpZmljYSBkZWxsJ3V0ZW50ZSDDqCBpbml6aWF0YS4gU2kgaW1wb3N0YSBsYSB2YXJpYWJpbGUgcmVsYXRpdmEgYSBcInRydWVcIiBpbiBtb2RvIGRhIG1vc3RyYXJlIGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqIFxyXG4gICAgICogRG9wbyBjaGUgbCdpbnB1dCDDqCBhcHBhcnNvLCBkb3BvIHVuIGNpY2xvIGRpIENoYW5nZSBEZXRlY3Rpb24gdmllbmUgYXR0aXZhdG8gaWwgU3ViamVjdCBjb2xsZWdhdG8gYWxsJ2lucHV0IGNoZSBzZXJ2aXLDoCBhIGVmZmV0dHVhcmUgaWwgZm9jdXNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldHVwVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRhYmxlICYmIHJvd0l0ZW0uUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBkeW5Nb2RlID0gdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgICg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkub2xkX3ZhbHVlID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5Gb2N1c1N1YmplY3QubmV4dCgpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIHRlcm1pbmF0YS4gU2kgcmVpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwiZmFsc2VcIiBpbiBtb2RvIGRhIG5hc2NvbmRlcmUgbCdpbnB1dCBkaSB0ZXN0byBlIHNpIGVtZXR0ZSBsYSBtb2RpZmljYSBkZWwgdmFsb3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIEVsZW1lbnRvIGRpIHJpZ2Egc3UgY3VpIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHNvcHJhIGlsIHF1YWxlIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uSW5kZXggSW5kaWNlIGRlbGxhIGNvbG9ubmEgc3UgY3VpIMOoIGF2dmVudXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5hbGl6ZVVzZXJFZGl0KHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55LCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgcm93SXRtID0gPGFueT5yb3dJdGVtO1xyXG4gICAgICAgIHJvd0l0bS5fZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgb2xkID0gcm93SXRtLm9sZF92YWx1ZTtcclxuICAgICAgICBsZXQgbml1ID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KFtuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGl0ZW0sIHJvd0l0ZW0uSUQsIHJvd0l0ZW0uUHJvcGVydHlOYW1lLCBvbGQsIG5pdSldKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtjb2x1bW5JbmRleF0udmFsX3NldHRlcihuaXUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhbmdlIHNlbGVjdGlvbiBFeHBlcmltZW50YWxzXHJcblxyXG4gICAgcHJpdmF0ZSBtb3VzZUlzRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU3RhcnRXYXNJZ25vcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGZpcnN0Q29vcmRpbmF0ZXM6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9ID0gbnVsbDtcclxuXHJcbiAgICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IGFueSwgXzogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFRhc3RvIGRpdmVyc28gZGFsIGNsaWNrIHNpbmlzdHJvIC0+IGNpYW8gw6ggc3RhdG8gYmVsbG8gZSBpbnRlbnNvXHJcbiAgICAgICAgaWYoZXZlbnQuYnV0dG9ucyAhPSAxIHx8ICF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN0byBsYXZvcmFuZG8gc3UgUVVFU1RBIGVzLXRhYmxlXHJcbiAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdENvb3JkaW5hdGVzID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIC8vIFNlIGhvIGdpw6AgdW4gcmFuZ2UgZGkgc2VsZXppb25lIGlnbm9ybyB0ZW1wb3JhbmVtYWVudGUgcXVlc3RhIHNlbGV6aW9uZSBpbiBtb2RvIGRhIGNhcGlyZSBiZW5lIGNvc2EgZGV2byBmYXJlIGRvcG8gKGNsaWNrIHN1bGxhIHJpZ2EgLyBhbHRyYSBzZWxlemlvbmUpXHJcbiAgICAgICAgLy8gZSBnZXN0aXJlIGxhIGdyYWZpY2EgaW4gbWFuaWVyYSB1biBwbycgcGnDuSBwcmVjaXNhXHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlU2VsZWN0ZWQgfHwgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IGZhbHNlIH0sIHJvdywgY29sdW1uKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgZG93biBvbiAke3Jvd306JHtjb2x1bW59YCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2VlbnRlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXHJcbiAgICAgICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAyXSk7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgLy8gU2UgaG8gaWdub3JhdG8gbCdpbml6aW8gZGVsbGEgc2VsZXppb25lIG5lbCBtb3VzZWRvd24gbG8gcmVjdXBlcm8gcXVpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgdGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdywgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IHRydWUgfSwgcm93LCBjb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgbW92ZSBvdmVyICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGlsIG1vdXNldXAgdmllbmUgZWZmZXR0dWF0byBzdWxsYSBzdGVzc2EgY2VsbGEgZGVsIHByaW1vIG1vdXNlZG93biBlIHNpYW1vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgZGVzZWxlemlvbm8gbGEgY2VsbGEgcGVyY2jDqSDDqCB1biBzZW1wbGljZSBjbGlja1xyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdyA9PSByb3cgJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbiA9PSBjb2x1bW4gJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgJiYgdGhpcy5TZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8ICF0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBsaWZ0ZWQgdXBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyogUGlhbmdvXHJcbiAgICBwcml2YXRlIEVzVGRzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBFc1RkIH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNDYWNoZVtgJHtwcm9wfV8ke2hhc2h9YF07XHJcbiAgICAgICAgcmV0dXJuIHRvUmV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzQ2FjaGVbYCR7ZXZlbnQuaWR9XyR7ZXZlbnQuaGFzaH1gXSA9IGV2ZW50LnNlbGZcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSIsIjwhLS0gUGF0YWNjaGlubyBkaSBhdXRvYWdnaW9ybmFtZW50byAtLT5cclxuPGRpdiBjbGFzcz1cInctMTAwXCIgKm5nSWY9XCJBdXRvVXBkYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgIHt7J1VwZGF0ZSBldmVyeScgfCBsb2NhbGl6ZSA6IGxjfX0mbmJzcDs8aW5wdXQgW3JlYWRvbmx5XT1cImF1dG9VcGRhdGVcIiBtYXhsZW5ndGg9XCIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZXN0LWN1c3RvbS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzZWNvbmRzXCIgW25nTW9kZWxPcHRpb25zXT1cInsnc3RhbmRhbG9uZSc6IHRydWV9XCIgLz4mbmJzcDt7eydzZWNvbmQvcycgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHQgbS10LTJcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJlc3Qtc3dpdGNoXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImF1dG9VcGRhdGVcIiBbbmdNb2RlbE9wdGlvbnNdPVwieydzdGFuZGFsb25lJzogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJhdXRvVXBkYXRlQ2hhbmdlZCgpO1wiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3Qtc2xpZGVyIHJvdW5kXCI+PC9kaXY+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIlZpZXdcIiBjbGFzcz1cImVzdC1yZWxhdGl2ZVwiIFtzdHlsZS5oZWlnaHRdPVwiSGVpZ2h0XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiRW1wdHlTcGFjZUJhY2tncm91bmRDb2xvclwiPlxyXG4gICAgPGRpdiAqbmdJZj1cIkZpcnN0QmluZCAmJiBTaG93TG9hZGluZ09uQm9vdHN0cmFwXCIgY2xhc3M9XCJlc3QtbG9hZGluZy1ib3hcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXN0LWxvYWRpbmctY29udGVudFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvc3Bhbj4mbmJzcDt7eydQZXJmb3JtaW5nIFRhYmxlIGJvb3RzdHJhcCcgfCBsb2NhbGl6ZTogbGN9fS4uLlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImVzdC10b3AtcGFnZXJcIiAqbmdJZj1cIlBhZ2luZ1N0eWxlID09ICdib3RoJyB8fCBQYWdpbmdTdHlsZSA9PSAndG9wJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdFbGVtZW50XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZXN0LXRvcC1hbGxzZWxlY3RcIiAqbmdJZj1cImNhblNlbGVjdEFsbCB8fCAoVmlldz8uc2VsZWN0aW9uIHx8IGFycmF5bW9kZVNlbGVjdGlvbik/LmFsbFwiPlxyXG4gICAgICAgIDxzcGFuPnt7IChzZWxlY3RlZE9iamVjdHMgPT0gLTEgPyAoJ0FsbCB0aGUnIHwgbG9jYWxpemUgOiBsYykgOiAoKHNlbGVjdGVkT2JqZWN0cyB8fCAwKSB8IG51bWJlciA6ICcwLjAtMCcgOiBsYy5Mb2NhbGUpKSArICcgJyArICgoc2VsZWN0ZWRPYmplY3RzID09IDEgPyAnT2JqZWN0IFNlbGVjdGVkJyA6ICdPYmplY3RzIFNlbGVjdGVkJykgfCBsb2NhbGl6ZSA6IGxjKSB9fTwvc3Bhbj4mbmJzcDtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImVzdC1saW5rIGVzdC1pbmxpbmVcIiAoY2xpY2spPVwic2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpXCI+e3sgKFZpZXc/LnNlbGVjdGlvbiB8fCBhcnJheW1vZGVTZWxlY3Rpb24pPy5hbGwgPyAoJ1Jlc2V0IFNlbGVjdGlvbicgfCBsb2NhbGl6ZSA6IGxjKSA6ICgnU2VsZWN0IEV2ZXJ5dGhpbmcnIHwgbG9jYWxpemUgOiBsYyl9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIGRhdGF0YWJsZSBlc3QtZnVsbC1oZWlnaHQge3tDb250YWluZXJDbGFzc319XCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwiTWF4SGVpZ2h0XCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwie3sgVGFibGVDbGFzcyB9fSBlc3QtbWFyZ2luLWJvdHRvbS0xMCBlc3RcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiICBbY2xhc3MuZXN0LWhpZ2gtZGVuc2l0eV09XCJIaWdoQ2VsbERlbnNpdHlcIj5cclxuICAgICAgICAgICAgPHRoZWFkIFtoaWRkZW5dPVwiSGVhZGVySGlkZGVuIHx8IEZpcnN0QmluZFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBBZ2dpdW5nbyBpbCBwZXp6byBjaGUgZ2VzdGlzY2UgbGEgc2VsZXppb25lIGRpIHR1dHRvIHNlIGF0dGl2byBkYSBjb25maWcgLS0+XHJcbiAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCIoU2VsZWN0QWxsICYmICFTaW5nbGVTZWxlY3Rpb24pIHx8IFBhZ2luZ1N0eWxlICE9ICdib3R0b20nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZXN0LW5vLXNlbGVjdGlvblwiIFthdHRyLmNvbHNwYW5dPVwiQ29sdW1ucy5HbG9iYWxcIiBbY2xhc3MuZXN0LWhpZGRlbi12aWV3XT1cIiFjYW5TZWxlY3RBbGwgJiYgIShWaWV3Py5zZWxlY3Rpb24gfHwgYXJyYXltb2RlU2VsZWN0aW9uKT8uYWxsICYmIFBhZ2luZ1N0eWxlID09ICdib3R0b20nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZXN0LWhpZGRlbi12aWV3IGFwcC1tYXJnaW4tYm90dG9tLTBcIj7CpzwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBoZWFkZXIgZ3JvdXAgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUm93VGhHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGxldmVsIG9mIFJvd1RoR3JvdXBzOyB0cmFja0J5OiBJRFRyYWNrQnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjZWxsIG9mIGxldmVsOyB0cmFja0J5OiBJRFRyYWNrQnlcIiBbYXR0ci5jb2xzcGFuXT1cImNlbGwuU3BhblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LXBpbm5lZC1oZWFkZXJdPVwiY2VsbC5QaW5uZWRcIiBbY2xhc3MuZXN0LWNvbC1taW5dPVwiY2VsbC5QaW5uZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC1sdGFiLWJvcmRlcl09XCJjZWxsLkJvcmRlcnNcIiBbY2xhc3MuZXN0LXJ0YWItYm9yZGVyXT1cImNlbGwuQm9yZGVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVzdC10ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuUGlubmVkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlciBlc3QtY2VsbC1ncm91cC1wYWRkaW5nXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5QaW5uZWQgJiYgY2VsbC5Db250ZW50OyBFbHNlOiBjZWxsLlRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjZWxsLkNvbnRlbnR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhUm93VGhHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJIYXNIZWFkZXJHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyR3JvdXBSZWZcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiRXhwb3J0XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBoZWFkZXIgZ3JvdXAgc2Vjb25kYXJpbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJIYXNTZWNvbmRhcnlIZWFkZXJHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWZcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiRXhwb3J0XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCbG9jY28gZWZmZXR0aXZvIGRlZ2xpIGhlYWRlciAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGhlYWQtPnRyLT5kZWJ1Z19ibG9ja1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb246IHt7U2VsZWN0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgSGFzUGlubmVkQ29sdW1uczoge3tIYXNQaW5uZWRDb2x1bW5zfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlNb2RlOiB7e2FycmF5TW9kZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlOiB7e3ZpZXdNb2RlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlQ3VzdG9tQ2VsbHM6IHt7VXNlQ3VzdG9tQ2VsbHN9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSb3dUSHM6IHt7ISFSb3dUSHN9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSb3dUSHMubGVuZ3RoOiB7e1Jvd1RIcz8ubGVuZ3RofX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uOiB7eyEhRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBZ2dpdW5nbyB1bmEgY2hlY2tib3ggc2UgbGEgc2VsZXppb25lIMOoIGF0dGl2YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJlc3QtY29sLW1pblwiICpuZ0lmPVwiU2VsZWN0aW9uICYmICFIYXNQaW5uZWRDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFTaW5nbGVTZWxlY3Rpb25cIiBjbGFzcz1cImVzdC1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2Rpc2FibGVkXT1cIlNlbGVjdGlvbkRpc2FibGVkXCIgWyhuZ01vZGVsKV09XCJnbG9iYWxDaGVja1wiIFtuZ01vZGVsT3B0aW9uc109XCJ7J3N0YW5kYWxvbmUnOiB0cnVlfVwiIChuZ01vZGVsQ2hhbmdlKT1cImdsb2JhbENoZWNrQ2hhbmdlZCgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNoZSB2YWxnb25vIHBlciB2aWV3IG1vZGUgZSBhcnJheSBtb2RlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcnJheU1vZGUgfHwgdmlld01vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbiB1bmEgdGFiZWxsYSBiYXNlIHByZW5kbyBzZW1wbGljZW1lbnRlIGkgdGggc2NyaXR0aSBkYWxsJ3V0ZW50ZSBuZWxsJ0hUTUwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIVVzZUN1c3RvbUNlbGxzIHx8ICFSb3dUSHMgfHwgUm93VEhzLmxlbmd0aCA9PSAwKSAmJiAhRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyUmVmXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZSBobyB1biBtb2RlbGxvIGRpbmFtaWNvIGRlbGwnb2dnZXR0byBjcmVvIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIHByb3ByaWV0w6AgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIVVzZUN1c3RvbUNlbGxzIHx8ICFSb3dUSHMgfHwgUm93VEhzLmxlbmd0aCA9PSAwKSAmJiBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgb3BlcmF0aW9uIG9mIER5bmFtaWNPcGVyYXRpb25zOyB0cmFja0J5OiBpZFRyYWNrQnlcIiBjbGFzcz1cImVzdC1jb2wtbWluIGVzdC1uby1zaWRlLXBhZGRpbmdcIj48L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0hlYWRlciBvZiBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb247IHRyYWNrQnk6IFByb3BlcnR5TmFtZVRyYWNrQnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93SGVhZGVyLlZpc2libGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiT3JkZXJCeUNvbHVtblwiICBpZD1cImVzdGhfe3tyb3dIZWFkZXIuUHJvcGVydHlOYW1lfX1cIiBlcy10aD1cInt7cm93SGVhZGVyLlByb3BlcnR5TmFtZX19XCIgY2xhc3M9XCJ7e1VzZXJEZWZpbmVkRHluYW1pY0NvbHMgPyAoKHJvd0hlYWRlci5DbHNzIHx8ICcnKSArIChyb3dIZWFkZXIuSGVhZGVyV3JhcHMgPyAnJyA6ICcgZXN0LW5vd3JhcCcpKSA6ICcgZXN0LW5vd3JhcCd9fVwiIFtPcmRlcl09XCJyb3dIZWFkZXIuRGF0YU9yZGVyXCIgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCIgW09yZGVyYWJsZV09XCJyb3dIZWFkZXIuT3JkZXJhYmxlXCIgW09yZGVyQnldPVwiT3JkZXJCeUNvbHVtblwiIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCIgKG9uT3JkZXJDaGFuZ2UpPVwidGhPcmRlckNoYW5nZWQocm93SGVhZGVyLlByb3BlcnR5TmFtZSwgJGV2ZW50KVwiPnt7cm93SGVhZGVyLkRlc2NyaXB0aW9ufX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhT3JkZXJCeUNvbHVtblwiIGlkPVwiZXN0aF97e3Jvd0hlYWRlci5Qcm9wZXJ0eU5hbWV9fVwiIGVzLXRoPVwie3tyb3dIZWFkZXIuUHJvcGVydHlOYW1lfX1cIiBjbGFzcz1cInt7VXNlckRlZmluZWREeW5hbWljQ29scyA/ICgocm93SGVhZGVyLkNsc3MgfHwgJycpICsgKHJvd0hlYWRlci5IZWFkZXJXcmFwcyA/ICcnIDogJyBlc3Qtbm93cmFwJykpIDogJyBlc3Qtbm93cmFwJ319XCIgW09yZGVyXT1cInJvd0hlYWRlci5EYXRhT3JkZXJcIiBbUmVzaXphYmxlXT1cIkNvbHVtbnNSZXNpemFibGVcIiBbT3JkZXJhYmxlXT1cInJvd0hlYWRlci5PcmRlcmFibGVcIiBbT3JkZXJCeV09XCJPcmRlckJ5Q29sdW1uXCI+e3tyb3dIZWFkZXIuRGVzY3JpcHRpb259fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlIG5vbiBobyB1biBtb2RlbGxvIGRpbmFtaWNvIG1hIGludmVjZSBkZWxsZSBjZWxsZSBjdXN0b20sIGdlbmVybyBnbGkgaGVhZGVyIGluIGJhc2UgYWkgcm93IHRoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiVXNlQ3VzdG9tQ2VsbHMgJiYgUm93VEhzPy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJIYXNQaW5uZWRDb2x1bW5zXCIgY2xhc3M9XCJlc3QtcGlubmVkLWhlYWRlciBlc3QtY29sLW1pblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlciBlc3Qtc2ltcGxlLWJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZXN0LWNvbC1taW4gZXN0LW5vLWJvcmRlclwiICpuZ0lmPVwiU2VsZWN0aW9uXCIgW3N0eWxlLndpZHRoLnB4XT1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhU2luZ2xlU2VsZWN0aW9uXCIgY2xhc3M9XCJlc3QtcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCJTZWxlY3Rpb25EaXNhYmxlZFwiIFsobmdNb2RlbCldPVwiZ2xvYmFsQ2hlY2tcIiBbbmdNb2RlbE9wdGlvbnNdPVwieydzdGFuZGFsb25lJzogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJnbG9iYWxDaGVja0NoYW5nZWQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93SGVhZGVyIG9mIFJvd1RIczsgdHJhY2tCeTogSURUcmFja0J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJyb3dIZWFkZXIgJiYgcm93SGVhZGVyLlZpc2libGUgJiYgcm93SGVhZGVyLlBpbm5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInJvd0hlYWRlci5QaW5uZWRXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXMtdGg9XCJ7e3Jvd0hlYWRlci5JRH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7cm93SGVhZGVyLkNsYXNzIHx8ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5lc3QtcGlubmVkLWludGVybmFsLWhlYWRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vLWJvcmRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vd3JhcF09XCIhcm93SGVhZGVyLldyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQaW5uZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZpeGVkXT1cInJvd0hlYWRlci5GaXhlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyXT1cInJvd0hlYWRlci5PcmRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT3JkZXJhYmxlXT1cInJvd0hlYWRlci5PcmRlcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPcmRlckJ5XT1cIk9yZGVyQnlDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25VbnBpbm5pbmcpPVwiY29sdW1uTWV0YWRhdGFfSC51bnBpbkNvbHVtbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25PcmRlckNoYW5nZSk9XCJ0aE9yZGVyQ2hhbmdlZChyb3dIZWFkZXIuSUQsICRldmVudClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0hlYWRlci5UZW1wbGF0ZVwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dIZWFkZXIuVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3dIZWFkZXIuTXVsdGkgPyByb3dIZWFkZXIuTXVsdGlDb250ZW50IDogbnVsbCB9IFwiPjwvbmctY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvd0hlYWRlci5UZW1wbGF0ZVwiPnt7cm93SGVhZGVyLkNvbnRlbnR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0hlYWRlciBvZiBSb3dUSHM7IHRyYWNrQnk6IElEVHJhY2tCeVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGhlYWQtPnRyLT50aC0+ZGVidWdfYmxvY2tcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyOiB7eyEhcm93SGVhZGVyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyLlZpc2libGU6IHt7cm93SGVhZGVyPy5WaXNpYmxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyLlBpbm5lZDoge3tyb3dIZWFkZXI/LlBpbm5lZH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0hlYWRlci5UZW1wbGF0ZToge3shIXJvd0hlYWRlci5UZW1wbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInJvd0hlYWRlciAmJiByb3dIZWFkZXIuVmlzaWJsZSAmJiAhcm93SGVhZGVyLlBpbm5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzLXRoPVwie3tyb3dIZWFkZXIuSUR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tyb3dIZWFkZXIuQ2xhc3MgfHwgJyd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cIiByb3dIZWFkZXIuQWxpZ25tZW50IHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LWx0YWItYm9yZGVyXT1cInJvd0hlYWRlci5MZWZ0Qm9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC1ydGFiLWJvcmRlcl09XCJyb3dIZWFkZXIuUmlnaHRCb3JkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vd3JhcF09XCIhcm93SGVhZGVyLldyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT3JkZXJdPVwicm93SGVhZGVyLk9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyYWJsZV09XCJyb3dIZWFkZXIuT3JkZXJhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyQnldPVwiT3JkZXJCeUNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uT3JkZXJDaGFuZ2UpPVwidGhPcmRlckNoYW5nZWQocm93SGVhZGVyLklELCAkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93SGVhZGVyLlRlbXBsYXRlXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0hlYWRlci5UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvd0hlYWRlci5NdWx0aSA/IHJvd0hlYWRlci5NdWx0aUNvbnRlbnQgOiBudWxsIH1cIj48L25nLWNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93SGVhZGVyLlRlbXBsYXRlXCI+e3tyb3dIZWFkZXIuQ29udGVudH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1QZXIgbCdlbGltaW5hemlvbmUgbWkgc2VydmUgdW4gaGVhZGVyIGFnZ2l1bnRpdm8tLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJSZW1vdmFsXCIgW2NsYXNzLmVzdC1yaWdodC05XT1cIkV4cG9ydCB8fCBIaWRkZW5Db2x1bW5zXCIgY2xhc3M9XCJlc3QtY29sLW1pbiBlc3Qtc3RpY2t5LWxhc3QtY29sdW1uXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvc3Bhbj48L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tUGVyIGwnZXNwb3J0YXppb25lIG1pIHNlcnZlIGwnaGVhZGVyIGV4dHJhIGRhIGN1aSBmYWNjaW8gdXNjaXJlIGkgMyBwYWxsb2NjaGktLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb2x1bW5zT3JkZXJpbmcgfHwgQ29ybmVyTWVudU9wdGlvbnNcIiBjbGFzcz1cImVzdC10YWJsZS1kb3R0ZWQtbWVudSBlc3Qtc3RpY2t5LWxhc3QtY29sdW1uIGVzdC1jb2wtbWluIHRleHQtc20tY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBjb24gaSAzIHBhbGxvY2NoaSBjaGUgdGlyYSBmdW9yaSBpbCBjb250ZXh0IG1lbnUgZGVsbGUgb3BlcmF6aW9uaSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIGNvbnRhaW5lcj1cImJvZHlcIiBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIiBkcm9wZG93biAjZHJvcGRvd249XCJicy1kcm9wZG93blwiIFthdXRvQ2xvc2VdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZHJvcGRvd25Ub2dnbGUgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12IGVzdC1mcy0xOCBlc3QtcG9pbnRlciBlc3QtcGFkZGluZy0zXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKmRyb3Bkb3duTWVudSBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodCBlc3QtYnJpbmctdG8tZnJvbnQtc3Ryb25nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0lmPVwiSGlkZGVuQ29sdW1ucyB8fCBDb2x1bW5zT3JkZXJpbmdcIiAoY2xpY2spPVwiY29sdW1uTWV0YWRhdGFfSC5yZXNldENvbHVtblZpc1NlbGVjdGlvbigpOyBjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWwuc2hvdygpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NvbHVtbnMgT3JkZXInIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmICFDb2x1bW5zT3JkZXJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDb2x1bW5zIFZpc2liaWxpdHknIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NvbHVtbnMgVmlzaWJpbGl0eSBhbmQgT3JkZXInIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAqbmdJZj1cIkV4cG9ydCAmJiBDU1ZFeHBvcnRcIiAoY2xpY2spPVwiZXhwb3J0X0gudHJ5RXhwb3J0KCdDU1YnKVwiPnt7J0V4cG9ydCBWaWV3JyB8IGxvY2FsaXplIDogbGN9fSAoQ1NWKTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKm5nSWY9XCJFeHBvcnQgJiYgWExTWEV4cG9ydFwiIChjbGljayk9XCJleHBvcnRfSC50cnlFeHBvcnQoJ1hMU1gnKVwiPnt7J0V4cG9ydCBWaWV3JyB8IGxvY2FsaXplIDogbGN9fSAoWExTWCk8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgQ29ybmVyTWVudU9wdGlvbnM7IHRyYWNrQnk6IGlkVHJhY2tCeVwiIChjbGljayk9XCJjb3JuZXJBY3Rpb25DbGlja2VkKG9wdGlvbi5pZClcIj57e29wdGlvbi5kZXNjcmlwdGlvbn19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICAgICAgPHRib2R5IFtoaWRkZW5dPVwiQm9keUhpZGRlbiB8fCBGaXJzdEJpbmRcIiBbY2xhc3MuZXN0LW5vLXNlbGVjdGlvbl09XCJSYW5nZVNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLUNvbiBzZWxlY3Rpb24gYXR0aXZhIHJpY2hpYW1vIGlsIHRlbXBsYXRlIGNoZSBnZXN0aXNjZSBpbCBjb250ZXh0IG1lbnUtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVEJvZHlTZWxlY3Rpb247IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IHNlbERpc2FibGVkOiBhcnJheU1vZGUgPyBmYWxzZSA6IFNlbGVjdGlvbkRpc2FibGVkLCBzZWw6IFNlbGVjdGlvbiB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLVNlbnphIHNlbGVjdGlvbiByaWNoaWFtbyBpbCB0ZW1wbGF0ZSBjaGUgTk9OIGdlc3Rpc2NlIGlsIGNvbnRleHQgbWVudS0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVEJvZHlcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiUGFnaW5nU3R5bGUgPT0gJ2JvdGgnIHx8IFBhZ2luZ1N0eWxlID09ICdib3R0b20nXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luZ0VsZW1lbnRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGVtcGxhdGUgY2hlIGNvbnRpZW5lIHR1dHRlIGxlIGluZm8gZGkgcGFnaW5hemlvbmUgaW4gbW9kbyBkYSBwb3RlcmxvIHJlcGxpY2FyZSBhbmNoZSBzb3ByYSAtLT5cclxuPG5nLXRlbXBsYXRlICNwYWdpbmdFbGVtZW50PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFGaXJzdEJpbmRcIj5cclxuICAgICAgICA8IS0tIFB1bHNhbnRpIGF2YW50aS1pbmRpZXRybyBkaSBwYWdpbmF6aW9uZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmIChQYWdlck9wdGlvbnMuUGFnZXJDb3VudCA+IDEwIHx8IFBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID09IC0xKVwiIGNsYXNzPVwicHVsbC1yaWdodCBidG4tdG9vbGJhclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUGFnZXJPcHRpb25zLlZpZXc/LnBhZ2luZ2F2YWlsYWJsZSB8fCB2aWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luZ0J1dHRvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IE1hcmdpbjogdHJ1ZSwgQVRQOiBhZGRUb1BhZ2UuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZS5iaW5kKHRoaXMpLCBBcnJheTogYXJyYXlQdWxzYW50aSB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFycmF5TW9kZSAmJiBVc2VBcnJheU1vZGVQYWdpbmcgJiYgIVNlYXJjaFZpZXdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBNYXJnaW46IHRydWUsIEFUUDogYXJyYXlBZGRUb1BhZ2UuYmluZCh0aGlzKSwgR1RQOiBhcnJheUdvVG9QYWdlLmJpbmQodGhpcyksIEFycmF5OiBhcnJheVB1bHNhbnRpIH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gUGFnaW5hdG9yZSBkb3ZlIGFwcGFyZSBsYSBjb3VudCBlIGxlIG9wemlvbmkgZGkgcGFnaW5hemlvbmUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtbXQtbWluLTVcIiAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXBhZ2luZyAqbmdJZj1cIiFQYWdlck9wdGlvbnMuVXNlc1ZpZXdcIiBbQ291bnRMYWJlbF09XCJDb3VudExhYmVsXCIgW1Nob3dQYWdpbmddPVwiUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zXCIgW1Nob3dDb3VudF09XCJQYWdlck9wdGlvbnMuU2hvd0NvdW50XCIgW1BhZ2VyQ291bnRdPVwiUGFnZXJPcHRpb25zLlBhZ2VyQ291bnRcIiBbV2Fybk9uQWxsXT1cImZhbHNlXCIgW0N1cnJlbnRQYWdlU2l6ZV09XCJBcnJheW1vZGVJdGVtc1BlclBhZ2VcIiAocGFnaW5nU2VsZWN0ZWQpPVwiaXRlbXNfSC5yZWZyZXNoUGFnaW5nKCRldmVudClcIj48L2FwcC1wYWdpbmc+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXBhZ2luZyAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5Vc2VzVmlld1wiIFtDb3VudExhYmVsXT1cIkNvdW50TGFiZWxcIiBbU2hvd1BhZ2luZ109XCJQYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnNcIiBbU2hvd0NvdW50XT1cIlBhZ2VyT3B0aW9ucy5TaG93Q291bnRcIiBbUGFnZXJDb3VudF09XCJQYWdlck9wdGlvbnMuUGFnZXJDb3VudFwiIFtHcm91cE1vZGVdPVwiUGFnZXJPcHRpb25zLlNlYXJjaGVzID09ICdncm91cHMnXCIgW0FsbFNlYXJjaF09XCJBbGxTZWFyY2hcIiBbVmlld109XCJQYWdlck9wdGlvbnMuVmlld1wiIChwYWdpbmdTZWxlY3RlZCk9XCJvbkl0ZW1zUGVyUGFnZUNoYW5nZWQoJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFRlbXBsYXRlIGNoZSBjb250aWVuZSBpIHB1bHNhbnRpIHBlciBjYW1iaWFyZSBwYWdpbmEgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjcGFnaW5nQnV0dG9ucyBsZXQtb3B0aW9ucz5cclxuICAgIDxkaXYgY2xhc3M9XCJlc3QtZmxleFwiIFtjbGFzcy5lc3QtbWFyZ2luLWxlZnQtNTBdPVwib3B0aW9ucy5NYXJnaW5cIj5cclxuICAgICAgICA8YSBjbGFzcz1cImJ0blwiIGNsYXNzPVwiZXN0LXBhZ2UtcHJldiBhcHAtcG9pbnRlclwiIChjbGljayk9XCJvcHRpb25zLkFUUCgtMSwgb3B0aW9ucy5zZXBhcmF0b3IpXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L3NwYW4+PC9hPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFycmF5XCIgY2xhc3M9XCJlc3QtaW5saW5lXCI+PGEgKm5nRm9yPVwibGV0IHAgb2Ygb3B0aW9ucy5BcnJheTsgdHJhY2tCeTogdmFsVHJhY2tCeVwiIGNsYXNzPVwiYnRuIGVzdC1wYWdlLXNlbCB7e3AuY3NzQ2xhc3N9fVwiIChjbGljayk9XCJvcHRpb25zLkdUUChwLnZhbCwgb3B0aW9ucy5zZXBhcmF0b3IpXCI+e3twLnZhbH19PC9hPjwvZGl2PlxyXG4gICAgICAgIDxhIGNsYXNzPVwiYnRuXCIgY2xhc3M9XCJlc3QtcGFnZS1uZXh0IGFwcC1wb2ludGVyXCIgKGNsaWNrKT1cIm9wdGlvbnMuQVRQKDEsIG9wdGlvbnMuc2VwYXJhdG9yKVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvc3Bhbj48L2E+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gUXVlc3RpIGR1ZSB0ZW1wbGF0ZSByYXBwcmVzZW50YW5vIGVmZmV0dGl2YW1lbnRlIGlsIGJvZHkgZGVsbGEgdGFiZWxsYS4gZXNzZW5kbyBpbCB0ciBsJ3VuaWNhIGNvc2EgY2hlIGRhdnZlcm8gY2FtYmlhLCBpbCByZXN0byDDqCB0ZW1wbGF0aXp6YXRvIC0tPlxyXG48bmctdGVtcGxhdGUgI1RCb2R5U2VsZWN0aW9uIGxldC10ZW1wbGF0ZU9wdGlvbnM+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJvdW5kU291cmNlOyBsZXQgZXZlbiA9IGV2ZW47IGxldCBpPWluZGV4OyB0cmFja0J5OiBib2R5VHJhY2tCeVwiPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cIml0ZW0uX3Zpc2libGUgfHwgKCFIaWVyYXJjaHkgJiYgIUFycmF5R3JvdXBpbmcpXCJcclxuICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0uX3Jvd0NsYXNzID8gaXRlbS5fcm93Q2xhc3MgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5lc3QtbGluZS10aHJvdWdoXT1cIml0ZW0ucmVtb3ZlZCB8fCBpdGVtLmRlbGV0ZWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LXBvaW50ZXJdPVwiIWl0ZW0ubG9ja2VkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC13aGl0ZS1zZWxlY3RlZF09XCJpdGVtLl9zZWxlY3RlZCAmJiAhaXRlbS5sb2NrZWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LXJnXT1cIml0ZW0uX2dyb3VwXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC1yZy1zZXBdPVwiaXRlbS5fc2VwXCJcclxuICAgICAgICAgICAgW2NvbnRleHRNZW51XT1cIiFpdGVtLmxvY2tlZCA/IChDb250ZXh0TWVudSB8fCBlbXB0eU1lbnUpIDogZW1wdHlNZW51XCIgW2NvbnRleHRNZW51U3ViamVjdF09XCJpdGVtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIiFSYW5nZVNlbGVjdGlvbiAmJiBoYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRydWUpXCJcclxuICAgICAgICAgICAgKGNvbnRleHRtZW51KT1cIm9uUmlnaHRDbGljaygpO1wiPlxyXG5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWl0ZW0ubG9ja2VkICYmICFpdGVtLl9zZXAgJiYgIUhhc1Bpbm5lZENvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRlbXBsYXRlT3B0aW9ucy5zZWxEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5lc3QtcG9pbnRlcl09XCIhaXRlbS5sb2NrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uX3NlbGVjdGVkXCIgbmFtZT1cImNoZWNre3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBoYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1wiPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCIoaXRlbS5sb2NrZWQgfHwgaXRlbS5fc2VwKSAmJiAhSGFzUGlubmVkQ29sdW1uc1wiPjwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5fc2VwXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyb3VwUGFnZXI7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj4gPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uX3NlcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2ljQ29sdW1uczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21DZWxsczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpLCB0ZW1wbGF0ZU9wdGlvbnM6IHRlbXBsYXRlT3B0aW9ucyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keURlbGV0ZUFuZEV4cG9ydDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZXZlbjogZXZlbiwgaXRlbTogaXRlbSwgaW5kZXg6IGkgfX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI1RCb2R5PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBib3VuZFNvdXJjZTsgbGV0IGkgPSBpbmRleCwgbGV0IGV2ZW4gPSBldmVuOyB0cmFja0J5OiBib2R5VHJhY2tCeVwiPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cIml0ZW0uX3Zpc2libGUgfHwgIUhpZXJhcmNoeVwiXHJcbiAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLl9yb3dDbGFzcyA/IGl0ZW0uX3Jvd0NsYXNzIDogJydcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LWxpbmUtdGhyb3VnaF09XCJpdGVtLnJlbW92ZWQgfHwgaXRlbS5kZWxldGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC1yZ109XCJpdGVtLl9ncm91cFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5lc3Qtcmctc2VwXT1cIml0ZW0uX3NlcFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIGZhbHNlKVwiPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uX3NlcFwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cFBhZ2VyOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uX3NlcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2ljQ29sdW1uczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21DZWxsczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5RGVsZXRlQW5kRXhwb3J0OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBldmVuOiBldmVuLCBpdGVtOiBpdGVtLCBpbmRleDogaSB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZ3JvdXBQYWdlciBsZXQtaXRlbT5cclxuICAgIDx0ZCBjbGFzcz1cImVzdC1waW5uZWQtYm9keSBcIiAqbmdJZj1cIkhhc1Bpbm5lZENvbHVtbnNcIj5cclxuICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aC5weF09XCJQaW5uZWRDb250YWluZXJXaWR0aFwiIGNsYXNzPVwiZXN0LXBpbm5lZC1ib3JkZXIgZXN0LWNlbGwtZ3JvdXAtcGFkZGluZ1wiPjwvZGl2PlxyXG4gICAgPC90ZD5cclxuICAgIDx0ZCAqbmdJZj1cIml0ZW0uX2dyb3VwbGV2ZWwgPiAxXCIgW2F0dHIuY29sc3Bhbl09XCJpdGVtLl9ncm91cGxldmVsLTFcIj48L3RkPlxyXG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiQ29sdW1ucy5WaXNpYmxlVW5waW5uZWQgLSAoaXRlbS5fZ3JvdXBsZXZlbCA+IDAgPyBpdGVtLl9ncm91cGxldmVsIC0gMSA6IDApXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1zZXAtZmxleC1yaWdodFwiICpuZ0lmPVwiUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9PSAncmlnaHQnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtcmctcGFnZVwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBzZXBhcmF0b3I6IGl0ZW0sIEFUUDogYWRkVG9QYWdlR3JvdXAuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZUdyb3VwLmJpbmQodGhpcyksIEFycmF5OiBpdGVtLmJ1dHRvbnMgfX1cIj48L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1pcHBcIiAqbmdJZj1cIihpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnQpID4gMTBcIj48YXBwLXBhZ2luZyBbQ291bnRMYWJlbF09XCJDb3VudExhYmVsXCIgW0FsbFNlYXJjaF09XCJBbGxTZWFyY2hcIiBbR3JvdXBNb2RlXT1cIml0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcydcIiBbUGFnZXJDb3VudF09XCJpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnRcIiBbVmlld109XCJpdGVtLnZpZXdcIiAocGFnaW5nU2VsZWN0ZWQpPVwib25Hcm91cEl0ZW1zUGVyUGFnZUNoYW5nZWQoaXRlbSwgJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlc3Qtcmctc2VwLWZsZXgtbGVmdFwiICpuZ0lmPVwiUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9PSAnbGVmdCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1pcHBcIj48YXBwLXBhZ2luZyBbQWxsU2VhcmNoXT1cIkFsbFNlYXJjaFwiIFtDb3VudExhYmVsXT1cIkNvdW50TGFiZWxcIiBbR3JvdXBNb2RlXT1cIml0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcydcIiBbUGFnZXJDb3VudF09XCJpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnRcIiBbVmlld109XCJpdGVtLnZpZXdcIiAocGFnaW5nU2VsZWN0ZWQpPVwib25Hcm91cEl0ZW1zUGVyUGFnZUNoYW5nZWQoaXRlbSwgJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtcmctcGFnZVwiICpuZ0lmPVwiKGl0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcycgPyBpdGVtLnZpZXcuZ3JvdXBjb3VudCA6IGl0ZW0udmlldy5vYmplY3Rjb3VudCkgPiAxMFwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBzZXBhcmF0b3I6IGl0ZW0sIEFUUDogYWRkVG9QYWdlR3JvdXAuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZUdyb3VwLmJpbmQodGhpcyksIEFycmF5OiBpdGVtLmJ1dHRvbnMgfX1cIj48L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFF1ZXN0byB0ZW1wbGF0ZSBjb250aWVuZSBsYSBwcmludCBjb25kaXppb25hbGUgc3UgdGFiZWxsZSBzZW1wbGljaSwgY29uIGhlYWRlciBlIGJvZHkgc2NyaXR0aSBhIG1hbmF6emEgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYmFzaWNDb2x1bW5zIGxldC1pdGVtIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFVc2VDdXN0b21DZWxscyB8fCBFbXB0eVJvd1RkcykgJiYgIUR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvblwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5UmVmOyBjb250ZXh0IDogeyRpbXBsaWNpdDogaXRlbSwgaW5kZXg6IGluZGV4fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFZGl0b3IgbGV0LWN0eD5cclxuICAgIDwhLS0gVW4gcG8nIHRyaXN0ZSBtYSBxdWVzdG8gw6ggaWwgbWV0b2RvIHBpw7kgc2VtcGxpY2UgcGVyIGdlc3RpcmUgaWwgY2FtYmlvIGRpIG1vZGVsbG8gLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3R4Lml0ZW0ucHJvcGVydGllc1wiPlxyXG4gICAgICAgIDxmb3JtLWFkYXB0aXZlIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1ZhbGlkYXRpb25dPVwiZmFsc2VcIiBbT3B0aW9uc109XCJjdHguZGVmaW5pdGlvbi5FZGl0b3JPcHRpb25zXCIgW0ZvY3VzU3ViamVjdF09XCJGb2N1c1N1YmplY3RcIiBbKG5nTW9kZWwpXT1cImN0eC5pdGVtLnByb3BlcnRpZXNbY3R4LmRlZmluaXRpb24uUHJvcGVydHlOYW1lXVwiIG5hbWU9XCJ7eyBjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eU5hbWUgKyAnXycgKyBjdHguaXRlbS5faGFzaCB9fVwiIFtUeXBlXT1cImN0eC5kZWZpbml0aW9uLlByb3BlcnR5VHlwZVwiIFtTb3VyY2VdPVwiY3R4LmRlZmluaXRpb24uUHJvcGVydHlTb3VyY2VcIiAoaW5wdXRGaW5hbGl6ZWQpPVwiY3R4LmZpbmFsaXplcigpXCI+PC9mb3JtLWFkYXB0aXZlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN0eC5pdGVtLnByb3BlcnRpZXNcIj5cclxuICAgICAgICA8Zm9ybS1hZGFwdGl2ZSBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtWYWxpZGF0aW9uXT1cImZhbHNlXCIgW09wdGlvbnNdPVwiY3R4LmRlZmluaXRpb24uRWRpdG9yT3B0aW9uc1wiIFtGb2N1c1N1YmplY3RdPVwiRm9jdXNTdWJqZWN0XCIgWyhuZ01vZGVsKV09XCJjdHguaXRlbVtjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eU5hbWVdXCIgbmFtZT1cInt7IGN0eC5kZWZpbml0aW9uLlByb3BlcnR5TmFtZSArICdfJyArIGN0eC5pdGVtLl9oYXNoIH19XCIgW1R5cGVdPVwiY3R4LmRlZmluaXRpb24uUHJvcGVydHlUeXBlXCIgW1NvdXJjZV09XCJjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eVNvdXJjZVwiIChpbnB1dEZpbmFsaXplZCk9XCJjdHguZmluYWxpemVyKClcIj48L2Zvcm0tYWRhcHRpdmU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEVzVGQgbGV0LWN0eD5cclxuICAgIDwhLS0gVE9ETzogRm9ybWF0dGFyZSBpbCB2YWxvcmUgaW4gYmFzZSBhIHZhbFR5cGUudHlwZSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdHgudHlwZSA9PSAnZW51bSdcIj5cclxuICAgICAgICB7eyAoY3R4LnZhbHVlIHwgZXN0X2xvb2t1cCA6IGN0eC5kZWZpbml0aW9uLlByb3BlcnR5U291cmNlKS5kZXNjcmlwdGlvbiB9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3R4LnR5cGUgIT0gJ2VudW0nXCI+XHJcbiAgICAgICAge3tjdHgudmFsdWV9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2N1c3RvbUNlbGxzIGxldC1pdGVtIGxldC1vcHQ9XCJ0ZW1wbGF0ZU9wdGlvbnNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJVc2VDdXN0b21DZWxscyAmJiAhRW1wdHlSb3dUZHNcIj5cclxuICAgICAgICA8IS0tIENlbGxhIGNoZSBhZ2dyZWdhIHR1dHRlIGxlIGNvbG9ubmUgY2hlIGRldm9ubyBlc3NlcmUgcGlubmF0ZSAtLT5cclxuICAgICAgICA8dGQgKm5nSWY9XCJIYXNQaW5uZWRDb2x1bW5zXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvZHkgZXN0LWNvbC1taW5cIiBbY2xhc3MuZXN0LXdoaXRlLXNlbGVjdGVkXT1cIml0ZW0uX3NlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWl0ZW0ubG9ja2VkICYmICFpdGVtLl9zZXAgJiYgU2VsZWN0aW9uXCIgY2xhc3M9XCJlc3Qtbm8tYm9yZGVyIGVzdC1jb2wtbWluXCIgW3N0eWxlLndpZHRoLnB4XT1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCJvcHQuc2VsRGlzYWJsZWRcIiBbY2xhc3MuZXN0LXBvaW50ZXJdPVwiIWl0ZW0ubG9ja2VkXCIgWyhuZ01vZGVsKV09XCJpdGVtLl9zZWxlY3RlZFwiIG5hbWU9XCJjaGVja3t7aXRlbS5faGFzaH19XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaGFuZGxlQ2xpY2soJGV2ZW50LCBpdGVtKTtcIj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtbm8tYm9yZGVyIGVzdC1jb2wtbWluXCIgKm5nSWY9XCIoaXRlbS5sb2NrZWQgfHwgaXRlbS5fc2VwKSAmJiBTZWxlY3Rpb25cIiBbc3R5bGUud2lkdGgucHhdPVwiMjBcIj48L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2YgUm93VERzW2l0ZW0uX2hhc2hdOyBsZXQgaW5kZXggPSBpbmRleDsgdHJhY2tCeTogSURUcmFja0J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuUGlubmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpbmRleCwgY2VsbDogY2VsbCwgcGlubmVkOiB0cnVlIH07O1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSBlZmZldHRpdm8gZGVsbGEgcmlnYSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIFJvd1REc1tpdGVtLl9oYXNoXTsgbGV0IGluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IElEVHJhY2tCeVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuUGlubmVkO1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSwgaW5kZXg6IGluZGV4LCBjZWxsOiBjZWxsLCBwaW5uZWQ6IGZhbHNlIH07XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBDZWxsYSBjdXN0b21penphdGEsIGVsZW1lbnRvIGdyYWZpY28gYmFzZSBwZXIgbGEgdGFiZWxsYSAtLT5cclxuPG5nLXRlbXBsYXRlICNjdXN0b21UZCBsZXQtaXRlbSBsZXQtY2VsbD1cImNlbGxcIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1waW5uZWQ9XCJwaW5uZWRcIj5cclxuXHJcbiAgICA8IS0tIEN1c3RvbWl6emF6aW9uZSBwZXIgY2VsbGUgY29uIGljb25hIChzb25vIGVzc2VuemlhbG1lbnRlIG9wZXJhemlvbmkgc2VtcGxpY2kgZSBiYXN0YSkgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbC5JY29uQ2xhc3MgJiYgY2VsbC5WaXNpYmxlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjZWxsLkNvbmRpdGlvbkZpZWxkIHx8ICgoKGl0ZW0ucHJvcGVydGllcyB8fCBpdGVtKSB8IGVzdF9wcm9waW5zZW5zaXRpdmUgOiBjZWxsLkNvbmRpdGlvbkZpZWxkKSA9PSBjZWxsLkNvbmRpdGlvblZhbHVlKVwiPlxyXG4gICAgICAgICAgICA8dGQgW2NsYXNzLmVzdC1uby1yaWdodC1wYWRkaW5nXT1cImluZGV4ICE9IER5bmFtaWNPcGVyYXRpb25zLmxlbmd0aCAtMVwiIFtjbGFzcy5lc3Qtbm8tbGVmdC1wYWRkaW5nXT1cImluZGV4ICE9IDBcIiBjbGFzcz1cImVzdC1jb2wtbWluXCI+PHNwYW4gdGl0bGU9XCJ7e2NlbGwuVGl0bGV9fVwiIGNsYXNzPVwie3tjZWxsLkljb25DbGFzc319IGVzdC1wb2ludGVyXCIgKGNsaWNrKT1cImR5bmFtaWNPcGVyYXRpb24oaXRlbSwgY2VsbC5JRClcIj57e2NlbGwuQ29udGVudH19PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuQ29uZGl0aW9uRmllbGQgJiYgKCgoaXRlbS5wcm9wZXJ0aWVzIHx8IGl0ZW0pIHwgZXN0X3Byb3BpbnNlbnNpdGl2ZSA6IGNlbGwuQ29uZGl0aW9uRmllbGQpICE9IGNlbGwuQ29uZGl0aW9uVmFsdWUpXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImVzdC1jb2wtbWluIGVzdC1uby1zaWRlLXBhZGRpbmdcIj48L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLSAgIEFUVEVOWklPTkU6IEdsaSBzcGF6aSBmcmEgbGUgcHJvcHJpZXTDoCBkaSBxdWVzdG8gbWVnYSB0ZCBzb25vIHNpZ25pZmljYXRpdmkgZSBkaXZpZG9ubyBsYSBkaWNoaWFyYXppb25lIGluIHNlemlvbmk6IC1cclxuICAgIC0gICAuIEdlbmVyaWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1cclxuICAgIC0gICAuIEdlc3Rpb25lIGFsbGluZWFtZW50byBlIGNvbG9yaSBwZXIgbGEgbW9kYWxpdMOgIHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uaSBncmFmaWNoZSBwYXJ0aWNvbGFyaSBwZXIgaWwgUGlubmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uZSBkZWxsYSBzZWxlemlvbmUgYSBzaW5nb2xhIGNlbGxhIGluIGFzc2VuemEgZGkgcGlubmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uZSBjbGljayBjbGFzc2ljbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG5cclxuICAgIDx0ZCAqbmdJZj1cIiFjZWxsLkljb25DbGFzcyAmJiBjZWxsLlZpc2libGVcIlxyXG4gICAgICAgIGVzLXRkPVwie3tjZWxsLlByb3BlcnR5IHx8IGNlbGwuSUR9fVwiXHJcbiAgICAgICAgaWQ9XCJlc3RkX3t7Y2VsbC5Qcm9wZXJ0eSB8fCBjZWxsLklEfX1fe3tpdGVtLl9vcmRpbmFsfX1fe3tpbmRleH19XCJcclxuICAgICAgICBjbGFzcz1cInt7IGNlbGwuQ2xhc3MgfX1cIlxyXG5cclxuICAgICAgICBbQ29udGV4dF09XCJpdGVtLl9oYXNoXCJcclxuICAgICAgICBcclxuICAgICAgICBbY2xhc3MuZXN0LWRlZmF1bHQtcm93LWhlaWdodF09XCIhSGlnaENlbGxEZW5zaXR5XCJcclxuICAgICAgICBbY2xhc3MuZXN0LXdoaXRlLXNlbGVjdGVkXT1cIml0ZW0uX3NlbGVjdGVkXCJcclxuXHJcbiAgICAgICAgW2NsYXNzLmVzdC1uby1zZWxlY3Rpb25dPVwiRWRpdGFibGUgJiYgY2VsbC5Qcm9wZXJ0eU5hbWVcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcmctaGRyXT1cImNlbGwuR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcmctYWdnXT1cImNlbGwuR3JvdXBBZ2dyZWdhdGlvblwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1ub3dyYXBdPVwiSGllcmFyY2h5IHx8ICFjZWxsLldyYXBzXCJcclxuXHJcbiAgICAgICAgW3N0eWxlLnRleHQtYWxpZ25dPVwiICghcGlubmVkICYmIGNlbGwuQWxpZ25tZW50KSA/IGNlbGwuQWxpZ25tZW50IDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cIighcGlubmVkICYmIGl0ZW0uZm9yZWNvbG9ycyAmJiBjZWxsLlByb3BBY2Nlc3NvcikgPyBpdGVtLmZvcmVjb2xvcnNbY2VsbC5Qcm9wQWNjZXNzb3JdIDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiKCFwaW5uZWQgJiYgaXRlbS5iYWNrY29sb3JzICYmIGNlbGwuUHJvcEFjY2Vzc29yKSA/IGl0ZW0uYmFja2NvbG9yc1tjZWxsLlByb3BBY2Nlc3Nvcl0gOiBudWxsXCJcclxuXHJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInBpbm5lZCA/IGNlbGwuUGlubmVkV2lkdGggOiBudWxsXCJcclxuICAgICAgICBbY2xhc3MuZXN0LW5vLWJvcmRlcl09XCJwaW5uZWRcIlxyXG5cclxuICAgICAgICBbY2xhc3MuZXN0LW5vLWJvcmRlci1ib3R0b21dPVwic2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWwgKyAxXT8uW2luZGV4XT8udGJvcmRlclwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1uby1ib3JkZXItdG9wXT1cInNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsIC0gMV0/LltpbmRleF0/LmJib3JkZXJcIlxyXG5cclxuICAgICAgICBbY2xhc3MuZXN0LWx0YWItYm9yZGVyXT1cImNlbGwuTGVmdEJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8ubGJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4IC0gMV0/LnJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcnRhYi1ib3JkZXJdPVwiY2VsbC5SaWdodEJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8ucmJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4ICsgMV0/Lmxib3JkZXJcIlxyXG5cclxuICAgICAgICBbY2xhc3MuZXN0LXNlbGVjdGVkLWNlbGxdPVwic2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8uc2VsZWN0ZWRcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1sYm9yZGVyXT1cInNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/Lmxib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1yYm9yZGVyXT1cInNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/LnJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC10Ym9yZGVyXT1cInNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/LnRib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1iYm9yZGVyXT1cInNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/LmJib3JkZXJcIlxyXG5cclxuICAgICAgICBbY2xhc3MuZXN0LWNlbGwtbGJvcmRlci10bXBdPVwiIWNlbGwuTGVmdEJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8ubGJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8ubG92ZXJsYXBzXCJcclxuICAgICAgICBbY2xhc3MuZXN0LWNlbGwtcmJvcmRlci10bXBdPVwiIWNlbGwuUmlnaHRCb3JkZXIgJiYgIXNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/LnJib3JkZXIgJiYgIXNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtpbmRleF0/LnJvdmVybGFwc1wiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1jZWxsLXRib3JkZXItdG1wXT1cIiFzZWxlY3Rpb25TdGF0dXNbaXRlbS5fb3JkaW5hbF1baW5kZXhdPy50Ym9yZGVyICYmICFzZWxlY3Rpb25TdGF0dXNbaXRlbS5fb3JkaW5hbF1baW5kZXhdPy50b3ZlcmxhcHNcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1iYm9yZGVyLXRtcF09XCIhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8uYmJvcmRlciAmJiAhc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2luZGV4XT8uYm92ZXJsYXBzXCJcclxuXHJcbiAgICAgICAgKG1vdXNlZG93bik9XCJtb3VzZWRvd24oJGV2ZW50LCBjZWxsLCBpdGVtKVwiXHJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcigkZXZlbnQpXCJcclxuICAgICAgICAobW91c2V1cCk9XCJtb3VzZXVwKCRldmVudClcIlxyXG4gICAgICAgIChvbkNlbGxHZW5lcmF0aW9uKT1cInJlZ2lzdGVyQ2VsbCgkZXZlbnQpXCJcclxuXHJcbiAgICAgICAgKGNsaWNrKT1cImRiQ2xpY2tFZGl0T3JTaW5nbGVDbGlja1Jvd1NlbGVjdGlvbigkZXZlbnQsIGNlbGwsIGl0ZW0pXCI+XHJcblxyXG4gICAgICAgIDxkaXYgW2NsYXNzLmVzdC1lZGl0LWhpZGRlbl09XCJjZWxsLl9lZGl0aW5nXCIgW2NsYXNzLmVzdC1wcmVdPVwiIShIaWVyYXJjaHkgJiYgaW5kZXggPT0gMClcIj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgI0RFQlVHPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWJ1ZyBib3ggaW4gY2FzbyBsYSByb2JhIGNoZSB2aWVuZSBzY3JpdHRhIG5lbGxlIGNlbGxlIG5vbiB0b3JuaS4gU2NpcnZlcmUgcXVpIGkgcHJvcHJpIGJpbmRpbmcgcGVyIGNvbnRyb2xsYXJlIGNvc2UgLS0+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSA5MCUgVGVtcGxhdGUgZGlzcG9uaWJpbGUsIHF1aW5kaSBkZXJpdmFudGUgZGEgKnRkLCBjb250cm9sbG8gZ2l1c3RvIGNoZSBub24gc2lhIHVuIGZpZWxkIHBhcnRpY29sYXJlIG11bHRpIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbC5UZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjZWxsLk11bHRpXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGwuVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2VsbC5NdWx0aVwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsLlRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogKGl0ZW1bY2VsbC5NdWx0aVByb3BdID8gaXRlbVtjZWxsLk11bHRpUHJvcF1bY2VsbC5NdWx0aUluZGV4XSA6IHt9KSB9XCI+PC9uZy1jb250YWluZXI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gOCVcclxuICAgICAgICAgICAgICAgIFRlbXBsYXRlIG5vbiBkaXNwb25pYmlsZSwgcHXDsiB2ZW5pcmUgZGFcclxuICAgICAgICAgICAgICAgIFJvdXRlUGF0aCBpbiBjYXNvIHNpYSB1biBsaW5rIGRpIHVuYSB0YWJlbGxhIGRpbmFtaWNhXHJcbiAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3IgaW4gY2FzbyBkaSBSZXBvcnRSb3cgKHF1aW5kaSBvZ2dldHRpIGNvbiBcInZhbHVlc1wiICBkZW50cm8pLFxyXG4gICAgICAgICAgICAgICAgbyBSZW5kZXJlciBzZSBtb2RhbGl0w6AgZGluYW1pY2Evc3RhbmRhcmQgKGluIHF1YWwgY2FzbyBpbCByZW5kZXJlciDDqCBpbCBkZWZhdWx0KVxyXG4gICAgICAgICAgICAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjZWxsLlRlbXBsYXRlICYmICFjZWxsLk11bHRpICYmICFjZWxsLkNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiY2VsbC5Sb3V0ZVBhdGhcIiBbcm91dGVyTGlua109XCJpdGVtIHwgZXN0X3JvdXRlcmxpbmsgOiBjZWxsLlJvdXRlUGF0aCA6IGNlbGwuUm91dGVQYXJhbWV0ZXJQcm9wZXJ0aWVzXCIgY2xhc3M9XCJlc3QtbGlua1wiIFtpbm5lckhUTUxdPVwiaXRlbS5wcm9wZXJ0aWVzID8gaXRlbS5wcm9wZXJ0aWVzW2NlbGwuUHJvcGVydHlOYW1lXSA6IGl0ZW1bY2VsbC5Qcm9wZXJ0eU5hbWVdXCI+PC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2VsbC5Qcm9wQWNjZXNzb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyhpdGVtLnZhbHVlcz8gaXRlbS52YWx1ZXNbY2VsbC5Qcm9wQWNjZXNzb3JdIDogaXRlbVtjZWxsLlByb3BBY2Nlc3Nvcl0pIHwgZXN0X2Zvcm1hdDogY2VsbC5Gb3JtYXQgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuUHJvcEFjY2Vzc29yICYmICFjZWxsLlJvdXRlUGF0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsLlByb3BlcnR5TmFtZSB8IGVzdF9yZW5kZXJlcjogeyBuYW1lOiBjZWxsLlJlbmRlcmVyTmFtZSwgc3JjOiBFc1Rkc0RpcmVjdGl2ZSwgZmFsbGJhY2s6IGRlZmF1bHRFc1RkIH07IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRlZmluaXRpb246IGNlbGwsIHZhbHVlOiBpdGVtLnByb3BlcnRpZXMgPyBpdGVtLnByb3BlcnRpZXNbY2VsbC5Qcm9wZXJ0eU5hbWVdIDogaXRlbVtjZWxsLlByb3BlcnR5TmFtZV0sIHR5cGU6IGNlbGwuUHJvcGVydHlUeXBlfSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDElIFNlIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIG1ldHRvIGlsIHRkIHBlciBuYXZpZ2FyZSBsYSBnZXJhcmNoaWEgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWVyYXJjaHkgJiYgaW5kZXggPT0gMFwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJIaWVyYXJjaHlOYXZpZ2F0b3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gMSUgQ29udGVudCBwcm9ncmFtbWF0aWNvIHBlciBsZSBjYXNpc3RpY2hlIGRpIFJvdyBHcm91cGluZyBlY2MuLi4gLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsLkNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIHt7Y2VsbC5Db250ZW50fX1cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjZWxsLl9lZGl0aW5nXCIgY2xhc3M9XCJlc3QtbXQtbWluLTVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGwuUHJvcGVydHlOYW1lIHwgZXN0X2VkaXRvcjogeyBuYW1lOiBjZWxsLkVkaXRvck5hbWUsIHNyYzogRXNUZEVkaXRvckRpcmVjdGl2ZXMsIGZhbGxiYWNrOiBkZWZhdWx0RWRpdG9yfTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGVmaW5pdGlvbjogY2VsbCwgY29sdW1uSW5kZXg6IGluZGV4LCBpdGVtOiBpdGVtLCBmaW5hbGl6ZXI6IGZpbmFsaXplVXNlckVkaXQuYmluZCh0aGlzLCBjZWxsLCBpdGVtLCBpbmRleCkgfSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBOYXZpZ2F0b3JlIGRlbGxhIGdlcmFyY2hpYSBkaSB1bmEgdmlldyBnZXJhcmNoaWNhLCBjb24gdGFzdG8gcGVyIGVzcGFuZGVyZSBlIGNvbGxhc3NhcmUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjSGllcmFyY2h5TmF2aWdhdG9yIGxldC1pdGVtPlxyXG4gICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5wYXJlbnRcIiBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiIHN0eWxlPVwidmlzaWJpbGl0eTpoaWRkZW5cIj48L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucGFyZW50ICYmIGl0ZW0uX2V4cGFuZGVkXCIgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd24gZXN0LXBvaW50ZXIgZXN0LW5vLXNlbGVjdGlvblwiIChjbGljayk9XCJoaWVyYXJjaHlNb2RlX0guY29sbGFwc2VQYXJlbnQoaXRlbVt0aGlzLk93bktleV0pXCI+PC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJpdGVtLnBhcmVudCAmJiAhaXRlbS5fZXhwYW5kZWRcIiBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXAgZXN0LXBvaW50ZXIgZXN0LW5vLXNlbGVjdGlvblwiIChjbGljayk9XCJoaWVyYXJjaHlNb2RlX0guZXhwYW5kUGFyZW50KGl0ZW1bdGhpcy5Pd25LZXldKVwiPjwvc3Bhbj5cclxuICAgICZuYnNwO1xyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSBQdWxzYW50aSBkaSBlbGltaW5hemlvbmUvdW5kbyBlbGltaW5hemlvbmUgZWQgZXNwb3J0YXppb25lIGNoZSB2YW5ubyBpbiBmb25kbyBhZCB1biByZWNvcmQgZWRsbGEgdGFiZWxsYSAtLT5cclxuPG5nLXRlbXBsYXRlICNib2R5RGVsZXRlQW5kRXhwb3J0IGxldC1vcHRpb25zPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlJlbW92YWwgJiYgIVJlbW92YWxDb25kaXRpb25cIj5cclxuICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtc3RpY2t5LWxhc3QtY29sdW1ue3tvcHRpb25zLmV2ZW4/ICctYWx0JyA6ICcnfX0ge3tFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb3JuZXJNZW51T3B0aW9ucyA/ICdlc3QtcmlnaHQtOScgOiAnJ319XCIgKm5nSWY9XCIhKG9wdGlvbnMuaXRlbS5yZW1vdmVkIHx8IG9wdGlvbnMuaXRlbS5kZWxldGVkKVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtcmVtb3ZlIGVzdC1wb2ludGVyIHRleHQtZGFuZ2VyXCIgW2hpZGRlbl09XCJvcHRpb25zLml0ZW0ucmVtb3ZhYmxlICE9IHVuZGVmaW5lZCAmJiAhb3B0aW9ucy5pdGVtLnJlbW92YWJsZVwiIChjbGljayk9XCJvblJlbW92YWwuZW1pdChvcHRpb25zLml0ZW0pXCI+PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwiZXN0LXN0aWNreS1sYXN0LWNvbHVtbnt7b3B0aW9ucy5ldmVuPyAnLWFsdCcgOiAnJ319IHt7RXhwb3J0IHx8IEhpZGRlbkNvbHVtbnMgfHwgQ29ybmVyTWVudU9wdGlvbnMgPyAnZXN0LXJpZ2h0LTknIDogJyd9fVwiICpuZ0lmPVwiKG9wdGlvbnMuaXRlbS5yZW1vdmVkIHx8IG9wdGlvbnMuaXRlbS5kZWxldGVkKVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdW5kbyAgdGV4dC13YXJuaW5nIGVzdC1wb2ludGVyXCIgKGNsaWNrKT1cIm9uQWJvcnRSZW1vdmFsLmVtaXQob3B0aW9ucy5pdGVtKVwiPjwvc3Bhbj48L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUmVtb3ZhbCAmJiBSZW1vdmFsQ29uZGl0aW9uXCI+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwiZXN0LXN0aWNreS1sYXN0LWNvbHVtbnt7b3B0aW9ucy5ldmVuPyAnLWFsdCcgOiAnJ319IHt7RXhwb3J0IHx8IEhpZGRlbkNvbHVtbnMgfHwgQ29ybmVyTWVudU9wdGlvbnMgPyAnZXN0LXJpZ2h0LTknIDogJyd9fVwiICpuZ0lmPVwiIShvcHRpb25zLml0ZW0ucmVtb3ZlZCB8fCBvcHRpb25zLml0ZW0uZGVsZXRlZCkgJiYgb3B0aW9ucy5pdGVtW1JlbW92YWxDb25kaXRpb25dXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1yZW1vdmUgZXN0LXBvaW50ZXIgdGV4dC1kYW5nZXJcIiBbaGlkZGVuXT1cIm9wdGlvbnMuaXRlbS5yZW1vdmFibGUgIT0gdW5kZWZpbmVkICYmICFvcHRpb25zLml0ZW0ucmVtb3ZhYmxlXCIgKGNsaWNrKT1cIm9uUmVtb3ZhbC5lbWl0KG9wdGlvbnMuaXRlbSlcIj48L3NwYW4+PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtc3RpY2t5LWxhc3QtY29sdW1ue3tvcHRpb25zLmV2ZW4/ICctYWx0JyA6ICcnfX0ge3tFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb3JuZXJNZW51T3B0aW9ucyA/ICdlc3QtcmlnaHQtOScgOiAnJ319XCIgKm5nSWY9XCIob3B0aW9ucy5pdGVtLnJlbW92ZWQgfHwgb3B0aW9ucy5pdGVtLmRlbGV0ZWQpICYmIG9wdGlvbnMuaXRlbVtSZW1vdmFsQ29uZGl0aW9uXVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtdW5kbyAgdGV4dC13YXJuaW5nIGVzdC1wb2ludGVyXCIgKGNsaWNrKT1cIm9uQWJvcnRSZW1vdmFsLmVtaXQob3B0aW9ucy5pdGVtKVwiPjwvc3Bhbj48L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImVzdC1zdGlja3ktbGFzdC1jb2x1bW57e29wdGlvbnMuZXZlbj8gJy1hbHQnIDogJyd9fSB7e0V4cG9ydCB8fCBIaWRkZW5Db2x1bW5zIHx8IENvcm5lck1lbnVPcHRpb25zID8gJ2VzdC1yaWdodC05JyA6ICcnfX1cIiAqbmdJZj1cIiFvcHRpb25zLml0ZW1bUmVtb3ZhbENvbmRpdGlvbl1cIj48c3BhbiBjbGFzcz1cImZhIGZhLXJlbW92ZSBlc3QtaGlkZGVuLXZpZXdcIj48L3NwYW4+PC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPHRkICpuZ0lmPVwiRXhwb3J0IHx8IEhpZGRlbkNvbHVtbnMgfHwgQ29ybmVyTWVudU9wdGlvbnNcIiBjbGFzcz1cImVzdC1zdGlja3ktbGFzdC1jb2x1bW57e29wdGlvbnMuZXZlbiAmJiAhSGllcmFyY2h5ID8gJy1hbHQnIDogJyd9fVwiPjwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIENvbnRleHQgbWVudSB2dW90byBkZWZhdWx0IHBlciB0dXR0ZSBsZSB0YWJlbGxhIGNoZSBub24gY2UgbCdoYW5ubywgaW4gbW9kbyBjaGUgYWwgY2xpY2sgZGVzdHJvIGFwcGFpYSBcIm5lc3N1bmEgb3AgZGlzcG9uaWJpbGVcIiAtLT5cclxuPGNvbnRleHQtbWVudSAjZW1wdHlNZW51PlxyXG4gICAgPG5nLXRlbXBsYXRlIGNvbnRleHRNZW51SXRlbT48c3Bhbj48ZW0+e3snTm8gb3BlcmF0aW9ucyBhdmFpbGFibGUnIHwgbG9jYWxpemUgOiBsY319Li4uPC9lbT48L3NwYW4+PC9uZy10ZW1wbGF0ZT5cclxuPC9jb250ZXh0LW1lbnU+XHJcblxyXG48IS0tIE1vZGFsIHBlciBjYW1iaWFyZSBwb3NpemlvbmUgZSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIGRlbGwnZXMtdGFibGUgLS0+XHJcbjxkaXYgYnNNb2RhbCAjY2hhbmdlQ29sdW1uVmlzaWJpbGl0eU1vZGFsPVwiYnMtbW9kYWxcIiBjbGFzcz1cIm1vZGFsIGZhZGVcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCIgY2RrRHJhZz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGVzdC1wb2ludGVyXCIgY2RrRHJhZ0hhbmRsZT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhSGlkZGVuQ29sdW1ucyAmJiBDb2x1bW5zT3JkZXJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQ29sdW1ucyBPcmRlcicgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSGlkZGVuQ29sdW1ucyAmJiAhQ29sdW1uc09yZGVyaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NvbHVtbnMgVmlzaWJpbGl0eScgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSGlkZGVuQ29sdW1ucyAmJiBDb2x1bW5zT3JkZXJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQ29sdW1ucyBWaXNpYmlsaXR5IGFuZCBPcmRlcicgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlIHB1bGwtcmlnaHRcIiAoY2xpY2spPVwiY2hhbmdlQ29sdW1uVmlzaWJpbGl0eU1vZGFsLmhpZGUoKTtcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFUTVBDb2x1bW5zTGlzdCB8fCBUTVBDb2x1bW5zTGlzdC5sZW5ndGggPT0gMFwiIGNsYXNzPVwiY2FyZCBjYXJkLWluZm8gZXN0LXBhZGRpbmctMTAgZXN0LW1hcmdpbi1ib3R0b20tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J1RoZXJlIGFyZSBubyBjb2x1bW5zIGNvbmZpZ3VyZWQgdG8gYmUgaGlkZGVuL3Nob3duIGluIHRoaXMgdmlldycgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlRNUENvbHVtbnNMaXN0ICYmIFRNUENvbHVtbnNMaXN0Lmxlbmd0aCA+IDBcIiBzdHlsZT1cIm1heC1oZWlnaHQ6NTAwcHg7IG92ZXJmbG93LXk6YXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1BYWFhYWFhaCBsYSB0cmlzdGV6emEuLi4gcXVpIG1pIHNlcnZpcmViYmUgbCdlcy10YWJsZSBwZXIgZmFjaWxpdGFyZSBsYSBzZWxlemlvbmUgbXVsdGlwbGEgZWNjLi4uIHBlY2NhdG8gY2hlIHNlIGxhIGxpbmtvIHF1aSBlbnRybyBpbiB1biBsb29wIGltcHJlc3Npb25hbnRlLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1zbSBlc3QtbWFyZ2luLWJvdHRvbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJlc3QtY29sLW1pblwiICpuZ0lmPVwiSGlkZGVuQ29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJlc3QtcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiZ2xvYmFsQ29sVmlzQ2hlY2tcIiBbbmdNb2RlbE9wdGlvbnNdPVwieydzdGFuZGFsb25lJzogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJjb2x1bW5NZXRhZGF0YV9ILmdsb2JhbENvbFZpc0NoZWNrQ2hhbmdlZCgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGggY2xhc3M9XCJlc3QtY29sLW1pblwiICpuZ0lmPVwiQ29sdW1uc09yZGVyaW5nXCI+PC90aD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZXN0LWNvbC1taW4gZXN0LW5vd3JhcFwiPnt7J0NvbHVtbiBOYW1lJyB8IGxvY2FsaXplIDogbGN9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUZpbGxlci0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGlubmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIkRpcmVjdGl2ZXNCYXNlZFwiIGNsYXNzPVwiZXN0LWNvbC1taW5cIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJUTVBDb2x1bW5zTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImNvbHVtbk1ldGFkYXRhX0guY29sdW1uUmVvcmRlcmVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0Ryb3BMaXN0U29ydFByZWRpY2F0ZV09XCJjb2x1bW5NZXRhZGF0YV9ILnNvcnRQcmVkaWNhdGUuYmluZCh0aGlzLmNvbHVtbk1ldGFkYXRhX0gpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXN0LWRyb3Bib3hcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgVE1QQ29sdW1uc0xpc3Q7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdDsgdHJhY2tCeTogaWRUcmFja0J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVzdC1wb2ludGVyIGVzdC1kcm9wbGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC13aGl0ZS1zZWxlY3RlZF09XCJsYXN0U2VsZWN0ZWRJdGVtSUQgPT0gaXRlbS5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC1uby1zZWxlY3Rpb25dPVwiIWl0ZW0udmlzaWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrRHJhZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiFDb2x1bW5zT3JkZXJpbmcgfHwgaXRlbS5maXhlZCB8fCBpdGVtLnBpbm5lZFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJIaWRkZW5Db2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2xhc3MuZXN0LWhpZGRlbi12aWV3XT1cIml0ZW0uZml4ZWRcIiBjbGFzcz1cImVzdC1wb2ludGVyXCIgWyhuZ01vZGVsKV09XCJpdGVtLnZpc2libGVcIiBuYW1lPVwidmlzaWJsZXt7aX19XCIgKG5nTW9kZWxDaGFuZ2UpPVwiY29sdW1uTWV0YWRhdGFfSC51cGRhdGVHbG9iYWxDb2xWaXNDaGVjaygpO1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtbm93cmFwIGRyYWctdmlzaWJsZVwiIChjbGljayk9XCJjb2x1bW5NZXRhZGF0YV9ILmNvbHVtbkNsaWNrZWQoaXRlbSk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhZHJpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnBhcmVudFRlbXBsYXRlcyAmJiBpdGVtLnBhcmVudFRlbXBsYXRlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJlc3QtZnctYm9sZCBlc3QtZnMtMTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFyZW50IG9mIGl0ZW0ucGFyZW50VGVtcGxhdGVzOyBsZXQgbGFzdD1sYXN0OyB0cmFja0J5OiBpZFRyYWNrQnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmVudC50bXBsXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhcmVudC50bXBsXCI+PC9uZy1jb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJlbnQuY29udGVudFwiPnt7cGFyZW50LmNvbnRlbnR9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFsYXN0XCI+Jm5ic3A7LSZuYnNwOzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlbXBsYXRlIGhlYWRlciBvcmlnaW5hbGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbS50ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0ubXVsdGkgPyBpdGVtLm11bHRpQ29udGVudCA6IG51bGwgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpdGVtLnRlbXBsYXRlXCI+e3tpdGVtLmRlc2NyaXB0aW9ufX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1GaWxsZXItLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cImNvbHVtbk1ldGFkYXRhX0guY29sdW1uQ2xpY2tlZChpdGVtKTtcIj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGlubmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIkRpcmVjdGl2ZXNCYXNlZCAmJiBDb2x1bW5zUGlubmFibGVcIj48c3BhbiAqbmdJZj1cIiFpdGVtLmZpeGVkICYmIGl0ZW0ucGlubmFibGVcIiBjbGFzcz1cImZhIGZhLXRodW1iLXRhY2tcIiBbY2xhc3MudGV4dC1zdWNjZXNzXT1cIml0ZW0ucGlubmVkXCIgKGNsaWNrKT1cImNvbHVtbk1ldGFkYXRhX0gucGluT3JVbnBpbkNvbHVtbihpdGVtKVwiPjwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGVzdC1tYXJnaW4tcmlnaHQtMTBcIiAoY2xpY2spPVwibGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDsgY2hhbmdlQ29sdW1uVmlzaWJpbGl0eU1vZGFsLmhpZGUoKTtcIj57eydDbG9zZScgfCBsb2NhbGl6ZSA6IGxjfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCIhVE1QQ29sdW1uc0xpc3QgfHwgVE1QQ29sdW1uc0xpc3QubGVuZ3RoID09IDBcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb2x1bW5NZXRhZGF0YV9ILmNvbmZpcm1Db2x1bW5WaXNpYmlsaXR5U2VsZWN0aW9uKCkgJiYgY2hhbmdlQ29sdW1uVmlzaWJpbGl0eU1vZGFsLmhpZGUoKVwiPnt7J0NvbmZpcm0nIHwgbG9jYWxpemUgOiBsY319PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
1850
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL2VzLXRhYmxlL2VzX3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUNILFNBQVMsRUFBRSxlQUFlLEVBQWdDLHVCQUF1QixFQUFFLEtBQUssRUFDeEYsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFNBQVMsRUFBYyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFlLE1BQU0sRUFDOUksTUFBTSxlQUFlLENBQUM7QUFLdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNOUQsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWpGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQU0vRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RSxPQUFP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Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBV0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUdrRCxnQkFBZ0I7c0JBQXhFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVDLGNBQWM7c0JBQTlELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFVL0IscUJBQXFCO3NCQUE3QixLQUFLOztBQTJoRFYsTUFBTSxPQUFPLGFBQWE7Q0FJekIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIElucHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIENvbnRlbnRDaGlsZCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFZpZXdFbmNhcHN1bGF0aW9uLCBPcHRpb25hbCwgU2VsZiwgVGVtcGxhdGVSZWYsIEluamVjdCwgVHlwZVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UsIEV4cG9ydFNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBEYXRlU2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9leHRlbnNpb25zJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gJ0Blc2ZhZW56YS9sb2NhbGl6YXRpb25zJztcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL3ByZWZlcmVuY2VzJztcclxuXHJcbi8vIFBsdWdpbnNcclxuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tICdAZXNmYWVuemEvbmd4LWNvbnRleHRtZW51JztcclxuXHJcbi8vIE1vZGVsbGkgLyBUaXBpXHJcbmltcG9ydCB7IEFwcFNlYXJjaCB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBTZWFyY2hcIjtcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwT3JkZXJpbmdcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IENvcm5lck1lbnVPcHRpb24gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9Db3JuZXJNZW51T3B0aW9uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZU9wZXJhdGlvbkRlZmluaXRpb25cIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbiB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0VzVGFibGVDb2x1bW5cIjtcclxuaW1wb3J0IHsgR3JvdXBQYWdlciB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL0dyb3VwUGFnZXJcIjtcclxuaW1wb3J0IHsgR3JvdXBSb3V0ZUZyYWdtZW50IH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvR3JvdXBSb3V0ZUZyYWdtZW50XCI7XHJcbmltcG9ydCB7IFRoRWxlbWVudCB9IGZyb20gXCIuLi8uLi9kb21haW4vaW50ZXJuYWxzL1RoRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBQYWdlckluZm9zIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvUGFnZXJJbmZvc1wiO1xyXG5pbXBvcnQgeyBUaEdyb3VwIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvVGhHcm91cFwiO1xyXG5pbXBvcnQgeyBUZEVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9UZEVsZW1lbnRcIjtcclxuaW1wb3J0IHsgSXRlbXNTZWxlY3Rpb24gfSBmcm9tICcuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvbic7XHJcbmltcG9ydCB7IEdyb3VwT3JBZ2dyZWdhdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Hcm91cE9yQWdncmVnYXRpb25cIjtcclxuaW1wb3J0IHsgR3JvdXBGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBGaWx0ZXJcIjtcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvR3JvdXBcIjtcclxuaW1wb3J0IHsgRXNUYWJsZU1vZGVsQ2hhbmdlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9Fc1RhYmxlTW9kZWxDaGFuZ2UnO1xyXG5pbXBvcnQgeyBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2V4dGVybmFscy9JdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlJztcclxuaW1wb3J0IHsgRXNUYWJsZURlZmF1bHRhYmxlIH0gZnJvbSAnLi4vLi4vZG9tYWluL2NvbmZpZ3VyYXRpb24vRXNUYWJsZURlZmF1bHRhYmxlJztcclxuXHJcbi8vIENvbXBvbmVudGkgZSBMb2NhbGl6emF6aW9uZVxyXG5pbXBvcnQgeyBFc1RkIH0gZnJvbSAnLi4vZXMtdGQvZXNfdGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXNUZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUaERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUZEVkaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGRfZWRpdG9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFRoVGRQcm92aWRlciB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZXNfdGhfdGRfcHJvdmlkZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgRXNUYWJsZUxvYyB9IGZyb20gJy4vZXNfdGFibGUuY29tcG9uZW50LmxvYyc7XHJcblxyXG4vLyBUb2tlbnNcclxuaW1wb3J0IHsgRVNUX0RFRkFVTFRTIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbi8vIEhhbmRsZXJzXHJcbmltcG9ydCB7IEV4cG9ydEhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9FeHBvcnRIYW5kbGVyXCI7XHJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9EeW5hbWljTW9kZUhhbmRsZXJcIjtcclxuaW1wb3J0IHsgSGllcmFyY2h5TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9IaWVyYXJjaHlNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBJdGVtc0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9JdGVtc0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgUmVwb3J0TW9kZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9SZXBvcnRNb2RlSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9oYW5kbGVycy9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuaW1wb3J0IHsgU2VsZWN0aW9uSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1NlbGVjdGlvbkhhbmRsZXJcIjtcclxuaW1wb3J0IHsgVXRpbGl0aWVzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9jb3JlL2hhbmRsZXJzL1V0aWxpdGllc0hhbmRsZXJcIjtcclxuXHJcbi8vIFNlcnZpY2VcclxuaW1wb3J0IHsgQ29weVBhc3RlRGV0ZWN0b3IgfSBmcm9tICcuLi8uLi9jb3JlL0NvcHlQYXN0ZURldGVjdG9yJztcclxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vLi4vY29yZS9Mb2dnZXInO1xyXG5cclxuLy8gUnhqc1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKiogQ29tcG9uZW50ZSBjaGUgcGVybWV0dGUgZGkgcmFwcHJlc2VudGFyZSB1bmEgZ3JpZ2xpYSBkaSB2YWxvcmkgKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VzLXRhYmxlJyxcclxuICAgIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBFc1RhYmxlTG9jIH1dLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZXNfdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9lc190YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEVzVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcclxuXHJcbiAgICAvLyBDb21wb25lbnRpIHBlciBsYSBnZXN0aW9uZSBkZWxsZSB2YXJpZSBmdW56aW9uYWxpdMOgIGRlbGwnZXMtdGFibGVcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBleHBvcnRfSDogRXhwb3J0SGFuZGxlcjtcclxuICAgIC8qKiBAaWdub3JlICovIHB1YmxpYyBjb2x1bW5NZXRhZGF0YV9IOiBDb2x1bW5NZXRhZGF0YUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgZHluYW1pY01vZGVfSDogRHluYW1pY01vZGVIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIGhpZXJhcmNoeU1vZGVfSDogSGllcmFyY2h5TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgaXRlbXNfSDogSXRlbXNIYW5kbGVyO1xyXG4gICAgLyoqIEBpZ25vcmUgKi8gcHVibGljIHJlcG9ydE1vZGVfSDogUmVwb3J0TW9kZUhhbmRsZXI7XHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgcm93R3JvdXBpbmdfSDogUm93R3JvdXBpbmdIYW5kbGVyXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwdWJsaWMgc2VsZWN0aW9uX0g6IFNlbGVjdGlvbkhhbmRsZXI7XHJcblxyXG4gICAgLy8gU3Vic2NyaWJlcnMgcGVyIGdsaSBldmVudGkgZGkgY29waWEgZSBpbmNvbGxhXHJcbiAgICAvKiogQGlnbm9yZSAqLyBwcml2YXRlIGNvcHlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIC8qKiBAaWdub3JlICovIHByaXZhdGUgcGFzdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBwcmVmU2VydmljZTogUHJlZmVyZW5jZXNTZXJ2aWNlLFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRVNUX0RFRkFVTFRTKSBwcml2YXRlIGRlYWZ1bHRzOiBFc1RhYmxlRGVmYXVsdGFibGUsXHJcbiAgICAgICAgcHVibGljIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgdXRpbGl0aWVzX0g6IFV0aWxpdGllc0hhbmRsZXIsXHJcbiAgICAgICAgcHVibGljIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZXhwRXh0czogRXhwb3J0U2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGF0ZUV4dHM6IERhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbXNnRXh0czogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb3B5UGFzdGVEZXRlY3RvcjogQ29weVBhc3RlRGV0ZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXIpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWEgZSBpbmNvbGxhIHNpIGVmZmV0dHVhbm8gc29sbyBzZSBsYSB0YWJlbGxhIGF0dHVhbGUgw6ggdW5pdm9jYW1lbnRlIHNlbGV6aW9uYXRhXHJcbiAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PbkNvcHkuc3Vic2NyaWJlKCgpID0+IHsgaWYgKHRoaXMuY29weVBhc3RlRGV0ZWN0b3IuQWN0aXZlRXN0UmVmZXJlbmNlID09IHRoaXMpIHRoaXMuaGFuZGxlQ29weSgpOyB9KTtcclxuICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uID0gdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5PblBhc3RlLnN1YnNjcmliZSgoKSA9PiB7IGlmICh0aGlzLmNvcHlQYXN0ZURldGVjdG9yLkFjdGl2ZUVzdFJlZmVyZW5jZSA9PSB0aGlzKSB0aGlzLmhhbmRsZVBhc3RlKCk7IH0pO1xyXG5cclxuICAgICAgICB0aGlzLmV4cG9ydF9IID0gbmV3IEV4cG9ydEhhbmRsZXIodGhpcywgdGhpcy5leHBFeHRzLCB0aGlzLm1zZ0V4dHMsIHRoaXMudXRpRXh0cywgdGhpcy5kYXRlRXh0cyk7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19IID0gbmV3IFJvd0dyb3VwaW5nSGFuZGxlcih0aGlzLCB0aGlzLnV0aWxpdGllc19ILCB0aGlzLmRhdGVFeHRzKTtcclxuICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0ggPSBuZXcgQ29sdW1uTWV0YWRhdGFIYW5kbGVyKHRoaXMsIHRoaXMudXRpbGl0aWVzX0gsIHRoaXMudXRpRXh0cywgdGhpcy5wcmVmU2VydmljZSwgdGhpcy5yb3dHcm91cGluZ19IKTtcclxuICAgICAgICB0aGlzLmR5bmFtaWNNb2RlX0ggPSBuZXcgRHluYW1pY01vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TW9kZV9IID0gbmV3IEhpZXJhcmNoeU1vZGVIYW5kbGVyKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbXNfSCA9IG5ldyBJdGVtc0hhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRNb2RlX0ggPSBuZXcgUmVwb3J0TW9kZUhhbmRsZXIodGhpcywgdGhpcy51dGlsaXRpZXNfSCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSCA9IG5ldyBTZWxlY3Rpb25IYW5kbGVyKHRoaXMsIHRoaXMucm93R3JvdXBpbmdfSCk7XHJcblxyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpXHJcbiAgICAgICAgICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3ViamVjdCB1dGlsaXp6YXRvIGludGVybmFtZW50ZSBsYXRvIEVzVGFibGUgcGVyIGNhdXNhcmUgaWwgRm9jdXMgbGF0byBjb21wb25lbnRlIGRpIElucHV0ICovXHJcbiAgICBwdWJsaWMgRm9jdXNTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxyXG4gICAgLyoqIFRpbWVyIGNoZSB2ZXJyw6AgaW1wb3N0YXRvIGEgKipkb3VibGVDbGlja0J1ZmZlck1zKiogcGVyIGNhcGlyZSBzZSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrIHNpbmdvbG8gbyB1biBkb3VibGVjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBjZWxsRGJDbGlja1RpbWVyOiBhbnk7XHJcbiAgICAvKiogU2UgdmVuZ29ubyBlZmZldHR1YXRpIDIgY2xpY2sgYSBkaXN0YW56YSBpbmZlcmlvcmUgYSBxdWVzdGkgTWlsbGlzZWNvbmRpIHZpZW5lIGNvbnNpZGVyYXRvIHVuIGRvcHBpbyBjbGljayAqL1xyXG4gICAgcHJpdmF0ZSBkb3VibGVDbGlja0J1ZmZlck1zOiBudW1iZXIgPSAyMDA7XHJcbiAgICAvKiogVmlldyBmaW5hbGUgc3UgY3VpIGJpbmRhcnNpIGxhdG8gRnJvbnRlbmQsIGlsIHRpcG8gcHXDsiBlc3NlcmUgSUFwcFNlYXJjaDxhbnk+IChwZXIgbGEgKip2aWV3TW9kZSoqKSwgYW55W10gKHBlciBsJyoqYXJyYXlNb2RlKiopICovXHJcbiAgICBwdWJsaWMgVmlldzogYW55ID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRhIGN1aSBsJ2VzLXRhYmxlIG1vc3RyYSBpIHB1bHNhbnRpIGRpIHBhZ2luYXppb25lIGluIGJhc3NvIGEgZGVzdHJhICovXHJcbiAgICBwdWJsaWMgYXJyYXlQdWxzYW50aTogeyB2YWw6IG51bWJlciwgY3NzQ2xhc3M6IHN0cmluZyB9W107XHJcbiAgICAvKiogSW5kaWNhIHNlIGwnZXMtdGFibGUgZGV2ZSBtb3N0cmFyZSBpbCBjaGVjayBnbG9iYWxlIG5lbGwnaGVhZGVyIHBlciBmYXJlIGlsIFwic2VsZXppb25hIHR1dHRvXCIgKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDaGVjayA9IGZhbHNlO1xyXG4gICAgLyoqIFRpZW5lIGRhIGNvbnRvIGwndWx0aW1vIGVsZW1lbnRvIHNlbGV6aW9uYXRvIGluIG1vZG8gZGEgcG90ZXIgZWZmZXR0dWFyZSBpbCBTSElGVCtDTElDSyAqL1xyXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWQ6IGFueSA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGludGVybm8gcGVyIGlsIG51bWVybyBkaSBlbGVtZW50aSBzZWxlemlvbmF0aSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGVkT2JqZWN0cyA9IDA7XHJcbiAgICAvKiogSW5kaWNhIHNlIMOoIHBvc3NpYmlsZSBlZmZldHR1YXJlIHVuYSBzZWxlemlvbmUgbWFzc2l2YSAqL1xyXG4gICAgcHVibGljIGNhblNlbGVjdEFsbCA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBJQXBwU2VhcmNoPGFueT4gKi9cclxuICAgIHB1YmxpYyB2aWV3TW9kZSA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBzZSBpbCBjb21wb25lbnRlIHN0YSBnZXN0ZW5kbyB1biBhbnlbXSAqL1xyXG4gICAgcHVibGljIGFycmF5TW9kZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVuaXRvcmUgZGVnbGkgZWxlbWVudGkgZGEgbGlzdGFyZSBsYXRvIGludGVyZmFjY2lhIGRvcG8gdHV0dGUgbGUgZWxhYm9yYXppb25pIGRlbCBjYXNvLFxyXG4gICAgICogZ2VuZXJhbG1lbnRlIG5vbiBzb25vIGFsdHJvIGNoZSB0dXR0aSBnbGkgb2dnZXR0aSBkYSBwcmVzZW50YXJlIGNvbiBpbiBwacO5IGwnaGFzaCBjYWxjb2xhdG8gcGVyIGlkZW50aWZpY2FyZSAxIG9nZ2V0dG8gY29uIGxhIHByb3ByaWEgcmlnYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogU3Rlc3NhIGNvc2EgZGVsbGEgKipib3VuZFNvdXJjZSoqLCB1dGlsaXp6YXRhIGNvbWUgYXBwb2dnaW8gdGVtcG9yYW5lbyBpbnRlcm5vICovXHJcbiAgICBwdWJsaWMgVE1QQm91bmRTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgXCJGZXR0YVwiIGRpIG9nZ2V0dGkgdXRpbGl6emF0YSBuZWxsJ2VuZGxlc3Mgc2Nyb2xsLCBvZ25pIGVsZW1lbnRvIGRpIHF1ZXN0byBhcnJheSDDqCB1biBibG9jY2hldHRvIGRpIDEwMCBlbGVtZW50aSAqL1xyXG4gICAgcHVibGljIGJvdW5kU3ViU291cmNlczogYW55W10gPSBbXTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVzdGEgZnVuZ2UgZGEgaW5kaWNhdG9yZSBwZXIgZ2xpIHNsaWNlIGluc2VyaXRpLCBsYSBsdW5naGV6emEgZG92cmViYmUgZXNzZXJlIGNvcnJpc3BvbmRlbnRlIGEgKipib3VuZFN1YlNvdXJjZXMqKiAqL1xyXG4gICAgcHVibGljIGFkZGVkU2xpY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBjaGUgaWRlbnRpZmljYSBpbCB2YWxvcmUgZGVsIFwic2VsZXppb25hIFR1dHRvXCIgbmVsbGEgcGFnaW5hemlvbmUgKi9cclxuICAgIHB1YmxpYyBkZWZhdWx0QWxsUGFnZU92ZXJyaWRlID0gOTk5OTk5O1xyXG4gICAgLyoqIFNlcnZlIHBlciB0ZW5lcmUgaW4gbWVtb3JpYSBpbCBjb250ZWdnaW8gcHJlY2VkZW50ZSBlIHJlY3VwZXJhcmxvIGluIGNhc28gZGl2ZW50aSAtMiAodmVyaWZpY2FyZSBjb24gQWxlIHBlcmNow6kgbGEgbG9naWNhIGRlbCAtMikgKi9cclxuICAgIHB1YmxpYyBwcmV2aW91c0NvdW50OiBudW1iZXI7XHJcbiAgICAvKiogSW5kaWNhIHNlIHV0aWxpenphcmUgaWwgc2lzdGVtYSBkaSBhdXRvdXBkYXRlLCBjaW/DqCB1biB0cmlnZ2VyIHRpbWUtaXp6YXRvIGluIGFsdG8gYSBkZXN0cmEgZGVsbGEgdGFiZWxsYSBjaGUgcmlwZXRlIGxlIHJpY2VyY2hlIG9nbmkgWCAqKnNlY29uZHMqKiAqL1xyXG4gICAgcHVibGljIGF1dG9VcGRhdGUgPSBmYWxzZTtcclxuICAgIC8qKiBOdW1lcm8gZGkgc2Vjb25kaSBkYSBmYXJlIHRyYXNjb3JyZXJlIGZyYSB1bmEgcmljZXJjYSBlIGwnYWx0cmEgKi9cclxuICAgIHB1YmxpYyBzZWNvbmRzID0gJzEwJztcclxuICAgIC8qKiBSaWZlcmltZW50byBhbGwnSW50ZXJ2YWwgY2hlIHZpZW5lIGdlbmVyYXRvIHNlICoqYXV0b1VwZGF0ZSoqIMOoIGltcG9zdGF0YSBhIHRydWUgaW4gbW9kbyBkYSBwb3RlcmxvIHJpcHVsaXJlICovXHJcbiAgICBwdWJsaWMgdXBkYXRlVGltZXI6IGFueTtcclxuICAgIC8qKiBJbXBvc3RhdGEgYSB0cnVlIG9nbmkgdm9sdGEgY2hlIHZpZW5lIGF2dmlhdGEgdW5hIHJpY2VyY2EsIGUgYSBmYWxzZSBvZ25pIHZvbHRhIGNoZSB1biBudW92byB2YWxvcmUgdmllbmUgcmljZXZ1dG8gKi9cclxuICAgIHB1YmxpYyByZXNlYXJjaEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dURHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1REczogeyBbY29udGV4dDogc3RyaW5nXTogVGRFbGVtZW50W10gfSA9IG51bGw7XHJcbiAgICAvKiogTW9kZWxsbyByYXBwcmVzZW50YW50ZSB1biBkaXppb25hcmlvIGRpIHJpZ2hlIGRlbGxhIHRhYmVsbGEsIGNvbiBjaGlhdmUgbCdoYXNoIGUgdmFsb3JlIGxhIGxpc3RhIGRpIGNlbGxlICovXHJcbiAgICBwdWJsaWMgUm93VERzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBUZEVsZW1lbnRbXSB9ID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgKipSb3dURHMqKiDDqCB1biBvZ2dldHRvIHZ1b3RvIG8gbWVubyAqL1xyXG4gICAgcHVibGljIEVtcHR5Um93VGRzOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUSHMqKiAqL1xyXG4gICAgcHVibGljIFRNUFJvd1RIczogVGhFbGVtZW50W10gPSBudWxsO1xyXG4gICAgLyoqIE1vZGVsbG8gcmFwcHJlc2VudGFudGUgdW4gc2luZ29sbyB0aCBkZWxsYSB0YWJlbGxhLCBnZW5lcmF0byBpbiBiYXNlIGFsbGUgY29uZmlndXJhemlvbmkgZSBhZ2xpIG9nZ2V0dGkgcmljZXZ1dGkgKi9cclxuICAgIHB1YmxpYyBSb3dUSHM6IFRoRWxlbWVudFtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIGRpIGFwcG9nZ2lvIHRlbXBvcmFuZW8gcGVyIGkgKipSb3dUaEdyb3VwcyoqICovXHJcbiAgICBwdWJsaWMgVE1QUm93VGhHcm91cHM6IFRoR3JvdXBbXVtdID0gbnVsbDtcclxuICAgIC8qKiBNb2RlbGxvIHJhcHByZXNlbnRhbnRlIHVuIHNpbmdvbG8gaGVhZGVyIGdyb3VwIGRlbGxhIHRhYmVsbGEuIFF1ZXN0YSBsaXN0YSDDqCBnacOgIG9yZGluYXRhIGUgcHJvbnRhIHBlciBlc3NlcmUgdXRpbGl6emF0YSBpbiBuZ0ZvciAqL1xyXG4gICAgcHVibGljIFJvd1RoR3JvdXBzOiBUaEdyb3VwW11bXSA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZWkgY29udGVzdGkuIFVuIGNvbnRlc3RvIG5vbiDDqCBhbHRybyBjaGUgdW4gaGFzaCBwYXJ0aWNvbGFyZSBjYWxjb2xhdG8gc3UgdW4gb2dnZXR0byBjaGUgaWRlbnRpZmljYSB1bml2b2NhbWVudGUgdGFsZSBvZ2dldHRvLlxyXG4gICAgICpcclxuICAgICAqIE9nbnVubyBkaSBxdWVzdGkgY29udGVzdGkgcmFwcHJlc2VudGVyw6AgYSBzdWEgdm9sdGEsIHVuaXZvY2FtZW50ZSwgdW5hIHJpZ2EgYWxsJ2ludGVybm8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUm93Q29udGV4dHM6IGFueVtdID0gW107XHJcbiAgICAvKiogRGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRlbGxlIGNvbG9ubmUgKG5vbiBvcmRpbmFtZW50byBkZWkgZGF0aSBtYSBkZWxsZSBjb2xvbm5lIGluIHNlKSAqL1xyXG4gICAgcHVibGljIE9yZGVyRGlyZWN0aXZlczogc3RyaW5nW10gPSBbXTtcclxuICAgIC8qKiBDb2RpY2UgZGVsbCd1bHRpbW8gb2dnZXR0byBzb2xlemlvbmF0byAqL1xyXG4gICAgcHVibGljIGxhc3RTZWxlY3RlZEl0ZW1JRCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNpZGUgc2UgdXRpbGl6emFyZSBvIG1lbm8gbGUgQ3VzdG9tQ2VsbHMuIEltcG9zdGFuZG9sbyBhICoqdHJ1ZSoqIGwnZXMtdGFibGUgZGl2ZW50YSBpbiBncmFkbyBkaSBnZXN0aXJlIG5hdGl2YW1lbnRlOlxyXG4gICAgICpcclxuICAgICAqIDEpIE9yZGluYW1lbnRvIGUgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZVxyXG4gICAgICpcclxuICAgICAqIDIpIE9yZGluYW1lbnRvIGRlaSBkYXRpXHJcbiAgICAgKlxyXG4gICAgICogMykgTW9kYWxpdMOgIEdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBlY2MuLi5cclxuICAgICAqIHZpZW5lIGRlZG90dG8gZGFsIHNpc3RlbWEgaW4gYXV0b21hdGljb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVXNlQ3VzdG9tQ2VsbHM6IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIG9sdHJlIGFsbGUgY29sb25uZSBkaW5hbWljaGUgc3BlY2lmaWNoZSBkaSB1biB0aXBvIGRpIG9nZ2V0dG8gY2kgc29ubyBhbmNoZSBjb2xvbm5lIGRpbmFtaWNoZSBhZ2dpdW50ZSBkYWxsJ3V0ZW50ZVxyXG4gICAgICpcclxuICAgICAqIEVzLiB1bmEgY29sb25uYSBpbiBjdWkgbW9zdHJhcmUgc2VtcHJlIHVuIGljb25jaW5hXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBVc2VyRGVmaW5lZER5bmFtaWNDb2xzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGNoZSBxdWVzdG8gw6ggaWwgcHJpbW8gQmluZCBkZWxsYSB0YWJlbGxhLCB2aWVuZSBzZXR0YXRvIGEgZmFsc2Ugbm9uIGFwcGVuYSBpbCBwcmltbyBiaW5kIHZpZW5lIHRlcm1pbmF0byBjb24gc3VjY2Vzc28gKi9cclxuICAgIHB1YmxpYyBGaXJzdEJpbmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIExpc3RhIGRpIGNvbG9ubmUgY2hlIHNpIHBvc3Nvbm8gdmlzdWFsaXp6YXJlL29yZGluYXJlIGZyYSBkaSBsb3JvICovXHJcbiAgICBwdWJsaWMgQ29sdW1uc0xpc3Q6IEVzVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHVzYXRhIGRhbGxhIGRpYWxvZyBkaSBzZWxlemlvbmUvbmFzY29uZGltZW50bywgcGVyIGV2aXRhcmUgZGkgZGFubmVnZ2lhcmUgKipDb2x1bW5zTGlzdCoqIGluIGNhc28gZGkgbW9kaWZpY2hlIHBvaSBhbm51bGxhdGUgKi9cclxuICAgIHB1YmxpYyBUTVBDb2x1bW5zTGlzdDogRXNUYWJsZUNvbHVtbltdID0gW107XHJcbiAgICAvKiogVmFsb3JlIGRlbCBjaGVjayBnbG9iYWxlIGRpIHZpc2liaWxpdMOgIHZhbGlkbyBwZXIgdHV0dGUgbGUgY29sb25uZSBpbiAqKkNvbHVtbnNMaXN0KiogKi9cclxuICAgIHB1YmxpYyBnbG9iYWxDb2xWaXNDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0ZSBsZSBkaXJldHRpdmUgcGVyIGdsaSBlZGl0b3IgY3VzdG9tIGRlbGxlIGNlbGxlICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGRFZGl0b3JEaXJlY3RpdmUpIEVzVGRFZGl0b3JEaXJlY3RpdmVzOiBRdWVyeUxpc3Q8RXNUZEVkaXRvckRpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGUgbGUgbnVvdmUgZGlyZXR0aXZlICBhc3NlZ25hdGkgYSBkaXJldHRpdmEgKFBlciBsYSBtb2RhbGl0w6AgZGluYW1pY2EgZGVsbCdlcy10YWJsZSkgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oRXNUZERpcmVjdGl2ZSkgRXNUZHNEaXJlY3RpdmU6IFF1ZXJ5TGlzdDxFc1RkRGlyZWN0aXZlPjtcclxuICAgIC8qKiBRdWVyeSBwZXIgcmVjdXBlcmFyZSB0dXR0aSBnbGkgZXMtdGQgYXNzZWduYXRpIGEgZGlyZXR0aXZhIChQZXIgbGEgbW9kYWxpdMOgIGRpbmFtaWNhIGRlbGwnZXMtdGFibGUpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEVzVGhEaXJlY3RpdmUpIEVzVGhzRGlyZWN0aXZlOiBRdWVyeUxpc3Q8RXNUaERpcmVjdGl2ZT47XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgdHV0dGkgZ2xpIGVzLXRkIGUgZ2xpIGVzLXRoIGFzc2VnbmF0aSBkYSBwYXJ0ZSBkaSB1biBwcm92aWRlciAocGVyIGludGVncmFyZSBpbiBtYW5pZXJhIGRpbmFtaWNhIGkgdGggZSB0ZCBlc2lzdGVudGkpICovXHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRoVGRQcm92aWRlcikgVGhUZFByb3ZpZGVyOiBRdWVyeUxpc3Q8VGhUZFByb3ZpZGVyPjtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBjb2xsZWdhcmUgdW4gcHJvdmlkZXIgc2VuemEgcGFzc2FyZSBkYWxsYSBwcm9pZXppb25lICovXHJcbiAgICBASW5wdXQoKSBFc1RoVGRQcm92aWRlcjogVGhUZFByb3ZpZGVyO1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBkZWwgYm9keSAocHVudG8gZGVsbGEgdGFiZWxsYSBkb3ZlIHZlbmdvbm8gbW9zdHJhdGUgbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdib2R5JywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBib2R5UmVmOiBhbnk7XHJcbiAgICAvKiogUXVlcnkgcGVyIHJlY3VwZXJhcmUgbGUgaW5mb3JtYXppb25pIGRlbGwnaGVhZGVyIChwdW50byBkZWxsYSB0YWJlbGxhIGRvdmUgdmVuZ29ubyBtb3N0cmF0ZSBsZSBpbnRlc3RhemlvbmkgZGVsbGUgcmlnaGUpICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGhlYWRlclJlZjogYW55O1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGxlIGluZm9ybWF6aW9uaSBzdWwgcmFnZ3J1cHBhbWVudG8gZGVnbGkgaGVhZGVyICovXHJcbiAgICBAQ29udGVudENoaWxkKCdoZWFkZXJHcm91cCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaGVhZGVyR3JvdXBSZWY6IGFueTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBRdWVyeSBwZXIgcmVjdXBlcmFyZSBsZSBpbmZvcm1hemlvbmkgc3VsIHJhZ2dydXBwYW1lbnRvIGRpIHNlY29uZG8gbGl2ZWxsbyBkZWdsaSBoZWFkZXIgKi9cclxuICAgIEBDb250ZW50Q2hpbGQoJ3NlY29uZGFyeUhlYWRlckdyb3VwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBzZWNvbmRhcnlIZWFkZXJHcm91cFJlZjogYW55O1xyXG4gICAgLyoqIFF1ZXJ5IHBlciByZWN1cGVyYXJlIGlsIGNhbXBvIGRpIElucHV0IGF0dHVhbGUuIERvcG8gdW4gZG9wcGlvIGNsaWNrIGxvIGJlY2NvIGUgbG8gZm9jdXNzbyBhcHBlbmEgdGVybWluYSBsYSBjaGFuZ2UgZGV0ZWN0aW9uICovXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgaW5wdXRGaWVsZDogRWxlbWVudFJlZjtcclxuICAgIC8qKiBPcHppb25pIGV4dHJhIGNoZSBkZXZvbm8gYXBwYXJpcmUgbmVsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEsIHJpY2hpYW1hdG8gZGFpIDMgcGFsbGluaSB2ZXJ0aWNhbGkgKi9cclxuICAgIEBJbnB1dCgpIENvcm5lck1lbnVPcHRpb25zOiBDb3JuZXJNZW51T3B0aW9uW10gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBkZXYnZXNzZXJlIHBvc3NpYmlsZSBlZmZldHR1YXJlIGlsIHJlc2l6ZSBkZWxsZSBjb2xvbm5lICovXHJcbiAgICBASW5wdXQoKSBDb2x1bW5zUmVzaXphYmxlOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBwb3NzaWJpbGUgZWZmZXR0dWFyZSBpbCBwaW5uaW5nIGRlbGxlIGNvbG9ubmUgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNQaW5uYWJsZTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGRldidlc3NlcmUgZGlzcG9uaWJpbGUgaWwgc2lzdGVtYSBkaSBhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIEBJbnB1dCgpIEF1dG9VcGRhdGU6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBsJ2FsdGV6emEgY2FibGF0YSBjaGUgZGV2ZSBhc3N1bWVyZSBsYSB0YWJlbGxhLiBFczogXCIxMDBweFwiIHwgXCIxMDAlXCIgLi4uICAqL1xyXG4gICAgQElucHV0KCkgSGVpZ2h0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCBjb2xvcmUgZGkgc2ZvbmRvIGRlbGxvIHNwYXppbyB2dW90byAobm9uIHJpY29wZXJ0byBkYSBkYXRpKS4gUGFydGljb2xhcm1lbnRlIHV0aWxlIGRhIGltcG9zdGFyZSBpbiBjYXNvIGRpICoqSGVpZ2h0KiogZGl2ZXJzbyBkYSBudWxsICAqL1xyXG4gICAgQElucHV0KCkgRW1wdHlTcGFjZUJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgZGV2J2Vzc2VyZSBsJ2VzdGFibGUgYSBnZXN0aXJlIGxhIHJpY2VyY2EsIGFuY2hlIGxhIHByaW1hLiAgKiovXHJcbiAgICBASW5wdXQoKSBFc1RhYmxlSGFuZGxlZFNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBpbXBvc3RhcmUgbCdhbHRlenphIG1hc3NpbWEgZGVsbGEgdGFiZWxsYS4gU2UgbnVsbCBsYSBkaW1lbnNpb25lIHNpIGFkYXR0YSBhbCBudW1lcm8gZGkgZWxlbWVudGkgYXR0dWFsbWVudGUgaW4gdmlzdWFsaXp6YXppb25lICovXHJcbiAgICBASW5wdXQoKSBNYXhIZWlnaHQ6IG51bWJlciA9IG51bGw7XHJcbiAgICAvKiogQ2xhc3NpIGRhIGFwcGxpY2FyZSBhbCBjb250ZW5pdG9yZSBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250YWluZXJDbGFzcyA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gWExTWCAqL1xyXG4gICAgQElucHV0KCkgWExTWEV4cG9ydDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgbyBtZW5vIGwnZXhwb3J0IGluIGZvcm1hdG8gQ1NWICovXHJcbiAgICBASW5wdXQoKSBDU1ZFeHBvcnQgPSB0cnVlO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHZpc3VhbGl6emFyZSBvIG1lbm8gbCdvcHppb25lIGRpIHBhZ2luYXppb25lIFwiVHV0dGlcIiAqL1xyXG4gICAgQElucHV0KCkgQWxsU2VhcmNoID0gbnVsbDtcclxuICAgIC8qKiBEaW1pbnVpc2NlIGdsaSBzcGF6aSBmcmEgdW5hIGNlbGxhIGUgbCdhbHRyYSwgZSBpbnRlcm5hbWVudGUgaWwgcGFkZGluZyBkZWwgZm9udCBpbiBtb2RvIGRhIHByZXNlbnRhcmUgbW9sdGkgcGnDuSBkYXRpIGluIHVuJ3VuaWNhIHBhZ2luYSAqL1xyXG4gICAgQElucHV0KCkgSGlnaENlbGxEZW5zaXR5OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBBYmlsaXRhIG8gbWVubyBsYSBwb3NzaWJpbGl0w6AgZGkgc2VsZXppb25hcmUgb2dnZXR0aSAqL1xyXG4gICAgQElucHV0KCkgU2VsZWN0aW9uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBNb3N0cmEgbyBtZW5vIHVuIG1lc3NhZ2dpbyBkaSBMb2FkaW5nIGFsIHByaW1vIGNhcmljYW1lbnRvIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIFNob3dMb2FkaW5nT25Cb290c3RyYXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFNlIGltcG9zdGF0byBhICoqdHJ1ZSoqIGFnZ2l1bmdlIHVuYSBjb2xvbm5hIGNvbiBwdWxzYW50ZSBkaSBlbGltaW5hemlvbmUgcGVyIGVmZmV0dHVhcmUgbCdlbGltaW5hIGRlbGwnb2dnZXR0byByZWxhdGl2byAqL1xyXG4gICAgQElucHV0KCkgUmVtb3ZhbDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25kaXppb25lIGNoZSBuYXNjb25kZSBsJ2ljb25hIGRpIGVsaW1pbmF6aW9uZSBpbnNlcml0YSBpbXBvc3RhbmRvICoqUmVtb3ZhbCoqIGEgdHJ1ZSBxdWFsb3JhIGxhIGNvbmRpemlvbmUgbm9uIHZlbmlzc2UgcmlzcGV0dGF0YVxyXG4gICAgICpcclxuICAgICAqIENvbWUgY29uZGl6aW9uZSBzaSBjb25zaWRlcmEgdW4gc2VtcGxpY2UgY2FtcG8gc3UgY3VpIGVmZmV0dHVhcmUgdW4gY29udHJvbGxvIGJvb2xlYW5vLCBjb21lIGFkIGVzZW1waW8gXCJjYW5yZW1vdmVcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBSZW1vdmFsQ29uZGl0aW9uID0gJyc7XHJcbiAgICAvKiogSW5kaWNhIHNlIGFiaWxpdGFyZSBsYSBwb3NzaWJpbGl0w6AgZGkgZXNwb3J0YXJlIGxhIHZpc3RhIGRhdGkgYXR0dWFsZSAqL1xyXG4gICAgQElucHV0KCkgRXhwb3J0OiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgcGVybWV0dGVyZSBsYSBzZWxlemlvbmUgbXVsdGlwbGEgV2luZG93cy1saWtlIGNsaWNjYW5kbyB1biBvZ2dldHRvIGUgZmFjZW5kbyBwb2kgU2hpZnQgKyBjbGljayBzdSB1biBvZ2dldHRvIHN1Y2Nlc3Npdm8gKi9cclxuICAgIEBJbnB1dCgpIFNoaWZ0Q2xpY2s6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBpbCB0ZXN0byBjaGUgdmEgYSBzb3N0aXR1aXJlIFwiT2dnZXR0aSBWaXN1YWxpenphdGlcIiBpbiBjYXNvIHNpIHN0aWEgZmFjZW5kbyBxdWFsY29zYSBkaSBjdXN0b20gKi9cclxuICAgIEBJbnB1dCgpIENvdW50TGFiZWw6IHN0cmluZyA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIG5hc2NvbmRlcmUgbyBtb3N0cmFyZSBpbCBjb21wb25lbnRlIGRpIHBhZ2luYXppb25lICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBvIG1vc3RyYXJlIGlsIGNvbnRlZ2dpbyBkZWdsaSBlbGVtZW50aSB0cm92YXRpICovXHJcbiAgICBASW5wdXQoKSBIaWRlUGFnaW5nQ291bnQ6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIG8gbW9zdHJhcmUgaSBwdWxzYW50aSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgQElucHV0KCkgSGlkZVBhZ2luZ0J1dHRvbnM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFJpZmVyaW1lbnRvIGFsIENvbnRleHRNZW51IChuZ3gtY29udGV4dG1lbnUpIGFzc29jaWF0byBhbCBjbGljayBkZXN0cm8gZGkgdW5vIG8gcGnDuSBlbGVtZW50aSBzZWxlemlvbmF0aSBuZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBDb250ZXh0TWVudTogQ29udGV4dE1lbnVDb21wb25lbnQgPSBudWxsO1xyXG4gICAgLyoqIE5vbWUgZGVsbCdlc3BvcnRhemlvbmUgZ2VuZXJhdGEgZGEgcXVlc3RhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydEZpbGVOYW1lID0gJ0V4cG9ydC5jc3YnO1xyXG4gICAgLyoqIENsYXNzZSAoSFRNTCkgZGkgZGVmYXVsdCBkZWxsYSB0YWJlbGxhICovXHJcbiAgICBASW5wdXQoKSBUYWJsZUNsYXNzID0gbnVsbDtcclxuICAgIC8qKiBGdW56aW9uZSBkYSB1dGlsaXp6YXJlIGluIGVzcG9ydGF6aW9uZS4gSGEgY29tZSBwYXJhbWV0cm8gdW5hIGNhbGxiYWNrIGNvbiBpIGRhdGkgY29tcGxldGkgZGEgZXNwb3J0YXJlIChkYXRvIGNoZSBkaSBkZWZhdWx0IGxhIHJpY2VyY2Egw6ggcGFnaW5hdGEpICovXHJcbiAgICBASW5wdXQoKSBFeHBvcnRGdW5jdGlvbjogKGNhbGxiYWNrIDogKGRhdGE6IGFueVtdLCB0eXBlOiBUeXBlPGFueT4pID0+IHZvaWQsIGZvcm1hdDogXCJDU1ZcIiB8IFwiWExTWFwiKSA9PiB2b2lkO1xyXG4gICAgLyoqIEluZGljYSBkaSBlc3BvcnRhcmUgc29sbyBsZSBjb2xvbm5lIGF0dHVhbG1lbnRlIHZpc2liaWxpIGRlbGxhIHZpZXcgKi9cclxuICAgIEBJbnB1dCgpIEV4cG9ydE9ubHlWaXNpYmxlQ29sdW1uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIEluZGljYSBsYSBwcmVzZW56YSBkaSByYWdncnVwcGFtZW50aSBhIGxpdmVsbG8gZGkgaGVhZGVyICovXHJcbiAgICBASW5wdXQoKSBIYXNIZWFkZXJHcm91cDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgSW5kaWNhIGxhIHByZXNlbnphIGRpIHJhZ2dydXBwYW1lbnRpIGEgbGl2ZWxsbyBkZWwgcmFnZ3J1cHBhbWVudG8gcHJlY2VkZW50ZW1lbnRlIGVzaXN0ZW50ZSwgY2hpYXJhbWVudGUgw6ggaW5zZW5zYXRhIHNlbnphICoqSGFzSGVhZGVyR3JvdXAqKiAqL1xyXG4gICAgQElucHV0KCkgSGFzU2Vjb25kYXJ5SGVhZGVyR3JvdXA6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBzZSBuYXNjb25kZXJlIGdsaSBIZWFkZXIgZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgSGVhZGVySGlkZGVuOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egc2UgbmFzY29uZGVyZSBpbCBCb2R5IGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIEJvZHlIaWRkZW46IGJvb2xlYW4gPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCB0ZW1wb3JhbmVhbWVudGUgZGlzYWJpbGl0YXRhLiBSaXNwZXR0byBhbGwnSW5wdXQgKipTZWxlY3Rpb24qKiBjaGUgdmlzaXZhbWVudGUgZ2VzdGlzY2Ugc2UgY2kgc29ubyBvIG5vIGdsaSBpbnB1dCBkaSBzZWxlemlvbmUsXHJcbiAgICAgKiBxdWVzdG8gSW5wdXQgZ2VzdGlzY2Ugc2UgcXVlc3RpIGlucHV0IHNvbm8gYWJpbGl0YXRpIG8gbWVub1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBTZWxlY3Rpb25EaXNhYmxlZDogYm9vbGVhbiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgZm9yemFyZSBpbCBzaXN0ZW1hIGRpIHNlbGV6aW9uZSBhIGdlc3RpcmUgdW4gZWxlbWVudG8gcGVyIHZvbHRhLlxyXG4gICAgICogU2VsZXppb25hcmUgdW4nYWx0cmEgcmlnYSBjb24gdW5hIGdpw6Agc2VsZXppb25hdGEgYXBwbGljaGVyw6AgbGEgc2VsZXppb25lIGFsbGEgbnVvdmEgcmlnYSwgcmltdW92ZW5kb2xhIGRhbGwnYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBTaW5nbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIENhbGxiYWNrIGNoZSBkYXRvIHVuIG9nZ2V0dG8gcmVzaXR1aXNjZSBsJ2V2ZW50dWFsZSBjbGFzc2UgZGEgYXBwbGljYXJlIGFsbGEgcmlnYSBjb2xsZWdhdGEgYWxsJ29nZ2V0dG8gKi9cclxuICAgIEBJbnB1dCgpIFJvd0NsYXNzQXNzaWduZXI6IGFueSA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgb3JkaW5hcmUgaSBkYXRpIGluIG1hbmllcmEgZGlzY2VuZGVudGUgbyBhc2NlbmRlbnRlICovXHJcbiAgICBASW5wdXQoKSBPcmRlckJ5Q29sdW1uOiBib29sZWFuID0gbnVsbDtcclxuICAgIC8qKiBQZXJtZXR0ZSBkaSBhdmVyZSBwacO5IGRpcmV0dGl2ZSBkaSBvcmRpbmFtZW50byBkZWkgZGF0aSAqL1xyXG4gICAgQElucHV0KCkgTXVsdGlwbGVPcmRlcmluZ0RpcmVjdGl2ZXMgPSB0cnVlO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIG5hc2NvbmRlcmUgbGUgY29sb25uZSBpbiBiYXNlIGFsbGUgc2VsZXppb25pIGVmZmV0dHVhdGUgZGFsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEgKi9cclxuICAgIEBJbnB1dCgpIEhpZGRlbkNvbHVtbnM6IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgLyoqIFBlcm1ldHRlIGRpIHJpb3JkaW5hcmUgbGUgY29sb25uZSBpbiBiYXNlIGFsbGUgaW1wb3N0YXppb25pIGVmZmV0dHVhdGUgZGFsIE1lbsO5IGNvbnRlc3R1YWxlIGluIGFsdG8gYSBkZXN0cmEgKi9cclxuICAgIEBJbnB1dCgpIENvbHVtbnNPcmRlcmluZzogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgRXZlbnR1YWxlIHN1cHBvcnRvIGFsbGUgcmljZXJjaGUgYXBwbGljYXRlIGFsbGEgbW9kYWxpdMOgIEFycmF5ICovXHJcbiAgICBASW5wdXQoKSBTZWFyY2hWaWV3ID0gbnVsbCBhcyBBcHBTZWFyY2g8YW55PjtcclxuICAgIC8qKiBBYmlsaXRhIG8gZGlzYWJpbGl0YSBpbCBzaXN0ZW1hIGNoZSBwZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSB0dXR0aSBnbGkgZWxlbWVudGkgbmVsbGEgdmlzdGEgKi9cclxuICAgIEBJbnB1dCgpIFNlbGVjdEFsbDogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogU2ltdWxhIGxhIHBhZ2luYXppb25lIGFuY2hlIHBlciBsZSB0YWJlbGxlIGNoZSBmdW56aW9uYW5vIGluIG1vZGFsaXTDoCBBcnJheSAqL1xyXG4gICAgQElucHV0KCkgVXNlQXJyYXlNb2RlUGFnaW5nID0gdHJ1ZTtcclxuICAgIC8qKiBEZWZpbml6aW9uZSBkaSBjb2xvbm5lIGRpbmFtY2hlIHBlciBsYSBtb2RhbGl0w6AsIGFwcHVudG8sIGRpbmFtaWNhICovXHJcbiAgICBASW5wdXQoKSBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb246IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbltdID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2Egb3BlcmF6aW9uaSBkaW5hbWljaGUgZ2VuZXJpY2hlIGNoZSBwb3Nzb25vIGVzc2VyZSBlZmZldHR1YXRlIHBlciByaWdhLiBBcHBhaW9ubyBjb21lIGNvbG9ubmUgZXh0cmEgc3VsIGxhdG8gc2luaXN0cm8gZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgQElucHV0KCkgRHluYW1pY09wZXJhdGlvbnM6IEVzVGFibGVPcGVyYXRpb25EZWZpbml0aW9uW10gPSBbXTtcclxuICAgIC8qKiBJbmRpY2Egc2UgdmlzdWFsaXp6YXJlIGkgZGF0aSBpbiBtYW5pZXJhIGdlcmFyY2hpY2EgKi9cclxuICAgIEBJbnB1dCgpIEhpZXJhcmNoeTogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lEIGRlbCBwYWRyZS4gRGEgdXRpbGl6emFyZSBzZSAqKkhpZXJhcmNoeSoqIMOoIGltcG9zdGF0byAqL1xyXG4gICAgQElucHV0KCkgUGFyZW50S2V5ID0gJyc7XHJcbiAgICAvKiogTm9tZSBkZWxsYSBwcm9wcmlldMOgIGNoZSBjb250aWVuZSBsJ0lEIGRlbGwnb2dnZXR0byBhdHR1YWxlLiBEYSB1dGlsaXp6YXJlIHNlICoqSGllcmFyY2h5Kiogw6ggaW1wb3N0YXRvICovXHJcbiAgICBASW5wdXQoKSBPd25LZXkgPSAnJztcclxuICAgIC8qKiBJbmRpY2Egc2UgcGFydGlyZSBjb24gdW4gYWxiZXJvIGVzcGFuc28uIERhIHV0aWxpenphcmUgc2UgKipIaWVyYXJjaHkqKiDDqCBpbXBvc3RhdG8gKi9cclxuICAgIEBJbnB1dCgpIFN0YXJ0c0V4cGFuZGVkID0gdHJ1ZTtcclxuICAgIC8qKiBJbmRpY2Egc2UgZWZmZXR0dWFyZSBpbCBzYWx2YXRhZ2dpbyBkZWxsZSBwcmVmZXJlbnplIGRpIHJpY2VyY2EgKi9cclxuICAgIEBJbnB1dCgpIFNhdmVQcmVmZXJlbmNlczogYm9vbGVhbiA9IG51bGw7XHJcbiAgICAvKiogQWxsaW5lYW1lbnRvIGRpIGRlZmF1bHQgcGVyIGNlbGxlIGUgaGVhZGVycyAqL1xyXG4gICAgQElucHV0KCkgRGVmYXVsdEFsaWdubWVudDogJ0xlZnQnIHwgJ1JpZ2h0JyB8ICdDZW50ZXInID0gbnVsbDtcclxuICAgIC8qKiBJbmRpY2EgZG92ZSB2aXN1YWxpenphcmUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lLCBzZSBzb3ByYSwgc290dG8gbyBpbiBlbnRyYW1iaSAqL1xyXG4gICAgQElucHV0KCkgUGFnaW5nU3R5bGU6ICdib3RoJyB8ICd0b3AnIHwgJ2JvdHRvbScgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBkb3ZlIHZpc3VhbGl6emFyZSBsZSBpbmZvcm1hemlvbmkgZGkgcGFnaW5hemlvbmUsIHNlIHNvcHJhLCBzb3R0byBvIGluIGVudHJhbWJpICovXHJcbiAgICBASW5wdXQoKSBSb3dHcm91cGluZ1BhZ2luZ1N0eWxlOiAnbGVmdCcgfCAncmlnaHQnID0gbnVsbDtcclxuICAgIC8qKiBRdWFsb3JhIHBlciBxdWFsc2lhc2kgbW90aXZvIG5vbiB2ZW5pc3NlIHVzYXRvICoqaXRlbXMqKiBkZWxsJ0FwcFNlYXJjaCBxdWVzdG8gSW5wdXQgaW5kaWNhIHF1YWwgw6ggaWwgbm9tZSBkZWxsYSBwcm9wcmlldMOgIGRhIHV0aWxpenphcmUgKi9cclxuICAgIEBJbnB1dCgpIEl0ZW1Tb3VyY2VQcm9wZXJ0eTogc3RyaW5nID0gXCJcIjtcclxuICAgIC8qKiBJbmRpY2Egc2UgdXRpbGl6emFyZSBsYSBjYWNoZSBkaSBzZWxlemlvbmUgY2hlIHBlcm1ldHRlIGRpIG1hbnRlbmVyZSBnbGkgc3RhdGkgZGkgc2VsZXppb25lIGRlaSB2YXJpIG9nZ2V0dGkgbmF2aWdhbmRvIGRhIHVuYSBwYWdpbmEgYWxsJ2FsdHJhICovXHJcbiAgICBASW5wdXQoKSBVc2VTZWxlY3Rpb25DYWNoZSA9IG51bGw7XHJcbiAgICAvKiogUGVybWV0dGUgZGkgZGVjaWRlcmUgc2UsIGluIG1vZGFsaXTDoCByYWdncnVwcGFtZW50bywgbW9zdHJhcmUgbyBtZW5vIGlsIHZhbG9yZSBkZWxsZSBjb2xvbm5lIGRpIGdydXBwbyBuZWdsaSBvZ2dldHRpIGZpbmFsaS4gRGkgZGVmYXVsdCBzb25vIG5hc2Nvc3RpICovXHJcbiAgICBASW5wdXQoKSBTaG93SXRlbUdyb3Vwc0NvbHVtbnMgPSBudWxsO1xyXG4gICAgLyoqIEluZGljYSBjaGUgdHV0dGkgaSBjYW1waSBjaGUgZGVmaW5pc2Nvbm8gbGUgbW9kYWxpdMOgIGRpIG1vZGlmaWNhIGNhbXBvIHBvc3Nvbm8gZXNzZXJlIG1vZGlmaWNhdGkgaW4gYmFzZSBhbGxlIGltcG9zdGF6aW9uaSAqL1xyXG4gICAgQElucHV0KCkgRWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKiBJbmRpY2Egc2Ugw6ggcG9zc2liaWxlIGVmZmV0dHVhcmUgc2VsZXppb25pIGEgcmFuZ2UgcGVyIHBvaSBmYXJjaSBldmVudHVhbG1lbnRlIGNvcGlhIGluY29sbGEgKi9cclxuICAgIEBJbnB1dCgpIFJhbmdlU2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGlsIG51bWVybyBkaSBtaWxsaXNlY29uZGkgcGVyIGN1aSBkZWJvdW5jYXJlIGlsIHdyaXRlVmFsdWUgcGVyIGxhIG1vZGFsaXTDoCAqKkVzVGFibGVIYW5kbGVkU2VhcmNoKiogKi9cclxuICAgIEBJbnB1dCgpIFNlYXJjaFRocm90dGxlOiBudW1iZXIgPSA1MDtcclxuICAgIC8qKiBFdmVudG8gY2hlIHZpZW5lIHJpY2hpYW1hdG8gYWwgY2FtYmlvIGRpIG9yaWRuYW1lbnRvIGRpIHVuYSBjb2xvbm5hICovXHJcbiAgICBAT3V0cHV0KCkgb25PcmRlckNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBcHBPcmRlcmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFwcE9yZGVyaW5nPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIGNoZSB2aWVuZSByaWNoaWFtYXRvIHF1YW5kbyBsJ2VzLXRhYmxlIHJpdGllbmUgc2lhIG5lY2Vzc2FyaW8gcmktZWZmZXR0dWFyZSBsYSByaWNlcmNhLlxyXG4gICAgICogSWwgYm9vbGVhbm8gZGVsbCdldmVudG8gaW5kaWNhIHNlIHZpZW5lIHN1Z2dlcml0byBkaSByZXNldHRhcmUgbGEgcGFnaW5hIG8gbWVuby5cclxuICAgICAqIFxyXG4gICAgICogU29sbyBpbiBjYXNvIHZlbmdhIHV0aWxpenphdGEgbGEgbW9kYWxpdMOgIGEgcmFnZ3J1cHBhbWVudGkgZGkgcmlnaGUgcHXDsiBzdWNjZWRlcmUgY2hlIGwnZXMtdGFibGUgcGFzc2kgdW4gaW50ZXJvIEFwcFNlYXJjaCBjb21lIHBhcmFtZXRybyBkaSByaWNlcmNhLFxyXG4gICAgICogaW4gcXVlbCBjYXNvIGwnYXBwbGljYXppb25lIHJpY2V2ZW50ZSBkb3Zyw6Agb25vcmFyZSBsYSByaWNoaWVzdGEgc3BlZGVuZG8gYWwgYmFja2FuZCBsJ29nZ2V0dG8gZGkgcmljZXJjYSBBUy1JU1xyXG4gICAgICogXHJcbiAgICAgKiBpbCB0aXBvIGRlbGwnRW1pdHRlciBpbnZlY2UgZGkgZXNzZXJlIFtib29sZWFuIHwgQXBwU2VhcmNoPGFueT5dIMOoIHN0YXRvIGltcG9zdGF0byBhIFwiYW55XCIgcGVyIGV2aXRhcmUgcHJvYmxlbWkgZGkgcmV0cm9jb21wYXRpYmlsaXTDoFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgb25TZWFyY2hSZXF1ZXN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgLyoqIEV2ZW50byBjaGUgcGFydGUgYWQgb2duaSBtb2RpZmljYSBkaSBcImNoZWNrYWdnaW9cIiBpbiBmb3JtYSBkaSBjb21vZG8gYXJyYXkuIEVzcG9uZSBsJ29nZ2V0dG8gY29uIGxvIHN0YXRvIGRpIGNoZWNrIGF0dHVhbGUgKi9cclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxJdGVtc1NlbGVjdGlvbjxhbnk+PiA9IG5ldyBFdmVudEVtaXR0ZXI8SXRlbXNTZWxlY3Rpb248YW55Pj4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGwnZWxpbWluYXppb25lIGRpIHVuIG9nZ2V0dG8gKi9cclxuICAgIEBPdXRwdXQoKSBvblJlbW92YWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gYWxsJ2FubnVsbGFtZW50byBkaSB1bidlbGltaW5hemlvbmUgKi9cclxuICAgIEBPdXRwdXQoKSBvbkFib3J0UmVtb3ZhbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGxhIG1vZGlmaWNhIGRlaSBtb2RlbGxpIGJpbmRhdGkgKi9cclxuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RXNUYWJsZU1vZGVsQ2hhbmdlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxFc1RhYmxlTW9kZWxDaGFuZ2VbXT4oKTtcclxuICAgIC8qKiBFdmVudG8gcmljaGlhbWF0byBhbGwnYXBlcnR1cmEgZGVsIG1lbsO5IGNvbnRlc3R1YWxlICovXHJcbiAgICBAT3V0cHV0KCkgb25PcGVuQ29udGV4dE1lbnU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gcXVhbmRvIHNpIGNsaWNjYSBzdSB1biBvcHppb25lIGRlZmluaXRhIG5lbGxlICoqQ29ybmVyTWVudU9wdGlvbnMqKiAqL1xyXG4gICAgQE91dHB1dCgpIG9uQ29ybmVyQWN0aW9uOiBFdmVudEVtaXR0ZXI8eyBpZDogc3RyaW5nLCBlc3RhYmxlOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgZXN0YWJsZTogYW55IH0+KCk7XHJcbiAgICAvKiogRXZlbnRvIHJpY2hpYW1hdG8gcXVhbmRvIHNpIGNsaWNjYSBzdSB1biBvcHppb25lIGRlZmluaXRhIG5lbGxlICoqRHluYW1pY09wZXJhdGlvbnMqKiAqL1xyXG4gICAgQE91dHB1dCgpIG9uRHluYW1pY09wZXJhdGlvbjogRXZlbnRFbWl0dGVyPHsgaWQ6IHN0cmluZywgaXRlbTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBzdHJpbmcsIGl0ZW06IGFueSB9PigpO1xyXG5cclxuICAgIC8qKiBFbGVtZW50byBIVE1MIGRhIGNsaWNjYXJlIHBlciBsJ2VzcG9ydGF6aW9uZSAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZXhwb3J0RG93bmxvYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZXhwb3J0RG93bmxvYWRlcjogRWxlbWVudFJlZjtcclxuICAgIC8qKiBQbGFjZWhvbGRlciBkaSBtZW7DuSBjb250ZXN0dWFsZSBwZXIgcXVhbmRvIG5vbiBjaSBzb25vIG9wemlvbmkgbmVsIHBsYWNlaG9sZGVyIFwiVmVyb1wiICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZW51JywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHRhYmxlRW1wdHlNZW51OiBDb250ZXh0TWVudUNvbXBvbmVudDtcclxuXHJcbiAgICAvKiogU3Vic2NyaXB0aW9uIHN1bGwnYXBlcnR1cmEgZGVsIGNvbnRleHQgbWVudSBkYSByaXB1bGlyZSBhbCBkZXN0cm95IGRlbGxhIGNsYXNzZSAqL1xyXG4gICAgcHJpdmF0ZSBjdHhNZW51U3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gICAgLyoqIFBhZ2luYSBpbiB2aXN1YWxpenphemlvbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2UgPSAxO1xyXG4gICAgLyoqIE51bWVybyBkaSBwYWdpbmUgKGR1cmFudGUgbGEgcGFnaW5hemlvbmUgaW4gbW9kYWxpdMOgIEFycmF5KSAqL1xyXG4gICAgcHVibGljIGFycmF5bW9kZVBhZ2VzID0gMTtcclxuICAgIC8qKiBPZ2dldHRpIHBlciBvZ25pIHBhZ2luYSAoZHVyYW50ZSBsYSBwYWdpbmF6aW9uZSBpbiBtb2RhbGl0w6AgQXJyYXkpICovXHJcbiAgICBASW5wdXQoKSBBcnJheW1vZGVJdGVtc1BlclBhZ2UgPSBudWxsO1xyXG4gICAgLyoqIE9nZ2V0dG8gZGkgc2VsZXppb25lIHBlciBsYSBtb2RhbGl0w6AgQXJyYXksIGNoZSBkZXZlIGNvbXBvcnRhcnNpIGNvbWUgbGEgY29udHJvcGFydGUgaW4gbW9kYWxpdMOgIFZpZXcgKi9cclxuICAgIHB1YmxpYyBhcnJheW1vZGVTZWxlY3Rpb246IEl0ZW1zU2VsZWN0aW9uPGFueT47XHJcbiAgICAvKiogQ29sb25uZSBkYSB2aXN1YWxpenphcmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluZSBkZWxsZSBjb2xvbm5lIGRhIHZpc3VhbGl6emFyZSBpbiBtb2RhbGl0w6AgYXJyYXkgKi9cclxuICAgIHB1YmxpYyBhcnJheUNvbHVtbk9yZGVyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIE9yZGluYW1lbnRpIEFTQy1ERVNDIHN1bGxlIGNvbG9ubmUgaW4gbW9kYWxpdMOgIGFycmF5ICovXHJcbiAgICBwdWJsaWMgYXJyYXlPcmRlcnM6IEFwcE9yZGVyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhcmlhYmlsZSBjaGUgc2VydmUgYSBnZXN0aXJlIGlsIG1vbWVudG8gaW4gY3VpIGwnZXMtdGFibGUgYWdnaW9ybmEgbGEgcGFnaW5hemlvbmUgKHB1bHNhbnRpIGVjYykuXHJcbiAgICAgKiBFc3NlbmRvIG9wZXJhemlvbmkgY29tdW5xdWUgY29zdG9zZSBsZSBlZmZldHR1byBzb2xvIHN1IGJpbmRpbmcgZXN0ZXJuaSwgbm9uIHN1IHJld3JpdGUgZ2VuZXJhdGkgaW50ZXJuYW1lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW50ZXJuYWxXcml0ZUNhbGwgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGNoZSBjb250ZXJyw6AgdHV0dGUgbGUgcmljZXJjaGUgZWZmZXR0dWF0ZSBzdSBncnVwcGkgZGl2ZXJzaSBkYWwgcHJpbW8gZSBzdSBlbGVtZW50aSBjb250ZW51dGkgbmVpIGdydXBwaS5cclxuICAgICAqIEluIGNhc28gZGkgY2FtYmkgZGkgb3JkaW5hbWVudG8gZGVsbGUgY29sb25uZSBkaXZlcnNlIGRhbGxhIHByaW1hIHR1dHRlIGxlIGNoaWFtYXRlIGZhdHRlIGRhbCBzZWNvbmRvIGxpdmVsbG8gaW4gcG9pIGRldm9ubyBlc3NlcmUgcmllc2VndWl0ZSBzZWNvbmRvIGxhIHNlZ3VlbnRlIGxvZ2ljYTpcclxuICAgICAqIFxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdWwgcHJpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0bywgbm9uIG1pIG9jY3VwbyBkaSByaXB1bGlyZSBnbGkgZWxlbWVudGkgYmluZGF0aSBpbiBhbGN1biBtb2RvXHJcbiAgICAgKiBcclxuICAgICAqICoqQ2FtYmlvIG9yZGluYW1lbnRvIHN1bGxhIGNvbG9ubmEgcmVsYXRpdmEgYWxsJ04tZXNpbW8gZ3J1cHBvKio6IHJlbG9hZCBjb21wbGV0byBkZWwgY29udGVudXRvIGRlaSBncnVwcGkgcHJlY2VkZW50aSwgcmlwdWxlbmRvIHByZWNlZGVudGVtZW50ZSBcclxuICAgICAqIHR1dHRpIGdsaSBlbGVtZW50aSBjb24gKipfZ3JvdXBsZXZlbCoqID0gTlxyXG4gICAgICogXHJcbiAgICAgKiAqKkNhbWJpbyBvcmRpbmFtZW50byBzdSB1bmEgY29sb25uYSBub24gcmFnZ3J1cHBhdGEqKjogcmVsb2FkIGNvbXBsZXRvIHBlciB0dXR0aSBpIGdydXBwaSBmaW5hbGkgYXBlcnRpLCBkZXZvIHByZWNlZGVudGVtZW50ZSByaXB1bGlyZSB0dXR0aSBnbGkgZWxlbWVudGkgY29uICoqX2l0ZW0qKiA9IHRydWVcclxuICAgICAqIFxyXG4gICAgICogQWx0cmkgZXZlbnRpIG5vbiBkb3ZyZWJiZXJvIHJhcHByZXNlbnRhcmUgcHJvYmxlbWk6XHJcbiAgICAgKiAtIFNlbGV6aW9uZTogbm9uIGNhbWJpYSBudWxsYVxyXG4gICAgICogLSBQYWdpbmF6aW9uZTogY2FtYmlhIGEgbGl2ZWxsbyByb290IHF1aW5kaSB2aWVuZSByaWNhcmljYXRvIHR1dHRvIGNvbXVucXVlLCBzdGVzc28gdmFsZSBwZXIgbGUgcGFnaW5hemlvbmkgaW50ZXJuZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlOiB7IHBhdGg6IHN0cmluZywgcm91dGU6IEdyb3VwUm91dGVGcmFnbWVudFtdLCB2aWV3OiBBcHBTZWFyY2g8YW55PiwgZ3JvdXBfY29sdW1uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsZSBkJ2FwcG9nZ2lvIHBlciBjYXBpcmUgc2UgYyfDqCBiaXNvZ25vIGRpIHJpLWVmZmV0dHVhcmUgdW5hIHJpY2VyY2EgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIFJlc2VhcmNoTmVlZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogQ29sb25uZSB2aXNpYmlsaSBkZWxsYSB2aXN0YSBhdHR1YWxlLiBWYWxvcml6emF0byBkaSBkZWZhdWx0IGFsIG51bWVybyBtYXNzaW1vIGRpIGNvbG9ubmUgc3VwcG9ydGF0ZSBkYWxsYSB0YWJlbGxhIHBlciBsZSBjYXNpc3RpY2hlIGluIGFzc2VuemEgZGkgY3VzdG9tIGNlbGxzICovXHJcbiAgICBwdWJsaWMgQ29sdW1uczogeyBWaXNpYmlsZTogbnVtYmVyLCBWaXNpYmxlVW5waW5uZWQ6IG51bWJlciwgR2xvYmFsOiBudW1iZXIgfSA9IHsgVmlzaWJpbGU6IDEwMCwgVmlzaWJsZVVucGlubmVkOiAxMDAsIEdsb2JhbDogMTAwIH07XHJcbiAgICAvKiogSW4gY2FzbyBkaSBSb3cgR3JvdXBpbmcgcXVpIHZpZW5lIHNhbHZhdGEgbGEgdmlzdGEgcHJpbmNpcGFsZSBkZWkgZ3J1cHBpIGJhc2UgKi9cclxuICAgIHB1YmxpYyBNYWluR3JvdXBWaWV3OiBBcHBTZWFyY2g8YW55PiA9IG51bGw7XHJcbiAgICAvKiogQ29udGVnZ2lvIGJhc2UgZGVnbGkgb2dnZXR0aS4gSW4gbW9kYWxpdMOgIG5vcm1hbGUgdmllbmUgcmVzZXR0YXRvIGFkIG9nbmkgbnVvdmEgVmlldyBpbnNlcml0YSwgaW4gbW9kYWxpdMOgIFJvd0dyb3VwaW5nIHZpZW5lIHJlc2V0dGF0byBzb2xvIGFkIHVuYSBudW92YSBWaWV3IGRpIGxpdmVsbG8gXCIwXCIgKi9cclxuICAgIHB1YmxpYyBCYXNlSXRlbXNDb3VudCA9IG51bGw7XHJcbiAgICAvKiogSW5kaWNhIHNlIGNpIHNvbm8gZGVsbGUgY29sb25uZSBwaW5uYXRlIGUgdmlzaWJpbGkuIFNlcnZlIHBlciBwb3RlciBzZXR0YXJlIHR1dHRlIGxlIGNvbG9ubmUgcHJpbWEgY2hlIGFycml2aW5vIGRhdGkgYSBwaW5uZWQqL1xyXG4gICAgcHVibGljIEhhc1Bpbm5lZENvbHVtbnM6IGJvb2xlYW5cclxuICAgIC8qKiBMYXJnaGV6emEgY2FsY29sYXRhIGRlbCBjb250YWluZXIgZGVsbGUgY29sb25uZSBwaW5uYXRlICovXHJcbiAgICBwdWJsaWMgUGlubmVkQ29udGFpbmVyV2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBJbmRpY2Egc2Ugbm9ub3N0YW50ZSBzaWFtbyBpbiBtb2RhbGl0w6AgYXJyYXkgc29ubyBzdGF0aSBpbmRpdmlkdWF0aSBkZWkgZ3J1cHBpLiBJbiB0YWwgY2FzbyBlcy10YWJsZSBzaSBjb21wb3J0YSBkYSBwc2V1ZG8gYmFja2VuZCBlZCBlZmZldHR1YSBsZSBhZ2dyZWdhemlvbmkgZSByYWdncnVwcGFtZW50aSBjb21wbGV0YW1lbnRlIGxhdG8gY2xpZW50ICovXHJcbiAgICBwdWJsaWMgQXJyYXlHcm91cGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqIEluZGljYSBjaGUgbCdlcy10YWJsZSDDqCBiYXNhdGEgc3VsbGUgZGlyZXR0aXZlIChudW92YSBtb2RhbGl0w6ApICovXHJcbiAgICBwdWJsaWMgRGlyZWN0aXZlc0Jhc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogSW5kaWNhIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwZXIgc2luZ29sYSBjZWxsYSAqL1xyXG4gICAgcHVibGljIHNlbGVjdGlvblN0YXR1czogeyBbaW5kZXg6IG51bWJlcl06IHsgW2luZGV4OiBudW1iZXJdOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlIH0gfSA9IHt9O1xyXG4gICAgLyoqIENoaWFtYXRhIHJlYWxlIGFsIHdyaXRlVmFsdWUgZG9wbyBpbCBwYXNzYWdnaW8gZGkgKipTZWFyY2hUaHJvdHRsZSoqIG1pbGxpc2Vjb25kaS4gU29sbyBtb2RhbGl0w6AgRXNUYWJsZUhhbmRsZWRTZWFyY2ggKi9cclxuICAgIHByaXZhdGUgY2FsbFRpbWVvdXQgOiBhbnkgPSBudWxsO1xyXG4gICAgLyoqIENhY2hlIGRlaSB0aCBwaXV0dG9zdG8gY2hlIHJpY2FsY29sYXJzZWxpIGRpIGNvbnRpbnVvICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlOiAgeyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfSA9IHt9O1xyXG4gICAgLyoqIEluZGljYSBxdWFuZG8gbGEgY2FjaGUgZGVpIHRoIMOoIHN0YXRhIGZpbGxhdGEgYWxtZW5vIGxhIHByaW1hIHZvbHRhICovXHJcbiAgICBwcml2YXRlIHRoc0NhY2hlU2V0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsaSBkYSBmaWxsYXJlIG5lbGwnQWZ0ZXIgQ29udGVudCBJbml0IHBvaSBkYSByaXV0aWxpenphcmUgbmVsbCdpbnRlcm5hbCBwb3N0IGJvdW5kIHNvdXJjZSAqL1xyXG4gICAgcHJpdmF0ZSBFc1RkczogRXNUZERpcmVjdGl2ZVtdO1xyXG4gICAgcHJpdmF0ZSBFc1RoczogRXNUaERpcmVjdGl2ZVtdO1xyXG4gICAgLyoqIFxyXG4gICAgICogRmxhZyBjaGUsIHNlICoqdHJ1ZSoqLCBwZXIgdW4gZ2lybyBkaSBiaW5kaW5nIG1hbnRpZW5lIGxhIHZpc2liaWxpdMOgIGltcG9zdGF0YSBsb2NhbG1lbnRlLCBwaXV0dG9zdG8gY2hlIGFsbGluZWFyZSBhbGxhIFZpZXcgYmluZGF0YS4gXHJcbiAgICAgKiBVc2F0YSBwZXIgbW9kaWZpY2FyZSBpbiBtYW5pZXJhIHByb2dyYW1tYXRpY2EgbGEgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBkYWwgbWV0b2RvICoqc2V0SGVhZGVyVmlzaWJpbGl0eSoqLCBcclxuICAgICAqIFxyXG4gICAgICogRGlzY2xhaW1lcjogKipOT04gTU9ESUZJQ0FSRSoqXHJcbiAgICAgKiovXHJcbiAgICBwdWJsaWMgdXNlTG9jYWxWaXNpYmlsaXR5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKiogT3B6aW9uaSBkaSBwYWdpbmF6aW9uZSAqL1xyXG4gICAgcHVibGljIFBhZ2VyT3B0aW9uczogUGFnZXJJbmZvcyA9IG5ldyBQYWdlckluZm9zKClcclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIGNsaWNrIGRlc3RybyBzdSB1bmEgcmlnYSBjb24gc2VsZXppb25lIGF0dGl2YTogVGlybyBmdW9yaSBpbCBjb250ZXh0IG1lbnUgZSBzZWxlemlvbmUgbCdlbGVtZW50byBjb3JyZW50ZVxyXG4gICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbiA9ICh0aGlzLkNvbnRleHRNZW51IHx8IHRoaXMudGFibGVFbXB0eU1lbnUpLm9wZW4uc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBHcnVwcGkgdmEgYmVuZSwgb2dnZXR0aSBwdXJlLCBtYSBzZXBhcmF0b3JpIGZyYSBncnVwcGkgcHJvcHJpbyBuby4uLlxyXG4gICAgICAgICAgICBpZiAodC5pdGVtLl9zZXApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGxldCBzaG91bGRFbWl0ID0gIXQuaXRlbS5fc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgICAgICB0Lml0ZW0uX3NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuICAgICAgICAgICAgdmFyIGl0ZW1TZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbl9ILmhhbmRsZUl0ZW1zU2VsZWN0aW9uKFt0Lml0ZW1dKTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvdWxkRW1pdClcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEFzc2VnbmF6aW9uZSBwZXIgdHV0dGkgZ2xpIElucHV0IGRpIGRlZmF1bHRcclxuICAgICAgICB0aGlzLkNvbHVtbnNSZXNpemFibGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29sdW1uc1Jlc2l6YWJsZSwgdGhpcy5kZWFmdWx0cz8uQ29sdW1uc1Jlc2l6YWJsZSk7XHJcbiAgICAgICAgdGhpcy5BdXRvVXBkYXRlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkF1dG9VcGRhdGUsIHRoaXMuZGVhZnVsdHM/LkF1dG9VcGRhdGUpO1xyXG4gICAgICAgIHRoaXMuQWxsU2VhcmNoID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkFsbFNlYXJjaCwgdGhpcy5kZWFmdWx0cz8uQWxsU2VhcmNoLCB0cnVlKTtcclxuICAgICAgICB0aGlzLkV4cG9ydCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5FeHBvcnQsIHRoaXMuZGVhZnVsdHM/LkV4cG9ydCk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkhpZGVQYWdpbmcsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmcsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLkhpZGVQYWdpbmdDb3VudCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nQ291bnQsIHRoaXMuZGVhZnVsdHM/LkhpZGVQYWdpbmdDb3VudCk7XHJcbiAgICAgICAgdGhpcy5IaWRlUGFnaW5nQnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5IaWRlUGFnaW5nQnV0dG9ucywgdGhpcy5kZWFmdWx0cz8uSGlkZVBhZ2luZ0J1dHRvbnMpO1xyXG4gICAgICAgIHRoaXMuQ29udGFpbmVyQ2xhc3MgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29udGFpbmVyQ2xhc3MsIHRoaXMuZGVhZnVsdHM/LkNvbnRhaW5lckNsYXNzLCAnJyk7XHJcbiAgICAgICAgdGhpcy5UYWJsZUNsYXNzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlRhYmxlQ2xhc3MsIHRoaXMuZGVhZnVsdHM/LlRhYmxlQ2xhc3MsICd0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLXNtJyk7XHJcbiAgICAgICAgdGhpcy5TZWxlY3Rpb24gPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuU2VsZWN0aW9uLCB0aGlzLmRlYWZ1bHRzPy5TZWxlY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuU2F2ZVByZWZlcmVuY2VzID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlNhdmVQcmVmZXJlbmNlcywgdGhpcy5kZWFmdWx0cz8uU2F2ZVByZWZlcmVuY2VzKTtcclxuICAgICAgICB0aGlzLlBhZ2luZ1N0eWxlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLlBhZ2luZ1N0eWxlLCB0aGlzLmRlYWZ1bHRzPy5QYWdpbmdTdHlsZSwgJ2JvdHRvbScpO1xyXG4gICAgICAgIHRoaXMuUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlLCB0aGlzLmRlYWZ1bHRzPy5Sb3dHcm91cGluZ1BhZ2luZ1N0eWxlLCAnbGVmdCcpO1xyXG4gICAgICAgIHRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuVXNlU2VsZWN0aW9uQ2FjaGUsIHRoaXMuZGVhZnVsdHM/LlVzZVNlbGVjdGlvbkNhY2hlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5TaG93SXRlbUdyb3Vwc0NvbHVtbnMsIHRoaXMuZGVhZnVsdHM/LlNob3dJdGVtR3JvdXBzQ29sdW1ucywgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuQXJyYXltb2RlSXRlbXNQZXJQYWdlID0gdGhpcy51dGlsaXRpZXNfSC5JbnB1dE9yRGVmYXVsdCh0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSwgdGhpcy5kZWFmdWx0cz8uQXJyYXltb2RlSXRlbXNQZXJQYWdlLCAxNSk7XHJcbiAgICAgICAgdGhpcy5Db2x1bW5zUGlubmFibGUgPSB0aGlzLnV0aWxpdGllc19ILklucHV0T3JEZWZhdWx0KHRoaXMuQ29sdW1uc1Bpbm5hYmxlLCB0aGlzLmRlYWZ1bHRzPy5Db2x1bW5zUGlubmFibGUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuRGVmYXVsdEFsaWdubWVudCA9IHRoaXMudXRpbGl0aWVzX0guSW5wdXRPckRlZmF1bHQodGhpcy5EZWZhdWx0QWxpZ25tZW50LCB0aGlzLmRlYWZ1bHRzPy5EZWZhdWx0QWxpZ25tZW50LCAnTGVmdCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgLy8gU2UgdXRpbGl6em8gbGEgbmV3IHNwaWN5IG1vZGUgZGVkdWNvIHR1dHRpIGkgcGFyYW1ldHJpIGRpIGxhdm9ybyBwb3NzaWJpbGkgYWwgY2FyaWNhbWVudG8gZGVsbGEgdGFiZWxsYVxyXG4gICAgICAgIC8vIFZlbmdvbm8gc292cmFzY3JpdHRlIHNvbG8gbGUgcHJvcHJpZXTDoCBub24gaW1wb3N0YXRlIGRhbGwndXRlbnRlXHJcbiAgICAgICAgdGhpcy5Fc1RkcyA9IHRoaXMuRXNUZHNEaXJlY3RpdmUudG9BcnJheSgpO1xyXG4gICAgICAgIHRoaXMuRXNUaHMgPSB0aGlzLkVzVGhzRGlyZWN0aXZlLnRvQXJyYXkoKTtcclxuXHJcbiAgICAgICAgbGV0IHRoc1Rkc1Byb3ZpZGVycyA9IFsuLi4odGhpcy5Fc1RoVGRQcm92aWRlciA/IFt0aGlzLkVzVGhUZFByb3ZpZGVyXSA6IFtdKSwgLi4udGhpcy5UaFRkUHJvdmlkZXJdO1xyXG4gICAgICAgIGlmKHRoc1Rkc1Byb3ZpZGVycz8ubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIGF3YWl0IGZvcmtKb2luKHRoc1Rkc1Byb3ZpZGVycy5tYXAodCA9PiB0LkxvYWRlZFNpZ25hbCkpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB0aGlzLkVzVGRzID0gWy4uLnRoaXMuRXNUZHMsIC4uLnRoc1Rkc1Byb3ZpZGVycy5tYXAodCA9PiB0LkVzVGRzRGlyZWN0aXZlLnRvQXJyYXkoKSkuZmxhdCgpXTtcclxuICAgICAgICAgICAgdGhpcy5Fc1RocyA9IFsuLi50aGlzLkVzVGhzLCAuLi50aHNUZHNQcm92aWRlcnMubWFwKHQgPT4gdC5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCkpLmZsYXQoKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB1c2VzVGhzQW5kVGRzRGlyZWN0aXZlcyA9IHRoaXMuRXNUZHM/Lmxlbmd0aCA+IDAgJiYgdGhpcy5Fc1Rocz8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgaGFzTm9Db250ZW50UHJvamVjdGlvbiA9ICF0aGlzLmJvZHlSZWYgJiYgIXRoaXMuaGVhZGVyUmVmICYmICF0aGlzLmhlYWRlckdyb3VwUmVmICYmICF0aGlzLnNlY29uZGFyeUhlYWRlckdyb3VwUmVmO1xyXG5cclxuICAgICAgICBpZiAodXNlc1Roc0FuZFRkc0RpcmVjdGl2ZXMgfHwgaGFzTm9Db250ZW50UHJvamVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5Vc2VDdXN0b21DZWxscyA9PSBudWxsKSB0aGlzLlVzZUN1c3RvbUNlbGxzID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuSGlkZGVuQ29sdW1ucyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuSGlkZGVuQ29sdW1ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbHVtbnNPcmRlcmluZyA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuQ29sdW1uc09yZGVyaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuT3JkZXJCeUNvbHVtbiA9PSBudWxsICYmIHRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHRoaXMuT3JkZXJCeUNvbHVtbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlbGVjdEFsbCA9PSBudWxsICYmIHRoaXMuU2VsZWN0aW9uKSB0aGlzLlNlbGVjdEFsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNoaWZ0Q2xpY2sgPT0gbnVsbCAmJiB0aGlzLlNlbGVjdGlvbikgdGhpcy5TaGlmdENsaWNrID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5EaXJlY3RpdmVzQmFzZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QZXIgcG90ZXIgY2FtYmlhcmUgaWwgbGF5b3V0IGluIGJhc2UgYWwgbGl2ZWxsbyBnZXJhcmNoaWNvIGlsIGNvbXBvbmVudGUgZGV2YSBhdmVyZSBpbCBwaWVubyBjb250cm9sbG8gZGkgb2duaSBjZWxsYSxcclxuICAgICAgICAvL2NoZSBjb24gc29sbyBsYSBwcm9pZXppb25lIChzZW56YSBjZWxsZSBjdXNvdG0pIG5vbiDDqCBkaXNwb25pYmlsZVxyXG4gICAgICAgIGlmICh0aGlzLkhpZXJhcmNoeSAmJiAhdGhpcy5Vc2VDdXN0b21DZWxscylcclxuICAgICAgICAgICAgdGhyb3cgXCJFcy10YWJsZSBlcnJvcjogUGVyIHBvdGVyIHV0aWxpenphcmUgbCdlcy10YWJsZSBjb24gW0hpZXJhcmNoeV09XFxcInRydWVcXFwiIMOoIHJpY2hpZXN0byBhbmNoZSBbVXNlQ3VzdG9tQ2VsbHNdPVxcXCJ0cnVlXFxcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29weVN1YnNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5jb3B5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhc3RlU3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnBhc3RlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN0eE1lbnVTdWJzY3JpcHRpb24pXHJcbiAgICAgICAgICAgIHRoaXMuY3R4TWVudVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPT0gdGhpcylcclxuICAgICAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGxldCBuZXdTZWFyY2hWaWV3ID0gY2hhbmdlc1snU2VhcmNoVmlldyddO1xyXG4gICAgICAgIGlmIChuZXdTZWFyY2hWaWV3ICYmIHRoaXMuU2VhcmNoVmlldylcclxuICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuU2VhcmNoVmlldy5wYWdlLCB0aGlzLlNlYXJjaFZpZXcucGFnZXMgfHwgMSwgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50LCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbik6IHZvaWQgeyB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuOyB9XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKTogdm9pZCB7IH1cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgY2hhbmdlZChjbGVhckl0ZW1zOiBib29sZWFuID0gZmFsc2UpIHsgXHJcbiAgICAgICAgaWYoY2xlYXJJdGVtcyAmJiB0aGlzLnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAoPEFwcFNlYXJjaDxhbnk+PnRoaXMuVmlldykuaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5WaWV3KTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKG9iajogYW55LCB0aHJvdHRsZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZpZXcgPSBvYmogPyBvYmogOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCAmJiB0aHJvdHRsZSkge1xyXG4gICAgICAgICAgICBpZih0aGlzLmNhbGxUaW1lb3V0KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FsbFRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLndyaXRlVmFsdWUob2JqLCBmYWxzZSk7IH0sIHRoaXMuU2VhcmNoVGhyb3R0bGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgLy8gTWkgw6ggYXJyaXZhdGEgbCdBcHBTZWFyY2ggcXVpbmRpIGRpIHNpY3VybyBub24gaG8gdW5hIHJpY2VyY2EgaW4gcHJvZ3Jlc3NcclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuVmlldyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIC8vIFN1IHZpZXcgbnVsbGEgZXZpdG8gZGkgZmFyZSBwcmVzc29jaMOpIHF1YWxzaWFzaSBjb3NhLiBTZSBhcnJpdmEgdW4gbnVsbCBkZXZvIGFuY2hlIGFzc2ljdXJhcm1pIGRpIG5vbiBtb3N0cmFyZSBudWxsYVxyXG4gICAgICAgICAgICB0aGlzLmJvdW5kU291cmNlID0gdGhpcy5UTVBCb3VuZFNvdXJjZSB8fCBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBwZXIgc2JhZ2xpbyBsJ29nZ2V0dG8gY2hlIG1pIGFycml2YSBub24gw6ggdGlwaXp6YXRvIChpbnN0YW5jZW9mIEFwcFNlYXJjaCByZXN0aXR1aXNjZSBmYWxzZSBhbmNoZSBzZSDDqCBkZWwgdGlwbyBnaXVzdG8pXHJcbiAgICAgICAgLy8gbG8gY29ycmVnZ28tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgdHlwZW9mICh0aGlzLlZpZXcgYXMgYW55KS5pdGVtc3BlcnBhZ2VvdmVycmlkZSAhPSAndW5kZWZpbmVkJyAmJiAhKHRoaXMuVmlldyBpbnN0YW5jZW9mIEFwcFNlYXJjaCkpXHJcbiAgICAgICAgICAgICh0aGlzLlZpZXcgYXMgYW55KS5fX3Byb3RvX18gPSBuZXcgQXBwU2VhcmNoKCk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5TZWFyY2hWaWV3ICYmIHR5cGVvZiAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuaXRlbXNwZXJwYWdlb3ZlcnJpZGUgIT0gJ3VuZGVmaW5lZCcgJiYgISh0aGlzLlNlYXJjaFZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpKVxyXG4gICAgICAgICAgICAodGhpcy5TZWFyY2hWaWV3IGFzIGFueSkuX19wcm90b19fID0gbmV3IEFwcFNlYXJjaCgpO1xyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmlldyAmJiB0aGlzLlZpZXcgaW5zdGFuY2VvZiBBcHBTZWFyY2gpIHtcclxuICAgICAgICAgICAgLy8gU2UgY2FtYmlhIGwnb2dnZXR0byBpbnRlcm8gc2lnbmlmaWNhIGNoZSBobyByaW1hbmRhdG8gbGEgcmljZXJjYVxyXG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ3ZpZXcnKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaXJzdEl0ZW1Hcm91cE9yTm9Hcm91cGluZyA9ICh0aGlzLlZpZXcucmVxdWVzdGVkZ3JvdXBzPy5sZW5ndGggfHwgMCkgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgcmljZXJjYSBpbnRlcm5hIG1hbnRlbmdvIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBwcmVjZWRlbnRlIChxdWluZGkgc3UgY2FtYmlvIHBhZ2luYSwgY2FtYmlvIGlwcCwgZWNjLi4uKVxyXG4gICAgICAgICAgICAvLyBzZSBpbnZlY2UgbCd1dGVudGUgaGEgZmF0dG8gdW5hIHJpY2VyY2EgbHVpIChxdWluZGkgY2FtYmlhbmRvIGZpbHRyaSksIHNlY2NvIGxlIGluZm8gZGkgc2VsZXppb25lXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5WaWV3LnNlbGVjdGlvbiB8fCAoIXRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgJiYgZmlyc3RJdGVtR3JvdXBPck5vR3JvdXBpbmcpIHx8ICF0aGlzLlVzZVNlbGVjdGlvbkNhY2hlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIFByZWZlcmVuY2VcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmdDb250cm9sLm5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgYXZlcmUgdW4gJ25hbWUnIHBlciBxdWVzdGEgdGFiZWxsYVwiKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnByZWZTZXJ2aWNlKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGNoZSBpbCBwYWNjaGV0dG8gQGVzZmFlbnphL3ByZWZlcmVuY2VzIHNpYSBpbnN0YWxsYXRvXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZzID0gYXdhaXQgdGhpcy5wcmVmU2VydmljZS5nZXRJdGVtPHsgY29sdW1uczogc3RyaW5nW10sIGNvbHVtbl9vcmRlcmluZzogc3RyaW5nW10sIG9yZGVyczogQXBwT3JkZXJpbmdbXSB9Pig8c3RyaW5nPnRoaXMubmdDb250cm9sLm5hbWUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2kgbGEgZ2VudGUgc2kgbWV0dGEgYSBzcGFtbWFyZSByZWZyZXNoIGNvbiBuZ2lmIHN0cmFuaSBzdWxsJ2VzdGFibGUgY3JlYW5kb2xhIGUgZGlzdHJ1Z2dlbmRvbGEgTiB2b2x0ZSBhbCBzZWNvbmRvIG5lbCB0ZW1wbyBjaGUgY2kgbWV0dGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRpcmFyZSBzdSBsZSBwcmVmZXJlbmNlIGRhIHF1aSBzb3ByYSBsYSBWaWV3IHBvdHJlYmJlIGVzc2VyZSBjYW1iaWF0YVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRQcmVmcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBvc2l0b3J5OiBzdHJpbmdbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdGhpcy5WaWV3LnJlcG9ydF9jb2x1bW5zLm1hcCh0ID0+IHQuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5WaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgZGV2byBjb250cm9sbGFyZSBjaGUgdHV0dGUgbGUgY29sb25uZSBzYWx2YXRlIGZhY2NpYW5vIHBhcnRlIGRlbGxhIHZpc3RhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0byBmYWNlbmRvIHJpZmVyaW1lbnRvIGEgdW5hIHZlcnNpb25lIHZlY2NoaWEgZGVsbCdlcy10YWJsZSwgcXVpbmRpIG5vbiBmYWNjaW8gb3BlcmF6aW9uaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIG1pIGJhc28gc3UgZGlyZXR0aXZlIG1hIG5lbGxlIHByZWZlcmVuY2Ugw6ggcHJlc2VudGUgYW5jaGUgc29sbyB1bmEgY29sb25uYSBub24gcHJlc2VudGUgbmVsbGUgZGlyZXR0aXZlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2dW9sIGRpcmUgY2hlIGwnZXMtdGFibGUgw6ggY2FtYmlhdGEgcXVpbmRpIG5vbiBpbXBvc3RvIHByZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkVzVGhzRGlyZWN0aXZlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcG9zaXRvcnkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aHNDYWNoZVNldCAmJiAhdGhpcy50aHNDYWNoZVtyZXBvc2l0b3J5W2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcuY29sdW1ucyA9IHByZWZzPy5jb2x1bW5zIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3LmNvbHVtbl9vcmRlcmluZyA9IHByZWZzPy5jb2x1bW5fb3JkZXJpbmcgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZSBsZSBwcmVmIHNvbm8gbnVsbGUgbm9uIHNvdnJhc2NyaXZvIGdsaSBvcmRpbmkgZGF0byBjaGUgcG90cmViYmUgc2VydmlyZSBtZXR0ZXJlIGRlZ2xpIG9yZGluYW1lbnRpIGRpIGRlZmF1bHQgbGF0byB0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WaWV3Lm9yZGVycyA9IHByZWZzPy5vcmRlcnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIExhIHBhZ2luYXppb25lIGRldm8gZmFybGEgc29sYW1lbnRlIHF1YW5kbyByaWNoaWVkbyBvIHVuIGdydXBwbyBwcmluY2lwYWxlIChzZSBzb25vIGluIHJvdyBncm91cGluZykgbyBzZSBub24gcmljaGllZG8gZ3J1cHBpIChpbiB0dXR0aSBsZ2kgYWx0cmkgY2FzaSlcclxuICAgICAgICAgICAgaWYgKGZpcnN0SXRlbUdyb3VwT3JOb0dyb3VwaW5nKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnJheVB1bHNhbnRpID0gdGhpcy51dGlsaXRpZXNfSC5nZXRQYWdlc0FycmF5KDYsIHRoaXMuVmlldy5wYWdlLCB0aGlzLlZpZXcucGFnZXMgfHwgMSwgdGhpcy5WaWV3Lml0ZW1zLmxlbmd0aCwgdGhpcy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5WaWV3ICYmICh0aGlzLlZpZXcubGVuZ3RoICE9IG51bGwgJiYgdGhpcy5WaWV3Lmxlbmd0aCAhPSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnYXJyYXknKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5Vc2VTZWxlY3Rpb25DYWNoZSB8fCAhdGhpcy5hcnJheW1vZGVTZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVjdXBlcm8gUHJlZmVyZW5jZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5TYXZlUHJlZmVyZW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wubmFtZSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBhdmVyZSB1biAnbmFtZScgcGVyIHF1ZXN0YSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMucHJlZlNlcnZpY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZnMgPSBhd2FpdCB0aGlzLnByZWZTZXJ2aWNlLmdldEl0ZW08eyBjb2x1bW5zOiBzdHJpbmdbXSwgY29sdW1uX29yZGVyaW5nOiBzdHJpbmdbXSwgb3JkZXJzOiBBcHBPcmRlcmluZ1tdIH0+KDxzdHJpbmc+dGhpcy5uZ0NvbnRyb2wubmFtZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbHMgPSBwcmVmcz8uY29sdW1ucyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZFByZWZzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwb3NpdG9yeTogc3RyaW5nW107XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZTogc3RyaW5nW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZpZXcucmVwb3J0X2NvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucy5tYXAodCA9PiB0LmlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29scztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb2xzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0aGlzLlZpZXcuY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByZXBvcnQgYWdnaW9ybm8gbGUgcHJlZmVyZW56ZSBzb2xvIHNlIGMnw6ggYWxtZW5vIHVuYSBjb2xvbm5hLCBhbHRyaW1lbnRpIHZ1b2wgZGlyZSBjaGUgc2kgcGFydGUgZGEgdnVvdGlcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb24gdHV0dGUgbGUgY29sb25uZSBkaXNwb25pYmlsaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuVmlldy5yZXBvcnRfY29sdW1ucyAmJiAoc291cmNlPy5sZW5ndGggfHwgMCkgPT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFByZWZzID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCBub3JtYWxlIGludmVjZSBzZSBsZSBwcmVmZXJlbnplIGZhbm5vIHJpZmVyaW1lbnRvIGEgZGVsbGUgY29sb25uZSBjaGUgaW8gbm9uIGhvIG5lbGxhIFZpZXcgYXR0dWFsZSBzaWduaWZpY2EgY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvIGZhY2VuZG8gcmlmZXJpbWVudG8gYSB1bmEgdmVyc2lvbmUgdmVjY2hpYSBkZWxsJ2VzLXRhYmxlLCBxdWluZGkgbm9uIGZvY2NpbyBvcGVyYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuaW5kZXhPZihzb3VyY2VbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkUHJlZnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlZFByZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5zID0gcHJlZnM/LmNvbHVtbnMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmlldy5jb2x1bW5fb3JkZXJpbmcgPSBwcmVmcz8uY29sdW1uX29yZGVyaW5nIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgbGUgcHJlZiBzb25vIG51bGxlIG5vbiBzb3ZyYXNjcml2byBnbGkgb3JkaW5pIGRhdG8gY2hlIHBvdHJlYmJlIHNlcnZpcmUgbWV0dGVyZSBkZWdsaSBvcmRpbmFtZW50aSBkaSBkZWZhdWx0IGxhdG8gdHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZpZXcub3JkZXJzID0gcHJlZnM/Lm9yZGVycyB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaFZpZXcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgdGhpcy5TZWFyY2hWaWV3LnBhZ2UsIHRoaXMuU2VhcmNoVmlldy5wYWdlcyB8fCAxLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXMubGVuZ3RoLCB0aGlzLlNlYXJjaFZpZXcuaXRlbXNwZXJwYWdlb3ZlcnJpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbnRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb3N0Qm91bmRTb3VyY2VDYWxjdWxhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WaWV3ICYmICF0aGlzLlZpZXcuc2VsZnNlYXJjaCAmJiB0aGlzLkVzVGFibGVIYW5kbGVkU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmlldy5zZWxmc2VhcmNoID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoUmVxdWVzdC5lbWl0KGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3LnNlbGZzZWFyY2ggJiYgdGhpcy5Fc1RhYmxlSGFuZGxlZFNlYXJjaCkge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZnNlYXJjaCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgcGVyIGlsIGJvZHkgY2hlIGRvdnJlYmJlIGV2aXRhcmUgaWwgOTAlIGRlbGxlIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuICAgIHB1YmxpYyBib2R5VHJhY2tCeSA9IChfOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbS5faGFzaDtcclxuXHJcbiAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIGlkICovXHJcbiAgICBwdWJsaWMgaWRUcmFja0J5ID0gKF86IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtLmlkO1xyXG5cclxuICAgICAvKiogRnVuemlvbmUgZGkgdHJhY2tieSBnZW5lcmljYSBwZXIgdHV0dGkgZ2xpIG9nZ2V0dGkgY2hlIGhhbm5vIGlsIGNhbXBvIFByb3BlcnR5TmFtZSAqL1xyXG4gICAgcHVibGljIFByb3BlcnR5TmFtZVRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uUHJvcGVydHlOYW1lO1xyXG5cclxuICAgIC8qKiBGdW56aW9uZSBkaSB0cmFja2J5IGdlbmVyaWNhIHBlciB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgaGFubm8gaWwgY2FtcG8gSUQgKi9cclxuICAgIHB1YmxpYyBJRFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0uSUQ7XHJcblxyXG4gICAgLyoqIEZ1bnppb25lIGRpIHRyYWNrYnkgZ2VuZXJpY2EgcGVyIHR1dHRpIGdsaSBvZ2dldHRpIGNoZSBoYW5ubyBpbCBjYW1wbyBJRCAqL1xyXG4gICAgcHVibGljIHZhbFRyYWNrQnkgPSAoXzogbnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW0udmFsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3VjY2Vzc2l2YW1lbnRlIGFsIGJpbmQgZGVsIG51b3ZvIGlucHV0IHF1ZXN0YSBmdW56aW9uZSBzaSBvY2N1cGEgZGkgZmluYWxpenphcmUgdHV0dGkgaSBwYXJhbWV0cmkgZGkgZnVuemlvbmFtZW50byBkZWxsJ2VzLXRhYmxlIFxyXG4gICAgICogaW4gYmFzZSBhIElucHV0IC0gTW9kZWxsbywgZSBxdWFsc2lhc2kgYWx0cmEgY29zYSBwb3NzYSBzZXJ2aXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVDb250ZXh0KCkge1xyXG4gICAgICAgIGxldCB2aWV3Q2FzdGVkID0gdGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+O1xyXG5cclxuICAgICAgICBsZXQgaGFzUm93R3JvdXBzID0gdmlld0Nhc3RlZCAmJiAodmlld0Nhc3RlZC5ncm91cGluZ3MgJiYgdmlld0Nhc3RlZC5ncm91cGluZ3MuZmlsdGVyKHQgPT4gIXQuYWdncmVnYXRpb24pLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLkVzVGhzRGlyZWN0aXZlLnNvbWUodCA9PiB0LnRoR3JvdXApKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZGVpIGdydXBwaSBpbiBtb2RhbGl0w6AgYXJyYXkgZGV2byBzaXN0ZW1hcmUgdW4gcG8nIGRpIHZhcmlhYmlsaSBjaGUgZGl2ZW50YW5vIGluc2Vuc2F0ZVxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiBoYXNSb3dHcm91cHMpXHJcbiAgICAgICAgICAgIHRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFJpZW1waW1lbnRvIGRlbGxhIFRNUEJvdW5kU291cmNlIGNvbiBnbGkgb2dnZXR0aSBjaGUgdmVycmFubm8gcG9pIG1vc3RyYXRpIGFkIGludGVyZmFjY2lhXHJcbiAgICAgICAgdGhpcy5UTVBCb3VuZFNvdXJjZSA9IHRoaXMuaXRlbXNfSC5nZXRJdGVtc0J5TW9kZShmYWxzZSwgIXRoaXMuaW50ZXJuYWxXcml0ZUNhbGwpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyB1bmEgZ2VyYXJjaGlhLCBhc3NlZ25vIGkgbGl2ZWxsaSBnZXJhcmNoaWNpIGFsbGEgVE1QQm91bmRTb3VyY2VcclxuICAgICAgICBpZiAodGhpcy5IaWVyYXJjaHkgJiYgIWhhc1Jvd0dyb3VwcylcclxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlNb2RlX0guYXNzaWduSGllcmFyY2h5TGV2ZWxzKHRoaXMuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAvLyBMJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aSBsbyBmYWNjaW8gYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaCh0aGlzLlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBhIHVuYSB2YXJpYWJpbGUgbWlhIGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjbGFzc2UgZGVsbGEgcmlnYVxyXG4gICAgICAgIC8vIFNlIHBvaSBzb25vIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIGluaWV0dG8gYW5jaGUgbGEgY2xhc3NlIHBlciBsYSBjb25maWd1cmF6aW9uZSBkZWwgbGl2ZWxsbyBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCh0aGlzLlRNUEJvdW5kU291cmNlICYmIHRoaXMuUm93Q2xhc3NBc3NpZ25lcikgfHwgdGhpcy5IaWVyYXJjaHkpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLlRNUEJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuVE1QQm91bmRTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyA9IHRoaXMuUm93Q2xhc3NBc3NpZ25lciA/IHRoaXMuUm93Q2xhc3NBc3NpZ25lcihpdGVtKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpdGVtLl9yb3dDbGFzcyArPSB0aGlzLkhpZXJhcmNoeSA/IFwiIGVzdC1yb3ctbHZsLVwiICsgaXRlbS5fbGV2ZWwgOiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZW5lcmEgbGUgaW5mb3JtemlvbmkgZGkgcGFnaW5hemlvbmUgcGVyIGxhIHZpc3RhIGdsb2JhbGUgZGVsbCdlcy10YWJsZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpIHtcclxuXHJcbiAgICAgICAgLy8gRGVmYXVsdCBjaGUgdmFsZ29ubyBkaSBiYXNlLCBwb2kgZXZlbnR1YWxtZW50ZSBtb2RkYXRpIGRhbGxlIGZ1bnppb25pIHNvdHRvXHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gIXRoaXMuSGlkZVBhZ2luZ0NvdW50O1xyXG4gICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gIXRoaXMuSGlkZVBhZ2luZ0J1dHRvbnM7XHJcbiAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9ICF0aGlzLkhpZGVQYWdpbmdcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSAmJiB0aGlzLlVzZUFycmF5TW9kZVBhZ2luZyAmJiAhdGhpcy5TZWFyY2hWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgdGhpcy5WaWV3Lmxlbmd0aCA+IDEwO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3ID0gdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5Vc2VzVmlldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSAmJiAoIXRoaXMuVXNlQXJyYXlNb2RlUGFnaW5nIHx8IHRoaXMuU2VhcmNoVmlldykpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuU2VhcmNoVmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuVmlldyA9IHRoaXMuU2VhcmNoVmlld1xyXG4gICAgICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IHRoaXMuU2VhcmNoVmlldy5vYmplY3Rjb3VudCB8fCAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlBhZ2VyQ291bnQgPSAoPGFueVtdPnRoaXMuVmlldykubGVuZ3RoIHx8IDBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnMgJiYgKHRoaXMuVmlldy5sZW5ndGggPiAxMCB8fCAodGhpcy5TZWFyY2hWaWV3Py5vYmplY3Rjb3VudCB8fCAwKSA+IDEwKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50ID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0NvdW50IHx8ICh0aGlzLlZpZXcgJiYgdGhpcy5WaWV3Lmxlbmd0aCkgfHwgKHRoaXMuU2VhcmNoVmlldyAmJiB0aGlzLlNlYXJjaFZpZXcub2JqZWN0Y291bnQgJiYgdGhpcy5TZWFyY2hWaWV3Lm9iamVjdGNvdW50ICE9IC0xKTtcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuU2hvd1BhZ2luZyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgKHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zIHx8IHRoaXMuUGFnZXJPcHRpb25zLlNob3dDb3VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zID0gdGhpcy5QYWdlck9wdGlvbnMuU2hvd0J1dHRvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlld01vZGUpIHtcclxuICAgICAgICAgICAgbGV0IHRtcFZpZXcgPSB0aGlzLk1haW5Hcm91cFZpZXcgfHwgdGhpcy5WaWV3O1xyXG4gICAgICAgICAgICBsZXQgY291bnQgPSB0bXBWaWV3Py5ncm91cGNvdW50IHx8IHRtcFZpZXc/Lm9iamVjdGNvdW50O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TZWFyY2hlcyA9IHRtcFZpZXc/Lmdyb3VwY291bnQgIT0gbnVsbCAmJiB0bXBWaWV3Py5ncm91cGNvdW50ICE9IHVuZGVmaW5lZCA/ICdncm91cHMnIDogJ2l0ZW1zJztcclxuICAgICAgICAgICAgdGhpcy5QYWdlck9wdGlvbnMuUGFnZXJDb3VudCA9IGNvdW50IHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMuUGFnZXJPcHRpb25zLlZpZXcgPSB0bXBWaWV3O1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgPSB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgKHRtcFZpZXcgJiYgY291bnQgJiYgY291bnQgIT0gLTEpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93QnV0dG9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmICh0bXBWaWV3LnBhZ2luZ2F2YWlsYWJsZSB8fCB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93Q291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nT3B0aW9ucyA9IHRoaXMuUGFnZXJPcHRpb25zLlNob3dCdXR0b25zO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBsYW5jaWF0byBkb3BvIGNoZSBsYSBzb3JnZW50ZSBkYXRpIMOoIHN0YXRhIGNvcnJldHRhbWVudGUgYmluZGF0YSwgc2kgb2NjdXBhIGRpIHJpY2FsY29sYXJlIHR1dHRvIGNpw7IgY2hlIHNlcnZlXHJcbiAgICAgKiBhbGwnZXMtdGFibGUgcGVyIHJlbmRlcml6emFyZSBpIHZhbG9yaSBkYSBtb3N0cmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc3RCb3VuZFNvdXJjZUNhbGN1bGF0aW9uKCkge1xyXG4gICAgICAgIC8vIFJlc2V0dG8gdHV0dG8gdHJhbm5lIFJvd1REcyBlIFJvd1RIcyBwZXIgZXZpdGFyZSBmbGlja2VyaW5nLiBSb3dURHMgZSBSb3dUSHMgc2FyYW5ubyBtb2RpZmljYXRlIGFsbCdpbnRlcm5vIGRlbCBwcm9zc2ltbyBjaWNsbyBkaSBDRFxyXG4gICAgICAgIHRoaXMuUm93Q29udGV4dHMgPSBbXTtcclxuICAgICAgICB0aGlzLk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbUlEID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBvc3RCb3VuZFNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBQZXIgcG90ZXIgZGlzdGluZ3VlcmUgbGUgY2hpYW1hdGUgYSBxdWVzdG8gbWV0b2RvOiBEb3BvIGlsIHNldFRpbWVvdXQgc2UgdXNvIGdsaSBFc1RkL0VzVGggdmVjY2hpLCBzZW56YSBpbCBzZXRUaW1lb3V0IHNlIHVzbyBsZSBudW92ZSBkaXJldHRpdmUgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgaW50ZXJuYWxQb3N0Qm91bmRTb3VyY2UoKSB7XHJcbiAgICAgICAgbGV0IFZpZXcgPSB0aGlzLlZpZXc7XHJcblxyXG4gICAgICAgIGxldCB0aHNUZHNQcm92aWRlcnMgPSBbLi4uKHRoaXMuRXNUaFRkUHJvdmlkZXIgPyBbdGhpcy5Fc1RoVGRQcm92aWRlcl0gOiBbXSksIC4uLnRoaXMuVGhUZFByb3ZpZGVyXTtcclxuICAgICAgICBpZiAodGhzVGRzUHJvdmlkZXJzPy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICBhd2FpdCBmb3JrSm9pbih0aHNUZHNQcm92aWRlcnMubWFwKHQgPT4gdC5Mb2FkZWRTaWduYWwpKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIGhvIGNvbG9ubmUgZGluYW1pY2hlIG1hIHNvbm8gaW4gbW9kYWxpdMOgIGRpbmFtaWNhIChsbyBjYXBpc2NvIHBlcmNow6kgYyfDqCB1bmEgdmlldyBwaWVuYSBkaSBnZW5lcmljaXRlbSkgbWV0dG8gaWwgZGVmYXVsdCBkZWxsZSBjb2xvbm5lXHJcbiAgICAgICAgdGhpcy5keW5hbWljTW9kZV9ILmV2ZW50dWFsbHlSZXZpZXdEeW5hbWljQ29sdW1ucygpO1xyXG5cclxuICAgICAgICAvLyBHZXN0aXNjZSBsYSByaWNoaWVzdGEgcGVyIGdydXBwaSBvIHBlciBzaW5nb2xpIG9nZ2V0dGlcclxuICAgICAgICB0aGlzLmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKFZpZXcpO1xyXG5cclxuICAgICAgICAvLyBRdWVzdG8gZGV2J2Vzc2VyZSBwZXIgZm9yemEgbGFuY2lhdG8gZG9wbyAqKmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKiogZGF0byBjaGUgw6ggbMOsIGNoZSBhbGN1bmUgY29zZSB2ZW5nb25vIHZhbG9yaXp6YXRlXHJcbiAgICAgICAgdGhpcy5zZXR1cFBhZ2luZ0luZm9ybWF0aW9ucygpO1xyXG5cclxuICAgICAgICAvLyBNb2x0ZSBjb3NlIHNvbm8gb3Z2aWFtZW50ZSBkaXNwb25pYmlsaSBzb2xvIGluIG1vZGFsaXTDoCBWaWV3XHJcbiAgICAgICAgaWYgKCh0aGlzLnZpZXdNb2RlIHx8IHRoaXMuYXJyYXlNb2RlKSAmJiB0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIGxldCB2aWV3ID0gdGhpcy52aWV3TW9kZSA/IFZpZXcgYXMgQXBwU2VhcmNoPGFueT4gOiBudWxsO1xyXG4gICAgICAgICAgICBsZXQgaXRlbXNBbmRHcm91cHMgPSB0aGlzLnZpZXdNb2RlID8gWy4uLih2aWV3Lml0ZW1zIHx8IFtdKSwgLi4uKHZpZXcuZ3JvdXBzIHx8IFtdKV0gOiBWaWV3IGFzIGFueVtdO1xyXG4gICAgICAgICAgICBsZXQgc2kgPSB0aGlzLnZpZXdNb2RlID8gdmlldy5zZWxlY3Rpb24gOiB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuXHJcbiAgICAgICAgICAgIC8vIE4uQjogUmlzcGV0dGFyZSBsJ29yZGluZSBkaSBxdWVzdGUgMyBtYWNyb2NhdGVnb3JpZSDDqCBWSVRBTEVcclxuICAgICAgICAgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgU2lzdGVtYXppb25pIGRpIFRILCBURCwgZSB2aXNpYmlsaXTDoCB2YXJpZSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIGRlZmluaXppb25pIGRpbmFtaWNoZSwgcHJpbWEgZGkgcXVhbHNpYXNpIGFsdHJhIGNvc2EgZGV2byB0cmFzZm9ybWFybGUgaW4gdGgvdGQgaW4gbW9kbyBjaGUgcG9pIGlsIGNvZGljZSBxdWkgc290dG8gZmFjY2lhIGxlIHN1ZSBtYWdpZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkdlbmVyYXRpbmcgdGhzIGFuZCB0ZHMgZnJvbSBEeW5hbWljIGRlZmluaXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5keW5hbWljTW9kZV9ILmVtaXRUaHNBbmRUZHNCYXNlZE9uRHluYW1pY0RlZmluaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXNUaHMgPSByZXQudGhzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Fc1RkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEdlc3Rpb25lIGRlbGxlIHZpZXcgaW4gbW9kYWxpdMOgIHJlcG9ydCwgaSB0aCBlIGkgdGQgdmVuZ29ubyByaWdlbmVyYXRpIGRhbGxlIGNvbmZpZ3VyYXppb25pIGRlbGxhIHZpZXdcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmFycmF5TW9kZSAmJiB2aWV3LnJlcG9ydF9jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJHZW5lcmF0aW5nIHRocyBhbmQgdGRzIGZyb20gcmVwb3J0IHJlc3VsdHNcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0gdGhpcy5yZXBvcnRNb2RlX0guZ2VuZXJhdGVUaHNBbmRUZHNGcm9tVmlldyh2aWV3KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXNUaHMgPSByZXQudGhzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5Fc1RkcyA9IHJldC50ZHM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEVzcGFuZG8gaSB0aCBlIGkgdGQgbXVsdGlwbGkgZHVwbGljYW5kb2xpXHJcbiAgICAgICAgICAgIGxldCByZXQgPSB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZXhwYW5kTXVsdGlUaHNBbmRUZHModGhpcy5Fc1RocywgdGhpcy5Fc1RkcywgaXRlbXNBbmRHcm91cHMpO1xyXG4gICAgICAgICAgICB0aGlzLkVzVGhzID0gcmV0LmV4cFRocztcclxuICAgICAgICAgICAgdGhpcy5Fc1RkcyA9IHJldC5leHBUZHM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZW5lcm8gbGEgY2FjaGUgZGVpIHRoIGRhIHVzYXJlIGRhIHF1aSBpbiBwb2ksIGRvcG8gYXZlcmdsaSBsYXNjaWF0byBmYXJlIGxlIHN1ZSBjb3NlIGluIGNhc28gY2kgc2lhbm8gZGVpIG11bHRpIG8gZGVpIHJlcG9ydFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuRXNUaHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoaXMuRXNUaHNbaV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRoc0NhY2hlW3RoLnRoXSA9IHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudGhzQ2FjaGVTZXQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJlcGFzc2FnZ2lvIHBlciB0aXJhcmUgZnVvcmkgdHV0dGUgbGUgaW5mbyB1dGlsaSBzdWdsaSBoZWFkZXJzIGluIG1vZG8gZGEgbm9uIHJpY2Fjb2xhcnNlbGkgc2VtcHJlIGRvcG9cclxuICAgICAgICAgICAgbGV0IGhJID0gdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlSGVhZGVyc0dyb3VwaW5nSW5mb3ModGhpcy5Fc1Rocyk7XHJcblxyXG4gICAgICAgICAgICAvLyBWYWx1dGEgbG8gc3RhdG8gaW5pemlhbGUgZGkgc2VsZXppb25lIGEgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5ldmFsdWF0ZVNpbmdsZUNlbGxTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIGhJLmxlYWZzLCB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbik7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheU1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYXJyYXkgbm9uIGhvIHVuIGJhY2tlbmQuLi5cclxuICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBpbmdfSC5hcnJheU1vZGVSZXZpZXdHcm91cGluZ3MoaEkubGVhZnMpOyAgLy8gLi4uIGkgcmFnZ3J1cHBhbWVudGkgbGkgZGV2byBmYXJlIGxhdG8gY2xpZW50XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmV2aWV3Q29sdW1uc0xpc3QoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdnaW9ybmEgbGEgbGlzdGEgZGVsbGUgY29sb25uZSBkYSBtb3N0cmFyZSBuZWxsYSBkaWFsb2cgcGVyIG9yZGluYW1lbnRvIGVjY1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guYWxpZ25Db2x1bW5zSWZMb2FkZWRWaWV3KHZpZXcpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gU2Ugc3RvIGNhcmljYW5kbyB1bmEgVmlldyBkYSBob3Rwb3RhdG8gKHF1aW5kaSBjb24gc2F2ZWRzdGF0ZSA9IHRydWUpIHJpYWxsaW5lbyBsYSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIGUgaWwgbG9ybyBvcmRpbmUuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5tb3ZlRml4ZWRDb2x1bW5zQXRUaGVCZWdpbm5pbmcoaEkubGVhZnMsIHRoaXMuRXNUZHMpOyAvLyBTcG9zdG8gdHV0dGUgbGUgY29zZSBmaXhlZCBhbGwnaW5pemlvIGluIG1vZG8gY2hlIGxhIGNyZWF6aW9uZSBkaSB0aCBlIHRkIHNpYSBwacO5IHNuZWxsYSAoVXRpbGl6emEgbGUgQ29sdW1uc0xpc3QsIHF1aW5kaSBkZXYnZXNzZXJlIHJpY2hpYW1hdGEgUElSTUEgZGkgcmV2aWV3Q29sdW1uc0xpc3QpXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hbGlnbkhlYWRlcnNPcmRlcmluZyhoSS5sZWFmcywgdmlldyk7ICAgICAgICAgICAgICAgICAvLyBBbGxpbmVvIGdsaSBvcmRpbmFtZW50aSBhZ2xpIGhlYWRlclxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0gucmVmcmVzaENvbHVtbnNWaXNpYmlsaXR5KGhJLmxlYWZzLCB0aGlzLkVzVGRzLCB2aWV3KTsgLy8gTGF2b3JvIHN1aSBUSCBlZCBldmVudHVhbG1lbnRlIG1vZGlmaWNvIGxhIHZpc2liaWxpdMOgIGFuY2hlIGRlaSBURC5cclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YV9ILmV2YWx1YXRlUGlubmVkQ29sdW1uc1dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlIHNvbm8gcHJlc2VudGkgY29sb25uZSBwaW5uYXRlIHZhbHV0YSBsYSBkaW1lbnNpb25lIGRlbCBjb250ZW5pdG9yZVxyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbk1ldGFkYXRhX0guZ2VuZXJhdGVEZWZhdWx0T3JkZXIoaEkubGVhZnMsIHZpZXcpOyAgICAgICAgICAgICAgICAgLy8gR2VuZXJvIGxlIGRpcmV0dGl2ZSBkaSBvcmRpbmFtZW50bywgY2hlIHNpYW5vIGRlZmF1bHQgbyBkZXJpdmFudGkgZGFsbGEgQXBwU2VhcmNoXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5ldmFsdWF0ZUhlYWRlckdyb3VwcyhoSSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWx1dG8gaSByYWdncnVwcGFtZW50aSBkZWdsaSBoZWFkZXIgc2UgcHJlc2VudGlcclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIEdlbmVyYXppb25lIGJpbmRpbmcgcGVyIHJpZ2hlIGUgY29sb25uZSAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVSb3dUaHMoaEkubGVhZnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmFjY29sZ28gaSBUSFxyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUm93VGRzKGhJLmxlYWZzLCB0aGlzLkVzVGRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhY2NvbGdvIGkgVEQgaW4gY29udGVzdGkgc2VwYXJhdGksIHVuIGNvbnRlc3RvIHBlciBvZ25pIGl0ZW0gbyBncnVwcG9cclxuXHJcbiAgICAgICAgICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICAgIFVsdGltaSBhZ2dpdXN0bWFlbnRpIGRlaSBiaW5kaW5nICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5hcHBseU9yZGVyaW5nKHZpZXcsIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxpY28gbCdvcmRpbmFtZW50byBzdWxsZSBjb2xvbm5lIChub24gQVNDIERFU0MsIG1hIFwicHJpbWEgcXVlc3RhIG8gcXVlbGxhIGNvbG9ubmFcIilcclxuICAgICAgICAgICAgdGhpcy5Nb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVnbyBUSCBlIFREIGFnZ2l1c3RhdGkgZmlubyBhZCBvcmEgYWxsZSB2YXJpYWJpbGkgZGkgQmluZGluZyBIVE1MXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXNBbmRHcm91cHMsIHNpKTsgICAgICAgICAgICAgICAgIC8vIFJpYWxsaW5lbyBsZSBpbmZvIGRpIHNlbGV6aW9uZSBkZWdsaSBlbGVtZW50aSBkZWxsYSBWaWV3XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5SZXNlYXJjaE5lZWRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICgodGhpcy52aWV3TW9kZSB8fCB0aGlzLmFycmF5TW9kZSkgJiYgIXRoaXMuVXNlQ3VzdG9tQ2VsbHMpIHtcclxuICAgICAgICAgICAgLy8gUmlhbGxpbmVvIGxlIGluZm8gZGkgc2VsZXppb25lIGRlZ2xpIGVsZW1lbnRpIGRlbGxhIFZpZXdcclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy52aWV3TW9kZSA/IChWaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pdGVtcyA6IFZpZXcgYXMgYW55W107XHJcbiAgICAgICAgICAgIGxldCBzaSA9IHRoaXMudmlld01vZGUgPyAoVmlldyBhcyBBcHBTZWFyY2g8YW55Pikuc2VsZWN0aW9uIDogdGhpcy5hcnJheW1vZGVTZWxlY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX0guZXZhbHVhdGVTZWxlY3Rpb24oaXRlbXMsIHNpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlciBlc3NlcmUgc2ljdXJvIGNoZSBkb3BvIHVuIGJpbmQgZGkgb2dnZXR0aSBsYSBlcy10YWJsZSBhZ2dpb3JuaSBsYSBncmFmaWNhXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgdGhpcy5GaXJzdEJpbmQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIGlsIGJpbmRpbmcgZGVnbGkgb2dnZXR0aSBwZXJ2ZW51dGkgZGEgcXVlc3RhIGNoaWFtYXRhIGNvbiBnbGkgb2dnZXR0aSBlZmZldHRpdmFtZW50ZSBkYSBncmFmaWNhcmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgVmlldyBkYSBjdWkgc29ubyBhcnJpdmF0aSBnbGkgb2dnZXR0aS4gUHXDsiBlc3NlcmUgbyB1biBhcnJheSBzZSBzb25vIGluICoqYXJyYXlNb2RlKiogbyB1bmEgQXBwU2VhcmNoPFQ+IHNlIHNvbm8gaW4gKip2aWV3TW9kZSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmluZERpc3BsYXlUb0xvYWRlZEl0ZW1zT3JHcm91cHModmlldzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLlRNUEJvdW5kU291cmNlIHx8IHRoaXMuVE1QQm91bmRTb3VyY2UubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5CYXNlSXRlbXNDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXJyYXlNb2RlIHx8ICF0aGlzLlVzZUN1c3RvbUNlbGxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgdmlldz8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBncm91cGluZ0tleXMgPSB2aWV3Py5ncm91cGluZ3M/LmZpbHRlcih0ID0+ICF0LmFnZ3JlZ2F0aW9uKT8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgaWYgKGdyb3VwaW5nS2V5cyA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm91bmRTb3VyY2UgPSB0aGlzLlRNUEJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLkJhc2VJdGVtc0NvdW50ID0gdmlldz8ub2JqZWN0Y291bnQgfHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yb3dHcm91cGluZ19ILmhhbmRsZU5ld0RhdGFPblJvd0dyb3VwaW5nKHZpZXcsIGdyb3VwaW5nS2V5cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyByaWNoaWFtYXRvIHNvbG8gcXVhbmRvICoqVE1QUm93VERzKiogZSAqKlRNUFJvd1RIcyoqIHNvbm8gY29tcGxldGFtZW50ZSBnZW5lcmF0aSBlZCBhZ2dpdXN0YXRpLiBTZXJ2ZSBwZXIgY29sbGVnYXJsaSBhbGxlIHZhcmlhYmlsaSB1c2F0ZSBsYXRvIGJpbmRpbmcgSFRNTCAqL1xyXG4gICAgcHJpdmF0ZSBNb3ZlVGVtcG9yYXJ5VmFyaWFibGVzVG9SZWFsT25lcygpIHtcclxuXHJcbiAgICAgICAgdGhpcy5Sb3dURHMgPSB0aGlzLlRNUFJvd1REcztcclxuICAgICAgICB0aGlzLlJvd1RIcyA9IHRoaXMuVE1QUm93VEhzO1xyXG4gICAgICAgIHRoaXMuUm93VGhHcm91cHMgPSB0aGlzLlRNUFJvd1RoR3JvdXBzID8gdGhpcy5UTVBSb3dUaEdyb3Vwcy5yZXZlcnNlKCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuRW1wdHlSb3dUZHMgPSB0aGlzLmlzRW1wdHkodGhpcy5Sb3dURHMpO1xyXG5cclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJpbGUgPSB0aGlzLlJvd1RIcy5maWx0ZXIodCA9PiB0LlZpc2libGUpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkID0gdGhpcy5Sb3dUSHMuZmlsdGVyKHQgPT4gdC5WaXNpYmxlICYmICF0LlBpbm5lZCkubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuQ29sdW1ucy5HbG9iYWwgPSB0aGlzLkNvbHVtbnMuVmlzaWJsZVVucGlubmVkICsgKHRoaXMuSGFzUGlubmVkQ29sdW1ucyA/IDEgOiAwKSArICh0aGlzLlNlbGVjdGlvbiA/IDEgOiAwKSArICh0aGlzLlJlbW92YWwgPyAxIDogMCkgKyAodGhpcy5FeHBvcnQgfHwgdGhpcy5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuQ29sdW1uc09yZGVyaW5nIHx8IHRoaXMuQ29ybmVyTWVudU9wdGlvbnMgPyAxIDogMClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBNZXRvZG8gcGVyIGNhcGlyZSBzZSB1biBvZ2dldHRvIMOoIGNvbXBsZXRhbWVudGUgdnVvdG8gXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvYmogT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbCdvZ2dldHRvIMOoIHZ1b3RvLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBpc0VtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yICh2YXIgXyBpbiBvYmopIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmUgaW4gbWFuaWVyYSBhcmJpdHJhcmlhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ICoqdHJ1ZSoqIHBlciBzZWxlemlvbmFybGksICoqZmFsc2UqKiBwZXIgbm9uIHRvY2NhcmxpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb25TdGF0dXMoaXRlbXM6IGFueVtdLCBhbGw6IGJvb2xlYW4sIHNlbGVjdDogYm9vbGVhbiwgZW1pdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKGFsbCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuU2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW1wb3NzaWJpbGUgaW1wb3N0YXJlIGxhIHNlbGV6aW9uZSBjb24gbCdhbGwgc2VsZWN0aW9uIHF1YW5kbyBsJ0lucHV0IFNlbGVjdEFsbCDDqCBmYWxzZVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHNpID0gKHRoaXMuVmlldyBhcyBBcHBTZWFyY2g8YW55Pik/LnNlbGVjdGlvbiB8fCB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICAgICAgLy9zZSBkZXNlbGV6aW9ubyBjb24gYXR0dWFsZSBzZWxlemlvbmUgYWQgYWxsIG8gc2Ugc2VsZXppb25vIGNvbiBhdHR1YWxlIHNlbGV6aW9uZSBtYW51YWxlIGRldm8gcmljaGlhbWFyZSBsYSAqKnNlbGVjdEFsbE9yUmVzZXRTZWxlY3Rpb24qKlxyXG4gICAgICAgICAgICBpZiAoKHNpLmFsbCAmJiAhc2VsZWN0KSB8fCAoIXNpLmFsbCAmJiBzZWxlY3QpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgIGlmIChlbWl0KVxyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuYXJyYXltb2RlU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVmZmV0dHVhIHVuIGhhcmQgcmVzZXQgZGVsbGEgc2VsZXppb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldFNlbGVjdGlvbihlbWl0OiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZpZXdNb2RlICYmIHRoaXMuVmlldykge1xyXG4gICAgICAgICAgICB0aGlzLlZpZXcuc2VsZWN0aW9uID0gbmV3IEl0ZW1zU2VsZWN0aW9uKFtdKTtcclxuICAgICAgICAgICAgaWYgKGVtaXQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHRoaXMuVmlldy5zZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5bW9kZVNlbGVjdGlvbiA9IG5ldyBJdGVtc1NlbGVjdGlvbihbXSk7XHJcbiAgICAgICAgICAgIGlmIChlbWl0KVxyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0aGlzLmFycmF5bW9kZVNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdGhPcmRlckNoYW5nZWQoaWQ6IHN0cmluZywgb3JkZXI/OiAnREVTQycgfCAnQVNDJykge1xyXG4gICAgICAgIGlmICghdGhpcy52aWV3TW9kZSAmJiAhdGhpcy5hcnJheU1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdPcmRlciBjaGFuZ2VkIG9uIGEgdGFibGUgbm90IGluIHZpZXdNb2RlIG9yIEFycmF5IG1vZGUuIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5PcmRlckJ5Q29sdW1uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1uTWV0YWRhdGFfSC5oYW5kbGVUSE9yZGVyQ2hhbmdlKGlkLCBvcmRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gZGEgY2hpYW1hcmUgb2duaSB2b2x0YSBjaGUgc2kgdnVvbGUgZGFyZSBldmlkZW56YSBhbGwnZXN0ZXJubyBkZWwgYmlzb2dubyBkaSByaWVmZmV0dHVhcmUgbGEgcmljZXJjYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2V0c1BhZ2UgSW5kaWNhIGFsIGxpc3RlbmVyIGNoZSBkZXZlIHJlc2V0dGFyZSBpbCBudW1lcm8gZGkgcGFnaW5hXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3T3ZlcnJpZGUgT3ZlcnJpZGUgZGVsbGEgdmlldyBkYSBlbWV0dGVyZSBwZXIgcXVlc3RhIHJpY2VyY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRTZWFyY2hSZXF1ZXN0KHJlc2V0c1BhZ2U6IGJvb2xlYW4sIHZpZXdPdmVycmlkZT86IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld01vZGUgJiYgIXZpZXdPdmVycmlkZSkge1xyXG4gICAgICAgICAgICAodGhpcy5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2aWV3T3ZlcnJpZGUpIHtcclxuICAgICAgICAgICAgaWYgKHJlc2V0c1BhZ2UpXHJcbiAgICAgICAgICAgICAgICB2aWV3T3ZlcnJpZGUucGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHZpZXdPdmVycmlkZS5pbnRlcm5hbHNlYXJjaHJlcXVlc3QgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlZpZXcgJiYgIXRoaXMuVmlldy5zZWxmc2VhcmNoICYmIHRoaXMuRXNUYWJsZUhhbmRsZWRTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LmVtaXQoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QuZW1pdCh2aWV3T3ZlcnJpZGUgPyB2aWV3T3ZlcnJpZGUgOiByZXNldHNQYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUZHMqKiBiaW5kYXRpIGdlbmVyYSwgYWxsJ2ludGVybm8gZGVsIGRpemlvbmFyaW8gKipUTVBSb3dURHMqKiB0dXR0aSBpIGNvbnRlc3RpIGRlaSB2YXJpIG9nZ2V0dGkuXHJcbiAgICAgKlxyXG4gICAgICogVmVuZ29ubyBlc2NsdXNpIGkgVEQgXCJJbnRlcm5pXCIgaW4gcXVhbnRvIHZlbmdvbm8gZ2VuZXJhdGkgZGFnbGkgb3JpZ2luYWxpIHF1aW5kaSBpbmNsdWRlcmxpIHZvcnJlYmJlIGRpcmUgcmllZmZldHR1YXJlIGxlIG9wZXJhemlvbmkgZHVlIHZvbHRlXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDIgc2NhbiBFc1RocywgMSBzY2FuIEVzVGRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlUm93VGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0ZHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW4gfSA9IHt9O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuQ29sdW1uc0xpc3RbY29saV07XHJcbiAgICAgICAgICAgIGNvbHVtbnNDYWNoZVtjb2wuaWRdID0gY29sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5UTVBSb3dURHMgPSB7fTtcclxuICAgICAgICAvLyBWYXJpYWJpbGUgZCdhcHBvZ2dpbyBwZXIgcGVybWV0dGVybWkgZGkgaW5zZXJpcmUgdHV0dGUgbGUgY29sb25uZSBcIkZpeGVkXCIgZGF2YW50aVxyXG4gICAgICAgIGxldCBjb250ZXh0Rml4ZWRzOiB7IFtjb250ZXh0OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmJvdW5kU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IGN0eCA9IGl0ZW0uX2hhc2g7XHJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGQudGQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aGlzLnRoc0NhY2hlW3RkLnRkXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoISF0aClcclxuICAgICAgICAgICAgICAgICAgICB0aC5fcmVmZXJlbmNlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU2tpcHBhcmUgc2VuemEgdGggKGNhc2lzdGljYSB0YWJlbGxhIGRpbmFtaWNhKVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoICYmIHRoLnRoSWYgJiYgKHRkLnRkSWYgfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhDYXN0ZWQgPSA8RXNUaERpcmVjdGl2ZT50aDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXhlZCA9IHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCB8fCB0aC50aFBpbm5lZDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbVRvQWRkID0gaXRlbS5faXRlbSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZEVsZW1lbnQ+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0Qm9yZGVyOiAoPGFueT50aENhc3RlZCkuX3Jib3JkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbm5lZDogY29sdW1uc0NhY2hlW3RkLnRkXS5waW5uZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGhDYXN0ZWQudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSGVhZGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogY29sdW1uc0NhY2hlW3RkLnRkXS52aXNpYmxlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0ZC50ZENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbkNsYXNzOiB0ZC50ZEljb25DbGFzcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkZpZWxkOiB0ZC50ZENvbmRpdGlvbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWU6IHRkLnRkQ29uZGl0aW9uVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGQudGRUaXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQ6IHRkLnRkQ29udGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlOiB0aENhc3RlZC50aEdyb3VwICYmICF0aGlzLlNob3dJdGVtR3JvdXBzQ29sdW1ucyA/IG51bGwgOiB0ZC5UZW1wbGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpOiB0ZC5fbXVsdGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVByb3A6IHRkLl9tdWx0aSA/IHRkLnRkLnNwbGl0KCdfJylbMF0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlJbmRleDogdGQuX211bHRpID8gdGQudGQuc3BsaXQoJ18nKVsxXSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ6ICh0ZC50ZEFsaWdubWVudCB8fCB0aC50aEFsaWdubWVudCB8fCB0aGlzLkRlZmF1bHRBbGlnbm1lbnQpLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHRkLnRkRm9ybWF0IHx8IHRoLnRoRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lOiB0aC50aFByb3BlcnR5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlOiB0aC50aFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVNvdXJjZTogdGgudGhTb3VyY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wQWNjZXNzb3I6IHRkLnRkUHJvcGVydHlBY2Nlc3NvcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlUGF0aDogKDxhbnk+dGhDYXN0ZWQpLnRoUm91dGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVQYXJhbWV0ZXJQcm9wZXJ0aWVzOiAoPGFueT50aENhc3RlZCkudGhSb3V0ZVBhcmFtZXRlclByb3BlcnRpZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8VGRFbGVtZW50PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRCb3JkZXI6ICg8YW55PnRoQ2FzdGVkKS5fbGJvcmQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGhDYXN0ZWQpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiBrZXksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNDYWNoZVt0ZC50ZF0ucGlubmVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlubmVkV2lkdGg6IHRoQ2FzdGVkLnRoUGlubmVkV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEhlYWRlcjogdGhDYXN0ZWQudGhHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwQWdncmVnYXRpb246ICEhdGhDYXN0ZWQudGhBZ2dyZWdhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc2libGU6IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENhc3RlZC50aEdyb3VwQ2xhc3MgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aGlzLnJvd0dyb3VwaW5nX0guZ2V0R3JvdXBDZWxsRGlzcGxheSg8R3JvdXA+aXRlbSwga2V5LCA8RXNUaERpcmVjdGl2ZT50aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVE1QUm93VERzW2N0eF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XS5wdXNoKGl0ZW1Ub0FkZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJvd0NvbnRleHRzLnB1c2goY3R4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UTVBSb3dURHNbY3R4XSA9IFtpdGVtVG9BZGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Rml4ZWRzW2N0eF0gPSBpc0ZpeGVkID8gMSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZSBub24gaG8gb2dnZXR0aSDDqCBpbnV0aWxlIGNoZSBjb250cm9sbG8gZ2xpIGVycm9yaSwgZGF0byBjaGUgZ2xpIGVzLXRkIG5vbiBlc2lzdGVyYW5ubyBkaSBjZXJ0byBlIGRpIGNvbnNlZ3VlbnphIGdsaSBlcy10aCBub24gc2FyYW5ubyByZWZlcmVuemlhdGlcclxuICAgICAgICBpZiAodGhpcy5UTVBCb3VuZFNvdXJjZS5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgZXJyczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGlmICghdGguX3JlZmVyZW5jZWQpXHJcbiAgICAgICAgICAgICAgICBlcnJzLnB1c2godGgudGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZXJySWRzID0gZXJycy5qb2luKCcsICcpO1xyXG4gICAgICAgICAgICB0aHJvdyBcIkwnSUQgZGkgdW5vIG8gcGnDuSBFc1RoIG5vbiBoYW5ubyBhbGN1biBFc1RkIGFzc29jaWF0bzogXCIgKyBlcnJJZHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFydGVuZG8gZGFnbGkgKipFc1RocyoqIGJpbmRhdGkgZ2VuZXJhLCBhbGwnaW50ZXJubyBkZWwgZGl6aW9uYXJpbyAqKlRNUFJvd1RIcyoqIHR1dHRpIGkgY29udGVzdGkgZGVpIHZhcmkgb2dnZXR0aS5cclxuICAgICAqXHJcbiAgICAgKiBWZW5nb25vIGVzY2x1c2kgaSBUSCBcIkludGVybmlcIiBpbiBxdWFudG8gdmVuZ29ubyBnZW5lcmF0aSBkYWdsaSBvcmlnaW5hbGkgcXVpbmRpIGluY2x1ZGVybGkgdm9ycmViYmUgZGlyZSByaWVmZmV0dHVhcmUgbGUgb3BlcmF6aW9uaSBkdWUgdm9sdGVcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMSBzY2FuIEVzVGhzICsgMSBzY2FuIENvbHVtbnNMaXN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBldmFsdWF0ZVJvd1Rocyh0aHM6IEVzVGhEaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnNMaXN0Q2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RhYmxlQ29sdW1uIH0gPSB7fTtcclxuICAgICAgICBsZXQgY2FzdGVkVmlldyA9IDxBcHBTZWFyY2g8YW55Pj50aGlzLlZpZXc7XHJcbiAgICAgICAgbGV0IGdyb3VwaW5nc1VuZGVmaW5lZCA9IHRoaXMudmlld01vZGUgJiYgKGNhc3RlZFZpZXcgJiYgIWNhc3RlZFZpZXcuZ3JvdXBpbmdzIHx8IGNhc3RlZFZpZXcuZ3JvdXBpbmdzLmxlbmd0aCA9PSAwKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkNvbHVtbnNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdG0gPSB0aGlzLkNvbHVtbnNMaXN0W2ldO1xyXG4gICAgICAgICAgICBjb2x1bW5zTGlzdENhY2hlW2l0bS5pZF0gPSBpdG1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuVE1QUm93VEhzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICBsZXQgdG9BZGQ6IFRoRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aC50aElmIHx8IHRoLnRoR3JvdXApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdGhDbGFzcyA9ICh0aC50aENsYXNzIHx8IFwiXCIpICsgKHRoLnRoU2hyaW5rID8gXCIgYXBwLWNvbC1taW5cIiA6IFwiXCIpICsgKHRoLnRoR3JvdXAgPyBcIiBlc3QtY29sLW1pblwiIDogXCJcIik7XHJcbiAgICAgICAgICAgICAgICB0b0FkZCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWQ6IGNvbHVtbnNMaXN0Q2FjaGVbdGgudGhdLnBpbm5lZCxcclxuICAgICAgICAgICAgICAgICAgICBGaXhlZDogdGgudGhGaXhlZCxcclxuICAgICAgICAgICAgICAgICAgICBQaW5uZWRXaWR0aDogdGgudGhQaW5uZWRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBJRDogdGgudGgsXHJcbiAgICAgICAgICAgICAgICAgICAgVmlzaWJsZTogdGgudGhWaXNpYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgIENsYXNzOiB0aENsYXNzLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyOiB0aC50aE9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIE9yZGVyYWJsZTogdGgudGhPcmRlcmFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGU6IHRoLlRlbXBsYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIEFsaWdubWVudDogKHRoLnRoQWxpZ25tZW50IHx8IHRoaXMuRGVmYXVsdEFsaWdubWVudCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZSBub24gw6ggbmVzc3VuIGNvbnRlbnV0byBuw6kgbmVzc3VuIHRlbXBsYXRlIG1vc3RybyBzZW1wbGljZW1lbnRlIGwnSUQgZGVsbCdoZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB0aC50aFN0YXRpY0NvbnRlbnQgIT0gbnVsbCA/IHRoLnRoU3RhdGljQ29udGVudCA6IHRoLlRlbXBsYXRlID8gJycgOiB0aC50aCxcclxuICAgICAgICAgICAgICAgICAgICBXcmFwOiB0aC50aFdyYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgTGVmdEJvcmRlcjogKDxhbnk+dGgpLl9sYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBSaWdodEJvcmRlcjogKDxhbnk+dGgpLl9yYm9yZCxcclxuICAgICAgICAgICAgICAgICAgICBNdWx0aTogdGguX211bHRpLFxyXG4gICAgICAgICAgICAgICAgICAgIE11bHRpQ29udGVudDogdGguX211bHRpX2NvbnRlbnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLlRNUFJvd1RIcy5wdXNoKHRvQWRkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTZSBobyB1biBtb2RlbGxvIGNoZSBkZXZlIGZ1bnppb25hcmUgYSByb3dncm91cGluZyBtYSBub24gw6ggYW5jb3JhIHN0YXRhIGVmZmV0dHVhdGEgbmVzc3VuYSByaWNlcmNhIHN1aSBncnVwcGkgcHJpbmNpcGFsaSAoZ3JvdXBpbmdzVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgLy8gbGkgZ2VuZXJvIGUgbWFuZG8gbGEgcHJpbWEgcmljZXJjYSBjaGUgZGV2J2Vzc2VyZSBzcGVkaXRhIGFsIGJhY2tlbmQgcGVyIGlsIHByaW1vIGNhcmljYW1lbnRvIGRlaSBncnVwcGlcclxuICAgICAgICAgICAgICAgIGlmIChncm91cGluZ3NVbmRlZmluZWQgJiYgKHRoLnRoQWdncmVnYXRpb24gfHwgdGgudGhHcm91cCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBBZ2dyZWdhdGlvbnM6IEdyb3VwT3JBZ2dyZWdhdGlvbltdID0gdGhpcy5yb3dHcm91cGluZ19ILmdldEdyb3VwQWdncmVnYXRpb25zKHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc3RlZFZpZXcuZ3JvdXBpbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWRWaWV3Lmdyb3VwaW5ncyA9IGdyb3VwQWdncmVnYXRpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVkVmlldy5ncm91cGluZ3MucHVzaCguLi5ncm91cEFnZ3JlZ2F0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVzZWFyY2hOZWVkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kaWV0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYWdlciBFbGVtZW50byBkaSBzZXBhcmF6aW9uZSBzdSBjdWkgw6ggZWZmZXR0dWF0YSBsYSByaWNlcmNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRUb1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZUdyb3VwKHBhZ2VyLnZpZXcucGFnZSArIHBhZ2UsIHBhZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwb3N0YSBsYSByaWNlcmNhIGFsbGEgcGFnaW5hIHNwZWNpZmljYXRhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFnZXIgRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgc3UgY3VpIMOoIGVmZmV0dHVhdGEgbGEgcmljZXJjYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ29Ub1BhZ2VHcm91cChwYWdlOiBudW1iZXIsIHBhZ2VyOiBHcm91cFBhZ2VyKSB7XHJcblxyXG4gICAgICAgIGxldCBhcHBTZWFyY2hFbGVtZW50ID0gcGFnZXIudmlldztcclxuICAgICAgICBpZiAocGFnZSA9PT0gMCB8fCAocGFnZSA+IGFwcFNlYXJjaEVsZW1lbnQucGFnZXMgJiYgYXBwU2VhcmNoRWxlbWVudC5wYWdlcyA+IDApKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGFwcFNlYXJjaEVsZW1lbnQucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgcGFnZXIuYnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzX0guZ2V0UGFnZXNBcnJheSg2LCBhcHBTZWFyY2hFbGVtZW50LnBhZ2UsIGFwcFNlYXJjaEVsZW1lbnQucGFnZXMpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlLCBhcHBTZWFyY2hFbGVtZW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIEdlc3Rpc2NlIGkgY2xpY2sgc3VsbGEgdGFiZWxsYSBzb2xvIHBlciBsZSByaWdoZSBhIGdydXBwby4gXHJcbiAgICAgKiBPIHJpbXVvdmUgZ2xpIGVsZW1lbnRpIGF0dHVhbG1lbnRlIHByZXNlbnRpIG8gY2FyaWNhIGlsIGNvbnRlbnV0byBkZWwgZ3J1cHBvXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGdyb3VwIEdydXBwbyBiaW5kYXRvIHN1IGN1aSBzaSDDqCBlZmZldHR1YXRvIGlsIGNsaWNrXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGwnb3BlcmFpem9uZSDDqCBhbmRhdGEgYSBidW9uIGZpbmUsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVHcm91cENsaWNrKGdyb3VwOiBHcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYXN0ZWQgPSB0aGlzLlZpZXcgYXMgQXBwU2VhcmNoPGFueT47XHJcbiAgICAgICAgbGV0IGFueUcgPSAoPGFueT5ncm91cCk7XHJcbiAgICAgICAgYW55Ry5fZXhwYW5kZWQgPSAhYW55Ry5fZXhwYW5kZWQ7XHJcblxyXG4gICAgICAgIC8vIFNvbm8gaW4gbW9kYWxpdMOgIHJhZ2dydXBwYW1lbnRvIHZpcnR1YWxlIGRhIGFycmF5OiBFc3BhbmRlcmUgc2lnbmlmaWNhIHJlbmRlcmUgdmlzaWJpbGkgdHV0dGkgZ2xpIG9nZ2V0dGkgcmVsYXRpdmkgYSBxdWVzdG8gZ3J1cHBvLCB2aWNldmVyc2EgaWwgY29udHJhcnJlXHJcbiAgICAgICAgaWYgKHRoaXMuQXJyYXlHcm91cGluZykge1xyXG4gICAgICAgICAgICBsZXQgYWxsUmVsYXRpdmVzID0gdGhpcy5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PlxyXG4gICAgICAgICAgICAgICAgKHQuX2dyb3VwICYmICgoYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ID09IGFueUcuX3RoaXNLZXkpIHx8ICghYW55Ry5fZXhwYW5kZWQgJiYgdC5fcGFyZW50ICYmIHQuX3BhcmVudC5zdGFydHNXaXRoKGFueUcuX3RoaXNLZXkpKSkpIHx8XHJcbiAgICAgICAgICAgICAgICAodC5faXRlbSAmJiAoKGFueUcuX2V4cGFuZGVkICYmIHQuX3RoaXNLZXkgPT0gYW55Ry5fdGhpc0tleSkgfHwgKCFhbnlHLl9leHBhbmRlZCAmJiB0Ll90aGlzS2V5LnN0YXJ0c1dpdGgoYW55Ry5fdGhpc0tleSkpKSkpXHJcbiAgICAgICAgICAgIGFsbFJlbGF0aXZlcy5mb3JFYWNoKHQgPT4geyB0Ll92aXNpYmxlID0gYW55Ry5fZXhwYW5kZWQ7IGlmICh0Ll9ncm91cCkgdC5fZXhwYW5kZWQgPSBmYWxzZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFueUcuX2V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIC8vIFJlc2V0dG8gaXBwXHJcbiAgICAgICAgICAgIGNhc3RlZC5pdGVtc3BlcnBhZ2VvdmVycmlkZSA9IDE1O1xyXG4gICAgICAgICAgICBpZiAoIWNhc3RlZC5yZXF1ZXN0ZWRncm91cHMpXHJcbiAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzID0gW25ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKV07XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxldmVsID0gYW55Ry5fZ3JvdXBsZXZlbDtcclxuICAgICAgICAgICAgICAgIC8vIHNlIGlsIGdydXBwbyBjbGljY2F0byBub24gaGEgdW4gbGl2ZWxsbyDDqCBpbCBwcmltbyBncnVwcG8sIHF1aW5kaSBvcmRpbmFtZW50byB1bmljb1xyXG4gICAgICAgICAgICAgICAgLy8gYWx0cmltZW50aSBkZXZvIHJpbXVvdmVyZSB0dXR0aSBpIGZpbHRyaSBzdSBsaXZlbGxpIHN1cGVyaW9yaSBhbCBsZXZlbCBjbGljY2F0byBlIGFnZ2l1bmdlcmUgaWwgbGV2ZWwgY2xpY2NhdG9cclxuICAgICAgICAgICAgICAgIGlmICghbGV2ZWwpXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtuZXcgR3JvdXBGaWx0ZXIoZ3JvdXAuY29sdW1uLCBncm91cC52YWx1ZSldO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3VwcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGFueUcuX3BhcmVudFJvdXRlLmZvckVhY2goKHN0ZXA6IEdyb3VwUm91dGVGcmFnbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZWQucmVxdWVzdGVkZ3JvdXBzLnB1c2gobmV3IEdyb3VwRmlsdGVyKHN0ZXAuY29sdW1uLCBzdGVwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzdGVkLnJlcXVlc3RlZGdyb3Vwcy5wdXNoKG5ldyBHcm91cEZpbHRlcihncm91cC5jb2x1bW4sIGdyb3VwLnZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHBhdGggPSAoYW55Ry5fcGFyZW50IHx8ICcnKSArIGdyb3VwLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gY2hpdXNvIHVuIGdydXBwbyBub24gbWkgc2VydmUgcmllZmZldHR1YXJlIHJpY2VyY2UsIG1pIGJhc3RhIGVsaW1pbmFyZSBkYWdsaSBvZ2dldHRpIGJpbmRhdGkgdHV0dGkgZ2xpIGVsZW1lbnRpIHNvdHRvc3RhbnRpIGEgcXVlbCBncnVwcG9cclxuICAgICAgICAgICAgdGhpcy5ib3VuZFNvdXJjZSA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX3BhcmVudCB8fCAhdC5fcGFyZW50LnN0YXJ0c1dpdGgocGF0aCkpO1xyXG5cclxuICAgICAgICAgICAgLy8gZGV2byBwZXLDsiBhbmNoZSByaW11b3ZlcmUgZXZlbnR1YWxpIGNhY2hlIHJlbGF0aXZlXHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlID0gdGhpcy5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gdC5wYXRoICE9IHBhdGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VzdGlzY2UgbGEgc2VsZXppb25lIGdsb2JhbGUgZGVnbGkgb2dnZXR0aSwgc2lhIHBlciBwYWdpbmEgY2hlIGEgbGl2ZWxsbyBkaSAqKlNlbGVjdEFsbCoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWwgVmFsb3JlIGZvcnphdG8gZGkgY2hlY2sgZGEgYXNzZWduYXJlIGFnbGkgb2dnZXR0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ2hlY2tDaGFuZ2VkKGZvcmNlZFZhbDogYm9vbGVhbiA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuXHJcbiAgICAgICAgLy8gUHJlbmRvIHR1dHRpIGdsaSBlbGVtZW50aSBwcmVzZW50aSBpbiBxdWVzdGEgdmlzdGEuIFNlIGhvIGdydXBwaSBwcmVuZG8gc29sbyBpIGdydXBwaSBhIGxpdmVsbG8gMCwgYWx0cmltZW50aSBwcmVuZG8gdHV0dGkgZ2xpIG9nZ2V0dGkgcGVyIHNlbGV6aW9uYXJsaVxyXG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmluZCh0ID0+IHQuX2dyb3VwKSA/IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gdC5fZ3JvdXAgJiYgIXQuX3BhcmVudCkgOiB0aGlzLmJvdW5kU291cmNlO1xyXG4gICAgICAgIHZhciBpdGVtU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25fSC5oYW5kbGVJdGVtc1NlbGVjdGlvbihpdGVtcywgZm9yY2VkVmFsLCB0aGlzLmdsb2JhbENoZWNrKTtcclxuICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChpdGVtU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogR2VzdGlzY2UgaSBjbGljayBzdWxsYSB0YWJlbGxhLCBnZXN0ZW5kbyBldmVudHVhbG1lbnRlIGFuY2hlIGdsaSBTaGlmdCArIENsaWNrIHBlciBzZWxlemlvbmFyZSB1biByYW5nZSBkaSBvZ2dldHRpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50IEV2ZW50byBuYXRpdm8gSFRNTCBkZWwgY2xpY2tcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gYmluZGF0byBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0byBpbCBjbGlja1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsJ29wZXJhaXpvbmUgw6ggYW5kYXRhIGEgYnVvbiBmaW5lLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2xpY2soZXZlbnQ6IGFueSwgaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyhudWxsKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkaXRlbXM6IGFueVtdID0gW107XHJcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ICYmIHRoaXMuU2hpZnRDbGljayAmJiAhdGhpcy5TaW5nbGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy51dGlFeHRzLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRTZWxlY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gIXQuX2dyb3VwICYmICF0Ll9zZXApO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2VsZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkaXRlbXMucHVzaCh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmICFzdGFydFNlbGVjdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0Ll9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRpdGVtcy5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodCA9PSBpdGVtIHx8IHQgPT0gdGhpcy5sYXN0U2VsZWN0ZWQpICYmIHN0YXJ0U2VsZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtLl9zZWxlY3RlZCA9ICFpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICBzZWxlY3RlZGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaXRlbVNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uX0guaGFuZGxlSXRlbXNTZWxlY3Rpb24oc2VsZWN0ZWRpdGVtcyk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoaXRlbVNlbGVjdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgZGkgdW5hIHBhZ2luYSBpbiBhdmFudGkgKG8gaW5kZWl0cm8pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFRvUGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgdmlldyA9IHRoaXMuTWFpbkdyb3VwVmlldyA/IHRoaXMuTWFpbkdyb3VwVmlldyA6IHRoaXMuVmlldztcclxuXHJcbiAgICAgICAgdGhpcy5nb1RvUGFnZSgoKHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3KT8ucGFnZSB8fCAwKSArIHBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Bvc3RhIGxhIHJpY2VyY2EgYWxsYSBwYWdpbmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZSBQYWdpbmEgYSBjdWkgbmF2aWdhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGxldCB2aWV3ID0gdGhpcy5NYWluR3JvdXBWaWV3ID8gdGhpcy5NYWluR3JvdXBWaWV3IDogKHRoaXMuYXJyYXlNb2RlID8gdGhpcy5TZWFyY2hWaWV3IDogdGhpcy5WaWV3KTtcclxuICAgICAgICBpZiAoIXZpZXcucGFnZSB8fCAhdmlldy5wYWdlcylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgYXBwU2VhcmNoRWxlbWVudCA9IHRoaXMuU2VhcmNoVmlldyB8fCB2aWV3O1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IChwYWdlID4gYXBwU2VhcmNoRWxlbWVudC5wYWdlcyAmJiBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzID4gMCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXBwU2VhcmNoRWxlbWVudC5wYWdlID0gcGFnZTtcclxuICAgICAgICBsZXQgY291bnQgPSAodmlldy5pdGVtcy5sZW5ndGggfHwgdmlldy5ncm91cHM/Lmxlbmd0aCB8fCAwKTtcclxuICAgICAgICBsZXQgaXBwID0gdmlldy5pdGVtc3BlcnBhZ2VvdmVycmlkZSB8fCAxNTtcclxuICAgICAgICB0aGlzLmFycmF5UHVsc2FudGkgPSB0aGlzLnV0aWxpdGllc19ILmdldFBhZ2VzQXJyYXkoNiwgYXBwU2VhcmNoRWxlbWVudC5wYWdlLCBhcHBTZWFyY2hFbGVtZW50LnBhZ2VzLCBjb3VudCwgaXBwKTtcclxuXHJcbiAgICAgICAgbGV0IGhhc0dyb3VwaW5ncyA9ICEhdGhpcy5NYWluR3JvdXBWaWV3O1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QoZmFsc2UsIGhhc0dyb3VwaW5ncyA/IHZpZXcgOiB0aGlzLlNlYXJjaFZpZXcgPyB0aGlzLlNlYXJjaFZpZXcgOiBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKlxyXG4gICAgICogcGVyIGNvbXVuaWNhcmUgYWwgY29tcG9uZW50ZSBjaGUgdXRpbGl6emEgcXVlc3RhIHRhYmVsbGEgY2hlIGkgZGF0aSBzb25vIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uSXRlbXNQZXJQYWdlQ2hhbmdlZChuZXdJcHApIHtcclxuICAgICAgICB0aGlzLlBhZ2VyT3B0aW9ucy5WaWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLk1haW5Hcm91cFZpZXcpXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLlNlYXJjaFZpZXcpIHtcclxuICAgICAgICAgICAgLy8gUXVlc3RvIHNlY29uZG8gbWUgc2kgcHXDsiBwb3J0YXJlIGEgbGl2ZWxsbyB1biBwbycgcGnDuSBhbHRvXHJcbiAgICAgICAgICAgIHRoaXMuU2VhcmNoVmlldy5wYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdCh0cnVlLCB0aGlzLlNlYXJjaFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEV2ZW50byByaWNoaWFtYXRvIHN1bCBjYW1iaW8gZGVsbGEgcGFnaW5hemlvbmUuIFZlcnLDoCByaWNoaWFtYXRvIGwnZXZlbnRvICoqZW1pdFNlYXJjaFJlcXVlc3QqKiBjb24gbGEgdmlzdGEgZGVsIHNlcGFyYXRvcmUgKi9cclxuICAgIHB1YmxpYyBvbkdyb3VwSXRlbXNQZXJQYWdlQ2hhbmdlZChwYWdlcjogR3JvdXBQYWdlciwgbmV3SXBwOiBudW1iZXIpIHtcclxuICAgICAgICBwYWdlci52aWV3Lml0ZW1zcGVycGFnZW92ZXJyaWRlID0gbmV3SXBwO1xyXG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgcGFnZXIudmlldyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKiBNZXRvZG8gY2hlIGdlc3Rpc2NlIGxhIG1vZGlmaWNhIGRlbCB0ZW1wbyBzcGVjaWZpY2F0byBwZXIgbCdhZ2dpb3JuYW1lbnRvIGF1dG9tYXRpY28gKi9cclxuICAgIHB1YmxpYyBhdXRvVXBkYXRlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIS9eWzEtOV1cXGQqJC8udGVzdCh0aGlzLnNlY29uZHMpKVxyXG4gICAgICAgICAgICB0aGlzLnNlY29uZHMgPSAnMTAnO1xyXG5cclxuICAgICAgICBsZXQgc2Vjb25kc0luTXMgPSBwYXJzZUludCh0aGlzLnNlY29uZHMsIG51bGwpICogMTAwMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdGhpcy5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7IH0sIHNlY29uZHNJbk1zKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hpYW1hdG8gZGFsIGNsaWNrIHN1IHVuYSBkZWxsZSBjb2xvbm5lIGdlbmVyYXRlIGRhbGwnSW5wdXQgKipEeW5hbWljT3BlcmF0aW9ucyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gTCdvZ2dldHRvIHN1IGN1aSB2YSBlZmZldHR1YXRhIGwnb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9waWQgQ29kaWNlIGlkZW50aWZpY2F0aXZvIGRlbGwnb3BlcmF6aW9uZSBkYSBlZmZldHR1YXJzaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZHluYW1pY09wZXJhdGlvbihpdGVtOiBhbnksIG9waWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMub25EeW5hbWljT3BlcmF0aW9uLmVtaXQoeyBpZDogb3BpZCwgaXRlbTogaXRlbSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnRXNUZCBkYSB1dGlsaXp6YXJlIHBlciBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBwZXIgY3VpIGNlcmNhcmUgbGEgY2VsbGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5vbWUgZGlyZXR0byBwZXIgY2VyY2FyZSBpbCBURCBjb24gbCdJRC4gUXVlc3RhIHZhcmlhYmlsZSBoYSBwcmlvcml0w6AgcmlzcGV0dG8gYSAqKmNvbHVtbioqXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtUZW1wbGF0ZVJlZjxhbnk+fSBUZW1wbGF0ZSBkYSB1c2FyZSBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmluZEVzVGQoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRXNUZCA9IHRoaXMuRXNUZHNEaXJlY3RpdmUuZmluZCgoaXRlbSkgPT4gbmFtZSA/IGl0ZW0udGQgPT09IG5hbWUgOiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgLy8gTmFtZSBub24gdHJvdmF0bywgZmFsbGJhY2sgYWwgbm9tZSBkZWxsYSBjb2xvbm5hXHJcbiAgICAgICAgaWYgKG5hbWUgJiYgY29sdW1uICYmICFFc1RkKVxyXG4gICAgICAgICAgICBFc1RkID0gdGhpcy5Fc1Rkc0RpcmVjdGl2ZS5maW5kKChpdGVtKSA9PiBpdGVtLnRkRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVzVGQgPyBFc1RkLlRlbXBsYXRlIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgaWwgY29udGVudXRvIGRlbGwnZWRpdG9yIEVzVGQgZGEgdXRpbGl6emFyZSBwZXIgbGEgY29sb25uYSBzcGVjaWZpY2F0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgcGVyIGN1aSBjZXJjYXJlIGwnZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb21lIGRpcmV0dG8gcGVyIGNlcmNhcmUgbCdFZGl0b3IgY29uIGwnSUQuIFF1ZXN0YSB2YXJpYWJpbGUgaGEgcHJpb3JpdMOgIHJpc3BldHRvIGEgKipjb2x1bW4qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7VGVtcGxhdGVSZWY8YW55Pn0gVGVtcGxhdGUgZGEgdXNhcmUgcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbmRFZGl0b3IoY29sdW1uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyA9IG51bGwpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICB2YXIgRWRpdG9yID0gdGhpcy5Fc1RkRWRpdG9yRGlyZWN0aXZlcy5maW5kKChpdGVtKSA9PiBuYW1lID8gaXRlbS5lZGl0b3IgPT09IG5hbWUgOiBpdGVtLmVkaXRvckZvclByb3BlcnR5ID09PSBjb2x1bW4pO1xyXG4gICAgICAgIC8vIE5hbWUgbm9uIHRyb3ZhdG8sIGZhbGxiYWNrIGFsIG5vbWUgZGVsbGEgY29sb25uYVxyXG4gICAgICAgIGlmIChuYW1lICYmIGNvbHVtbiAmJiAhRWRpdG9yKVxyXG4gICAgICAgICAgICBFZGl0b3IgPSB0aGlzLkVzVGRFZGl0b3JEaXJlY3RpdmVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZWRpdG9yRm9yUHJvcGVydHkgPT09IGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIEVkaXRvciA/IEVkaXRvci5UZW1wbGF0ZSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFcXVpdmFsZW50ZSBkZWwgbWV0b2RvICoqYWRkVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgTnVtZXJvIGRpIHBhZ2luZSBkYSBhZ2dpdW5nZXJlIChvIHNvdHRyYXJyZSwgc2UgbmVnYXRpdm8pIGFsbGEgcGFnaW5hIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5QWRkVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYXJyYXlHb1RvUGFnZSh0aGlzLmFycmF5bW9kZVBhZ2UgKyBwYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXF1aXZhbGVudGUgZGVsIG1ldG9kbyAqKmdvVG9QYWdlKiogcmlhZGF0dGF0byBwZXIgbGEgbW9kYWxpdMOgIGFycmF5XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2UgUGFnaW5hIGEgY3VpIG5hdmlnYXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheUdvVG9QYWdlKHBhZ2U6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChwYWdlID09PSAwIHx8IHBhZ2UgPiB0aGlzLmFycmF5bW9kZVBhZ2VzKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5hcnJheW1vZGVQYWdlID0gcGFnZTtcclxuXHJcbiAgICAgICAgLy8gUmlmb3J6byBpbCB3cml0ZXZhbHVlIGluIG1vZG8gY2hlIGlsIGNvZGljZSBwYXNzaSBkYWxsYSBnZXN0aW9uZSBjb21lIHNlIGZvc3NlIGZhdHRhIHJpcGFydGlyZSB1bmEgcmljZXJjYVxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXN0aW9uZSBkZWkgY2xpY2sgc3VsbGUgb3B6aW9uaSBkZWwgbWVuw7kgY29udGVzdHVhbGUgaW4gYWx0byBhIGRlc3RyYSBnZW5lcmF0byBkYWxsJ0lucHV0ICoqQ29ybmVyTWVudU9wdGlvbnMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb3JuZXJpZCBDb2RpY2UgZGVsbCdvcGVyYXppb25lIHNlbGV6aW9uYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb3JuZXJBY3Rpb25DbGlja2VkKGNvcm5lcmlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uQ29ybmVyQWN0aW9uLmVtaXQoeyBpZDogY29ybmVyaWQsIGVzdGFibGU6IHRoaXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YXppb25lIG1vZGFsaXTDoCBkZWxsJ0VzVGFibGUgXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICd2aWV3JyB8ICdyZXBvcnQnfSBtb2RlIE1vZGFsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHByaXZhdGUgc2V0TW9kZShtb2RlOiAnYXJyYXknIHwgJ3ZpZXcnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9IG1vZGUgPT0gJ3ZpZXcnO1xyXG4gICAgICAgIHRoaXMuYXJyYXlNb2RlID0gbW9kZSA9PSAnYXJyYXknO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBlZmZldHR1YXJlIGNoaWFtYXRlIGludGVybmUgZGkgYWxsaW5lYW1lbnRvIGFsbGEgZnVuemlvbmUgKip3cml0ZVZhbHVlKiosIFxyXG4gICAgICogaW1wb3N0YW5kbyBwcmltYSAqKmludGVybmFsV3JpdGVDYWxsKiogaW4gbW9kbyBkYSBub24gZWZmZXR0dWFyZSBvcGVyYXppb25pIGludXRpbGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsV3JpdGVWYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmludGVybmFsV3JpdGVDYWxsID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIE1ldG9kbyBldmVudHVhbG1lbnRlIHJpY2hpYW1hYmlsZSBhbmNoZSBkYWwgY29tcG9uZW50ZSBlc3Rlcm5vIGNoZSBwZXJtZXR0ZSBkaSBmb3J6YXJlIHVuIHJlZnJlc2ggZGVsbGEgdGFiZWxsYSAqL1xyXG4gICAgcHVibGljIGZvcmNlUmVmcmVzaChyZWxhdW5jaFNlYXJjaDogYm9vbGVhbiA9IHRydWUpIHtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgVmlldyB2aWVuZSBtYW50ZW51dG8gaW4gYXV0b21hdGljbyBpbCBudW1lcm8gZGkgcGFnaW5hLCBtYSBwZXIgbGEgbW9kYWxpdMOgIGFycmF5IGRldm8gcHJlbmRlcmUgbGUgaW5mbyBkaSBwYWdpbmF6aW9uZSBwcmltYSBlIHJpYXBwbGljYXJsZSBkb3BvXHJcbiAgICAgICAgbGV0IGFycmF5UGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBhcnJheUlwcDogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBhcnJheVBhZ2UgPSB0aGlzLmFycmF5bW9kZVBhZ2U7XHJcbiAgICAgICAgICAgIGFycmF5SXBwID0gdGhpcy5BcnJheW1vZGVJdGVtc1BlclBhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighcmVsYXVuY2hTZWFyY2ggJiYgdGhpcy52aWV3TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5WaWV3LnNlbGZzZWFyY2ggPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5WaWV3KTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFycmF5bW9kZUl0ZW1zUGVyUGFnZSA9IGFycmF5SXBwO1xyXG4gICAgICAgICAgICB0aGlzLmFycmF5R29Ub1BhZ2UoYXJyYXlQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogSW1wb3N0YSBsYSB2aXNpYmlsaXTDoCBkaSB1biBoZWFkZXIgZSBkaSBldmVudHVhbGkgaGVhZGVyIGNvbGxlZ2F0aSBzZSBxdWVzdG8gaGVhZGVyIMOoIHVuIGdydXBwbywgZG9wb2RpY2jDqSBhZ2dpb3JuYSBsJ2VzLXRhYmxlIFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBPckhlYWRlciBIZWFkZXIgZGkgY3VpIHNldHRhcmUgbGEgdmlzaWJpbGl0w6BcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJpbGl0eSBWaXNpYmlsaXTDoCBkYSBpbXBvc3RhcmVcclxuICAgICAqKi9cclxuICAgIHB1YmxpYyBzZXRIZWFkZXJWaXNpYmlsaXR5KGdyb3VwT3JIZWFkZXI6IHN0cmluZywgdmlzaWJpbGl0eTogYm9vbGVhbiwgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUsIHJlbGF1bmNoU2VhcmNoOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGxldCBncm91cE9ySGVhZCA9IHRoaXMudGhzQ2FjaGVbZ3JvdXBPckhlYWRlcl07XHJcbiAgICAgICAgaWYgKCFncm91cE9ySGVhZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBncm91cE9ySGVhZC50aFZpc2libGUgPSB2aXNpYmlsaXR5O1xyXG5cclxuICAgICAgICBsZXQgdGhzQXJyID0gdGhpcy5Fc1Roc0RpcmVjdGl2ZS50b0FycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzQXJyW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ID09IGdyb3VwT3JIZWFkZXIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclZpc2liaWxpdHkodGgudGgsIHZpc2liaWxpdHksIGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZWZyZXNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXNlTG9jYWxWaXNpYmlsaXR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVJlZnJlc2gocmVsYXVuY2hTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBpbiBiYXNlIGFpIGNsaWNrIHN1IHVuYSBjZWxsYSBjYXBpc2NlIHNlIHN0byBlZmZldHR1YW5kbyB1bidvcGVyYXppb25lIGRpIHNlbGV6aW9uZSBvIHNlIHN0byBlbnRyYW5kbyBuZWxsJ2VkaXQgZGkgdW5hIGNlbGxhIGNvbiB1biBkb3BwaW8gY2xpY2tcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9ICRldmVudCBFdmVudG8gbmF0aXZvIGphdmFzY3JpcHRcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIFJpZmVyaW1lbnRvIGEgYmluZGVyIGRlbGxhIHJpZ2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIEl0ZW0gY2hlIHJhcHByZXNlbnRhIGlsIGNvbnRlc3RvIHN1IGN1aSDDqCBzdGF0byBlZmZldHR1YXRvIHVuIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkYkNsaWNrRWRpdE9yU2luZ2xlQ2xpY2tSb3dTZWxlY3Rpb24oJGV2ZW50OiBNb3VzZUV2ZW50LCByb3dJdGVtOiBUZEVsZW1lbnQsIGl0ZW06IGFueSkge1xyXG5cclxuICAgICAgICAvLyBQcmltYSBjb3NhIGRhIGZhcmUgw6ggY29udHJvbGxhcmUgc2UgY2kgc29ubyBkZWkgcmFuZ2UgbGFzY2lhdGkgZGEgb3BlcmF6aW9uaSBwcmVjZWRlbnRpIChzZSBhcHBsaWNhYmlsZSkgZSByaXB1bGlybGlcclxuICAgICAgICBpZiAodGhpcy5yYW5nZVNlbGVjdGVkICYmICEkZXZlbnQuY3RybEtleSAmJiB0aGlzLlNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJjbGVhcmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHJhbmdlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTW9kYWxpdMOgIEVkaXRhYmxlLCBnZXN0aXNjbyBpIGRvcHBpIGNsaWNrIHNlbnphIHBlcsOyIHJhbGxlbnRhcmUgbGEgbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBhIHJhbmdlXHJcbiAgICAgICAgaWYgKHRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgLy8gU2Vjb25kbyBjbGljazogc2UgaWwgdGltZXIgbm9uIMOoIHNjYWR1dG8gw6ggdW4gZG9wcGlvIGNsaWNrIGVkIGVzZWd1byBpbCByZXN0b1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxsRGJDbGlja1RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJoYW5kbGluZyBkb3VibGVjbGljayBvbiBlZGl0YWJsZSBjZWxsOiBcIiArIChyb3dJdGVtLlByb3BlcnR5TmFtZSA/ICdlZGl0IG1vZGUgZm9yIHByb3BlcnR5ICcgKyByb3dJdGVtLlByb3BlcnR5TmFtZSA6ICdubyBwcm9wZXJ0eSBzZXQsIGZhbGxiYWNrIHRvIHNpbXBsZSBjbGljaycpKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dJdGVtLlByb3BlcnR5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwVXNlckVkaXQocm93SXRlbSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRoaXMuU2VsZWN0aW9uLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsQ2xpY2tUaW1lcigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUHJpbW8gY2xpY2s6IG5vbiBmYSBuaWVudGUgZSBzZSBpbCB0ZW1wbyBwZXIgaWwgc2Vjb25kbyBjbGljayBzY2FkZSByZXNldHRhIHR1dHRvXHJcbiAgICAgICAgICAgIHRoaXMuY2VsbERiQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckNlbGxDbGlja1RpbWVyKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuUmFuZ2VTZWxlY3Rpb24gfHwgIXRoaXMubW91c2VJc0Rvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJ0aW1lJ3MgdXAgZm9yIHNlY29uZCBjbGljaywgaGFuZGxpbmcgc2luZ2xlIGNsaWNrXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUm93Q2xpY2soJGV2ZW50LCBpdGVtLCB0aGlzLlNlbGVjdGlvbiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIHRoaXMuZG91YmxlQ2xpY2tCdWZmZXJNcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbiBtb2RhbGl0w6AgYSByYW5nZSBsYSBjcmVhemlvbmUgZGVsIHJhbmdlIMOoIGdlc3RpdGEgZGFpIG1vdXNlZG93biwgbW92ZSBlZCB1cC4uLlxyXG4gICAgICAgIC8vIExhIHNlbGV6aW9uZSBkZWxsZSByaWdoZSBpbnZlY2Ugw6ggZ2VzdGl0YSBkYWxsZSBjYXNlbGxpbmUgYSBzaW5pc3RyYVxyXG4gICAgICAgIGlmICh0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFNlIGhvIGZhdHRvIGNsaWNrIGNvbCBjb250cm9sIGF0dGFjY2F0byBlc2NvIHN1Yml0byBkYXRvIGNoZSBkZXZlIHNvbG8gcGVybWV0dGVyZSBsYSBuYXZpZ2F6aW9uZSBkZWkgbGlua1xyXG4gICAgICAgIGlmICgkZXZlbnQuY3RybEtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFBlciBldml0YXJlIGRpIHJhbGxlbnRhcmUgYSBwcmVzY2luZGVyZVxyXG4gICAgICAgIGlmICghdGhpcy5FZGl0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJvd0NsaWNrKCRldmVudCwgaXRlbSwgdGhpcy5TZWxlY3Rpb24sIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJDb3BpYVwiIGJ1dHRhbmRvIGkgdmFsb3JpIHNlbGV6aW9uYXRpIG5lbGxhIGNsaXBib2FyZCBpbiBiYXNlIGFsIGxvcm8gdGlwbyAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb3B5KCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuc2VsZWN0aW9uX0guZ2V0U2VsZWN0aW9uU3RhdHVzU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbC5sZW5ndGggPiAwICYmIHNlbFswXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25UZXh0ID0gdGhpcy5zZWxlY3Rpb25fSC5nZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS5jb3B5VGV4dFRvQ2xpcGJvYXJkKHNlbGVjdGlvblRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlSW5mbyh0aGlzLmxjLmxvYyhcIlZhbHVlcyBjb3BpZWQgaW4gdGhlIGNsaXBib2FyZFwiKSwgXCJ0b2FzdHJcIiwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFdmVudG8gY2hlIGdlc3Rpc2NlIGlsIGNvbWFuZG8gXCJJbmNvbGxhXCIgcHJlbmRlbmRvIGkgZGF0aSBkZWxsYSBjbGlwYm9hcmQgZSBhcHBsaWNhbmRvbGkgYWwgcmFuZ2UgZGkgc2VsZXppb25lIGF0dHVhbGUgaW4gYmFzZSBhbCB0aXBvIGRlbGxlIGNlbGxlIHNvdHRvICovXHJcbiAgICBoYW5kbGVQYXN0ZSgpIHtcclxuICAgICAgICBpZighdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGxldCBzZWwgPSB0aGlzLnNlbGVjdGlvbl9ILmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwubGVuZ3RoID4gMCAmJiBzZWxbMF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZFNlcnZpY2UuZ2V0Q2xpcGJvYXJkKFwibWF0cml4XCIsICh2YWx1ZXM6IHN0cmluZ1tdW10pID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEZpeCBjbGlwYm9hcmQgc2VydmljZSBjaGUgcGFyZSB1biBwbycgc3Ryb256YSwgcmltdW92byBsJ3VsdGltbyBhcnJheSBzZSBtaSBhY2NvcmdvIGNoZSDDqCB1biBzaW5nb2xvIGFycmF5IGNvbiB1biBzb2xvIGVsZW1lbnRvIHZ1b3RvXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDAgJiYgdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXS5sZW5ndGggPT0gMSAmJiB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdWzBdID09ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCAmJiB2YWx1ZXNbMF0ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBzZSBsYSBtb2RpZmljYSDDqCBhYmlsaXRhdGFcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tc2dFeHRzLnNpbXBsZVdhcm5pbmcodGhpcy5sYy5sb2MoXCJEYXRhIGZvciB0aGlzIHRhYmxlIGNhbm5vdCBiZSBlZGl0ZWRcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbG8gY2hlIHF1ZWxsbyBjaGUgc3RvIGNvcGlhbmRvIHNpYSBkZWxsYSBzdGVzc2EgZGltZW5zaW9uZSBkZWxsYSBzZWxlemlvbmUgc3VsbCdlcy10YWJsZSwgdHJhbm5lIG5lbCBjYXNvIGhvIHVuIHNpbmdvbG8gdmFsb3JlIGRhIGNvcGlhcmVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHNlbC5sZW5ndGggIT0gdmFsdWVzLmxlbmd0aCB8fCBzZWxbMF0ubGVuZ3RoICE9IHZhbHVlc1swXS5sZW5ndGgpICYmICh2YWx1ZXMubGVuZ3RoICE9IDEgfHwgdmFsdWVzWzBdLmxlbmd0aCAhPSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ0V4dHMuc2ltcGxlV2FybmluZyh0aGlzLmxjLmxvYyhcIlNpemUgb2YgY29waWVkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpemUgb2YgdGhlIHNlbGVjdGlvblwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlIGxlIGRpbWVuc2lvbmkgY29pbmNpZG9ubyBjb3BpbyBkYSB1bmEgcGFydGUgYWxsJ2FsdHJhXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYW5nZXM6IEVzVGFibGVNb2RlbENoYW5nZVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2UgaG8gdW4gc2luZ29sbyB2YWxvcmUgbG8gYXBwbGljbyBhIHR1dHRhIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5sZW5ndGggPT0gMSA/IHZhbHVlc1swXVswXSA6IHZhbHVlc1tyXVtjXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZCA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbml1ID0gY2VsbC52YWxfc2V0dGVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkZGF0ZSA9IHRoaXMuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24ob2xkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuaXVkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbihuaXUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGNlbGwuaXRlbSwgY2VsbC5oZWFkZXIsIGNlbGwucHJvcGVydHksIG9sZCwgbml1KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KGNoYW5nZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpcHVsaXNjZSBpbCB0aW1lciB1dGlsaXp6YXRvIHBlciBjYXBpcmUgc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byB1biBkb3BwaW8gY2xpY2sgbyBtZW5vICovXHJcbiAgICBwcml2YXRlIGNsZWFyQ2VsbENsaWNrVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2VsbERiQ2xpY2tUaW1lcilcclxuICAgICAgICB0aGlzLmNlbGxEYkNsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlciBjbGljayBzaW5nb2xvIHN1IHVuYSByaWdhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSAkZXZlbnQgRXZlbnRvIG5hdGl2byBqYXZhc2NyaXB0XHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBJdGVtIGNoZSByYXBwcmVzZW50YSBpbCBjb250ZXN0byBzdSBjdWkgw6ggc3RhdG8gZWZmZXR0dWF0byB1biBjbGlja1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzZWxlY3Rpb24gSW5kaWNhIHNlIGxhIHNlbGV6aW9uZSDDqCBhdHRpdmFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZXJuYWxDYWxsIEluZGljYSBzZSBsYSBjaGlhbWF0YSBhIHF1ZXN0YSBmdW56aW9uZSDDqCBpbnRlcm5hOiBwZXJtZXR0ZSBkaSBza2lwcGFyZSBpIGNoZWNrIHN1bGxlIEN1c3RvbUNlbGxzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVSb3dDbGljaygkZXZlbnQ6IGFueSwgaXRlbTogYW55LCBzZWxlY3Rpb246IGJvb2xlYW4sIGludGVybmFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgLy8gU2UgaG8gdW4gY3RybCBwcmVtdXRvIGVzY28gY29uIHRydWUgaW4gbW9kbyBkYSBmYXJlIGJ1YmJsaW5nIGRlbGwnZXZlbnRvIGUgbGFzY2lhcmxvIGdlc3RpcmUgYWwgYnJvd3NlciAobGluayBlY2MuLi4pXHJcbiAgICAgICAgLy8gU3Rlc3NhIGNvc2Egc2UgaG8gY3VzdG9tIGNlbGwgZGF0byBjaGUgbGEgZ2VzdGlvbmUgZGVpIGNsaWNrIHZpZW5lIGFmZmlkYXRhIGFpIHNpbmdvbGkgVERcclxuICAgICAgICBpZiAoJGV2ZW50LmN0cmxLZXkgfHwgKHRoaXMuVXNlQ3VzdG9tQ2VsbHMgJiYgIWludGVybmFsQ2FsbCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFpdGVtLmxvY2tlZCAmJiAhaXRlbS5fc2VwICYmICFpdGVtLl9ncm91cClcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uX2dyb3VwKVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdyb3VwQ2xpY2soaXRlbSk7XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlc3Rpb25lIGRlbCBjbGljayBkZXN0cm8gc3VsbCdlcy10YWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SaWdodENsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgdGhpcy5vbk9wZW5Db250ZXh0TWVudS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYSBtb2RpZmljYSBkZWxsJ3V0ZW50ZSDDqCBpbml6aWF0YS4gU2kgaW1wb3N0YSBsYSB2YXJpYWJpbGUgcmVsYXRpdmEgYSBcInRydWVcIiBpbiBtb2RvIGRhIG1vc3RyYXJlIGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqIFxyXG4gICAgICogRG9wbyBjaGUgbCdpbnB1dCDDqCBhcHBhcnNvLCBkb3BvIHVuIGNpY2xvIGRpIENoYW5nZSBEZXRlY3Rpb24gdmllbmUgYXR0aXZhdG8gaWwgU3ViamVjdCBjb2xsZWdhdG8gYWxsJ2lucHV0IGNoZSBzZXJ2aXLDoCBhIGVmZmV0dHVhcmUgaWwgZm9jdXNcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtUZEVsZW1lbnR9IHJvd0l0ZW0gRWxlbWVudG8gZGkgcmlnYSBzdSBjdWkgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gc29wcmEgaWwgcXVhbGUgw6ggc3RhdGEgYXR0aXZhdGEgbGEgbW9kaWZpY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldHVwVXNlckVkaXQocm93SXRlbTogVGRFbGVtZW50LCBpdGVtOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILmNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKG51bGwpO1xyXG4gICAgICAgIGlmICh0aGlzLkVkaXRhYmxlICYmIHJvd0l0ZW0uUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgICAgIGxldCBkeW5Nb2RlID0gdGhpcy5EeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb24/Lmxlbmd0aCA+IDA7XHJcbiAgICAgICAgICAgICg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKDxhbnk+cm93SXRlbSkub2xkX3ZhbHVlID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5Gb2N1c1N1YmplY3QubmV4dCgpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExhIG1vZGlmaWNhIGRlbGwndXRlbnRlIMOoIHRlcm1pbmF0YS4gU2kgcmVpbXBvc3RhIGxhIHZhcmlhYmlsZSByZWxhdGl2YSBhIFwiZmFsc2VcIiBpbiBtb2RvIGRhIG5hc2NvbmRlcmUgbCdpbnB1dCBkaSB0ZXN0byBlIHNpIGVtZXR0ZSBsYSBtb2RpZmljYSBkZWwgdmFsb3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7VGRFbGVtZW50fSByb3dJdGVtIEVsZW1lbnRvIGRpIHJpZ2Egc3UgY3VpIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHNvcHJhIGlsIHF1YWxlIMOoIHN0YXRhIGF0dGl2YXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uSW5kZXggSW5kaWNlIGRlbGxhIGNvbG9ubmEgc3UgY3VpIMOoIGF2dmVudXRhIGxhIG1vZGlmaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5hbGl6ZVVzZXJFZGl0KHJvd0l0ZW06IFRkRWxlbWVudCwgaXRlbTogYW55LCBjb2x1bW5JbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGR5bk1vZGUgPSB0aGlzLkR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbj8ubGVuZ3RoID4gMDtcclxuICAgICAgICBsZXQgcm93SXRtID0gPGFueT5yb3dJdGVtO1xyXG4gICAgICAgIHJvd0l0bS5fZWRpdGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgb2xkID0gcm93SXRtLm9sZF92YWx1ZTtcclxuICAgICAgICBsZXQgbml1ID0gZHluTW9kZSA/IGl0ZW0ucHJvcGVydGllc1tyb3dJdGVtLlByb3BlcnR5TmFtZV0gOiBpdGVtW3Jvd0l0ZW0uUHJvcGVydHlOYW1lXTtcclxuXHJcbiAgICAgICAgbGV0IG9sZGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG9sZCk7XHJcbiAgICAgICAgbGV0IG5pdWRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKG5pdSk7XHJcbiAgICAgICAgaWYgKChvbGRkYXRlICYmIG5pdWRhdGUgJiYgb2xkZGF0ZS5pc1NhbWUgJiYgb2xkZGF0ZS5pc1NhbWUobml1ZGF0ZSkpIHx8IG9sZCA9PT0gbml1KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZS5lbWl0KFtuZXcgRXNUYWJsZU1vZGVsQ2hhbmdlKGl0ZW0sIHJvd0l0ZW0uSUQsIHJvd0l0ZW0uUHJvcGVydHlOYW1lLCBvbGQsIG5pdSldKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXVtjb2x1bW5JbmRleF0udmFsX3NldHRlcihuaXUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJhbmdlIHNlbGVjdGlvbiBFeHBlcmltZW50YWxzXHJcblxyXG4gICAgcHJpdmF0ZSBtb3VzZUlzRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSByYW5nZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHJhbmdlU3RhcnRXYXNJZ25vcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGZpcnN0Q29vcmRpbmF0ZXM6IHtyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9ID0gbnVsbDtcclxuXHJcbiAgICBtb3VzZWRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0l0ZW06IGFueSwgXzogYW55KSB7XHJcblxyXG4gICAgICAgIC8vIFRhc3RvIGRpdmVyc28gZGFsIGNsaWNrIHNpbmlzdHJvIC0+IGNpYW8gw6ggc3RhdG8gYmVsbG8gZSBpbnRlbnNvXHJcbiAgICAgICAgaWYoZXZlbnQuYnV0dG9ucyAhPSAxIHx8ICF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN0byBsYXZvcmFuZG8gc3UgUVVFU1RBIGVzLXRhYmxlXHJcbiAgICAgICAgdGhpcy5jb3B5UGFzdGVEZXRlY3Rvci5BY3RpdmVFc3RSZWZlcmVuY2UgPSB0aGlzO1xyXG5cclxuICAgICAgICAvLyBUdXR0aSBpIGNsaWNrIHN1IHVuYSBjZWxsYSBnacOgIGluIGVkaXQgbm9uIGRldm9ubyBlZmZldHR1YXJlIGxhIHNlbGV6aW9uZSBkZWxsYSByaWdhXHJcbiAgICAgICAgaWYgKCg8YW55PnJvd0l0ZW0pLl9lZGl0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29vcmRzID0gKDxIVE1MRWxlbWVudD5ldmVudC5jdXJyZW50VGFyZ2V0KS5pZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgICAgdGhpcy5maXJzdENvb3JkaW5hdGVzID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIC8vIFNlIGhvIGdpw6AgdW4gcmFuZ2UgZGkgc2VsZXppb25lIGlnbm9ybyB0ZW1wb3JhbmVtYWVudGUgcXVlc3RhIHNlbGV6aW9uZSBpbiBtb2RvIGRhIGNhcGlyZSBiZW5lIGNvc2EgZGV2byBmYXJlIGRvcG8gKGNsaWNrIHN1bGxhIHJpZ2EgLyBhbHRyYSBzZWxlemlvbmUpXHJcbiAgICAgICAgLy8gZSBnZXN0aXJlIGxhIGdyYWZpY2EgaW4gbWFuaWVyYSB1biBwbycgcGnDuSBwcmVjaXNhXHJcbiAgICAgICAgaWYgKCF0aGlzLnJhbmdlU2VsZWN0ZWQgfHwgKGV2ZW50LmN0cmxLZXkgfHwgIXRoaXMuU2VsZWN0aW9uKSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IGZhbHNlIH0sIHJvdywgY29sdW1uKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgZG93biBvbiAke3Jvd306JHtjb2x1bW59YCk7XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2VlbnRlcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmKCF0aGlzLlJhbmdlU2VsZWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXHJcbiAgICAgICAgICAgIHRoaXMubW91c2VJc0Rvd24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VJc0Rvd24gJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgICAgIGxldCBpZCA9ICg8SFRNTEVsZW1lbnQ+ZXZlbnQuY3VycmVudFRhcmdldCkuaWQ7XHJcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBsZXQgcm93ID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAyXSk7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICAgICAgLy8gU2UgaG8gaWdub3JhdG8gbCdpbml6aW8gZGVsbGEgc2VsZXppb25lIG5lbCBtb3VzZWRvd24gbG8gcmVjdXBlcm8gcXVpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgdGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdywgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlU3RhcnRXYXNJZ25vcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fSC5zaW5nbGVDZWxsU2VsZWN0aW9uKHsgdmlldzogZXZlbnQudmlldywgcmFuZ2U6IHRydWUgfSwgcm93LCBjb2x1bW4sIHRoaXMuZmlyc3RDb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhgbW91c2UgbW92ZSBvdmVyICR7cm93fToke2NvbHVtbn1gKTtcclxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbW91c2V1cChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5SYW5nZVNlbGVjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaWQgPSAoPEhUTUxFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQpLmlkO1xyXG4gICAgICAgIGxldCBjb29yZHMgPSBpZC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGxldCByb3cgPSBwYXJzZUludChjb29yZHNbY29vcmRzLmxlbmd0aCAtIDJdKTtcclxuICAgICAgICBsZXQgY29sdW1uID0gcGFyc2VJbnQoY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXSk7XHJcblxyXG4gICAgICAgIC8vIFNlIGlsIG1vdXNldXAgdmllbmUgZWZmZXR0dWF0byBzdWxsYSBzdGVzc2EgY2VsbGEgZGVsIHByaW1vIG1vdXNlZG93biBlIHNpYW1vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgZGVzZWxlemlvbm8gbGEgY2VsbGEgcGVyY2jDqSDDqCB1biBzZW1wbGljZSBjbGlja1xyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlSXNEb3duICYmIHRoaXMuZmlyc3RDb29yZGluYXRlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdENvb3JkaW5hdGVzLnJvdyA9PSByb3cgJiYgdGhpcy5maXJzdENvb3JkaW5hdGVzLmNvbHVtbiA9PSBjb2x1bW4gJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXRoaXMucmFuZ2VTdGFydFdhc0lnbm9yZWQgJiYgdGhpcy5TZWxlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9ILnNpbmdsZUNlbGxTZWxlY3Rpb24oeyB2aWV3OiBldmVudC52aWV3LCByYW5nZTogZmFsc2UgfSwgcm93LCBjb2x1bW4pO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChldmVudC5jdHJsS2V5IHx8ICF0aGlzLlNlbGVjdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlSXNEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGBtb3VzZSBsaWZ0ZWQgdXBgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyogUGlhbmdvXHJcbiAgICBwcml2YXRlIEVzVGRzQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBFc1RkIH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbFJlZmVyZW5jZShvYmplY3Q6IGFueSwgY29sdW1uOiBzdHJpbmcpOiBFc1RkIHtcclxuICAgICAgICBsZXQgZmtUaGlzU2hpdEltT3V0ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShvYmplY3QpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzX0guY2FsY3VsYXRlSGFzaChbZmtUaGlzU2hpdEltT3V0XSk7XHJcbiAgICAgICAgbGV0IHByb3AgPSBjb2x1bW47XHJcbiAgICAgICAgbGV0IGhhc2ggPSBma1RoaXNTaGl0SW1PdXQuX2hhc2g7XHJcblxyXG4gICAgICAgIGxldCB0b1JldCA9IHRoaXMuRXNUZHNDYWNoZVtgJHtwcm9wfV8ke2hhc2h9YF07XHJcbiAgICAgICAgcmV0dXJuIHRvUmV0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlckNlbGwoZXZlbnQ6IEVzVGRSZWZlcmVuY2UpIHtcclxuICAgICAgICB0aGlzLkVzVGRzQ2FjaGVbYCR7ZXZlbnQuaWR9XyR7ZXZlbnQuaGFzaH1gXSA9IGV2ZW50LnNlbGZcclxuICAgIH1cclxuICAgIC8vKiBQaWFuZ28gYW5jb3JhXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFc1RkUmVmZXJlbmNlIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBoYXNoOiBzdHJpbmc7IFxyXG4gICAgc2VsZjogRXNUZDtcclxufSIsIjwhLS0gUGF0YWNjaGlubyBkaSBhdXRvYWdnaW9ybmFtZW50byAtLT5cclxuPGRpdiBjbGFzcz1cInctMTAwXCIgKm5nSWY9XCJBdXRvVXBkYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgIHt7J1VwZGF0ZSBldmVyeScgfCBsb2NhbGl6ZSA6IGxjfX0mbmJzcDs8aW5wdXQgW3JlYWRvbmx5XT1cImF1dG9VcGRhdGVcIiBtYXhsZW5ndGg9XCIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZXN0LWN1c3RvbS1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzZWNvbmRzXCIgW25nTW9kZWxPcHRpb25zXT1cInsnc3RhbmRhbG9uZSc6IHRydWV9XCIgLz4mbmJzcDt7eydzZWNvbmQvcycgfCBsb2NhbGl6ZSA6IGxjfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHQgbS10LTJcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJlc3Qtc3dpdGNoXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImF1dG9VcGRhdGVcIiBbbmdNb2RlbE9wdGlvbnNdPVwieydzdGFuZGFsb25lJzogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJhdXRvVXBkYXRlQ2hhbmdlZCgpO1wiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3Qtc2xpZGVyIHJvdW5kXCI+PC9kaXY+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIlZpZXdcIiBjbGFzcz1cImVzdC1yZWxhdGl2ZVwiIFtzdHlsZS5oZWlnaHRdPVwiSGVpZ2h0XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiRW1wdHlTcGFjZUJhY2tncm91bmRDb2xvclwiPlxyXG4gICAgPGRpdiAqbmdJZj1cIkZpcnN0QmluZCAmJiBTaG93TG9hZGluZ09uQm9vdHN0cmFwXCIgY2xhc3M9XCJlc3QtbG9hZGluZy1ib3hcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXN0LWxvYWRpbmctY29udGVudFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvc3Bhbj4mbmJzcDt7eydQZXJmb3JtaW5nIFRhYmxlIGJvb3RzdHJhcCcgfCBsb2NhbGl6ZTogbGN9fS4uLlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImVzdC10b3AtcGFnZXJcIiAqbmdJZj1cIlBhZ2luZ1N0eWxlID09ICdib3RoJyB8fCBQYWdpbmdTdHlsZSA9PSAndG9wJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdFbGVtZW50XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZXN0LXRvcC1hbGxzZWxlY3RcIiAqbmdJZj1cImNhblNlbGVjdEFsbCB8fCAoVmlldz8uc2VsZWN0aW9uIHx8IGFycmF5bW9kZVNlbGVjdGlvbik/LmFsbFwiPlxyXG4gICAgICAgIDxzcGFuPnt7IChzZWxlY3RlZE9iamVjdHMgPT0gLTEgPyAoJ0FsbCB0aGUnIHwgbG9jYWxpemUgOiBsYykgOiAoKHNlbGVjdGVkT2JqZWN0cyB8fCAwKSB8IG51bWJlciA6ICcwLjAtMCcgOiBsYy5Mb2NhbGUpKSArICcgJyArICgoc2VsZWN0ZWRPYmplY3RzID09IDEgPyAnT2JqZWN0IFNlbGVjdGVkJyA6ICdPYmplY3RzIFNlbGVjdGVkJykgfCBsb2NhbGl6ZSA6IGxjKSB9fTwvc3Bhbj4mbmJzcDtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImVzdC1saW5rIGVzdC1pbmxpbmVcIiAoY2xpY2spPVwic2VsZWN0aW9uX0guc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpXCI+e3sgKFZpZXc/LnNlbGVjdGlvbiB8fCBhcnJheW1vZGVTZWxlY3Rpb24pPy5hbGwgPyAoJ1Jlc2V0IFNlbGVjdGlvbicgfCBsb2NhbGl6ZSA6IGxjKSA6ICgnU2VsZWN0IEV2ZXJ5dGhpbmcnIHwgbG9jYWxpemUgOiBsYyl9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIGRhdGF0YWJsZSBlc3QtZnVsbC1oZWlnaHQge3tDb250YWluZXJDbGFzc319XCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwiTWF4SGVpZ2h0XCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwie3sgVGFibGVDbGFzcyB9fSBlc3QtbWFyZ2luLWJvdHRvbS0xMCBlc3RcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlO1wiICBbY2xhc3MuZXN0LWhpZ2gtZGVuc2l0eV09XCJIaWdoQ2VsbERlbnNpdHlcIj5cclxuICAgICAgICAgICAgPHRoZWFkIFtoaWRkZW5dPVwiSGVhZGVySGlkZGVuIHx8IEZpcnN0QmluZFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBBZ2dpdW5nbyBpbCBwZXp6byBjaGUgZ2VzdGlzY2UgbGEgc2VsZXppb25lIGRpIHR1dHRvIHNlIGF0dGl2byBkYSBjb25maWcgLS0+XHJcbiAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCIoU2VsZWN0QWxsICYmICFTaW5nbGVTZWxlY3Rpb24pIHx8IFBhZ2luZ1N0eWxlICE9ICdib3R0b20nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZXN0LW5vLXNlbGVjdGlvblwiIFthdHRyLmNvbHNwYW5dPVwiQ29sdW1ucy5HbG9iYWxcIiBbY2xhc3MuZXN0LWhpZGRlbi12aWV3XT1cIiFjYW5TZWxlY3RBbGwgJiYgIShWaWV3Py5zZWxlY3Rpb24gfHwgYXJyYXltb2RlU2VsZWN0aW9uKT8uYWxsICYmIFBhZ2luZ1N0eWxlID09ICdib3R0b20nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZXN0LWhpZGRlbi12aWV3IGFwcC1tYXJnaW4tYm90dG9tLTBcIj7CpzwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBoZWFkZXIgZ3JvdXAgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUm93VGhHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGxldmVsIG9mIFJvd1RoR3JvdXBzOyB0cmFja0J5OiBJRFRyYWNrQnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjZWxsIG9mIGxldmVsOyB0cmFja0J5OiBJRFRyYWNrQnlcIiBbYXR0ci5jb2xzcGFuXT1cImNlbGwuU3BhblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LXBpbm5lZC1oZWFkZXJdPVwiY2VsbC5QaW5uZWRcIiBbY2xhc3MuZXN0LWNvbC1taW5dPVwiY2VsbC5QaW5uZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC1sdGFiLWJvcmRlcl09XCJjZWxsLkJvcmRlcnNcIiBbY2xhc3MuZXN0LXJ0YWItYm9yZGVyXT1cImNlbGwuQm9yZGVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVzdC10ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuUGlubmVkO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlciBlc3QtY2VsbC1ncm91cC1wYWRkaW5nXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5QaW5uZWQgJiYgY2VsbC5Db250ZW50OyBFbHNlOiBjZWxsLlRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjZWxsLkNvbnRlbnR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhUm93VGhHcm91cHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJIYXNIZWFkZXJHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyR3JvdXBSZWZcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiRXhwb3J0XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBoZWFkZXIgZ3JvdXAgc2Vjb25kYXJpbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJIYXNTZWNvbmRhcnlIZWFkZXJHcm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2Vjb25kYXJ5SGVhZGVyR3JvdXBSZWZcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiRXhwb3J0XCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCbG9jY28gZWZmZXR0aXZvIGRlZ2xpIGhlYWRlciAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGhlYWQtPnRyLT5kZWJ1Z19ibG9ja1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgd2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb246IHt7U2VsZWN0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgSGFzUGlubmVkQ29sdW1uczoge3tIYXNQaW5uZWRDb2x1bW5zfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlNb2RlOiB7e2FycmF5TW9kZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlOiB7e3ZpZXdNb2RlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlQ3VzdG9tQ2VsbHM6IHt7VXNlQ3VzdG9tQ2VsbHN9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSb3dUSHM6IHt7ISFSb3dUSHN9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSb3dUSHMubGVuZ3RoOiB7e1Jvd1RIcz8ubGVuZ3RofX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uOiB7eyEhRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9ufX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBZ2dpdW5nbyB1bmEgY2hlY2tib3ggc2UgbGEgc2VsZXppb25lIMOoIGF0dGl2YSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJlc3QtY29sLW1pblwiICpuZ0lmPVwiU2VsZWN0aW9uICYmICFIYXNQaW5uZWRDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFTaW5nbGVTZWxlY3Rpb25cIiBjbGFzcz1cImVzdC1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2Rpc2FibGVkXT1cIlNlbGVjdGlvbkRpc2FibGVkXCIgWyhuZ01vZGVsKV09XCJnbG9iYWxDaGVja1wiIFtuZ01vZGVsT3B0aW9uc109XCJ7J3N0YW5kYWxvbmUnOiB0cnVlfVwiIChuZ01vZGVsQ2hhbmdlKT1cImdsb2JhbENoZWNrQ2hhbmdlZCgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGNoZSB2YWxnb25vIHBlciB2aWV3IG1vZGUgZSBhcnJheSBtb2RlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcnJheU1vZGUgfHwgdmlld01vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJbiB1bmEgdGFiZWxsYSBiYXNlIHByZW5kbyBzZW1wbGljZW1lbnRlIGkgdGggc2NyaXR0aSBkYWxsJ3V0ZW50ZSBuZWxsJ0hUTUwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIVVzZUN1c3RvbUNlbGxzIHx8ICFSb3dUSHMgfHwgUm93VEhzLmxlbmd0aCA9PSAwKSAmJiAhRHluYW1pY1Jvd0NvbHVtbnNEZWZpbml0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyUmVmXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZSBobyB1biBtb2RlbGxvIGRpbmFtaWNvIGRlbGwnb2dnZXR0byBjcmVvIGxlIGNvbG9ubmUgaW4gYmFzZSBhbGxlIHByb3ByaWV0w6AgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIVVzZUN1c3RvbUNlbGxzIHx8ICFSb3dUSHMgfHwgUm93VEhzLmxlbmd0aCA9PSAwKSAmJiBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgb3BlcmF0aW9uIG9mIER5bmFtaWNPcGVyYXRpb25zOyB0cmFja0J5OiBpZFRyYWNrQnlcIiBjbGFzcz1cImVzdC1jb2wtbWluIGVzdC1uby1zaWRlLXBhZGRpbmdcIj48L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0hlYWRlciBvZiBEeW5hbWljUm93Q29sdW1uc0RlZmluaXRpb247IHRyYWNrQnk6IFByb3BlcnR5TmFtZVRyYWNrQnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93SGVhZGVyLlZpc2libGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiT3JkZXJCeUNvbHVtblwiICBpZD1cImVzdGhfe3tyb3dIZWFkZXIuUHJvcGVydHlOYW1lfX1cIiBlcy10aD1cInt7cm93SGVhZGVyLlByb3BlcnR5TmFtZX19XCIgY2xhc3M9XCJ7e1VzZXJEZWZpbmVkRHluYW1pY0NvbHMgPyAoKHJvd0hlYWRlci5DbHNzIHx8ICcnKSArIChyb3dIZWFkZXIuSGVhZGVyV3JhcHMgPyAnJyA6ICcgZXN0LW5vd3JhcCcpKSA6ICcgZXN0LW5vd3JhcCd9fVwiIFtPcmRlcl09XCJyb3dIZWFkZXIuRGF0YU9yZGVyXCIgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCIgW09yZGVyYWJsZV09XCJyb3dIZWFkZXIuT3JkZXJhYmxlXCIgW09yZGVyQnldPVwiT3JkZXJCeUNvbHVtblwiIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCIgKG9uT3JkZXJDaGFuZ2UpPVwidGhPcmRlckNoYW5nZWQocm93SGVhZGVyLlByb3BlcnR5TmFtZSwgJGV2ZW50KVwiPnt7cm93SGVhZGVyLkRlc2NyaXB0aW9ufX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhT3JkZXJCeUNvbHVtblwiIGlkPVwiZXN0aF97e3Jvd0hlYWRlci5Qcm9wZXJ0eU5hbWV9fVwiIGVzLXRoPVwie3tyb3dIZWFkZXIuUHJvcGVydHlOYW1lfX1cIiBjbGFzcz1cInt7VXNlckRlZmluZWREeW5hbWljQ29scyA/ICgocm93SGVhZGVyLkNsc3MgfHwgJycpICsgKHJvd0hlYWRlci5IZWFkZXJXcmFwcyA/ICcnIDogJyBlc3Qtbm93cmFwJykpIDogJyBlc3Qtbm93cmFwJ319XCIgW09yZGVyXT1cInJvd0hlYWRlci5EYXRhT3JkZXJcIiBbUmVzaXphYmxlXT1cIkNvbHVtbnNSZXNpemFibGVcIiBbT3JkZXJhYmxlXT1cInJvd0hlYWRlci5PcmRlcmFibGVcIiBbT3JkZXJCeV09XCJPcmRlckJ5Q29sdW1uXCI+e3tyb3dIZWFkZXIuRGVzY3JpcHRpb259fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlIG5vbiBobyB1biBtb2RlbGxvIGRpbmFtaWNvIG1hIGludmVjZSBkZWxsZSBjZWxsZSBjdXN0b20sIGdlbmVybyBnbGkgaGVhZGVyIGluIGJhc2UgYWkgcm93IHRoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiVXNlQ3VzdG9tQ2VsbHMgJiYgUm93VEhzPy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJIYXNQaW5uZWRDb2x1bW5zXCIgY2xhc3M9XCJlc3QtcGlubmVkLWhlYWRlciBlc3QtY29sLW1pblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlciBlc3Qtc2ltcGxlLWJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiZXN0LWNvbC1taW4gZXN0LW5vLWJvcmRlclwiICpuZ0lmPVwiU2VsZWN0aW9uXCIgW3N0eWxlLndpZHRoLnB4XT1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhU2luZ2xlU2VsZWN0aW9uXCIgY2xhc3M9XCJlc3QtcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCJTZWxlY3Rpb25EaXNhYmxlZFwiIFsobmdNb2RlbCldPVwiZ2xvYmFsQ2hlY2tcIiBbbmdNb2RlbE9wdGlvbnNdPVwieydzdGFuZGFsb25lJzogdHJ1ZX1cIiAobmdNb2RlbENoYW5nZSk9XCJnbG9iYWxDaGVja0NoYW5nZWQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93SGVhZGVyIG9mIFJvd1RIczsgdHJhY2tCeTogSURUcmFja0J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJyb3dIZWFkZXIgJiYgcm93SGVhZGVyLlZpc2libGUgJiYgcm93SGVhZGVyLlBpbm5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInJvd0hlYWRlci5QaW5uZWRXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXMtdGg9XCJ7e3Jvd0hlYWRlci5JRH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7cm93SGVhZGVyLkNsYXNzIHx8ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5lc3QtcGlubmVkLWludGVybmFsLWhlYWRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vLWJvcmRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vd3JhcF09XCIhcm93SGVhZGVyLldyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQaW5uZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZpeGVkXT1cInJvd0hlYWRlci5GaXhlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyXT1cInJvd0hlYWRlci5PcmRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT3JkZXJhYmxlXT1cInJvd0hlYWRlci5PcmRlcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPcmRlckJ5XT1cIk9yZGVyQnlDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25VbnBpbm5pbmcpPVwiY29sdW1uTWV0YWRhdGFfSC51bnBpbkNvbHVtbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25PcmRlckNoYW5nZSk9XCJ0aE9yZGVyQ2hhbmdlZChyb3dIZWFkZXIuSUQsICRldmVudClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0hlYWRlci5UZW1wbGF0ZVwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dIZWFkZXIuVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3dIZWFkZXIuTXVsdGkgPyByb3dIZWFkZXIuTXVsdGlDb250ZW50IDogbnVsbCB9IFwiPjwvbmctY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvd0hlYWRlci5UZW1wbGF0ZVwiPnt7cm93SGVhZGVyLkNvbnRlbnR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvd0hlYWRlciBvZiBSb3dUSHM7IHRyYWNrQnk6IElEVHJhY2tCeVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwidGhlYWQtPnRyLT50aC0+ZGVidWdfYmxvY2tcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyOiB7eyEhcm93SGVhZGVyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyLlZpc2libGU6IHt7cm93SGVhZGVyPy5WaXNpYmxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SGVhZGVyLlBpbm5lZDoge3tyb3dIZWFkZXI/LlBpbm5lZH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0hlYWRlci5UZW1wbGF0ZToge3shIXJvd0hlYWRlci5UZW1wbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInJvd0hlYWRlciAmJiByb3dIZWFkZXIuVmlzaWJsZSAmJiAhcm93SGVhZGVyLlBpbm5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzLXRoPVwie3tyb3dIZWFkZXIuSUR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tyb3dIZWFkZXIuQ2xhc3MgfHwgJyd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cIiByb3dIZWFkZXIuQWxpZ25tZW50IHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LWx0YWItYm9yZGVyXT1cInJvd0hlYWRlci5MZWZ0Qm9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmVzdC1ydGFiLWJvcmRlcl09XCJyb3dIZWFkZXIuUmlnaHRCb3JkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vd3JhcF09XCIhcm93SGVhZGVyLldyYXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT3JkZXJdPVwicm93SGVhZGVyLk9yZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Jlc2l6YWJsZV09XCJDb2x1bW5zUmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyYWJsZV09XCJyb3dIZWFkZXIuT3JkZXJhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW09yZGVyQnldPVwiT3JkZXJCeUNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZWFyY2hJblByb2dyZXNzXT1cIiEhcmVzZWFyY2hJblByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uT3JkZXJDaGFuZ2UpPVwidGhPcmRlckNoYW5nZWQocm93SGVhZGVyLklELCAkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93SGVhZGVyLlRlbXBsYXRlXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0hlYWRlci5UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvd0hlYWRlci5NdWx0aSA/IHJvd0hlYWRlci5NdWx0aUNvbnRlbnQgOiBudWxsIH1cIj48L25nLWNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93SGVhZGVyLlRlbXBsYXRlXCI+e3tyb3dIZWFkZXIuQ29udGVudH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1QZXIgbCdlbGltaW5hemlvbmUgbWkgc2VydmUgdW4gaGVhZGVyIGFnZ2l1bnRpdm8tLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJSZW1vdmFsXCIgW2NsYXNzLmVzdC1yaWdodC05XT1cIkV4cG9ydCB8fCBIaWRkZW5Db2x1bW5zXCIgY2xhc3M9XCJlc3QtY29sLW1pbiBlc3Qtc3RpY2t5LWxhc3QtY29sdW1uXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvc3Bhbj48L3RoPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tUGVyIGwnZXNwb3J0YXppb25lIG1pIHNlcnZlIGwnaGVhZGVyIGV4dHJhIGRhIGN1aSBmYWNjaW8gdXNjaXJlIGkgMyBwYWxsb2NjaGktLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb2x1bW5zT3JkZXJpbmcgfHwgQ29ybmVyTWVudU9wdGlvbnNcIiBjbGFzcz1cImVzdC10YWJsZS1kb3R0ZWQtbWVudSBlc3Qtc3RpY2t5LWxhc3QtY29sdW1uIGVzdC1jb2wtbWluIHRleHQtc20tY2VudGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJsb2NjbyBjb24gaSAzIHBhbGxvY2NoaSBjaGUgdGlyYSBmdW9yaSBpbCBjb250ZXh0IG1lbnUgZGVsbGUgb3BlcmF6aW9uaSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIGNvbnRhaW5lcj1cImJvZHlcIiBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIiBkcm9wZG93biAjZHJvcGRvd249XCJicy1kcm9wZG93blwiIFthdXRvQ2xvc2VdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZHJvcGRvd25Ub2dnbGUgY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12IGVzdC1mcy0xOCBlc3QtcG9pbnRlciBlc3QtcGFkZGluZy0zXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKmRyb3Bkb3duTWVudSBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodCBlc3QtYnJpbmctdG8tZnJvbnQtc3Ryb25nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0lmPVwiSGlkZGVuQ29sdW1ucyB8fCBDb2x1bW5zT3JkZXJpbmdcIiAoY2xpY2spPVwiY29sdW1uTWV0YWRhdGFfSC5yZXNldENvbHVtblZpc1NlbGVjdGlvbigpOyBjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWwuc2hvdygpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NvbHVtbnMgT3JkZXInIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmICFDb2x1bW5zT3JkZXJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDb2x1bW5zIFZpc2liaWxpdHknIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0NvbHVtbnMgVmlzaWJpbGl0eSBhbmQgT3JkZXInIHwgbG9jYWxpemUgOiBsY319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAqbmdJZj1cIkV4cG9ydCAmJiBDU1ZFeHBvcnRcIiAoY2xpY2spPVwiZXhwb3J0X0gudHJ5RXhwb3J0KCdDU1YnKVwiPnt7J0V4cG9ydCBWaWV3JyB8IGxvY2FsaXplIDogbGN9fSAoQ1NWKTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKm5nSWY9XCJFeHBvcnQgJiYgWExTWEV4cG9ydFwiIChjbGljayk9XCJleHBvcnRfSC50cnlFeHBvcnQoJ1hMU1gnKVwiPnt7J0V4cG9ydCBWaWV3JyB8IGxvY2FsaXplIDogbGN9fSAoWExTWCk8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgQ29ybmVyTWVudU9wdGlvbnM7IHRyYWNrQnk6IGlkVHJhY2tCeVwiIChjbGljayk9XCJjb3JuZXJBY3Rpb25DbGlja2VkKG9wdGlvbi5pZClcIj57e29wdGlvbi5kZXNjcmlwdGlvbn19PC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICAgICAgPHRib2R5IFtoaWRkZW5dPVwiQm9keUhpZGRlbiB8fCBGaXJzdEJpbmRcIiBbY2xhc3MuZXN0LW5vLXNlbGVjdGlvbl09XCJSYW5nZVNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLUNvbiBzZWxlY3Rpb24gYXR0aXZhIHJpY2hpYW1vIGlsIHRlbXBsYXRlIGNoZSBnZXN0aXNjZSBpbCBjb250ZXh0IG1lbnUtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVEJvZHlTZWxlY3Rpb247IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IHNlbERpc2FibGVkOiBhcnJheU1vZGUgPyBmYWxzZSA6IFNlbGVjdGlvbkRpc2FibGVkLCBzZWw6IFNlbGVjdGlvbiB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLVNlbnphIHNlbGVjdGlvbiByaWNoaWFtbyBpbCB0ZW1wbGF0ZSBjaGUgTk9OIGdlc3Rpc2NlIGlsIGNvbnRleHQgbWVudS0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiVEJvZHlcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiUGFnaW5nU3R5bGUgPT0gJ2JvdGgnIHx8IFBhZ2luZ1N0eWxlID09ICdib3R0b20nXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luZ0VsZW1lbnRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGVtcGxhdGUgY2hlIGNvbnRpZW5lIHR1dHRlIGxlIGluZm8gZGkgcGFnaW5hemlvbmUgaW4gbW9kbyBkYSBwb3RlcmxvIHJlcGxpY2FyZSBhbmNoZSBzb3ByYSAtLT5cclxuPG5nLXRlbXBsYXRlICNwYWdpbmdFbGVtZW50PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFGaXJzdEJpbmRcIj5cclxuICAgICAgICA8IS0tIFB1bHNhbnRpIGF2YW50aS1pbmRpZXRybyBkaSBwYWdpbmF6aW9uZSAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiUGFnZXJPcHRpb25zLlNob3dQYWdpbmcgJiYgUGFnZXJPcHRpb25zLlNob3dCdXR0b25zICYmIChQYWdlck9wdGlvbnMuUGFnZXJDb3VudCA+IDEwIHx8IFBhZ2VyT3B0aW9ucy5QYWdlckNvdW50ID09IC0xKVwiIGNsYXNzPVwicHVsbC1yaWdodCBidG4tdG9vbGJhclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUGFnZXJPcHRpb25zLlZpZXc/LnBhZ2luZ2F2YWlsYWJsZSB8fCB2aWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luZ0J1dHRvbnM7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IE1hcmdpbjogdHJ1ZSwgQVRQOiBhZGRUb1BhZ2UuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZS5iaW5kKHRoaXMpLCBBcnJheTogYXJyYXlQdWxzYW50aSB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFycmF5TW9kZSAmJiBVc2VBcnJheU1vZGVQYWdpbmcgJiYgIVNlYXJjaFZpZXdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBNYXJnaW46IHRydWUsIEFUUDogYXJyYXlBZGRUb1BhZ2UuYmluZCh0aGlzKSwgR1RQOiBhcnJheUdvVG9QYWdlLmJpbmQodGhpcyksIEFycmF5OiBhcnJheVB1bHNhbnRpIH19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gUGFnaW5hdG9yZSBkb3ZlIGFwcGFyZSBsYSBjb3VudCBlIGxlIG9wemlvbmkgZGkgcGFnaW5hemlvbmUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5TaG93Q291bnQgfHwgUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtbXQtbWluLTVcIiAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5TaG93UGFnaW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXBhZ2luZyAqbmdJZj1cIiFQYWdlck9wdGlvbnMuVXNlc1ZpZXdcIiBbQ291bnRMYWJlbF09XCJDb3VudExhYmVsXCIgW1Nob3dQYWdpbmddPVwiUGFnZXJPcHRpb25zLlNob3dQYWdpbmdPcHRpb25zXCIgW1Nob3dDb3VudF09XCJQYWdlck9wdGlvbnMuU2hvd0NvdW50XCIgW1BhZ2VyQ291bnRdPVwiUGFnZXJPcHRpb25zLlBhZ2VyQ291bnRcIiBbV2Fybk9uQWxsXT1cImZhbHNlXCIgW0N1cnJlbnRQYWdlU2l6ZV09XCJBcnJheW1vZGVJdGVtc1BlclBhZ2VcIiAocGFnaW5nU2VsZWN0ZWQpPVwiaXRlbXNfSC5yZWZyZXNoUGFnaW5nKCRldmVudClcIj48L2FwcC1wYWdpbmc+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXBhZ2luZyAqbmdJZj1cIlBhZ2VyT3B0aW9ucy5Vc2VzVmlld1wiIFtDb3VudExhYmVsXT1cIkNvdW50TGFiZWxcIiBbU2hvd1BhZ2luZ109XCJQYWdlck9wdGlvbnMuU2hvd1BhZ2luZ09wdGlvbnNcIiBbU2hvd0NvdW50XT1cIlBhZ2VyT3B0aW9ucy5TaG93Q291bnRcIiBbUGFnZXJDb3VudF09XCJQYWdlck9wdGlvbnMuUGFnZXJDb3VudFwiIFtHcm91cE1vZGVdPVwiUGFnZXJPcHRpb25zLlNlYXJjaGVzID09ICdncm91cHMnXCIgW0FsbFNlYXJjaF09XCJBbGxTZWFyY2hcIiBbVmlld109XCJQYWdlck9wdGlvbnMuVmlld1wiIChwYWdpbmdTZWxlY3RlZCk9XCJvbkl0ZW1zUGVyUGFnZUNoYW5nZWQoJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFRlbXBsYXRlIGNoZSBjb250aWVuZSBpIHB1bHNhbnRpIHBlciBjYW1iaWFyZSBwYWdpbmEgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjcGFnaW5nQnV0dG9ucyBsZXQtb3B0aW9ucz5cclxuICAgIDxkaXYgY2xhc3M9XCJlc3QtZmxleFwiIFtjbGFzcy5lc3QtbWFyZ2luLWxlZnQtNTBdPVwib3B0aW9ucy5NYXJnaW5cIj5cclxuICAgICAgICA8YSBjbGFzcz1cImJ0blwiIGNsYXNzPVwiZXN0LXBhZ2UtcHJldiBhcHAtcG9pbnRlclwiIChjbGljayk9XCJvcHRpb25zLkFUUCgtMSwgb3B0aW9ucy5zZXBhcmF0b3IpXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L3NwYW4+PC9hPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFycmF5XCIgY2xhc3M9XCJlc3QtaW5saW5lXCI+PGEgKm5nRm9yPVwibGV0IHAgb2Ygb3B0aW9ucy5BcnJheTsgdHJhY2tCeTogdmFsVHJhY2tCeVwiIGNsYXNzPVwiYnRuIGVzdC1wYWdlLXNlbCB7e3AuY3NzQ2xhc3N9fVwiIChjbGljayk9XCJvcHRpb25zLkdUUChwLnZhbCwgb3B0aW9ucy5zZXBhcmF0b3IpXCI+e3twLnZhbH19PC9hPjwvZGl2PlxyXG4gICAgICAgIDxhIGNsYXNzPVwiYnRuXCIgY2xhc3M9XCJlc3QtcGFnZS1uZXh0IGFwcC1wb2ludGVyXCIgKGNsaWNrKT1cIm9wdGlvbnMuQVRQKDEsIG9wdGlvbnMuc2VwYXJhdG9yKVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvc3Bhbj48L2E+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gUXVlc3RpIGR1ZSB0ZW1wbGF0ZSByYXBwcmVzZW50YW5vIGVmZmV0dGl2YW1lbnRlIGlsIGJvZHkgZGVsbGEgdGFiZWxsYS4gZXNzZW5kbyBpbCB0ciBsJ3VuaWNhIGNvc2EgY2hlIGRhdnZlcm8gY2FtYmlhLCBpbCByZXN0byDDqCB0ZW1wbGF0aXp6YXRvIC0tPlxyXG48bmctdGVtcGxhdGUgI1RCb2R5U2VsZWN0aW9uIGxldC10ZW1wbGF0ZU9wdGlvbnM+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJvdW5kU291cmNlOyBsZXQgZXZlbiA9IGV2ZW47IGxldCBpPWluZGV4OyB0cmFja0J5OiBib2R5VHJhY2tCeVwiPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cIml0ZW0uX3Zpc2libGUgfHwgKCFIaWVyYXJjaHkgJiYgIUFycmF5R3JvdXBpbmcpXCJcclxuICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0uX3Jvd0NsYXNzID8gaXRlbS5fcm93Q2xhc3MgOiAnJ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5lc3QtbGluZS10aHJvdWdoXT1cIml0ZW0ucmVtb3ZlZCB8fCBpdGVtLmRlbGV0ZWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LXBvaW50ZXJdPVwiIWl0ZW0ubG9ja2VkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC13aGl0ZS1zZWxlY3RlZF09XCJpdGVtLl9zZWxlY3RlZCAmJiAhaXRlbS5sb2NrZWRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LXJnXT1cIml0ZW0uX2dyb3VwXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC1yZy1zZXBdPVwiaXRlbS5fc2VwXCJcclxuICAgICAgICAgICAgW2NvbnRleHRNZW51XT1cIiFpdGVtLmxvY2tlZCA/IChDb250ZXh0TWVudSB8fCBlbXB0eU1lbnUpIDogZW1wdHlNZW51XCIgW2NvbnRleHRNZW51U3ViamVjdF09XCJpdGVtXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIiFSYW5nZVNlbGVjdGlvbiAmJiBoYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIHRydWUpXCJcclxuICAgICAgICAgICAgKGNvbnRleHRtZW51KT1cIm9uUmlnaHRDbGljaygpO1wiPlxyXG5cclxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWl0ZW0ubG9ja2VkICYmICFpdGVtLl9zZXAgJiYgIUhhc1Bpbm5lZENvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRlbXBsYXRlT3B0aW9ucy5zZWxEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5lc3QtcG9pbnRlcl09XCIhaXRlbS5sb2NrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uX3NlbGVjdGVkXCIgbmFtZT1cImNoZWNre3tpfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBoYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0pO1wiPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCIoaXRlbS5sb2NrZWQgfHwgaXRlbS5fc2VwKSAmJiAhSGFzUGlubmVkQ29sdW1uc1wiPjwvdGQ+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5fc2VwXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyb3VwUGFnZXI7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj4gPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uX3NlcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2ljQ29sdW1uczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21DZWxsczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpLCB0ZW1wbGF0ZU9wdGlvbnM6IHRlbXBsYXRlT3B0aW9ucyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keURlbGV0ZUFuZEV4cG9ydDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZXZlbjogZXZlbiwgaXRlbTogaXRlbSwgaW5kZXg6IGkgfX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI1RCb2R5PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBib3VuZFNvdXJjZTsgbGV0IGkgPSBpbmRleCwgbGV0IGV2ZW4gPSBldmVuOyB0cmFja0J5OiBib2R5VHJhY2tCeVwiPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cIml0ZW0uX3Zpc2libGUgfHwgIUhpZXJhcmNoeVwiXHJcbiAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLl9yb3dDbGFzcyA/IGl0ZW0uX3Jvd0NsYXNzIDogJydcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZXN0LWxpbmUtdGhyb3VnaF09XCJpdGVtLnJlbW92ZWQgfHwgaXRlbS5kZWxldGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmVzdC1yZ109XCJpdGVtLl9ncm91cFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5lc3Qtcmctc2VwXT1cIml0ZW0uX3NlcFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVSb3dDbGljaygkZXZlbnQsIGl0ZW0sIGZhbHNlKVwiPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uX3NlcFwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cFBhZ2VyOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uX3NlcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2ljQ29sdW1uczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21DZWxsczsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5RGVsZXRlQW5kRXhwb3J0OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBldmVuOiBldmVuLCBpdGVtOiBpdGVtLCBpbmRleDogaSB9fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZ3JvdXBQYWdlciBsZXQtaXRlbT5cclxuICAgIDx0ZCBjbGFzcz1cImVzdC1waW5uZWQtYm9keSBcIiAqbmdJZj1cIkhhc1Bpbm5lZENvbHVtbnNcIj5cclxuICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aC5weF09XCJQaW5uZWRDb250YWluZXJXaWR0aFwiIGNsYXNzPVwiZXN0LXBpbm5lZC1ib3JkZXIgZXN0LWNlbGwtZ3JvdXAtcGFkZGluZ1wiPjwvZGl2PlxyXG4gICAgPC90ZD5cclxuICAgIDx0ZCAqbmdJZj1cIml0ZW0uX2dyb3VwbGV2ZWwgPiAxXCIgW2F0dHIuY29sc3Bhbl09XCJpdGVtLl9ncm91cGxldmVsLTFcIj48L3RkPlxyXG4gICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiQ29sdW1ucy5WaXNpYmxlVW5waW5uZWQgLSAoaXRlbS5fZ3JvdXBsZXZlbCA+IDAgPyBpdGVtLl9ncm91cGxldmVsIC0gMSA6IDApXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1zZXAtZmxleC1yaWdodFwiICpuZ0lmPVwiUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9PSAncmlnaHQnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtcmctcGFnZVwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBzZXBhcmF0b3I6IGl0ZW0sIEFUUDogYWRkVG9QYWdlR3JvdXAuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZUdyb3VwLmJpbmQodGhpcyksIEFycmF5OiBpdGVtLmJ1dHRvbnMgfX1cIj48L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1pcHBcIiAqbmdJZj1cIihpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnQpID4gMTBcIj48YXBwLXBhZ2luZyBbQ291bnRMYWJlbF09XCJDb3VudExhYmVsXCIgW0FsbFNlYXJjaF09XCJBbGxTZWFyY2hcIiBbR3JvdXBNb2RlXT1cIml0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcydcIiBbUGFnZXJDb3VudF09XCJpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnRcIiBbVmlld109XCJpdGVtLnZpZXdcIiAocGFnaW5nU2VsZWN0ZWQpPVwib25Hcm91cEl0ZW1zUGVyUGFnZUNoYW5nZWQoaXRlbSwgJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlc3Qtcmctc2VwLWZsZXgtbGVmdFwiICpuZ0lmPVwiUm93R3JvdXBpbmdQYWdpbmdTdHlsZSA9PSAnbGVmdCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVzdC1yZy1pcHBcIj48YXBwLXBhZ2luZyBbQWxsU2VhcmNoXT1cIkFsbFNlYXJjaFwiIFtDb3VudExhYmVsXT1cIkNvdW50TGFiZWxcIiBbR3JvdXBNb2RlXT1cIml0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcydcIiBbUGFnZXJDb3VudF09XCJpdGVtLnNlYXJjaGVzID09ICdncm91cHMnID8gaXRlbS52aWV3Lmdyb3VwY291bnQgOiBpdGVtLnZpZXcub2JqZWN0Y291bnRcIiBbVmlld109XCJpdGVtLnZpZXdcIiAocGFnaW5nU2VsZWN0ZWQpPVwib25Hcm91cEl0ZW1zUGVyUGFnZUNoYW5nZWQoaXRlbSwgJGV2ZW50KTtcIj48L2FwcC1wYWdpbmc+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlc3QtcmctcGFnZVwiICpuZ0lmPVwiKGl0ZW0uc2VhcmNoZXMgPT0gJ2dyb3VwcycgPyBpdGVtLnZpZXcuZ3JvdXBjb3VudCA6IGl0ZW0udmlldy5vYmplY3Rjb3VudCkgPiAxMFwiPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdpbmdCdXR0b25zOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBzZXBhcmF0b3I6IGl0ZW0sIEFUUDogYWRkVG9QYWdlR3JvdXAuYmluZCh0aGlzKSwgR1RQOiBnb1RvUGFnZUdyb3VwLmJpbmQodGhpcyksIEFycmF5OiBpdGVtLmJ1dHRvbnMgfX1cIj48L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFF1ZXN0byB0ZW1wbGF0ZSBjb250aWVuZSBsYSBwcmludCBjb25kaXppb25hbGUgc3UgdGFiZWxsZSBzZW1wbGljaSwgY29uIGhlYWRlciBlIGJvZHkgc2NyaXR0aSBhIG1hbmF6emEgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjYmFzaWNDb2x1bW5zIGxldC1pdGVtIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFVc2VDdXN0b21DZWxscyB8fCBFbXB0eVJvd1RkcykgJiYgIUR5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvblwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJib2R5UmVmOyBjb250ZXh0IDogeyRpbXBsaWNpdDogaXRlbSwgaW5kZXg6IGluZGV4fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFZGl0b3IgbGV0LWN0eD5cclxuICAgIDwhLS0gVW4gcG8nIHRyaXN0ZSBtYSBxdWVzdG8gw6ggaWwgbWV0b2RvIHBpw7kgc2VtcGxpY2UgcGVyIGdlc3RpcmUgaWwgY2FtYmlvIGRpIG1vZGVsbG8gLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3R4Lml0ZW0ucHJvcGVydGllc1wiPlxyXG4gICAgICAgIDxmb3JtLWFkYXB0aXZlIFtGb3JtTGF5b3V0XT1cImZhbHNlXCIgW1ZhbGlkYXRpb25dPVwiZmFsc2VcIiBbT3B0aW9uc109XCJjdHguZGVmaW5pdGlvbi5FZGl0b3JPcHRpb25zXCIgW0ZvY3VzU3ViamVjdF09XCJGb2N1c1N1YmplY3RcIiBbKG5nTW9kZWwpXT1cImN0eC5pdGVtLnByb3BlcnRpZXNbY3R4LmRlZmluaXRpb24uUHJvcGVydHlOYW1lXVwiIG5hbWU9XCJ7eyBjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eU5hbWUgKyAnXycgKyBjdHguaXRlbS5faGFzaCB9fVwiIFtUeXBlXT1cImN0eC5kZWZpbml0aW9uLlByb3BlcnR5VHlwZVwiIFtTb3VyY2VdPVwiY3R4LmRlZmluaXRpb24uUHJvcGVydHlTb3VyY2VcIiAoaW5wdXRGaW5hbGl6ZWQpPVwiY3R4LmZpbmFsaXplcigpXCI+PC9mb3JtLWFkYXB0aXZlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN0eC5pdGVtLnByb3BlcnRpZXNcIj5cclxuICAgICAgICA8Zm9ybS1hZGFwdGl2ZSBbRm9ybUxheW91dF09XCJmYWxzZVwiIFtWYWxpZGF0aW9uXT1cImZhbHNlXCIgW09wdGlvbnNdPVwiY3R4LmRlZmluaXRpb24uRWRpdG9yT3B0aW9uc1wiIFtGb2N1c1N1YmplY3RdPVwiRm9jdXNTdWJqZWN0XCIgWyhuZ01vZGVsKV09XCJjdHguaXRlbVtjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eU5hbWVdXCIgbmFtZT1cInt7IGN0eC5kZWZpbml0aW9uLlByb3BlcnR5TmFtZSArICdfJyArIGN0eC5pdGVtLl9oYXNoIH19XCIgW1R5cGVdPVwiY3R4LmRlZmluaXRpb24uUHJvcGVydHlUeXBlXCIgW1NvdXJjZV09XCJjdHguZGVmaW5pdGlvbi5Qcm9wZXJ0eVNvdXJjZVwiIChpbnB1dEZpbmFsaXplZCk9XCJjdHguZmluYWxpemVyKClcIj48L2Zvcm0tYWRhcHRpdmU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEVzVGQgbGV0LWN0eD5cclxuICAgIDwhLS0gVE9ETzogRm9ybWF0dGFyZSBpbCB2YWxvcmUgaW4gYmFzZSBhIHZhbFR5cGUudHlwZSAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdHgudHlwZSA9PSAnZW51bSdcIj5cclxuICAgICAgICB7eyAoY3R4LnZhbHVlIHwgZXN0X2xvb2t1cCA6IGN0eC5kZWZpbml0aW9uLlByb3BlcnR5U291cmNlKS5kZXNjcmlwdGlvbiB9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3R4LnR5cGUgIT0gJ2VudW0nXCI+XHJcbiAgICAgICAge3tjdHgudmFsdWV9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2N1c3RvbUNlbGxzIGxldC1pdGVtIGxldC1vcHQ9XCJ0ZW1wbGF0ZU9wdGlvbnNcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJVc2VDdXN0b21DZWxscyAmJiAhRW1wdHlSb3dUZHNcIj5cclxuICAgICAgICA8IS0tIENlbGxhIGNoZSBhZ2dyZWdhIHR1dHRlIGxlIGNvbG9ubmUgY2hlIGRldm9ubyBlc3NlcmUgcGlubmF0ZSAtLT5cclxuICAgICAgICA8dGQgKm5nSWY9XCJIYXNQaW5uZWRDb2x1bW5zXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvZHkgZXN0LWNvbC1taW5cIiBbY2xhc3MuZXN0LXdoaXRlLXNlbGVjdGVkXT1cIml0ZW0uX3NlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW3N0eWxlLndpZHRoLnB4XT1cIlBpbm5lZENvbnRhaW5lcldpZHRoXCIgY2xhc3M9XCJlc3QtcGlubmVkLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWl0ZW0ubG9ja2VkICYmICFpdGVtLl9zZXAgJiYgU2VsZWN0aW9uXCIgY2xhc3M9XCJlc3Qtbm8tYm9yZGVyIGVzdC1jb2wtbWluXCIgW3N0eWxlLndpZHRoLnB4XT1cIjIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtkaXNhYmxlZF09XCJvcHQuc2VsRGlzYWJsZWRcIiBbY2xhc3MuZXN0LXBvaW50ZXJdPVwiIWl0ZW0ubG9ja2VkXCIgWyhuZ01vZGVsKV09XCJpdGVtLl9zZWxlY3RlZFwiIG5hbWU9XCJjaGVja3t7aXRlbS5faGFzaH19XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaGFuZGxlQ2xpY2soJGV2ZW50LCBpdGVtKTtcIj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtbm8tYm9yZGVyIGVzdC1jb2wtbWluXCIgKm5nSWY9XCIoaXRlbS5sb2NrZWQgfHwgaXRlbS5fc2VwKSAmJiBTZWxlY3Rpb25cIiBbc3R5bGUud2lkdGgucHhdPVwiMjBcIj48L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNlbGwgb2YgUm93VERzW2l0ZW0uX2hhc2hdOyBsZXQgaW5kZXggPSBpbmRleDsgdHJhY2tCeTogSURUcmFja0J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuUGlubmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZDsgY29udGV4dDogeyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGl0ZW0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbDogY2VsbCwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiB0cnVlLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0dXM6IHNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXT8uW2luZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0dXNVcDogc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWwgLSAxXT8uW2luZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0dXNEb3duOiBzZWxlY3Rpb25TdGF0dXNbaXRlbS5fb3JkaW5hbCArIDFdPy5baW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXR1c0xlZnQ6IHNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXT8uW2luZGV4IC0gMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhdHVzUmlnaHQ6IHNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXT8uW2luZGV4ICsgMV0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSBlZmZldHRpdm8gZGVsbGEgcmlnYSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIFJvd1REc1tpdGVtLl9oYXNoXTsgbGV0IGluZGV4ID0gaW5kZXg7IHRyYWNrQnk6IElEVHJhY2tCeVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuUGlubmVkO1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRkOyBjb250ZXh0OiB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGl0ZW0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsOiBjZWxsLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkOiBmYWxzZSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXR1czogc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdPy5baW5kZXhdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0dXNVcDogc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWwgLSAxXT8uW2luZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhdHVzRG93bjogc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWwgKyAxXT8uW2luZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhdHVzTGVmdDogc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdPy5baW5kZXggLSAxXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhdHVzUmlnaHQ6IHNlbGVjdGlvblN0YXR1c1tpdGVtLl9vcmRpbmFsXT8uW2luZGV4ICsgMV0gXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIENlbGxhIGN1c3RvbWl6emF0YSwgZWxlbWVudG8gZ3JhZmljbyBiYXNlIHBlciBsYSB0YWJlbGxhIC0tPlxyXG48bmctdGVtcGxhdGUgI2N1c3RvbVRkIGxldC1pdGVtIGxldC1jZWxsPVwiY2VsbFwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LXBpbm5lZD1cInBpbm5lZFwiIGxldC1zZWxTdGF0dXM9XCJzZWxlY3Rpb25TdGF0dXNcIiBsZXQtc2VsU3RhdHVzVXA9XCJzZWxlY3Rpb25TdGF0dXNVcFwiIGxldC1zZWxTdGF0dXNEb3duPVwic2VsZWN0aW9uU3RhdHVzRG93blwiIGxldC1zZWxTdGF0dXNMZWZ0PVwic2VsZWN0aW9uU3RhdHVzTGVmdFwiIGxldC1zZWxTdGF0dXNSaWdodD1cInNlbGVjdGlvblN0YXR1c1JpZ2h0XCI+XHJcblxyXG4gICAgPCEtLSBDdXN0b21penphemlvbmUgcGVyIGNlbGxlIGNvbiBpY29uYSAoc29ubyBlc3NlbnppYWxtZW50ZSBvcGVyYXppb25pIHNlbXBsaWNpIGUgYmFzdGEpIC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuSWNvbkNsYXNzICYmIGNlbGwuVmlzaWJsZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5Db25kaXRpb25GaWVsZCB8fCAoKChpdGVtLnByb3BlcnRpZXMgfHwgaXRlbSkgfCBlc3RfcHJvcGluc2Vuc2l0aXZlIDogY2VsbC5Db25kaXRpb25GaWVsZCkgPT0gY2VsbC5Db25kaXRpb25WYWx1ZSlcIj5cclxuICAgICAgICAgICAgPHRkIFtjbGFzcy5lc3Qtbm8tcmlnaHQtcGFkZGluZ109XCJpbmRleCAhPSBEeW5hbWljT3BlcmF0aW9ucy5sZW5ndGggLTFcIiBbY2xhc3MuZXN0LW5vLWxlZnQtcGFkZGluZ109XCJpbmRleCAhPSAwXCIgY2xhc3M9XCJlc3QtY29sLW1pblwiPjxzcGFuIHRpdGxlPVwie3tjZWxsLlRpdGxlfX1cIiBjbGFzcz1cInt7Y2VsbC5JY29uQ2xhc3N9fSBlc3QtcG9pbnRlclwiIChjbGljayk9XCJkeW5hbWljT3BlcmF0aW9uKGl0ZW0sIGNlbGwuSUQpXCI+e3tjZWxsLkNvbnRlbnR9fTwvc3Bhbj48L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsLkNvbmRpdGlvbkZpZWxkICYmICgoKGl0ZW0ucHJvcGVydGllcyB8fCBpdGVtKSB8IGVzdF9wcm9waW5zZW5zaXRpdmUgOiBjZWxsLkNvbmRpdGlvbkZpZWxkKSAhPSBjZWxsLkNvbmRpdGlvblZhbHVlKVwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJlc3QtY29sLW1pbiBlc3Qtbm8tc2lkZS1wYWRkaW5nXCI+PC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC0gICBBVFRFTlpJT05FOiBHbGkgc3BhemkgZnJhIGdsaSBJbnB1dCBkaSBxdWVzdG8gbWVnYSB0ZCBzb25vIHNpZ25pZmljYXRpdmkgZSBkaXZpZG9ubyBsYSBkaWNoaWFyYXppb25lIGluIHNlemlvbmk6ICAgIC1cclxuICAgIC0gICAuIEdlbmVyaWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1cclxuICAgIC0gICAuIEdlc3Rpb25lIGFsbGluZWFtZW50byBlIGNvbG9yaSBwZXIgbGEgbW9kYWxpdMOgIHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uaSBncmFmaWNoZSBwYXJ0aWNvbGFyaSBwZXIgaWwgUGlubmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uZSBkZWxsYSBzZWxlemlvbmUgYSBzaW5nb2xhIGNlbGxhIGluIGFzc2VuemEgZGkgcGlubmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXHJcbiAgICAtICAgLiBHZXN0aW9uZSBjbGljayBjbGFzc2ljbyBlIHNlbGV6aW9uZSBtdWx0aWNlbGxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVxyXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICA8dGQgKm5nSWY9XCIhY2VsbC5JY29uQ2xhc3MgJiYgY2VsbC5WaXNpYmxlXCJcclxuICAgICAgICBlcy10ZD1cInt7Y2VsbC5Qcm9wZXJ0eSB8fCBjZWxsLklEfX1cIlxyXG4gICAgICAgIGlkPVwiZXN0ZF97e2NlbGwuUHJvcGVydHkgfHwgY2VsbC5JRH19X3t7aXRlbS5fb3JkaW5hbH19X3t7aW5kZXh9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJ7eyBjZWxsLkNsYXNzIH19XCJcclxuXHJcbiAgICAgICAgW0NvbnRleHRdPVwiaXRlbS5faGFzaFwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1kZWZhdWx0LXJvdy1oZWlnaHRdPVwiIUhpZ2hDZWxsRGVuc2l0eVwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC13aGl0ZS1zZWxlY3RlZF09XCJpdGVtLl9zZWxlY3RlZFwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1uby1zZWxlY3Rpb25dPVwiRWRpdGFibGUgJiYgY2VsbC5Qcm9wZXJ0eU5hbWVcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcmctaGRyXT1cImNlbGwuR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcmctYWdnXT1cImNlbGwuR3JvdXBBZ2dyZWdhdGlvblwiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1ub3dyYXBdPVwiSGllcmFyY2h5IHx8ICFjZWxsLldyYXBzXCJcclxuXHJcbiAgICAgICAgW3N0eWxlLnRleHQtYWxpZ25dPVwiICghcGlubmVkICYmIGNlbGwuQWxpZ25tZW50KSA/IGNlbGwuQWxpZ25tZW50IDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cIighcGlubmVkICYmIGl0ZW0uZm9yZWNvbG9ycyAmJiBjZWxsLlByb3BBY2Nlc3NvcikgPyBpdGVtLmZvcmVjb2xvcnNbY2VsbC5Qcm9wQWNjZXNzb3JdIDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiKCFwaW5uZWQgJiYgaXRlbS5iYWNrY29sb3JzICYmIGNlbGwuUHJvcEFjY2Vzc29yKSA/IGl0ZW0uYmFja2NvbG9yc1tjZWxsLlByb3BBY2Nlc3Nvcl0gOiBudWxsXCJcclxuICAgICAgICBcclxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwicGlubmVkID8gY2VsbC5QaW5uZWRXaWR0aCA6IG51bGxcIlxyXG4gICAgICAgIFtjbGFzcy5lc3Qtbm8tYm9yZGVyXT1cInBpbm5lZFwiXHJcblxyXG4gICAgICAgIFtjbGFzcy5lc3Qtbm8tYm9yZGVyLWJvdHRvbV09XCJzZWxTdGF0dXNEb3duPy50Ym9yZGVyXCJcclxuICAgICAgICBbY2xhc3MuZXN0LW5vLWJvcmRlci10b3BdPVwic2VsU3RhdHVzVXA/LmJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtbHRhYi1ib3JkZXJdPVwiY2VsbC5MZWZ0Qm9yZGVyICYmICFzZWxTdGF0dXM/Lmxib3JkZXIgJiYgIXNlbFN0YXR1c0xlZnQ/LnJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtcnRhYi1ib3JkZXJdPVwiY2VsbC5SaWdodEJvcmRlciAmJiAhc2VsU3RhdHVzPy5yYm9yZGVyICYmICFzZWxTdGF0dXNSaWdodD8ubGJvcmRlclwiXHJcbiAgICAgICAgXHJcbiAgICAgICAgW2NsYXNzLmVzdC1zZWxlY3RlZC1jZWxsXT1cInNlbFN0YXR1cz8uc2VsZWN0ZWRcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1sYm9yZGVyXT1cIiBzZWxTdGF0dXM/Lmxib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1yYm9yZGVyXT1cIiBzZWxTdGF0dXM/LnJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC10Ym9yZGVyXT1cIiBzZWxTdGF0dXM/LnRib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1iYm9yZGVyXT1cIiBzZWxTdGF0dXM/LmJib3JkZXJcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC1sYm9yZGVyLXRtcF09XCIhY2VsbC5MZWZ0Qm9yZGVyICYmICFzZWxTdGF0dXM/Lmxib3JkZXIgJiYgIXNlbFN0YXR1cz8ubG92ZXJsYXBzXCJcclxuICAgICAgICBbY2xhc3MuZXN0LWNlbGwtcmJvcmRlci10bXBdPVwiIWNlbGwuUmlnaHRCb3JkZXIgJiYgIXNlbFN0YXR1cz8ucmJvcmRlciAmJiAhc2VsU3RhdHVzPy5yb3ZlcmxhcHNcIlxyXG4gICAgICAgIFtjbGFzcy5lc3QtY2VsbC10Ym9yZGVyLXRtcF09XCIhc2VsU3RhdHVzPy50Ym9yZGVyICYmICFzZWxTdGF0dXM/LnRvdmVybGFwc1wiXHJcbiAgICAgICAgW2NsYXNzLmVzdC1jZWxsLWJib3JkZXItdG1wXT1cIiFzZWxTdGF0dXM/LmJib3JkZXIgJiYgIXNlbFN0YXR1cz8uYm92ZXJsYXBzXCJcclxuXHJcbiAgICAgICAgKG1vdXNlZG93bik9XCJtb3VzZWRvd24oJGV2ZW50LCBjZWxsLCBpdGVtKVwiXHJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcigkZXZlbnQpXCJcclxuICAgICAgICAobW91c2V1cCk9XCJtb3VzZXVwKCRldmVudClcIlxyXG4gICAgICAgIChvbkNlbGxHZW5lcmF0aW9uKT1cInJlZ2lzdGVyQ2VsbCgkZXZlbnQpXCJcclxuICAgICAgICAoY2xpY2spPVwiZGJDbGlja0VkaXRPclNpbmdsZUNsaWNrUm93U2VsZWN0aW9uKCRldmVudCwgY2VsbCwgaXRlbSlcIj5cclxuXHJcbiAgICAgICAgPGRpdiBbY2xhc3MuZXN0LWVkaXQtaGlkZGVuXT1cImNlbGwuX2VkaXRpbmdcIiBbY2xhc3MuZXN0LXByZV09XCIhKEhpZXJhcmNoeSAmJiBpbmRleCA9PSAwKVwiPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjREVCVUc+XHJcbiAgICAgICAgICAgICAgICA8IS0tIERlYnVnIGJveCBpbiBjYXNvIGxhIHJvYmEgY2hlIHZpZW5lIHNjcml0dGEgbmVsbGUgY2VsbGUgbm9uIHRvcm5pLiBTY2lydmVyZSBxdWkgaSBwcm9wcmkgYmluZGluZyBwZXIgY29udHJvbGxhcmUgY29zZSAtLT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDkwJSBUZW1wbGF0ZSBkaXNwb25pYmlsZSwgcXVpbmRpIGRlcml2YW50ZSBkYSAqdGQsIGNvbnRyb2xsbyBnaXVzdG8gY2hlIG5vbiBzaWEgdW4gZmllbGQgcGFydGljb2xhcmUgbXVsdGkgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsLlRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuTXVsdGlcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbC5UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjZWxsLk11bHRpXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGwuVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAoaXRlbVtjZWxsLk11bHRpUHJvcF0gPyBpdGVtW2NlbGwuTXVsdGlQcm9wXVtjZWxsLk11bHRpSW5kZXhdIDoge30pIH1cIj48L25nLWNvbnRhaW5lcj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSA4JVxyXG4gICAgICAgICAgICAgICAgVGVtcGxhdGUgbm9uIGRpc3BvbmliaWxlLCBwdcOyIHZlbmlyZSBkYVxyXG4gICAgICAgICAgICAgICAgUm91dGVQYXRoIGluIGNhc28gc2lhIHVuIGxpbmsgZGkgdW5hIHRhYmVsbGEgZGluYW1pY2FcclxuICAgICAgICAgICAgICAgIFByb3BBY2Nlc3NvciBpbiBjYXNvIGRpIFJlcG9ydFJvdyAocXVpbmRpIG9nZ2V0dGkgY29uIFwidmFsdWVzXCIgIGRlbnRybyksXHJcbiAgICAgICAgICAgICAgICBvIFJlbmRlcmVyIHNlIG1vZGFsaXTDoCBkaW5hbWljYS9zdGFuZGFyZCAoaW4gcXVhbCBjYXNvIGlsIHJlbmRlcmVyIMOoIGlsIGRlZmF1bHQpXHJcbiAgICAgICAgICAgIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNlbGwuVGVtcGxhdGUgJiYgIWNlbGwuTXVsdGkgJiYgIWNlbGwuQ29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJjZWxsLlJvdXRlUGF0aFwiIFtyb3V0ZXJMaW5rXT1cIml0ZW0gfCBlc3Rfcm91dGVybGluayA6IGNlbGwuUm91dGVQYXRoIDogY2VsbC5Sb3V0ZVBhcmFtZXRlclByb3BlcnRpZXNcIiBjbGFzcz1cImVzdC1saW5rXCIgW2lubmVySFRNTF09XCJpdGVtLnByb3BlcnRpZXMgPyBpdGVtLnByb3BlcnRpZXNbY2VsbC5Qcm9wZXJ0eU5hbWVdIDogaXRlbVtjZWxsLlByb3BlcnR5TmFtZV1cIj48L2E+XHJcblxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjZWxsLlByb3BBY2Nlc3NvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7KGl0ZW0udmFsdWVzPyBpdGVtLnZhbHVlc1tjZWxsLlByb3BBY2Nlc3Nvcl0gOiBpdGVtW2NlbGwuUHJvcEFjY2Vzc29yXSkgfCBlc3RfZm9ybWF0OiBjZWxsLkZvcm1hdCB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2VsbC5Qcm9wQWNjZXNzb3IgJiYgIWNlbGwuUm91dGVQYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGwuUHJvcGVydHlOYW1lIHwgZXN0X3JlbmRlcmVyOiB7IG5hbWU6IGNlbGwuUmVuZGVyZXJOYW1lLCBzcmM6IEVzVGRzRGlyZWN0aXZlLCBmYWxsYmFjazogZGVmYXVsdEVzVGQgfTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGVmaW5pdGlvbjogY2VsbCwgdmFsdWU6IGl0ZW0ucHJvcGVydGllcyA/IGl0ZW0ucHJvcGVydGllc1tjZWxsLlByb3BlcnR5TmFtZV0gOiBpdGVtW2NlbGwuUHJvcGVydHlOYW1lXSwgdHlwZTogY2VsbC5Qcm9wZXJ0eVR5cGV9IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gMSUgU2UgaW4gbW9kYWxpdMOgIGdlcmFyY2hpY2EgbWV0dG8gaWwgdGQgcGVyIG5hdmlnYXJlIGxhIGdlcmFyY2hpYSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkhpZXJhcmNoeSAmJiBpbmRleCA9PSAwXCI+PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIkhpZXJhcmNoeU5hdmlnYXRvcjsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSAxJSBDb250ZW50IHByb2dyYW1tYXRpY28gcGVyIGxlIGNhc2lzdGljaGUgZGkgUm93IEdyb3VwaW5nIGVjYy4uLiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNlbGwuQ29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAge3tjZWxsLkNvbnRlbnR9fVxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNlbGwuX2VkaXRpbmdcIiBjbGFzcz1cImVzdC1tdC1taW4tNVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbC5Qcm9wZXJ0eU5hbWUgfCBlc3RfZWRpdG9yOiB7IG5hbWU6IGNlbGwuRWRpdG9yTmFtZSwgc3JjOiBFc1RkRWRpdG9yRGlyZWN0aXZlcywgZmFsbGJhY2s6IGRlZmF1bHRFZGl0b3J9OyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkZWZpbml0aW9uOiBjZWxsLCBjb2x1bW5JbmRleDogaW5kZXgsIGl0ZW06IGl0ZW0sIGZpbmFsaXplcjogZmluYWxpemVVc2VyRWRpdC5iaW5kKHRoaXMsIGNlbGwsIGl0ZW0sIGluZGV4KSB9IH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIE5hdmlnYXRvcmUgZGVsbGEgZ2VyYXJjaGlhIGRpIHVuYSB2aWV3IGdlcmFyY2hpY2EsIGNvbiB0YXN0byBwZXIgZXNwYW5kZXJlIGUgY29sbGFzc2FyZSAtLT5cclxuPG5nLXRlbXBsYXRlICNIaWVyYXJjaHlOYXZpZ2F0b3IgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLnBhcmVudFwiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OmhpZGRlblwiPjwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5wYXJlbnQgJiYgaXRlbS5fZXhwYW5kZWRcIiBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93biBlc3QtcG9pbnRlciBlc3Qtbm8tc2VsZWN0aW9uXCIgKGNsaWNrKT1cImhpZXJhcmNoeU1vZGVfSC5jb2xsYXBzZVBhcmVudChpdGVtW3RoaXMuT3duS2V5XSlcIj48L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucGFyZW50ICYmICFpdGVtLl9leHBhbmRlZFwiIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cCBlc3QtcG9pbnRlciBlc3Qtbm8tc2VsZWN0aW9uXCIgKGNsaWNrKT1cImhpZXJhcmNoeU1vZGVfSC5leHBhbmRQYXJlbnQoaXRlbVt0aGlzLk93bktleV0pXCI+PC9zcGFuPlxyXG4gICAgJm5ic3A7XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIFB1bHNhbnRpIGRpIGVsaW1pbmF6aW9uZS91bmRvIGVsaW1pbmF6aW9uZSBlZCBlc3BvcnRhemlvbmUgY2hlIHZhbm5vIGluIGZvbmRvIGFkIHVuIHJlY29yZCBlZGxsYSB0YWJlbGxhIC0tPlxyXG48bmctdGVtcGxhdGUgI2JvZHlEZWxldGVBbmRFeHBvcnQgbGV0LW9wdGlvbnM+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiUmVtb3ZhbCAmJiAhUmVtb3ZhbENvbmRpdGlvblwiPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImVzdC1zdGlja3ktbGFzdC1jb2x1bW57e29wdGlvbnMuZXZlbj8gJy1hbHQnIDogJyd9fSB7e0V4cG9ydCB8fCBIaWRkZW5Db2x1bW5zIHx8IENvcm5lck1lbnVPcHRpb25zID8gJ2VzdC1yaWdodC05JyA6ICcnfX1cIiAqbmdJZj1cIiEob3B0aW9ucy5pdGVtLnJlbW92ZWQgfHwgb3B0aW9ucy5pdGVtLmRlbGV0ZWQpXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1yZW1vdmUgZXN0LXBvaW50ZXIgdGV4dC1kYW5nZXJcIiBbaGlkZGVuXT1cIm9wdGlvbnMuaXRlbS5yZW1vdmFibGUgIT0gdW5kZWZpbmVkICYmICFvcHRpb25zLml0ZW0ucmVtb3ZhYmxlXCIgKGNsaWNrKT1cIm9uUmVtb3ZhbC5lbWl0KG9wdGlvbnMuaXRlbSlcIj48L3NwYW4+PC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtc3RpY2t5LWxhc3QtY29sdW1ue3tvcHRpb25zLmV2ZW4/ICctYWx0JyA6ICcnfX0ge3tFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb3JuZXJNZW51T3B0aW9ucyA/ICdlc3QtcmlnaHQtOScgOiAnJ319XCIgKm5nSWY9XCIob3B0aW9ucy5pdGVtLnJlbW92ZWQgfHwgb3B0aW9ucy5pdGVtLmRlbGV0ZWQpXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS11bmRvICB0ZXh0LXdhcm5pbmcgZXN0LXBvaW50ZXJcIiAoY2xpY2spPVwib25BYm9ydFJlbW92YWwuZW1pdChvcHRpb25zLml0ZW0pXCI+PC9zcGFuPjwvdGQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJSZW1vdmFsICYmIFJlbW92YWxDb25kaXRpb25cIj5cclxuICAgICAgICA8dGQgY2xhc3M9XCJlc3Qtc3RpY2t5LWxhc3QtY29sdW1ue3tvcHRpb25zLmV2ZW4/ICctYWx0JyA6ICcnfX0ge3tFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb3JuZXJNZW51T3B0aW9ucyA/ICdlc3QtcmlnaHQtOScgOiAnJ319XCIgKm5nSWY9XCIhKG9wdGlvbnMuaXRlbS5yZW1vdmVkIHx8IG9wdGlvbnMuaXRlbS5kZWxldGVkKSAmJiBvcHRpb25zLml0ZW1bUmVtb3ZhbENvbmRpdGlvbl1cIj48c3BhbiBjbGFzcz1cImZhIGZhLXJlbW92ZSBlc3QtcG9pbnRlciB0ZXh0LWRhbmdlclwiIFtoaWRkZW5dPVwib3B0aW9ucy5pdGVtLnJlbW92YWJsZSAhPSB1bmRlZmluZWQgJiYgIW9wdGlvbnMuaXRlbS5yZW1vdmFibGVcIiAoY2xpY2spPVwib25SZW1vdmFsLmVtaXQob3B0aW9ucy5pdGVtKVwiPjwvc3Bhbj48L3RkPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cImVzdC1zdGlja3ktbGFzdC1jb2x1bW57e29wdGlvbnMuZXZlbj8gJy1hbHQnIDogJyd9fSB7e0V4cG9ydCB8fCBIaWRkZW5Db2x1bW5zIHx8IENvcm5lck1lbnVPcHRpb25zID8gJ2VzdC1yaWdodC05JyA6ICcnfX1cIiAqbmdJZj1cIihvcHRpb25zLml0ZW0ucmVtb3ZlZCB8fCBvcHRpb25zLml0ZW0uZGVsZXRlZCkgJiYgb3B0aW9ucy5pdGVtW1JlbW92YWxDb25kaXRpb25dXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS11bmRvICB0ZXh0LXdhcm5pbmcgZXN0LXBvaW50ZXJcIiAoY2xpY2spPVwib25BYm9ydFJlbW92YWwuZW1pdChvcHRpb25zLml0ZW0pXCI+PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgPHRkIGNsYXNzPVwiZXN0LXN0aWNreS1sYXN0LWNvbHVtbnt7b3B0aW9ucy5ldmVuPyAnLWFsdCcgOiAnJ319IHt7RXhwb3J0IHx8IEhpZGRlbkNvbHVtbnMgfHwgQ29ybmVyTWVudU9wdGlvbnMgPyAnZXN0LXJpZ2h0LTknIDogJyd9fVwiICpuZ0lmPVwiIW9wdGlvbnMuaXRlbVtSZW1vdmFsQ29uZGl0aW9uXVwiPjxzcGFuIGNsYXNzPVwiZmEgZmEtcmVtb3ZlIGVzdC1oaWRkZW4tdmlld1wiPjwvc3Bhbj48L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8dGQgKm5nSWY9XCJFeHBvcnQgfHwgSGlkZGVuQ29sdW1ucyB8fCBDb3JuZXJNZW51T3B0aW9uc1wiIGNsYXNzPVwiZXN0LXN0aWNreS1sYXN0LWNvbHVtbnt7b3B0aW9ucy5ldmVuICYmICFIaWVyYXJjaHkgPyAnLWFsdCcgOiAnJ319XCI+PC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gQ29udGV4dCBtZW51IHZ1b3RvIGRlZmF1bHQgcGVyIHR1dHRlIGxlIHRhYmVsbGEgY2hlIG5vbiBjZSBsJ2hhbm5vLCBpbiBtb2RvIGNoZSBhbCBjbGljayBkZXN0cm8gYXBwYWlhIFwibmVzc3VuYSBvcCBkaXNwb25pYmlsZVwiIC0tPlxyXG48Y29udGV4dC1tZW51ICNlbXB0eU1lbnU+XHJcbiAgICA8bmctdGVtcGxhdGUgY29udGV4dE1lbnVJdGVtPjxzcGFuPjxlbT57eydObyBvcGVyYXRpb25zIGF2YWlsYWJsZScgfCBsb2NhbGl6ZSA6IGxjfX0uLi48L2VtPjwvc3Bhbj48L25nLXRlbXBsYXRlPlxyXG48L2NvbnRleHQtbWVudT5cclxuXHJcbjwhLS0gTW9kYWwgcGVyIGNhbWJpYXJlIHBvc2l6aW9uZSBlIHZpc2liaWxpdMOgIGRlbGxlIGNvbG9ubmUgZGVsbCdlcy10YWJsZSAtLT5cclxuPGRpdiBic01vZGFsICNjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWw9XCJicy1tb2RhbFwiIGNsYXNzPVwibW9kYWwgZmFkZVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIiBjZGtEcmFnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZXN0LXBvaW50ZXJcIiBjZGtEcmFnSGFuZGxlPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgcHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDb2x1bW5zIE9yZGVyJyB8IGxvY2FsaXplIDogbGN9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmICFDb2x1bW5zT3JkZXJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snQ29sdW1ucyBWaXNpYmlsaXR5JyB8IGxvY2FsaXplIDogbGN9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zICYmIENvbHVtbnNPcmRlcmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDb2x1bW5zIFZpc2liaWxpdHkgYW5kIE9yZGVyJyB8IGxvY2FsaXplIDogbGN9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2UgcHVsbC1yaWdodFwiIChjbGljayk9XCJjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWwuaGlkZSgpO1wiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIVRNUENvbHVtbnNMaXN0IHx8IFRNUENvbHVtbnNMaXN0Lmxlbmd0aCA9PSAwXCIgY2xhc3M9XCJjYXJkIGNhcmQtaW5mbyBlc3QtcGFkZGluZy0xMCBlc3QtbWFyZ2luLWJvdHRvbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snVGhlcmUgYXJlIG5vIGNvbHVtbnMgY29uZmlndXJlZCB0byBiZSBoaWRkZW4vc2hvd24gaW4gdGhpcyB2aWV3JyB8IGxvY2FsaXplIDogbGN9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiVE1QQ29sdW1uc0xpc3QgJiYgVE1QQ29sdW1uc0xpc3QubGVuZ3RoID4gMFwiIHN0eWxlPVwibWF4LWhlaWdodDo1MDBweDsgb3ZlcmZsb3cteTphdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLUFhYWFhYWFoIGxhIHRyaXN0ZXp6YS4uLiBxdWkgbWkgc2VydmlyZWJiZSBsJ2VzLXRhYmxlIHBlciBmYWNpbGl0YXJlIGxhIHNlbGV6aW9uZSBtdWx0aXBsYSBlY2MuLi4gcGVjY2F0byBjaGUgc2UgbGEgbGlua28gcXVpIGVudHJvIGluIHVuIGxvb3AgaW1wcmVzc2lvbmFudGUtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLXNtIGVzdC1tYXJnaW4tYm90dG9tLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImVzdC1jb2wtbWluXCIgKm5nSWY9XCJIaWRkZW5Db2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImVzdC1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJnbG9iYWxDb2xWaXNDaGVja1wiIFtuZ01vZGVsT3B0aW9uc109XCJ7J3N0YW5kYWxvbmUnOiB0cnVlfVwiIChuZ01vZGVsQ2hhbmdlKT1cImNvbHVtbk1ldGFkYXRhX0guZ2xvYmFsQ29sVmlzQ2hlY2tDaGFuZ2VkKCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx0aCBjbGFzcz1cImVzdC1jb2wtbWluXCIgKm5nSWY9XCJDb2x1bW5zT3JkZXJpbmdcIj48L3RoPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJlc3QtY29sLW1pbiBlc3Qtbm93cmFwXCI+e3snQ29sdW1uIE5hbWUnIHwgbG9jYWxpemUgOiBsY319PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tRmlsbGVyLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQaW5uZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiRGlyZWN0aXZlc0Jhc2VkXCIgY2xhc3M9XCJlc3QtY29sLW1pblwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka0Ryb3BMaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cIlRNUENvbHVtbnNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiY29sdW1uTWV0YWRhdGFfSC5jb2x1bW5SZW9yZGVyZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJvcExpc3RTb3J0UHJlZGljYXRlXT1cImNvbHVtbk1ldGFkYXRhX0guc29ydFByZWRpY2F0ZS5iaW5kKHRoaXMuY29sdW1uTWV0YWRhdGFfSClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlc3QtZHJvcGJveFwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBUTVBDb2x1bW5zTGlzdDsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0OyB0cmFja0J5OiBpZFRyYWNrQnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXN0LXBvaW50ZXIgZXN0LWRyb3BsaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LXdoaXRlLXNlbGVjdGVkXT1cImxhc3RTZWxlY3RlZEl0ZW1JRCA9PSBpdGVtLmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZXN0LW5vLXNlbGVjdGlvbl09XCIhaXRlbS52aXNpYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiIUNvbHVtbnNPcmRlcmluZyB8fCBpdGVtLmZpeGVkIHx8IGl0ZW0ucGlubmVkXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIkhpZGRlbkNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjbGFzcy5lc3QtaGlkZGVuLXZpZXddPVwiaXRlbS5maXhlZFwiIGNsYXNzPVwiZXN0LXBvaW50ZXJcIiBbKG5nTW9kZWwpXT1cIml0ZW0udmlzaWJsZVwiIG5hbWU9XCJ2aXNpYmxle3tpfX1cIiAobmdNb2RlbENoYW5nZSk9XCJjb2x1bW5NZXRhZGF0YV9ILnVwZGF0ZUdsb2JhbENvbFZpc0NoZWNrKCk7XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImVzdC1ub3dyYXAgZHJhZy12aXNpYmxlXCIgKGNsaWNrKT1cImNvbHVtbk1ldGFkYXRhX0guY29sdW1uQ2xpY2tlZChpdGVtKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGFkcmkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ucGFyZW50VGVtcGxhdGVzICYmIGl0ZW0ucGFyZW50VGVtcGxhdGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVzdC1mdy1ib2xkIGVzdC1mcy0xM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXJlbnQgb2YgaXRlbS5wYXJlbnRUZW1wbGF0ZXM7IGxldCBsYXN0PWxhc3Q7IHRyYWNrQnk6IGlkVHJhY2tCeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyZW50LnRtcGxcIj48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFyZW50LnRtcGxcIj48L25nLWNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmVudC5jb250ZW50XCI+e3twYXJlbnQuY29udGVudH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxhc3RcIj4mbmJzcDstJm5ic3A7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVtcGxhdGUgaGVhZGVyIG9yaWdpbmFsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtLnRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbS5tdWx0aSA/IGl0ZW0ubXVsdGlDb250ZW50IDogbnVsbCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0udGVtcGxhdGVcIj57e2l0ZW0uZGVzY3JpcHRpb259fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUZpbGxlci0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAoY2xpY2spPVwiY29sdW1uTWV0YWRhdGFfSC5jb2x1bW5DbGlja2VkKGl0ZW0pO1wiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQaW5uZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiRGlyZWN0aXZlc0Jhc2VkICYmIENvbHVtbnNQaW5uYWJsZVwiPjxzcGFuICpuZ0lmPVwiIWl0ZW0uZml4ZWQgJiYgaXRlbS5waW5uYWJsZVwiIGNsYXNzPVwiZmEgZmEtdGh1bWItdGFja1wiIFtjbGFzcy50ZXh0LXN1Y2Nlc3NdPVwiaXRlbS5waW5uZWRcIiAoY2xpY2spPVwiY29sdW1uTWV0YWRhdGFfSC5waW5PclVucGluQ29sdW1uKGl0ZW0pXCI+PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgZXN0LW1hcmdpbi1yaWdodC0xMFwiIChjbGljayk9XCJsYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsOyBjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWwuaGlkZSgpO1wiPnt7J0Nsb3NlJyB8IGxvY2FsaXplIDogbGN9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIiFUTVBDb2x1bW5zTGlzdCB8fCBUTVBDb2x1bW5zTGlzdC5sZW5ndGggPT0gMFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNvbHVtbk1ldGFkYXRhX0guY29uZmlybUNvbHVtblZpc2liaWxpdHlTZWxlY3Rpb24oKSAmJiBjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5TW9kYWwuaGlkZSgpXCI+e3snQ29uZmlybScgfCBsb2NhbGl6ZSA6IGxjfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19