@messaia/cdk 18.1.0-rc13 → 18.1.0-rc15

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.
@@ -178,6 +178,23 @@ export class VdDynamicTableComponent {
178
178
  * at the top of the viewport when scrolling.
179
179
  */
180
180
  stickyFilter = true;
181
+ /**
182
+ * Private backing field for the columnSets input property.
183
+ * This field stores the sets of columns to be displayed in the table,
184
+ * enabling control over how the value is accessed or modified through
185
+ * the public getter and setter.
186
+ * @private
187
+ */
188
+ _columnSets;
189
+ /**
190
+ * Used to display specific columns in the table.
191
+ * This array defines sets of columns that can be shown
192
+ * based on the active configuration, allowing for dynamic table
193
+ * column customization.
194
+ * @property
195
+ */
196
+ get columnSets() { return this._columnSets; }
197
+ set columnSets(value) { this._columnSets = value; }
181
198
  /**
182
199
  * Event emitter for row click events. It emits the clicked row's data whenever a row is clicked.
183
200
  */
@@ -357,6 +374,7 @@ export class VdDynamicTableComponent {
357
374
  this._columns.push(new TableColumn({
358
375
  index: 2000,
359
376
  name: 'action',
377
+ columnSets: ['action', 'common'],
360
378
  type: TableColumnType.Action,
361
379
  disabled: true,
362
380
  menu: { icon: 'more_vert', items: this.rowMenuItems },
@@ -369,6 +387,7 @@ export class VdDynamicTableComponent {
369
387
  this._columns.push(new TableColumn({
370
388
  index: 2000,
371
389
  name: 'action',
390
+ columnSets: ['action', 'common'],
372
391
  type: TableColumnType.Action,
373
392
  disabled: true,
374
393
  menu: this.rowAction,
@@ -380,6 +399,7 @@ export class VdDynamicTableComponent {
380
399
  if (this.selectable) {
381
400
  this.columns.unshift(new TableColumn({
382
401
  name: 'select',
402
+ columnSets: ['select', 'common'],
383
403
  type: TableColumnType.Checkbox,
384
404
  configurable: false,
385
405
  sticky: true
@@ -389,8 +409,22 @@ export class VdDynamicTableComponent {
389
409
  }
390
410
  /* Build displayed columns & filter */
391
411
  this.columns$?.subscribe(x => {
392
- this.displayedColumns$ = of(this.columns?.filter(x => !this.excludedColumns?.includes(x.name))?.map(c => c.name));
393
- this.displayedFilterColumns$ = of(this.columns?.filter(x => !this.excludedColumns?.includes(x.name))?.map(c => `filter.${(c.filter || c.name)}`));
412
+ /* Filter the columns based on the individual column's columnSets property and the global columnSets */
413
+ const selectedColumns = (this.columnSets?.length ?? 0) > 0
414
+ ? this.columns?.filter(c => this.columnSets?.some(set => c.columnSets?.includes(set)))
415
+ : this.columns;
416
+ /* Build the displayed columns by filtering out the excluded columns and mapping to their names */
417
+ this.displayedColumns$ = of(selectedColumns
418
+ /* Exclude columns that are in the excludedColumns list */
419
+ ?.filter(x => !this.excludedColumns?.includes(x.name))
420
+ /* Map the remaining columns to their name property */
421
+ ?.map(c => c.name));
422
+ /* Build the displayed filter columns by filtering out the excluded columns and prefixing with 'filter.' */
423
+ this.displayedFilterColumns$ = of(selectedColumns
424
+ /* Exclude columns that are in the excludedColumns list */
425
+ ?.filter(x => !this.excludedColumns?.includes(x.name))
426
+ /* Map the remaining columns to a filter-friendly string with 'filter.' prefix */
427
+ ?.map(c => `filter.${(c.filter || c.name)}`));
394
428
  });
395
429
  /* Set the table columns */
396
430
  this.updateColumns();
@@ -668,7 +702,7 @@ export class VdDynamicTableComponent {
668
702
  this.changeDetector.detectChanges();
669
703
  }
670
704
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdDynamicTableComponent, deps: [{ token: i1.DynamicBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
671
- /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", sticky: "sticky", tableWidth: "tableWidth", useFilterOperator: "useFilterOperator", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, static: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i4.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i5.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i6.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i22.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i23.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i24.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i25.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i26.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i27.EnumPipe, name: "enum" }, { kind: "pipe", type: i28.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i29.FuncPipe, name: "func" }, { kind: "pipe", type: i30.PropertyPipe, name: "property" }, { kind: "pipe", type: i31.JoinPipe, name: "join" }, { kind: "pipe", type: i32.MapPipe, name: "map" }], animations: [
705
+ /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", sticky: "sticky", tableWidth: "tableWidth", useFilterOperator: "useFilterOperator", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", columnSets: "columnSets", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, static: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i4.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i5.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i6.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i22.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i23.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i24.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i25.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i26.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i27.EnumPipe, name: "enum" }, { kind: "pipe", type: i28.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i29.FuncPipe, name: "func" }, { kind: "pipe", type: i30.PropertyPipe, name: "property" }, { kind: "pipe", type: i31.JoinPipe, name: "join" }, { kind: "pipe", type: i32.MapPipe, name: "map" }], animations: [
672
706
  trigger('detailExpand', [
673
707
  state('collapsed', style({ height: '0px', minHeight: '0' })),
674
708
  state('expanded', style({ height: AUTO_STYLE })),
@@ -730,6 +764,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
730
764
  type: Input
731
765
  }], stickyFilter: [{
732
766
  type: Input
767
+ }], columnSets: [{
768
+ type: Input
733
769
  }], rowClick: [{
734
770
  type: Output
735
771
  }], rowNgClass: [{
@@ -765,4 +801,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
765
801
  type: ViewChild,
766
802
  args: ['scrollContainer', { static: true }]
767
803
  }] } });
768
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqTixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNB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QVM7dUJBQUMsWUFBWTtnQkFpQm5CLE9BQU87c0JBRFYsS0FBSztnQkE2QkMsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsZUFBZTtzQkFEckIsS0FBSztnQkFRQyxzQkFBc0I7c0JBRDVCLFlBQVk7dUJBQUMsY0FBYztnQkF1QnJCLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxlQUFlO3NCQURyQixLQUFLO2dCQVNDLGVBQWU7c0JBRHJCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgQVVUT19TVFlMRSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IER5bmFtaWNCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2hlbHBlcnMvZHluYW1pYy1idWlsZGVyJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBHcmlkIH0gZnJvbSAnLi4vLi4vZW51bXMvZ3JpZCc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3RhYmxlLWNvbHVtbi10eXBlJztcclxuaW1wb3J0IHsgZ2V0VGFibGVEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbHVtbic7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVGFibGVTdGF0aWNEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuc3RhdGljLWRhdGEtc291cmNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtZHluYW1pYy10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICdkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdGFuaW1hdGlvbnM6IFtcclxuXHRcdHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuXHRcdFx0c3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxyXG5cdFx0XHRzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogQVVUT19TVFlMRSB9KSksXHJcblx0XHRcdHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiBjb2xsYXBzZWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXHJcblx0XHRdKSxcclxuXHRdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmREeW5hbWljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgdGFibGUgY29tcG9uZW50LCB1c2VkIGZvciBhY2Nlc3NpbmcgTWF0VGFibGUgZnVuY3Rpb25hbGl0aWVzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ3RhYmxlJylcclxuXHRwdWJsaWMgdGFibGU/OiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2VzIHRvIHRoZSBjb250YWluZXIgZWxlbWVudHMgZm9yIGRldGFpbCB0ZW1wbGF0ZXMsIHdpdGggVmlld0NvbnRhaW5lclJlZiBcclxuXHQgKiBhbGxvd2luZyBkeW5hbWljIGluc2VydGlvbiBvZiB2aWV3cy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdkZXRhaWxzVGVtcGxhdGUnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlUmVmPzogUXVlcnlMaXN0PGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byBhIGNvbnRlbnQgY2hpbGQgdGVtcGxhdGUgKGRldGFpbHMgdGVtcGxhdGUpIG9mIHR5cGUgVGVtcGxhdGVSZWYsIFxyXG5cdCAqIHVzZWQgZm9yIHJlbmRlcmluZyBjdXN0b20gdGVtcGxhdGVzIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxyXG5cdHB1YmxpYyB0ZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGEgc291cmNlIGZvciB0aGUgdGFibGUsIHdoaWNoIGNhbiBlaXRoZXIgYmUgYSBjdXN0b20gVGFibGVEYXRhU291cmNlIFxyXG5cdCAqIGltcGxlbWVudGF0aW9uIG9yIGEgZHluYW1pYyBvYmplY3QuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPGFueSwgYW55PiB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZGF0YSBmb3IgdGhlIHRhYmxlLCB3aGljaCBpcyBzZXQgYXMgYSBzdGF0aWMgZGF0YSBzb3VyY2UuXHJcblx0ICogVGhpcyBtZXRob2QgYWxzbyBpbml0aWFsaXplcyBzb3J0aW5nIGFuZCBwYWdpbmF0aW9uIGZvciB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRzZXQgZGF0YShkYXRhOiBhbnkpIHtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UoZGF0YSk7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMubWF0U29ydDtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLl9wYWdpbmF0b3I7XHJcblx0XHR0aGlzLnBhZ2luYWJsZSA9IHRydWU7XHJcblx0XHR0aGlzLnN0YXRpYyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdGl2ZSBGb3JtQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmb3JtIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgXHJcblx0ICogZm9ybSBjb250cm9scyBhbmQgc3luY2hyb25pemUgdGFibGUgZGF0YSB3aXRoIGZvcm0gY2hhbmdlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgRm9ybUFycmF5IGZvciBtYW5hZ2luZyBmb3JtIGNvbnRyb2xzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUuIFxyXG5cdCAqIEl0IHNldHMgdGhlIHRhYmxlIGRhdGEgYW5kIHN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybSB2YWx1ZXMgdG8gXHJcblx0ICogdXBkYXRlIHRoZSB0YWJsZSBkeW5hbWljYWxseS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgZm9ybUFycmF5KCk6IEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtQXJyYXk7IH1cclxuXHRwdWJsaWMgc2V0IGZvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSkge1xyXG5cdFx0dGhpcy5fZm9ybUFycmF5ID0gZm9ybUFycmF5O1xyXG5cdFx0dGhpcy5kYXRhID0gdGhpcy5fZm9ybUFycmF5Py52YWx1ZTtcclxuXHJcblx0XHQvKiBVcGRhdGUgdGhlIHRhYmxlIGRhdGEgd2hlbiB0aGUgZm9ybSBhcnJheSB2YWx1ZXMgY2hhbmdlICovXHJcblx0XHR0aGlzLl9mb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHRpZiAoeC5sZW5ndGggIT09IHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9mb3JtQXJyYXk/LnZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHRlciBmb3IgcmV0cmlldmluZyB0aGUgcmF3IHZhbHVlIG9mIHRoZSBmb3JtLCB3aXRob3V0IGFwcGx5aW5nIGFueSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBmb3JtVmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5nZXRSYXdWYWx1ZSgpOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVidWcgbW9kZSBmb3IgbG9nZ2luZyBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MgdHlwZSB1c2VkIGluIHRoaXMgY29tcG9uZW50LCBcclxuXHQgKiB0eXBpY2FsbHkgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvciBtb2RlbCBvZiB0aGUgZGF0YS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQgb3IgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIHRhYmxlIGlzIGJlaW5nIHVzZWQuXHJcblx0ICogVGhpcyBhbGxvd3MgcGFzc2luZyBhZGRpdGlvbmFsIG1ldGFkYXRhIG9yIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGFwcGx5aW5nIGZpbHRlcnMgdG8gdGhlIGRhdGEgc291cmNlLiBJdCBkZWZpbmVzIGNyaXRlcmlhIG9yIGNvbmRpdGlvbnMgXHJcblx0ICogdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2VGaWx0ZXI6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgdXNlcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS4gXHJcblx0ICogV2hlbiB0cnVlLCB0aGUgdGFibGUgZG9lcyBub3QgcmVseSBvbiBkeW5hbWljIGRhdGEgY2hhbmdlcy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGZpbHRlcmFibGUgYnkgdGhlIHVzZXIuXHJcblx0ICogSWYgdHJ1ZSwgZmlsdGVyaW5nIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlcnMgb3IgY29sdW1ucyBzaG91bGQgc3RpY2sgXHJcblx0ICogdG8gdGhlIHZpZXdwb3J0IGR1cmluZyBzY3JvbGxpbmcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG92ZXJhbGwgd2lkdGggb2YgdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHRhYmxlV2lkdGg/OiBudW1iZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIG9wZXJhdG9yIGlzIHVzZWQgaW4gdGFibGUgZmlsdGVyaW5nLlxyXG5cdCAqIElmIHRydWUsIGZpbHRlcmluZyBsb2dpYyB3aWxsIGFwcGx5IG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFscywgY29udGFpbnMsIGV0Yy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyB1c2VGaWx0ZXJPcGVyYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGFibGUgc3VwcG9ydHMgcGFnaW5hdGlvbi5cclxuXHQgKiBJZiB0cnVlLCBwYWdpbmF0aW9uIGNvbnRyb2xzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGRhdGEuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgJ0NoZWNrYm94JyBjb2x1bW4gaXMgc2hvd24gZm9yIHJvdyBzZWxlY3Rpb24uXHJcblx0ICogSWYgdHJ1ZSwgYSBjaGVja2JveCBjb2x1bW4gd2lsbCBiZSBkaXNwbGF5ZWQgYWxsb3dpbmcgdXNlcnMgdG8gc2VsZWN0IHJvd3MuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBjb2x1bW4gdXNlZCBmb3Igc29ydGluZyB0aGUgdGFibGUgZGF0YS5cclxuXHQgKiBUaGlzIGlucHV0IGRldGVybWluZXMgd2hpY2ggY29sdW1uIHRoZSBzb3J0aW5nIGlzIGFwcGxpZWQgdG8uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxyXG5cdCAqIERlZmF1bHQgaXMgJ2FzYycgKGFzY2VuZGluZykuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9ICdhc2MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgcmVtYWluIHN0aWNreSAoZml4ZWQpIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IFxyXG5cdCAqIHdoZW4gdGhlIHRhYmxlIHNjcm9sbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2VjdGlvbiBvZiB0aGUgdGFibGUgc2hvdWxkIHJlbWFpbiBzdGlja3kgKGZpeGVkKSBcclxuXHQgKiBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCB3aGVuIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVyIGZvciByb3cgY2xpY2sgZXZlbnRzLiBJdCBlbWl0cyB0aGUgY2xpY2tlZCByb3cncyBkYXRhIHdoZW5ldmVyIGEgcm93IGlzIGNsaWNrZWQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIHJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBGdW5jdGlvbiB1c2VkIHRvIGR5bmFtaWNhbGx5IGFzc2lnbiBDU1MgY2xhc3NlcyB0byB0YWJsZSByb3dzIGJhc2VkIG9uIGN1c3RvbSBsb2dpYy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dOZ0NsYXNzPzogRnVuY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRlbXBsYXRlIGZvciByZW5kZXJpbmcgYWRkaXRpb25hbCBkZXRhaWxzIGJlbG93IGVhY2ggcm93LiBcclxuXHQgKiBJdCBhY2NlcHRzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGVtcGxhdGUga2V5IG9yIGlkZW50aWZpZXIuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRhYmxlIGlzIGluIGEgcmVhZG9ubHkgc3RhdGUuXHJcblx0ICogSWYgdHJ1ZSwgbm8gY2hhbmdlcyBjYW4gYmUgbWFkZSB0byB0aGUgdGFibGUgZGF0YS5cclxuXHQgKi9cclxuXHRwdWJsaWMgX3JlYWRvbmx5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG4gKiBJbnB1dCBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgaWYgdGhlIHRhYmxlIGlzIHJlYWRvbmx5LiBcclxuICogVXNlcyBgY29lcmNlQm9vbGVhblByb3BlcnR5YCB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYSBib29sZWFuLlxyXG4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0c2V0IHJlYWRvbmx5KHJlYWRvbmx5OiBhbnkpIHtcclxuXHRcdHRoaXMuX3JlYWRvbmx5ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlYWRvbmx5KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmN0aW9uIHRvIGZpbHRlciBpdGVtcyB3aGVuIHNlbGVjdGluZyBhbGwgcm93cy4gXHJcblx0ICogSXQgdGFrZXMgdmFsdWUsIGluZGV4LCBhbmQgYXJyYXkgYXMgYXJndW1lbnRzIGFuZCByZXR1cm5zIGEgYm9vbGVhbiBvciB1bmtub3duIHR5cGUuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0QWxsRmlsdGVyPzogKHZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4gdW5rbm93bjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBNYXRTb3J0IGRpcmVjdGl2ZSB1c2VkIGZvciBhcHBseWluZyBzb3J0aW5nIG9uIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdFNvcnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcblx0cHVibGljIG1hdFNvcnQ/OiBNYXRTb3J0O1xyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIHJlZmVyZW5jZSB0byB0aGUgTWF0UGFnaW5hdG9yIHVzZWQgdG8gcGFnaW5hdGUgdGhlIHRhYmxlIGRhdGEuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfcGFnaW5hdG9yPzogTWF0UGFnaW5hdG9yO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBzZXR0ZXIgZm9yIHRoZSBNYXRQYWdpbmF0b3IuIFdoZW4gdGhlIHBhZ2luYXRvciBpcyBzZXQsIGl0IGFzc2lnbnMgaXQgXHJcblx0ICogdG8gdGhlIGRhdGEgc291cmNlIGZvciBwYWdpbmF0aW9uIGNvbnRyb2wuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXHJcblx0c2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG5cdFx0aWYgKHBhZ2luYXRvcikge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gcGFnaW5hdG9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJpdmF0ZSBhcnJheSBzdG9yaW5nIHRoZSBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfY29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBnZXR0ZXIgYW5kIHNldHRlciBmb3IgdGhlIHRhYmxlIGNvbHVtbnMuIFxyXG5cdCAqIEl0IGFsbG93cyB0aGUgY29sdW1ucyB0byBiZSBjdXN0b21pemVkIGFuZCB1cGRhdGVkIGR5bmFtaWNhbGx5LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9XHJcblx0c2V0IGNvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5bXSkgeyB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBCZWhhdmlvclN1YmplY3QgdG8gbWFuYWdlIGFuZCBlbWl0IGNoYW5nZXMgdG8gdGhlIGNvbHVtbnMgZHluYW1pY2FsbHkuXHJcblx0ICovXHJcblx0cHVibGljIGNvbHVtbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8VGFibGVDb2x1bW5bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+KFtdKTtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0aGF0IHRyYWNrcyBhbmQgZW1pdHMgY2hhbmdlcyB0byB0aGUgY29sdW1ucy5cclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1ucyQ6IE9ic2VydmFibGU8VGFibGVDb2x1bW5bXT4gPSB0aGlzLmNvbHVtbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuXHQvKipcclxuXHQgKiBPYnNlcnZhYmxlIHRyYWNraW5nIHRoZSBjb2x1bW5zIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBkaXNwbGF5ZWRDb2x1bW5zJD86IE9ic2VydmFibGU8c3RyaW5nW10+O1xyXG5cclxuXHQvKipcclxuXHQgKiBPYnNlcnZhYmxlIHRyYWNraW5nIHRoZSBmaWx0ZXJhYmxlIGNvbHVtbnMgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkRmlsdGVyQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgcHJvcGVydHkgZm9yIHJvdy1zcGVjaWZpYyBhY3Rpb24gbWVudSBpdGVtcy4gXHJcblx0ICogRGVmaW5lcyBhY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGUgY29udGV4dCBtZW51IGZvciBlYWNoIHJvdy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dNZW51SXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBmb3IgYSBzaW5nbGUgcm93IGFjdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBhIHJvdy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dBY3Rpb24/OiBBY3Rpb25JdGVtO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBmb3Igc3BlY2lmeWluZyB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGRpc3BsYXkgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGV4Y2x1ZGVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnlMaXN0IHRvIHJlZmVyZW5jZSBhbGwgTWF0TWVudVRyaWdnZXJzIGFzc29jaWF0ZWQgd2l0aCByb3cgY29udGV4dCBtZW51cy5cclxuXHQgKiBVc2VkIGZvciBoYW5kbGluZyB0aGUgY29udGV4dCBtZW51IGludGVyYWN0aW9ucyBvbiB0YWJsZSByb3dzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0TWVudVRyaWdnZXIpXHJcblx0cHVibGljIHJvd0NvbnRleHRNZW51VHJpZ2dlcnM/OiBRdWVyeUxpc3Q8TWF0TWVudVRyaWdnZXI+O1xyXG5cclxuXHQvKipcclxuXHQgKiBDb2x1bW4gdHlwZSBlbnVtIHJlZmVyZW5jZSwgbWFwcGluZyB0YWJsZSBjb2x1bW5zIHRvIHRoZWlyIHR5cGVzIGZvciByZW5kZXJpbmcuXHJcblx0ICovXHJcblx0cHVibGljIENvbHVtblR5cGU6IHR5cGVvZiBUYWJsZUNvbHVtblR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdyaWQgZW51bSByZWZlcmVuY2UsIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBncmlkIHVzZWQgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBHcmlkOiB0eXBlb2YgR3JpZCA9IEdyaWQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IGV4cGFuZGVkIHJvdywgdXNlZCBmb3IgaGFuZGxpbmcgcm93IGV4cGFuc2lvbiBsb2dpYy5cclxuXHQgKi9cclxuXHRwdWJsaWMgZXhwYW5kZWRSb3c6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHNldHRpbmcgdGhlIGRlZmF1bHQgcGFnZSBzaXplIGZvciBwYWdpbmF0aW9uLiBcclxuXHQgKiBEZWZhdWx0IHZhbHVlIGlzIDE1LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSAxNTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHNldHRpbmcgYXZhaWxhYmxlIHBhZ2Ugc2l6ZSBvcHRpb25zIGluIHRoZSBwYWdpbmF0b3IuXHJcblx0ICogRGVmYXVsdCBvcHRpb25zIGluY2x1ZGUgWzUsIDEwLCAxNSwgMjAsIDMwLCA1MCwgMTAwLCAyMDBdLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHBhZ2VTaXplT3B0aW9uczogQXJyYXk8bnVtYmVyPiA9IFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXTtcclxuXHJcblx0LyogXHJcblx0ICogVGhpcyBkZWNvcmF0b3IgYmluZHMgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGVsZW1lbnQgYnkgaXRzIHRlbXBsYXRlIHJlZmVyZW5jZS5cclxuXHQgKiBUaGUgYHNjcm9sbENvbnRhaW5lcmAgd2lsbCByZWZlcmVuY2UgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSB0ZW1wbGF0ZSB3aXRoIGAjc2Nyb2xsQ29udGFpbmVyYC5cclxuXHQgKiBJdCB3aWxsIGFsbG93IGFjY2VzcyB0byB0aGUgbmF0aXZlIERPTSBlbGVtZW50IGZvciBtYW5hZ2luZyBzY3JvbGwgb3BlcmF0aW9ucy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHB1YmxpYyBzY3JvbGxDb250YWluZXI/OiBFbGVtZW50UmVmO1xyXG5cclxuXHQvKiBcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIGlzIGFjdGl2ZWx5IGRyYWdnaW5nIHRoZSBzY3JvbGwgY29udGFpbmVyLlxyXG5cdCAqIFRoaXMgZmxhZyBlbnN1cmVzIHRoYXQgc2Nyb2xsaW5nIG9ubHkgb2NjdXJzIHdoZW4gYSBkcmFnIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyxcclxuXHQgKiBwcm92aWRpbmcgYSBzbW9vdGhlciBhbmQgbW9yZSBjb250cm9sbGVkIHVzZXIgZXhwZXJpZW5jZSBkdXJpbmcgaW50ZXJhY3Rpb25zLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhcnREcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHQvKiBcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBhY3RpdmVseSBkcmFnZ2luZyB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuXHQgKiBJdCBlbnN1cmVzIHRoYXQgc2Nyb2xsaW5nIG9jY3VycyBvbmx5IGR1cmluZyBhY3RpdmUgZHJhZ2dpbmcuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG5cdC8qIFxyXG5cdCAqIFN0b3JlcyB0aGUgaW5pdGlhbCBYIGNvb3JkaW5hdGUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSByaWdodCBtb3VzZSBidXR0b24uXHJcblx0ICogVGhpcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgbW92ZWQgZHVyaW5nIGRyYWdnaW5nLCBlbmFibGluZyBzbW9vdGggc2Nyb2xsaW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhcnRYOiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKiBcclxuXHQgKiBLZWVwcyB0cmFjayBvZiB0aGUgY29udGFpbmVy4oCZcyBzY3JvbGwgcG9zaXRpb24gYmVmb3JlIHRoZSBkcmFnIGJlZ2lucy5cclxuXHQgKiBUaGlzIGFsbG93cyB1cGRhdGluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHJlYWwtdGltZSBhcyB0aGUgdXNlciBtb3ZlcyB0aGUgbW91c2UuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzY3JvbGxMZWZ0OiBudW1iZXIgPSAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBvbmVudCwgaW5qZWN0aW5nIHNlcnZpY2VzIG5lZWRlZCBmb3IgZm9ybSBidWlsZGluZyxcclxuXHQgKiBkeW5hbWljIGNvbnRlbnQgaGFuZGxpbmcsIGFuZCBjaGFuZ2UgZGV0ZWN0aW9uLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBmb3JtQnVpbGRlciBTZXJ2aWNlIGZvciBjcmVhdGluZyBmb3JtIGNvbnRyb2xzIGFuZCBtYW5hZ2luZyBmb3JtIGxvZ2ljLlxyXG5cdCAqIEBwYXJhbSBkeW5hbWljQnVpbGRlciBTZXJ2aWNlIGZvciBkeW5hbWljYWxseSBjb25zdHJ1Y3RpbmcgdGFibGUgY29tcG9uZW50cy5cclxuXHQgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3IgU2VydmljZSBmb3IgZGV0ZWN0aW5nIGFuZCB0cmlnZ2VyaW5nIFVJIGNoYW5nZXMuXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIGR5bmFtaWNCdWlsZGVyOiBEeW5hbWljQnVpbGRlcixcclxuXHRcdHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXHJcblx0KSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG5cdCAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjaGVja2VkIHRoZSBkaXJlY3RpdmUnc1xyXG5cdCAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcblx0ICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHZpZXcgb3IgY29udGVudCBjaGlsZHJlbiBoYXZlIGJlZW4gY2hlY2tlZC5cclxuXHQgKiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgaW5zdGFudGlhdGVkLlxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY2xhc3NUeXBlKSB7XHJcblx0XHRcdC8qIEdldCB0aGUgdGFibGUgZGVmaW5pdGlvbiB1c2luZyB0aGUgY2xhc3MgdHlwZSAqL1xyXG5cdFx0XHR2YXIgdGFibGVEZWZpbml0aW9uID0gZ2V0VGFibGVEZWZpbml0aW9uKHRoaXMuY2xhc3NUeXBlKTtcclxuXHRcdFx0aWYgKHRhYmxlRGVmaW5pdGlvbikge1xyXG5cdFx0XHRcdHRoaXMuY29sdW1ucyA9IFsuLi50YWJsZURlZmluaXRpb24hLmNvbHVtbnMgPz8gW11dO1xyXG5cdFx0XHRcdGlmICh0aGlzLnJvd01lbnVJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGFjdGlvbiBjb2x1bW4gYWxyZWFkeSBleGlzdHMgKi9cclxuXHRcdFx0XHRcdHZhciBhY3Rpb25Db2xtdW4gPSB0aGlzLl9jb2x1bW5zPy5maW5kKHggPT4geC5uYW1lID09ICdhY3Rpb24nKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBzbywganVzdCBhZGQgdGhlIG1lbnUgaXRlbXMgdG8gaXQgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb25Db2xtdW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRhY3Rpb25Db2xtdW4ubWVudSB8fD0geyBpY29uOiAnbW9yZV92ZXJ0JyB9O1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJvd01lbnVJdGVtcy5mb3JFYWNoKHkgPT4gYWN0aW9uQ29sbXVuIS5tZW51IS5pdGVtcz8udW5zaGlmdCh5KSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogT3RoZXJ3aXNlIGFkZCBhIG5ldyBvbmUgKi9cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9jb2x1bW5zLnB1c2gobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0XHRpbmRleDogMjAwMCxcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdG1lbnU6IHsgaWNvbjogJ21vcmVfdmVydCcsIGl0ZW1zOiB0aGlzLnJvd01lbnVJdGVtcyB9LFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0c3RpY2t5RW5kOiB0cnVlXHJcblx0XHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMucm93QWN0aW9uKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9jb2x1bW5zLnB1c2gobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdG5hbWU6ICdhY3Rpb24nLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0bWVudTogdGhpcy5yb3dBY3Rpb24sXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHN0aWNreUVuZDogdHJ1ZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogQWRkIGNoZWNrYm94IGNvbHVtbiAqL1xyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sdW1ucy51bnNoaWZ0KG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdG5hbWU6ICdzZWxlY3QnLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHN0aWNreTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJ1aWxkIGRpc3BsYXllZCBjb2x1bW5zICYgZmlsdGVyICovXHJcblx0XHR0aGlzLmNvbHVtbnMkPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdHRoaXMuZGlzcGxheWVkQ29sdW1ucyQgPSBvZih0aGlzLmNvbHVtbnM/LmZpbHRlcih4ID0+ICF0aGlzLmV4Y2x1ZGVkQ29sdW1ucz8uaW5jbHVkZXMoeC5uYW1lKSk/Lm1hcChjID0+IGMubmFtZSkpO1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZEZpbHRlckNvbHVtbnMkID0gb2YodGhpcy5jb2x1bW5zPy5maWx0ZXIoeCA9PiAhdGhpcy5leGNsdWRlZENvbHVtbnM/LmluY2x1ZGVzKHgubmFtZSkpPy5tYXAoYyA9PiBgZmlsdGVyLiR7KGMuZmlsdGVyIHx8IGMubmFtZSl9YCkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2V0IHRoZSB0YWJsZSBjb2x1bW5zICovXHJcblx0XHR0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuXHRcdGlmIChjb250YWluZXIpIHtcclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIERpc2FibGUgdGhlIGNvbnRleHQgbWVudSBvbiByaWdodC1jbGljayB0byBhbGxvdyBzbW9vdGggc2Nyb2xsaW5nIFxyXG5cdFx0XHQgKiB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBiZWhhdmlvci5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlOiBNb3VzZUV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xyXG5cclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIFN0YXJ0IGRyYWdnaW5nIHdoZW4gdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIChidXR0b24gPT09IDIpLlxyXG5cdFx0XHQgKiBUaGlzIHNhdmVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGFuZCBzY3JvbGwgc3RhdGUgZm9yIGxhdGVyIHVzZSBkdXJpbmcgbW92ZW1lbnQuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoZS5idXR0b24gPT09IDIgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdC8qIFByZXZlbnRzIGFueSBkZWZhdWx0IGJlaGF2aW9yIGFzc29jaWF0ZWQgd2l0aCByaWdodC1jbGljayAqL1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zdGFydERyYWdnaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgaW5pdGlhbCBYIHBvc2l0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLnN0YXJ0WCA9IGUucGFnZVggLSBjb250YWluZXIub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRcdFx0XHQvKiBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxMZWZ0ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgY29udGFpbmVyLlxyXG5cdFx0XHQgKiBUaGlzIGVuc3VyZXMgdGhlIHNjcm9sbGluZyBzdG9wcyBldmVuIGlmIHRoZSB1c2VyIG1vdmVzIHRoZSBjdXJzb3Igb3V0c2lkZSB0aGUgYm91bmRhcmllcy5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuc3RvcERyYWdnaW5nKGUpKTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAob24gbW91c2UgdXApLlxyXG5cdFx0XHQgKiBUaGlzIHByZXZlbnRzIGZ1cnRoZXIgc2Nyb2xsIG1vdmVtZW50cyBhZnRlciB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnN0b3BEcmFnZ2luZyhlKSk7XHJcblxyXG5cdFx0XHQvKiBcclxuXHRcdFx0ICogSGFuZGxlIHRoZSBhY3R1YWwgZHJhZ2dpbmcgKHNjcm9sbGluZykgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQuXHJcblx0XHRcdCAqIFRoaXMgY2FsY3VsYXRlcyB0aGUgbW92ZW1lbnQgYW5kIHVwZGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdC8qIElmIGRyYWdnaW5nIGlzIG5vdCBhY3RpdmUgb3Igc2Nyb2xsIGNvbnRhaW5lciBpcyB1bmRlZmluZWQsIGV4aXQgKi9cclxuXHRcdFx0XHRpZiAoIXRoaXMuc3RhcnREcmFnZ2luZyB8fCAhdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdC8qIFByZXZlbnQgZGVmYXVsdCBhY3Rpb24gdG8gZW5zdXJlIHNtb290aCBiZWhhdmlvciAqL1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IG1vdXNlIFggcG9zaXRpb24gKi9cclxuXHRcdFx0XHRjb25zdCB4ID0gZS5wYWdlWCAtIGNvbnRhaW5lci5vZmZzZXRMZWZ0O1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIChhbXBsaWZpZWQgZm9yIHNwZWVkKSAqL1xyXG5cdFx0XHRcdGNvbnN0IHdhbGsgPSAoeCAtIHRoaXMuc3RhcnRYKSAqIDI7XHJcblxyXG5cdFx0XHRcdC8qIFVwZGF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIG1vdmVtZW50ICovXHJcblx0XHRcdFx0Y29udGFpbmVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBkYXRlQ29sdW1ucygpOiB2b2lkIHtcclxuXHRcdC8qIFNvcnQgdGhlIGNvbHVtbnMgYnkgaW5kZXggKi9cclxuXHRcdFV0aWxzLnNvcnRBcnJheSh0aGlzLmNvbHVtbnMgfHwgW10sICdpbmRleCcpO1xyXG5cclxuXHRcdC8qIFRyaWdnZXIgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zU3ViamVjdC5uZXh0KHRoaXMuY29sdW1ucyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3VudHMgdmlzaWJsZSBhY3Rpb24gbWVudXNcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93OiBhbnksIGNvbHVtbjogVGFibGVDb2x1bW4pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID8/IC0xKSA+IDA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGAke2l0ZW0uaWR9YDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zVHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgcm93IGNsaWNrIGV2ZW50XHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJvd0NsaWNrKGluZGV4OiBhbnksIHJvdzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZW1wbGF0ZVJlZikge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XHJcblx0XHRcdHRoaXMuZXhwYW5kZWRSb3cgPSB0aGlzLmV4cGFuZGVkUm93ID09PSByb3cgPyBudWxsIDogcm93O1xyXG5cdFx0XHRpZiAodGhpcy5kZXRhaWxzVGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0XHR0aGlzLmR5bmFtaWNCdWlsZGVyLmNvbXBpbGVIdG1sKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmLmdldChpbmRleCksIHRoaXMuZGV0YWlsc1RlbXBsYXRlLCByb3cpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2sgd2l0aCB0aGUgcmlnaHQgYnV0dG9uXHJcblx0ICogQHBhcmFtIGV2ZW50IE1vdXNlRXZlbnQsIGl0IGNvbnRhaW5zIHRoZSBjb29yZGluYXRlc1xyXG5cdCAqIEBwYXJhbSBpdGVtIE91ciBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgcm93IG9mIHRoZSB0YWJsZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dSaWdodENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBhbnkpIHtcclxuXHRcdGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucm93Q29udGV4dE1lbnVUcmlnZ2Vycz8udG9BcnJheSgpPy5mb3JFYWNoKHggPT4geC5jbG9zZU1lbnUoKSk7XHJcblx0XHR2YXIgbWVudVRyaWdnZXIgPSB0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZmlsdGVyKHggPT4geFsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCdpZCcpID09IGBtZW51LSR7aXRlbS5pZH1gKVswXTtcclxuXHRcdGlmIChtZW51VHJpZ2dlciAhPSBudWxsKSB7XHJcblx0XHRcdC8qIEF2b2lkcyB0byBzaG93IHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoZSByaWdodC1jbGljayBtZW51IG9mIHRoZSBicm93c2VyICovXHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHQvKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZW51ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyWydfZWxlbWVudCddPy5uYXRpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogJHtldmVudC5jbGllbnRYfXB4OyB0b3A6ICR7ZXZlbnQuY2xpZW50WX1weGApO1xyXG5cclxuXHRcdFx0LyogUGFzcyB0byB0aGUgbWVudSB0aGUgY3VycmVudCBvYmplY3QgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIubWVudURhdGEgPSB7IGl0ZW06IGl0ZW0gfVxyXG5cclxuXHRcdFx0LyogT3BlbiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlci5vcGVuTWVudSgpO1xyXG5cclxuXHRcdFx0LyogSGFuZGxlIGNsaWNrcyBvbiB0aGUgbWVudSBvdmVybGF5ICovXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpWzBdPy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChvZmZFdmVudDogYW55KSA9PiB7XHJcblx0XHRcdFx0b2ZmRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRtZW51VHJpZ2dlciEuY2xvc2VNZW51KCk7XHJcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgbW9kZWwgY2hhbmdlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTW9kZWxDaGFuZ2UoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCk6IHZvaWQge1xyXG5cdFx0aWYgKHR5cGVvZiBjb2x1bW4/LmV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNvbHVtbi5ldmVudChyb3csIGZvcm1Hcm91cCwgY29sdW1uLmV2ZW50QXJncyA/PyB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBrZXlkb3duIGVudGVyIG9mIDxpbnB1dD4gYW5kIDx2ZC1zZWxlY3Q+XHJcblx0ICogQHBhcmFtICRldmVudCBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuXHRcdCgkZXZlbnQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uYmx1cigpO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBhbiBlbnRpdHlcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBmaWVsZE5hbWUgXHJcblx0ICogQHBhcmFtIHBhdGggXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoKHJvdzogYW55LCBmaWVsZHM6IEFycmF5PHN0cmluZz4sIHZhbHVlOiBhbnksIGluY2x1ZGVzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEdldCBlbnRpdHkgYnkgSUQgKi9cclxuXHRcdGxldCBlbnRpdHkgPSB0aGlzLmRhdGFTb3VyY2UuaXRlbXM/LmZpbHRlcigoeDogYW55KSA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlPy5yZW5kZXJSb3dzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGEgc3RyaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24uXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIGFuIGlucHV0IGV4cHJlc3Npb24gdGhhdCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uIFxyXG5cdCAqIElmIGl0J3MgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0gYW5kIGNvbnRleHQuIFxyXG5cdCAqIElmIGl0J3MgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMtaXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgZXhwcmVzc2lvbiB0byBoYW5kbGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbi5cclxuXHQgKiBAcmV0dXJucyAtIFRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQsIG9yIHRoZSBzdHJpbmcgZXhwcmVzc2lvbiBpdHNlbGYuXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nIHwgRnVuY3Rpb24sIGl0ZW06IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzeSAoZS5nLiwgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eSkgKi9cclxuXHRcdGlmICghZXhwcmVzc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgaXRlbSBhbmQgY29udGV4dCAqL1xyXG5cdFx0aWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBleHByZXNzaW9uKGl0ZW0sIHRoaXMuY29udGV4dCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogSWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIGEgc3RyaW5nIGFuZCByZXR1cm4gaXQgKi9cclxuXHRcdHJldHVybiBleHByZXNzaW9uO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbiBhbiBvYmplY3QgYmFzZWQgb24gYSBkb3Qtc2VwYXJhdGVkIHBhdGguXHJcblx0ICogQHBhcmFtIHJvdyAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nIHNldC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIC0gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXROZXN0ZWRQcm9wZXJ0eShyb3c6IGFueSwgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIFNwbGl0IHRoZSBwcm9wZXJ0eVBhdGggaW50byBhbiBhcnJheSBvZiBrZXlzICovXHJcblx0XHRjb25zdCBrZXlzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcuJyk7XHJcblxyXG5cdFx0LyogVXNlIHNsaWNlIHRvIGdldCBhbGwga2V5cyBleGNlcHQgdGhlIGxhc3Qgb25lIGFuZCByZWR1Y2UgdG8gdHJhdmVyc2UgdG8gdGhlIHNlY29uZC10by1sYXN0IGxldmVsICovXHJcblx0XHRrZXlzLnNsaWNlKDAsIC0xKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgJiYgYWNjW2tleV0sIHJvdylba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyByb3cgY2xhc3Nlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0Um93Q2xhc3Nlcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdCdndC14cyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuU20sXHJcblx0XHRcdCdndC1tZCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTWQsXHJcblx0XHRcdCdndC1sZyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWGwsXHJcblx0XHRcdCdndC14eGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlh4bCxcclxuXHRcdFx0J2hpZGRlbic6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTm9uZSxcclxuXHRcdFx0J3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmVcclxuXHRcdH0sIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIHRoaXMuY29udGV4dCkgOiB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2cgdG8gY29uc29sZVxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFxyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XHJcblx0XHRjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBUZXJtaW5hdGVzIHRoZSBkcmFnZ2luZyBhY3Rpb24gYnkgcmVzZXR0aW5nIHRoZSBgaXNEcmFnZ2luZ2AgZmxhZyBhZnRlciBhIGJyaWVmIGRlbGF5LlxyXG5cdCAqIElmIHRoZSBgc2Nyb2xsQ29udGFpbmVyYCBpcyBkZWZpbmVkLCBpdCBhbHNvIHJlbW92ZXMgdGhlICdncmFiYmluZycgY2xhc3MgXHJcblx0ICogZnJvbSB0aGUgY29udGFpbmVyIGVsZW1lbnQsIHdoaWNoIHJldmVydHMgdGhlIGN1cnNvciBiYWNrIHRvIGl0cyBkZWZhdWx0IHN0YXRlLlxyXG5cdCAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2aXN1YWwgZmVlZGJhY2sgKGdyYWJiaW5nIGN1cnNvcikgaXMgb25seSBhY3RpdmUgZHVyaW5nIFxyXG5cdCAqIHRoZSBkcmFnIG9wZXJhdGlvbiBhbmQgaXMgcHJvcGVybHkgcmVtb3ZlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIGludGVyYWN0aW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcERyYWdnaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvKiBSZXNldCBkcmFnZ2luZyBzdGF0ZSB0byBzdG9wIHRoZSBzY3JvbGwgaW50ZXJhY3Rpb24gKi9cclxuXHRcdHRoaXMuc3RhcnREcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qIFxyXG5cdFx0ICogSW50cm9kdWNlIGEgc2xpZ2h0IGRlbGF5IGJlZm9yZSByZXNldHRpbmcgdGhlIGRyYWdnaW5nIHN0YXRlLlxyXG5cdFx0ICogVGhpcyBhbGxvd3MgZm9yIHNtb290aGVyIHRyYW5zaXRpb25zIGFuZCBlbnN1cmVzIHRoYXQgYW55IGZpbmFsIHNjcm9sbCBhZGp1c3RtZW50c1xyXG5cdFx0ICogYXJlIGFwcGxpZWQgYmVmb3JlIG1hcmtpbmcgdGhlIGRyYWdnaW5nIG9wZXJhdGlvbiBhcyBjb21wbGV0ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdC8qIFJlc2V0IGRyYWdnaW5nIHN0YXRlIHRvIHN0b3AgdGhlIHNjcm9sbCBpbnRlcmFjdGlvbiAqL1xyXG5cdFx0XHR0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIFJlc3RvcmUgdGhlIGRlZmF1bHQgY3Vyc29yICovXHJcblx0XHRcdGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ3JhYmJpbmcnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgMjAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibG9hZGluZy1wcm9ncmVzc1wiICpuZ0lmPVwiIXN0YXRpY1wiPlxyXG5cdDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJkYXRhU291cmNlPy5pc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSAjcmVnaW9uIERhdGEgdGFibGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtdGFibGUtY29udGFpbmVyIHNjcm9sbGJhci1zZWNvbmRhcnlcIiBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3knOiBzdGlja3l9XCIgI3Njcm9sbENvbnRhaW5lcj5cclxuXHQ8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhc3RpY2t5ICYmICFkZXRhaWxzVGVtcGxhdGUgJiYgIXRlbXBsYXRlUmVmLCAndGFibGUtc3RpY2snOiBzdGlja3l9XCIgW3RyYWNrQnldPVwidHJhY2tCeVwiIG1hdFNvcnQgbWF0U29ydERpc2FibGVDbGVhciBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlfHwnaWQnXCIgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiIG11bHRpVGVtcGxhdGVEYXRhUm93cz5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHRcdDwhLS0gI3JlZ2lvbiBDb2x1bW4gZGVmIC0tPlxyXG5cdFx0XHQ8bmctY29udGFpbmVyIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI2hlYWRlciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiBsZXQtaGVhZGVyVGV4dD1cImhlYWRlclRleHRcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2hlYWRlclRleHQ6IGNvbHVtbi5oZWFkZXIgfCBmdW5jOmNvbnRleHR9XCI+XHJcblx0XHRcdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0XHRcdDxtYXQtY2hlY2tib3ggKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBkYXRhU291cmNlLnRvZ2dsZVNlbGVjdCgkZXZlbnQsIHNlbGVjdEFsbEZpbHRlcikgOiBudWxsXCIgW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLnBhZ2luYXRvcj8ubGVuZ3RoXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmIGRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmICFkYXRhU291cmNlLmlzQWxsU2VsZWN0ZWQoKVwiPjwvbWF0LWNoZWNrYm94PlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlICE9IENvbHVtblR5cGUuQ2hlY2tib3hcIiBbbWF0VG9vbHRpcF09XCJoZWFkZXJUZXh0XCI+e3toZWFkZXJUZXh0fX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3RoPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PHRkIG1hdC1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvdzsgbGV0IHJvd0luZGV4ID0gZGF0YUluZGV4XCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXA/Y29sdW1uLnRvb2x0aXAocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiBbbWF0VG9vbHRpcENsYXNzXT1cImNvbHVtbi50b29sdGlwQ2xhc3M/PycnXCIgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sIHJvdylcIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBDaGVja2JveCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBFbnVtIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVudW1NZXRhZGF0YTsgZWxzZSBub0VudW1NZXRhZGF0YVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpIDwgMlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgbGV0LWRpc3BsYXlWYWx1ZT1cImRpc3BsYXlWYWx1ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZGlzcGxheVZhbHVlOiBjb2x1bW4uZW51bU1ldGFkYXRhW2l0ZW1dLmRpc3BsYXkgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaSA9PT0gMSAmJiByb3dWYWx1ZT8ubGVuZ3RoID4gMlwiIFttYXRUb29sdGlwXT1cIihyb3dWYWx1ZSB8IHNsaWNlOjIgfCBtYXA6Y29sdW1uLmVudW1NZXRhZGF0YSB8IG1hcDonZGlzcGxheScpIHwgam9pbjonXFxuJ1wiIG1hdFRvb2x0aXBDbGFzcz1cIm1hdC10b29sdGlwLW11bHRpbGluZVwiPi4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtZGlzcGxheVZhbHVlPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWNoaXAtcm93IGRpc2FibGVSaXBwbGU9XCJ0cnVlXCIgc2VsZWN0YWJsZT1cImZhbHNlXCIgW21hdFRvb2x0aXBdPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGRpc3BsYXlWYWx1ZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWNoaXAtcm93PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInJvd1ZhbHVlID49IDBcIiBjbGFzcz1cIm5hXCIgW2lubmVySHRtbF09XCIoY29sdW1uLmVudW1NZXRhZGF0YVtyb3dWYWx1ZV18fHt9KS5kaXNwbGF5XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vRW51bU1ldGFkYXRhPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaTwyXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2l0ZW0gfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zbWFsbD48c21hbGwgKm5nSWY9XCJpPT0xICYmIHJvd1ZhbHVlPy5sZW5ndGggPiAyXCI+LCAuLi48L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e3Jvd1ZhbHVlIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXgsIHNlbGVjdCwgdHlwZSB7dHlwZX0gb3RoZXIge3t7cm93VmFsdWUgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeH19fX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjcmVjdXJzaXZlQ29udGFpbmVyIGxldC1jb2x1bW5OYW1lU2VnbWVudHM9XCJzZWdtZW50c1wiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtcGFyZW50Rm9ybUdyb3VwPVwicGFyZW50Rm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiB0aGUgY29sdW1uTmFtZVNlZ21lbnRzIGFycmF5IGlzIGVtcHR5LCB3ZSdyZSBhdCB0aGUgbGVhZiBub2RlIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbk5hbWVTZWdtZW50cy5sZW5ndGg7IGVsc2Ugbm90TGFzdFNlZ21lbnRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVG9nZ2xlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOmhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbiwgcGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXApXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBWRC1TZWxlY3QgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8dmQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbZW51bU1ldGFkYXRhXT1cImNvbHVtbi5lbnVtTWV0YWRhdGFcIiBbZW51bUZpbHRlcl09XCJjb2x1bW4uZW51bUZpbHRlciB8IGZ1bmM6cGFyZW50Rm9ybUdyb3VwLnZhbHVlOmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbZGVmYXVsdE9wdGlvbl09XCJjb2x1bW4uZGVmYXVsdE9wdGlvbj8/dHJ1ZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpwYXRjaChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIFtjb2x1bW4ubmFtZV0sIHJvd1ZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RMYXN0U2VnbWVudD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIG5vdCB0aGUgbGFzdCBzZWdtZW50LCBjcmVhdGUgYSBuZXN0ZWQgZm9ybSBncm91cCAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImNvbHVtbk5hbWVTZWdtZW50c1swXVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIHNlZ21lbnRzIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW5OYW1lU2VnbWVudHMuc2xpY2UoMSksIHBhcmVudEZvcm1Hcm91cDpmb3JtR3JvdXAsIGZvcm1Hcm91cDogZm9ybUdyb3VwLmdldChjb2x1bW5OYW1lU2VnbWVudHNbMF0pfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5Ub2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9ybUFycmF5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTtoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHJvdywgdW5kZWZpbmVkKTtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRGF0ZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7cm93VmFsdWUgfCBkYXRlOmNvbHVtbi5zaG9ydERhdGU/J2RkLk1NLnl5eXknOidkZC5NTS55eXl5IEhIOm1tOnNzJ319PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgbWF0SW5wdXQgKm5nSWY9XCIhZm9ybUFycmF5XCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIG5hbWU9XCJ7e2NvbHVtbi5uYW1lfX17e3Jvd0luZGV4fX1cIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7KGNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6cGF0Y2gocm93LCBbY29sdW1uLm5hbWVdLCAkZXZlbnQsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKSk7XCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFmb3JtQXJyYXlcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgKm5nSWY9XCIhZm9ybUFycmF5XCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbj8uZW51bUZpbHRlciAgfCBmdW5jOnJvdzpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7XCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LnZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5BY3Rpb25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubWVudVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51IVwiICpuZ0lmPVwibWVudT8ubWF0TWVudSAmJiAhcm93LmxvY2tlZCAmJiBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdywgY29sdW1uKVwiPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dmQtZHluYW1pYy1tZW51IFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiICNtZW51PjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm1lbnVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIGljb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvblwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/Lm1hdEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/Lm1hdEljb24hLCByb3cpfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LnN2Z0ljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIiBbc3ZnSWNvbl09XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5zdmdJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LmZvbnRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW2ZvbnRJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmZvbnRJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvbkJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29sdW1uLmljb25CdXR0b24/LmV2ZW50P2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudChyb3csIGNvbnRleHQpOm51bGxcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwie3tjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkNsYXNzPz8nJywgcm93KVwiPnt7aGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbj8/J3JhZGlvX2J1dHRvbl9jaGVja2VkJywgcm93KSB8fCAncmFkaW9fYnV0dG9uX2NoZWNrZWQnfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIdG1sXT1cInJvd1ZhbHVlPz8nJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciByb3cgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBmaWx0ZXJhYmxlXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJmaWx0ZXIue3tjb2x1bW4uZmlsdGVyIHx8IGNvbHVtbi5uYW1lfX1cIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHRcdDx0aCBtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLCAnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLCAnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLCAnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLCAnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLCAnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsICdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmV9XCI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIihjb2x1bW4uZW5kcG9pbnQgfHwgY29sdW1uLmVudW1UeXBlIHx8IGNvbHVtbi5vcHRpb25zKSBlbHNlIG5vdFNlbGVjdEZpbHRlclwiIGZpbHRlci1zZWxlY3QgW2VuZHBvaW50XT1cImNvbHVtbi5lbmRwb2ludFwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbi5lbnVtRmlsdGVyIHwgZnVuYzp7fTpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW3RleHRdPVwiY29sdW1uLmZpbHRlck9wdGlvblRleHQgfHwgJ25hbWUnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBmaWx0ZXIgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90U2VsZWN0RmlsdGVyPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibm90U2VsZWN0RmlsdGVyICYmIChjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0SW5wdXQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5OdW1iZXIpIGVsc2Ugbm90SW5wdXRGaWx0ZXJcIiBmaWx0ZXItaW5wdXQgW29ubHlOdW1iZXJdPVwiY29sdW1uLmZpbHRlcklucHV0TnVtYmVyPz9mYWxzZVwiIFtvcGVyYXRvcl09XCIhdXNlRmlsdGVyT3BlcmF0b3IgPyB1bmRlZmluZWQgOiBjb2x1bW4uZmlsdGVyT3BlcmF0b3JcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RJbnB1dEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuRGF0ZSBlbHNlIG5vdERhdGVGaWx0ZXJcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gZmlsdGVyIChjbGVhcikgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90RGF0ZUZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQWN0aW9uXCIgZmlsdGVyLWNsZWFyPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0PC90aD5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0XHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XHJcblx0XHRcdDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4XCIgW2F0dHIuY29sc3Bhbl09XCIoZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYyk/Lmxlbmd0aFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3ctZGV0YWlsXCIgW0BkZXRhaWxFeHBhbmRdPVwicm93ID09IGV4cGFuZGVkUm93ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCIgI2RldGFpbHNUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVJlZiAmJiByb3cgPT09IGV4cGFuZGVkUm93XCI+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjsgY29udGV4dDp7cm93OiByb3csIGluZGV4OiBpbmRleCwgY29udGV4dDogY29udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyYWJsZVwiPlxyXG5cdFx0XHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZEZpbHRlckNvbHVtbnMkIHwgYXN5bmNcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBzdGlja3k6IHN0aWNreUZpbHRlclwiPjwvdHI+XHJcblx0XHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIERldHJhaWxzIHJvdyAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzVGVtcGxhdGUgfHwgdGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBSb3cgc2hvd24gd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBkYXRhLi0tPlxyXG48ZGl2IGNsYXNzPVwibWF0LWNlbGwgcGFkIHRhYmxlLWVtcHR5IHR4dC1pdGFsaWNcIiAqbmdJZj1cIiFkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCAmJiAhZGF0YVNvdXJjZT8udG90YWxcIiBpMThuPVwiQEBub1Jlc3VsdHNGb3VuZFwiPk5vIHJlc3VsdHMgd2VyZSBmb3VuZC48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG48Y29kZSAqbmdJZj1cImRlYnVnVmFsdWVcIj5cclxuXHQ8cHJlPnt7Zm9ybVZhbHVlIHwganNvbn19PC9wcmU+XHJcbjwvY29kZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWZvb3RlclwiIGxheW91dD1cInJvd1wiPlxyXG5cdDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG5cdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hYmxlXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIj48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PiJdfQ==
804
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqTixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNB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Z0JBU0MsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBVVRPX1NUWUxFLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgRHluYW1pY0J1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaGVscGVycy9keW5hbWljLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBBY3Rpb25JdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL21vZGVscy9hY3Rpb24taXRlbSc7XHJcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuLi8uLi9lbnVtcy9ncmlkJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGFibGUtY29sdW1uLXR5cGUnO1xyXG5pbXBvcnQgeyBnZXRUYWJsZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGUtY29sdW1uJztcclxuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuZGF0YS1zb3VyY2UnO1xyXG5pbXBvcnQgeyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi90YWJsZS5zdGF0aWMtZGF0YS1zb3VyY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICd2ZC1keW5hbWljLXRhYmxlJyxcclxuXHR0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWydkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0YW5pbWF0aW9uczogW1xyXG5cdFx0dHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG5cdFx0XHRzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJyB9KSksXHJcblx0XHRcdHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiBBVVRPX1NUWUxFIH0pKSxcclxuXHRcdFx0dHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuXHRcdF0pLFxyXG5cdF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSB0YWJsZSBjb21wb25lbnQsIHVzZWQgZm9yIGFjY2Vzc2luZyBNYXRUYWJsZSBmdW5jdGlvbmFsaXRpZXMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgndGFibGUnKVxyXG5cdHB1YmxpYyB0YWJsZT86IE1hdFRhYmxlPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZXMgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50cyBmb3IgZGV0YWlsIHRlbXBsYXRlcywgd2l0aCBWaWV3Q29udGFpbmVyUmVmIFxyXG5cdCAqIGFsbG93aW5nIGR5bmFtaWMgaW5zZXJ0aW9uIG9mIHZpZXdzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oJ2RldGFpbHNUZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGVSZWY/OiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIGEgY29udGVudCBjaGlsZCB0ZW1wbGF0ZSAoZGV0YWlscyB0ZW1wbGF0ZSkgb2YgdHlwZSBUZW1wbGF0ZVJlZiwgXHJcblx0ICogdXNlZCBmb3IgcmVuZGVyaW5nIGN1c3RvbSB0ZW1wbGF0ZXMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXHJcblx0cHVibGljIHRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YSBzb3VyY2UgZm9yIHRoZSB0YWJsZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBhIGN1c3RvbSBUYWJsZURhdGFTb3VyY2UgXHJcblx0ICogaW1wbGVtZW50YXRpb24gb3IgYSBkeW5hbWljIG9iamVjdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+IHwgYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBkYXRhIGZvciB0aGUgdGFibGUsIHdoaWNoIGlzIHNldCBhcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS5cclxuXHQgKiBUaGlzIG1ldGhvZCBhbHNvIGluaXRpYWxpemVzIHNvcnRpbmcgYW5kIHBhZ2luYXRpb24gZm9yIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UoZGF0YSk7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMubWF0U29ydDtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLl9wYWdpbmF0b3I7XHJcblx0XHR0aGlzLnBhZ2luYWJsZSA9IHRydWU7XHJcblx0XHR0aGlzLnN0YXRpYyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdGl2ZSBGb3JtQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmb3JtIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgXHJcblx0ICogZm9ybSBjb250cm9scyBhbmQgc3luY2hyb25pemUgdGFibGUgZGF0YSB3aXRoIGZvcm0gY2hhbmdlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgRm9ybUFycmF5IGZvciBtYW5hZ2luZyBmb3JtIGNvbnRyb2xzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUuIFxyXG5cdCAqIEl0IHNldHMgdGhlIHRhYmxlIGRhdGEgYW5kIHN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybSB2YWx1ZXMgdG8gXHJcblx0ICogdXBkYXRlIHRoZSB0YWJsZSBkeW5hbWljYWxseS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgZm9ybUFycmF5KCk6IEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtQXJyYXk7IH1cclxuXHRwdWJsaWMgc2V0IGZvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSkge1xyXG5cdFx0dGhpcy5fZm9ybUFycmF5ID0gZm9ybUFycmF5O1xyXG5cdFx0dGhpcy5kYXRhID0gdGhpcy5fZm9ybUFycmF5Py52YWx1ZTtcclxuXHJcblx0XHQvKiBVcGRhdGUgdGhlIHRhYmxlIGRhdGEgd2hlbiB0aGUgZm9ybSBhcnJheSB2YWx1ZXMgY2hhbmdlICovXHJcblx0XHR0aGlzLl9mb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHRpZiAoeC5sZW5ndGggIT09IHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9mb3JtQXJyYXk/LnZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHRlciBmb3IgcmV0cmlldmluZyB0aGUgcmF3IHZhbHVlIG9mIHRoZSBmb3JtLCB3aXRob3V0IGFwcGx5aW5nIGFueSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBmb3JtVmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5nZXRSYXdWYWx1ZSgpOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVidWcgbW9kZSBmb3IgbG9nZ2luZyBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MgdHlwZSB1c2VkIGluIHRoaXMgY29tcG9uZW50LCBcclxuXHQgKiB0eXBpY2FsbHkgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvciBtb2RlbCBvZiB0aGUgZGF0YS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQgb3IgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIHRhYmxlIGlzIGJlaW5nIHVzZWQuXHJcblx0ICogVGhpcyBhbGxvd3MgcGFzc2luZyBhZGRpdGlvbmFsIG1ldGFkYXRhIG9yIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGFwcGx5aW5nIGZpbHRlcnMgdG8gdGhlIGRhdGEgc291cmNlLiBJdCBkZWZpbmVzIGNyaXRlcmlhIG9yIGNvbmRpdGlvbnMgXHJcblx0ICogdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2VGaWx0ZXI6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgdXNlcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS4gXHJcblx0ICogV2hlbiB0cnVlLCB0aGUgdGFibGUgZG9lcyBub3QgcmVseSBvbiBkeW5hbWljIGRhdGEgY2hhbmdlcy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGZpbHRlcmFibGUgYnkgdGhlIHVzZXIuXHJcblx0ICogSWYgdHJ1ZSwgZmlsdGVyaW5nIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlcnMgb3IgY29sdW1ucyBzaG91bGQgc3RpY2sgXHJcblx0ICogdG8gdGhlIHZpZXdwb3J0IGR1cmluZyBzY3JvbGxpbmcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG92ZXJhbGwgd2lkdGggb2YgdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHRhYmxlV2lkdGg/OiBudW1iZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIG9wZXJhdG9yIGlzIHVzZWQgaW4gdGFibGUgZmlsdGVyaW5nLlxyXG5cdCAqIElmIHRydWUsIGZpbHRlcmluZyBsb2dpYyB3aWxsIGFwcGx5IG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFscywgY29udGFpbnMsIGV0Yy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyB1c2VGaWx0ZXJPcGVyYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGFibGUgc3VwcG9ydHMgcGFnaW5hdGlvbi5cclxuXHQgKiBJZiB0cnVlLCBwYWdpbmF0aW9uIGNvbnRyb2xzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGRhdGEuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgJ0NoZWNrYm94JyBjb2x1bW4gaXMgc2hvd24gZm9yIHJvdyBzZWxlY3Rpb24uXHJcblx0ICogSWYgdHJ1ZSwgYSBjaGVja2JveCBjb2x1bW4gd2lsbCBiZSBkaXNwbGF5ZWQgYWxsb3dpbmcgdXNlcnMgdG8gc2VsZWN0IHJvd3MuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBjb2x1bW4gdXNlZCBmb3Igc29ydGluZyB0aGUgdGFibGUgZGF0YS5cclxuXHQgKiBUaGlzIGlucHV0IGRldGVybWluZXMgd2hpY2ggY29sdW1uIHRoZSBzb3J0aW5nIGlzIGFwcGxpZWQgdG8uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxyXG5cdCAqIERlZmF1bHQgaXMgJ2FzYycgKGFzY2VuZGluZykuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9ICdhc2MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgcmVtYWluIHN0aWNreSAoZml4ZWQpIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IFxyXG5cdCAqIHdoZW4gdGhlIHRhYmxlIHNjcm9sbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2VjdGlvbiBvZiB0aGUgdGFibGUgc2hvdWxkIHJlbWFpbiBzdGlja3kgKGZpeGVkKSBcclxuXHQgKiBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCB3aGVuIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGJhY2tpbmcgZmllbGQgZm9yIHRoZSBjb2x1bW5TZXRzIGlucHV0IHByb3BlcnR5LlxyXG5cdCAqIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBzZXRzIG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSxcclxuXHQgKiBlbmFibGluZyBjb250cm9sIG92ZXIgaG93IHRoZSB2YWx1ZSBpcyBhY2Nlc3NlZCBvciBtb2RpZmllZCB0aHJvdWdoXHJcblx0ICogdGhlIHB1YmxpYyBnZXR0ZXIgYW5kIHNldHRlci5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2NvbHVtblNldHM/OiBzdHJpbmdbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBkaXNwbGF5IHNwZWNpZmljIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIFRoaXMgYXJyYXkgZGVmaW5lcyBzZXRzIG9mIGNvbHVtbnMgdGhhdCBjYW4gYmUgc2hvd25cclxuXHQgKiBiYXNlZCBvbiB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24sIGFsbG93aW5nIGZvciBkeW5hbWljIHRhYmxlXHJcblx0ICogY29sdW1uIGN1c3RvbWl6YXRpb24uXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtblNldHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29sdW1uU2V0czsgfVxyXG5cdHB1YmxpYyBzZXQgY29sdW1uU2V0cyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHsgdGhpcy5fY29sdW1uU2V0cyA9IHZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZXIgZm9yIHJvdyBjbGljayBldmVudHMuIEl0IGVtaXRzIHRoZSBjbGlja2VkIHJvdydzIGRhdGEgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmN0aW9uIHVzZWQgdG8gZHluYW1pY2FsbHkgYXNzaWduIENTUyBjbGFzc2VzIHRvIHRhYmxlIHJvd3MgYmFzZWQgb24gY3VzdG9tIGxvZ2ljLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJvd05nQ2xhc3M/OiBGdW5jdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBhZGRpdGlvbmFsIGRldGFpbHMgYmVsb3cgZWFjaCByb3cuIFxyXG5cdCAqIEl0IGFjY2VwdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZSBrZXkgb3IgaWRlbnRpZmllci5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdGFibGUgaXMgaW4gYSByZWFkb25seSBzdGF0ZS5cclxuXHQgKiBJZiB0cnVlLCBubyBjaGFuZ2VzIGNhbiBiZSBtYWRlIHRvIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcbiAqIElucHV0IHByb3BlcnR5IHRvIGRldGVybWluZSBpZiB0aGUgdGFibGUgaXMgcmVhZG9ubHkuIFxyXG4gKiBVc2VzIGBjb2VyY2VCb29sZWFuUHJvcGVydHlgIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgdHJlYXRlZCBhcyBhIGJvb2xlYW4uXHJcbiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0cHVibGljIHNldCByZWFkb25seShyZWFkb25seTogYW55KSB7XHJcblx0XHR0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZWFkb25seSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGdW5jdGlvbiB0byBmaWx0ZXIgaXRlbXMgd2hlbiBzZWxlY3RpbmcgYWxsIHJvd3MuIFxyXG5cdCAqIEl0IHRha2VzIHZhbHVlLCBpbmRleCwgYW5kIGFycmF5IGFzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGJvb2xlYW4gb3IgdW5rbm93biB0eXBlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdEFsbEZpbHRlcj86ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pID0+IHVua25vd247XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgTWF0U29ydCBkaXJlY3RpdmUgdXNlZCBmb3IgYXBwbHlpbmcgc29ydGluZyBvbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHB1YmxpYyBtYXRTb3J0PzogTWF0U29ydDtcclxuXHJcblx0LyoqXHJcblx0ICogUHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIE1hdFBhZ2luYXRvciB1c2VkIHRvIHBhZ2luYXRlIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgc2V0dGVyIGZvciB0aGUgTWF0UGFnaW5hdG9yLiBXaGVuIHRoZSBwYWdpbmF0b3IgaXMgc2V0LCBpdCBhc3NpZ25zIGl0IFxyXG5cdCAqIHRvIHRoZSBkYXRhIHNvdXJjZSBmb3IgcGFnaW5hdGlvbiBjb250cm9sLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKVxyXG5cdHB1YmxpYyBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcblx0XHRpZiAocGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGFycmF5IHN0b3JpbmcgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwcml2YXRlIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGdldHRlciBhbmQgc2V0dGVyIGZvciB0aGUgdGFibGUgY29sdW1ucy4gXHJcblx0ICogSXQgYWxsb3dzIHRoZSBjb2x1bW5zIHRvIGJlIGN1c3RvbWl6ZWQgYW5kIHVwZGF0ZWQgZHluYW1pY2FsbHkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9XHJcblx0cHVibGljIHNldCBjb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQmVoYXZpb3JTdWJqZWN0IHRvIG1hbmFnZSBhbmQgZW1pdCBjaGFuZ2VzIHRvIHRoZSBjb2x1bW5zIGR5bmFtaWNhbGx5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPihbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9ic2VydmFibGUgdGhhdCB0cmFja3MgYW5kIGVtaXRzIGNoYW5nZXMgdG8gdGhlIGNvbHVtbnMuXHJcblx0ICovXHJcblx0cHVibGljIGNvbHVtbnMkOiBPYnNlcnZhYmxlPFRhYmxlQ29sdW1uW10+ID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgY29sdW1ucyBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgZmlsdGVyYWJsZSBjb2x1bW5zIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHByb3BlcnR5IGZvciByb3ctc3BlY2lmaWMgYWN0aW9uIG1lbnUgaXRlbXMuIFxyXG5cdCAqIERlZmluZXMgYWN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIGNvbnRleHQgbWVudSBmb3IgZWFjaCByb3cuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TWVudUl0ZW1zOiBBY3Rpb25JdGVtW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGEgc2luZ2xlIHJvdyBhY3Rpb24gdG8gYmUgYXBwbGllZCB3aGVuIGludGVyYWN0aW5nIHdpdGggYSByb3cuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93QWN0aW9uPzogQWN0aW9uSXRlbTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHNwZWNpZnlpbmcgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBkaXNwbGF5IGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBleGNsdWRlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFF1ZXJ5TGlzdCB0byByZWZlcmVuY2UgYWxsIE1hdE1lbnVUcmlnZ2VycyBhc3NvY2lhdGVkIHdpdGggcm93IGNvbnRleHQgbWVudXMuXHJcblx0ICogVXNlZCBmb3IgaGFuZGxpbmcgdGhlIGNvbnRleHQgbWVudSBpbnRlcmFjdGlvbnMgb24gdGFibGUgcm93cy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKE1hdE1lbnVUcmlnZ2VyKVxyXG5cdHB1YmxpYyByb3dDb250ZXh0TWVudVRyaWdnZXJzPzogUXVlcnlMaXN0PE1hdE1lbnVUcmlnZ2VyPjtcclxuXHJcblx0LyoqXHJcblx0ICogQ29sdW1uIHR5cGUgZW51bSByZWZlcmVuY2UsIG1hcHBpbmcgdGFibGUgY29sdW1ucyB0byB0aGVpciB0eXBlcyBmb3IgcmVuZGVyaW5nLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBDb2x1bW5UeXBlOiB0eXBlb2YgVGFibGVDb2x1bW5UeXBlID0gVGFibGVDb2x1bW5UeXBlO1xyXG5cclxuXHQvKipcclxuXHQgKiBHcmlkIGVudW0gcmVmZXJlbmNlLCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgZ3JpZCB1c2VkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgR3JpZDogdHlwZW9mIEdyaWQgPSBHcmlkO1xyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseSBleHBhbmRlZCByb3csIHVzZWQgZm9yIGhhbmRsaW5nIHJvdyBleHBhbnNpb24gbG9naWMuXHJcblx0ICovXHJcblx0cHVibGljIGV4cGFuZGVkUm93OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZSBmb3IgcGFnaW5hdGlvbi4gXHJcblx0ICogRGVmYXVsdCB2YWx1ZSBpcyAxNS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIGF2YWlsYWJsZSBwYWdlIHNpemUgb3B0aW9ucyBpbiB0aGUgcGFnaW5hdG9yLlxyXG5cdCAqIERlZmF1bHQgb3B0aW9ucyBpbmNsdWRlIFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbNSwgMTAsIDE1LCAyMCwgMzAsIDUwLCAxMDAsIDIwMF07XHJcblxyXG5cdC8qIFxyXG5cdCAqIFRoaXMgZGVjb3JhdG9yIGJpbmRzIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lciBlbGVtZW50IGJ5IGl0cyB0ZW1wbGF0ZSByZWZlcmVuY2UuXHJcblx0ICogVGhlIGBzY3JvbGxDb250YWluZXJgIHdpbGwgcmVmZXJlbmNlIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgdGVtcGxhdGUgd2l0aCBgI3Njcm9sbENvbnRhaW5lcmAuXHJcblx0ICogSXQgd2lsbCBhbGxvdyBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBmb3IgbWFuYWdpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgc2Nyb2xsQ29udGFpbmVyPzogRWxlbWVudFJlZjtcclxuXHJcblx0LyogXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBhY3RpdmVseSBkcmFnZ2luZyB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuXHQgKiBUaGlzIGZsYWcgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvbmx5IG9jY3VycyB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsXHJcblx0ICogcHJvdmlkaW5nIGEgc21vb3RoZXIgYW5kIG1vcmUgY29udHJvbGxlZCB1c2VyIGV4cGVyaWVuY2UgZHVyaW5nIGludGVyYWN0aW9ucy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0RHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0LyogXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByaWdodCBtb3VzZSBidXR0b24gaXMgYWN0aXZlbHkgZHJhZ2dpbmcgdGhlIHNjcm9sbCBjb250YWluZXIuXHJcblx0ICogSXQgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvY2N1cnMgb25seSBkdXJpbmcgYWN0aXZlIGRyYWdnaW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHQvKiBcclxuXHQgKiBTdG9yZXMgdGhlIGluaXRpYWwgWCBjb29yZGluYXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uLlxyXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIGR1cmluZyBkcmFnZ2luZywgZW5hYmxpbmcgc21vb3RoIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcclxuXHJcblx0LyogXHJcblx0ICogS2VlcHMgdHJhY2sgb2YgdGhlIGNvbnRhaW5lcuKAmXMgc2Nyb2xsIHBvc2l0aW9uIGJlZm9yZSB0aGUgZHJhZyBiZWdpbnMuXHJcblx0ICogVGhpcyBhbGxvd3MgdXBkYXRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBpbiByZWFsLXRpbWUgYXMgdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsTGVmdDogbnVtYmVyID0gMDtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IgZm9yIHRoZSBjb21wb25lbnQsIGluamVjdGluZyBzZXJ2aWNlcyBuZWVkZWQgZm9yIGZvcm0gYnVpbGRpbmcsXHJcblx0ICogZHluYW1pYyBjb250ZW50IGhhbmRsaW5nLCBhbmQgY2hhbmdlIGRldGVjdGlvbi5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZm9ybUJ1aWxkZXIgU2VydmljZSBmb3IgY3JlYXRpbmcgZm9ybSBjb250cm9scyBhbmQgbWFuYWdpbmcgZm9ybSBsb2dpYy5cclxuXHQgKiBAcGFyYW0gZHluYW1pY0J1aWxkZXIgU2VydmljZSBmb3IgZHluYW1pY2FsbHkgY29uc3RydWN0aW5nIHRhYmxlIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yIFNlcnZpY2UgZm9yIGRldGVjdGluZyBhbmQgdHJpZ2dlcmluZyBVSSBjaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBkeW5hbWljQnVpbGRlcjogRHluYW1pY0J1aWxkZXIsXHJcblx0XHRwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuXHQgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG5cdCAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSB2aWV3IG9yIGNvbnRlbnQgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuXHJcblx0ICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNsYXNzVHlwZSkge1xyXG5cdFx0XHQvKiBHZXQgdGhlIHRhYmxlIGRlZmluaXRpb24gdXNpbmcgdGhlIGNsYXNzIHR5cGUgKi9cclxuXHRcdFx0dmFyIHRhYmxlRGVmaW5pdGlvbiA9IGdldFRhYmxlRGVmaW5pdGlvbih0aGlzLmNsYXNzVHlwZSk7XHJcblx0XHRcdGlmICh0YWJsZURlZmluaXRpb24pIHtcclxuXHRcdFx0XHR0aGlzLmNvbHVtbnMgPSBbLi4udGFibGVEZWZpbml0aW9uIS5jb2x1bW5zID8/IFtdXTtcclxuXHRcdFx0XHRpZiAodGhpcy5yb3dNZW51SXRlbXM/Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSBhY3Rpb24gY29sdW1uIGFscmVhZHkgZXhpc3RzICovXHJcblx0XHRcdFx0XHR2YXIgYWN0aW9uQ29sbXVuID0gdGhpcy5fY29sdW1ucz8uZmluZCh4ID0+IHgubmFtZSA9PSAnYWN0aW9uJyk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgc28sIGp1c3QgYWRkIHRoZSBtZW51IGl0ZW1zIHRvIGl0ICovXHJcblx0XHRcdFx0XHRpZiAoYWN0aW9uQ29sbXVuICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0YWN0aW9uQ29sbXVuLm1lbnUgfHw9IHsgaWNvbjogJ21vcmVfdmVydCcgfTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yb3dNZW51SXRlbXMuZm9yRWFjaCh5ID0+IGFjdGlvbkNvbG11biEubWVudSEuaXRlbXM/LnVuc2hpZnQoeSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSBhZGQgYSBuZXcgb25lICovXHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVGFibGVDb2x1bW5UeXBlLkFjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRtZW51OiB7IGljb246ICdtb3JlX3ZlcnQnLCBpdGVtczogdGhpcy5yb3dNZW51SXRlbXMgfSxcclxuXHRcdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdHN0aWNreUVuZDogdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnJvd0FjdGlvbikge1xyXG5cdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdGluZGV4OiAyMDAwLFxyXG5cdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5BY3Rpb24sXHJcblx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRtZW51OiB0aGlzLnJvd0FjdGlvbixcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0c3RpY2t5RW5kOiB0cnVlXHJcblx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBBZGQgY2hlY2tib3ggY29sdW1uICovXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jb2x1bW5zLnVuc2hpZnQobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogJ3NlbGVjdCcsXHJcblx0XHRcdFx0XHRcdGNvbHVtblNldHM6IFsnc2VsZWN0JywgJ2NvbW1vbiddLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHN0aWNreTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJ1aWxkIGRpc3BsYXllZCBjb2x1bW5zICYgZmlsdGVyICovXHJcblx0XHR0aGlzLmNvbHVtbnMkPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdC8qIEZpbHRlciB0aGUgY29sdW1ucyBiYXNlZCBvbiB0aGUgaW5kaXZpZHVhbCBjb2x1bW4ncyBjb2x1bW5TZXRzIHByb3BlcnR5IGFuZCB0aGUgZ2xvYmFsIGNvbHVtblNldHMgKi9cclxuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKHRoaXMuY29sdW1uU2V0cz8ubGVuZ3RoID8/IDApID4gMFxyXG5cdFx0XHRcdD8gdGhpcy5jb2x1bW5zPy5maWx0ZXIoYyA9PiB0aGlzLmNvbHVtblNldHM/LnNvbWUoc2V0ID0+IGMuY29sdW1uU2V0cz8uaW5jbHVkZXMoc2V0KSkpXHJcblx0XHRcdFx0OiB0aGlzLmNvbHVtbnM7XHJcblxyXG5cdFx0XHQvKiBCdWlsZCB0aGUgZGlzcGxheWVkIGNvbHVtbnMgYnkgZmlsdGVyaW5nIG91dCB0aGUgZXhjbHVkZWQgY29sdW1ucyBhbmQgbWFwcGluZyB0byB0aGVpciBuYW1lcyAqL1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2Yoc2VsZWN0ZWRDb2x1bW5zXHJcblx0XHRcdFx0LyogRXhjbHVkZSBjb2x1bW5zIHRoYXQgYXJlIGluIHRoZSBleGNsdWRlZENvbHVtbnMgbGlzdCAqL1xyXG5cdFx0XHRcdD8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKVxyXG5cdFx0XHRcdC8qIE1hcCB0aGUgcmVtYWluaW5nIGNvbHVtbnMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSAqL1xyXG5cdFx0XHRcdD8ubWFwKGMgPT4gYy5uYW1lKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0LyogQnVpbGQgdGhlIGRpc3BsYXllZCBmaWx0ZXIgY29sdW1ucyBieSBmaWx0ZXJpbmcgb3V0IHRoZSBleGNsdWRlZCBjb2x1bW5zIGFuZCBwcmVmaXhpbmcgd2l0aCAnZmlsdGVyLicgKi9cclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHNlbGVjdGVkQ29sdW1uc1xyXG5cdFx0XHRcdC8qIEV4Y2x1ZGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWRDb2x1bW5zIGxpc3QgKi9cclxuXHRcdFx0XHQ/LmZpbHRlcih4ID0+ICF0aGlzLmV4Y2x1ZGVkQ29sdW1ucz8uaW5jbHVkZXMoeC5uYW1lKSlcclxuXHRcdFx0XHQvKiBNYXAgdGhlIHJlbWFpbmluZyBjb2x1bW5zIHRvIGEgZmlsdGVyLWZyaWVuZGx5IHN0cmluZyB3aXRoICdmaWx0ZXIuJyBwcmVmaXggKi9cclxuXHRcdFx0XHQ/Lm1hcChjID0+IGBmaWx0ZXIuJHsoYy5maWx0ZXIgfHwgYy5uYW1lKX1gKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2V0IHRoZSB0YWJsZSBjb2x1bW5zICovXHJcblx0XHR0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuXHRcdGlmIChjb250YWluZXIpIHtcclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIERpc2FibGUgdGhlIGNvbnRleHQgbWVudSBvbiByaWdodC1jbGljayB0byBhbGxvdyBzbW9vdGggc2Nyb2xsaW5nIFxyXG5cdFx0XHQgKiB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBiZWhhdmlvci5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlOiBNb3VzZUV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xyXG5cclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIFN0YXJ0IGRyYWdnaW5nIHdoZW4gdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIChidXR0b24gPT09IDIpLlxyXG5cdFx0XHQgKiBUaGlzIHNhdmVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGFuZCBzY3JvbGwgc3RhdGUgZm9yIGxhdGVyIHVzZSBkdXJpbmcgbW92ZW1lbnQuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoZS5idXR0b24gPT09IDIgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdC8qIFByZXZlbnRzIGFueSBkZWZhdWx0IGJlaGF2aW9yIGFzc29jaWF0ZWQgd2l0aCByaWdodC1jbGljayAqL1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zdGFydERyYWdnaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgaW5pdGlhbCBYIHBvc2l0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLnN0YXJ0WCA9IGUucGFnZVggLSBjb250YWluZXIub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRcdFx0XHQvKiBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxMZWZ0ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgY29udGFpbmVyLlxyXG5cdFx0XHQgKiBUaGlzIGVuc3VyZXMgdGhlIHNjcm9sbGluZyBzdG9wcyBldmVuIGlmIHRoZSB1c2VyIG1vdmVzIHRoZSBjdXJzb3Igb3V0c2lkZSB0aGUgYm91bmRhcmllcy5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuc3RvcERyYWdnaW5nKGUpKTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAob24gbW91c2UgdXApLlxyXG5cdFx0XHQgKiBUaGlzIHByZXZlbnRzIGZ1cnRoZXIgc2Nyb2xsIG1vdmVtZW50cyBhZnRlciB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnN0b3BEcmFnZ2luZyhlKSk7XHJcblxyXG5cdFx0XHQvKiBcclxuXHRcdFx0ICogSGFuZGxlIHRoZSBhY3R1YWwgZHJhZ2dpbmcgKHNjcm9sbGluZykgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQuXHJcblx0XHRcdCAqIFRoaXMgY2FsY3VsYXRlcyB0aGUgbW92ZW1lbnQgYW5kIHVwZGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdC8qIElmIGRyYWdnaW5nIGlzIG5vdCBhY3RpdmUgb3Igc2Nyb2xsIGNvbnRhaW5lciBpcyB1bmRlZmluZWQsIGV4aXQgKi9cclxuXHRcdFx0XHRpZiAoIXRoaXMuc3RhcnREcmFnZ2luZyB8fCAhdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdC8qIFByZXZlbnQgZGVmYXVsdCBhY3Rpb24gdG8gZW5zdXJlIHNtb290aCBiZWhhdmlvciAqL1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IG1vdXNlIFggcG9zaXRpb24gKi9cclxuXHRcdFx0XHRjb25zdCB4ID0gZS5wYWdlWCAtIGNvbnRhaW5lci5vZmZzZXRMZWZ0O1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIChhbXBsaWZpZWQgZm9yIHNwZWVkKSAqL1xyXG5cdFx0XHRcdGNvbnN0IHdhbGsgPSAoeCAtIHRoaXMuc3RhcnRYKSAqIDI7XHJcblxyXG5cdFx0XHRcdC8qIFVwZGF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIG1vdmVtZW50ICovXHJcblx0XHRcdFx0Y29udGFpbmVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBkYXRlQ29sdW1ucygpOiB2b2lkIHtcclxuXHRcdC8qIFNvcnQgdGhlIGNvbHVtbnMgYnkgaW5kZXggKi9cclxuXHRcdFV0aWxzLnNvcnRBcnJheSh0aGlzLmNvbHVtbnMgfHwgW10sICdpbmRleCcpO1xyXG5cclxuXHRcdC8qIFRyaWdnZXIgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zU3ViamVjdC5uZXh0KHRoaXMuY29sdW1ucyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3VudHMgdmlzaWJsZSBhY3Rpb24gbWVudXNcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93OiBhbnksIGNvbHVtbjogVGFibGVDb2x1bW4pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID8/IC0xKSA+IDA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGAke2l0ZW0uaWR9YDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zVHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgcm93IGNsaWNrIGV2ZW50XHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJvd0NsaWNrKGluZGV4OiBhbnksIHJvdzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZW1wbGF0ZVJlZikge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XHJcblx0XHRcdHRoaXMuZXhwYW5kZWRSb3cgPSB0aGlzLmV4cGFuZGVkUm93ID09PSByb3cgPyBudWxsIDogcm93O1xyXG5cdFx0XHRpZiAodGhpcy5kZXRhaWxzVGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0XHR0aGlzLmR5bmFtaWNCdWlsZGVyLmNvbXBpbGVIdG1sKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmLmdldChpbmRleCksIHRoaXMuZGV0YWlsc1RlbXBsYXRlLCByb3cpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2sgd2l0aCB0aGUgcmlnaHQgYnV0dG9uXHJcblx0ICogQHBhcmFtIGV2ZW50IE1vdXNlRXZlbnQsIGl0IGNvbnRhaW5zIHRoZSBjb29yZGluYXRlc1xyXG5cdCAqIEBwYXJhbSBpdGVtIE91ciBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgcm93IG9mIHRoZSB0YWJsZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dSaWdodENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBhbnkpIHtcclxuXHRcdGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucm93Q29udGV4dE1lbnVUcmlnZ2Vycz8udG9BcnJheSgpPy5mb3JFYWNoKHggPT4geC5jbG9zZU1lbnUoKSk7XHJcblx0XHR2YXIgbWVudVRyaWdnZXIgPSB0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZmlsdGVyKHggPT4geFsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCdpZCcpID09IGBtZW51LSR7aXRlbS5pZH1gKVswXTtcclxuXHRcdGlmIChtZW51VHJpZ2dlciAhPSBudWxsKSB7XHJcblx0XHRcdC8qIEF2b2lkcyB0byBzaG93IHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoZSByaWdodC1jbGljayBtZW51IG9mIHRoZSBicm93c2VyICovXHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHQvKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZW51ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyWydfZWxlbWVudCddPy5uYXRpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogJHtldmVudC5jbGllbnRYfXB4OyB0b3A6ICR7ZXZlbnQuY2xpZW50WX1weGApO1xyXG5cclxuXHRcdFx0LyogUGFzcyB0byB0aGUgbWVudSB0aGUgY3VycmVudCBvYmplY3QgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIubWVudURhdGEgPSB7IGl0ZW06IGl0ZW0gfVxyXG5cclxuXHRcdFx0LyogT3BlbiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlci5vcGVuTWVudSgpO1xyXG5cclxuXHRcdFx0LyogSGFuZGxlIGNsaWNrcyBvbiB0aGUgbWVudSBvdmVybGF5ICovXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpWzBdPy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChvZmZFdmVudDogYW55KSA9PiB7XHJcblx0XHRcdFx0b2ZmRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRtZW51VHJpZ2dlciEuY2xvc2VNZW51KCk7XHJcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgbW9kZWwgY2hhbmdlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTW9kZWxDaGFuZ2UoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCk6IHZvaWQge1xyXG5cdFx0aWYgKHR5cGVvZiBjb2x1bW4/LmV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNvbHVtbi5ldmVudChyb3csIGZvcm1Hcm91cCwgY29sdW1uLmV2ZW50QXJncyA/PyB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBrZXlkb3duIGVudGVyIG9mIDxpbnB1dD4gYW5kIDx2ZC1zZWxlY3Q+XHJcblx0ICogQHBhcmFtICRldmVudCBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuXHRcdCgkZXZlbnQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uYmx1cigpO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBhbiBlbnRpdHlcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBmaWVsZE5hbWUgXHJcblx0ICogQHBhcmFtIHBhdGggXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoKHJvdzogYW55LCBmaWVsZHM6IEFycmF5PHN0cmluZz4sIHZhbHVlOiBhbnksIGluY2x1ZGVzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEdldCBlbnRpdHkgYnkgSUQgKi9cclxuXHRcdGxldCBlbnRpdHkgPSB0aGlzLmRhdGFTb3VyY2UuaXRlbXM/LmZpbHRlcigoeDogYW55KSA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlPy5yZW5kZXJSb3dzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGEgc3RyaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24uXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIGFuIGlucHV0IGV4cHJlc3Npb24gdGhhdCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uIFxyXG5cdCAqIElmIGl0J3MgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0gYW5kIGNvbnRleHQuIFxyXG5cdCAqIElmIGl0J3MgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMtaXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgZXhwcmVzc2lvbiB0byBoYW5kbGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbi5cclxuXHQgKiBAcmV0dXJucyAtIFRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQsIG9yIHRoZSBzdHJpbmcgZXhwcmVzc2lvbiBpdHNlbGYuXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nIHwgRnVuY3Rpb24sIGl0ZW06IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzeSAoZS5nLiwgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eSkgKi9cclxuXHRcdGlmICghZXhwcmVzc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgaXRlbSBhbmQgY29udGV4dCAqL1xyXG5cdFx0aWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBleHByZXNzaW9uKGl0ZW0sIHRoaXMuY29udGV4dCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogSWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIGEgc3RyaW5nIGFuZCByZXR1cm4gaXQgKi9cclxuXHRcdHJldHVybiBleHByZXNzaW9uO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbiBhbiBvYmplY3QgYmFzZWQgb24gYSBkb3Qtc2VwYXJhdGVkIHBhdGguXHJcblx0ICogQHBhcmFtIHJvdyAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nIHNldC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIC0gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXROZXN0ZWRQcm9wZXJ0eShyb3c6IGFueSwgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIFNwbGl0IHRoZSBwcm9wZXJ0eVBhdGggaW50byBhbiBhcnJheSBvZiBrZXlzICovXHJcblx0XHRjb25zdCBrZXlzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcuJyk7XHJcblxyXG5cdFx0LyogVXNlIHNsaWNlIHRvIGdldCBhbGwga2V5cyBleGNlcHQgdGhlIGxhc3Qgb25lIGFuZCByZWR1Y2UgdG8gdHJhdmVyc2UgdG8gdGhlIHNlY29uZC10by1sYXN0IGxldmVsICovXHJcblx0XHRrZXlzLnNsaWNlKDAsIC0xKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgJiYgYWNjW2tleV0sIHJvdylba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyByb3cgY2xhc3Nlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0Um93Q2xhc3Nlcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdCdndC14cyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuU20sXHJcblx0XHRcdCdndC1tZCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTWQsXHJcblx0XHRcdCdndC1sZyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWGwsXHJcblx0XHRcdCdndC14eGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlh4bCxcclxuXHRcdFx0J2hpZGRlbic6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTm9uZSxcclxuXHRcdFx0J3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmVcclxuXHRcdH0sIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIHRoaXMuY29udGV4dCkgOiB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2cgdG8gY29uc29sZVxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFxyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XHJcblx0XHRjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBUZXJtaW5hdGVzIHRoZSBkcmFnZ2luZyBhY3Rpb24gYnkgcmVzZXR0aW5nIHRoZSBgaXNEcmFnZ2luZ2AgZmxhZyBhZnRlciBhIGJyaWVmIGRlbGF5LlxyXG5cdCAqIElmIHRoZSBgc2Nyb2xsQ29udGFpbmVyYCBpcyBkZWZpbmVkLCBpdCBhbHNvIHJlbW92ZXMgdGhlICdncmFiYmluZycgY2xhc3MgXHJcblx0ICogZnJvbSB0aGUgY29udGFpbmVyIGVsZW1lbnQsIHdoaWNoIHJldmVydHMgdGhlIGN1cnNvciBiYWNrIHRvIGl0cyBkZWZhdWx0IHN0YXRlLlxyXG5cdCAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2aXN1YWwgZmVlZGJhY2sgKGdyYWJiaW5nIGN1cnNvcikgaXMgb25seSBhY3RpdmUgZHVyaW5nIFxyXG5cdCAqIHRoZSBkcmFnIG9wZXJhdGlvbiBhbmQgaXMgcHJvcGVybHkgcmVtb3ZlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIGludGVyYWN0aW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcERyYWdnaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvKiBSZXNldCBkcmFnZ2luZyBzdGF0ZSB0byBzdG9wIHRoZSBzY3JvbGwgaW50ZXJhY3Rpb24gKi9cclxuXHRcdHRoaXMuc3RhcnREcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qIFxyXG5cdFx0ICogSW50cm9kdWNlIGEgc2xpZ2h0IGRlbGF5IGJlZm9yZSByZXNldHRpbmcgdGhlIGRyYWdnaW5nIHN0YXRlLlxyXG5cdFx0ICogVGhpcyBhbGxvd3MgZm9yIHNtb290aGVyIHRyYW5zaXRpb25zIGFuZCBlbnN1cmVzIHRoYXQgYW55IGZpbmFsIHNjcm9sbCBhZGp1c3RtZW50c1xyXG5cdFx0ICogYXJlIGFwcGxpZWQgYmVmb3JlIG1hcmtpbmcgdGhlIGRyYWdnaW5nIG9wZXJhdGlvbiBhcyBjb21wbGV0ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdC8qIFJlc2V0IGRyYWdnaW5nIHN0YXRlIHRvIHN0b3AgdGhlIHNjcm9sbCBpbnRlcmFjdGlvbiAqL1xyXG5cdFx0XHR0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIFJlc3RvcmUgdGhlIGRlZmF1bHQgY3Vyc29yICovXHJcblx0XHRcdGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ3JhYmJpbmcnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgMjAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibG9hZGluZy1wcm9ncmVzc1wiICpuZ0lmPVwiIXN0YXRpY1wiPlxyXG5cdDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJkYXRhU291cmNlPy5pc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSAjcmVnaW9uIERhdGEgdGFibGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtdGFibGUtY29udGFpbmVyIHNjcm9sbGJhci1zZWNvbmRhcnlcIiBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3knOiBzdGlja3l9XCIgI3Njcm9sbENvbnRhaW5lcj5cclxuXHQ8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhc3RpY2t5ICYmICFkZXRhaWxzVGVtcGxhdGUgJiYgIXRlbXBsYXRlUmVmLCAndGFibGUtc3RpY2snOiBzdGlja3l9XCIgW3RyYWNrQnldPVwidHJhY2tCeVwiIG1hdFNvcnQgbWF0U29ydERpc2FibGVDbGVhciBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlfHwnaWQnXCIgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiIG11bHRpVGVtcGxhdGVEYXRhUm93cz5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHRcdDwhLS0gI3JlZ2lvbiBDb2x1bW4gZGVmIC0tPlxyXG5cdFx0XHQ8bmctY29udGFpbmVyIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI2hlYWRlciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiBsZXQtaGVhZGVyVGV4dD1cImhlYWRlclRleHRcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2hlYWRlclRleHQ6IGNvbHVtbi5oZWFkZXIgfCBmdW5jOmNvbnRleHR9XCI+XHJcblx0XHRcdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0XHRcdDxtYXQtY2hlY2tib3ggKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBkYXRhU291cmNlLnRvZ2dsZVNlbGVjdCgkZXZlbnQsIHNlbGVjdEFsbEZpbHRlcikgOiBudWxsXCIgW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLnBhZ2luYXRvcj8ubGVuZ3RoXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmIGRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmICFkYXRhU291cmNlLmlzQWxsU2VsZWN0ZWQoKVwiPjwvbWF0LWNoZWNrYm94PlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlICE9IENvbHVtblR5cGUuQ2hlY2tib3hcIiBbbWF0VG9vbHRpcF09XCJoZWFkZXJUZXh0XCI+e3toZWFkZXJUZXh0fX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3RoPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PHRkIG1hdC1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvdzsgbGV0IHJvd0luZGV4ID0gZGF0YUluZGV4XCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXA/Y29sdW1uLnRvb2x0aXAocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiBbbWF0VG9vbHRpcENsYXNzXT1cImNvbHVtbi50b29sdGlwQ2xhc3M/PycnXCIgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sIHJvdylcIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBDaGVja2JveCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBFbnVtIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVudW1NZXRhZGF0YTsgZWxzZSBub0VudW1NZXRhZGF0YVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpIDwgMlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgbGV0LWRpc3BsYXlWYWx1ZT1cImRpc3BsYXlWYWx1ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZGlzcGxheVZhbHVlOiBjb2x1bW4uZW51bU1ldGFkYXRhW2l0ZW1dLmRpc3BsYXkgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaSA9PT0gMSAmJiByb3dWYWx1ZT8ubGVuZ3RoID4gMlwiIFttYXRUb29sdGlwXT1cIihyb3dWYWx1ZSB8IHNsaWNlOjIgfCBtYXA6Y29sdW1uLmVudW1NZXRhZGF0YSB8IG1hcDonZGlzcGxheScpIHwgam9pbjonXFxuJ1wiIG1hdFRvb2x0aXBDbGFzcz1cIm1hdC10b29sdGlwLW11bHRpbGluZVwiPi4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtZGlzcGxheVZhbHVlPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWNoaXAtcm93IGRpc2FibGVSaXBwbGU9XCJ0cnVlXCIgc2VsZWN0YWJsZT1cImZhbHNlXCIgW21hdFRvb2x0aXBdPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGRpc3BsYXlWYWx1ZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWNoaXAtcm93PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInJvd1ZhbHVlID49IDBcIiBjbGFzcz1cIm5hXCIgW2lubmVySHRtbF09XCIoY29sdW1uLmVudW1NZXRhZGF0YVtyb3dWYWx1ZV18fHt9KS5kaXNwbGF5XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vRW51bU1ldGFkYXRhPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaTwyXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2l0ZW0gfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zbWFsbD48c21hbGwgKm5nSWY9XCJpPT0xICYmIHJvd1ZhbHVlPy5sZW5ndGggPiAyXCI+LCAuLi48L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e3Jvd1ZhbHVlIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXgsIHNlbGVjdCwgdHlwZSB7dHlwZX0gb3RoZXIge3t7cm93VmFsdWUgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeH19fX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjcmVjdXJzaXZlQ29udGFpbmVyIGxldC1jb2x1bW5OYW1lU2VnbWVudHM9XCJzZWdtZW50c1wiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtcGFyZW50Rm9ybUdyb3VwPVwicGFyZW50Rm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiB0aGUgY29sdW1uTmFtZVNlZ21lbnRzIGFycmF5IGlzIGVtcHR5LCB3ZSdyZSBhdCB0aGUgbGVhZiBub2RlIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbk5hbWVTZWdtZW50cy5sZW5ndGg7IGVsc2Ugbm90TGFzdFNlZ21lbnRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVG9nZ2xlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOmhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbiwgcGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXApXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBWRC1TZWxlY3QgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8dmQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbZW51bU1ldGFkYXRhXT1cImNvbHVtbi5lbnVtTWV0YWRhdGFcIiBbZW51bUZpbHRlcl09XCJjb2x1bW4uZW51bUZpbHRlciB8IGZ1bmM6cGFyZW50Rm9ybUdyb3VwLnZhbHVlOmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbZGVmYXVsdE9wdGlvbl09XCJjb2x1bW4uZGVmYXVsdE9wdGlvbj8/dHJ1ZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpwYXRjaChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIFtjb2x1bW4ubmFtZV0sIHJvd1ZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RMYXN0U2VnbWVudD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIG5vdCB0aGUgbGFzdCBzZWdtZW50LCBjcmVhdGUgYSBuZXN0ZWQgZm9ybSBncm91cCAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImNvbHVtbk5hbWVTZWdtZW50c1swXVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIHNlZ21lbnRzIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW5OYW1lU2VnbWVudHMuc2xpY2UoMSksIHBhcmVudEZvcm1Hcm91cDpmb3JtR3JvdXAsIGZvcm1Hcm91cDogZm9ybUdyb3VwLmdldChjb2x1bW5OYW1lU2VnbWVudHNbMF0pfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5Ub2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9ybUFycmF5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTtoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHJvdywgdW5kZWZpbmVkKTtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRGF0ZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7cm93VmFsdWUgfCBkYXRlOmNvbHVtbi5zaG9ydERhdGU/J2RkLk1NLnl5eXknOidkZC5NTS55eXl5IEhIOm1tOnNzJ319PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgbWF0SW5wdXQgKm5nSWY9XCIhZm9ybUFycmF5XCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIG5hbWU9XCJ7e2NvbHVtbi5uYW1lfX17e3Jvd0luZGV4fX1cIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7KGNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6cGF0Y2gocm93LCBbY29sdW1uLm5hbWVdLCAkZXZlbnQsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKSk7XCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFmb3JtQXJyYXlcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgKm5nSWY9XCIhZm9ybUFycmF5XCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbj8uZW51bUZpbHRlciAgfCBmdW5jOnJvdzpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7XCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LnZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5BY3Rpb25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubWVudVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51IVwiICpuZ0lmPVwibWVudT8ubWF0TWVudSAmJiAhcm93LmxvY2tlZCAmJiBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdywgY29sdW1uKVwiPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dmQtZHluYW1pYy1tZW51IFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiICNtZW51PjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm1lbnVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIGljb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvblwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/Lm1hdEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/Lm1hdEljb24hLCByb3cpfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LnN2Z0ljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIiBbc3ZnSWNvbl09XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5zdmdJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LmZvbnRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW2ZvbnRJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmZvbnRJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvbkJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29sdW1uLmljb25CdXR0b24/LmV2ZW50P2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudChyb3csIGNvbnRleHQpOm51bGxcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwie3tjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkNsYXNzPz8nJywgcm93KVwiPnt7aGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbj8/J3JhZGlvX2J1dHRvbl9jaGVja2VkJywgcm93KSB8fCAncmFkaW9fYnV0dG9uX2NoZWNrZWQnfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIdG1sXT1cInJvd1ZhbHVlPz8nJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciByb3cgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBmaWx0ZXJhYmxlXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJmaWx0ZXIue3tjb2x1bW4uZmlsdGVyIHx8IGNvbHVtbi5uYW1lfX1cIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHRcdDx0aCBtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLCAnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLCAnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLCAnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLCAnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLCAnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsICdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmV9XCI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIihjb2x1bW4uZW5kcG9pbnQgfHwgY29sdW1uLmVudW1UeXBlIHx8IGNvbHVtbi5vcHRpb25zKSBlbHNlIG5vdFNlbGVjdEZpbHRlclwiIGZpbHRlci1zZWxlY3QgW2VuZHBvaW50XT1cImNvbHVtbi5lbmRwb2ludFwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbi5lbnVtRmlsdGVyIHwgZnVuYzp7fTpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW3RleHRdPVwiY29sdW1uLmZpbHRlck9wdGlvblRleHQgfHwgJ25hbWUnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBmaWx0ZXIgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90U2VsZWN0RmlsdGVyPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibm90U2VsZWN0RmlsdGVyICYmIChjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0SW5wdXQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5OdW1iZXIpIGVsc2Ugbm90SW5wdXRGaWx0ZXJcIiBmaWx0ZXItaW5wdXQgW29ubHlOdW1iZXJdPVwiY29sdW1uLmZpbHRlcklucHV0TnVtYmVyPz9mYWxzZVwiIFtvcGVyYXRvcl09XCIhdXNlRmlsdGVyT3BlcmF0b3IgPyB1bmRlZmluZWQgOiBjb2x1bW4uZmlsdGVyT3BlcmF0b3JcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RJbnB1dEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuRGF0ZSBlbHNlIG5vdERhdGVGaWx0ZXJcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gZmlsdGVyIChjbGVhcikgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90RGF0ZUZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQWN0aW9uXCIgZmlsdGVyLWNsZWFyPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0PC90aD5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0XHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XHJcblx0XHRcdDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4XCIgW2F0dHIuY29sc3Bhbl09XCIoZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYyk/Lmxlbmd0aFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3ctZGV0YWlsXCIgW0BkZXRhaWxFeHBhbmRdPVwicm93ID09IGV4cGFuZGVkUm93ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCIgI2RldGFpbHNUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVJlZiAmJiByb3cgPT09IGV4cGFuZGVkUm93XCI+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjsgY29udGV4dDp7cm93OiByb3csIGluZGV4OiBpbmRleCwgY29udGV4dDogY29udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyYWJsZVwiPlxyXG5cdFx0XHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZEZpbHRlckNvbHVtbnMkIHwgYXN5bmNcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBzdGlja3k6IHN0aWNreUZpbHRlclwiPjwvdHI+XHJcblx0XHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIERldHJhaWxzIHJvdyAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzVGVtcGxhdGUgfHwgdGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBSb3cgc2hvd24gd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBkYXRhLi0tPlxyXG48ZGl2IGNsYXNzPVwibWF0LWNlbGwgcGFkIHRhYmxlLWVtcHR5IHR4dC1pdGFsaWNcIiAqbmdJZj1cIiFkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCAmJiAhZGF0YVNvdXJjZT8udG90YWxcIiBpMThuPVwiQEBub1Jlc3VsdHNGb3VuZFwiPk5vIHJlc3VsdHMgd2VyZSBmb3VuZC48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG48Y29kZSAqbmdJZj1cImRlYnVnVmFsdWVcIj5cclxuXHQ8cHJlPnt7Zm9ybVZhbHVlIHwganNvbn19PC9wcmU+XHJcbjwvY29kZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWZvb3RlclwiIGxheW91dD1cInJvd1wiPlxyXG5cdDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG5cdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hYmxlXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIj48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PiJdfQ==